AccessPointCardTests.cs 10 KB

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