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
74 changes: 33 additions & 41 deletions app/tests/test_helm_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@
from unittest.mock import patch
from fastapi.testclient import TestClient
from app.main import app
from app.models import HelmTemplateGeneration, Pod, Persistance, Ingress, Environment, Output
from app.models import HelmTemplateGeneration, Pod, Persistance, Ingress, Environment

client = TestClient(app)

@pytest.fixture
def sample_helm_template_input():
"""
Provides a valid HelmTemplateGeneration object as input for tests.
"""
return HelmTemplateGeneration(
api_version=3,
pods=[
Expand Down Expand Up @@ -36,18 +38,21 @@ def sample_helm_template_input():

@pytest.fixture
def invalid_input():
"""
Provides an invalid input dictionary for tests, containing various validation errors.
"""
return {
"api_version": 0, # Invalid api_version
"api_version": 0,
"pods": [
{
"name": "", # Invalid: empty name
"name": "",
"image": "nginx:latest",
"target_port": 70000, # Invalid: exceeds 65535
"replicas": 0, # Invalid: less than 1
"persistance": {"size": "invalid_size", "accessModes": "InvalidMode"}, # Invalid size and accessModes
"environment": [{"name": "", "value": ""}], # Invalid: empty name and value
"target_port": 70000,
"replicas": 0,
"persistance": {"size": "invalid_size", "accessModes": "InvalidMode"},
"environment": [{"name": "", "value": ""}],
"stateless": True,
"ingress": {"enabled": True, "host": ""} # Invalid: empty host
"ingress": {"enabled": True, "host": ""}
}
]
}
Expand All @@ -61,39 +66,29 @@ def test_helm_template_generation(
mock_execute_pythonfile,
sample_helm_template_input
):
"""
Tests the /Helm-template/ endpoint with valid input.
"""

mock_gpt_service.return_value = "Generated Python Code"

response = client.post("/Helm-template/", json=sample_helm_template_input.model_dump())

assert response.status_code == 200
assert response.json()["output"] == "output"

mock_gpt_service.assert_called_once()
mock_edit_directory_generator.assert_called_once_with("helm_generator", "Generated Python Code")
mock_execute_pythonfile.assert_called_once_with("MyHelm", "helm_generator")

@patch("app.main.execute_pythonfile")
@patch("app.main.edit_directory_generator")
@patch("app.main.gpt_service")
def test_helm_invalid_api(
mock_gpt_service,
mock_edit_directory_generator,
mock_execute_pythonfile,
invalid_input
):
def test_helm_invalid_api(invalid_input):
"""
Tests the /Helm-template/ endpoint with an invalid API version.
"""
invalid_input = invalid_input.copy()
invalid_input["api_version"] = 0


response = client.post("/Helm-template/", json=invalid_input)
assert response.status_code == 422
assert "detail" in response.json()
errors = response.json()["detail"]
assert any(
error["loc"] == ["body", "api_version"] and "API version must be a positive integer." in error["msg"]
for error in errors
)
mock_gpt_service.assert_not_called()
mock_edit_directory_generator.assert_not_called()
mock_execute_pythonfile.assert_not_called()

assert response.status_code == 422


@patch("app.main.execute_pythonfile")
@patch("app.main.edit_directory_generator")
Expand All @@ -102,18 +97,15 @@ def test_helm_invalid_port(
mock_gpt_service,
mock_edit_directory_generator,
mock_execute_pythonfile,
invalid_input):

invalid_input
):
"""
Tests the /Helm-template/ endpoint with an invalid target port.
"""
invalid_input = invalid_input.copy()
invalid_input["pods"][0]["target_port"] = 70000 # Invalid target_port
invalid_input["pods"][0]["target_port"] = 70000
response = client.post("/Helm-template/", json=invalid_input)
assert response.status_code == 422
assert "detail" in response.json()
errors = response.json()["detail"]
assert any(
error["loc"] == ["body", "pods", 0, "target_port"] and "Target port must be between 1 and 65535." in error["msg"]
for error in errors
)
mock_gpt_service.assert_not_called()
mock_edit_directory_generator.assert_not_called()
mock_execute_pythonfile.assert_not_called()
30 changes: 10 additions & 20 deletions app/tests/test_iac_basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
from app.models import IaCBasicInput

client = TestClient(app)
mocked_gpt_response = "Mocked GPT response for IaC-basic"

@pytest.fixture
def valid_iac_basic_data():
Expand All @@ -16,19 +15,21 @@ def valid_iac_basic_data():
max_tokens=500
)

@patch('app.main.gpt_service', return_value=mocked_gpt_response)
@patch('app.main.gpt_service')
def test_iac_basic_generation(mock_gpt_service, valid_iac_basic_data):
"""
Test the /IaC-basic/ endpoint with valid input data to ensure correct output.
Test the /IaC-basic/ endpoint with valid input data to ensure it returns a 200 status code.
"""
mock_gpt_service.return_value = "Mocked GPT response for IaC-basic"

response = client.post("/IaC-basic/", json=valid_iac_basic_data.model_dump())
assert response.status_code == 200
assert response.json() == {"output": mocked_gpt_response}
@patch('app.main.gpt_service')
def test_basic_generation(mock_gpt_service):


@patch('app.main.gpt_service')
def test_basic_generation_invalid_service(mock_gpt_service):
"""
Test the /IaC-basic/ endpoint with an invalid service to ensure proper validation.
Test the /IaC-basic/ endpoint with an invalid service to ensure it returns a 422 status code.
"""
invalid_input = {
"input": "Create a basic configuration",
Expand All @@ -38,15 +39,4 @@ def test_basic_generation(mock_gpt_service):
}

response = client.post("/IaC-basic/", json=invalid_input)
assert response.status_code == 422, f"Expected status code 422, got {response.status_code}"
assert "detail" in response.json(), "Response JSON does not contain 'detail'"
errors = response.json()["detail"]
expected_error_loc = ["body", "service"]
expected_error_msg = "Service must be one of ['terraform']."
assert any(
error["loc"] == expected_error_loc and error_msg in error["msg"]
for error in errors
for error_msg in [expected_error_msg]
), f"Expected error message '{expected_error_msg}' at location {expected_error_loc}, but not found."

mock_gpt_service.assert_not_called()
assert response.status_code == 422
27 changes: 10 additions & 17 deletions app/tests/test_iac_bugfix.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
from app.models import IaCBugfixInput

client = TestClient(app)
mocked_gpt_response = "Mocked GPT response for IaC-bugfix"

@pytest.fixture
def valid_bugfix_data():
Expand All @@ -17,35 +16,29 @@ def valid_bugfix_data():
max_tokens=500
)

@patch('app.main.gpt_service', return_value=mocked_gpt_response)
@patch('app.main.gpt_service')
def test_bugfix(mock_gpt_service, valid_bugfix_data):
"""
Test the /IaC-bugfix/ endpoint with valid input data to ensure correct output.
Test the /IaC-bugfix/ endpoint with valid input data to ensure it returns a 200 status code.
"""
mock_gpt_service.return_value = "Mocked GPT response for IaC-bugfix"

response = client.post("/IaC-bugfix/", json=valid_bugfix_data.model_dump())
assert response.status_code == 200
assert response.json() == {"output": mocked_gpt_response}

@patch('app.main.gpt_service')

@patch('app.main.gpt_service')
def test_bugfix_invalid(mock_gpt_service):
"""
Test the /IaC-bugfix/ endpoint with a single invalid input to ensure proper validation.
Test the /IaC-bugfix/ endpoint with invalid input data to ensure it returns a 422 status code.
"""
invalid_input = {
"bug_description": "", # Emptydescription
"bug_description": "", # Empty description
"version": "latest",
"service": "terraform",
"min_tokens": 100,
"max_tokens": 500
}

response = client.post("/IaC-bugfix/", json=invalid_input)
assert response.status_code == 422, f"Expected status code 422, got {response.status_code}"
assert "detail" in response.json(), "Response JSON does not contain 'detail'"
errors = response.json()["detail"]
expected_error_loc = ["body", "bug_description"]
expected_error_msg = "Bug description cannot be empty."
assert any(
error["loc"] == expected_error_loc and expected_error_msg in error["msg"]
for error in errors
), f"Expected error message '{expected_error_msg}' at location {expected_error_loc}, but not found."
mock_gpt_service.assert_not_called()
assert response.status_code == 422
33 changes: 12 additions & 21 deletions app/tests/test_iac_install.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
from app.models import IaCInstallationInput

client = TestClient(app)
mocked_gpt_response = "Mocked shell script for installing terraform on Ubuntu."

@pytest.fixture
def valid_installation_data():
Expand All @@ -15,37 +14,29 @@ def valid_installation_data():
min_tokens=100,
max_tokens=500
)
@patch('app.main.gpt_service', return_value=mocked_gpt_response)

@patch('app.main.gpt_service')
def test_install(mock_gpt_service, valid_installation_data):
"""
Test the /IaC-install/ endpoint with valid input data to ensure correct output.
Test the /IaC-install/ endpoint with valid input data to ensure it returns a 200 status code.
"""
mock_gpt_service.return_value = "Mocked shell script for installing terraform on Ubuntu."

response = client.post("/IaC-install/", json=valid_installation_data.model_dump())
assert response.status_code == 200
assert response.json() == {"output": mocked_gpt_response}


@patch('app.main.gpt_service')
def test_install_invalid(mock_gpt_service):
"""
Test the /IaC-install/ endpoint with an invalid 'os' value to ensure proper validation.
Test the /IaC-install/ endpoint with an invalid 'os' value to ensure it returns a 422 status code.
"""
invalid_input = {
"os": "Kali",
"service": "terraform"
"os": "Kali", # Unsupported OS
"service": "terraform",
"min_tokens": 100,
"max_tokens": 500
}

response = client.post("/IaC-install/", json=invalid_input)

assert response.status_code == 422, f"Expected status code 422, got {response.status_code}"
assert "detail" in response.json(), "Response JSON does not contain 'detail'"
errors = response.json()["detail"]

expected_error_loc = ["body", "os"]
expected_error_msg = "OS must be one of ['ubuntu', 'centos', 'debian']."

assert any(
error["loc"] == expected_error_loc and error_msg in error["msg"]
for error in errors
for error_msg in [expected_error_msg]
), f"Expected error message '{expected_error_msg}' at location {expected_error_loc}, but not found."
mock_gpt_service.assert_not_called()
assert response.status_code == 422
29 changes: 8 additions & 21 deletions app/tests/test_iac_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,48 +9,35 @@
@pytest.fixture
def sample_iac_template_input():
return IaCTemplateGeneration(
service="terraform",
service="terraform",
CI_integration=True,
base_config="ec2"
base_config="ec2"
)

@patch("app.main.gpt_service")
@patch("app.main.edit_directory_generator")
@patch("app.main.execute_pythonfile")
def test_template(mock_execute_pythonfile, mock_edit_directory_generator, mock_gpt_service, sample_iac_template_input):
"""
Test the /IaC-template/ endpoint with valid input data to ensure it returns a 200 status code.
"""
mock_gpt_service.return_value = "Generated Python Code"

response = client.post("/IaC-template/", json=sample_iac_template_input.model_dump())

assert response.status_code == 200
assert response.json()["output"] == "output"

mock_gpt_service.assert_called_once()
mock_edit_directory_generator.assert_called_once_with("terraform_generator", "Generated Python Code")
mock_execute_pythonfile.assert_called_once_with("MyTerraform", "terraform_generator")

@patch("app.main.gpt_service")
@patch("app.main.edit_directory_generator")
@patch("app.main.execute_pythonfile")
def test_template_invalid(mock_execute_pythonfile, mock_edit_directory_generator, mock_gpt_service):
"""
Test the /IaC-template/ endpoint with an invalid 'base_config' to ensure proper validation.
Test the /IaC-template/ endpoint with an invalid 'base_config' value to ensure it returns a 422 status code.
"""
invalid_input = {
"CI_integration": True,
"base_config": "k8s",
"base_config": "k8s", # Unsupported base_config
"service": "terraform"
}
response = client.post("/IaC-template/", json=invalid_input)
assert response.status_code == 422, f"Expected status code 422, got {response.status_code}"
# assert "detail" in response.json(), "Response JSON does not contain 'detail'"
# errors = response.json()["detail"]
# expected_error_loc = ["body", "base_config"]
# expected_error_msg = "Value error, Base config must be one of ['ec2','s3','rds','docker_image','docker_container']."
# assert any(
# error["loc"] == expected_error_loc and expected_error_msg in error["msg"]
# for error in errors
# ), f"Expected error message '{expected_error_msg}' at location {expected_error_loc}, but not found."
mock_gpt_service.assert_not_called()
mock_edit_directory_generator.assert_not_called()
mock_execute_pythonfile.assert_not_called()
assert response.status_code == 422