jinjaturtle/tests/test_json_handler.py

58 lines
1.8 KiB
Python

from __future__ import annotations
from pathlib import Path
import json
import pytest
import yaml
from jinjaturtle.core import (
parse_config,
flatten_config,
generate_ansible_yaml,
)
from jinjaturtle.handlers.json import JsonHandler
SAMPLES_DIR = Path(__file__).parent / "samples"
def test_json_roundtrip():
json_path = SAMPLES_DIR / "foo.json"
assert json_path.is_file(), f"Missing sample JSON file: {json_path}"
fmt, parsed = parse_config(json_path)
assert fmt == "json"
flat_items = flatten_config(fmt, parsed)
ansible_yaml = generate_ansible_yaml("foobar", flat_items)
defaults = yaml.safe_load(ansible_yaml)
# Defaults: nested keys and list indices
assert defaults["foobar_foo"] == "bar"
assert defaults["foobar_nested_a"] == 1
# Bool normalized to string "true"
assert defaults["foobar_nested_b"] == "true"
assert defaults["foobar_list_0"] == 10
assert defaults["foobar_list_1"] == 20
# Template generation is done via JsonHandler.generate_jinja2_template; we just
# make sure it produces a structure with the expected placeholders.
handler = JsonHandler()
templated = json.loads(
handler.generate_jinja2_template(parsed, role_prefix="foobar")
)
assert templated["foo"] == "{{ foobar_foo }}"
assert "foobar_nested_a" in str(templated)
assert "foobar_nested_b" in str(templated)
assert "foobar_list_0" in str(templated)
assert "foobar_list_1" in str(templated)
def test_generate_jinja2_template_json_type_error():
"""
Wrong type for JSON in JsonHandler.generate_jinja2_template should raise TypeError.
"""
handler = JsonHandler()
with pytest.raises(TypeError):
handler.generate_jinja2_template(parsed="not a dict", role_prefix="role")