Skip to content
Merged
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
4 changes: 2 additions & 2 deletions Backend.Tests/Controllers/AudioControllerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -182,13 +182,13 @@ public void TestDeleteAudioFile()
Assert.That(_wordRepo.GetAllWords(_projId).Result, Has.Count.EqualTo(2));

// Get the new word from the database
var frontier = _wordRepo.GetFrontier(_projId).Result;
var frontier = _wordRepo.GetAllFrontier(_projId).Result;

// Ensure the new word has no audio files
Assert.That(frontier[0].Audio, Has.Count.EqualTo(0));

// Test the frontier
Assert.That(_wordRepo.GetFrontier(_projId).Result, Has.Count.EqualTo(1));
Assert.That(_wordRepo.GetAllFrontier(_projId).Result, Has.Count.EqualTo(1));

// Ensure the word with deleted audio is in the frontier
Assert.That(frontier, Has.Count.EqualTo(1));
Expand Down
12 changes: 6 additions & 6 deletions Backend.Tests/Controllers/WordControllerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public async Task TestDeleteFrontierWord()
w.Id == wordToDelete.Id ||
w.Id == otherWord.Id ||
w.Accessibility == Status.Deleted));
var updatedFrontier = await _wordRepo.GetFrontier(ProjId);
var updatedFrontier = await _wordRepo.GetAllFrontier(ProjId);
Assert.That(updatedFrontier, Has.Count.EqualTo(1));
Assert.That(updatedFrontier.First().Id, Is.EqualTo(otherWord.Id));
}
Expand Down Expand Up @@ -248,7 +248,7 @@ public async Task TestRevertWords()
});
var reverted = (Dictionary<string, string>)((OkObjectResult)result).Value!;
Assert.That(reverted, Has.Count.EqualTo(1));
var frontierIds = (await _wordRepo.GetFrontier(ProjId)).Select(w => w.Id).ToList();
var frontierIds = (await _wordRepo.GetAllFrontier(ProjId)).Select(w => w.Id).ToList();
Assert.That(frontierIds, Has.Count.EqualTo(2));
Assert.That(frontierIds, Does.Contain(frontierWord1.Id));
Assert.That(frontierIds, Does.Contain(reverted[frontierWord0.Id]));
Expand Down Expand Up @@ -317,7 +317,7 @@ public async Task TestCreateWord()
var allWords = await _wordRepo.GetAllWords(ProjId);
Assert.That(allWords[0], Is.EqualTo(word).UsingPropertiesComparer());

var frontier = await _wordRepo.GetFrontier(ProjId);
var frontier = await _wordRepo.GetAllFrontier(ProjId);
Assert.That(frontier[0], Is.EqualTo(word).UsingPropertiesComparer());
}

Expand Down Expand Up @@ -350,7 +350,7 @@ public async Task TestUpdateWord()
Assert.That(allWords, Does.Contain(origWord).UsingPropertiesComparer());
Assert.That(allWords, Does.Contain(finalWord).UsingPropertiesComparer());

var frontier = await _wordRepo.GetFrontier(ProjId);
var frontier = await _wordRepo.GetAllFrontier(ProjId);
Assert.That(frontier, Has.Count.EqualTo(1));
Assert.That(frontier, Does.Contain(finalWord).UsingPropertiesComparer());
}
Expand Down Expand Up @@ -381,14 +381,14 @@ public async Task TestRestoreWord()
await _wordRepo.DeleteFrontier(ProjId, word.Id);

Assert.That(await _wordRepo.GetAllWords(ProjId), Does.Contain(word).UsingPropertiesComparer());
Assert.That(await _wordRepo.GetFrontier(ProjId), Is.Empty);
Assert.That(await _wordRepo.GetAllFrontier(ProjId), Is.Empty);

var result = await _wordController.RestoreWord(ProjId, word.Id);

Assert.That(result, Is.InstanceOf<OkObjectResult>());
Assert.That(((OkObjectResult)result).Value, Is.True);
Assert.That(await _wordRepo.GetAllWords(ProjId), Does.Contain(word).UsingPropertiesComparer());
Assert.That(await _wordRepo.GetFrontier(ProjId), Does.Contain(word).UsingPropertiesComparer());
Assert.That(await _wordRepo.GetAllFrontier(ProjId), Does.Contain(word).UsingPropertiesComparer());
}

[Test]
Expand Down
23 changes: 15 additions & 8 deletions Backend.Tests/Mocks/WordRepositoryMock.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,17 @@ internal sealed class WordRepositoryMock : IWordRepository
private readonly List<Word> _words = [];
private readonly List<Word> _frontier = [];

private Task<bool>? _getFrontierDelay;
private int _getFrontierCallCount;
private Task<bool>? _getAllFrontierDelay;
private int _getAllFrontierCallCount;

/// <summary>
/// Sets a delay for the GetFrontier method. The first call to GetFrontier will wait
/// until the provided Task is completed.
/// </summary>
public void SetGetFrontierDelay(Task<bool> delay)
{
_getFrontierDelay = delay;
_getFrontierCallCount = 0;
_getAllFrontierDelay = delay;
_getAllFrontierCallCount = 0;
}

public Task<List<Word>> GetAllWords(string projectId)
Expand Down Expand Up @@ -99,21 +99,28 @@ public Task<int> GetFrontierCount(string projectId)
return Task.FromResult(_frontier.Count(w => w.ProjectId == projectId));
}

public async Task<List<Word>> GetFrontier(string projectId)
public async Task<List<Word>> GetAllFrontier(string projectId)
{
if (_getFrontierDelay is not null)
if (_getAllFrontierDelay is not null)
{
var callCount = Interlocked.Increment(ref _getFrontierCallCount);
var callCount = Interlocked.Increment(ref _getAllFrontierCallCount);
if (callCount == 1)
{
// First call waits for the signal
await _getFrontierDelay;
await _getAllFrontierDelay;
}
}

return _frontier.Where(w => w.ProjectId == projectId).Select(w => w.Clone()).ToList();
}

public Task<Word?> GetFrontier(string projectId, string wordId, string? audioFileName = null)
{
var word = _frontier.Find(w => w.ProjectId == projectId && w.Id == wordId &&
(string.IsNullOrEmpty(audioFileName) || w.Audio.Any(a => a.FileName == audioFileName)));
return Task.FromResult(word?.Clone());
}

public Task<List<Word>> GetFrontierWithVernacular(string projectId, string vernacular)
{
return Task.FromResult(_frontier.Where(
Expand Down
18 changes: 9 additions & 9 deletions Backend.Tests/Services/MergeServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public void MergeWordsOneChildTest()
Util.AssertEqualWordContent(newWords.First(), thisWord, true);

// Check that the only word in the frontier is the new word
var frontier = _wordRepo.GetFrontier(ProjId).Result;
var frontier = _wordRepo.GetAllFrontier(ProjId).Result;
Assert.That(frontier, Has.Count.EqualTo(1));
Assert.That(frontier.First(), Is.EqualTo(newWords.First()).UsingPropertiesComparer());

Expand All @@ -81,7 +81,7 @@ public void MergeWordsDeleteTest()
var newWords = _mergeService.Merge(ProjId, UserId, [mergeObject]).Result;
// There should be no word added and no words left in the frontier.
Assert.That(newWords, Is.Empty);
var frontier = _wordRepo.GetFrontier(ProjId).Result;
var frontier = _wordRepo.GetAllFrontier(ProjId).Result;
Assert.That(frontier, Is.Empty);
}

Expand All @@ -105,7 +105,7 @@ public void MergeWordsMultiChildTest()
Assert.That(_wordRepo.GetWord(ProjId, id).Result, Is.Not.Null);
mergeWords.Children.Add(new MergeSourceWord { SrcWordId = id });
}
Assert.That(_wordRepo.GetFrontier(ProjId).Result, Has.Count.EqualTo(numberOfChildren));
Assert.That(_wordRepo.GetAllFrontier(ProjId).Result, Has.Count.EqualTo(numberOfChildren));

var mergeWordsList = new List<MergeWords> { mergeWords };
var newWords = _mergeService.Merge(ProjId, UserId, mergeWordsList).Result;
Expand All @@ -120,7 +120,7 @@ public void MergeWordsMultiChildTest()

// Confirm that parent added to repo and children not in frontier.
Assert.That(_wordRepo.GetWord(ProjId, dbParent.Id).Result, Is.Not.Null);
Assert.That(_wordRepo.GetFrontier(ProjId).Result, Has.Count.EqualTo(1));
Assert.That(_wordRepo.GetAllFrontier(ProjId).Result, Has.Count.EqualTo(1));
}

[Test]
Expand All @@ -134,7 +134,7 @@ public void MergeWordsMultipleTest()
Assert.That(newWords, Has.Count.EqualTo(wordCount));
Assert.That(newWords.First().Id, Is.Not.EqualTo(newWords.Last().Id));

var frontier = _wordRepo.GetFrontier(ProjId).Result;
var frontier = _wordRepo.GetAllFrontier(ProjId).Result;
Assert.That(frontier, Has.Count.EqualTo(wordCount));
Assert.That(frontier.First().Id, Is.Not.EqualTo(frontier.Last().Id));
Assert.That(newWords, Does.Contain(frontier.First()).UsingPropertiesComparer());
Expand Down Expand Up @@ -165,7 +165,7 @@ public void UndoMergeOneChildTest()
var undo = _mergeService.UndoMerge(ProjId, UserId, mergedWord).Result;
Assert.That(undo, Is.True);

var frontierWords = _wordRepo.GetFrontier(ProjId).Result;
var frontierWords = _wordRepo.GetAllFrontier(ProjId).Result;
var frontierWordIds = frontierWords.Select(word => word.Id).ToList();

Assert.That(frontierWords, Has.Count.EqualTo(1));
Expand All @@ -185,20 +185,20 @@ public void UndoMergeMultiChildTest()
Assert.That(_wordRepo.GetWord(ProjId, id).Result, Is.Not.Null);
mergeWords.Children.Add(new MergeSourceWord { SrcWordId = id });
}
Assert.That(_wordRepo.GetFrontier(ProjId).Result, Has.Count.EqualTo(numberOfChildren));
Assert.That(_wordRepo.GetAllFrontier(ProjId).Result, Has.Count.EqualTo(numberOfChildren));

var mergeWordsList = new List<MergeWords> { mergeWords };
var newWords = _mergeService.Merge(ProjId, UserId, mergeWordsList).Result;

Assert.That(_wordRepo.GetFrontier(ProjId).Result, Has.Count.EqualTo(1));
Assert.That(_wordRepo.GetAllFrontier(ProjId).Result, Has.Count.EqualTo(1));

var childIds = mergeWords.Children.Select(word => word.SrcWordId).ToList();
var parentIds = new List<string> { newWords[0].Id };
var mergedWord = new MergeUndoIds(parentIds, childIds);
var undo = _mergeService.UndoMerge(ProjId, UserId, mergedWord).Result;
Assert.That(undo, Is.True);

var frontierWords = _wordRepo.GetFrontier(ProjId).Result;
var frontierWords = _wordRepo.GetAllFrontier(ProjId).Result;
var frontierWordIds = frontierWords.Select(word => word.Id).ToList();

Assert.That(frontierWords, Has.Count.EqualTo(numberOfChildren));
Expand Down
10 changes: 5 additions & 5 deletions Backend.Tests/Services/WordServiceTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public void TestCreateMultipleWords()
{
_ = _wordService.Create(UserId, [new() { ProjectId = ProjId }, new() { ProjectId = ProjId }]).Result;
Assert.That(_wordRepo.GetAllWords(ProjId).Result, Has.Count.EqualTo(2));
Assert.That(_wordRepo.GetFrontier(ProjId).Result, Has.Count.EqualTo(2));
Assert.That(_wordRepo.GetAllFrontier(ProjId).Result, Has.Count.EqualTo(2));
}

[Test]
Expand Down Expand Up @@ -93,7 +93,7 @@ public void TestUpdateReplacesFrontierWord()
var oldId = word.Id;
word.Vernacular = "NewVern";
Assert.That(_wordService.Update(UserId, word).Result!.Guid, Is.EqualTo(word.Guid));
var frontier = _wordRepo.GetFrontier(ProjId).Result;
var frontier = _wordRepo.GetAllFrontier(ProjId).Result;
Assert.That(frontier, Has.Count.EqualTo(1));
var newWord = frontier.First();
Assert.That(newWord.Id, Is.Not.EqualTo(oldId));
Expand Down Expand Up @@ -131,7 +131,7 @@ public void TestRestoreFrontierWordsFrontierWordFalse()
{
var wordNoFrontier = _wordRepo.Add(new Word { ProjectId = ProjId }).Result;
var wordYesFrontier = _wordRepo.Create(new Word { ProjectId = ProjId }).Result;
Assert.That(_wordRepo.GetFrontier(ProjId).Result, Has.Count.EqualTo(1));
Assert.That(_wordRepo.GetAllFrontier(ProjId).Result, Has.Count.EqualTo(1));
Assert.That(
_wordService.RestoreFrontierWords(ProjId, [wordNoFrontier.Id, wordYesFrontier.Id]).Result, Is.False);
}
Expand All @@ -141,9 +141,9 @@ public void TestRestoreFrontierWordsTrue()
{
var word1 = _wordRepo.Add(new Word { ProjectId = ProjId }).Result;
var word2 = _wordRepo.Add(new Word { ProjectId = ProjId }).Result;
Assert.That(_wordRepo.GetFrontier(ProjId).Result, Is.Empty);
Assert.That(_wordRepo.GetAllFrontier(ProjId).Result, Is.Empty);
Assert.That(_wordService.RestoreFrontierWords(ProjId, [word1.Id, word2.Id]).Result, Is.True);
Assert.That(_wordRepo.GetFrontier(ProjId).Result, Has.Count.EqualTo(2));
Assert.That(_wordRepo.GetAllFrontier(ProjId).Result, Has.Count.EqualTo(2));
}

[Test]
Expand Down
2 changes: 1 addition & 1 deletion Backend/Controllers/AudioController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ public async Task<IActionResult> UploadAudioFile(
return BadRequest("Empty File");
}

var word = await _wordRepo.GetWord(projectId, wordId);
var word = await _wordRepo.GetFrontier(projectId, wordId);
if (word is null)
{
return NotFound($"wordId: {wordId}");
Expand Down
4 changes: 2 additions & 2 deletions Backend/Controllers/WordController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ public async Task<IActionResult> GetProjectFrontierWords(string projectId)
return Forbid();
}

return Ok(await _wordRepo.GetFrontier(projectId));
return Ok(await _wordRepo.GetAllFrontier(projectId));
}

/// <summary> Checks if Frontier has <see cref="Word"/> in specified <see cref="Project"/>. </summary>
Expand Down Expand Up @@ -187,7 +187,7 @@ public async Task<IActionResult> UpdateDuplicate(
}
word.ProjectId = projectId;

var duplicatedWord = await _wordRepo.GetWord(word.ProjectId, dupId);
var duplicatedWord = await _wordRepo.GetFrontier(word.ProjectId, dupId);
if (duplicatedWord is null)
{
return NotFound();
Expand Down
3 changes: 2 additions & 1 deletion Backend/Interfaces/IWordRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ public interface IWordRepository
Task<bool> IsInFrontier(string projectId, string wordId);
Task<bool> AreInFrontier(string projectId, List<string> wordIds, int count);
Task<int> GetFrontierCount(string projectId);
Task<List<Word>> GetFrontier(string projectId);
Task<List<Word>> GetAllFrontier(string projectId);
Task<Word?> GetFrontier(string projectId, string wordId, string? audioFileName = null);
Task<List<Word>> GetFrontierWithVernacular(string projectId, string vernacular);
Task<Word> AddFrontier(Word word);
Task<List<Word>> AddFrontier(List<Word> words);
Expand Down
14 changes: 13 additions & 1 deletion Backend/Repositories/WordRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -229,13 +229,25 @@ public async Task<int> GetFrontierCount(string projectId)
}

/// <summary> Finds all <see cref="Word"/>s in the Frontier for specified <see cref="Project"/> </summary>
public async Task<List<Word>> GetFrontier(string projectId)
public async Task<List<Word>> GetAllFrontier(string projectId)
{
using var activity = OtelService.StartActivityWithTag(otelTagName, "getting all Frontier words");

return await _frontier.Find(GetAllProjectWordsFilter(projectId)).ToListAsync();
}

/// <summary> Gets a specified <see cref="Word"/> from the Frontier </summary>
/// <returns> The word, or null if not found. </returns>
public async Task<Word?> GetFrontier(string projectId, string wordId, string? audioFileName = null)
{
using var activity = OtelService.StartActivityWithTag(otelTagName, "getting a word from Frontier");

return string.IsNullOrEmpty(audioFileName)
? await _frontier.Find(GetProjectWordFilter(projectId, wordId)).FirstOrDefaultAsync()
: await _frontier.Find(GetProjectWordWithAudioFilter(projectId, wordId, audioFileName))
.FirstOrDefaultAsync();
}

/// <summary> Finds all <see cref="Word"/>s in Frontier of specified project with specified vern </summary>
public async Task<List<Word>> GetFrontierWithVernacular(string projectId, string vernacular)
{
Expand Down
2 changes: 1 addition & 1 deletion Backend/Services/LiftService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@ public async Task<string> LiftExport(string projectId, IProjectRepository projRe

// Get every word with all of its information.
var allWords = await wordRepo.GetAllWords(projectId);
var frontier = await wordRepo.GetFrontier(projectId);
var frontier = await wordRepo.GetAllFrontier(projectId);
var activeWords = frontier.Where(
x => x.Senses.Any(s => s.Accessibility == Status.Active || s.Accessibility == Status.Protected)).ToList();
var hasFlags = activeWords.Any(w => w.Flag.Active);
Expand Down
8 changes: 4 additions & 4 deletions Backend/Services/MergeService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,7 @@ public async Task<int> UpdateMergeBlacklist(string projectId)
{
return 0;
}
var frontierWordIds = (await _wordRepo.GetFrontier(projectId)).Select(word => word.Id);
var frontierWordIds = (await _wordRepo.GetAllFrontier(projectId)).Select(word => word.Id);
var updateCount = 0;
foreach (var entry in oldBlacklist)
{
Expand Down Expand Up @@ -346,7 +346,7 @@ public async Task<int> UpdateMergeGraylist(string projectId)
{
return 0;
}
var frontierWordIds = (await _wordRepo.GetFrontier(projectId)).Select(word => word.Id);
var frontierWordIds = (await _wordRepo.GetAllFrontier(projectId)).Select(word => word.Id);
var updateCount = 0;
foreach (var entry in oldGraylist)
{
Expand Down Expand Up @@ -402,7 +402,7 @@ public async Task<List<List<Word>>> GetGraylistEntries(
{
return [];
}
var frontier = await _wordRepo.GetFrontier(projectId);
var frontier = await _wordRepo.GetAllFrontier(projectId);
var wordLists = new List<List<Word>> { Capacity = maxLists };
foreach (var entry in graylist)
{
Expand Down Expand Up @@ -443,7 +443,7 @@ public async Task<List<List<Word>>> GetPotentialDuplicates(string projectId, int
{
var dupFinder = new DuplicateFinder(maxInList, maxLists, 2);

var collection = await _wordRepo.GetFrontier(projectId);
var collection = await _wordRepo.GetAllFrontier(projectId);
async Task<bool> isUnavailableSet(List<string> wordIds) =>
(await IsInMergeBlacklist(projectId, wordIds, userId)) ||
(await IsInMergeGraylist(projectId, wordIds, userId));
Expand Down
Loading
Loading