using DramaLing.Api.Data;
using DramaLing.Api.Models.Entities;
namespace DramaLing.Api.Tests.Integration.Fixtures;
///
/// 測試資料種子類別
/// 提供一致的測試資料給所有整合測試使用
///
public static class TestDataSeeder
{
// 測試使用者 IDs
public static readonly Guid TestUser1Id = new("11111111-1111-1111-1111-111111111111");
public static readonly Guid TestUser2Id = new("22222222-2222-2222-2222-222222222222");
// 測試詞卡 IDs
public static readonly Guid TestFlashcard1Id = new("AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA");
public static readonly Guid TestFlashcard2Id = new("BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB");
public static readonly Guid TestFlashcard3Id = new("CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC");
///
/// 種子測試資料
///
public static void SeedTestData(DramaLingDbContext context)
{
// 如果已有資料則跳過
if (context.Users.Any()) return;
SeedUsers(context);
SeedFlashcards(context);
SeedFlashcardReviews(context);
context.SaveChanges();
}
private static void SeedUsers(DramaLingDbContext context)
{
var users = new[]
{
new User
{
Id = TestUser1Id,
Username = "testuser1",
Email = "test1@example.com",
PasswordHash = "$2a$11$TestHashForUser1Password123", // bcrypt hash for "password123"
DisplayName = "Test User 1",
CreatedAt = DateTime.UtcNow.AddDays(-30),
UpdatedAt = DateTime.UtcNow
},
new User
{
Id = TestUser2Id,
Username = "testuser2",
Email = "test2@example.com",
PasswordHash = "$2a$11$TestHashForUser2Password456", // bcrypt hash for "password456"
DisplayName = "Test User 2",
CreatedAt = DateTime.UtcNow.AddDays(-15),
UpdatedAt = DateTime.UtcNow
}
};
context.Users.AddRange(users);
}
private static void SeedFlashcards(DramaLingDbContext context)
{
var flashcards = new[]
{
new Flashcard
{
Id = TestFlashcard1Id,
UserId = TestUser1Id,
Word = "hello",
Translation = "你好",
Definition = "A greeting used when meeting someone",
PartOfSpeech = "interjection",
Pronunciation = "/həˈloʊ/",
Example = "Hello, how are you today?",
ExampleTranslation = "你好,你今天好嗎?",
DifficultyLevelNumeric = 1, // A1
IsFavorite = false,
Synonyms = "[\"hi\", \"greetings\", \"salutations\"]",
CreatedAt = DateTime.UtcNow.AddDays(-10),
UpdatedAt = DateTime.UtcNow.AddDays(-5)
},
new Flashcard
{
Id = TestFlashcard2Id,
UserId = TestUser1Id,
Word = "beautiful",
Translation = "美麗的",
Definition = "Having qualities that give great pleasure to see or hear",
PartOfSpeech = "adjective",
Pronunciation = "/ˈbjuː.tɪ.fəl/",
Example = "The sunset was absolutely beautiful.",
ExampleTranslation = "夕陽非常美麗。",
DifficultyLevelNumeric = 2, // A2
IsFavorite = true,
Synonyms = "[\"gorgeous\", \"stunning\", \"lovely\"]",
CreatedAt = DateTime.UtcNow.AddDays(-8),
UpdatedAt = DateTime.UtcNow.AddDays(-3)
},
new Flashcard
{
Id = TestFlashcard3Id,
UserId = TestUser2Id,
Word = "sophisticated",
Translation = "精緻的,複雜的",
Definition = "Having a refined knowledge of the ways of the world",
PartOfSpeech = "adjective",
Pronunciation = "/səˈfɪs.tɪ.keɪ.tɪd/",
Example = "She has very sophisticated taste in art.",
ExampleTranslation = "她對藝術有非常精緻的品味。",
DifficultyLevelNumeric = 5, // C1
IsFavorite = false,
Synonyms = "[\"refined\", \"elegant\", \"cultured\"]",
CreatedAt = DateTime.UtcNow.AddDays(-5),
UpdatedAt = DateTime.UtcNow.AddDays(-1)
}
};
context.Flashcards.AddRange(flashcards);
}
private static void SeedFlashcardReviews(DramaLingDbContext context)
{
var reviews = new[]
{
new FlashcardReview
{
Id = Guid.NewGuid(),
UserId = TestUser1Id,
FlashcardId = TestFlashcard1Id,
SuccessCount = 3,
TotalCorrectCount = 5,
TotalWrongCount = 2,
TotalSkipCount = 1,
LastReviewDate = DateTime.UtcNow.AddDays(-2),
LastSuccessDate = DateTime.UtcNow.AddDays(-2),
NextReviewDate = DateTime.UtcNow.AddDays(4), // 2^3 = 8 天後 (但已過 4 天)
CreatedAt = DateTime.UtcNow.AddDays(-10),
UpdatedAt = DateTime.UtcNow.AddDays(-2)
},
new FlashcardReview
{
Id = Guid.NewGuid(),
UserId = TestUser1Id,
FlashcardId = TestFlashcard2Id,
SuccessCount = 1,
TotalCorrectCount = 2,
TotalWrongCount = 3,
TotalSkipCount = 0,
LastReviewDate = DateTime.UtcNow.AddDays(-3),
LastSuccessDate = DateTime.UtcNow.AddDays(-3),
NextReviewDate = DateTime.UtcNow.AddDays(-1), // 應該要複習了
CreatedAt = DateTime.UtcNow.AddDays(-8),
UpdatedAt = DateTime.UtcNow.AddDays(-3)
}
// TestFlashcard3 沒有複習記錄 (新詞卡)
};
context.FlashcardReviews.AddRange(reviews);
}
///
/// 清除所有測試資料
///
public static void ClearTestData(DramaLingDbContext context)
{
context.FlashcardReviews.RemoveRange(context.FlashcardReviews);
context.Flashcards.RemoveRange(context.Flashcards);
context.Users.RemoveRange(context.Users);
context.OptionsVocabularies.RemoveRange(context.OptionsVocabularies);
context.SaveChanges();
}
}