Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions Backend.Tests/Controllers/UserEditControllerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,25 @@ public async Task TestAddGoalToUserEdit()
Assert.That(repoUserEdit, Is.EqualTo(updatedUserEdit).UsingPropertiesComparer());
}

[Test]
public async Task TestUpdateGoalInUserEdit()
{
var userEdit = RandomUserEdit();
await _userEditRepo.Create(userEdit);
var existingEdit = userEdit.Edits.First();

var updatedEdit = existingEdit.Clone();
updatedEdit.GoalType = existingEdit.GoalType + 1;
updatedEdit.StepData = ["A revised step"];
await _userEditController.UpdateUserEditGoal(ProjId, userEdit.Id, updatedEdit);

var repoUserEdit = await _userEditRepo.GetUserEdit(ProjId, userEdit.Id);
Assert.That(repoUserEdit, Is.Not.Null);
Assert.That(repoUserEdit.Edits, Has.Count.EqualTo(1));
Assert.That(repoUserEdit.Edits.First().GoalType, Is.EqualTo(updatedEdit.GoalType));
Assert.That(repoUserEdit.Edits.First().StepData, Is.EqualTo(updatedEdit.StepData));
}

[Test]
public async Task TestAddGoalToUserEditNoPermissions()
{
Expand Down
61 changes: 53 additions & 8 deletions Backend.Tests/Mocks/UserEditRepositoryMock.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public Task<List<UserEdit>> GetAllUserEdits(string projectId)
{
try
{
var foundUserEdit = _userEdits.Single(ue => ue.Id == userEditId);
var foundUserEdit = _userEdits.Single(ue => ue.ProjectId == projectId && ue.Id == userEditId);
return Task.FromResult<UserEdit?>(foundUserEdit.Clone());
}
catch (InvalidOperationException)
Expand All @@ -44,21 +44,66 @@ public Task<UserEdit> Create(UserEdit userEdit)

public Task<bool> DeleteAllUserEdits(string projectId)
{
_userEdits.Clear();
return Task.FromResult(true);
var rmCount = _userEdits.RemoveAll(userEdit => userEdit.ProjectId == projectId);
return Task.FromResult(rmCount > 0);
}

public Task<bool> Delete(string projectId, string userEditId)
{
var rmCount = _userEdits.RemoveAll(userEdit => userEdit.Id == userEditId);
var rmCount = _userEdits.RemoveAll(
userEdit => userEdit.ProjectId == projectId && userEdit.Id == userEditId);
return Task.FromResult(rmCount > 0);
}

public Task<bool> Replace(string projectId, string userEditId, UserEdit userEdit)
public Task<bool> AddEdit(string projectId, string userEditId, Edit edit)
{
var rmCount = _userEdits.RemoveAll(ue => ue.Id == userEditId);
_userEdits.Add(userEdit);
return Task.FromResult(rmCount > 0);
var userEdit = _userEdits.Find(ue => ue.ProjectId == projectId && ue.Id == userEditId);
if (userEdit is null)
{
return Task.FromResult(false);
}
userEdit.Edits.Add(edit.Clone());
return Task.FromResult(true);
}

public Task<bool> ReplaceEdit(string projectId, string userEditId, Edit edit)
{
var userEdit = _userEdits.Find(ue => ue.ProjectId == projectId && ue.Id == userEditId);
// Match the first entry by guid, as MongoDB's UpdateOne does in the real repository.
var editIndex = userEdit?.Edits.FindIndex(e => e.Guid == edit.Guid) ?? -1;
if (userEdit is null || editIndex == -1)
{
return Task.FromResult(false);
}
userEdit.Edits[editIndex] = edit.Clone();
return Task.FromResult(true);
}

public Task<bool> AddStepToEdit(string projectId, string userEditId, Guid editGuid, string stepData)
{
var userEdit = _userEdits.Find(ue => ue.ProjectId == projectId && ue.Id == userEditId);
var edit = userEdit?.Edits.Find(e => e.Guid == editGuid);
if (edit is null)
{
return Task.FromResult(false);
}
edit.StepData.Add(stepData);
edit.Modified = DateTime.UtcNow;
return Task.FromResult(true);
}

public Task<bool> UpdateStepInEdit(
string projectId, string userEditId, Guid editGuid, int stepIndex, string stepData)
{
var userEdit = _userEdits.Find(ue => ue.ProjectId == projectId && ue.Id == userEditId);
var edit = userEdit?.Edits.Find(e => e.Guid == editGuid);
if (edit is null || stepIndex < 0 || stepIndex >= edit.StepData.Count)
{
return Task.FromResult(false);
}
edit.StepData[stepIndex] = stepData;
edit.Modified = DateTime.UtcNow;
return Task.FromResult(true);
}
}
}
26 changes: 26 additions & 0 deletions Backend.Tests/Repositories/MongoDbSetUpFixture.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using NUnit.Framework;

namespace Backend.Tests.Repositories
{
/// <summary>
/// Starts a single shared MongoDB instance for all repository integration tests.
/// Fixtures isolate themselves by using distinct database names.
/// </summary>
[SetUpFixture]
public sealed class MongoDbSetUpFixture
{
internal static MongoDbTestRunner Runner { get; private set; } = null!;

[OneTimeSetUp]
public void StartMongo()
{
Runner = MongoDbTestRunner.Start();
}

[OneTimeTearDown]
public void StopMongo()
{
Runner?.Dispose();
}
}
}
Loading
Loading