using DramaLing.Api.Tests.Integration.Fixtures; using System.Net; namespace DramaLing.Api.Tests.Integration; /// /// 測試框架驗證測試 /// 確保整合測試基礎設施正常工作 /// public class FrameworkTests : IntegrationTestBase { public FrameworkTests(DramaLingWebApplicationFactory factory) : base(factory) { } [Fact] public async Task WebApplicationFactory_ShouldStartSuccessfully() { // Arrange & Act var response = await HttpClient.GetAsync("/"); // Assert // 不期望特定狀態碼,只要應用程式能啟動即可 response.Should().NotBeNull(); } [Fact] public void TestDataSeeder_ShouldCreateConsistentTestData() { // Arrange & Act using var context = GetDbContext(); // Assert var users = context.Users.ToList(); users.Should().HaveCount(2); users.Should().Contain(u => u.Id == TestDataSeeder.TestUser1Id); users.Should().Contain(u => u.Id == TestDataSeeder.TestUser2Id); var flashcards = context.Flashcards.ToList(); flashcards.Should().HaveCount(3); flashcards.Should().Contain(f => f.Id == TestDataSeeder.TestFlashcard1Id); var reviews = context.FlashcardReviews.ToList(); reviews.Should().HaveCount(2); reviews.Should().OnlyContain(r => r.UserId == TestDataSeeder.TestUser1Id); } [Fact] public void JwtTestHelper_ShouldGenerateValidTokens() { // Arrange var userId = TestDataSeeder.TestUser1Id; // Act var token = JwtTestHelper.GenerateJwtToken(userId, "test@example.com", "testuser"); // Assert token.Should().NotBeNullOrEmpty(); var principal = JwtTestHelper.ValidateToken(token); principal.Should().NotBeNull(); principal!.FindFirst("sub")?.Value.Should().Be(userId.ToString()); } [Fact] public void JwtTestHelper_ShouldGenerateTokensWithCorrectClaims() { // Arrange var userId = TestDataSeeder.TestUser1Id; // Act var token = JwtTestHelper.GenerateJwtToken(userId, "test@example.com", "testuser"); // Assert token.Should().NotBeNullOrEmpty(); var principal = JwtTestHelper.ValidateToken(token); principal.Should().NotBeNull(); principal!.FindFirst("sub")?.Value.Should().Be(userId.ToString()); principal!.FindFirst("email")?.Value.Should().Be("test@example.com"); principal!.FindFirst("preferred_username")?.Value.Should().Be("testuser"); } [Fact] public void JwtTestHelper_ShouldDetectInvalidSignature() { // Arrange var userId = TestDataSeeder.TestUser1Id; // Act var invalidToken = JwtTestHelper.GenerateInvalidSignatureToken(userId); // Assert invalidToken.Should().NotBeNullOrEmpty(); var principal = JwtTestHelper.ValidateToken(invalidToken); principal.Should().BeNull("因為簽章無效"); } [Fact] public async Task CreateAuthenticatedClient_ShouldWorkCorrectly() { // Arrange var userId = TestDataSeeder.TestUser1Id; var authenticatedClient = CreateAuthenticatedClient(userId); // Act var response = await authenticatedClient.GetAsync("/"); // Assert response.Should().NotBeNull(); authenticatedClient.DefaultRequestHeaders.Authorization.Should().NotBeNull(); authenticatedClient.DefaultRequestHeaders.Authorization!.Scheme.Should().Be("Bearer"); } [Fact] public void DatabaseReset_ShouldWorkBetweenTests() { // Arrange using var context = GetDbContext(); var initialUserCount = context.Users.Count(); // Act ResetDatabase(); // Assert using var newContext = GetDbContext(); var afterResetUserCount = newContext.Users.Count(); afterResetUserCount.Should().Be(initialUserCount, "資料庫重置後應該還原到初始狀態"); } [Fact] public async Task SendRequestExpectingError_ShouldHandleErrorResponsesCorrectly() { // Arrange var nonExistentEndpoint = "/api/nonexistent"; // Act var response = await SendRequestExpectingError(HttpMethod.Get, nonExistentEndpoint); // Assert response.StatusCode.Should().Be(HttpStatusCode.NotFound); } }