88import pytest
99
1010from tim_mcp .clients .github_client import GitHubClient
11- from tim_mcp .clients .terraform_client import TerraformClient
11+ from tim_mcp .clients .terraform_client import TerraformClient , is_prerelease_version
1212from tim_mcp .exceptions import ModuleNotFoundError
1313
1414
@@ -31,6 +31,41 @@ def mock_cache():
3131class TestTerraformClient :
3232 """Tests for the TerraformClient class."""
3333
34+ def test_is_prerelease_version_with_beta (self ):
35+ """Test identifying beta versions as pre-release."""
36+ assert is_prerelease_version ("1.0.0-beta" ) is True
37+ assert is_prerelease_version ("2.1.0-beta.1" ) is True
38+
39+ def test_is_prerelease_version_with_alpha (self ):
40+ """Test identifying alpha versions as pre-release."""
41+ assert is_prerelease_version ("1.0.0-alpha" ) is True
42+ assert is_prerelease_version ("3.2.1-alpha.2" ) is True
43+
44+ def test_is_prerelease_version_with_rc (self ):
45+ """Test identifying release candidate versions as pre-release."""
46+ assert is_prerelease_version ("1.0.0-rc" ) is True
47+ assert is_prerelease_version ("2.0.0-rc.1" ) is True
48+
49+ def test_is_prerelease_version_with_draft (self ):
50+ """Test identifying draft versions as pre-release."""
51+ assert is_prerelease_version ("2.0.1-draft" ) is True
52+ assert is_prerelease_version ("2.0.1-draft-addons" ) is True # Real example from issue #20
53+
54+ def test_is_prerelease_version_stable (self ):
55+ """Test that stable versions are not identified as pre-release."""
56+ assert is_prerelease_version ("1.0.0" ) is False
57+ assert is_prerelease_version ("2.5.3" ) is False
58+ assert is_prerelease_version ("10.20.30" ) is False
59+
60+ def test_is_prerelease_version_edge_cases (self ):
61+ """Test edge cases for version identification."""
62+ # Version with metadata but no pre-release identifier
63+ assert is_prerelease_version ("1.0.0+build.123" ) is False
64+ # Empty string
65+ assert is_prerelease_version ("" ) is False
66+ # Invalid format
67+ assert is_prerelease_version ("invalid" ) is False
68+
3469 @pytest .fixture
3570 def mock_session (self ):
3671 """Create a mock requests session."""
@@ -125,6 +160,65 @@ async def test_get_module_versions(self, terraform_client, mock_cache):
125160 "/modules/hashicorp/consul/aws/versions"
126161 )
127162
163+ @pytest .mark .asyncio
164+ async def test_get_module_versions_filters_prerelease (self , terraform_client , mock_cache ):
165+ """Test that pre-release versions are filtered out."""
166+ # Setup - mix of stable and pre-release versions
167+ mock_response = MagicMock ()
168+ mock_response .json .return_value = {
169+ "modules" : [
170+ {"version" : "1.0.0" },
171+ {"version" : "1.1.0-beta" },
172+ {"version" : "1.2.0" },
173+ {"version" : "2.0.0-draft" },
174+ {"version" : "2.0.1-draft-addons" }, # Real example from issue #20
175+ {"version" : "2.1.0-rc.1" },
176+ {"version" : "2.2.0" },
177+ {"version" : "3.0.0-alpha" },
178+ ]
179+ }
180+ mock_response .raise_for_status = MagicMock ()
181+ mock_response .status_code = 200
182+ terraform_client .client .get = AsyncMock (return_value = mock_response )
183+
184+ # Execute
185+ result = await terraform_client .get_module_versions (
186+ "terraform-ibm-modules" , "db2-cloud" , "ibm"
187+ )
188+
189+ # Verify - only stable versions returned
190+ assert result == ["1.0.0" , "1.2.0" , "2.2.0" ]
191+ terraform_client .client .get .assert_called_once_with (
192+ "/modules/terraform-ibm-modules/db2-cloud/ibm/versions"
193+ )
194+
195+ @pytest .mark .asyncio
196+ async def test_get_module_versions_all_prerelease (self , terraform_client , mock_cache ):
197+ """Test behavior when all versions are pre-release."""
198+ # Setup - only pre-release versions
199+ mock_response = MagicMock ()
200+ mock_response .json .return_value = {
201+ "modules" : [
202+ {"version" : "1.0.0-beta" },
203+ {"version" : "1.1.0-alpha" },
204+ {"version" : "2.0.0-rc.1" },
205+ ]
206+ }
207+ mock_response .raise_for_status = MagicMock ()
208+ mock_response .status_code = 200
209+ terraform_client .client .get = AsyncMock (return_value = mock_response )
210+
211+ # Execute
212+ result = await terraform_client .get_module_versions (
213+ "terraform-ibm-modules" , "test-module" , "ibm"
214+ )
215+
216+ # Verify - empty list when all are pre-release
217+ assert result == []
218+ terraform_client .client .get .assert_called_once_with (
219+ "/modules/terraform-ibm-modules/test-module/ibm/versions"
220+ )
221+
128222
129223class TestGitHubClient :
130224 """Tests for the GitHubClient class."""
0 commit comments