Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/ult.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def deleteSecrets(sm_client,title):
try:
return sm_client.delete_secret(SecretId=title)

except botocore.exceptions.clientError as err:
except botocore.exceptions.ClientError as err:
print(f"failed to delete secret: {err}")
return None

Expand Down
42 changes: 42 additions & 0 deletions test/test_delete_secret.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
from src.ult import deleteSecrets
from unittest.mock import Mock, mock_open, patch
import botocore.exceptions



class TestDeleteSecrets():
def test_delete_secrets(self):
sm_client = Mock()

title = "deleteTest"

sm_client.delete_secret.return_value = {
"ResponseMetadata": {
"HTTPStatusCode": 200
},
"Name": title,
"DeletionDate": "2025-06-19T12:00:00Z"
}


result = deleteSecrets(sm_client, title)

sm_client.delete_secret.assert_called_once_with(SecretId=title)
assert result["Name"] == title
assert result["ResponseMetadata"]["HTTPStatusCode"] == 200


def test_delete_secrets_error(self, capsys):
sm_client = Mock()
title = "deleteTest"

sm_client.delete_secret.side_effect = botocore.exceptions.ClientError(
error_response={"Error": {"Code": "ResourceNotFoundException", "Message": "Secret not found"}},
operation_name="DeleteSecret"
)

result = deleteSecrets(sm_client, title)

out, _ = capsys.readouterr()
assert "failed to delete secret" in out.lower()
assert result is None
39 changes: 39 additions & 0 deletions test/test_listing_secret.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import pytest
import json
from src.ult import listingSecrets
from unittest.mock import Mock
from botocore.exceptions import ClientError


class TestRetrieveSecret():
def test_listing_secrets(self):
sm_client = Mock()

sm_client.list_secrets.return_value ={
"SecretList":[
{"Name": "secret1"},
{"Name":"secret2"}
]
}

result = listingSecrets(sm_client)

assert result == ["secret1", "secret2"]
sm_client.list_secrets.assert_called_once()


def test_listing_secrets_errors(self, capfd):
sm_client = Mock()
error_response = {
"Error": {
"Code": "AccessDeniedException",
"Message": "You do not have access"
}
}
sm_client.list_secrets.side_effect = ClientError(error_response, "ListSecrets")

result = listingSecrets(sm_client)

out, _ = capfd.readouterr()
assert "Failed to list secrets" in out
assert result == []
55 changes: 55 additions & 0 deletions test/test_retrieve_secrets.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import pytest
import json
from src.ult import retrieveSecret
from unittest.mock import Mock, mock_open, patch
from botocore.exceptions import ClientError


class TestRetrieveSecret():
def retrieveSecret(self,capfd):
sm_client = Mock()
title = "my-secret"
secret_data = {"userid": "admin", "password": "1234"}
sm_client.get_secret_value.return_value = {
"SecretString": json.dumps(secret_data)
}

with patch("builtins.open", mock_open()) as mocked_file:
retrieveSecret(sm_client, title)

sm_client.get_secret_value.assert_called_once_with(SecretId=title)
mocked_file().write.assert_called()
out, _ = capfd.readouterr()
assert "secrets is stored in secrets.json" in out


def test_retrieve_secret_client_error(self, capfd):
sm_client = Mock()
sm_client.get_secret_value.side_effect = ClientError(
{"Error": {"Code": "ResourceNotFoundException", "Message": "Secret not found"}},
"GetSecretValue"
)

retrieveSecret(sm_client, "invalid-secret")
out, _ = capfd.readouterr()
assert "Failed to retrieve secret" in out


def test_retrieve_secret_invalid_json(self, capfd):
sm_client = Mock()
sm_client.get_secret_value.return_value = {
"SecretString": "not-a-valid-json"
}

retrieveSecret(sm_client, "bad-json-secret")
out, _ = capfd.readouterr()
assert "Invalid secret format" in out


def test_retrieve_secret_unexpected_error(self, capfd):
sm_client = Mock()
sm_client.get_secret_value.side_effect = Exception("Something went wrong")

retrieveSecret(sm_client, "any")
out, _ = capfd.readouterr()
assert "Unexpected error" in out