@@ -24,6 +24,10 @@ def setUp(self):
2424 self .valid_refresh_token = b"valid_refresh_token"
2525 self .expired_time = timezone .now () - timedelta (hours = 1 )
2626 self .future_time = timezone .now () + timedelta (hours = 1 )
27+ with patch ("boto3.client" ) as mock_boto3_client :
28+ self .mock_boto3_client = mock_boto3_client
29+ self .mock_kms_client = Mock ()
30+ self .mock_boto3_client .return_value = self .mock_kms_client
2731
2832 def test_google_auth_creation (self ):
2933 """Test GoogleAuth model creation."""
@@ -261,8 +265,15 @@ def test_authenticate_callback_google_auth_disabled(self):
261265 with pytest .raises (ValueError , match = "Google OAuth client ID" ):
262266 GoogleAuth .authenticate_callback (auth_response = {}, member_id = 4 )
263267
268+ @override_settings (IS_AWS_KMS_ENABLED = False , IS_GOOGLE_AUTH_ENABLED = True )
269+ def test_authenticate_callback_kms_disabled (self ):
270+ """Test authenticate_callback raises error when AWS KMS is disabled."""
271+ with pytest .raises (ValueError , match = "AWS KMS is not enabled" ):
272+ GoogleAuth .authenticate_callback (auth_response = {}, member_id = 4 )
273+
264274 @override_settings (
265275 IS_GOOGLE_AUTH_ENABLED = True ,
276+ IS_AWS_KMS_ENABLED = True ,
266277 GOOGLE_AUTH_CLIENT_ID = "test_client_id" ,
267278 GOOGLE_AUTH_CLIENT_SECRET = "test_client_secret" , # noqa: S106
268279 GOOGLE_AUTH_REDIRECT_URI = "http://localhost:8000/callback" ,
@@ -271,8 +282,9 @@ def test_authenticate_callback_google_auth_disabled(self):
271282 @patch ("apps.slack.models.google_auth.GoogleAuth.objects.get_or_create" )
272283 @patch ("apps.slack.models.google_auth.GoogleAuth.save" )
273284 @patch ("apps.slack.models.google_auth.Member.objects.get" )
285+ @patch ("apps.slack.models.google_auth.GoogleAuth.get_kms_client" )
274286 def test_authenticate_callback_success (
275- self , mock_member_get , mock_save , mock_get_or_create , mock_get_flow
287+ self , mock_get_kms_client , mock_member_get , mock_save , mock_get_or_create , mock_get_flow
276288 ):
277289 """Test successful authenticate_callback."""
278290 mock_credentials = Mock ()
@@ -285,17 +297,22 @@ def test_authenticate_callback_success(
285297 mock_member_get .return_value = self .member
286298 mock_get_flow .return_value = mock_flow_instance
287299 mock_get_or_create .return_value = (GoogleAuth (member = self .member ), False )
300+
301+ mock_get_kms_client .return_value .encrypt .return_value = b"encrypted_token"
288302 result = GoogleAuth .authenticate_callback ({}, member_id = self .member .slack_user_id )
289303
290- assert result .access_token == b"token "
291- assert result .refresh_token == b"refresh_token "
304+ assert result .access_token == b"encrypted_token "
305+ assert result .refresh_token == b"encrypted_token "
292306 assert result .expires_at == self .future_time
293307 mock_get_or_create .assert_called_once_with (member = self .member )
294308 mock_save .assert_called_once ()
295309 mock_flow_instance .fetch_token .assert_called_once_with (authorization_response = {})
310+ mock_get_kms_client .return_value .encrypt .assert_any_call (b"token" )
311+ mock_get_kms_client .return_value .encrypt .assert_any_call (b"refresh_token" )
296312
297313 @override_settings (
298314 IS_GOOGLE_AUTH_ENABLED = True ,
315+ IS_AWS_KMS_ENABLED = True ,
299316 GOOGLE_AUTH_CLIENT_ID = "test_client_id" ,
300317 GOOGLE_AUTH_CLIENT_SECRET = "test_client_secret" , # noqa: S106
301318 GOOGLE_AUTH_REDIRECT_URI = "http://localhost:8000/callback" ,
@@ -306,3 +323,49 @@ def test_authenticate_callback_member_not_found(self, mock_member_get):
306323 mock_member_get .side_effect = Member .DoesNotExist
307324 with pytest .raises (ValidationError , match = "Member with Slack ID 4 does not exist." ):
308325 GoogleAuth .authenticate_callback (auth_response = {}, member_id = 4 )
326+
327+ @override_settings (
328+ IS_GOOGLE_AUTH_ENABLED = True ,
329+ IS_AWS_KMS_ENABLED = True ,
330+ GOOGLE_AUTH_CLIENT_ID = "test_client_id" ,
331+ GOOGLE_AUTH_CLIENT_SECRET = "test_client_secret" , # noqa: S106
332+ GOOGLE_AUTH_REDIRECT_URI = "http://localhost:8000/callback" ,
333+ )
334+ @patch ("apps.slack.models.google_auth.GoogleAuth.get_kms_client" )
335+ def test_return_decrypted_access_token (self , mock_get_kms_client ):
336+ """Test return_decrypted_access_token returns decrypted token."""
337+ auth = GoogleAuth (
338+ member = self .member ,
339+ access_token = b"encrypted_token" ,
340+ refresh_token = b"encrypted_token" ,
341+ expires_at = self .future_time ,
342+ )
343+ mock_get_kms_client .return_value .decrypt .return_value = "decrypted_token"
344+ result = auth .access_token_str
345+ assert result == "decrypted_token"
346+
347+ @override_settings (
348+ IS_GOOGLE_AUTH_ENABLED = True ,
349+ IS_AWS_KMS_ENABLED = True ,
350+ GOOGLE_AUTH_CLIENT_ID = "test_client_id" ,
351+ GOOGLE_AUTH_CLIENT_SECRET = "test_client_secret" , # noqa: S106
352+ GOOGLE_AUTH_REDIRECT_URI = "http://localhost:8000/callback" ,
353+ )
354+ @patch ("apps.slack.models.google_auth.GoogleAuth.get_kms_client" )
355+ def test_return_decrypted_refresh_token (self , mock_get_kms_client ):
356+ """Test return_decrypted_refresh_token returns decrypted token."""
357+ auth = GoogleAuth (
358+ member = self .member ,
359+ access_token = b"encrypted_token" ,
360+ refresh_token = b"encrypted_token" ,
361+ expires_at = self .future_time ,
362+ )
363+ mock_get_kms_client .return_value .decrypt .return_value = "decrypted_token"
364+ result = auth .refresh_token_str
365+ assert result == "decrypted_token"
366+
367+ @override_settings (IS_AWS_KMS_ENABLED = False )
368+ def test_get_kms_client_error (self ):
369+ """Test get_kms_client raises error when KMS is disabled."""
370+ with pytest .raises (ValueError , match = "AWS KMS is not enabled." ):
371+ GoogleAuth .get_kms_client ()
0 commit comments