144 lines
4.5 KiB
C#
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);
|
|
}
|
|
} |