using System; using System.Threading; using System.Threading.Tasks; using FluentAssertions; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Moq; using NexusReader.Application.Commands.Quiz; using NexusReader.Data.Persistence; using NexusReader.Domain.Entities; using Xunit; namespace NexusReader.Application.Tests.Commands; public class SubmitQuizResultCommandHandlerTests : IDisposable { private readonly SqliteConnection _connection; private readonly DbContextOptions _contextOptions; private readonly Mock> _dbContextFactoryMock; public SubmitQuizResultCommandHandlerTests() { _connection = new SqliteConnection("DataSource=:memory:"); _connection.Open(); _contextOptions = new DbContextOptionsBuilder() .UseSqlite(_connection) .Options; using var context = new AppDbContext(_contextOptions); context.Database.EnsureCreated(); _dbContextFactoryMock = new Mock>(); _dbContextFactoryMock.Setup(f => f.CreateDbContextAsync(It.IsAny())) .ReturnsAsync(() => new AppDbContext(_contextOptions)); } [Fact] public async Task Handle_WithValidRequest_PersistsQuizResultToDatabase() { // Arrange using (var context = new AppDbContext(_contextOptions)) { var user = new NexusUser { Id = "user-abc", UserName = "testuser", Email = "test@example.com", TenantId = "tenant-xyz", SubscriptionPlanId = 1 }; context.Users.Add(user); await context.SaveChangesAsync(); } var command = new SubmitQuizResultCommand( UserId: "user-abc", Topic: "Sprawdzian: .NET 10", Score: 4, TotalQuestions: 5 ); var handler = new SubmitQuizResultCommandHandler(_dbContextFactoryMock.Object); // Act var result = await handler.Handle(command, CancellationToken.None); // Assert result.IsSuccess.Should().BeTrue(); using (var context = new AppDbContext(_contextOptions)) { var quizResult = await context.QuizResults.FirstOrDefaultAsync(q => q.UserId == "user-abc"); quizResult.Should().NotBeNull(); quizResult!.Topic.Should().Be("Sprawdzian: .NET 10"); quizResult.Score.Should().Be(4); quizResult.TotalQuestions.Should().Be(5); quizResult.TenantId.Should().Be("tenant-xyz"); } } [Fact] public async Task Handle_WithNonExistentUser_ReturnsFailureResult() { // Arrange var command = new SubmitQuizResultCommand( UserId: "non-existent", Topic: "Sprawdzian: .NET 10", Score: 4, TotalQuestions: 5 ); var handler = new SubmitQuizResultCommandHandler(_dbContextFactoryMock.Object); // Act var result = await handler.Handle(command, CancellationToken.None); // Assert result.IsFailed.Should().BeTrue(); result.Errors.Should().ContainSingle(e => e.Message == "User not found."); } public void Dispose() { _connection.Dispose(); } }