mirror of
https://github.com/EDCD/EDMarketConnector.git
synced 2026-10-22 17:22:09 +03:00
132 lines
4.5 KiB
Python
132 lines
4.5 KiB
Python
# flake8: noqa
|
|
# mypy: ignore-errors
|
|
"""Test the CSV Export System."""
|
|
|
|
import pytest
|
|
import csv
|
|
import commodity
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_capi_data():
|
|
"""Provides a standard CAPI data structure for testing."""
|
|
return {
|
|
"timestamp": "2024-01-01T12:00:00Z",
|
|
"lastSystem": {"name": "Sol"},
|
|
"lastStarport": {
|
|
"name": "Daedalus",
|
|
"commodities": [
|
|
{
|
|
"id": 123,
|
|
"name": "Gold",
|
|
"sellPrice": 1000,
|
|
"buyPrice": 1100,
|
|
"demand": 500,
|
|
"demandBracket": 3,
|
|
"stock": 10,
|
|
"stockBracket": 1,
|
|
"meanPrice": 1050,
|
|
}
|
|
],
|
|
},
|
|
}
|
|
|
|
|
|
class TestCSVExport:
|
|
|
|
def test_delimiter_mapping(self, tmp_path, sample_capi_data):
|
|
"""Verify that 'kind' correctly changes the file delimiter."""
|
|
kinds = [
|
|
(commodity.COMMODITY_CSV, ","),
|
|
(commodity.COMMODITY_TAB, "\t"),
|
|
(commodity.COMMODITY_PIPE, "|"),
|
|
(commodity.COMMODITY_SEMICOLON, ";"),
|
|
]
|
|
|
|
for kind, expected_delim in kinds:
|
|
fname = tmp_path / f"test_{kind}.txt"
|
|
commodity.export(sample_capi_data, kind=kind, filename=fname)
|
|
|
|
# Read first line to check delimiter
|
|
content = fname.read_text(encoding="utf-8")
|
|
assert expected_delim in content
|
|
|
|
def test_legacy_csv_format_row_length(self, tmp_path, sample_capi_data):
|
|
"""COMMODITY_CSV (Legacy) should have 10 columns."""
|
|
fname = tmp_path / "legacy.csv"
|
|
commodity.export(sample_capi_data, kind=commodity.COMMODITY_CSV, filename=fname)
|
|
|
|
with open(fname, newline="", encoding="utf-8") as f:
|
|
reader = csv.reader(f, delimiter=",")
|
|
header = next(reader)
|
|
first_row = next(reader)
|
|
|
|
assert len(header) == 10
|
|
assert "Average" not in header
|
|
assert len(first_row) == 10
|
|
|
|
def test_new_format_row_length(self, tmp_path, sample_capi_data):
|
|
"""Other formats (TAB, PIPE, etc) should have 12 columns."""
|
|
fname = tmp_path / "new_format.txt"
|
|
commodity.export(sample_capi_data, kind=commodity.COMMODITY_TAB, filename=fname)
|
|
|
|
with open(fname, newline="", encoding="utf-8") as f:
|
|
reader = csv.reader(f, delimiter="\t")
|
|
header = next(reader)
|
|
first_row = next(reader)
|
|
|
|
assert len(header) == 12
|
|
assert "Average" in header
|
|
assert "FDevID" in header
|
|
assert len(first_row) == 12
|
|
|
|
def test_data_value_mapping(self, tmp_path, sample_capi_data):
|
|
"""Check if specific fields like demandBracket are mapped via bracketmap."""
|
|
fname = tmp_path / "data_check.csv"
|
|
commodity.export(
|
|
sample_capi_data, kind=commodity.COMMODITY_CSV_NEW, filename=fname
|
|
)
|
|
|
|
with open(fname, newline="", encoding="utf-8") as f:
|
|
reader = csv.DictReader(f, delimiter=",")
|
|
row = next(reader)
|
|
|
|
assert row["System"] == "Sol"
|
|
assert row["Commodity"] == "Gold"
|
|
assert row["demandBracket"] == "High" # Mapped from 3
|
|
assert row["stockBracket"] == "Low" # Mapped from 1
|
|
assert row["FDevID"] == "123"
|
|
|
|
def test_missing_data_handling(self, tmp_path):
|
|
"""Ensure the exporter handles None values gracefully by writing empty strings."""
|
|
minimal_data = {
|
|
"timestamp": "now",
|
|
"lastSystem": {"name": "Sothis"},
|
|
"lastStarport": {
|
|
"name": "MiningHub",
|
|
"commodities": [
|
|
{
|
|
"name": "Iron",
|
|
"sellPrice": None,
|
|
"buyPrice": None,
|
|
"demandBracket": None,
|
|
"stockBracket": None,
|
|
}
|
|
],
|
|
},
|
|
}
|
|
fname = tmp_path / "empty.csv"
|
|
commodity.export(minimal_data, kind=commodity.COMMODITY_CSV, filename=fname)
|
|
|
|
with open(fname, newline="", encoding="utf-8") as f:
|
|
reader = csv.reader(f)
|
|
next(reader) # skip header
|
|
row = next(reader)
|
|
|
|
# Indices for Sell, Buy, Demand, Supply
|
|
# ['Sothis', 'MiningHub', 'Iron', '', '', '', '', '', '', 'now']
|
|
assert row[3] == ""
|
|
assert row[4] == ""
|
|
assert row[5] == ""
|
|
assert row[7] == ""
|