103 lines
3.2 KiB
Python
103 lines
3.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Unit tests for permissions module."""
|
|
|
|
import pytest
|
|
from flask import Flask
|
|
|
|
import sys
|
|
import os
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src'))
|
|
|
|
from mes_dashboard.core.permissions import is_admin_logged_in, get_current_admin, admin_required
|
|
|
|
|
|
@pytest.fixture
|
|
def app():
|
|
"""Create a test Flask app."""
|
|
app = Flask(__name__)
|
|
app.secret_key = "test-secret-key"
|
|
app.config["TESTING"] = True
|
|
return app
|
|
|
|
|
|
class TestIsAdminLoggedIn:
|
|
"""Tests for is_admin_logged_in function."""
|
|
|
|
def test_admin_logged_in(self, app):
|
|
"""Test when admin is logged in."""
|
|
with app.test_request_context():
|
|
from flask import session
|
|
session["admin"] = {"username": "admin", "mail": "admin@test.com"}
|
|
assert is_admin_logged_in() is True
|
|
|
|
def test_admin_not_logged_in(self, app):
|
|
"""Test when admin is not logged in."""
|
|
with app.test_request_context():
|
|
assert is_admin_logged_in() is False
|
|
|
|
|
|
class TestGetCurrentAdmin:
|
|
"""Tests for get_current_admin function."""
|
|
|
|
def test_get_admin_when_logged_in(self, app):
|
|
"""Test getting admin info when logged in."""
|
|
with app.test_request_context():
|
|
from flask import session
|
|
admin_data = {"username": "admin", "mail": "admin@test.com"}
|
|
session["admin"] = admin_data
|
|
result = get_current_admin()
|
|
assert result == admin_data
|
|
|
|
def test_get_admin_when_not_logged_in(self, app):
|
|
"""Test getting admin info when not logged in."""
|
|
with app.test_request_context():
|
|
result = get_current_admin()
|
|
assert result is None
|
|
|
|
|
|
class TestAdminRequired:
|
|
"""Tests for admin_required decorator."""
|
|
|
|
def test_admin_required_when_logged_in(self, app):
|
|
"""Test decorator allows access when admin is logged in."""
|
|
@app.route("/test")
|
|
@admin_required
|
|
def test_route():
|
|
return "success"
|
|
|
|
with app.test_client() as client:
|
|
with client.session_transaction() as sess:
|
|
sess["admin"] = {"username": "admin"}
|
|
|
|
response = client.get("/test")
|
|
assert response.status_code == 200
|
|
assert response.data == b"success"
|
|
|
|
def test_admin_required_when_not_logged_in(self, app):
|
|
"""Test decorator redirects when admin is not logged in."""
|
|
from flask import Blueprint
|
|
|
|
# Register auth blueprint first with correct endpoint name
|
|
auth_bp = Blueprint("auth", __name__, url_prefix="/admin")
|
|
|
|
@auth_bp.route("/login", endpoint="login")
|
|
def login_view():
|
|
return "login"
|
|
|
|
app.register_blueprint(auth_bp)
|
|
|
|
# Now add the protected route
|
|
@app.route("/test")
|
|
@admin_required
|
|
def test_route():
|
|
return "success"
|
|
|
|
with app.test_client() as client:
|
|
response = client.get("/test")
|
|
assert response.status_code == 302
|
|
assert "/admin/login" in response.location
|
|
|
|
|
|
if __name__ == "__main__":
|
|
pytest.main([__file__, "-v"])
|