shopstack / benchmarks /test_portability.py
pranaysuyash's picture
Sync ShopStack HEAD 6f8adfc
d999bba verified
Raw
History Blame Contribute Delete
3.16 kB
from __future__ import annotations
import json
import pytest
from shopstack.portability import (
export_csv_inventory,
export_json,
export_trace_bundle,
import_json,
validate_import_json,
)
pytestmark = pytest.mark.benchmark(group="portability")
def test_export_json_full(benchmark, bench_db):
result = benchmark(export_json, bench_db)
assert len(result["inventory"]) >= 50
assert len(result["price_observations"]) >= 50
def test_export_csv_inventory(benchmark, bench_db):
result = benchmark(export_csv_inventory, bench_db)
lines = result.strip().split("\n")
assert len(lines) >= 51
def test_export_trace_bundle(benchmark, bench_db):
result = benchmark(export_trace_bundle, bench_db)
assert result["export_type"] == "trace_bundle"
assert result["lot_count"] >= 50
def test_import_json_merge(benchmark, bench_db):
payload = {
"schema_version": "1.0",
"inventory": [
{"canonical_name": "merge_test_item", "display_name": "Merge Test", "quantity": 2.0, "unit": "kg"},
{"canonical_name": "another_merge", "display_name": "Another", "quantity": 1.0, "unit": "unit"},
],
"price_observations": [
{"canonical_name": "merge_test_item", "price": 99.0, "quantity": 1.0, "unit": "kg", "store_name": "Test"},
],
}
result = benchmark(import_json, bench_db, payload, import_mode="merge")
assert result.items_added + result.items_updated >= 1
def test_import_json_replace(benchmark, fresh_db):
from shopstack.schemas.models import InventoryLot
for i in range(10):
lot = InventoryLot(
canonical_name=f"preexisting-{i}",
display_name=f"Item {i}",
quantity=1.0,
unit="unit",
)
fresh_db.add_inventory_lot(lot)
payload = {
"schema_version": "1.0",
"inventory": [
{"canonical_name": "replace_item", "display_name": "Replace Test", "quantity": 5.0, "unit": "kg"},
],
}
result = benchmark(import_json, fresh_db, payload, import_mode="replace")
assert result.items_added >= 1
def test_validate_import_json(benchmark, bench_db):
payload = {
"schema_version": "1.0",
"inventory": [
{"canonical_name": "validate_item", "display_name": "Validate Test", "quantity": 1.0, "unit": "unit"},
{"canonical_name": "another_validate", "display_name": "Another Validate", "quantity": 2.0, "unit": "kg"},
{"canonical_name": "rice", "display_name": "Rice", "quantity": 5.0, "unit": "kg"},
],
"price_observations": [
{"canonical_name": "validate_item", "price": 50.0, "quantity": 1.0, "unit": "unit"},
],
}
result = benchmark(validate_import_json, bench_db, payload)
assert result.items_added >= 1
assert "Dry-run" in result.messages[0]
def test_export_json_serialization_size(benchmark, bench_db):
def serialize():
data = export_json(bench_db)
return json.dumps(data)
result = benchmark(serialize)
parsed = json.loads(result)
assert "inventory" in parsed