| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| --> |
| |
| # Licensed to the Apache Software Foundation (ASF) under one |
| |
| # or more contributor license agreements. See the NOTICE file |
| |
| # distributed with this work for additional information |
| |
| # regarding copyright ownership. The ASF licenses this file |
| |
| # to you under the Apache License, Version 2.0 (the |
| |
| # "License"); you may not use this file except in compliance |
| |
| # with the License. You may obtain a copy of the License at |
| |
| # |
| |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| |
| # |
| |
| # Unless required by applicable law or agreed to in writing, |
| |
| # software distributed under the License is distributed on an |
| |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| |
| # KIND, either express or implied. See the License for the |
| |
| # specific language governing permissions and limitations |
| |
| # under the License. |
| |
| # Superset CLI Tests |
| |
| This directory contains tests for the superset-extensions-cli package, focusing on the `init` command and other CLI functionality. |
| |
| ## Test Structure |
| |
| ### Core Test Files |
| |
| - **`test_cli_init.py`**: Comprehensive tests for the `init` command scaffolder |
| - **`test_templates.py`**: Unit tests for Jinja2 template rendering |
| - **`conftest.py`**: Pytest fixtures and configuration |
| - **`utils.py`**: Reusable testing utilities and helpers |
| |
| ### Test Categories |
| |
| #### Unit Tests (`@pytest.mark.unit`) |
| |
| - Template rendering functionality |
| - Individual function testing |
| - Input validation logic |
| |
| #### Integration Tests (`@pytest.mark.integration`) |
| |
| - Complete CLI command workflows |
| - End-to-end scaffolding processes |
| |
| #### CLI Tests (`@pytest.mark.cli`) |
| |
| - Click command interface testing |
| - User input simulation |
| - Command output verification |
| |
| ## Testing Approach for Scaffolders/Generators |
| |
| The tests use these patterns for testing code generators: |
| |
| ### 1. Isolated Environment Testing |
| |
| ```python |
| @pytest.fixture |
| def isolated_filesystem(tmp_path): |
| """Provide isolated temporary directory for each test.""" |
| ``` |
| |
| ### 2. Click CLI Testing Framework |
| |
| ```python |
| from click.testing import CliRunner |
| runner = CliRunner() |
| result = runner.invoke(app, ["init"], input="...") |
| ``` |
| |
| ### 3. File Structure Validation |
| |
| ```python |
| from tests.utils import assert_file_structure, assert_directory_structure |
| assert_file_structure(extension_path, expected_files) |
| ``` |
| |
| ### 4. Template Content Verification |
| |
| ```python |
| from tests.utils import assert_json_content |
| assert_json_content(json_path, {"name": "expected_value"}) |
| ``` |
| |
| ### 5. Parametrized Testing |
| |
| ```python |
| @pytest.mark.parametrize("include_frontend,include_backend", [ |
| (True, True), (True, False), (False, True), (False, False) |
| ]) |
| ``` |
| |
| ## Key Test Cases |
| |
| ### Init Command Tests |
| |
| - ✅ Creates extension with both frontend and backend |
| - ✅ Creates frontend-only extensions |
| - ✅ Creates backend-only extensions |
| - ✅ Validates extension naming (alphanumeric + underscore only) |
| - ✅ Handles existing directory conflicts |
| - ✅ Verifies generated file content accuracy |
| - ✅ Tests custom version and license inputs |
| - ✅ Integration test for complete workflow |
| |
| ### Template Rendering Tests |
| |
| - ✅ Extension.json template with various configurations |
| - ✅ Package.json template rendering |
| - ✅ Pyproject.toml template rendering |
| - ✅ Template validation with different names/versions/licenses |
| - ✅ JSON validity verification |
| - ✅ Whitespace and formatting checks |
| |
| ## Running Tests |
| |
| ### All tests |
| |
| ```bash |
| pytest |
| ``` |
| |
| ### Specific test categories |
| |
| ```bash |
| pytest -m unit # Unit tests only |
| pytest -m integration # Integration tests only |
| pytest -m cli # CLI tests only |
| ``` |
| |
| ### With coverage |
| |
| ```bash |
| pytest --cov=superset_extensions_cli --cov-report=html |
| ``` |
| |
| ### Specific test files |
| |
| ```bash |
| pytest tests/test_cli_init.py |
| pytest tests/test_templates.py |
| ``` |
| |
| ## Reusable Testing Infrastructure |
| |
| The testing infrastructure is designed for reusability: |
| |
| ### Test Utilities (`tests/utils.py`) |
| |
| - `assert_file_exists()` / `assert_directory_exists()` |
| - `assert_file_structure()` / `assert_directory_structure()` |
| - `assert_json_content()` / `load_json_file()` |
| - `create_test_extension_structure()` - Helper for expected structures |
| |
| ### Fixtures (`tests/conftest.py`) |
| |
| - `cli_runner` - Click CLI runner |
| - `isolated_filesystem` - Temporary directory with cleanup |
| - `extension_params` - Default extension parameters |
| - `cli_input_*` - Pre-configured user inputs |
| |
| This infrastructure can be easily extended for testing additional CLI commands like `build`, `bundle`, `dev`, and `validate`. |
| |
| ## Best Practices Implemented |
| |
| 1. **Isolation**: Each test runs in its own temporary directory |
| 2. **Comprehensive Coverage**: Tests cover happy paths, edge cases, and error conditions |
| 3. **Realistic Testing**: Uses actual Click CLI runner with realistic user input |
| 4. **Content Verification**: Validates both file existence and content accuracy |
| 5. **Template Testing**: Separates template rendering logic from CLI integration |
| 6. **Reusable Components**: Utilities and fixtures designed for extension |
| 7. **Clear Documentation**: Well-documented test cases and helper functions |
| 8. **Type Safety**: Uses modern Python type annotations with `from __future__ import annotations` |