mirror of
https://github.com/bunny-lab-io/Borealis.git
synced 2025-10-26 21:41:57 -06:00
Add operator account management API
This commit is contained in:
120
Data/Engine/tests/test_http_users.py
Normal file
120
Data/Engine/tests/test_http_users.py
Normal file
@@ -0,0 +1,120 @@
|
||||
"""HTTP integration tests for operator account endpoints."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import hashlib
|
||||
|
||||
from .test_http_auth import _login, prepared_app
|
||||
|
||||
|
||||
def test_list_users_requires_authentication(prepared_app):
|
||||
client = prepared_app.test_client()
|
||||
resp = client.get("/api/users")
|
||||
assert resp.status_code == 401
|
||||
|
||||
|
||||
def test_list_users_returns_accounts(prepared_app):
|
||||
client = prepared_app.test_client()
|
||||
_login(client)
|
||||
|
||||
resp = client.get("/api/users")
|
||||
assert resp.status_code == 200
|
||||
payload = resp.get_json()
|
||||
assert isinstance(payload, dict)
|
||||
assert "users" in payload
|
||||
assert any(user["username"] == "admin" for user in payload["users"])
|
||||
|
||||
|
||||
def test_create_user_validates_payload(prepared_app):
|
||||
client = prepared_app.test_client()
|
||||
_login(client)
|
||||
|
||||
resp = client.post("/api/users", json={"username": "bob"})
|
||||
assert resp.status_code == 400
|
||||
|
||||
payload = {
|
||||
"username": "bob",
|
||||
"password_sha512": hashlib.sha512(b"pw").hexdigest(),
|
||||
"role": "User",
|
||||
}
|
||||
resp = client.post("/api/users", json=payload)
|
||||
assert resp.status_code == 200
|
||||
|
||||
# Duplicate username should conflict
|
||||
resp = client.post("/api/users", json=payload)
|
||||
assert resp.status_code == 409
|
||||
|
||||
|
||||
def test_delete_user_handles_edge_cases(prepared_app):
|
||||
client = prepared_app.test_client()
|
||||
_login(client)
|
||||
|
||||
# cannot delete the only user
|
||||
resp = client.delete("/api/users/admin")
|
||||
assert resp.status_code == 400
|
||||
|
||||
# create another user then delete them successfully
|
||||
payload = {
|
||||
"username": "alice",
|
||||
"password_sha512": hashlib.sha512(b"pw").hexdigest(),
|
||||
"role": "User",
|
||||
}
|
||||
client.post("/api/users", json=payload)
|
||||
|
||||
resp = client.delete("/api/users/alice")
|
||||
assert resp.status_code == 200
|
||||
|
||||
|
||||
def test_delete_user_prevents_self_deletion(prepared_app):
|
||||
client = prepared_app.test_client()
|
||||
_login(client)
|
||||
|
||||
payload = {
|
||||
"username": "charlie",
|
||||
"password_sha512": hashlib.sha512(b"pw").hexdigest(),
|
||||
"role": "User",
|
||||
}
|
||||
client.post("/api/users", json=payload)
|
||||
|
||||
resp = client.delete("/api/users/admin")
|
||||
assert resp.status_code == 400
|
||||
|
||||
|
||||
def test_change_role_updates_session(prepared_app):
|
||||
client = prepared_app.test_client()
|
||||
_login(client)
|
||||
|
||||
payload = {
|
||||
"username": "backup",
|
||||
"password_sha512": hashlib.sha512(b"pw").hexdigest(),
|
||||
"role": "Admin",
|
||||
}
|
||||
client.post("/api/users", json=payload)
|
||||
|
||||
resp = client.post("/api/users/backup/role", json={"role": "User"})
|
||||
assert resp.status_code == 200
|
||||
|
||||
resp = client.post("/api/users/admin/role", json={"role": "User"})
|
||||
assert resp.status_code == 400
|
||||
|
||||
|
||||
def test_reset_password_requires_valid_hash(prepared_app):
|
||||
client = prepared_app.test_client()
|
||||
_login(client)
|
||||
|
||||
resp = client.post("/api/users/admin/reset_password", json={"password_sha512": "abc"})
|
||||
assert resp.status_code == 400
|
||||
|
||||
resp = client.post(
|
||||
"/api/users/admin/reset_password",
|
||||
json={"password_sha512": hashlib.sha512(b"new").hexdigest()},
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
|
||||
|
||||
def test_update_mfa_returns_not_found_for_unknown_user(prepared_app):
|
||||
client = prepared_app.test_client()
|
||||
_login(client)
|
||||
|
||||
resp = client.post("/api/users/missing/mfa", json={"enabled": True})
|
||||
assert resp.status_code == 404
|
||||
Reference in New Issue
Block a user