ServerCardTests.cs 9.3 KB

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