UpsCardTests.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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. {
  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. {
  17. var (context, page) = await CreatePageAsync();
  18. var originalName = $"e2e-ups-{Guid.NewGuid():N}"[..16];
  19. var renamedName = $"e2e-ups-rn-{Guid.NewGuid():N}"[..16];
  20. var cloneName = $"e2e-ups-cl-{Guid.NewGuid():N}"[..16];
  21. try
  22. {
  23. await page.GotoAsync($"{fixture.BaseUrl}/ups/list");
  24. var list = new UpsListPom(page);
  25. await list.AddUpsAsync(originalName);
  26. if (!page.Url.Contains($"/resources/hardware/{originalName}",
  27. StringComparison.OrdinalIgnoreCase))
  28. {
  29. await list.OpenUpsAsync(originalName);
  30. }
  31. var card = new UpsCardPom(page);
  32. await card.AssertVisibleAsync(originalName);
  33. // -------------------------
  34. // Rename
  35. // -------------------------
  36. await card.RenameAsync(originalName, renamedName);
  37. await card.AssertVisibleAsync(renamedName);
  38. // -------------------------
  39. // Clone
  40. // -------------------------
  41. await card.CloneAsync(renamedName, cloneName);
  42. await card.AssertVisibleAsync(cloneName);
  43. // -------------------------
  44. // Delete clone
  45. // -------------------------
  46. await card.DeleteAsync(cloneName);
  47. await page.WaitForURLAsync("**/hardware/tree");
  48. // Navigate back and delete renamed
  49. await page.GotoAsync($"{fixture.BaseUrl}/resources/hardware/{renamedName}");
  50. await card.AssertVisibleAsync(renamedName);
  51. await card.DeleteAsync(renamedName);
  52. await page.WaitForURLAsync("**/hardware/tree");
  53. }
  54. catch (Exception)
  55. {
  56. _output.WriteLine("TEST FAILED — Capturing diagnostics");
  57. _output.WriteLine($"Current URL: {page.Url}");
  58. var html = await page.ContentAsync();
  59. _output.WriteLine("==== DOM SNAPSHOT START ====");
  60. _output.WriteLine(html);
  61. _output.WriteLine("==== DOM SNAPSHOT END ====");
  62. throw;
  63. }
  64. finally
  65. {
  66. await context.CloseAsync();
  67. }
  68. }
  69. // =============================================================
  70. // Edit + Save Flow
  71. // =============================================================
  72. [Fact]
  73. public async Task User_Can_Edit_And_Save_Ups()
  74. {
  75. var (context, page) = await CreatePageAsync();
  76. var name = $"e2e-ups-edit-{Guid.NewGuid():N}"[..16];
  77. try
  78. {
  79. await page.GotoAsync($"{fixture.BaseUrl}/ups/list");
  80. var list = new UpsListPom(page);
  81. await list.AddUpsAsync(name);
  82. if (!page.Url.Contains($"/resources/hardware/{name}",
  83. StringComparison.OrdinalIgnoreCase))
  84. {
  85. await list.OpenUpsAsync(name);
  86. }
  87. var card = new UpsCardPom(page);
  88. await card.AssertVisibleAsync(name);
  89. await card.BeginEditAsync(name);
  90. await card.ModelInput(name).FillAsync("APC Smart-UPS");
  91. await card.CapacityInput(name).FillAsync("1500");
  92. await card.SaveAsync(name);
  93. await Assertions.Expect(
  94. card.ModelValue(name)
  95. ).ToContainTextAsync("APC Smart-UPS");
  96. await Assertions.Expect(
  97. card.CapacityValue(name)
  98. ).ToContainTextAsync("1500");
  99. }
  100. finally
  101. {
  102. await context.CloseAsync();
  103. }
  104. }
  105. // =============================================================
  106. // Cancel Edit Flow
  107. // =============================================================
  108. [Fact]
  109. public async Task User_Can_Cancel_Ups_Edit_Without_Saving()
  110. {
  111. var (context, page) = await CreatePageAsync();
  112. var name = $"e2e-ups-cancel-{Guid.NewGuid():N}"[..16];
  113. try
  114. {
  115. await page.GotoAsync($"{fixture.BaseUrl}/ups/list");
  116. var list = new UpsListPom(page);
  117. await list.AddUpsAsync(name);
  118. if (!page.Url.Contains($"/resources/hardware/{name}",
  119. StringComparison.OrdinalIgnoreCase))
  120. {
  121. await list.OpenUpsAsync(name);
  122. }
  123. var card = new UpsCardPom(page);
  124. await card.AssertVisibleAsync(name);
  125. await card.BeginEditAsync(name);
  126. await card.ModelInput(name).FillAsync("ShouldNotPersist");
  127. await card.CapacityInput(name).FillAsync("9999");
  128. await card.CancelAsync(name);
  129. // Verify edit mode exited
  130. await Assertions.Expect(
  131. card.EditButton(name)
  132. ).ToBeVisibleAsync();
  133. }
  134. finally
  135. {
  136. await context.CloseAsync();
  137. }
  138. }
  139. }