54 lines
2.0 KiB
Python
54 lines
2.0 KiB
Python
"""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)
|