Spaces:
Running
Running
| 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 | |