diff --git a/Backend.Tests/Controllers/WordControllerTests.cs b/Backend.Tests/Controllers/WordControllerTests.cs index d9fda8eab8..4125719b44 100644 --- a/Backend.Tests/Controllers/WordControllerTests.cs +++ b/Backend.Tests/Controllers/WordControllerTests.cs @@ -41,12 +41,16 @@ public void Setup() public async Task TestAreInFrontier() { var wordNotInFrontier = await _wordRepo.Add(Util.RandomWord(ProjId)); - var emptyResult = await _wordController.AreInFrontier(ProjId, [wordNotInFrontier.Id, "non-id"]); - Assert.That(((ObjectResult)emptyResult).Value, Is.Empty); + var emptyResult = await _wordController.AreInFrontier(ProjId, [wordNotInFrontier.Id, "non-id"]) + as OkObjectResult; + Assert.That(emptyResult, Is.Not.Null); + Assert.That(emptyResult.Value, Is.Empty); var wordInFrontier = await _wordRepo.AddFrontier(Util.RandomWord(ProjId)); - var nonemptyResult = await _wordController.AreInFrontier(ProjId, [wordInFrontier.Id, "non-id"]); - Assert.That(((OkObjectResult)nonemptyResult).Value, Is.EqualTo(new List { wordInFrontier.Id })); + var nonemptyResult = await _wordController.AreInFrontier(ProjId, [wordInFrontier.Id, "non-id"]) + as OkObjectResult; + Assert.That(nonemptyResult, Is.Not.Null); + Assert.That(nonemptyResult.Value, Is.EqualTo(new List { wordInFrontier.Id })); } [Test] @@ -93,15 +97,23 @@ public async Task TestDeleteFrontierWordMissingWord() } [Test] - public async Task TestHasFrontierWords() + public async Task TestHasFrontierWordsReturnsFalse() { await _wordRepo.Create(Util.RandomWord("OTHER_PROJECT")); - var falseResult = (ObjectResult)await _wordController.HasFrontierWords(ProjId); - Assert.That(falseResult.Value, Is.False); + var result = await _wordController.HasFrontierWords(ProjId) as OkObjectResult; + Assert.That(result, Is.Not.Null); + Assert.That(result.Value, Is.False); + } + + [Test] + public async Task TestHasFrontierWordsReturnsTrue() + { await _wordRepo.Create(Util.RandomWord(ProjId)); - var trueResult = (ObjectResult)await _wordController.HasFrontierWords(ProjId); - Assert.That(trueResult.Value, Is.True); + + var result = await _wordController.HasFrontierWords(ProjId) as OkObjectResult; + Assert.That(result, Is.Not.Null); + Assert.That(result.Value, Is.True); } [Test] @@ -113,15 +125,21 @@ public async Task TestHasFrontierWordsNoPermission() } [Test] - public async Task TestIsInFrontier() + public async Task TestIsInFrontierReturnsFalse() { var wordNotInFrontier = await _wordRepo.Add(Util.RandomWord(ProjId)); - var falseResult = (ObjectResult)await _wordController.IsInFrontier(ProjId, wordNotInFrontier.Id); - Assert.That(falseResult.Value, Is.False); + var result = await _wordController.IsInFrontier(ProjId, wordNotInFrontier.Id) as OkObjectResult; + Assert.That(result, Is.Not.Null); + Assert.That(result.Value, Is.False); + } + [Test] + public async Task TestIsInFrontierReturnsTrue() + { var wordInFrontier = await _wordRepo.AddFrontier(Util.RandomWord(ProjId)); - var trueResult = (ObjectResult)await _wordController.IsInFrontier(ProjId, wordInFrontier.Id); - Assert.That(trueResult.Value, Is.True); + var result = await _wordController.IsInFrontier(ProjId, wordInFrontier.Id) as OkObjectResult; + Assert.That(result, Is.Not.Null); + Assert.That(result.Value, Is.True); } [Test] @@ -140,7 +158,9 @@ public async Task TestGetFrontierCount() await _wordRepo.Create(Util.RandomWord(ProjId)); await _wordRepo.Create(Util.RandomWord("OTHER_PROJECT")); - var count = (int)((ObjectResult)await _wordController.GetFrontierCount(ProjId)).Value!; + var countResult = await _wordController.GetFrontierCount(ProjId) as OkObjectResult; + Assert.That(countResult, Is.Not.Null); + var count = countResult.Value as int?; Assert.That(count, Is.EqualTo(2)); } @@ -159,7 +179,10 @@ public async Task TestGetFrontier() var inWord2 = await _wordRepo.Create(Util.RandomWord(ProjId)); await _wordRepo.Create(Util.RandomWord("OTHER_PROJECT")); - var frontier = (List)((ObjectResult)await _wordController.GetProjectFrontierWords(ProjId)).Value!; + var result = await _wordController.GetProjectFrontierWords(ProjId) as OkObjectResult; + Assert.That(result, Is.Not.Null); + var frontier = result.Value as List; + Assert.That(frontier, Is.Not.Null); Assert.That(frontier, Has.Count.EqualTo(2)); Assert.That(frontier, Does.Contain(inWord1).UsingPropertiesComparer()); Assert.That(frontier, Does.Contain(inWord2).UsingPropertiesComparer()); @@ -181,9 +204,9 @@ public async Task TestGetWord() await _wordRepo.Create(Util.RandomWord(ProjId)); await _wordRepo.Create(Util.RandomWord(ProjId)); - var result = await _wordController.GetWord(ProjId, word.Id); - Assert.That(result, Is.InstanceOf()); - Assert.That(((ObjectResult)result).Value, Is.EqualTo(word).UsingPropertiesComparer()); + var result = await _wordController.GetWord(ProjId, word.Id) as OkObjectResult; + Assert.That(result, Is.Not.Null); + Assert.That(result.Value, Is.EqualTo(word).UsingPropertiesComparer()); } [Test] @@ -207,18 +230,18 @@ public async Task TestGetWordNoPermission() public async Task TestGetDuplicateId() { var word = await _wordRepo.Create(Util.RandomWord(ProjId)); - var result = await _wordController.GetDuplicateId(ProjId, word); - Assert.That(result, Is.InstanceOf()); - Assert.That(((ObjectResult)result).Value, Is.EqualTo(word.Id)); + var result = await _wordController.GetDuplicateId(ProjId, word) as OkObjectResult; + Assert.That(result, Is.Not.Null); + Assert.That(result.Value, Is.EqualTo(word.Id)); } [Test] public async Task TestGetDuplicateIdNoneFound() { var word = Util.RandomWord(ProjId); - var result = await _wordController.GetDuplicateId(ProjId, word); - Assert.That(result, Is.InstanceOf()); - Assert.That(((ObjectResult)result).Value, Is.EqualTo("")); + var result = await _wordController.GetDuplicateId(ProjId, word) as OkObjectResult; + Assert.That(result, Is.Not.Null); + Assert.That(result.Value, Is.EqualTo("")); } [Test] @@ -245,8 +268,10 @@ public async Task TestRevertWords() ["non-id"] = frontierWord1.Id, // Cannot revert with key not a word [nonFrontierWord1.Id] = nonFrontierWord2.Id, // Cannot revert with value not in frontier [nonFrontierWord0.Id] = frontierWord0.Id, // Can revert - }); - var reverted = (Dictionary)((OkObjectResult)result).Value!; + }) as OkObjectResult; + Assert.That(result, Is.Not.Null); + var reverted = result.Value as Dictionary; + Assert.That(reverted, Is.Not.Null); Assert.That(reverted, Has.Count.EqualTo(1)); var frontierIds = (await _wordRepo.GetAllFrontier(ProjId)).Select(w => w.Id).ToList(); Assert.That(frontierIds, Has.Count.EqualTo(2)); @@ -272,10 +297,14 @@ public async Task TestUpdateDuplicate() var dupWord = origWord.Clone(); dupWord.Flag = new Flag("New Flag"); var expectedWord = dupWord.Clone(); - var result = (ObjectResult)await _wordController.UpdateDuplicate(ProjId, origWord.Id, dupWord); - var id = (string)result.Value!; + + var result = await _wordController.UpdateDuplicate(ProjId, origWord.Id, dupWord) as OkObjectResult; + Assert.That(result, Is.Not.Null); + var id = result.Value as string; + Assert.That(id, Is.Not.Null); var updatedWord = await _wordRepo.GetWord(ProjId, id); - Util.AssertEqualWordContent(updatedWord!, expectedWord, true); + Assert.That(updatedWord, Is.Not.Null); + Util.AssertEqualWordContent(updatedWord, expectedWord, true); } [Test] @@ -311,14 +340,17 @@ public async Task TestCreateWord() { var word = Util.RandomWord(ProjId); - var id = (string)((ObjectResult)await _wordController.CreateWord(ProjId, word)).Value!; + var result = await _wordController.CreateWord(ProjId, word) as OkObjectResult; + Assert.That(result, Is.Not.Null); + var id = result.Value as string; + Assert.That(id, Is.Not.Null); word.Id = id; var allWords = await _wordRepo.GetAllWords(ProjId); - Assert.That(allWords[0], Is.EqualTo(word).UsingPropertiesComparer()); + Assert.That(allWords.FirstOrDefault(), Is.EqualTo(word).UsingPropertiesComparer()); var frontier = await _wordRepo.GetAllFrontier(ProjId); - Assert.That(frontier[0], Is.EqualTo(word).UsingPropertiesComparer()); + Assert.That(frontier.FirstOrDefault(), Is.EqualTo(word).UsingPropertiesComparer()); } [Test] @@ -339,12 +371,14 @@ public async Task TestUpdateWord() var modWord = origWord.Clone(); modWord.Vernacular = "NewVernacular"; - var id = (string)((ObjectResult)await _wordController.UpdateWord( - ProjId, modWord.Id, modWord)).Value!; + var result = await _wordController.UpdateWord(ProjId, modWord.Id, modWord) as OkObjectResult; + Assert.That(result, Is.Not.Null); + var id = result.Value as string; + Assert.That(id, Is.Not.Null); var finalWord = modWord.Clone(); finalWord.Id = id; - finalWord.History = new List { origWord.Id }; + finalWord.History = [origWord.Id]; var allWords = await _wordRepo.GetAllWords(ProjId); Assert.That(allWords, Does.Contain(origWord).UsingPropertiesComparer()); @@ -383,12 +417,26 @@ public async Task TestRestoreWord() Assert.That(await _wordRepo.GetAllWords(ProjId), Does.Contain(word).UsingPropertiesComparer()); Assert.That(await _wordRepo.GetAllFrontier(ProjId), Is.Empty); - var result = await _wordController.RestoreWord(ProjId, word.Id); + var result = await _wordController.RestoreWord(ProjId, word.Id) as OkObjectResult; + Assert.That(result, Is.Not.Null); + Assert.That(result.Value, Is.True); + Assert.That(await _wordRepo.GetAllWords(ProjId), Does.Contain(word).UsingPropertiesComparer()); + Assert.That(await _wordRepo.GetAllFrontier(ProjId), Does.Contain(word).UsingPropertiesComparer()); + } + + [Test] + public async Task TestRestoreWordAlreadyInFrontier() + { + var word = await _wordRepo.Create(Util.RandomWord(ProjId)); - Assert.That(result, Is.InstanceOf()); - Assert.That(((OkObjectResult)result).Value, Is.True); Assert.That(await _wordRepo.GetAllWords(ProjId), Does.Contain(word).UsingPropertiesComparer()); Assert.That(await _wordRepo.GetAllFrontier(ProjId), Does.Contain(word).UsingPropertiesComparer()); + var frontierCount = await _wordRepo.GetFrontierCount(ProjId); + + var result = await _wordController.RestoreWord(ProjId, word.Id) as OkObjectResult; + Assert.That(result, Is.Not.Null); + Assert.That(result.Value, Is.False); + Assert.That(await _wordRepo.GetFrontierCount(ProjId), Is.EqualTo(frontierCount)); } [Test] diff --git a/Backend.Tests/Services/WordServiceTests.cs b/Backend.Tests/Services/WordServiceTests.cs index 2d5c9c9cd1..bc92f060ad 100644 --- a/Backend.Tests/Services/WordServiceTests.cs +++ b/Backend.Tests/Services/WordServiceTests.cs @@ -97,6 +97,37 @@ public void TestDeleteAudio() Assert.That(oldWord.History, Is.Empty); } + [Test] + public void TestDeleteFrontierWordNotInFrontierReturnsNull() + { + var wordNotInFrontier = _wordRepo.Add(new Word { ProjectId = ProjId }).Result; + Assert.That(_wordService.DeleteFrontierWord(ProjId, UserId, wordNotInFrontier.Id).Result, Is.Null); + Assert.That(_wordService.DeleteFrontierWord("wrong-proj", UserId, WordId).Result, Is.Null); + } + + [Test] + public void TestDeleteFrontierWordCopiesToWordsAndRemovesFrontier() + { + var oldId = _wordRepo.Create(new Word { ProjectId = ProjId }).Result.Id; + + var deletedId = _wordService.DeleteFrontierWord(ProjId, UserId, oldId).Result; + + Assert.That(deletedId, Is.Not.Null); + Assert.That(deletedId, Is.Not.EqualTo(oldId)); + var deletedWord = _wordRepo.GetWord(ProjId, deletedId).Result; + Assert.That(deletedWord, Is.Not.Null); + Assert.That(deletedWord.Accessibility, Is.EqualTo(Status.Deleted)); + Assert.That(deletedWord.History.Last(), Is.EqualTo(oldId)); + Assert.That(deletedWord.EditedBy.Last(), Is.EqualTo(UserId)); + + var allWordIds = _wordRepo.GetAllWords(ProjId).Result.Select(w => w.Id).ToList(); + Assert.That(allWordIds, Has.Count.EqualTo(2)); + Assert.That(allWordIds, Does.Contain(oldId)); + Assert.That(allWordIds, Does.Contain(deletedId)); + + Assert.That(_wordRepo.GetAllFrontier(ProjId).Result, Is.Empty); + } + [Test] public void TestUpdateNotInFrontierReturnsNull() { @@ -164,7 +195,7 @@ public void TestRestoreFrontierWordsFrontierWordFalse() } [Test] - public void TestRestoreFrontierWordsTrue() + public void TestRestoreFrontierWordsReturnsTrue() { var word1 = _wordRepo.Add(new Word { ProjectId = ProjId }).Result; var word2 = _wordRepo.Add(new Word { ProjectId = ProjId }).Result;