| # 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. |
| |
| from __future__ import annotations |
| |
| import json |
| |
| import pytest |
| from superset_extensions_cli.utils import read_json, read_toml |
| |
| |
| # Read JSON Tests |
| @pytest.mark.unit |
| def test_read_json_with_valid_file(isolated_filesystem): |
| """Test read_json with valid JSON file.""" |
| json_data = {"name": "test", "version": "1.0.0"} |
| json_file = isolated_filesystem / "test.json" |
| json_file.write_text(json.dumps(json_data)) |
| |
| result = read_json(json_file) |
| |
| assert result == json_data |
| |
| |
| @pytest.mark.unit |
| def test_read_json_with_nonexistent_file(isolated_filesystem): |
| """Test read_json returns None when file doesn't exist.""" |
| nonexistent_file = isolated_filesystem / "nonexistent.json" |
| |
| result = read_json(nonexistent_file) |
| |
| assert result is None |
| |
| |
| @pytest.mark.unit |
| def test_read_json_with_invalid_json(isolated_filesystem): |
| """Test read_json with invalid JSON content.""" |
| invalid_json_file = isolated_filesystem / "invalid.json" |
| invalid_json_file.write_text("{ invalid json content") |
| |
| with pytest.raises(json.JSONDecodeError): |
| read_json(invalid_json_file) |
| |
| |
| @pytest.mark.unit |
| def test_read_json_with_directory_instead_of_file(isolated_filesystem): |
| """Test read_json returns None when path is a directory.""" |
| directory = isolated_filesystem / "test_dir" |
| directory.mkdir() |
| |
| result = read_json(directory) |
| |
| assert result is None |
| |
| |
| @pytest.mark.unit |
| @pytest.mark.parametrize( |
| "json_content,expected", |
| [ |
| ({"simple": "value"}, {"simple": "value"}), |
| ({"nested": {"key": "value"}}, {"nested": {"key": "value"}}), |
| ({"array": [1, 2, 3]}, {"array": [1, 2, 3]}), |
| ({}, {}), # Empty JSON object |
| ], |
| ) |
| def test_read_json_with_various_valid_content( |
| isolated_filesystem, json_content, expected |
| ): |
| """Test read_json with various valid JSON content types.""" |
| json_file = isolated_filesystem / "test.json" |
| json_file.write_text(json.dumps(json_content)) |
| |
| result = read_json(json_file) |
| |
| assert result == expected |
| |
| |
| # Read TOML Tests |
| @pytest.mark.unit |
| def test_read_toml_with_valid_file(isolated_filesystem): |
| """Test read_toml with valid TOML file.""" |
| toml_content = '[project]\nname = "test"\nversion = "1.0.0"' |
| toml_file = isolated_filesystem / "pyproject.toml" |
| toml_file.write_text(toml_content) |
| |
| result = read_toml(toml_file) |
| |
| assert result is not None |
| assert result["project"]["name"] == "test" |
| assert result["project"]["version"] == "1.0.0" |
| |
| |
| @pytest.mark.unit |
| def test_read_toml_with_nonexistent_file(isolated_filesystem): |
| """Test read_toml returns None when file doesn't exist.""" |
| nonexistent_file = isolated_filesystem / "nonexistent.toml" |
| |
| result = read_toml(nonexistent_file) |
| |
| assert result is None |
| |
| |
| @pytest.mark.unit |
| def test_read_toml_with_directory_instead_of_file(isolated_filesystem): |
| """Test read_toml returns None when path is a directory.""" |
| directory = isolated_filesystem / "test_dir" |
| directory.mkdir() |
| |
| result = read_toml(directory) |
| |
| assert result is None |
| |
| |
| @pytest.mark.unit |
| def test_read_toml_with_invalid_toml(isolated_filesystem): |
| """Test read_toml with invalid TOML content.""" |
| invalid_toml_file = isolated_filesystem / "invalid.toml" |
| invalid_toml_file.write_text("[ invalid toml content") |
| |
| with pytest.raises(Exception): # tomli raises various exceptions for invalid TOML |
| read_toml(invalid_toml_file) |
| |
| |
| @pytest.mark.unit |
| @pytest.mark.parametrize( |
| "toml_content,expected_keys", |
| [ |
| ('[project]\nname = "test"', ["project"]), |
| ('[build-system]\nrequires = ["setuptools"]', ["build-system"]), |
| ( |
| '[project]\nname = "test"\n[build-system]\nrequires = ["setuptools"]', |
| ["project", "build-system"], |
| ), |
| ], |
| ) |
| def test_read_toml_with_various_valid_content( |
| isolated_filesystem, toml_content, expected_keys |
| ): |
| """Test read_toml with various valid TOML content types.""" |
| toml_file = isolated_filesystem / "test.toml" |
| toml_file.write_text(toml_content) |
| |
| result = read_toml(toml_file) |
| |
| assert result is not None |
| for key in expected_keys: |
| assert key in result |
| |
| |
| @pytest.mark.unit |
| def test_read_toml_with_complex_structure(isolated_filesystem): |
| """Test read_toml with complex TOML structure.""" |
| complex_toml = """ |
| [project] |
| name = "my-package" |
| version = "1.0.0" |
| authors = [ |
| {name = "Author Name", email = "author@example.com"} |
| ] |
| |
| [project.dependencies] |
| requests = "^2.25.0" |
| |
| [build-system] |
| requires = ["setuptools", "wheel"] |
| build-backend = "setuptools.build_meta" |
| """ |
| toml_file = isolated_filesystem / "complex.toml" |
| toml_file.write_text(complex_toml) |
| |
| result = read_toml(toml_file) |
| |
| assert result is not None |
| assert result["project"]["name"] == "my-package" |
| assert result["project"]["version"] == "1.0.0" |
| assert len(result["project"]["authors"]) == 1 |
| assert result["project"]["authors"][0]["name"] == "Author Name" |
| assert result["build-system"]["requires"] == ["setuptools", "wheel"] |
| |
| |
| @pytest.mark.unit |
| def test_read_toml_with_empty_file(isolated_filesystem): |
| """Test read_toml with empty TOML file.""" |
| toml_file = isolated_filesystem / "empty.toml" |
| toml_file.write_text("") |
| |
| result = read_toml(toml_file) |
| |
| assert result == {} |
| |
| |
| @pytest.mark.unit |
| @pytest.mark.parametrize( |
| "invalid_content", |
| [ |
| "[ invalid section", |
| "key = ", |
| "key = unquoted string", |
| "[section\nkey = value", |
| ], |
| ) |
| def test_read_toml_with_various_invalid_content(isolated_filesystem, invalid_content): |
| """Test read_toml with various types of invalid TOML content.""" |
| toml_file = isolated_filesystem / "invalid.toml" |
| toml_file.write_text(invalid_content) |
| |
| with pytest.raises(Exception): # Various TOML parsing exceptions |
| read_toml(toml_file) |
| |
| |
| # File System Edge Cases |
| @pytest.mark.unit |
| def test_read_json_with_permission_denied(isolated_filesystem): |
| """Test read_json behavior when file permissions are denied.""" |
| json_file = isolated_filesystem / "restricted.json" |
| json_file.write_text('{"test": "value"}') |
| |
| # This test may not work on all systems, so we'll skip it if chmod doesn't work |
| try: |
| json_file.chmod(0o000) # No permissions |
| result = read_json(json_file) |
| # If we get here without exception, the file was still readable |
| # This is system-dependent behavior |
| assert result is None or result == {"test": "value"} |
| except (OSError, PermissionError): |
| # Expected on some systems |
| pass |
| finally: |
| # Restore permissions for cleanup |
| try: |
| json_file.chmod(0o644) |
| except (OSError, PermissionError): |
| pass |
| |
| |
| @pytest.mark.unit |
| def test_read_toml_with_permission_denied(isolated_filesystem): |
| """Test read_toml behavior when file permissions are denied.""" |
| toml_file = isolated_filesystem / "restricted.toml" |
| toml_file.write_text('[test]\nkey = "value"') |
| |
| # This test may not work on all systems, so we'll skip it if chmod doesn't work |
| try: |
| toml_file.chmod(0o000) # No permissions |
| result = read_toml(toml_file) |
| # If we get here without exception, the file was still readable |
| # This is system-dependent behavior |
| assert result is None or "test" in result |
| except (OSError, PermissionError): |
| # Expected on some systems |
| pass |
| finally: |
| # Restore permissions for cleanup |
| try: |
| toml_file.chmod(0o644) |
| except (OSError, PermissionError): |
| pass |