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
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using FwDataMiniLcmBridge.Tests.Fixtures;

namespace FwDataMiniLcmBridge.Tests.MiniLcmTests;

[Collection(ProjectLoaderFixture.Name)]
public class SenseTests(ProjectLoaderFixture fixture) : SenseTestsBase
{
protected override Task<IMiniLcmApi> NewApi()
{
return Task.FromResult<IMiniLcmApi>(fixture.NewProjectApi("SenseTests", "en", "en"));
}
}
7 changes: 4 additions & 3 deletions backend/FwLite/FwDataMiniLcmBridge/Api/FwDataMiniLcmApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -953,7 +953,8 @@ public IAsyncEnumerable<Entry> SearchEntries(string query, QueryOptions? options

public Task<Entry?> GetEntry(Guid id)
{
return Task.FromResult<Entry?>(FromLexEntry(EntriesRepository.GetObject(id)));
EntriesRepository.TryGetObject(id, out var lexEntry);
return Task.FromResult(lexEntry is null ? null : FromLexEntry(lexEntry));
}

public async Task<Entry> CreateEntry(Entry entry, CreateEntryOptions? options = null)
Expand Down Expand Up @@ -1423,7 +1424,7 @@ private void ApplySenseToLexSense(Sense sense, ILexSense lexSense)

public Task<Sense?> GetSense(Guid entryId, Guid id)
{
var lcmSense = SenseRepository.GetObject(id);
SenseRepository.TryGetObject(id, out var lcmSense);
return Task.FromResult(lcmSense is null ? null : FromLexSense(lcmSense));
}

Expand Down Expand Up @@ -1550,7 +1551,7 @@ public Task DeleteSense(Guid entryId, Guid senseId)

public Task<ExampleSentence?> GetExampleSentence(Guid entryId, Guid senseId, Guid id)
{
var lcmExampleSentence = ExampleSentenceRepository.GetObject(id);
ExampleSentenceRepository.TryGetObject(id, out var lcmExampleSentence);
return Task.FromResult(lcmExampleSentence is null ? null : FromLexExampleSentence(senseId, lcmExampleSentence));
}

Expand Down
37 changes: 37 additions & 0 deletions backend/FwLite/FwLiteProjectSync.Tests/CrdtRepairTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,25 @@ public async Task CrdtEntryMissingTranslationId_FwTranslationRemoved_FullSync()
updatedCrdtEntry!.SingleExampleSentence().Translations.Should().BeEmpty();
}

[Fact]
public async Task CrdtEntryMissingTranslationId_FwExampleSentenceRemoved_FullSync()
{
// arrange
var (fwEntry, crdtEntry, _) = await CreateSyncedEntryMissingTranslationId();
var entryId = fwEntry.Id;
var senseId = fwEntry.Senses.Single().Id;
var exampleSentenceId = fwEntry.SingleExampleSentence().Id;

// act
await FwDataApi.DeleteExampleSentence(entryId, senseId, exampleSentenceId);
var result = await SyncService.Sync(CrdtApi, FwDataApi);
result.CrdtChanges.Should().Be(1, "the crdt example-sentence was removed");

// assert - the crdt translation was also removed
var updatedCrdtEntry = await CrdtApi.GetEntry(crdtEntry.Id);
updatedCrdtEntry!.Senses.Single().ExampleSentences.Should().BeEmpty();
}

[Fact]
public async Task CrdtEntryMissingTranslationId_CrdtTranslationRemoved_SyncMissingTranslationIds()
{
Expand Down Expand Up @@ -255,6 +274,24 @@ public async Task CrdtEntryMissingTranslationId_CrdtTranslationRemoved_FullSync(
updatedFwEntry!.SingleExampleSentence().Translations.Should().BeEmpty();
}

[Fact]
public async Task CrdtEntryMissingTranslationId_CrdtExampleSentenceRemoved_FullSync()
{
// arrange
var (fwEntry, crdtEntry, _) = await CreateSyncedEntryMissingTranslationId();
var entryId = fwEntry.Id;
var senseId = fwEntry.Senses.Single().Id;
var exampleSentenceId = fwEntry.SingleExampleSentence().Id;

// act
await CrdtApi.DeleteExampleSentence(entryId, senseId, exampleSentenceId);
await SyncService.Sync(CrdtApi, FwDataApi);

// assert - the fw translation was also removed
var updatedFwEntry = await FwDataApi.GetEntry(crdtEntry.Id);
updatedFwEntry!.Senses.Single().ExampleSentences.Should().BeEmpty();
}

[Fact]
public async Task CrdtEntryMissingTranslationId_NewCrdtEntry_SyncMissingTranslationIds()
{
Expand Down
19 changes: 19 additions & 0 deletions backend/FwLite/LcmCrdt.Tests/MiniLcmTests/SenseTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
namespace LcmCrdt.Tests.MiniLcmTests;

public class SenseTests : SenseTestsBase
{
private readonly MiniLcmApiFixture _fixture = new();

protected override async Task<IMiniLcmApi> NewApi()
{
await _fixture.InitializeAsync();
var api = _fixture.Api;
return api;
}

public override async Task DisposeAsync()
{
await base.DisposeAsync();
await _fixture.DisposeAsync();
}
}
27 changes: 26 additions & 1 deletion backend/FwLite/MiniLcm.Tests/ExampleSentenceTestsBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ public abstract class ExampleSentenceTestsBase : MiniLcmTestBase
{
private readonly Guid _entryId = Guid.NewGuid();
private readonly Guid _senseId = Guid.NewGuid();
private readonly Guid _exampleSentenceId = Guid.NewGuid();

public override async Task InitializeAsync()
{
Expand All @@ -14,11 +15,35 @@ await Api.CreateEntry(new Entry()
LexemeForm = { { "en", "new-lexeme-form" } },
Senses =
[
new Sense() { Id = _senseId, Gloss = { { "en", "new-sense-gloss" } } }
new Sense()
{
Id = _senseId,
Gloss = { { "en", "new-sense-gloss" } },
ExampleSentences = [ new()
{
Id = _exampleSentenceId,
Sentence = { { "en", new("new-example-sentence") } },
}]
}
]
});
}

[Fact]
public async Task Get_MissingExampleSentence_ReturnsNull()
{
var exampleSentence = await Api.GetExampleSentence(_entryId, _senseId, Guid.NewGuid());
exampleSentence.Should().BeNull();
}

[Fact]
public async Task Get_ExistingExampleSentence_ReturnsExampleSentence()
{
var exampleSentence = await Api.GetExampleSentence(_entryId, _senseId, _exampleSentenceId);
exampleSentence.Should().NotBeNull();
exampleSentence.Sentence["en"].Should().BeEquivalentTo(new RichString("new-example-sentence", "en"));
}

[Fact]
public async Task CanCreateExampleSentence()
{
Expand Down
22 changes: 21 additions & 1 deletion backend/FwLite/MiniLcm.Tests/QueryEntryTestsBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ namespace MiniLcm.Tests;

public abstract class QueryEntryTestsBase : MiniLcmTestBase
{
private readonly Guid appleId = Guid.NewGuid();
private readonly string Apple = "Apple";
private readonly string Peach = "Peach";
private readonly string Banana = "Banana";
Expand All @@ -23,7 +24,11 @@ public override async Task InitializeAsync()
await Api.CreateSemanticDomain(semanticDomain);
var complexFormType = new ComplexFormType() { Id = Guid.NewGuid(), Name = new() { { "en", "Very complex" } } };
await Api.CreateComplexFormType(complexFormType);
await Api.CreateEntry(new Entry() { LexemeForm = { { "en", Apple } } });
await Api.CreateEntry(new Entry()
{
Id = appleId,
LexemeForm = { { "en", Apple } }
});
await Api.CreateEntry(new Entry()
{
LexemeForm = { { "en", Peach } },
Expand Down Expand Up @@ -92,6 +97,21 @@ await Api.CreateEntry(new Entry()
await Api.CreateEntry(new Entry());
}

[Fact]
public async Task Get_MissingEntry_ReturnsNull()
{
var entry = await Api.GetEntry(Guid.NewGuid());
entry.Should().BeNull();
}

[Fact]
public async Task Get_ExistingEntry_ReturnsEntry()
{
var entry = await Api.GetEntry(appleId);
entry.Should().NotBeNull();
entry.LexemeForm["en"].Should().Be(Apple);
}

[Fact]
public async Task CanFilterToMissingSenses()
{
Expand Down
37 changes: 37 additions & 0 deletions backend/FwLite/MiniLcm.Tests/SenseTestsBase.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
namespace MiniLcm.Tests;

public abstract class SenseTestsBase : MiniLcmTestBase
{
private static readonly Guid _entryId = Guid.NewGuid();
private static readonly Guid _senseId = Guid.NewGuid();

public override async Task InitializeAsync()
{
await base.InitializeAsync();
await Api.CreateEntry(new Entry()
{
Id = _entryId,
LexemeForm = { { "en", "new-lexeme-form" } },
Senses = [new()
{
Id = _senseId,
Gloss = { { "en", "new-sense-gloss" } }
}]
});
}

[Fact]
public async Task Get_MissingSense_ReturnsNull()
{
var sense = await Api.GetSense(_entryId, Guid.NewGuid());
sense.Should().BeNull();
}

[Fact]
public async Task Get_ExistingSense_ReturnsSense()
{
var sense = await Api.GetSense(_entryId, _senseId);
sense.Should().NotBeNull();
sense.Gloss["en"].Should().Be("new-sense-gloss");
}
}
Loading