1
0
Fork 0
litecli/tests/test_sqlexecute.py
Daniel Baumann 3b8f21e56b
Merging upstream version 1.14.2.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-02-09 17:57:00 +01:00

380 lines
11 KiB
Python

# coding=UTF-8
import os
import pytest
from utils import run, dbtest, set_expanded_output, is_expanded_output, assert_result_equal
from sqlite3 import OperationalError, ProgrammingError
@dbtest
def test_conn(executor):
run(executor, """create table test(a text)""")
run(executor, """insert into test values('abc')""")
results = run(executor, """select * from test""")
assert_result_equal(results, headers=["a"], rows=[("abc",)])
@dbtest
def test_bools(executor):
run(executor, """create table test(a boolean)""")
run(executor, """insert into test values(1)""")
results = run(executor, """select * from test""")
assert_result_equal(results, headers=["a"], rows=[(1,)])
@dbtest
def test_binary(executor):
run(executor, """create table foo(blb BLOB NOT NULL)""")
run(executor, """INSERT INTO foo VALUES ('\x01\x01\x01\n')""")
results = run(executor, """select * from foo""")
expected = "\x01\x01\x01\n"
assert_result_equal(results, headers=["blb"], rows=[(expected,)])
## Failing in Travis for some unknown reason.
@dbtest
def test_table_and_columns_query(executor):
run(executor, "create table a(x text, y text)")
run(executor, "create table b(z text)")
run(executor, "create table t(t text)")
assert set(executor.tables()) == set([("a",), ("b",), ("t",)])
assert set(executor.table_columns()) == set([("a", "x"), ("a", "y"), ("b", "z"), ("t", "t")])
assert set(executor.table_columns()) == set([("a", "x"), ("a", "y"), ("b", "z"), ("t", "t")])
@dbtest
def test_database_list(executor):
databases = executor.databases()
assert "main" in list(databases)
@dbtest
def test_invalid_syntax(executor):
with pytest.raises(OperationalError) as excinfo:
run(executor, "invalid syntax!")
assert "syntax error" in str(excinfo.value)
@dbtest
def test_invalid_column_name(executor):
with pytest.raises(OperationalError) as excinfo:
run(executor, "select invalid command")
assert "no such column: invalid" in str(excinfo.value)
@dbtest
def test_unicode_support_in_output(executor):
run(executor, "create table unicodechars(t text)")
run(executor, "insert into unicodechars (t) values ('é')")
# See issue #24, this raises an exception without proper handling
results = run(executor, "select * from unicodechars")
assert_result_equal(results, headers=["t"], rows=[("é",)])
@dbtest
def test_invalid_unicode_values_dont_choke(executor):
run(executor, "create table unicodechars(t text)")
# \xc3 is not a valid utf-8 char. But we can insert it into the database
# which can break querying if not handled correctly.
run(executor, "insert into unicodechars (t) values (cast(x'c3' as text))")
results = run(executor, "select * from unicodechars")
assert_result_equal(results, headers=["t"], rows=[("\\xc3",)])
@dbtest
def test_multiple_queries_same_line(executor):
results = run(executor, "select 'foo'; select 'bar'")
expected = [
{
"title": None,
"headers": ["'foo'"],
"rows": [("foo",)],
"status": "1 row in set",
},
{
"title": None,
"headers": ["'bar'"],
"rows": [("bar",)],
"status": "1 row in set",
},
]
assert expected == results
@dbtest
def test_multiple_queries_same_line_syntaxerror(executor):
with pytest.raises(OperationalError) as excinfo:
run(executor, "select 'foo'; invalid syntax")
assert "syntax error" in str(excinfo.value)
@dbtest
def test_favorite_query(executor):
set_expanded_output(False)
run(executor, "create table test(a text)")
run(executor, "insert into test values('abc')")
run(executor, "insert into test values('def')")
results = run(executor, "\\fs test-a select * from test where a like 'a%'")
assert_result_equal(results, status="Saved.")
results = run(executor, "\\f+ test-a")
assert_result_equal(
results,
title="> select * from test where a like 'a%'",
headers=["a"],
rows=[("abc",)],
auto_status=False,
)
results = run(executor, "\\fd test-a")
assert_result_equal(results, status="test-a: Deleted")
@dbtest
def test_bind_parameterized_favorite_query(executor):
set_expanded_output(False)
run(executor, "create table test(name text, id integer)")
run(executor, "insert into test values('def', 2)")
run(executor, "insert into test values('two words', 3)")
results = run(executor, "\\fs q_param select * from test where name=?")
assert_result_equal(results, status="Saved.")
results = run(executor, "\\f+ q_param def")
assert_result_equal(
results,
title="> select * from test where name=?",
headers=["name", "id"],
rows=[("def", 2)],
auto_status=False,
)
results = run(executor, "\\f+ q_param 'two words'")
assert_result_equal(
results,
title="> select * from test where name=?",
headers=["name", "id"],
rows=[("two words", 3)],
auto_status=False,
)
with pytest.raises(ProgrammingError):
results = run(executor, "\\f+ q_param")
with pytest.raises(ProgrammingError):
results = run(executor, "\\f+ q_param 1 2")
@dbtest
def test_verbose_feature_of_favorite_query(executor):
set_expanded_output(False)
run(executor, "create table test(a text, id integer)")
run(executor, "insert into test values('abc', 1)")
run(executor, "insert into test values('def', 2)")
results = run(executor, "\\fs sh_param select * from test where id=$1")
assert_result_equal(results, status="Saved.")
results = run(executor, "\\f sh_param 1")
assert_result_equal(
results,
title=None,
headers=["a", "id"],
rows=[("abc", 1)],
auto_status=False,
)
results = run(executor, "\\f+ sh_param 1")
assert_result_equal(
results,
title="> select * from test where id=1",
headers=["a", "id"],
rows=[("abc", 1)],
auto_status=False,
)
@dbtest
def test_shell_parameterized_favorite_query(executor):
set_expanded_output(False)
run(executor, "create table test(a text, id integer)")
run(executor, "insert into test values('abc', 1)")
run(executor, "insert into test values('def', 2)")
results = run(executor, "\\fs sh_param select * from test where id=$1")
assert_result_equal(results, status="Saved.")
results = run(executor, "\\f+ sh_param 1")
assert_result_equal(
results,
title="> select * from test where id=1",
headers=["a", "id"],
rows=[("abc", 1)],
auto_status=False,
)
results = run(executor, "\\f+ sh_param")
assert_result_equal(
results,
title=None,
headers=None,
rows=None,
status="missing substitution for $1 in query:\n select * from test where id=$1",
)
results = run(executor, "\\f+ sh_param 1 2")
assert_result_equal(
results,
title=None,
headers=None,
rows=None,
status="Too many arguments.\nQuery does not have enough place holders to substitute.\nselect * from test where id=1",
)
@dbtest
def test_favorite_query_multiple_statement(executor):
set_expanded_output(False)
run(executor, "create table test(a text)")
run(executor, "insert into test values('abc')")
run(executor, "insert into test values('def')")
results = run(
executor,
"\\fs test-ad select * from test where a like 'a%'; " "select * from test where a like 'd%'",
)
assert_result_equal(results, status="Saved.")
results = run(executor, "\\f+ test-ad")
expected = [
{
"title": "> select * from test where a like 'a%'",
"headers": ["a"],
"rows": [("abc",)],
"status": None,
},
{
"title": "> select * from test where a like 'd%'",
"headers": ["a"],
"rows": [("def",)],
"status": None,
},
]
assert expected == results
results = run(executor, "\\fd test-ad")
assert_result_equal(results, status="test-ad: Deleted")
@dbtest
def test_favorite_query_expanded_output(executor):
set_expanded_output(False)
run(executor, """create table test(a text)""")
run(executor, """insert into test values('abc')""")
results = run(executor, "\\fs test-ae select * from test")
assert_result_equal(results, status="Saved.")
results = run(executor, R"\f+ test-ae \G")
assert is_expanded_output() is True
assert_result_equal(
results,
title="> select * from test",
headers=["a"],
rows=[("abc",)],
auto_status=False,
)
set_expanded_output(False)
results = run(executor, "\\fd test-ae")
assert_result_equal(results, status="test-ae: Deleted")
@dbtest
def test_special_command(executor):
results = run(executor, "\\?")
assert_result_equal(
results,
rows=("quit", "\\q", "Quit."),
headers="Command",
assert_contains=True,
auto_status=False,
)
@dbtest
def test_cd_command_without_a_folder_name(executor):
results = run(executor, "system cd")
assert_result_equal(results, status="No folder name was provided.")
@dbtest
def test_system_command_not_found(executor):
results = run(executor, "system xyz")
assert_result_equal(results, status="OSError: No such file or directory", assert_contains=True)
@dbtest
def test_system_command_output(executor):
test_dir = os.path.abspath(os.path.dirname(__file__))
test_file_path = os.path.join(test_dir, "test.txt")
results = run(executor, "system cat {0}".format(test_file_path))
assert_result_equal(results, status="litecli is awesome!\n")
@dbtest
def test_cd_command_current_dir(executor):
test_path = os.path.abspath(os.path.dirname(__file__))
run(executor, "system cd {0}".format(test_path))
assert os.getcwd() == test_path
run(executor, "system cd ..")
@dbtest
def test_unicode_support(executor):
results = run(executor, "SELECT '日本語' AS japanese;")
assert_result_equal(results, headers=["japanese"], rows=[("日本語",)])
@dbtest
def test_timestamp_null(executor):
run(executor, """create table ts_null(a timestamp null)""")
run(executor, """insert into ts_null values(null)""")
results = run(executor, """select * from ts_null""")
assert_result_equal(results, headers=["a"], rows=[(None,)])
@dbtest
def test_datetime_null(executor):
run(executor, """create table dt_null(a datetime null)""")
run(executor, """insert into dt_null values(null)""")
results = run(executor, """select * from dt_null""")
assert_result_equal(results, headers=["a"], rows=[(None,)])
@dbtest
def test_date_null(executor):
run(executor, """create table date_null(a date null)""")
run(executor, """insert into date_null values(null)""")
results = run(executor, """select * from date_null""")
assert_result_equal(results, headers=["a"], rows=[(None,)])
@dbtest
def test_time_null(executor):
run(executor, """create table time_null(a time null)""")
run(executor, """insert into time_null values(null)""")
results = run(executor, """select * from time_null""")
assert_result_equal(results, headers=["a"], rows=[(None,)])