| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396 |
- using System.Globalization;
- using Microsoft.Playwright;
- using Tests.E2e.Infra;
- using Tests.E2e.PageObjectModels;
- using Xunit.Abstractions;
- namespace Tests.E2e;
- public class AccessPointCardTests(
- PlaywrightFixture fixture,
- ITestOutputHelper output) : E2ETestBase(fixture, output) {
- private readonly PlaywrightFixture _fixture = fixture;
- private readonly ITestOutputHelper _output = output;
- [Fact]
- public async Task User_Can_Edit_Model_And_Speed_And_Save() {
- (IBrowserContext context, IPage page) = await CreatePageAsync();
- var name = $"e2e-ap-{Guid.NewGuid():N}"[..16];
- try {
- await page.GotoAsync(_fixture.BaseUrl);
- var layout = new MainLayoutPom(page);
- await layout.AssertLoadedAsync();
- await layout.GotoHardwareAsync();
- var hardwareTree = new HardwareTreePom(page);
- await hardwareTree.AssertLoadedAsync();
- await hardwareTree.GotoAccessPointsListAsync();
- var list = new AccessPointsListPom(page);
- await list.AssertLoadedAsync();
- await list.AddAccessPointAsync(name);
- await page.WaitForURLAsync($"**/resources/hardware/{name}");
- var card = new AccessPointCardPom(page);
- await card.AssertCardVisibleAsync(name);
- var newModel = "AP-Model-9000";
- var newSpeed = 2.5;
- await card.BeginEditAsync(name);
- await card.SetModelAsync(name, newModel);
- await card.SetSpeedAsync(name, newSpeed);
- await card.SaveAsync(name);
- await page.ReloadAsync();
- await Assertions.Expect(card.ModelValue(name)).ToHaveTextAsync(newModel);
- await Assertions.Expect(card.SpeedValue(name))
- .ToHaveTextAsync($"{newSpeed.ToString(CultureInfo.InvariantCulture)} Gbps");
- await context.CloseAsync();
- }
- finally {
- await context.CloseAsync();
- }
- }
- [Fact]
- public async Task User_Can_Cancel_Edit_And_Changes_Are_Not_Applied() {
- (IBrowserContext context, IPage page) = await CreatePageAsync();
- var name = $"e2e-ap-{Guid.NewGuid():N}"[..16];
- try {
- await page.GotoAsync(_fixture.BaseUrl);
- var layout = new MainLayoutPom(page);
- await layout.AssertLoadedAsync();
- await layout.GotoHardwareAsync();
- var hardwareTree = new HardwareTreePom(page);
- await hardwareTree.AssertLoadedAsync();
- await hardwareTree.GotoAccessPointsListAsync();
- var list = new AccessPointsListPom(page);
- await list.AssertLoadedAsync();
- await list.AddAccessPointAsync(name);
- await page.WaitForURLAsync($"**/resources/hardware/{name}");
- var card = new AccessPointCardPom(page);
- await card.AssertCardVisibleAsync(name);
- // Capture current values (may be empty depending on seed data)
- var beforeModel = await card.ModelSection(name).TextContentAsync();
- var beforeSpeed = await card.SpeedSection(name).TextContentAsync();
- await card.BeginEditAsync(name);
- await card.SetModelAsync(name, "SHOULD-NOT-SAVE");
- await card.SetSpeedAsync(name, 9.9);
- await card.CancelEditAsync(name);
- var afterModel = await card.ModelSection(name).TextContentAsync();
- var afterSpeed = await card.SpeedSection(name).TextContentAsync();
- Assert.Equal(beforeModel, afterModel);
- Assert.Equal(beforeSpeed, afterSpeed);
- await context.CloseAsync();
- }
- finally {
- await context.CloseAsync();
- }
- }
- [Fact]
- public async Task User_Can_Rename_AccessPoint_From_Card() {
- (IBrowserContext context, IPage page) = await CreatePageAsync();
- var name = $"e2e-ap-{Guid.NewGuid():N}"[..16];
- var newName = $"e2e-ap-{Guid.NewGuid():N}"[..16];
- try {
- await page.GotoAsync(_fixture.BaseUrl);
- var layout = new MainLayoutPom(page);
- await layout.AssertLoadedAsync();
- await layout.GotoHardwareAsync();
- var hardwareTree = new HardwareTreePom(page);
- await hardwareTree.AssertLoadedAsync();
- await hardwareTree.GotoAccessPointsListAsync();
- var list = new AccessPointsListPom(page);
- await list.AssertLoadedAsync();
- await list.AddAccessPointAsync(name);
- await page.WaitForURLAsync($"**/resources/hardware/{name}");
- var card = new AccessPointCardPom(page);
- await card.AssertCardVisibleAsync(name);
- await card.RenameAsync(name, newName);
- // After rename, the card test id uses the new name
- await card.AssertCardVisibleAsync(newName);
- await context.CloseAsync();
- }
- finally {
- await context.CloseAsync();
- }
- }
- [Fact]
- public async Task User_Can_Clone_AccessPoint_From_Card() {
- (IBrowserContext context, IPage page) = await CreatePageAsync();
- var name = $"e2e-ap-{Guid.NewGuid():N}"[..16];
- var cloneName = $"e2e-ap-{Guid.NewGuid():N}"[..16];
- try {
- await page.GotoAsync(_fixture.BaseUrl);
- var layout = new MainLayoutPom(page);
- await layout.AssertLoadedAsync();
- await layout.GotoHardwareAsync();
- var hardwareTree = new HardwareTreePom(page);
- await hardwareTree.AssertLoadedAsync();
- await hardwareTree.GotoAccessPointsListAsync();
- var list = new AccessPointsListPom(page);
- await list.AssertLoadedAsync();
- await list.AddAccessPointAsync(name);
- await page.WaitForURLAsync($"**/resources/hardware/{name}");
- var card = new AccessPointCardPom(page);
- await card.AssertCardVisibleAsync(name);
- await card.CloneAsync(name, cloneName);
- // Clone navigates to the clone details page
- await card.AssertCardVisibleAsync(cloneName);
- // Cleanup: delete clone then original (both from details pages)
- await card.DeleteAsync(cloneName);
- await page.WaitForURLAsync("**/hardware/tree");
- await hardwareTree.GotoAccessPointsListAsync();
- await list.AssertLoadedAsync();
- await list.OpenAccessPointAsync(name);
- await card.AssertCardVisibleAsync(name);
- await card.DeleteAsync(name);
- await context.CloseAsync();
- }
- finally {
- await context.CloseAsync();
- }
- }
- [Fact]
- public async Task User_Can_Delete_AccessPoint_From_Card_And_Is_Redirected() {
- (IBrowserContext context, IPage page) = await CreatePageAsync();
- var name = $"e2e-ap-{Guid.NewGuid():N}"[..16];
- try {
- await page.GotoAsync(_fixture.BaseUrl);
- var layout = new MainLayoutPom(page);
- await layout.AssertLoadedAsync();
- await layout.GotoHardwareAsync();
- var hardwareTree = new HardwareTreePom(page);
- await hardwareTree.AssertLoadedAsync();
- await hardwareTree.GotoAccessPointsListAsync();
- var list = new AccessPointsListPom(page);
- await list.AssertLoadedAsync();
- await list.AddAccessPointAsync(name);
- await page.WaitForURLAsync($"**/resources/hardware/{name}");
- var card = new AccessPointCardPom(page);
- await card.AssertCardVisibleAsync(name);
- await card.DeleteAsync(name);
- await page.WaitForURLAsync("**/hardware/tree");
- // Verify it’s gone from the list
- await hardwareTree.GotoAccessPointsListAsync();
- await list.AssertLoadedAsync();
- await list.AssertAccessPointDoesNotExist(name);
- await context.CloseAsync();
- }
- finally {
- await context.CloseAsync();
- }
- }
- [Fact]
- public async Task User_Can_Add_And_Remove_Tags_From_AccessPoint_Card() {
- (IBrowserContext context, IPage page) = await CreatePageAsync();
- var name = $"e2e-ap-{Guid.NewGuid():N}"[..16];
- try {
- await page.GotoAsync(_fixture.BaseUrl);
- var layout = new MainLayoutPom(page);
- await layout.AssertLoadedAsync();
- await layout.GotoHardwareAsync();
- var hardwareTree = new HardwareTreePom(page);
- await hardwareTree.AssertLoadedAsync();
- await hardwareTree.GotoAccessPointsListAsync();
- var list = new AccessPointsListPom(page);
- await list.AssertLoadedAsync();
- await list.AddAccessPointAsync(name);
- await page.WaitForURLAsync($"**/resources/hardware/{name}");
- var card = new AccessPointCardPom(page);
- await card.AssertCardVisibleAsync(name);
- TagsPom tags = card.Tags;
- // -------------------------------------------------
- // Add multiple tags in one modal interaction
- // -------------------------------------------------
- await tags.AddTagsAsync("accesspoint", "Foo", "Bar", "Baz");
- await tags.AssertTagVisibleAsync("accesspoint", "Foo");
- await tags.AssertTagVisibleAsync("accesspoint", "Bar");
- await tags.AssertTagVisibleAsync("accesspoint", "Baz");
- // -------------------------------------------------
- // Remove a single tag
- // -------------------------------------------------
- await tags.RemoveTagAsync("accesspoint", "Bar");
- await tags.AssertTagNotVisibleAsync("accesspoint", "Bar");
- await tags.AssertTagVisibleAsync("accesspoint", "Foo");
- await tags.AssertTagVisibleAsync("accesspoint", "Baz");
- // -------------------------------------------------
- // Reload to verify persistence
- // -------------------------------------------------
- await page.ReloadAsync();
- await tags.AssertTagVisibleAsync("accesspoint", "Foo");
- await tags.AssertTagVisibleAsync("accesspoint", "Baz");
- await tags.AssertTagNotVisibleAsync("accesspoint", "Bar");
- await context.CloseAsync();
- }
- finally {
- await context.CloseAsync();
- }
- }
- [Fact]
- public async Task User_Can_Add_Ports_To_Two_AccessPoints_And_Connect_Them() {
- (IBrowserContext context, IPage page) = await CreatePageAsync();
- var ap1 = $"e2e-ap-{Guid.NewGuid():N}"[..16];
- var ap2 = $"e2e-ap-{Guid.NewGuid():N}"[..16];
- try {
- await page.GotoAsync(_fixture.BaseUrl);
- var layout = new MainLayoutPom(page);
- await layout.AssertLoadedAsync();
- await layout.GotoHardwareAsync();
- var hardwareTree = new HardwareTreePom(page);
- await hardwareTree.AssertLoadedAsync();
- await hardwareTree.GotoAccessPointsListAsync();
- var list = new AccessPointsListPom(page);
- await list.AssertLoadedAsync();
- // -------------------------------------------------
- // Create first AP
- // -------------------------------------------------
- await list.AddAccessPointAsync(ap1);
- await page.WaitForURLAsync($"**/resources/hardware/{ap1}");
- var card = new AccessPointCardPom(page);
- await card.AssertCardVisibleAsync(ap1);
- // Add port group to AP1
- await card.AddPortGroupAsync(
- "rj45",
- "1",
- 2);
- // -------------------------------------------------
- // Create second AP
- // -------------------------------------------------
- await layout.GotoHardwareAsync();
- await hardwareTree.AssertLoadedAsync();
- await hardwareTree.GotoAccessPointsListAsync();
- await list.AssertLoadedAsync();
- await list.AddAccessPointAsync(ap2);
- await page.WaitForURLAsync($"**/resources/hardware/{ap2}");
- await card.AssertCardVisibleAsync(ap2);
- // Add port group to AP2
- await card.AddPortGroupAsync(
- "sfp+",
- "2.5",
- 2);
- // -------------------------------------------------
- // Go back to AP1 to create connection
- // -------------------------------------------------
- await layout.GotoHardwareAsync();
- await hardwareTree.GotoAccessPointsListAsync();
- await list.AssertLoadedAsync();
- await list.OpenAccessPointAsync(ap1);
- await card.AssertCardVisibleAsync(ap1);
- // -------------------------------------------------
- // Open connection modal from port
- // -------------------------------------------------
- await card.OpenConnectionFromPortAsync(0, 0);
- // -------------------------------------------------
- // Create connection
- // -------------------------------------------------
- await card.CreateConnectionAsync(
- ap1,
- "rj45 — 1 Gbps (2)", // example label — adjust if needed
- "Port 1",
- ap2,
- "sfp+ — 2.5 Gbps (2)",
- "Port 1");
- // -------------------------------------------------
- // Verify connection indicator appears
- // -------------------------------------------------
- await card.Ports.AssertPortVisibleAsync("accesspoint-ports", 0, 0);
- await context.CloseAsync();
- }
- finally {
- await context.CloseAsync();
- }
- }
- }
|