TestDb.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using Domain.Entities.Members;
  2. using Domain.Entities.Payments;
  3. using Domain.Entities.Payments.ValueObject;
  4. using Infrastructure.Persistence;
  5. using Microsoft.EntityFrameworkCore;
  6. namespace Application.Tests;
  7. /// <summary>
  8. /// LocalDB 기반 테스트 DB. 운영과 동일한 SQL Server 프로바이더를 사용해
  9. /// rowversion 동시성·유니크 인덱스 등 관계형 동작을 그대로 검증한다.
  10. /// </summary>
  11. [TestClass]
  12. public sealed class TestDb
  13. {
  14. private const string ConnectionString = @"Server=(localdb)\MSSQLLocalDB;Database=antooza_test;Integrated Security=True;TrustServerCertificate=True;";
  15. public static DbContextOptions<AppDbContext> Options { get; } = new DbContextOptionsBuilder<AppDbContext>().UseSqlServer(ConnectionString).Options;
  16. public static AppDbContext Create() => new(Options);
  17. [AssemblyInitialize]
  18. public static void AssemblyInit(TestContext _)
  19. {
  20. using var db = Create();
  21. db.Database.EnsureDeleted();
  22. db.Database.EnsureCreated();
  23. }
  24. public static async Task<int> CreateMemberAsync(AppDbContext db)
  25. {
  26. var member = Member.Create($"test-{Guid.NewGuid():N}@antooza.test");
  27. await db.Member.AddAsync(member);
  28. await db.SaveChangesAsync(default);
  29. return member.ID;
  30. }
  31. public static async Task<PaymentOrder> CreateOrderAsync(AppDbContext db, int memberID, int pointAmount = 10000, bool paid = false)
  32. {
  33. var order = PaymentOrder.Create(memberID, $"ORD-{Guid.NewGuid():N}", "MID-TEST", pointAmount, PaymentMethod.Card);
  34. if (paid)
  35. {
  36. // DanalConfirm.TransactionID 에 unique 인덱스가 있고 테스트 DB 는 어셈블리 단위로 공유되므로
  37. // 주문별 고유 TransactionID 를 부여해 테스트 간 시드 충돌을 방지한다.
  38. order.MarkPaid($"TX-{Guid.NewGuid():N}");
  39. }
  40. await db.PaymentOrder.AddAsync(order);
  41. await db.SaveChangesAsync(default);
  42. return order;
  43. }
  44. }