1717from options .options import SysOptions
1818
1919from .models import AdminType , ProblemPermission , User
20- from .decorators import scheduler_only
21- from .middleware import RequestIDMiddleware
20+ from .decorators import login_required , scheduler_only
21+ from .middleware import AdminRoleRequiredMiddleware , RequestIDMiddleware
2222from .tasks import calculate_user_score_basis , calculate_user_score_fluctuation
2323
2424
@@ -65,6 +65,35 @@ def test_generates_request_id_when_header_has_no_safe_characters(self):
6565 self .assertEqual (response ["X-Request-ID" ], request .request_id )
6666
6767
68+ class AdminRoleRequiredMiddlewareTest (SimpleTestCase ):
69+
70+ def setUp (self ):
71+ self .factory = RequestFactory ()
72+
73+ def test_admin_api_requires_login_with_http_401 (self ):
74+ middleware = AdminRoleRequiredMiddleware (lambda request : JsonResponse ({"ok" : True }))
75+ request = self .factory .get ("/api/admin/problem" )
76+ request .user = mock .MagicMock ()
77+ request .user .is_authenticated = False
78+
79+ response = middleware (request )
80+
81+ self .assertEqual (response .status_code , 401 )
82+ self .assertEqual (response .data , {"error" : "login-required" , "data" : "Please login in first" })
83+
84+ def test_admin_api_requires_admin_role_with_http_403 (self ):
85+ middleware = AdminRoleRequiredMiddleware (lambda request : JsonResponse ({"ok" : True }))
86+ request = self .factory .get ("/api/admin/problem" )
87+ request .user = mock .MagicMock ()
88+ request .user .is_authenticated = True
89+ request .user .is_admin_role .return_value = False
90+
91+ response = middleware (request )
92+
93+ self .assertEqual (response .status_code , 403 )
94+ self .assertEqual (response .data , {"error" : "login-required" , "data" : "Please login in first" })
95+
96+
6897class PermissionDecoratorTest (APITestCase ):
6998 """
7099 데코레이터 테스트
@@ -78,7 +107,18 @@ def setUp(self):
78107 self .request .user .is_authenticated = mock .MagicMock ()
79108
80109 def test_login_required (self ):
81- self .request .user .is_authenticated .return_value = False
110+ class TestAPIView (APIView ):
111+
112+ @login_required
113+ def get (self , request ):
114+ return self .success ("Success" )
115+
116+ self .request .user .is_authenticated = False
117+
118+ response = TestAPIView ().get (self .request )
119+
120+ self .assertEqual (response .status_code , 401 )
121+ self .assertFailed (response , "Please login first" )
82122
83123 def test_admin_required (self ):
84124 pass
@@ -106,13 +146,15 @@ def test_empty_environment_token(self):
106146 """ Test when SCHEDULER_TOKEN is not set in the environment."""
107147 request = self .factory .post ("/" , HTTP_X_SCHEDULER_TOKEN = 'secret' )
108148 response = self .view .post (request )
149+ self .assertEqual (response .status_code , 403 )
109150 self .assertFailed (response )
110151
111152 def test_missing_header_token (self ):
112153 """ Test when SCHEDULER_TOKEN is not set in the environment and request header is missing."""
113154 with mock .patch ('os.environ' , {}):
114155 request = self .factory .post ("/" )
115156 response = self .view .post (request )
157+ self .assertEqual (response .status_code , 403 )
116158 self .assertFailed (response )
117159
118160 def test_valid_token (self ):
@@ -127,6 +169,7 @@ def test_invalid_token(self):
127169 with mock .patch ('os.environ' , {'SCHEDULER_TOKEN' : 'secret' }):
128170 request = self .factory .post ("/" , HTTP_X_SCHEDULER_TOKEN = 'wrong_secret' )
129171 response = self .view .post (request )
172+ self .assertEqual (response .status_code , 403 )
130173 self .assertFailed (response )
131174
132175
0 commit comments