# edited by glg
import pytest

from pypos.core.utils.sql_query_builder import (
    build_identifier_in_clause,
    build_pragma_table_info_sql,
    build_sql_with_identifier_in_clause,
)


pytestmark = [pytest.mark.unit]


def test_build_identifier_in_clause_menormalkan_integer_unik():
    clause, params = build_identifier_in_clause(
        "id",
        [1, "2", 2, -7, None, "abc"],
        cast_int=True,
        positive_only=True,
        unique=True,
    )

    assert clause == '"id" IN (?,?)'
    assert params == (1, 2)


def test_build_sql_with_identifier_in_clause_mendukung_suffix():
    query, params = build_sql_with_identifier_in_clause(
        sql_prefix="SELECT id FROM transaksi WHERE",
        sql_suffix="ORDER BY id ASC",
        identifier="id",
        values=[11, 12, 12],
        cast_int=True,
        positive_only=True,
        unique=True,
    )

    assert query == 'SELECT id FROM transaksi WHERE "id" IN (?,?) ORDER BY id ASC'
    assert params == (11, 12)


def test_build_sql_with_identifier_in_clause_mendukung_identifier_qualified():
    query, params = build_sql_with_identifier_in_clause(
        sql_prefix="SELECT id FROM transaksi t WHERE",
        sql_suffix="ORDER BY t.id ASC",
        identifier="t.id",
        values=[11, 12, 12],
        cast_int=True,
        positive_only=True,
        unique=True,
    )

    assert query == 'SELECT id FROM transaksi t WHERE "t"."id" IN (?,?) ORDER BY t.id ASC'
    assert params == (11, 12)


def test_build_pragma_table_info_sql_mengutip_identifier_dengan_ketat():
    sql = build_pragma_table_info_sql("transaksi_data")
    assert sql == 'PRAGMA table_info("transaksi_data")'


def test_build_pragma_table_info_sql_menolak_identifier_tidak_valid():
    with pytest.raises(ValueError):
        build_pragma_table_info_sql("transaksi;DROP TABLE x")


def test_build_sql_with_identifier_in_clause_gagal_jika_nilai_kosong():
    with pytest.raises(ValueError):
        build_sql_with_identifier_in_clause(
            sql_prefix="DELETE FROM transaksi WHERE",
            sql_suffix="",
            identifier="id",
            values=[],
            cast_int=True,
            positive_only=True,
            unique=True,
        )
