upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/tests/captive-portal.spec.mjs
blob: b6ad96b8811b805777ec8c98f30e01dd5f447c9c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import { test, expect } from '@playwright/test';

const PORTAL_IP = process.env.TOLLGATE_IP || '192.168.4.1';
const PORTAL_URL = `http://${PORTAL_IP}`;

test.describe('Captive Portal - Phase 1', () => {

  test('portal page loads with TollGate branding', async ({ page }) => {
    await page.goto(PORTAL_URL);
    await expect(page.locator('h1')).toHaveText('TollGate');
    await expect(page.locator('.subtitle')).toContainText('internet access');
  });

  test('portal shows price', async ({ page }) => {
    await page.goto(PORTAL_URL);
    const priceEl = page.locator('.price-amount');
    await expect(priceEl).not.toBeEmpty({ timeout: 5000 });
  });

  test('grant access button exists', async ({ page }) => {
    await page.goto(PORTAL_URL);
    const btn = page.locator('#grantBtn');
    await expect(btn).toBeVisible();
    await expect(btn).toHaveText(/Grant Free Access/i);
  });

  test('click grant access shows connected', async ({ page }) => {
    await page.goto(PORTAL_URL);
    const btn = page.locator('#grantBtn');
    await btn.click();
    const status = page.locator('#status.success');
    await expect(status).toBeVisible({ timeout: 10000 });
    await expect(status).toContainText(/Connected/i);
  });

  test('captive detection URIs return portal', async ({ page }) => {
    const uris = ['/generate_204', '/hotspot-detect.html', '/canonical.html', '/success.txt'];
    for (const uri of uris) {
      const resp = await page.goto(`${PORTAL_URL}${uri}`);
      expect(resp.status()).toBe(200);
      const body = await resp.text();
      expect(body).toContain('TollGate');
    }
  });

  test('/api/status returns JSON with price', async ({ page }) => {
    const resp = await page.goto(`${PORTAL_URL}/api/status`);
    expect(resp.status()).toBe(200);
    const data = await resp.json();
    expect(data).toHaveProperty('connected');
    expect(data).toHaveProperty('price');
    expect(typeof data.price).toBe('number');
  });

  test('/whoami returns mac address', async ({ page }) => {
    const resp = await page.goto(`${PORTAL_URL}/whoami`);
    expect(resp.status()).toBe(200);
    const text = await resp.text();
    expect(text).toMatch(/^mac=/);
  });

  test('/usage returns -1/-1 before auth', async ({ page }) => {
    const resp = await page.goto(`${PORTAL_URL}/usage`);
    expect(resp.status()).toBe(200);
    const text = await resp.text();
    expect(text).toBe('-1/-1');
  });

  test('/reset_authentication works', async ({ page }) => {
    const resp = await page.goto(`${PORTAL_URL}/reset_authentication`);
    expect(resp.status()).toBe(200);
    const data = await resp.json();
    expect(data.status).toBe('reset');
  });
});