Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

117 рядки
3.9KB

  1. using Campaign_Tracker.Server.Municipalities;
  2. namespace Campaign_Tracker.Server.Tests;
  3. public sealed class MunicipalityContactRepositoryTests
  4. {
  5. private static readonly DateTimeOffset FixedNow =
  6. new(2026, 5, 7, 12, 0, 0, TimeSpan.Zero);
  7. private static InMemoryMunicipalityContactRepository BuildSut() =>
  8. new(new FakeTimeProvider(FixedNow));
  9. [Fact]
  10. public async Task AddAsync_WithPrimaryContact_SavesExtensionContact_AC1()
  11. {
  12. var sut = BuildSut();
  13. var result = await sut.AddAsync(
  14. "profile-1",
  15. "Primary",
  16. "Ada Clerk",
  17. "Town Clerk",
  18. "555-0100",
  19. "ada@example.test",
  20. "actor@example.test");
  21. Assert.True(result.Saved);
  22. Assert.NotNull(result.Contact);
  23. Assert.Equal("Primary", result.Contact.ContactType);
  24. Assert.Equal("Ada Clerk", result.Contact.Name);
  25. Assert.Equal("Town Clerk", result.Contact.RoleTitle);
  26. Assert.Equal("555-0100", result.Contact.Phone);
  27. Assert.Equal("ada@example.test", result.Contact.Email);
  28. Assert.Equal("actor@example.test", result.Contact.UpdatedBy);
  29. Assert.Equal(FixedNow, result.Contact.UpdatedAt);
  30. }
  31. [Fact]
  32. public async Task GetByProfileIdAsync_ReturnsPrimaryBeforeSecondaryWithLabels_AC2()
  33. {
  34. var sut = BuildSut();
  35. await sut.AddAsync("profile-1", "Secondary", "Backup Clerk", null, null, null, "actor");
  36. await sut.AddAsync("profile-1", "Primary", "Main Clerk", null, null, null, "actor");
  37. var contacts = await sut.GetByProfileIdAsync("profile-1");
  38. Assert.Collection(contacts,
  39. primary =>
  40. {
  41. Assert.Equal("Primary", primary.ContactType);
  42. Assert.Equal("Main Clerk", primary.Name);
  43. },
  44. secondary =>
  45. {
  46. Assert.Equal("Secondary", secondary.ContactType);
  47. Assert.Equal("Backup Clerk", secondary.Name);
  48. });
  49. }
  50. [Fact]
  51. public async Task UpdateAsync_ChangesContactAndCapturesActor_AC3()
  52. {
  53. var sut = BuildSut();
  54. var created = await sut.AddAsync("profile-1", "Primary", "Old", null, null, null, "creator");
  55. var updated = await sut.UpdateAsync(
  56. created.Contact!.ContactId,
  57. "Secondary",
  58. "New",
  59. "Manager",
  60. "555-0101",
  61. "new@example.test",
  62. "updater@example.test");
  63. Assert.True(updated.Saved);
  64. Assert.Equal("Secondary", updated.Contact!.ContactType);
  65. Assert.Equal("New", updated.Contact.Name);
  66. Assert.Equal("updater@example.test", updated.Contact.UpdatedBy);
  67. Assert.Equal(FixedNow, updated.Contact.UpdatedAt);
  68. }
  69. [Fact]
  70. public async Task SoftDeleteAsync_RemovesContactFromCurrentView_AC3()
  71. {
  72. var sut = BuildSut();
  73. var created = await sut.AddAsync("profile-1", "Primary", "Ada", null, null, null, "actor");
  74. var deleted = await sut.SoftDeleteAsync(created.Contact!.ContactId, "deleter@example.test");
  75. var contacts = await sut.GetByProfileIdAsync("profile-1");
  76. Assert.True(deleted.Saved);
  77. Assert.Empty(contacts);
  78. }
  79. [Theory]
  80. [InlineData("", "Primary", "Name is required.")]
  81. [InlineData("Ada", "", "Contact type is required.")]
  82. [InlineData("Ada", "Emergency", "Contact type must be Primary or Secondary.")]
  83. public async Task AddAsync_InvalidRequiredFields_ReturnsFailure_AC4(
  84. string name,
  85. string contactType,
  86. string expectedError)
  87. {
  88. var sut = BuildSut();
  89. var result = await sut.AddAsync("profile-1", contactType, name, null, null, null, "actor");
  90. Assert.False(result.Saved);
  91. Assert.Equal(expectedError, result.Error);
  92. }
  93. private sealed class FakeTimeProvider(DateTimeOffset utcNow) : TimeProvider
  94. {
  95. public override DateTimeOffset GetUtcNow() => utcNow;
  96. }
  97. }

Powered by TurnKey Linux.