Files

101 lines
4.5 KiB
Python

import json
import unittest
from pathlib import Path
from spicyapi_nodes.pricing import badge_for, describe_price, format_usd, parse_variant_key, variant_key
SNAPSHOT = Path(__file__).resolve().parent.parent / "data" / "catalog-snapshot.json"
class VariantKeyTest(unittest.TestCase):
def test_every_published_variant_round_trips(self):
"""Rebuilding each published variant key from its own values must give the same key.
This is the rule the JavaScript badge follows too; if it drifts from the platform's, the
badge silently falls back to "from $x" on every node.
"""
checked = 0
for model in json.loads(SNAPSHOT.read_text())["items"]:
badge = badge_for(model)
if not badge:
continue
schema_props = model["inputSchema"].get("properties", {})
for key in badge["table"]:
values = parse_variant_key(badge, key)
widget_values = {}
connected = set()
for name in badge["fields"]:
target = badge["presence"].get(name)
if target is not None:
if values.get(name, badge["omitDefaults"].get(name, "false")) == "true":
connected.add(target)
continue
raw = values.get(name, badge["omitDefaults"].get(name))
if raw is None:
continue
if schema_props.get(name, {}).get("type") == "boolean":
raw = raw == "true"
widget_values[name] = raw
with self.subTest(model=model["model"], key=key):
self.assertEqual(variant_key(badge, widget_values, connected), key)
checked += 1
self.assertGreater(checked, 500)
def test_single_field_keys_are_bare_values(self):
badge = {"fields": ["resolution"], "presence": {}, "omitDefaults": {}}
self.assertEqual(variant_key(badge, {"resolution": "720p"}, set()), "720p")
def test_values_are_query_escaped_when_named(self):
badge = {"fields": ["aspect_ratio", "resolution"], "presence": {}, "omitDefaults": {}}
self.assertEqual(
variant_key(badge, {"aspect_ratio": "16:9", "resolution": "1k"}, set()),
"aspect_ratio=16%3A9;resolution=1k",
)
def test_missing_values_take_the_schema_default(self):
badge = {
"fields": ["generate_audio", "resolution"],
"presence": {},
"omitDefaults": {},
"defaults": {"generate_audio": "true"},
}
self.assertEqual(variant_key(badge, {"resolution": "480p"}, set()), "generate_audio=true;resolution=480p")
def test_presence_follows_connections(self):
badge = {"fields": ["resolution", "with_video"], "presence": {"with_video": "clips"}, "omitDefaults": {}}
self.assertEqual(variant_key(badge, {"resolution": "720p"}, set()), "resolution=720p;with_video=false")
self.assertEqual(variant_key(badge, {"resolution": "720p"}, {"clips"}), "resolution=720p;with_video=true")
def test_defaults_drop_out_when_listed(self):
badge = {"fields": ["resolution", "search"], "presence": {}, "omitDefaults": {"search": "false"}}
# With the default dropped only one part is left, and a lone part is written bare.
self.assertEqual(variant_key(badge, {"resolution": "480p", "search": False}, set()), "480p")
self.assertEqual(
variant_key(badge, {"resolution": "480p", "search": True}, set()), "resolution=480p;search=true"
)
class FormatTest(unittest.TestCase):
def test_format_usd(self):
self.assertEqual(format_usd("0.432"), "$0.432")
self.assertEqual(format_usd("1.08"), "$1.08")
self.assertEqual(format_usd("0.0246078"), "$0.0246078")
self.assertEqual(format_usd("2"), "$2.00")
self.assertEqual(format_usd("0.10"), "$0.10")
def test_describe(self):
self.assertEqual(describe_price({"table": {"": "0.01"}, "from": "0.01", "unit": "image"}), "$0.01 per image.")
self.assertEqual(
describe_price({"table": {"a": "0.1", "b": "0.2"}, "from": "0.1", "unit": "second"}),
"From $0.10 per second.",
)
self.assertEqual(
describe_price({"table": {"": "0.02"}, "from": "0.02", "unit": "image", "approximate": True}),
"About $0.02 per image.",
)
self.assertEqual(describe_price(None), "")
if __name__ == "__main__":
unittest.main()