mitai-jinkendo/backend/tests/test_csv_parser_core.py
Lars 4a771f6a83
All checks were successful
Deploy Development / deploy (push) Successful in 50s
Build Test / lint-backend (push) Successful in 0s
Build Test / build-frontend (push) Successful in 15s
feat(csv-parser): Implement CSV import functionality with mapping and type conversion
- Added permissions for editing and deleting CSV field mappings.
- Created type converter for CSV cells to handle various data types.
- Implemented database migrations for CSV field mappings and import logs.
- Seeded initial system templates for nutrition and activity data imports.
- Developed admin endpoints for managing system CSV templates.
- Introduced user endpoints for CSV import analysis and mapping retrieval.
- Added tests for core CSV parser functionalities, including delimiter detection and value conversion.
2026-04-09 21:37:19 +02:00

70 lines
2.1 KiB
Python

"""Tests für CSV-Parser Foundation (Issue #21)."""
import pytest
from csv_parser.core import (
decode_raw_bytes,
sniff_delimiter,
parse_csv_sample,
column_signature,
headers_signature_match_score,
get_csv_import_limits,
)
from csv_parser.type_converter import convert_value, build_row_after_mapping
def test_decode_bom_utf8():
raw = "\ufeffa;b;c\n1;2;3".encode("utf-8-sig")
t = decode_raw_bytes(raw)
assert not t.startswith("\ufeff")
assert "a;b;c" in t
def test_sniff_delimiter():
assert sniff_delimiter("a;b;c;d") == ";"
assert sniff_delimiter("a,b,c") == ","
def test_parse_csv_sample_header():
text = "Date;kcal\n2024-01-01;2000\n"
headers, rows, delim = parse_csv_sample(text, delimiter=";", max_data_rows=3)
assert headers == ["Date", "kcal"]
assert delim == ";"
assert rows[0]["Date"] == "2024-01-01"
assert rows[0]["kcal"] == "2000"
def test_column_signature_sorted_unique():
sig = column_signature(["B", "a", "a"])
assert sig == ["a", "b"]
def test_jaccard():
s1 = column_signature(["Date", "Calories"])
s2 = column_signature(["Date", "Calories", "Fat"])
assert headers_signature_match_score(s1, s2) == pytest.approx(2 / 3)
def test_get_csv_import_limits_default():
assert get_csv_import_limits(None)["max_rows_per_file"] == 50_000
def test_convert_date_and_kcal_factor():
d = convert_value("15.01.2024", "date", {"type": "date", "format": "dd.mm.yyyy"})
assert d.year == 2024 and d.month == 1 and d.day == 15
k = convert_value("8000", "kcal", {"type": "float", "conversion_factor": 0.239, "decimal_separator": "."})
assert abs(k - 8000 * 0.239) < 0.01
def test_build_row_after_mapping():
csv_row = {"Datum": "01.01.2024", "kj": "4200"}
fm = {"Datum": "date", "kj": "kcal"}
tc = {
"date": {"type": "date", "format": "dd.mm.yyyy"},
"kcal": {"type": "float", "conversion_factor": 0.239, "decimal_separator": "."},
}
out = build_row_after_mapping(csv_row, fm, tc)
assert out["date"].month == 1
assert out["kcal"] is not None