from inkwell.settings import REGISTRY, validate_updates def test_registry_has_expected_keys(): keys = {d.key for d in REGISTRY} assert {"site_name", "allow_registration", "session_ttl_days"} <= keys def test_validate_rejects_unknown_key(): clean, error = validate_updates({"nope": 1}) assert error is not None assert clean == {} def test_validate_coerces_bool_and_int(): clean, error = validate_updates({"allow_registration": "true", "session_ttl_days": "45"}) assert error is None assert clean["allow_registration"] is True assert clean["session_ttl_days"] == 45 def test_validate_rejects_bad_int(): clean, error = validate_updates({"session_ttl_days": "not-a-number"}) assert error is not None assert clean == {} def test_an_empty_secret_keeps_what_is_saved(): clean, error = validate_updates({"smtp_password": "", "smtp_host": "smtp.example.test"}) assert error is None assert clean == {"smtp_host": "smtp.example.test"} def test_a_choice_must_be_one_of_its_values(): assert validate_updates({"smtp_security": "tls"}) == ({"smtp_security": "tls"}, None) clean, error = validate_updates({"smtp_security": "ssl"}) assert clean == {} and error def test_the_public_address_is_an_http_url_without_a_trailing_slash(): assert validate_updates({"public_url": "https://notes.example.test/"}) == ( {"public_url": "https://notes.example.test"}, None, ) assert validate_updates({"public_url": ""}) == ({"public_url": ""}, None) clean, error = validate_updates({"public_url": "javascript:alert(1)"}) assert clean == {} and error