AccessPointCardTests.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. using System.Globalization;
  2. using Microsoft.Playwright;
  3. using Tests.E2e.Infra;
  4. using Tests.E2e.PageObjectModels;
  5. using Xunit.Abstractions;
  6. namespace Tests.E2e;
  7. public class AccessPointCardTests(
  8. PlaywrightFixture fixture,
  9. ITestOutputHelper output) : E2ETestBase(fixture, output)
  10. {
  11. private readonly ITestOutputHelper _output = output;
  12. [Fact]
  13. public async Task User_Can_Edit_Model_And_Speed_And_Save()
  14. {
  15. var (context, page) = await CreatePageAsync();
  16. var name = $"e2e-ap-{Guid.NewGuid():N}"[..16];
  17. try
  18. {
  19. await page.GotoAsync(fixture.BaseUrl);
  20. var layout = new MainLayoutPom(page);
  21. await layout.AssertLoadedAsync();
  22. await layout.GotoHardwareAsync();
  23. var hardwareTree = new HardwareTreePom(page);
  24. await hardwareTree.AssertLoadedAsync();
  25. await hardwareTree.GotoAccessPointsListAsync();
  26. var list = new AccessPointsListPom(page);
  27. await list.AssertLoadedAsync();
  28. await list.AddAccessPointAsync(name);
  29. await page.WaitForURLAsync($"**/resources/hardware/{name}");
  30. var card = new AccessPointCardPom(page);
  31. await card.AssertCardVisibleAsync(name);
  32. var newModel = "AP-Model-9000";
  33. var newSpeed = 2.5;
  34. await card.BeginEditAsync(name);
  35. await card.SetModelAsync(name, newModel);
  36. await card.SetSpeedAsync(name, newSpeed);
  37. await card.SaveAsync(name);
  38. await page.ReloadAsync();
  39. await Assertions.Expect(card.ModelValue(name)).ToHaveTextAsync(newModel);
  40. await Assertions.Expect(card.SpeedValue(name))
  41. .ToHaveTextAsync($"{newSpeed.ToString(CultureInfo.InvariantCulture)} Gbps");
  42. await context.CloseAsync();
  43. }
  44. finally
  45. {
  46. await context.CloseAsync();
  47. }
  48. }
  49. [Fact]
  50. public async Task User_Can_Cancel_Edit_And_Changes_Are_Not_Applied()
  51. {
  52. var (context, page) = await CreatePageAsync();
  53. var name = $"e2e-ap-{Guid.NewGuid():N}"[..16];
  54. try
  55. {
  56. await page.GotoAsync(fixture.BaseUrl);
  57. var layout = new MainLayoutPom(page);
  58. await layout.AssertLoadedAsync();
  59. await layout.GotoHardwareAsync();
  60. var hardwareTree = new HardwareTreePom(page);
  61. await hardwareTree.AssertLoadedAsync();
  62. await hardwareTree.GotoAccessPointsListAsync();
  63. var list = new AccessPointsListPom(page);
  64. await list.AssertLoadedAsync();
  65. await list.AddAccessPointAsync(name);
  66. await page.WaitForURLAsync($"**/resources/hardware/{name}");
  67. var card = new AccessPointCardPom(page);
  68. await card.AssertCardVisibleAsync(name);
  69. // Capture current values (may be empty depending on seed data)
  70. var beforeModel = await card.ModelSection(name).TextContentAsync();
  71. var beforeSpeed = await card.SpeedSection(name).TextContentAsync();
  72. await card.BeginEditAsync(name);
  73. await card.SetModelAsync(name, "SHOULD-NOT-SAVE");
  74. await card.SetSpeedAsync(name, 9.9);
  75. await card.CancelEditAsync(name);
  76. var afterModel = await card.ModelSection(name).TextContentAsync();
  77. var afterSpeed = await card.SpeedSection(name).TextContentAsync();
  78. Assert.Equal(beforeModel, afterModel);
  79. Assert.Equal(beforeSpeed, afterSpeed);
  80. await context.CloseAsync();
  81. }
  82. finally
  83. {
  84. await context.CloseAsync();
  85. }
  86. }
  87. [Fact]
  88. public async Task User_Can_Rename_AccessPoint_From_Card()
  89. {
  90. var (context, page) = await CreatePageAsync();
  91. var name = $"e2e-ap-{Guid.NewGuid():N}"[..16];
  92. var newName = $"e2e-ap-{Guid.NewGuid():N}"[..16];
  93. try
  94. {
  95. await page.GotoAsync(fixture.BaseUrl);
  96. var layout = new MainLayoutPom(page);
  97. await layout.AssertLoadedAsync();
  98. await layout.GotoHardwareAsync();
  99. var hardwareTree = new HardwareTreePom(page);
  100. await hardwareTree.AssertLoadedAsync();
  101. await hardwareTree.GotoAccessPointsListAsync();
  102. var list = new AccessPointsListPom(page);
  103. await list.AssertLoadedAsync();
  104. await list.AddAccessPointAsync(name);
  105. await page.WaitForURLAsync($"**/resources/hardware/{name}");
  106. var card = new AccessPointCardPom(page);
  107. await card.AssertCardVisibleAsync(name);
  108. await card.RenameAsync(name, newName);
  109. // After rename, the card test id uses the new name
  110. await card.AssertCardVisibleAsync(newName);
  111. await context.CloseAsync();
  112. }
  113. finally
  114. {
  115. await context.CloseAsync();
  116. }
  117. }
  118. [Fact]
  119. public async Task User_Can_Clone_AccessPoint_From_Card()
  120. {
  121. var (context, page) = await CreatePageAsync();
  122. var name = $"e2e-ap-{Guid.NewGuid():N}"[..16];
  123. var cloneName = $"e2e-ap-{Guid.NewGuid():N}"[..16];
  124. try
  125. {
  126. await page.GotoAsync(fixture.BaseUrl);
  127. var layout = new MainLayoutPom(page);
  128. await layout.AssertLoadedAsync();
  129. await layout.GotoHardwareAsync();
  130. var hardwareTree = new HardwareTreePom(page);
  131. await hardwareTree.AssertLoadedAsync();
  132. await hardwareTree.GotoAccessPointsListAsync();
  133. var list = new AccessPointsListPom(page);
  134. await list.AssertLoadedAsync();
  135. await list.AddAccessPointAsync(name);
  136. await page.WaitForURLAsync($"**/resources/hardware/{name}");
  137. var card = new AccessPointCardPom(page);
  138. await card.AssertCardVisibleAsync(name);
  139. await card.CloneAsync(name, cloneName);
  140. // Clone navigates to the clone details page
  141. await card.AssertCardVisibleAsync(cloneName);
  142. // Cleanup: delete clone then original (both from details pages)
  143. await card.DeleteAsync(cloneName);
  144. await page.WaitForURLAsync("**/hardware/tree");
  145. await hardwareTree.GotoAccessPointsListAsync();
  146. await list.AssertLoadedAsync();
  147. await list.OpenAccessPointAsync(name);
  148. await card.AssertCardVisibleAsync(name);
  149. await card.DeleteAsync(name);
  150. await context.CloseAsync();
  151. }
  152. finally
  153. {
  154. await context.CloseAsync();
  155. }
  156. }
  157. [Fact]
  158. public async Task User_Can_Delete_AccessPoint_From_Card_And_Is_Redirected()
  159. {
  160. var (context, page) = await CreatePageAsync();
  161. var name = $"e2e-ap-{Guid.NewGuid():N}"[..16];
  162. try
  163. {
  164. await page.GotoAsync(fixture.BaseUrl);
  165. var layout = new MainLayoutPom(page);
  166. await layout.AssertLoadedAsync();
  167. await layout.GotoHardwareAsync();
  168. var hardwareTree = new HardwareTreePom(page);
  169. await hardwareTree.AssertLoadedAsync();
  170. await hardwareTree.GotoAccessPointsListAsync();
  171. var list = new AccessPointsListPom(page);
  172. await list.AssertLoadedAsync();
  173. await list.AddAccessPointAsync(name);
  174. await page.WaitForURLAsync($"**/resources/hardware/{name}");
  175. var card = new AccessPointCardPom(page);
  176. await card.AssertCardVisibleAsync(name);
  177. await card.DeleteAsync(name);
  178. await page.WaitForURLAsync("**/hardware/tree");
  179. // Verify it’s gone from the list
  180. await hardwareTree.GotoAccessPointsListAsync();
  181. await list.AssertLoadedAsync();
  182. await list.AssertAccessPointDoesNotExist(name);
  183. await context.CloseAsync();
  184. }
  185. finally
  186. {
  187. await context.CloseAsync();
  188. }
  189. }
  190. [Fact]
  191. public async Task User_Can_Add_And_Remove_Tags_From_AccessPoint_Card()
  192. {
  193. var (context, page) = await CreatePageAsync();
  194. var name = $"e2e-ap-{Guid.NewGuid():N}"[..16];
  195. try
  196. {
  197. await page.GotoAsync(fixture.BaseUrl);
  198. var layout = new MainLayoutPom(page);
  199. await layout.AssertLoadedAsync();
  200. await layout.GotoHardwareAsync();
  201. var hardwareTree = new HardwareTreePom(page);
  202. await hardwareTree.AssertLoadedAsync();
  203. await hardwareTree.GotoAccessPointsListAsync();
  204. var list = new AccessPointsListPom(page);
  205. await list.AssertLoadedAsync();
  206. await list.AddAccessPointAsync(name);
  207. await page.WaitForURLAsync($"**/resources/hardware/{name}");
  208. var card = new AccessPointCardPom(page);
  209. await card.AssertCardVisibleAsync(name);
  210. var tags = card.Tags;
  211. // -------------------------------------------------
  212. // Add multiple tags in one modal interaction
  213. // -------------------------------------------------
  214. await tags.AddTagsAsync("accesspoint", "Foo", "Bar", "Baz");
  215. await tags.AssertTagVisibleAsync("accesspoint", "Foo");
  216. await tags.AssertTagVisibleAsync("accesspoint", "Bar");
  217. await tags.AssertTagVisibleAsync("accesspoint", "Baz");
  218. // -------------------------------------------------
  219. // Remove a single tag
  220. // -------------------------------------------------
  221. await tags.RemoveTagAsync("accesspoint", "Bar");
  222. await tags.AssertTagNotVisibleAsync("accesspoint", "Bar");
  223. await tags.AssertTagVisibleAsync("accesspoint", "Foo");
  224. await tags.AssertTagVisibleAsync("accesspoint", "Baz");
  225. // -------------------------------------------------
  226. // Reload to verify persistence
  227. // -------------------------------------------------
  228. await page.ReloadAsync();
  229. await tags.AssertTagVisibleAsync("accesspoint", "Foo");
  230. await tags.AssertTagVisibleAsync("accesspoint", "Baz");
  231. await tags.AssertTagNotVisibleAsync("accesspoint", "Bar");
  232. await context.CloseAsync();
  233. }
  234. finally
  235. {
  236. await context.CloseAsync();
  237. }
  238. }
  239. }