feat: add E2E tests for device creation and account management
10 E2E tests using NiceGUI's User fixture: - Device creation flow and name validation - Password change (success, wrong current, mismatch, too short) - API token creation, TOTP registration, invalid code rejection - Account deletion with email confirmation Tests live in tests/e2e/ with a separate conftest that loads the NiceGUI testing plugin. CI runs unit and E2E tests as separate steps.
This commit is contained in:
parent
3d1ca7444b
commit
5adb0c86ce
7 changed files with 283 additions and 5 deletions
54
tests/e2e/test_devices.py
Normal file
54
tests/e2e/test_devices.py
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
"""End-to-end tests for device management UI using NiceGUI's User fixture."""
|
||||
|
||||
from unittest.mock import patch
|
||||
|
||||
import pytest
|
||||
from nicegui.testing import User
|
||||
|
||||
from wiregui.models.user import User as UserModel
|
||||
from tests.e2e.conftest import TEST_EMAIL, TEST_PASSWORD
|
||||
|
||||
# Fake WG keys for testing (valid base64, 32 bytes)
|
||||
FAKE_PRIVATE_KEY = "YFake0PrivateKey00000000000000000000000000w="
|
||||
FAKE_PUBLIC_KEY = "ZFake0PublicKey000000000000000000000000000w="
|
||||
|
||||
|
||||
async def _login(user: User):
|
||||
"""Helper to log in via the UI."""
|
||||
await user.open("/login")
|
||||
user.find("Email").type(TEST_EMAIL)
|
||||
user.find("Password").type(TEST_PASSWORD)
|
||||
user.find("Sign in").click()
|
||||
await user.should_see("My Devices")
|
||||
|
||||
|
||||
@pytest.mark.parametrize("user", [{"storage": {}}], indirect=True)
|
||||
async def test_add_device_via_ui(user: User, test_user: UserModel):
|
||||
"""Test the full flow: login → devices → add device → see it in table."""
|
||||
with patch("wiregui.pages.devices.generate_keypair", return_value=(FAKE_PRIVATE_KEY, FAKE_PUBLIC_KEY)), \
|
||||
patch("wiregui.pages.devices.generate_preshared_key", return_value="cHJlc2hhcmVkMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA="):
|
||||
|
||||
await _login(user)
|
||||
|
||||
# Open create dialog
|
||||
user.find("Add Device").click()
|
||||
await user.should_see("New Device")
|
||||
|
||||
# Fill device name and submit
|
||||
user.find("Device Name").type("Test Laptop")
|
||||
user.find("Create").click()
|
||||
|
||||
# Should see config dialog with the device config
|
||||
await user.should_see("Test Laptop")
|
||||
|
||||
|
||||
@pytest.mark.parametrize("user", [{"storage": {}}], indirect=True)
|
||||
async def test_add_device_requires_name(user: User, test_user: UserModel):
|
||||
"""Test that creating a device without a name shows an error."""
|
||||
await _login(user)
|
||||
|
||||
# Open create dialog and submit without name
|
||||
user.find("Add Device").click()
|
||||
await user.should_see("New Device")
|
||||
user.find("Create").click()
|
||||
await user.should_see("Device name is required")
|
||||
Loading…
Add table
Add a link
Reference in a new issue