import { expect, test } from '@playwright/test'; import { isValidMacAddress, clickSelect2Dropdown, hasToastText, sleep, isValidPrivateIPV4, getDefaultNetmask, isValidCidr } from '../../utils/utils.js'; test.describe('Network & Services - Network - Guest LAN', () => { test.beforeEach(async ({ page }) => { await page.goto('/network/guest-lan', { waitUntil: 'networkidle' }); await page.waitForFunction(async () => { await sleep(1000); const element = document.querySelector('.lan-netmask-select'); return element && element.classList.contains('select2-hidden-accessible'); }); }); test('Title', async ({ page }) => { const title = await page.title(); expect(title).toBe('Difuse - Network - Guest LAN'); }); test('Info Table', async ({ page }) => { const rows = await page.$$('table > tbody > tr'); for (const row of rows) { const cells = await row.$$('td'); if (cells.length === 2) { const label = await cells[0].textContent(); const value = await cells[1].textContent(); if (label === 'Protocol') { expect(value).toBe('Static Address'); } else if (label === 'Uptime') { expect(typeof parseInt(value)).toBe('number'); } else if (label === 'MAC') { expect(isValidMacAddress(value)).toBeTruthy(); } else if (label === 'RX' || label === 'TX') { expect(typeof parseInt(value)).toBe('number'); } else if (label === 'IPv4') { expect(isValidPrivateIPV4(value)).toBeTruthy(); } } } }); test('Validate Ip Address', async ({ page }) => { await page.waitForSelector('#ipAddress'); const ipAddress = await page.locator('#ipAddress'); const ipValue = await ipAddress.inputValue(); const validateIP = await isValidPrivateIPV4(ipValue); expect(validateIP).toBe(true); }); test('Validate Network Mask Address', async ({ page }) => { await page.waitForSelector('#ipAddress'); const ipAddress = await page.locator('#ipAddress'); const ipValue = await ipAddress.inputValue(); const networkMask = await page.locator('.lan-netmask-select'); const networkValue = await networkMask.inputValue(); const defaultValue = await getDefaultNetmask(ipValue); if (defaultValue === networkValue) { expect(defaultValue).toBe(networkValue); } else { expect(() => { throw new Error('Expected defaultValue to match networkValue'); }).toThrow(); } }); test('DHCP Toggle', async ({ page }) => { const dhcpCb = await page.$('.dhcp-cb'); const isChecked = await dhcpCb.isChecked(); if (isChecked) { expect(await page.isVisible('label:has-text("DHCP Start")')).toBeTruthy(); } else { await dhcpCb.check(); expect(await page.isVisible('label:has-text("DHCP Start1")')).toBeTruthy(); } }); test.describe('Bad IPv4 Form Submits', () => { test('Bad IPv4', async ({ page }) => { const ip = await page.getByPlaceholder('192.168.1.1'); await ip.fill('1.1.1.1.1.1.1.1.1.1.1'); await page.click('button.button.green:has-text("Save")'); expect(await hasToastText(page, 'Invalid IP Address')).toBeTruthy(); }); test('Bad Netmask', async ({ page }) => { await clickSelect2Dropdown(page, '.lan-netmask-select'); await page.getByRole('searchbox', { name: 'Search' }).fill('15151515515151515'); await page.keyboard.press('Enter'); await page.click('button.button.green:has-text("Save")'); expect(await hasToastText(page, 'Invalid Netmask')).toBeTruthy(); }); test('Bad DHCP Start', async ({ page }) => { await page.locator('#dhcpStart').fill('55555555555555'); await page.click('button.button.green:has-text("Save")'); expect(await hasToastText(page, 'Invalid DHCP Range')).toBeTruthy(); }); test('Bad DHCP Max Leases', async ({ page }) => { await page.locator('#dhcpMax').fill('55555555555555'); await page.click('button.button.green:has-text("Save")'); expect(await hasToastText(page, 'Invalid DHCP Range')).toBeTruthy(); }); }); test.describe('IPV6 Tab', () => { test.beforeEach(async ({ page }) => { await page.goto('/network/guest-lan', { waitUntil: 'networkidle' }); const ipv6Tab = await page.$("a:has-text('IPv6')"); await ipv6Tab.click(); }); test('ULA Prefix Validation', async ({ page }) => { await page.waitForSelector('#ulaPrefix'); const ulaPrefix = await page.locator('#ulaPrefix'); const value = await ulaPrefix.inputValue(); if (value) { const isValidIPv6 = isValidCidr(value); expect(isValidIPv6).toBe(true); } }); }); });