Skip to content

Commit fb3f08c

Browse files
author
Nikita Filonov
committed
tests
1 parent 1b09bc6 commit fb3f08c

File tree

8 files changed

+413
-8
lines changed

8 files changed

+413
-8
lines changed

conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
pytest_plugins = (
22
"swagger_coverage_tool.tests.fixtures.http",
33
"swagger_coverage_tool.tests.fixtures.config",
4+
"swagger_coverage_tool.tests.fixtures.reports",
45
"swagger_coverage_tool.tests.fixtures.history",
56
"swagger_coverage_tool.tests.fixtures.tracker",
67
)

swagger_coverage_tool/tests/fixtures/config.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,15 @@ def settings() -> Settings:
2121

2222

2323
@pytest.fixture
24-
def coverage_history_settings(tmp_path: Path) -> Settings:
25-
config = Settings(
26-
services=[],
27-
results_dir=tmp_path / "results",
28-
)
29-
config.history_file = tmp_path / "history.json"
30-
config.history_retention_limit = 3
31-
return config
24+
def coverage_history_settings(tmp_path: Path, settings: Settings) -> Settings:
25+
settings.results_dir = tmp_path / "results"
26+
settings.history_file = tmp_path / "history.json"
27+
settings.history_retention_limit = 3
28+
return settings
29+
30+
31+
@pytest.fixture
32+
def reports_settings(tmp_path: Path, coverage_history_settings: Settings) -> Settings:
33+
coverage_history_settings.json_report_file = tmp_path / "report.json"
34+
coverage_history_settings.html_report_file = tmp_path / "report.html"
35+
return coverage_history_settings

swagger_coverage_tool/tests/fixtures/history.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,19 @@
33
from swagger_coverage_tool.config import Settings
44
from swagger_coverage_tool.src.history.builder import SwaggerServiceCoverageHistoryBuilder
55
from swagger_coverage_tool.src.history.models import ServiceCoverageHistory
6+
from swagger_coverage_tool.src.history.storage import SwaggerCoverageHistoryStorage
67

78

89
@pytest.fixture
910
def service_coverage_history() -> ServiceCoverageHistory:
1011
return ServiceCoverageHistory()
1112

1213

14+
@pytest.fixture
15+
def coverage_history_storage(coverage_history_settings: Settings) -> SwaggerCoverageHistoryStorage:
16+
return SwaggerCoverageHistoryStorage(coverage_history_settings)
17+
18+
1319
@pytest.fixture
1420
def service_coverage_history_builder(
1521
service_coverage_history: ServiceCoverageHistory,
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
from datetime import datetime
2+
3+
import pytest
4+
5+
from swagger_coverage_tool.config import Settings
6+
from swagger_coverage_tool.src.coverage.models import ServiceCoverage, ServiceEndpointCoverage
7+
from swagger_coverage_tool.src.coverage.status import ServiceEndpointCoverageStatus
8+
from swagger_coverage_tool.src.history.models import CoverageHistory
9+
from swagger_coverage_tool.src.reports.models import CoverageReportState
10+
from swagger_coverage_tool.src.reports.storage import SwaggerReportsStorage
11+
from swagger_coverage_tool.src.tools.http import HTTPMethod
12+
from swagger_coverage_tool.src.tools.types import ServiceKey, CoveragePercent, EndpointName
13+
14+
15+
@pytest.fixture
16+
def coverage_report_state(coverage_history_settings: Settings) -> CoverageReportState:
17+
service_key = ServiceKey("test-service")
18+
19+
fake_service_coverage = ServiceCoverage(
20+
total_coverage_history=[
21+
CoverageHistory(created_at=datetime.now(), total_coverage=CoveragePercent(88.0))
22+
],
23+
endpoints=[
24+
ServiceEndpointCoverage(
25+
name=EndpointName("get_users"),
26+
method=HTTPMethod.GET,
27+
coverage=ServiceEndpointCoverageStatus.COVERED,
28+
total_cases=1,
29+
status_codes=[],
30+
query_parameters=[],
31+
request_coverage=ServiceEndpointCoverageStatus.COVERED,
32+
total_coverage_history=[
33+
CoverageHistory(
34+
created_at=datetime.now(),
35+
total_coverage=CoveragePercent(55.0),
36+
)
37+
],
38+
)
39+
],
40+
)
41+
42+
report = CoverageReportState.init(coverage_history_settings)
43+
report.services_coverage = {service_key: fake_service_coverage}
44+
return report
45+
46+
47+
@pytest.fixture
48+
def reports_storage(reports_settings: Settings) -> SwaggerReportsStorage:
49+
return SwaggerReportsStorage(reports_settings)
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
import json
2+
from datetime import datetime
3+
from pathlib import Path
4+
5+
import pytest
6+
7+
from swagger_coverage_tool.config import Settings
8+
from swagger_coverage_tool.src.history.endpoint import build_endpoint_key
9+
from swagger_coverage_tool.src.history.models import CoverageHistoryState, ServiceCoverageHistory, CoverageHistory
10+
from swagger_coverage_tool.src.history.storage import SwaggerCoverageHistoryStorage
11+
from swagger_coverage_tool.src.reports.models import CoverageReportState
12+
from swagger_coverage_tool.src.tools.http import HTTPMethod
13+
from swagger_coverage_tool.src.tools.types import ServiceKey, CoveragePercent, EndpointName
14+
15+
16+
# -------------------------------
17+
# TEST: load
18+
# -------------------------------
19+
20+
def test_load_returns_empty_if_no_history_file(
21+
coverage_history_storage: SwaggerCoverageHistoryStorage,
22+
coverage_history_settings: Settings,
23+
):
24+
coverage_history_settings.history_file = None
25+
26+
result = coverage_history_storage.load()
27+
assert isinstance(result, CoverageHistoryState)
28+
assert result.services == {}
29+
30+
31+
def test_load_returns_empty_if_file_not_exists(
32+
coverage_history_storage: SwaggerCoverageHistoryStorage,
33+
coverage_history_settings: Settings,
34+
):
35+
assert not coverage_history_settings.history_file.exists()
36+
37+
result = coverage_history_storage.load()
38+
assert isinstance(result, CoverageHistoryState)
39+
assert result.services == {}
40+
41+
42+
def test_load_reads_and_parses_valid_json(
43+
coverage_history_storage: SwaggerCoverageHistoryStorage,
44+
coverage_history_settings: Settings,
45+
):
46+
state = CoverageHistoryState(
47+
services={
48+
ServiceKey("test-service"): ServiceCoverageHistory(
49+
total_coverage_history=[
50+
CoverageHistory(created_at=datetime.now(), total_coverage=CoveragePercent(90.0))
51+
]
52+
)
53+
}
54+
)
55+
coverage_history_settings.history_file.write_text(state.model_dump_json(by_alias=True))
56+
57+
result = coverage_history_storage.load()
58+
assert isinstance(result, CoverageHistoryState)
59+
assert "test-service" in result.services
60+
61+
62+
def test_load_handles_invalid_json(
63+
coverage_history_storage: SwaggerCoverageHistoryStorage,
64+
coverage_history_settings: Settings,
65+
):
66+
coverage_history_settings.history_file.write_text("{ invalid json }")
67+
68+
result = coverage_history_storage.load()
69+
assert isinstance(result, CoverageHistoryState)
70+
assert result.services == {}
71+
72+
73+
# -------------------------------
74+
# TEST: save
75+
# -------------------------------
76+
77+
def test_save_creates_and_writes_file(
78+
coverage_history_storage: SwaggerCoverageHistoryStorage,
79+
coverage_history_settings: Settings,
80+
):
81+
state = CoverageHistoryState(
82+
services={
83+
ServiceKey("test-service"): ServiceCoverageHistory(
84+
total_coverage_history=[
85+
CoverageHistory(created_at=datetime.now(), total_coverage=CoveragePercent(75.0))
86+
]
87+
)
88+
}
89+
)
90+
91+
coverage_history_storage.save(state)
92+
93+
assert coverage_history_settings.history_file.exists()
94+
content = json.loads(coverage_history_settings.history_file.read_text())
95+
assert "services" in content
96+
97+
98+
def test_save_logs_error(
99+
caplog,
100+
monkeypatch: pytest.MonkeyPatch,
101+
coverage_history_storage: SwaggerCoverageHistoryStorage,
102+
):
103+
state = CoverageHistoryState()
104+
105+
def mock_write_text(_):
106+
raise OSError("disk full")
107+
108+
monkeypatch.setattr(Path, "write_text", mock_write_text)
109+
coverage_history_storage.save(state)
110+
111+
assert any("Error saving history" in message for message in caplog.messages)
112+
113+
114+
# -------------------------------
115+
# TEST: save_from_report
116+
# -------------------------------
117+
118+
def test_save_from_report_builds_correct_state(
119+
monkeypatch: pytest.MonkeyPatch,
120+
coverage_report_state: CoverageReportState,
121+
coverage_history_storage: SwaggerCoverageHistoryStorage,
122+
):
123+
called = {}
124+
125+
def mock_save(state: CoverageHistoryState):
126+
called["state"] = state
127+
128+
monkeypatch.setattr(coverage_history_storage, "save", mock_save)
129+
130+
coverage_history_storage.save_from_report(coverage_report_state)
131+
132+
assert "state" in called
133+
state = called["state"]
134+
135+
assert isinstance(state, CoverageHistoryState)
136+
137+
service_key = ServiceKey("test-service")
138+
assert service_key in state.services
139+
140+
service_state = state.services[service_key]
141+
assert isinstance(service_state, ServiceCoverageHistory)
142+
assert service_state.total_coverage_history[0].total_coverage == 88.0
143+
144+
key = build_endpoint_key(EndpointName("get_users"), HTTPMethod.GET)
145+
assert key in service_state.endpoints_total_coverage_history
146+
assert service_state.endpoints_total_coverage_history[key][0].total_coverage == 55.0

swagger_coverage_tool/tests/suites/src/reports/__init__.py

Whitespace-only changes.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from datetime import datetime
2+
3+
from swagger_coverage_tool.config import Settings
4+
from swagger_coverage_tool.src.reports.models import (
5+
CoverageReportState,
6+
CoverageReportConfig,
7+
CoverageReportServiceConfig,
8+
)
9+
10+
11+
def test_init_creates_valid_report_state(settings: Settings):
12+
state = CoverageReportState.init(settings)
13+
14+
assert isinstance(state, CoverageReportState)
15+
assert isinstance(state.config, CoverageReportConfig)
16+
assert isinstance(state.created_at, datetime)
17+
assert isinstance(state.services_coverage, dict)
18+
assert state.services_coverage == {}
19+
20+
assert len(state.config.services) == len(settings.services)
21+
first_service = state.config.services[0]
22+
assert isinstance(first_service, CoverageReportServiceConfig)
23+
assert first_service.key == settings.services[0].key
24+
assert first_service.name == settings.services[0].name
25+
assert str(first_service.swagger_url) == str(settings.services[0].swagger_url)
26+
27+
28+
def test_init_with_empty_settings():
29+
empty_settings = Settings(services=[])
30+
state = CoverageReportState.init(empty_settings)
31+
32+
assert isinstance(state, CoverageReportState)
33+
assert state.config.services == []
34+
assert state.services_coverage == {}
35+
assert isinstance(state.created_at, datetime)
36+
37+
38+
def test_init_creates_distinct_instances(settings: Settings):
39+
state1 = CoverageReportState.init(settings)
40+
state2 = CoverageReportState.init(settings)
41+
42+
assert state1 is not state2
43+
assert state1.created_at != state2.created_at
44+
assert state1.config.services[0].key == state2.config.services[0].key
45+
assert isinstance(state1.config.services[0], CoverageReportServiceConfig)

0 commit comments

Comments
 (0)