dramaling-vocab-learning/backend/DramaLing.Api/DramaLing.Api.Tests/Unit/Repositories/FlashcardRepositoryTests.cs

98 lines
3.1 KiB
C#

using DramaLing.Api.Repositories;
using DramaLing.Api.Tests.TestData;
namespace DramaLing.Api.Tests.Unit.Repositories;
/// <summary>
/// FlashcardRepository 單元測試
/// </summary>
public class FlashcardRepositoryTests : TestBase
{
private readonly IFlashcardRepository _repository;
public FlashcardRepositoryTests()
{
_repository = new FlashcardRepository(DbContext,
ServiceProvider.GetRequiredService<ILogger<BaseRepository<Flashcard>>>());
}
[Fact]
public async Task GetByUserIdAsync_ShouldReturnUserFlashcards()
{
// Arrange
var user = TestDataFactory.CreateUser();
var flashcards = TestDataFactory.CreateFlashcards(user.Id, 3);
DbContext.Users.Add(user);
DbContext.Flashcards.AddRange(flashcards);
await DbContext.SaveChangesAsync();
// Act
var result = await _repository.GetByUserIdAsync(user.Id);
// Assert
Assert.NotNull(result);
Assert.Equal(3, result.Count());
Assert.All(result, fc => Assert.Equal(user.Id, fc.UserId));
}
[Fact]
public async Task GetByUserIdAndFlashcardIdAsync_ShouldReturnSpecificFlashcard()
{
// Arrange
var user = TestDataFactory.CreateUser();
var flashcard = TestDataFactory.CreateFlashcard(user.Id);
DbContext.Users.Add(user);
DbContext.Flashcards.Add(flashcard);
await DbContext.SaveChangesAsync();
// Act
var result = await _repository.GetByUserIdAndFlashcardIdAsync(user.Id, flashcard.Id);
// Assert
Assert.NotNull(result);
Assert.Equal(flashcard.Id, result.Id);
Assert.Equal(user.Id, result.UserId);
}
[Fact]
public async Task GetByUserIdAsync_WithSearch_ShouldReturnFilteredResults()
{
// Arrange
var user = TestDataFactory.CreateUser();
var flashcard1 = TestDataFactory.CreateFlashcard(user.Id, "Apple", "蘋果");
var flashcard2 = TestDataFactory.CreateFlashcard(user.Id, "Banana", "香蕉");
var flashcard3 = TestDataFactory.CreateFlashcard(user.Id, "Orange", "柳橙");
DbContext.Users.Add(user);
DbContext.Flashcards.AddRange(flashcard1, flashcard2, flashcard3);
await DbContext.SaveChangesAsync();
// Act
var result = await _repository.GetByUserIdAsync(user.Id, search: "Apple");
// Assert
Assert.NotNull(result);
Assert.Single(result);
Assert.Contains("Apple", result.First().FrontText);
}
[Fact]
public async Task GetCountByUserIdAsync_ShouldReturnCorrectCount()
{
// Arrange
var user = TestDataFactory.CreateUser();
var flashcards = TestDataFactory.CreateFlashcards(user.Id, 5);
DbContext.Users.Add(user);
DbContext.Flashcards.AddRange(flashcards);
await DbContext.SaveChangesAsync();
// Act
var count = await _repository.GetCountByUserIdAsync(user.Id);
// Assert
Assert.Equal(5, count);
}
}