1
+ import time
1
2
from unittest .mock import MagicMock , call
2
3
3
4
import pytest
8
9
from monkey_island .cc .models import IslandMode
9
10
from monkey_island .cc .server_utils .encryption import ILockableEncryptor
10
11
from monkey_island .cc .services .authentication_service .authentication_facade import (
12
+ OTP_EXPIRATION_TIME ,
11
13
AuthenticationFacade ,
12
14
)
15
+ from monkey_island .cc .services .authentication_service .i_otp_repository import IOTPRepository
13
16
from monkey_island .cc .services .authentication_service .setup import setup_authentication
14
17
from monkey_island .cc .services .authentication_service .token_generator import TokenGenerator
15
18
from monkey_island .cc .services .authentication_service .token_parser import (
@@ -58,6 +61,11 @@ def mock_token_parser() -> TokenParser:
58
61
return MagicMock (spec = TokenParser )
59
62
60
63
64
+ @pytest .fixture
65
+ def mock_otp_repository () -> IOTPRepository :
66
+ return MagicMock (spec = IOTPRepository )
67
+
68
+
61
69
@pytest .fixture
62
70
def authentication_facade (
63
71
mock_flask_app ,
@@ -66,13 +74,15 @@ def authentication_facade(
66
74
mock_user_datastore : UserDatastore ,
67
75
mock_token_generator : TokenGenerator ,
68
76
mock_token_parser : TokenParser ,
77
+ mock_otp_repository : IOTPRepository ,
69
78
) -> AuthenticationFacade :
70
79
return AuthenticationFacade (
71
80
mock_repository_encryptor ,
72
81
mock_island_event_queue ,
73
82
mock_user_datastore ,
74
83
mock_token_generator ,
75
84
mock_token_parser ,
85
+ mock_otp_repository ,
76
86
)
77
87
78
88
@@ -178,6 +188,24 @@ def test_revoke_all_tokens_for_all_users(
178
188
[mock_user_datastore .set_uniquifier .assert_any_call (user ) for user in USERS ]
179
189
180
190
191
+ def test_generate_otp__saves_otp (
192
+ authentication_facade : AuthenticationFacade , mock_otp_repository : IOTPRepository
193
+ ):
194
+ otp = authentication_facade .generate_otp ()
195
+
196
+ assert mock_otp_repository .insert_otp .called_once_with (otp )
197
+
198
+
199
+ def test_generate_otp__uses_expected_expiration_time (
200
+ freezer , authentication_facade : AuthenticationFacade , mock_otp_repository : IOTPRepository
201
+ ):
202
+ authentication_facade .generate_otp ()
203
+
204
+ expiration_time = mock_otp_repository .insert_otp .call_args [0 ][1 ]
205
+ expected_expiration_time = time .monotonic () + OTP_EXPIRATION_TIME
206
+ assert expiration_time == expected_expiration_time
207
+
208
+
181
209
def test_setup_authentication__revokes_tokens (
182
210
mock_island_event_queue : IIslandEventQueue ,
183
211
mock_repository_encryptor : ILockableEncryptor ,
0 commit comments