using System; using System.Threading; using System.Threading.Tasks; using GermanApp.Domain.Entities; using GermanApp.Infrastructure.Data.DbContext; using GermanApp.Infrastructure.Data.Repositories; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; namespace GermanApp.Tests.Unit.Infrastructure.Data.Repositories; [TestClass] public class StoryProgressRepositoryTests { private StoryProgress CreateProgress(int id, int userId, int levelId, int storySegmentId, bool isCompleted = false) { var progress = StoryProgress.Create(userId, levelId, storySegmentId); typeof(StoryProgress).GetProperty("Id")?.SetValue(progress, id); if (isCompleted) progress.MarkAsCompleted(); return progress; } [TestMethod] public async Task AddAsync_WithNewProgress_AddsToDbSet() { // Arrange var progress = CreateProgress(0, 1, 1, 1); var mockDbSet = new Mock>(); var options = new DbContextOptions(); var mockContext = new Mock(options); mockDbSet.Setup(d => d.AddAsync(progress, It.IsAny())) .Returns(ValueTask.FromResult((EntityEntry?)null)); mockContext.Setup(c => c.StoryProgress).Returns(mockDbSet.Object); mockContext.Setup(c => c.SaveChangesAsync(It.IsAny())) .ReturnsAsync(1); var repository = new StoryProgressRepository(mockContext.Object); // Act var result = await repository.AddAsync(progress); // Assert Assert.IsNotNull(result); mockDbSet.Verify(d => d.AddAsync(progress, It.IsAny()), Times.Once); mockContext.Verify(c => c.SaveChangesAsync(It.IsAny()), Times.Once); } [TestMethod] public async Task UpdateAsync_WithExistingProgress_UpdatesDbSet() { // Arrange var progress = CreateProgress(1, 1, 1, 1); var mockDbSet = new Mock>(); var options = new DbContextOptions(); var mockContext = new Mock(options); mockContext.Setup(c => c.StoryProgress).Returns(mockDbSet.Object); mockContext.Setup(c => c.SaveChangesAsync(It.IsAny())) .ReturnsAsync(1); var repository = new StoryProgressRepository(mockContext.Object); // Act await repository.UpdateAsync(progress); // Assert mockDbSet.Verify(d => d.Update(progress), Times.Once); mockContext.Verify(c => c.SaveChangesAsync(It.IsAny()), Times.Once); } }