diff --git a/prowler/CHANGELOG.md b/prowler/CHANGELOG.md index ba4722b335..cd7785d820 100644 --- a/prowler/CHANGELOG.md +++ b/prowler/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to the **Prowler SDK** are documented in this file. ### Changed ### Fixed +- Renamed `AdditionalUrls` to `AdditionalURLs` field in CheckMetadata [(#8639)](https://github.com/prowler-cloud/prowler/pull/8639) --- diff --git a/prowler/lib/check/models.py b/prowler/lib/check/models.py index 547dc1d94b..02813edc76 100644 --- a/prowler/lib/check/models.py +++ b/prowler/lib/check/models.py @@ -85,7 +85,7 @@ class CheckMetadata(BaseModel): Risk (str): The risk associated with the check. RelatedUrl (str): The URL related to the check. Remediation (Remediation): The remediation steps for the check. - AdditionalUrls (list[str]): Additional URLs related to the check. Defaults to an empty list. + AdditionalURLs (list[str]): Additional URLs related to the check. Defaults to an empty list. Categories (list[str]): The categories of the check. DependsOn (list[str]): The dependencies of the check. RelatedTo (list[str]): The related checks. @@ -98,7 +98,7 @@ class CheckMetadata(BaseModel): valid_severity(severity): Validator function to validate the severity of the check. valid_cli_command(remediation): Validator function to validate the CLI command is not an URL. valid_resource_type(resource_type): Validator function to validate the resource type is not empty. - validate_additional_urls(additional_urls): Validator function to ensure AdditionalUrls contains no duplicates. + validate_additional_urls(additional_urls): Validator function to ensure AdditionalURLs contains no duplicates. """ Provider: str @@ -115,7 +115,7 @@ class CheckMetadata(BaseModel): Risk: str RelatedUrl: str Remediation: Remediation - AdditionalUrls: list[str] = Field(default_factory=list) + AdditionalURLs: list[str] = Field(default_factory=list) Categories: list[str] DependsOn: list[str] RelatedTo: list[str] @@ -181,16 +181,16 @@ class CheckMetadata(BaseModel): return check_id - @validator("AdditionalUrls", pre=True, always=True) + @validator("AdditionalURLs", pre=True, always=True) def validate_additional_urls(cls, additional_urls): if not isinstance(additional_urls, list): - raise ValueError("AdditionalUrls must be a list") + raise ValueError("AdditionalURLs must be a list") if any(not url or not url.strip() for url in additional_urls): - raise ValueError("AdditionalUrls cannot contain empty items") + raise ValueError("AdditionalURLs cannot contain empty items") if len(additional_urls) != len(set(additional_urls)): - raise ValueError("AdditionalUrls cannot contain duplicate items") + raise ValueError("AdditionalURLs cannot contain duplicate items") return additional_urls diff --git a/tests/lib/check/models_test.py b/tests/lib/check/models_test.py index 341d696ee3..a992da946c 100644 --- a/tests/lib/check/models_test.py +++ b/tests/lib/check/models_test.py @@ -330,7 +330,7 @@ class TestCheckMetada: assert result == set() def test_additional_urls_valid_empty_list(self): - """Test AdditionalUrls with valid empty list (default)""" + """Test AdditionalURLs with valid empty list (default)""" metadata = CheckMetadata( Provider="aws", CheckID="test_check", @@ -357,13 +357,13 @@ class TestCheckMetada: DependsOn=["dependency1"], RelatedTo=["related1"], Notes="notes1", - AdditionalUrls=[], + AdditionalURLs=[], Compliance=[], ) - assert metadata.AdditionalUrls == [] + assert metadata.AdditionalURLs == [] def test_additional_urls_valid_with_urls(self): - """Test AdditionalUrls with valid URLs""" + """Test AdditionalURLs with valid URLs""" valid_urls = [ "https://example.com/doc1", "https://example.com/doc2", @@ -395,13 +395,13 @@ class TestCheckMetada: DependsOn=["dependency1"], RelatedTo=["related1"], Notes="notes1", - AdditionalUrls=valid_urls, + AdditionalURLs=valid_urls, Compliance=[], ) - assert metadata.AdditionalUrls == valid_urls + assert metadata.AdditionalURLs == valid_urls def test_additional_urls_invalid_not_list(self): - """Test AdditionalUrls with non-list value""" + """Test AdditionalURLs with non-list value""" with pytest.raises(ValidationError) as exc_info: CheckMetadata( Provider="aws", @@ -429,13 +429,13 @@ class TestCheckMetada: DependsOn=["dependency1"], RelatedTo=["related1"], Notes="notes1", - AdditionalUrls="not_a_list", + AdditionalURLs="not_a_list", Compliance=[], ) - assert "AdditionalUrls must be a list" in str(exc_info.value) + assert "AdditionalURLs must be a list" in str(exc_info.value) def test_additional_urls_invalid_empty_items(self): - """Test AdditionalUrls with empty string items""" + """Test AdditionalURLs with empty string items""" with pytest.raises(ValidationError) as exc_info: CheckMetadata( Provider="aws", @@ -463,13 +463,13 @@ class TestCheckMetada: DependsOn=["dependency1"], RelatedTo=["related1"], Notes="notes1", - AdditionalUrls=["https://example.com", "", "https://example2.com"], + AdditionalURLs=["https://example.com", "", "https://example2.com"], Compliance=[], ) - assert "AdditionalUrls cannot contain empty items" in str(exc_info.value) + assert "AdditionalURLs cannot contain empty items" in str(exc_info.value) def test_additional_urls_invalid_whitespace_items(self): - """Test AdditionalUrls with whitespace-only items""" + """Test AdditionalURLs with whitespace-only items""" with pytest.raises(ValidationError) as exc_info: CheckMetadata( Provider="aws", @@ -497,13 +497,13 @@ class TestCheckMetada: DependsOn=["dependency1"], RelatedTo=["related1"], Notes="notes1", - AdditionalUrls=["https://example.com", " ", "https://example2.com"], + AdditionalURLs=["https://example.com", " ", "https://example2.com"], Compliance=[], ) - assert "AdditionalUrls cannot contain empty items" in str(exc_info.value) + assert "AdditionalURLs cannot contain empty items" in str(exc_info.value) def test_additional_urls_invalid_duplicates(self): - """Test AdditionalUrls with duplicate items""" + """Test AdditionalURLs with duplicate items""" with pytest.raises(ValidationError) as exc_info: CheckMetadata( Provider="aws", @@ -531,17 +531,17 @@ class TestCheckMetada: DependsOn=["dependency1"], RelatedTo=["related1"], Notes="notes1", - AdditionalUrls=[ + AdditionalURLs=[ "https://example.com", "https://example2.com", "https://example.com", ], Compliance=[], ) - assert "AdditionalUrls cannot contain duplicate items" in str(exc_info.value) + assert "AdditionalURLs cannot contain duplicate items" in str(exc_info.value) def test_fields_with_explicit_empty_values(self): - """Test that RelatedUrl and AdditionalUrls can be set to explicit empty values""" + """Test that RelatedUrl and AdditionalURLs can be set to explicit empty values""" metadata = CheckMetadata( Provider="aws", CheckID="test_check_empty_fields", @@ -568,16 +568,16 @@ class TestCheckMetada: DependsOn=["dependency1"], RelatedTo=["related1"], Notes="notes1", - AdditionalUrls=[], # Explicit empty list + AdditionalURLs=[], # Explicit empty list Compliance=[], ) # Assert that the fields are set to empty values assert metadata.RelatedUrl == "" - assert metadata.AdditionalUrls == [] + assert metadata.AdditionalURLs == [] def test_fields_default_values(self): - """Test that RelatedUrl and AdditionalUrls use proper defaults when not provided""" + """Test that RelatedUrl and AdditionalURLs use proper defaults when not provided""" metadata = CheckMetadata( Provider="aws", CheckID="test_check_defaults", @@ -604,13 +604,13 @@ class TestCheckMetada: DependsOn=["dependency1"], RelatedTo=["related1"], Notes="notes1", - # AdditionalUrls not provided - should default to empty list via default_factory + # AdditionalURLs not provided - should default to empty list via default_factory Compliance=[], ) # Assert that the fields use their default values assert metadata.RelatedUrl == "" # Should default to empty string - assert metadata.AdditionalUrls == [] # Should default to empty list + assert metadata.AdditionalURLs == [] # Should default to empty list def test_related_url_none_fails(self): """Test that setting RelatedUrl to None raises a ValidationError""" @@ -641,19 +641,19 @@ class TestCheckMetada: DependsOn=["dependency1"], RelatedTo=["related1"], Notes="notes1", - AdditionalUrls=[], + AdditionalURLs=[], Compliance=[], ) # Should contain a validation error for RelatedUrl assert "RelatedUrl" in str(exc_info.value) def test_additional_urls_none_fails(self): - """Test that setting AdditionalUrls to None raises a ValidationError""" + """Test that setting AdditionalURLs to None raises a ValidationError""" with pytest.raises(ValidationError) as exc_info: CheckMetadata( Provider="aws", CheckID="test_check_none_additional_urls", - CheckTitle="Test Check with None AdditionalUrls", + CheckTitle="Test Check with None AdditionalURLs", CheckType=["type1"], ServiceName="test", SubServiceName="subservice1", @@ -676,19 +676,19 @@ class TestCheckMetada: DependsOn=["dependency1"], RelatedTo=["related1"], Notes="notes1", - AdditionalUrls=None, # This should fail + AdditionalURLs=None, # This should fail Compliance=[], ) # Should contain the validation error we set in the validator - assert "AdditionalUrls must be a list" in str(exc_info.value) + assert "AdditionalURLs must be a list" in str(exc_info.value) def test_additional_urls_invalid_type_fails(self): - """Test that setting AdditionalUrls to non-list value raises a ValidationError""" + """Test that setting AdditionalURLs to non-list value raises a ValidationError""" with pytest.raises(ValidationError) as exc_info: CheckMetadata( Provider="aws", CheckID="test_check_invalid_additional_urls", - CheckTitle="Test Check with Invalid AdditionalUrls", + CheckTitle="Test Check with Invalid AdditionalURLs", CheckType=["type1"], ServiceName="test", SubServiceName="subservice1", @@ -711,8 +711,8 @@ class TestCheckMetada: DependsOn=["dependency1"], RelatedTo=["related1"], Notes="notes1", - AdditionalUrls="not_a_list", # This should fail + AdditionalURLs="not_a_list", # This should fail Compliance=[], ) # Should contain the validation error we set in the validator - assert "AdditionalUrls must be a list" in str(exc_info.value) + assert "AdditionalURLs must be a list" in str(exc_info.value)