import uuid import requests from tests.conftest import BASE_URL def _session(): s = requests.Session() name = f"push_{uuid.uuid4().hex[:10]}" s.post(f"{BASE_URL}/auth/signup", data={ "username": name, "email": f"{name}@test.dev", "password": "secret123", "confirm_password": "secret123", }, allow_redirects=True) return s def test_public_key_endpoint(app_server): r = requests.get(f"{BASE_URL}/push.json") assert r.status_code == 200 assert r.json().get("publicKey") def test_register_requires_auth(app_server): r = requests.post(f"{BASE_URL}/push.json", json={ "endpoint": "https://push.example.com/anon", "keys": {"p256dh": "key", "auth": "auth"}, }, allow_redirects=False) assert r.status_code == 401 def test_register_success(app_server): s = _session() r = s.post(f"{BASE_URL}/push.json", json={ "endpoint": "https://push.example.com/sub-1", "keys": {"p256dh": "p256dh_fake", "auth": "auth_fake"}, }) assert r.status_code == 200, r.text assert r.json().get("registered") is True def test_register_missing_keys_rejected(app_server): s = _session() r = s.post(f"{BASE_URL}/push.json", json={"endpoint": "https://push.example.com/x"}) assert r.status_code == 400 def test_register_invalid_json_rejected(app_server): s = _session() r = s.post(f"{BASE_URL}/push.json", data="not-json", headers={"Content-Type": "application/json"}) assert r.status_code == 400 def test_service_worker_served(app_server): r = requests.get(f"{BASE_URL}/service-worker.js") assert r.status_code == 200 assert r.headers.get("Service-Worker-Allowed") == "/" def test_manifest_served(app_server): r = requests.get(f"{BASE_URL}/manifest.json") assert r.status_code == 200 def test_browser_base64_is_url_safe_unpadded(): import base64 from devplacepy import push encoded = push.browser_base64(b"\xff\xfe\x00 hello") assert "=" not in encoded assert "+" not in encoded and "/" not in encoded assert base64.urlsafe_b64decode(encoded + "==") == b"\xff\xfe\x00 hello" def test_hkdf_returns_requested_length(): from devplacepy import push derived = push.hkdf(b"input-key-material", b"salt", b"info", 16) assert isinstance(derived, bytes) assert len(derived) == 16 def test_public_key_standard_b64_non_empty(): from devplacepy import push assert push.public_key_standard_b64() def test_create_notification_authorization_is_jwt(): from devplacepy import push token = push.create_notification_authorization("https://push.example.com/endpoint") assert token.count(".") == 2