import json from pathlib import Path from webapp.auth import load_users, set_user_language def test_load_users_defaults_permissions_to_false(tmp_path: Path) -> None: users_file = tmp_path / "users.json" users_file.write_text( """ { "users": [ { "username": "viewer", "password_hash": "hash" } ] } """, encoding="utf-8", ) users = load_users(users_file) assert users["viewer"]["password_hash"] == "hash" assert all(value is False for value in users["viewer"]["permissions"].values()) assert users["viewer"]["language"] == "en" saved_payload = json.loads(users_file.read_text(encoding="utf-8")) saved_permissions = saved_payload["users"][0]["permissions"] assert all(saved_permissions[key] is False for key in saved_permissions) def test_load_users_accepts_bool_like_permission_values(tmp_path: Path) -> None: users_file = tmp_path / "users.json" users_file.write_text( """ { "users": [ { "username": "editor", "password_hash": "hash", "permissions": { "edit_content": 1, "edit_targets": 1, "save_announcements": 1, "open_telegram": 1, "post_now": "true", "schedule": "yes", "unschedule": true } } ] } """, encoding="utf-8", ) users = load_users(users_file) permissions = users["editor"]["permissions"] assert permissions["edit_content"] is True assert permissions["edit_targets"] is True assert permissions["save_announcements"] is True assert permissions["open_telegram"] is True assert permissions["post_now"] is True assert permissions["schedule"] is True assert permissions["unschedule"] is True assert permissions["unlink_telegram"] is False def test_set_user_language_updates_users_file(tmp_path: Path) -> None: users_file = tmp_path / "users.json" users_file.write_text( """ { "users": [ { "username": "editor", "password_hash": "hash", "permissions": {} } ] } """, encoding="utf-8", ) set_user_language(users_file, "editor", "fi") users = load_users(users_file) assert users["editor"]["language"] == "fi" def test_load_users_accepts_auto_language(tmp_path: Path) -> None: users_file = tmp_path / "users.json" users_file.write_text( """ { "users": [ { "username": "auto_user", "password_hash": "hash", "language": "auto" } ] } """, encoding="utf-8", ) users = load_users(users_file) assert users["auto_user"]["language"] == "auto" def test_set_user_language_can_store_auto(tmp_path: Path) -> None: users_file = tmp_path / "users.json" users_file.write_text( """ { "users": [ { "username": "editor", "password_hash": "hash", "permissions": {} } ] } """, encoding="utf-8", ) set_user_language(users_file, "editor", "auto") users = load_users(users_file) assert users["editor"]["language"] == "auto" def test_load_users_adds_missing_permissions_to_existing_permissions_block(tmp_path: Path) -> None: users_file = tmp_path / "users.json" users_file.write_text( """ { "users": [ { "username": "editor", "password_hash": "hash", "permissions": { "edit_content": true } } ] } """, encoding="utf-8", ) users = load_users(users_file) assert users["editor"]["permissions"]["edit_content"] is True assert users["editor"]["permissions"]["edit_targets"] is False assert users["editor"]["permissions"]["save_announcements"] is False assert users["editor"]["permissions"]["open_telegram"] is False saved_payload = json.loads(users_file.read_text(encoding="utf-8")) saved_permissions = saved_payload["users"][0]["permissions"] assert saved_permissions["edit_content"] is True assert saved_permissions["edit_targets"] is False assert saved_permissions["save_announcements"] is False assert saved_permissions["open_telegram"] is False assert saved_permissions["post_now"] is False assert saved_permissions["schedule"] is False assert saved_permissions["unschedule"] is False assert saved_permissions["unlink_telegram"] is False assert saved_permissions["delete_telegram"] is False assert saved_permissions["delete_storage"] is False def test_load_users_removes_legacy_edit_broadcasts_permission(tmp_path: Path) -> None: users_file = tmp_path / "users.json" users_file.write_text( """ { "users": [ { "username": "editor", "password_hash": "hash", "permissions": { "edit_broadcasts": true } } ] } """, encoding="utf-8", ) users = load_users(users_file) assert "edit_broadcasts" not in users["editor"]["permissions"] saved_payload = json.loads(users_file.read_text(encoding="utf-8")) saved_permissions = saved_payload["users"][0]["permissions"] assert "edit_broadcasts" not in saved_permissions