AccessPointCardTests.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  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. [Fact]
  222. public async Task User_Can_Add_Ports_To_Two_AccessPoints_And_Connect_Them() {
  223. (IBrowserContext context, IPage page) = await CreatePageAsync();
  224. var ap1 = $"e2e-ap-{Guid.NewGuid():N}"[..16];
  225. var ap2 = $"e2e-ap-{Guid.NewGuid():N}"[..16];
  226. try {
  227. await page.GotoAsync(_fixture.BaseUrl);
  228. var layout = new MainLayoutPom(page);
  229. await layout.AssertLoadedAsync();
  230. await layout.GotoHardwareAsync();
  231. var hardwareTree = new HardwareTreePom(page);
  232. await hardwareTree.AssertLoadedAsync();
  233. await hardwareTree.GotoAccessPointsListAsync();
  234. var list = new AccessPointsListPom(page);
  235. await list.AssertLoadedAsync();
  236. // -------------------------------------------------
  237. // Create first AP
  238. // -------------------------------------------------
  239. await list.AddAccessPointAsync(ap1);
  240. await page.WaitForURLAsync($"**/resources/hardware/{ap1}");
  241. var card = new AccessPointCardPom(page);
  242. await card.AssertCardVisibleAsync(ap1);
  243. // Add port group to AP1
  244. await card.AddPortGroupAsync(
  245. "rj45",
  246. "1",
  247. 2);
  248. // -------------------------------------------------
  249. // Create second AP
  250. // -------------------------------------------------
  251. await layout.GotoHardwareAsync();
  252. await hardwareTree.AssertLoadedAsync();
  253. await hardwareTree.GotoAccessPointsListAsync();
  254. await list.AssertLoadedAsync();
  255. await list.AddAccessPointAsync(ap2);
  256. await page.WaitForURLAsync($"**/resources/hardware/{ap2}");
  257. await card.AssertCardVisibleAsync(ap2);
  258. // Add port group to AP2
  259. await card.AddPortGroupAsync(
  260. "sfp+",
  261. "2.5",
  262. 2);
  263. // -------------------------------------------------
  264. // Go back to AP1 to create connection
  265. // -------------------------------------------------
  266. await layout.GotoHardwareAsync();
  267. await hardwareTree.GotoAccessPointsListAsync();
  268. await list.AssertLoadedAsync();
  269. await list.OpenAccessPointAsync(ap1);
  270. await card.AssertCardVisibleAsync(ap1);
  271. // -------------------------------------------------
  272. // Open connection modal from port
  273. // -------------------------------------------------
  274. await card.OpenConnectionFromPortAsync(0, 0);
  275. // -------------------------------------------------
  276. // Create connection
  277. // -------------------------------------------------
  278. await card.CreateConnectionAsync(
  279. ap1,
  280. "rj45 — 1 Gbps (2)", // example label — adjust if needed
  281. "Port 1",
  282. ap2,
  283. "sfp+ — 2.5 Gbps (2)",
  284. "Port 1");
  285. // -------------------------------------------------
  286. // Verify connection indicator appears
  287. // -------------------------------------------------
  288. await card.Ports.AssertPortVisibleAsync("accesspoint-ports", 0, 0);
  289. await context.CloseAsync();
  290. }
  291. finally {
  292. await context.CloseAsync();
  293. }
  294. }
  295. }