Ctrl K
ComunidadGuías…

Nostos.Backend.Tests/Portability/LibraryRowCountsTests.cs

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
using FluentAssertions;
using Microsoft.Data.Sqlite;
using Microsoft.EntityFrameworkCore;
using Nostos.Backend.Data;
using Nostos.Backend.Data.Models;
using Nostos.Backend.Services.Portability.Migration;
using Xunit;

namespace Nostos.Backend.Tests.Portability;

/// <summary>
/// Preflight, activation and recovery decide "empty or populated" from these
/// counts. They once disagreed about an assistant settings row whose mode was
/// never chosen (issue #887); these tests pin the one rule they now share.
/// </summary>
public sealed class LibraryRowCountsTests : IAsyncLifetime
{
    private readonly SqliteConnection _connection = new("Data Source=:memory:");
    private NostosDbContext _db = null!;

    public async Task InitializeAsync()
    {
        await _connection.OpenAsync();
        _db = new NostosDbContext(
            new DbContextOptionsBuilder<NostosDbContext>().UseSqlite(_connection).Options);
        await _db.Database.EnsureCreatedAsync();
    }

    public async Task DisposeAsync()
    {
        await _db.DisposeAsync();
        await _connection.DisposeAsync();
    }

    [Fact]
    public async Task A_settings_row_whose_mode_was_never_chosen_is_not_user_data()
    {
        _db.AssistantSettings.Add(new AssistantSettingsModel { CaptureProcessingMode = null });
        await _db.SaveChangesAsync();

        var userData = await LibraryRowCounts.ReadUserDataAsync(_db, CancellationToken.None);
        var all = await LibraryRowCounts.ReadAllAsync(_db, CancellationToken.None);

        userData.AssistantSettings.Should().Be(0);
        userData.TotalRows.Should().Be(0, "a library holding only that row is still empty");
        all.AssistantSettings.Should().Be(1, "the revision token must still see the row exist");
    }

    [Fact]
    public async Task A_chosen_capture_mode_is_user_data()
    {
        _db.AssistantSettings.Add(new AssistantSettingsModel { CaptureProcessingMode = "verbatim" });
        await _db.SaveChangesAsync();

        var userData = await LibraryRowCounts.ReadUserDataAsync(_db, CancellationToken.None);

        userData.AssistantSettings.Should().Be(1);
        userData.TotalRows.Should().Be(1);
    }

    [Fact]
    public async Task Both_readings_agree_on_every_other_table()
    {
        _db.Topics.Add(new TopicModel { Topic = "Stoicism" });
        _db.Collections.Add(new CollectionModel { Name = "Philosophy" });
        await _db.SaveChangesAsync();

        var userData = await LibraryRowCounts.ReadUserDataAsync(_db, CancellationToken.None);
        var all = await LibraryRowCounts.ReadAllAsync(_db, CancellationToken.None);

        userData.Should().Be(all);
        userData.Topics.Should().Be(1);
        userData.Collections.Should().Be(1);
        userData.TotalRows.Should().Be(2);
    }
}