SystemCardTests.cs 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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 SystemCardTests(
  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_System() {
  16. (IBrowserContext context, IPage page) = await CreatePageAsync();
  17. var originalName = $"e2e-sys-{Guid.NewGuid():N}"[..16];
  18. var renamedName = $"e2e-sys-rn-{Guid.NewGuid():N}"[..16];
  19. var cloneName = $"e2e-sys-cl-{Guid.NewGuid():N}"[..16];
  20. try {
  21. await page.GotoAsync($"{_fixture.BaseUrl}/systems/list");
  22. var list = new SystemsListPom(page);
  23. await list.AssertLoadedAsync();
  24. await list.AddSystemAsync(originalName);
  25. if (!page.Url.Contains($"/resources/systems/{originalName}",
  26. StringComparison.OrdinalIgnoreCase))
  27. await list.OpenSystemAsync(originalName);
  28. var card = new SystemCardPom(page);
  29. await card.AssertVisibleAsync(originalName);
  30. // -------------------------
  31. // Rename
  32. // -------------------------
  33. await card.RenameAsync(originalName, renamedName);
  34. await card.AssertVisibleAsync(renamedName);
  35. // -------------------------
  36. // Clone
  37. // -------------------------
  38. await card.CloneAsync(renamedName, cloneName);
  39. await card.AssertVisibleAsync(cloneName);
  40. // -------------------------
  41. // Delete clone
  42. // -------------------------
  43. await card.DeleteAsync(cloneName);
  44. await page.WaitForURLAsync("**/systems/list");
  45. // Delete renamed original
  46. await page.GotoAsync($"{_fixture.BaseUrl}/resources/systems/{renamedName}");
  47. await card.AssertVisibleAsync(renamedName);
  48. await card.DeleteAsync(renamedName);
  49. await page.WaitForURLAsync("**/systems/list");
  50. }
  51. catch (Exception) {
  52. _output.WriteLine("TEST FAILED — Capturing diagnostics");
  53. _output.WriteLine($"Current URL: {page.Url}");
  54. var html = await page.ContentAsync();
  55. _output.WriteLine("==== DOM SNAPSHOT START ====");
  56. _output.WriteLine(html);
  57. _output.WriteLine("==== DOM SNAPSHOT END ====");
  58. throw;
  59. }
  60. finally {
  61. await context.CloseAsync();
  62. }
  63. }
  64. // ============================================================
  65. // Edit Flow
  66. // ============================================================
  67. [Fact]
  68. public async Task User_Can_Edit_And_Save_System() {
  69. (IBrowserContext context, IPage page) = await CreatePageAsync();
  70. var name = $"e2e-sys-edit-{Guid.NewGuid():N}"[..16];
  71. try {
  72. await page.GotoAsync($"{_fixture.BaseUrl}/systems/list");
  73. var list = new SystemsListPom(page);
  74. await list.AddSystemAsync(name);
  75. if (!page.Url.Contains($"/resources/systems/{name}",
  76. StringComparison.OrdinalIgnoreCase))
  77. await list.OpenSystemAsync(name);
  78. var card = new SystemCardPom(page);
  79. await card.AssertVisibleAsync(name);
  80. await card.BeginEditAsync(name);
  81. // Edit fields
  82. await card.TypeSelect(name).SelectOptionAsync(new SelectOptionValue { Index = 0 });
  83. await card.OsInput(name).FillAsync("Ubuntu 22.04");
  84. await card.CoresInput(name).FillAsync("8");
  85. await card.RamInput(name).FillAsync("16");
  86. await card.SaveAsync(name);
  87. // Verify read mode restored
  88. await Assertions.Expect(card.EditButton(name)).ToBeVisibleAsync();
  89. }
  90. finally {
  91. await context.CloseAsync();
  92. }
  93. }
  94. // ============================================================
  95. // Cancel Edit
  96. // ============================================================
  97. [Fact]
  98. public async Task User_Can_Cancel_System_Edit() {
  99. (IBrowserContext context, IPage page) = await CreatePageAsync();
  100. var name = $"e2e-sys-cancel-{Guid.NewGuid():N}"[..16];
  101. try {
  102. await page.GotoAsync($"{_fixture.BaseUrl}/systems/list");
  103. var list = new SystemsListPom(page);
  104. await list.AddSystemAsync(name);
  105. if (!page.Url.Contains($"/resources/systems/{name}",
  106. StringComparison.OrdinalIgnoreCase))
  107. await list.OpenSystemAsync(name);
  108. var card = new SystemCardPom(page);
  109. await card.AssertVisibleAsync(name);
  110. await card.BeginEditAsync(name);
  111. await card.OsInput(name).FillAsync("Should Not Save");
  112. await card.CancelAsync(name);
  113. await Assertions.Expect(card.EditButton(name)).ToBeVisibleAsync();
  114. }
  115. finally {
  116. await context.CloseAsync();
  117. }
  118. }
  119. // ============================================================
  120. // Drive Flow
  121. // ============================================================
  122. [Fact]
  123. public async Task User_Can_Add_And_Edit_System_Drive() {
  124. (IBrowserContext context, IPage page) = await CreatePageAsync();
  125. var name = $"e2e-sys-drive-{Guid.NewGuid():N}"[..16];
  126. try {
  127. await page.GotoAsync($"{_fixture.BaseUrl}/systems/list");
  128. var list = new SystemsListPom(page);
  129. await list.AddSystemAsync(name);
  130. if (!page.Url.Contains($"/resources/systems/{name}",
  131. StringComparison.OrdinalIgnoreCase))
  132. await list.OpenSystemAsync(name);
  133. var card = new SystemCardPom(page);
  134. await card.AssertVisibleAsync(name);
  135. await card.AddDriveAsync(name, "ssd", 512);
  136. }
  137. finally {
  138. await context.CloseAsync();
  139. }
  140. }
  141. [Fact]
  142. public async Task User_Can_Add_And_Remove_Tags_From_System_Card() {
  143. (IBrowserContext context, IPage page) = await CreatePageAsync();
  144. var name = $"e2e-ap-{Guid.NewGuid():N}"[..16];
  145. try {
  146. await page.GotoAsync($"{_fixture.BaseUrl}/systems/list");
  147. var list = new SystemsListPom(page);
  148. await list.AssertLoadedAsync();
  149. await list.AddSystemAsync(name);
  150. await page.WaitForURLAsync($"**/resources/systems/{name}");
  151. var card = new SystemCardPom(page);
  152. await card.AssertVisibleAsync(name);
  153. TagsPom tags = card.Tags;
  154. // -------------------------------------------------
  155. // Add multiple tags in one modal interaction
  156. // -------------------------------------------------
  157. await tags.AddTagsAsync("system", "Foo", "Bar", "Baz");
  158. await tags.AssertTagVisibleAsync("system", "Foo");
  159. await tags.AssertTagVisibleAsync("system", "Bar");
  160. await tags.AssertTagVisibleAsync("system", "Baz");
  161. // -------------------------------------------------
  162. // Remove a single tag
  163. // -------------------------------------------------
  164. await tags.RemoveTagAsync("system", "Bar");
  165. await tags.AssertTagNotVisibleAsync("system", "Bar");
  166. await tags.AssertTagVisibleAsync("system", "Foo");
  167. await tags.AssertTagVisibleAsync("system", "Baz");
  168. // -------------------------------------------------
  169. // Reload to verify persistence
  170. // -------------------------------------------------
  171. await page.ReloadAsync();
  172. await tags.AssertTagVisibleAsync("system", "Foo");
  173. await tags.AssertTagVisibleAsync("system", "Baz");
  174. await tags.AssertTagNotVisibleAsync("system", "Bar");
  175. await context.CloseAsync();
  176. }
  177. finally {
  178. await context.CloseAsync();
  179. }
  180. }
  181. }