"""SQL-нормализаторы свода 2 (миграция 0053): регистр, обрезка, запись числа как в JS, компактная проекция.""" import json from pathlib import Path import pytest from tests.integration.conftest import legacy_full from tests.svod2_oracle import compact_projection NUM = json.loads( (Path(__file__).resolve().parent.parent / "fixtures" / "js_number_text_vectors.json").read_text( encoding="utf-8" ) ) def test_js_number_text_matches_node_vectors(svod2_sql): for v in NUM: got = svod2_sql( "SELECT v3.svod2_js_number_text((CAST(:x AS jsonb) #>> '{}')::float8) AS t", {"x": v["input"]}, )[0][0] assert got == v["js"], v def test_js_number_text_ignores_session_extra_float_digits(svod2_sql): svod2_sql("SET LOCAL extra_float_digits = 0", None) got = svod2_sql("SELECT v3.svod2_js_number_text(0.1::float8 + 0.2::float8) AS t", None)[0][0] assert got == "0.30000000000000004" @pytest.mark.parametrize( "src", ["АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ", "ЄІЇЎЂЏҐ", "ABCxyz", "ÀÉÖÞ", "×", "аРЕНДА 1"], ) def test_casefold_matches_js_lower(svod2_sql, src): assert svod2_sql("SELECT v3.svod2_casefold(:s) AS t", {"s": src})[0][0] == src.lower() def test_casefold_independent_of_collation(svod2_sql): got = svod2_sql("""SELECT v3.svod2_casefold('ЁЛКА' COLLATE "C") AS t""", None)[0][0] assert got == "ёлка" def test_js_trim_ecmascript_whitespace(svod2_sql): assert svod2_sql("SELECT v3.svod2_js_trim(:s) AS t", {"s": "   x \t"})[0][0] == "x" assert svod2_sql("SELECT v3.svod2_js_trim(:s) AS t", {"s": "​ x"})[0][0] == "​ x" def test_compact_matches_python_projection(svod2_sql, svod2_data, client, admin_tokens, auth_headers): full = legacy_full(client, "RF", auth_headers(admin_tokens))[0]["data"] got = svod2_sql("SELECT v3.svod2_compact(CAST(:d AS jsonb)) AS c", {"d": json.dumps(full)})[0][0] assert got == compact_projection(full)