4
0

ServerCardTests.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. using Tests.E2e.Infra;
  2. using Tests.E2e.PageObjectModels;
  3. using Xunit.Abstractions;
  4. namespace Tests.E2e;
  5. public class ServerCardTests(
  6. PlaywrightFixture fixture,
  7. ITestOutputHelper output) : E2ETestBase(fixture, output)
  8. {
  9. private readonly ITestOutputHelper _output = output;
  10. [Fact]
  11. public async Task User_Can_Rename_Clone_And_Delete_Server_From_Details_Page()
  12. {
  13. var (context, page) = await CreatePageAsync();
  14. var originalName = $"e2e-srv-{Guid.NewGuid():N}"[..16];
  15. var renamedName = $"e2e-srv-rn-{Guid.NewGuid():N}"[..16];
  16. var cloneName = $"e2e-srv-cl-{Guid.NewGuid():N}"[..16];
  17. try
  18. {
  19. // ------------------------------------
  20. // Navigate to Servers list
  21. // ------------------------------------
  22. await page.GotoAsync(fixture.BaseUrl);
  23. var layout = new MainLayoutPom(page);
  24. await layout.AssertLoadedAsync();
  25. await layout.GotoHardwareAsync();
  26. var hardwareTree = new HardwareTreePom(page);
  27. await hardwareTree.AssertLoadedAsync();
  28. await hardwareTree.GotoServersListAsync();
  29. var listPage = new ServersListPom(page);
  30. await listPage.AssertLoadedAsync();
  31. // ------------------------------------
  32. // Create server
  33. // ------------------------------------
  34. await listPage.AddServerAsync(originalName);
  35. // If list does not auto-navigate, open it
  36. if (!page.Url.Contains($"/resources/hardware/{originalName}", StringComparison.OrdinalIgnoreCase))
  37. {
  38. await listPage.OpenServerAsync(originalName);
  39. }
  40. var card = new ServerCardPom(page);
  41. await card.AssertVisibleAsync(originalName);
  42. // ====================================
  43. // RENAME
  44. // ====================================
  45. await card.RenameAsync(originalName, renamedName);
  46. await card.AssertVisibleAsync(renamedName);
  47. // ====================================
  48. // CLONE
  49. // ====================================
  50. await card.CloneAsync(renamedName, cloneName);
  51. await card.AssertVisibleAsync(cloneName);
  52. // ====================================
  53. // DELETE CLONE
  54. // ====================================
  55. await card.DeleteAsync(cloneName);
  56. // Details page delete navigates to tree
  57. await page.WaitForURLAsync("**/hardware/tree");
  58. // ====================================
  59. // DELETE RENAMED ORIGINAL
  60. // ====================================
  61. await page.GotoAsync($"{fixture.BaseUrl}/resources/hardware/{renamedName}");
  62. await card.AssertVisibleAsync(renamedName);
  63. await card.DeleteAsync(renamedName);
  64. await page.WaitForURLAsync("**/hardware/tree");
  65. }
  66. catch (Exception)
  67. {
  68. _output.WriteLine("TEST FAILED — Capturing diagnostics");
  69. _output.WriteLine($"Current URL: {page.Url}");
  70. var html = await page.ContentAsync();
  71. _output.WriteLine("==== DOM SNAPSHOT START ====");
  72. _output.WriteLine(html);
  73. _output.WriteLine("==== DOM SNAPSHOT END ====");
  74. throw;
  75. }
  76. finally
  77. {
  78. await context.CloseAsync();
  79. }
  80. }
  81. [Fact]
  82. public async Task User_Can_Add_And_Remove_Tags_From_Server_Card()
  83. {
  84. var (context, page) = await CreatePageAsync();
  85. var name = $"e2e-ap-{Guid.NewGuid():N}"[..16];
  86. try
  87. {
  88. await page.GotoAsync(fixture.BaseUrl);
  89. var layout = new MainLayoutPom(page);
  90. await layout.AssertLoadedAsync();
  91. await layout.GotoHardwareAsync();
  92. var hardwareTree = new HardwareTreePom(page);
  93. await hardwareTree.AssertLoadedAsync();
  94. await hardwareTree.GotoServersListAsync();
  95. var list = new ServersListPom(page);
  96. await list.AssertLoadedAsync();
  97. await list.AddServerAsync(name);
  98. await page.WaitForURLAsync($"**/resources/hardware/{name}");
  99. var card = new ServerCardPom(page);
  100. await card.AssertVisibleAsync(name);
  101. var tags = card.Tags;
  102. // -------------------------------------------------
  103. // Add multiple tags in one modal interaction
  104. // -------------------------------------------------
  105. await tags.AddTagsAsync("server", "Foo", "Bar", "Baz");
  106. await tags.AssertTagVisibleAsync("server", "Foo");
  107. await tags.AssertTagVisibleAsync("server", "Bar");
  108. await tags.AssertTagVisibleAsync("server", "Baz");
  109. // -------------------------------------------------
  110. // Remove a single tag
  111. // -------------------------------------------------
  112. await tags.RemoveTagAsync("server", "Bar");
  113. await tags.AssertTagNotVisibleAsync("server", "Bar");
  114. await tags.AssertTagVisibleAsync("server", "Foo");
  115. await tags.AssertTagVisibleAsync("server", "Baz");
  116. // -------------------------------------------------
  117. // Reload to verify persistence
  118. // -------------------------------------------------
  119. await page.ReloadAsync();
  120. await tags.AssertTagVisibleAsync("server", "Foo");
  121. await tags.AssertTagVisibleAsync("server", "Baz");
  122. await tags.AssertTagNotVisibleAsync("server", "Bar");
  123. await context.CloseAsync();
  124. }
  125. finally
  126. {
  127. await context.CloseAsync();
  128. }
  129. }
  130. [Fact]
  131. public async Task User_Can_Add_And_Remove_Labels_From_Server_Card()
  132. {
  133. var (context, page) = await CreatePageAsync();
  134. var name = $"e2e-srv-lbl-{Guid.NewGuid():N}"[..16];
  135. try
  136. {
  137. await page.GotoAsync(fixture.BaseUrl);
  138. var layout = new MainLayoutPom(page);
  139. await layout.AssertLoadedAsync();
  140. await layout.GotoHardwareAsync();
  141. var hardwareTree = new HardwareTreePom(page);
  142. await hardwareTree.AssertLoadedAsync();
  143. await hardwareTree.GotoServersListAsync();
  144. var list = new ServersListPom(page);
  145. await list.AssertLoadedAsync();
  146. await list.AddServerAsync(name);
  147. await page.WaitForURLAsync($"**/resources/hardware/{name}");
  148. var card = new ServerCardPom(page);
  149. await card.AssertVisibleAsync(name);
  150. var labels = card.Labels;
  151. await labels.AddLabelAsync("server", "env", "production");
  152. await labels.AssertLabelVisibleAsync("server", "env");
  153. await labels.AddLabelAsync("server", "owner", "team-a");
  154. await labels.AssertLabelVisibleAsync("server", "owner");
  155. await labels.RemoveLabelAsync("server", "owner");
  156. await labels.AssertLabelNotVisibleAsync("server", "owner");
  157. await labels.AssertLabelVisibleAsync("server", "env");
  158. await page.ReloadAsync();
  159. await labels.AssertLabelVisibleAsync("server", "env");
  160. await labels.AssertLabelNotVisibleAsync("server", "owner");
  161. await context.CloseAsync();
  162. }
  163. finally
  164. {
  165. await context.CloseAsync();
  166. }
  167. }
  168. [Fact]
  169. public async Task User_Can_Edit_Label_From_Server_Card()
  170. {
  171. var (context, page) = await CreatePageAsync();
  172. var name = $"e2e-srv-edit-{Guid.NewGuid():N}"[..16];
  173. try
  174. {
  175. await page.GotoAsync(fixture.BaseUrl);
  176. var layout = new MainLayoutPom(page);
  177. await layout.AssertLoadedAsync();
  178. await layout.GotoHardwareAsync();
  179. var hardwareTree = new HardwareTreePom(page);
  180. await hardwareTree.AssertLoadedAsync();
  181. await hardwareTree.GotoServersListAsync();
  182. var list = new ServersListPom(page);
  183. await list.AssertLoadedAsync();
  184. await list.AddServerAsync(name);
  185. await page.WaitForURLAsync($"**/resources/hardware/{name}");
  186. var card = new ServerCardPom(page);
  187. await card.AssertVisibleAsync(name);
  188. var labels = card.Labels;
  189. await labels.AddLabelAsync("server", "env", "production");
  190. await labels.AssertLabelDisplaysAsync("server", "env", "production");
  191. await labels.EditLabelAsync("server", "env", "env", "staging");
  192. await labels.AssertLabelDisplaysAsync("server", "env", "staging");
  193. await page.ReloadAsync();
  194. await labels.AssertLabelDisplaysAsync("server", "env", "staging");
  195. await labels.EditLabelAsync("server", "env", "environment", "staging");
  196. await labels.AssertLabelNotVisibleAsync("server", "env");
  197. await labels.AssertLabelDisplaysAsync("server", "environment", "staging");
  198. await page.ReloadAsync();
  199. await labels.AssertLabelDisplaysAsync("server", "environment", "staging");
  200. await context.CloseAsync();
  201. }
  202. finally
  203. {
  204. await context.CloseAsync();
  205. }
  206. }
  207. }