"""Test QtSql."""

import sys

import pytest

from qtpy import PYSIDE2, PYSIDE_VERSION, QtSql


@pytest.fixture
def database_connection():
    """Create a database connection"""
    connection = QtSql.QSqlDatabase.addDatabase("QSQLITE")
    yield connection
    connection.close()


def test_qtsql():
    """Test the qtpy.QtSql namespace"""
    assert QtSql.QSqlDatabase is not None
    assert QtSql.QSqlDriverCreatorBase is not None
    assert QtSql.QSqlDriver is not None
    assert QtSql.QSqlError is not None
    assert QtSql.QSqlField is not None
    assert QtSql.QSqlIndex is not None
    assert QtSql.QSqlQuery is not None
    assert QtSql.QSqlRecord is not None
    assert QtSql.QSqlResult is not None
    assert QtSql.QSqlQueryModel is not None
    assert QtSql.QSqlRelationalDelegate is not None
    assert QtSql.QSqlRelation is not None
    assert QtSql.QSqlRelationalTableModel is not None
    assert QtSql.QSqlTableModel is not None

    # Following modules are not (yet) part of any wrapper:
    # QSqlDriverCreator, QSqlDriverPlugin


@pytest.mark.skipif(
    sys.platform == "win32" and PYSIDE2 and PYSIDE_VERSION.startswith("5.13"),
    reason="SQLite driver unavailable on PySide 5.13.2 with Windows",
)
def test_qtsql_members_aliases(database_connection):
    """
    Test aliased methods over qtpy.QtSql members including:

    * qtpy.QtSql.QSqlDatabase.exec_
    * qtpy.QtSql.QSqlQuery.exec_
    * qtpy.QtSql.QSqlResult.exec_
    """
    assert QtSql.QSqlDatabase.exec_ is not None
    assert QtSql.QSqlQuery.exec_ is not None
    assert QtSql.QSqlResult.exec_ is not None

    assert database_connection.open()
    database_connection.setDatabaseName("test.sqlite")
    QtSql.QSqlDatabase.exec_(
        database_connection,
        """
        CREATE TABLE test (
            id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
            name VARCHAR(40) NOT NULL
        )
        """,
    )

    # Created table 'test' and 'sqlite_sequence'
    assert len(database_connection.tables()) == 2

    insert_table_query = QtSql.QSqlQuery()
    assert insert_table_query.exec_(
        """
        INSERT INTO test (name) VALUES (
            "TESTING"
        )
        """
    )

    select_table_query = QtSql.QSqlQuery()
    select_table_query.prepare(
        """
        SELECT * FROM test
        """
    )
    select_table_query.exec_()
    record = select_table_query.record()
    assert not record.isEmpty()
