diff --git a/.github/workflows/sdk-check-duplicate-test-names.yml b/.github/workflows/sdk-check-duplicate-test-names.yml new file mode 100644 index 0000000000..45bd01bc41 --- /dev/null +++ b/.github/workflows/sdk-check-duplicate-test-names.yml @@ -0,0 +1,91 @@ +name: 'SDK: Check Duplicate Test Names' + +on: + pull_request: + branches: + - 'master' + - 'v5.*' + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + check-duplicate-test-names: + if: github.repository == 'prowler-cloud/prowler' + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: read + + steps: + - name: Checkout repository + uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 + + - name: Check for duplicate test names across providers + run: | + python3 << 'EOF' + import sys + from collections import defaultdict + from pathlib import Path + + def find_duplicate_test_names(): + """Find test files with the same name across different providers.""" + tests_dir = Path("tests/providers") + + if not tests_dir.exists(): + print("tests/providers directory not found") + sys.exit(0) + + # Dictionary: filename -> list of (provider, full_path) + test_files = defaultdict(list) + + # Find all *_test.py files + for test_file in tests_dir.rglob("*_test.py"): + relative_path = test_file.relative_to(tests_dir) + provider = relative_path.parts[0] + filename = test_file.name + test_files[filename].append((provider, str(test_file))) + + # Find duplicates (files appearing in multiple providers) + duplicates = { + filename: locations + for filename, locations in test_files.items() + if len(set(loc[0] for loc in locations)) > 1 + } + + if not duplicates: + print("No duplicate test file names found across providers.") + print("All test names are unique within the repository.") + sys.exit(0) + + # Report duplicates + print("::error::Duplicate test file names found across providers!") + print() + print("=" * 70) + print("DUPLICATE TEST NAMES DETECTED") + print("=" * 70) + print() + print("The following test files have the same name in multiple providers.") + print("Please rename YOUR new test file by adding the provider prefix.") + print() + print("Example: 'kms_service_test.py' -> 'oraclecloud_kms_service_test.py'") + print() + + for filename, locations in sorted(duplicates.items()): + print(f"### {filename}") + print(f" Found in {len(locations)} providers:") + for provider, path in sorted(locations): + print(f" - {provider}: {path}") + print() + print(f" Suggested fix: Rename your new file to '_{filename}'") + print() + + print("=" * 70) + print() + print("See: tests/providers/TESTING.md for naming conventions.") + sys.exit(1) + + if __name__ == "__main__": + find_duplicate_test_names() + EOF diff --git a/docs/developer-guide/unit-testing.mdx b/docs/developer-guide/unit-testing.mdx index b08b98f33c..ca6d068bd4 100644 --- a/docs/developer-guide/unit-testing.mdx +++ b/docs/developer-guide/unit-testing.mdx @@ -35,6 +35,16 @@ Create tests that generate both a passing (`PASS`) and a failing (`FAIL`) result 3. Multi-Resource Evaluations: Design tests with multiple resources to verify check behavior and ensure the correct number of findings. +## Test File Naming Conventions + +Test files follow the pattern `{service}_{check_name}_test.py` for checks and `{service}_service_test.py` for services. + +### Duplicate Names Across Providers + +When a test file name already exists in another provider, add your provider prefix to avoid conflicts. A GitHub Action will fail if duplicate names are detected. + +**Example:** If `kms_service_test.py` already exists in AWS, name your Oracle Cloud test `oraclecloud_kms_service_test.py`. + ## Running Prowler Tests To execute the Prowler test suite, install the necessary dependencies listed in the `pyproject.toml` file. diff --git a/tests/providers/alibabacloud/services/ecs/ecs_service_test.py b/tests/providers/alibabacloud/services/ecs/alibabacloud_ecs_service_test.py similarity index 100% rename from tests/providers/alibabacloud/services/ecs/ecs_service_test.py rename to tests/providers/alibabacloud/services/ecs/alibabacloud_ecs_service_test.py diff --git a/tests/providers/alibabacloud/services/rds/rds_service_test.py b/tests/providers/alibabacloud/services/rds/alibabacloud_rds_service_test.py similarity index 100% rename from tests/providers/alibabacloud/services/rds/rds_service_test.py rename to tests/providers/alibabacloud/services/rds/alibabacloud_rds_service_test.py diff --git a/tests/providers/alibabacloud/services/vpc/vpc_service_test.py b/tests/providers/alibabacloud/services/vpc/alibabacloud_vpc_service_test.py similarity index 100% rename from tests/providers/alibabacloud/services/vpc/vpc_service_test.py rename to tests/providers/alibabacloud/services/vpc/alibabacloud_vpc_service_test.py diff --git a/tests/providers/alibabacloud/services/vpc/vpc_flow_logs_enabled/vpc_flow_logs_enabled_test.py b/tests/providers/alibabacloud/services/vpc/vpc_flow_logs_enabled/alibabacloud_vpc_flow_logs_enabled_test.py similarity index 100% rename from tests/providers/alibabacloud/services/vpc/vpc_flow_logs_enabled/vpc_flow_logs_enabled_test.py rename to tests/providers/alibabacloud/services/vpc/vpc_flow_logs_enabled/alibabacloud_vpc_flow_logs_enabled_test.py diff --git a/tests/providers/oraclecloud/services/compute/compute_service_test.py b/tests/providers/oraclecloud/services/compute/oraclecloud_compute_service_test.py similarity index 100% rename from tests/providers/oraclecloud/services/compute/compute_service_test.py rename to tests/providers/oraclecloud/services/compute/oraclecloud_compute_service_test.py diff --git a/tests/providers/oraclecloud/services/kms/kms_key_rotation_enabled/kms_key_rotation_enabled_test.py b/tests/providers/oraclecloud/services/kms/kms_key_rotation_enabled/oraclecloud_kms_key_rotation_enabled_test.py similarity index 100% rename from tests/providers/oraclecloud/services/kms/kms_key_rotation_enabled/kms_key_rotation_enabled_test.py rename to tests/providers/oraclecloud/services/kms/kms_key_rotation_enabled/oraclecloud_kms_key_rotation_enabled_test.py diff --git a/tests/providers/oraclecloud/services/kms/kms_service_test.py b/tests/providers/oraclecloud/services/kms/oraclecloud_kms_service_test.py similarity index 100% rename from tests/providers/oraclecloud/services/kms/kms_service_test.py rename to tests/providers/oraclecloud/services/kms/oraclecloud_kms_service_test.py diff --git a/tests/providers/oraclecloud/services/logging/logging_service_test.py b/tests/providers/oraclecloud/services/logging/oraclecloud_logging_service_test.py similarity index 100% rename from tests/providers/oraclecloud/services/logging/logging_service_test.py rename to tests/providers/oraclecloud/services/logging/oraclecloud_logging_service_test.py diff --git a/tests/providers/oraclecloud/services/network/network_service_test.py b/tests/providers/oraclecloud/services/network/oraclecloud_network_service_test.py similarity index 100% rename from tests/providers/oraclecloud/services/network/network_service_test.py rename to tests/providers/oraclecloud/services/network/oraclecloud_network_service_test.py