UpsCardTests.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. using Microsoft.Playwright;
  2. using Tests.E2e.Infra;
  3. using Tests.E2e.PageObjectModels;
  4. using Xunit.Abstractions;
  5. namespace Tests.E2e;
  6. public class UpsCardTests(
  7. PlaywrightFixture fixture,
  8. ITestOutputHelper output) : E2ETestBase(fixture, output) {
  9. private readonly PlaywrightFixture _fixture = fixture;
  10. private readonly ITestOutputHelper _output = output;
  11. // =============================================================
  12. // Rename + Clone + Delete Flow
  13. // =============================================================
  14. [Fact]
  15. public async Task User_Can_Rename_Clone_And_Delete_Ups_From_Details_Page() {
  16. (IBrowserContext context, IPage page) = await CreatePageAsync();
  17. var originalName = $"e2e-ups-{Guid.NewGuid():N}"[..16];
  18. var renamedName = $"e2e-ups-rn-{Guid.NewGuid():N}"[..16];
  19. var cloneName = $"e2e-ups-cl-{Guid.NewGuid():N}"[..16];
  20. try {
  21. await page.GotoAsync($"{_fixture.BaseUrl}/ups/list");
  22. var list = new UpsListPom(page);
  23. await list.AddUpsAsync(originalName);
  24. if (!page.Url.Contains($"/resources/hardware/{originalName}",
  25. StringComparison.OrdinalIgnoreCase))
  26. await list.OpenUpsAsync(originalName);
  27. var card = new UpsCardPom(page);
  28. await card.AssertVisibleAsync(originalName);
  29. // -------------------------
  30. // Rename
  31. // -------------------------
  32. await card.RenameAsync(originalName, renamedName);
  33. await card.AssertVisibleAsync(renamedName);
  34. // -------------------------
  35. // Clone
  36. // -------------------------
  37. await card.CloneAsync(renamedName, cloneName);
  38. await card.AssertVisibleAsync(cloneName);
  39. // -------------------------
  40. // Delete clone
  41. // -------------------------
  42. await card.DeleteAsync(cloneName);
  43. await page.WaitForURLAsync("**/hardware/tree");
  44. // Navigate back and delete renamed
  45. await page.GotoAsync($"{_fixture.BaseUrl}/resources/hardware/{renamedName}");
  46. await card.AssertVisibleAsync(renamedName);
  47. await card.DeleteAsync(renamedName);
  48. await page.WaitForURLAsync("**/hardware/tree");
  49. }
  50. catch (Exception) {
  51. _output.WriteLine("TEST FAILED — Capturing diagnostics");
  52. _output.WriteLine($"Current URL: {page.Url}");
  53. var html = await page.ContentAsync();
  54. _output.WriteLine("==== DOM SNAPSHOT START ====");
  55. _output.WriteLine(html);
  56. _output.WriteLine("==== DOM SNAPSHOT END ====");
  57. throw;
  58. }
  59. finally {
  60. await context.CloseAsync();
  61. }
  62. }
  63. // =============================================================
  64. // Edit + Save Flow
  65. // =============================================================
  66. [Fact]
  67. public async Task User_Can_Edit_And_Save_Ups() {
  68. (IBrowserContext context, IPage page) = await CreatePageAsync();
  69. var name = $"e2e-ups-edit-{Guid.NewGuid():N}"[..16];
  70. try {
  71. await page.GotoAsync($"{_fixture.BaseUrl}/ups/list");
  72. var list = new UpsListPom(page);
  73. await list.AddUpsAsync(name);
  74. if (!page.Url.Contains($"/resources/hardware/{name}",
  75. StringComparison.OrdinalIgnoreCase))
  76. await list.OpenUpsAsync(name);
  77. var card = new UpsCardPom(page);
  78. await card.AssertVisibleAsync(name);
  79. await card.BeginEditAsync(name);
  80. await card.ModelInput(name).FillAsync("APC Smart-UPS");
  81. await card.CapacityInput(name).FillAsync("1500");
  82. await card.SaveAsync(name);
  83. await Assertions.Expect(
  84. card.ModelValue(name)
  85. ).ToContainTextAsync("APC Smart-UPS");
  86. await Assertions.Expect(
  87. card.CapacityValue(name)
  88. ).ToContainTextAsync("1500");
  89. }
  90. finally {
  91. await context.CloseAsync();
  92. }
  93. }
  94. // =============================================================
  95. // Cancel Edit Flow
  96. // =============================================================
  97. [Fact]
  98. public async Task User_Can_Cancel_Ups_Edit_Without_Saving() {
  99. (IBrowserContext context, IPage page) = await CreatePageAsync();
  100. var name = $"e2e-ups-cancel-{Guid.NewGuid():N}"[..16];
  101. try {
  102. await page.GotoAsync($"{_fixture.BaseUrl}/ups/list");
  103. var list = new UpsListPom(page);
  104. await list.AddUpsAsync(name);
  105. if (!page.Url.Contains($"/resources/hardware/{name}",
  106. StringComparison.OrdinalIgnoreCase))
  107. await list.OpenUpsAsync(name);
  108. var card = new UpsCardPom(page);
  109. await card.AssertVisibleAsync(name);
  110. await card.BeginEditAsync(name);
  111. await card.ModelInput(name).FillAsync("ShouldNotPersist");
  112. await card.CapacityInput(name).FillAsync("9999");
  113. await card.CancelAsync(name);
  114. // Verify edit mode exited
  115. await Assertions.Expect(
  116. card.EditButton(name)
  117. ).ToBeVisibleAsync();
  118. }
  119. finally {
  120. await context.CloseAsync();
  121. }
  122. }
  123. [Fact]
  124. public async Task User_Can_Add_And_Remove_Tags_From_Ups_Card() {
  125. (IBrowserContext context, IPage page) = await CreatePageAsync();
  126. var name = $"e2e-ap-{Guid.NewGuid():N}"[..16];
  127. try {
  128. await page.GotoAsync(_fixture.BaseUrl);
  129. var layout = new MainLayoutPom(page);
  130. await layout.AssertLoadedAsync();
  131. await layout.GotoHardwareAsync();
  132. var hardwareTree = new HardwareTreePom(page);
  133. await hardwareTree.AssertLoadedAsync();
  134. await hardwareTree.GotoUpsListAsync();
  135. var list = new UpsListPom(page);
  136. await list.AssertLoadedAsync();
  137. await list.AddUpsAsync(name);
  138. await page.WaitForURLAsync($"**/resources/hardware/{name}");
  139. var card = new UpsCardPom(page);
  140. await card.AssertVisibleAsync(name);
  141. TagsPom tags = card.Tags;
  142. // -------------------------------------------------
  143. // Add multiple tags in one modal interaction
  144. // -------------------------------------------------
  145. await tags.AddTagsAsync("ups", "Foo", "Bar", "Baz");
  146. await tags.AssertTagVisibleAsync("ups", "Foo");
  147. await tags.AssertTagVisibleAsync("ups", "Bar");
  148. await tags.AssertTagVisibleAsync("ups", "Baz");
  149. // -------------------------------------------------
  150. // Remove a single tag
  151. // -------------------------------------------------
  152. await tags.RemoveTagAsync("ups", "Bar");
  153. await tags.AssertTagNotVisibleAsync("ups", "Bar");
  154. await tags.AssertTagVisibleAsync("ups", "Foo");
  155. await tags.AssertTagVisibleAsync("ups", "Baz");
  156. // -------------------------------------------------
  157. // Reload to verify persistence
  158. // -------------------------------------------------
  159. await page.ReloadAsync();
  160. await tags.AssertTagVisibleAsync("ups", "Foo");
  161. await tags.AssertTagVisibleAsync("ups", "Baz");
  162. await tags.AssertTagNotVisibleAsync("ups", "Bar");
  163. await context.CloseAsync();
  164. }
  165. finally {
  166. await context.CloseAsync();
  167. }
  168. }
  169. }