"""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