Add route management web interface
Prompts used since previous commit: - Kun je ook een webinterface maken waarmee ik de regels kan beheren? - Ik wil dat de webinterface benaderbaar is vanaf mijn hele interne netwerk. En ik wil alle regels kunnen beheren. Dus ook de bestaande ingebouwde routes. - 1. basic auth - 2. 4321 Special observations: - Domain routes moved from Python source to domain_routes.json so the web UI can manage all previous built-in domain routes. - web_config.json remains ignored; live sorter processes must be restarted after route edits to pick up changed rules.
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
import base64
|
||||
import json
|
||||
import tempfile
|
||||
import unittest
|
||||
from pathlib import Path
|
||||
|
||||
from manage_routes_web import basic_auth_ok, load_routes, save_routes, validate_routes
|
||||
|
||||
|
||||
class ManageRoutesWebTests(unittest.TestCase):
|
||||
def test_validate_routes_normalizes_domains_and_mailbox(self):
|
||||
routes = validate_routes([
|
||||
{"domains": [" Example.COM ", "example.com"], "mailbox": " Diensten.Test "}
|
||||
])
|
||||
self.assertEqual(routes, [{"domains": ["example.com"], "mailbox": "Diensten.Test"}])
|
||||
|
||||
def test_validate_routes_rejects_duplicate_domain_across_routes(self):
|
||||
with self.assertRaisesRegex(ValueError, "already used"):
|
||||
validate_routes([
|
||||
{"domains": ["example.com"], "mailbox": "Diensten.Een"},
|
||||
{"domains": ["EXAMPLE.com"], "mailbox": "Diensten.Twee"},
|
||||
])
|
||||
|
||||
def test_save_routes_writes_backup_and_normalized_json(self):
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
path = Path(tmp) / "domain_routes.json"
|
||||
path.write_text(
|
||||
json.dumps([{"domains": ["old.example"], "mailbox": "Diensten.Oud"}]) + "\n",
|
||||
encoding="utf-8",
|
||||
)
|
||||
|
||||
saved = save_routes(
|
||||
[{"domains": [" New.EXAMPLE "], "mailbox": " Diensten.Nieuw "}],
|
||||
path,
|
||||
)
|
||||
|
||||
self.assertEqual(saved, [{"domains": ["new.example"], "mailbox": "Diensten.Nieuw"}])
|
||||
self.assertEqual(load_routes(path), saved)
|
||||
backup = path.with_suffix(".json.bak")
|
||||
self.assertTrue(backup.exists())
|
||||
self.assertIn("old.example", backup.read_text(encoding="utf-8"))
|
||||
|
||||
def test_basic_auth_ok_accepts_exact_credentials(self):
|
||||
token = base64.b64encode(b"mailcat:secret").decode("ascii")
|
||||
self.assertTrue(basic_auth_ok(f"Basic {token}", "mailcat", "secret"))
|
||||
self.assertFalse(basic_auth_ok(f"Basic {token}", "mailcat", "wrong"))
|
||||
self.assertFalse(basic_auth_ok(None, "mailcat", "secret"))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user