blob: 1df07c72a605cd7388a0fa331be97f3185344f86 [file] [log] [blame]
# 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