Skip to content

Commit 20a9453

Browse files
authored
Merge pull request #98 from arasheghdam84/test/modify-tests
Modify Tests
2 parents ce8a660 + 8979e23 commit 20a9453

6 files changed

Lines changed: 248 additions & 228 deletions

File tree

app/tests/conftest.py

Lines changed: 108 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,16 @@
55
from app.main import app
66
from app.models import (
77
IaCTemplateGenerationDocker, IaCTemplateGenerationEC2, IaCTemplateGenerationS3, IaCTemplateGenerationIAM,
8-
IaCTemplateGenerationArgoCD, IaCTemplateGenerationELB, IaCTemplateGenerationEFS, SyncPolicy, ArgoApplication
8+
IaCTemplateGenerationArgoCD, IaCTemplateGenerationELB, IaCTemplateGenerationEFS, SyncPolicy, ArgoApplication,
9+
HelmTemplateGeneration, Pod, Persistance, Ingress, Environment, IaCBasicInput, IaCBugfixInput, IaCInstallationInput
910
)
1011

1112

1213
@pytest.fixture
1314
def client():
14-
with TestClient(app) as client:
15-
yield client
15+
# with TestClient(app) as client:
16+
# yield client
17+
return TestClient(app)
1618

1719

1820
@pytest.fixture
@@ -50,3 +52,106 @@ def iac_template_elb_sample_input():
5052
@pytest.fixture
5153
def iac_template_efs_sample_input():
5254
return IaCTemplateGenerationEFS().model_dump()
55+
56+
57+
@pytest.fixture
58+
def helm_template_sample_input():
59+
nginx_pod = Pod(
60+
name='nginx',
61+
image='nginx:latest',
62+
target_port=80,
63+
replicas=2,
64+
persistance=Persistance(),
65+
environment=[Environment(name='DEBUG', value='true')],
66+
stateless=True,
67+
ingress=Ingress(enabled=True)
68+
)
69+
70+
redis_pod = Pod(
71+
name='redis',
72+
image='redis:latest',
73+
target_port=6379,
74+
replicas=1,
75+
persistance=Persistance(),
76+
environment=[],
77+
stateless=False,
78+
ingress=Ingress(enabled=False)
79+
)
80+
81+
return HelmTemplateGeneration(api_version=3, pods=[nginx_pod, redis_pod]).model_dump()
82+
83+
@pytest.fixture
84+
def helm_template_invalid_sample_input():
85+
return {
86+
'api_version': 0,
87+
'pods': [
88+
{
89+
'name': '',
90+
'image': 'nginx:latest',
91+
'target_port': 70000,
92+
'replicas': 0,
93+
'persistance': {'size': 'invalid_size', 'accessModes': 'InvalidMode'},
94+
'environment': [{'name': '', 'value': ''}],
95+
'stateless': True,
96+
'ingress': {'enabled': True, 'host': ''}
97+
}
98+
]
99+
}
100+
101+
102+
@pytest.fixture
103+
def iac_basic_sample_input():
104+
return IaCBasicInput(
105+
input='How do I manage state effectively in Terraform?',
106+
service='terraform',
107+
min_tokens=100,
108+
max_tokens=500
109+
).model_dump()
110+
111+
112+
@pytest.fixture
113+
def iac_basic_invalid_sample_input():
114+
return {
115+
'input': 'Create a basic configuration',
116+
'service': 'invalid_service',
117+
'min_tokens': 100,
118+
'max_tokens': 500
119+
}
120+
121+
122+
@pytest.fixture
123+
def ias_bugfix_sample_input():
124+
return IaCBugfixInput(
125+
bug_description='Application fails to start on version latest',
126+
version='latest',
127+
service='terraform',
128+
min_tokens=100,
129+
max_tokens=500
130+
).model_dump()
131+
132+
133+
@pytest.fixture
134+
def iac_bugfix_invalid_sample_input():
135+
return {
136+
'bug_description': '',
137+
'version': 'latest',
138+
'service': 'terraform',
139+
'min_tokens': 100,
140+
'max_tokens': 500
141+
}
142+
143+
144+
@pytest.fixture
145+
def iac_install_sample_input():
146+
return IaCInstallationInput(
147+
os='ubuntu',
148+
service='terraform'
149+
).model_dump()
150+
151+
152+
@pytest.fixture
153+
def iac_install_invalid_sample_input():
154+
return {
155+
'os': 'Kali', # Unsupported OS
156+
'service': 'terraform',
157+
}

app/tests/test_helm_template.py

Lines changed: 26 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,34 @@
1-
import pytest
2-
from unittest.mock import patch
3-
from fastapi.testclient import TestClient
4-
from app.main import app
5-
from app.models import HelmTemplateGeneration, Pod, Persistance, Ingress, Environment
1+
from unittest.mock import MagicMock, patch, mock_open
62

7-
client = TestClient(app)
8-
@pytest.fixture
9-
def sample_helm_template_input():
10-
"""
11-
Provides a valid HelmTemplateGeneration object as input for tests.
12-
"""
13-
return HelmTemplateGeneration(
14-
api_version=3,
15-
pods=[
16-
Pod(
17-
name="nginx",
18-
image="nginx:latest",
19-
target_port=80,
20-
replicas=2,
21-
persistance=Persistance(enabled=False),
22-
environment=[Environment(name="DEBUG", value="true")],
23-
stateless=True,
24-
ingress=Ingress(enabled=True)
25-
),
26-
Pod(
27-
name="redis",
28-
image="redis:latest",
29-
target_port=6379,
30-
replicas=1,
31-
persistance=Persistance(enabled=True),
32-
environment=[],
33-
stateless=False,
34-
ingress=Ingress(enabled=False)
35-
)
36-
]
37-
)
383

39-
@pytest.fixture
40-
def invalid_input():
41-
"""
42-
Provides an invalid input dictionary for tests, containing various validation errors.
43-
"""
44-
return {
45-
"api_version": 0,
46-
"pods": [
47-
{
48-
"name": "",
49-
"image": "nginx:latest",
50-
"target_port": 70000,
51-
"replicas": 0,
52-
"persistance": {"size": "invalid_size", "accessModes": "InvalidMode"},
53-
"environment": [{"name": "", "value": ""}],
54-
"stateless": True,
55-
"ingress": {"enabled": True, "host": ""}
56-
}
57-
]
58-
}
4+
class TestHelmTemplate:
5+
def setup_method(self):
6+
mock_client_instance = MagicMock()
7+
mock_client_instance.chat.completions.create.return_value = MagicMock(
8+
choices=[MagicMock(message=MagicMock(content='Mocked OpenAI Response'))]
9+
)
5910

60-
@patch("app.main.execute_pythonfile")
61-
@patch("app.main.edit_directory_generator")
62-
@patch("app.main.gpt_service")
63-
def test_helm_template_generation(
64-
mock_gpt_service,
65-
mock_edit_directory_generator,
66-
mock_execute_pythonfile,
67-
sample_helm_template_input
68-
):
69-
"""
70-
Tests the /Helm-template/ endpoint with valid input.
71-
"""
72-
73-
mock_gpt_service.return_value = "Generated Python Code"
74-
response = client.post("/Helm-template/", json=sample_helm_template_input.model_dump())
75-
assert response.status_code == 200
76-
mock_gpt_service.assert_called_once()
77-
mock_edit_directory_generator.assert_called_once_with("helm_generator", "Generated Python Code")
78-
mock_execute_pythonfile.assert_called_once_with("MyHelm", "helm_generator")
11+
self.mock_execute_python_file = patch('app.main.execute_pythonfile').start()
12+
self.mock_edit_directory_generator = patch('app.main.edit_directory_generator').start()
13+
self.mock_gpt_service = patch('app.main.gpt_service', return_value='Mocked GPT Response').start()
14+
self.mock_openai = patch('app.gpt_services.OpenAI', return_value=mock_client_instance).start()
15+
self.mock_builtin_open = patch('builtins.open', mock_open()).start()
16+
self.mock_shutil_rm = patch('shutil.rmtree').start()
7917

80-
def test_helm_invalid_api(invalid_input):
81-
"""
82-
Tests the /Helm-template/ endpoint with an invalid API version.
83-
"""
84-
invalid_input = invalid_input.copy()
85-
invalid_input["api_version"] = 0
18+
self.url = '/Helm-template/'
8619

20+
def teardown_method(self):
21+
patch.stopall()
8722

88-
response = client.post("/Helm-template/", json=invalid_input)
23+
def test_helm_template_generation(self, client, helm_template_sample_input):
24+
response = client.post(self.url, json=helm_template_sample_input)
25+
assert response.status_code == 200
8926

90-
assert response.status_code == 422
27+
def test_helm_invalid_api(self, client, helm_template_invalid_sample_input):
28+
resource = client.post(self.url, json=helm_template_invalid_sample_input)
29+
assert resource.status_code == 422
9130

92-
93-
@patch("app.main.execute_pythonfile")
94-
@patch("app.main.edit_directory_generator")
95-
@patch("app.main.gpt_service")
96-
def test_helm_invalid_port(
97-
mock_gpt_service,
98-
mock_edit_directory_generator,
99-
mock_execute_pythonfile,
100-
invalid_input
101-
):
102-
"""
103-
Tests the /Helm-template/ endpoint with an invalid target port.
104-
"""
105-
invalid_input = invalid_input.copy()
106-
invalid_input["pods"][0]["target_port"] = 70000
107-
response = client.post("/Helm-template/", json=invalid_input)
108-
assert response.status_code == 422
109-
mock_gpt_service.assert_not_called()
110-
mock_edit_directory_generator.assert_not_called()
111-
mock_execute_pythonfile.assert_not_called()
31+
def test_helm_invalid_port(self, client, helm_template_invalid_sample_input):
32+
helm_template_invalid_sample_input['pods'][0]['target_port'] = 70000
33+
resource = client.post(self.url, json=helm_template_invalid_sample_input)
34+
assert resource.status_code == 422

app/tests/test_iac_basic.py

Lines changed: 18 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,25 @@
1-
import pytest
2-
from fastapi.testclient import TestClient
3-
from unittest.mock import patch
4-
from app.main import app
5-
from app.models import IaCBasicInput
1+
from unittest.mock import MagicMock, patch
62

7-
client = TestClient(app)
83

9-
@pytest.fixture
10-
def valid_iac_basic_data():
11-
return IaCBasicInput(
12-
input="How do I manage state effectively in Terraform?",
13-
service="terraform",
14-
min_tokens=100,
15-
max_tokens=500
16-
)
4+
class TestIaCBasic:
5+
def setup_method(self):
6+
mock_client_instance = MagicMock()
7+
mock_client_instance.chat.completions.create.return_value = MagicMock(
8+
choices=[MagicMock(message=MagicMock(content='Mocked OpenAI Response'))]
9+
)
1710

18-
@patch('app.main.gpt_service')
19-
def test_iac_basic_generation(mock_gpt_service, valid_iac_basic_data):
20-
"""
21-
Test the /IaC-basic/ endpoint with valid input data to ensure it returns a 200 status code.
22-
"""
23-
mock_gpt_service.return_value = "Mocked GPT response for IaC-basic"
11+
self.mock_gpt_service = patch('app.main.gpt_service', return_value='Mocked GPT Response').start()
12+
self.mock_openai = patch('app.gpt_services.OpenAI', return_value=mock_client_instance).start()
2413

25-
response = client.post("/IaC-basic/", json=valid_iac_basic_data.model_dump())
26-
assert response.status_code == 200
14+
self.url = '/IaC-basic/'
2715

16+
def teardown_method(self):
17+
patch.stopall()
2818

29-
@patch('app.main.gpt_service')
30-
def test_basic_generation_invalid_service(mock_gpt_service):
31-
"""
32-
Test the /IaC-basic/ endpoint with an invalid service to ensure it returns a 422 status code.
33-
"""
34-
invalid_input = {
35-
"input": "Create a basic configuration",
36-
"service": "invalid_service", # Unsupported service (invalid)
37-
"min_tokens": 100,
38-
"max_tokens": 500
39-
}
19+
def test_iac_basic_generation(self, client, iac_basic_sample_input):
20+
response = client.post(self.url, json=iac_basic_sample_input)
21+
assert response.status_code == 200
4022

41-
response = client.post("/IaC-basic/", json=invalid_input)
42-
assert response.status_code == 422
23+
def test_basic_generation_invalid_service(self, client, iac_basic_invalid_sample_input):
24+
response = client.post(self.url, json=iac_basic_invalid_sample_input)
25+
assert response.status_code == 422

app/tests/test_iac_bugfix.py

Lines changed: 20 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,25 @@
1-
import pytest
2-
from fastapi.testclient import TestClient
3-
from unittest.mock import patch
4-
from app.main import app
5-
from app.models import IaCBugfixInput
1+
from unittest.mock import MagicMock, patch
62

7-
client = TestClient(app)
83

9-
@pytest.fixture
10-
def valid_bugfix_data():
11-
return IaCBugfixInput(
12-
bug_description="Application fails to start on version latest",
13-
version="latest",
14-
service="terraform",
15-
min_tokens=100,
16-
max_tokens=500
17-
)
4+
class TestIaCBugFix:
5+
def setup_method(self):
6+
mock_client_instance = MagicMock()
7+
mock_client_instance.chat.completions.create.return_value = MagicMock(
8+
choices=[MagicMock(message=MagicMock(content='Mocked OpenAI Response'))]
9+
)
1810

19-
@patch('app.main.gpt_service')
20-
def test_bugfix(mock_gpt_service, valid_bugfix_data):
21-
"""
22-
Test the /IaC-bugfix/ endpoint with valid input data to ensure it returns a 200 status code.
23-
"""
24-
mock_gpt_service.return_value = "Mocked GPT response for IaC-bugfix"
11+
self.mock_gpt_service = patch('app.main.gpt_service', return_value='Mocked GPT Response').start()
12+
self.mock_openai = patch('app.gpt_services.OpenAI', return_value=mock_client_instance).start()
2513

26-
response = client.post("/IaC-bugfix/", json=valid_bugfix_data.model_dump())
27-
assert response.status_code == 200
14+
self.url = '/IaC-bugfix/'
2815

29-
30-
@patch('app.main.gpt_service')
31-
def test_bugfix_invalid(mock_gpt_service):
32-
"""
33-
Test the /IaC-bugfix/ endpoint with invalid input data to ensure it returns a 422 status code.
34-
"""
35-
invalid_input = {
36-
"bug_description": "", # Empty description
37-
"version": "latest",
38-
"service": "terraform",
39-
"min_tokens": 100,
40-
"max_tokens": 500
41-
}
42-
43-
response = client.post("/IaC-bugfix/", json=invalid_input)
44-
assert response.status_code == 422
16+
def teardown_method(self):
17+
patch.stopall()
18+
19+
def test_iac_bugfix(self, client, ias_bugfix_sample_input):
20+
response = client.post(self.url, json=ias_bugfix_sample_input)
21+
assert response.status_code == 200
22+
23+
def test_iac_bugfix_invalid_input(self, client, iac_bugfix_invalid_sample_input):
24+
response = client.post(self.url, json=iac_bugfix_invalid_sample_input)
25+
assert response.status_code == 422

0 commit comments

Comments
 (0)