From ce1ffd82ef76b9c21bc5336dee1201d3a70c5e24 Mon Sep 17 00:00:00 2001 From: danbusse <81775558+danbusse@users.noreply.github.com> Date: Mon, 22 Jun 2026 22:14:06 -0600 Subject: [PATCH] test: add archidekt parser tests --- backend/tests/test_archidekt.py | 79 +++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 backend/tests/test_archidekt.py diff --git a/backend/tests/test_archidekt.py b/backend/tests/test_archidekt.py new file mode 100644 index 0000000..e4ceb51 --- /dev/null +++ b/backend/tests/test_archidekt.py @@ -0,0 +1,79 @@ +""" +Tests for archidekt.py — CSV and JSON parsing with various column name formats. +""" +import pytest +from app.services.imports.archidekt import parse + + +class TestArchidektCSV: + def _csv(self, header, rows): + lines = [header] + rows + return "\n".join(lines).encode("utf-8") + + def test_standard_columns(self): + data = self._csv( + "Quantity,Foil Quantity,Card Name,Set Code,Collector Number", + ["2,0,Sol Ring,cmm,1"] + ) + result = parse(data) + assert len(result) == 1 + assert result[0].card_name == "Sol Ring" + assert result[0].quantity == 2 + assert result[0].foil_quantity == 0 + assert result[0].set_code == "cmm" + + def test_alternate_column_names(self): + data = self._csv( + "qty,foil qty,name,set,number", + ["1,1,Black Lotus,lea,232"] + ) + result = parse(data) + assert result[0].card_name == "Black Lotus" + assert result[0].quantity == 1 + assert result[0].foil_quantity == 1 + + def test_skips_empty_rows(self): + data = self._csv( + "Quantity,Card Name", + ["1,Sol Ring", ",", "2,Command Tower"] + ) + result = parse(data) + assert len(result) == 2 + + def test_empty_csv_raises(self): + with pytest.raises(ValueError, match="empty"): + parse(b"") + + def test_no_card_rows_raises(self): + data = self._csv("Quantity,Card Name", []) + with pytest.raises(ValueError, match="no card rows"): + parse(data) + + +class TestArchidektJSON: + def test_standard_json_array(self): + data = b'''[ + {"quantity": 1, "foilQuantity": 0, "card": {"name": "Sol Ring", "set": {"code": "cmm"}, "collectorNumber": "1"}} + ]''' + result = parse(data) + assert len(result) == 1 + assert result[0].card_name == "Sol Ring" + assert result[0].set_code == "cmm" + + def test_cards_wrapper(self): + data = b'{"cards": [{"quantity": 1, "card": {"name": "Sol Ring"}}]}' + result = parse(data) + assert result[0].card_name == "Sol Ring" + + def test_foil_quantity(self): + data = b'[{"quantity": 0, "foilQuantity": 2, "card": {"name": "Sol Ring"}}]' + result = parse(data) + assert result[0].foil_quantity == 2 + + def test_empty_array_raises(self): + with pytest.raises(ValueError, match="no card entries"): + parse(b"[]") + + def test_malformed_json_raises(self): + with pytest.raises(ValueError, match="malformed"): + parse(b"{broken json")