ServerCardTests.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. }