dramaling-vocab-learning/backend/DramaLing.Api.Tests/Integration/FrameworkTests.cs

144 lines
4.5 KiB
C#

using DramaLing.Api.Tests.Integration.Fixtures;
using System.Net;
namespace DramaLing.Api.Tests.Integration;
/// <summary>
/// 測試框架驗證測試
/// 確保整合測試基礎設施正常工作
/// </summary>
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);
}
}