mirror of
https://github.com/apache/superset.git
synced 2026-04-07 18:35:15 +00:00
272 lines
8.2 KiB
Python
272 lines
8.2 KiB
Python
# 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
|