10
10
from llm import cli as llm_cli
11
11
12
12
from tsellm .__version__ import __version__
13
- from tsellm .cli import (
14
- cli ,
15
- TsellmConsole ,
16
- SQLiteConsole ,
17
- TsellmConsoleMixin ,
18
- )
13
+ from tsellm .cli import cli , TsellmConsole , SQLiteConsole , DuckDBConsole , DBSniffer
19
14
20
15
21
16
def new_tempfile ():
@@ -25,17 +20,33 @@ def new_tempfile():
25
20
def new_sqlite_file ():
26
21
f = new_tempfile ()
27
22
with sqlite3 .connect (f ) as db :
28
- db .execute ("SELECT 1 " )
23
+ db .execute ("CREATE TABLE my(x text) " )
29
24
return f
30
25
31
26
32
27
def new_duckdb_file ():
33
28
f = new_tempfile ()
34
29
con = duckdb .connect (f .__str__ ())
35
- con .sql ("SELECT 1 " )
30
+ con .sql ("CREATE TABLE my(x text) " )
36
31
return f
37
32
38
33
34
+ class TestDBSniffer (unittest .TestCase ):
35
+ def setUp (self ):
36
+ self .sqlite_fp = new_sqlite_file ()
37
+ self .duckdb_fp = new_duckdb_file ()
38
+
39
+ def test_sniff_sqlite (self ):
40
+ sqlite_sni = DBSniffer (self .sqlite_fp )
41
+ self .assertTrue (sqlite_sni .is_sqlite )
42
+ self .assertFalse (sqlite_sni .is_duckdb )
43
+
44
+ def test_snif_duckdb (self ):
45
+ duckdb_sni = DBSniffer (self .duckdb_fp )
46
+ self .assertFalse (duckdb_sni .is_sqlite )
47
+ self .assertTrue (duckdb_sni .is_duckdb )
48
+
49
+
39
50
class TsellmConsoleTest (unittest .TestCase ):
40
51
def setUp (self ):
41
52
super ().setUp ()
@@ -69,23 +80,15 @@ def expect_failure(self, *args):
69
80
self .assertEqual (out , "" )
70
81
return err
71
82
72
- def test_sniff_sqlite (self ):
73
- self .assertTrue (TsellmConsoleMixin ().is_sqlite (new_sqlite_file ()))
74
-
75
- def test_sniff_duckdb (self ):
76
- self .assertTrue (TsellmConsoleMixin ().is_duckdb (new_duckdb_file ()))
77
-
78
83
def test_console_factory_sqlite (self ):
79
84
s = new_sqlite_file ()
80
- self .assertTrue (TsellmConsoleMixin ().is_sqlite (s ))
81
85
obj = TsellmConsole .create_console (s )
82
86
self .assertIsInstance (obj , SQLiteConsole )
83
87
84
- # def test_console_factory_duckdb(self):
85
- # s = new_duckdb_file()
86
- # self.assertTrue(TsellmConsole.is_duckdb(s))
87
- # obj = TsellmConsole.create_console(s)
88
- # self.assertIsInstance(obj, DuckDBConsole)
88
+ d = new_duckdb_file ()
89
+ self .assertTrue (TsellmConsole .create_console (d ))
90
+ obj = TsellmConsole .create_console (d )
91
+ self .assertIsInstance (obj , DuckDBConsole )
89
92
90
93
def test_cli_help (self ):
91
94
out = self .expect_success ("-h" )
@@ -98,11 +101,6 @@ def test_cli_version(self):
98
101
def test_choose_db (self ):
99
102
self .expect_failure ("--sqlite" , "--duckdb" )
100
103
101
- def test_deault_sqlite (self ):
102
- f = new_tempfile ()
103
- self .expect_success (str (f ), "select 1" )
104
- self .assertTrue (TsellmConsoleMixin ().is_sqlite (f ))
105
-
106
104
MEMORY_DB_MSG = "Connected to :memory:"
107
105
PS1 = "tsellm> "
108
106
PS2 = "... "
@@ -112,7 +110,7 @@ def run_cli(self, *args, commands=()):
112
110
captured_stdin () as stdin ,
113
111
captured_stdout () as stdout ,
114
112
captured_stderr () as stderr ,
115
- self .assertRaises (SystemExit ) as cm
113
+ self .assertRaises (SystemExit ) as cm ,
116
114
):
117
115
for cmd in commands :
118
116
stdin .write (cmd + "\n " )
@@ -121,8 +119,9 @@ def run_cli(self, *args, commands=()):
121
119
122
120
out = stdout .getvalue ()
123
121
err = stderr .getvalue ()
124
- self .assertEqual (cm .exception .code , 0 ,
125
- f"Unexpected failure: { args = } \n { out } \n { err } " )
122
+ self .assertEqual (
123
+ cm .exception .code , 0 , f"Unexpected failure: { args = } \n { out } \n { err } "
124
+ )
126
125
return out , err
127
126
128
127
def test_interact (self ):
@@ -197,13 +196,6 @@ def test_cli_execute_incomplete_sql(self):
197
196
stderr = self .expect_failure (* self .path_args , "sel" )
198
197
self .assertIn ("OperationalError (SQLITE_ERROR)" , stderr )
199
198
200
- def test_cli_on_disk_db (self ):
201
- self .addCleanup (unlink , TESTFN )
202
- out = self .expect_success (TESTFN , "create table t(t)" )
203
- self .assertEqual (out , "" )
204
- out = self .expect_success (TESTFN , "select count(t) from t" )
205
- self .assertIn ("(0,)" , out )
206
-
207
199
def assertMarkovResult (self , prompt , generated ):
208
200
# Every word should be one of the original prompt (see https://github.com/simonw/llm-markov/blob/657ca504bcf9f0bfc1c6ee5fe838cde9a8976381/tests/test_llm_markov.py#L20)
209
201
for w in prompt .split (" " ):
@@ -256,7 +248,7 @@ class DiskSQLiteTest(InMemorySQLiteTest):
256
248
257
249
def setUp (self ):
258
250
super ().setUp ()
259
- self .db_fp = str (new_tempfile ())
251
+ self .db_fp = str (new_sqlite_file ())
260
252
self .path_args = (
261
253
"--sqlite" ,
262
254
self .db_fp ,
@@ -265,7 +257,7 @@ def setUp(self):
265
257
def test_embed_default_hazo_leaves_valid_db_behind (self ):
266
258
# This should probably be called for all test cases
267
259
super ().test_embed_default_hazo ()
268
- self .assertTrue (TsellmConsoleMixin (). is_sqlite ( self .db_fp ))
260
+ self .assertTrue (DBSniffer ( self .db_fp ). is_sqlite )
269
261
270
262
271
263
class InMemoryDuckDBTest (InMemorySQLiteTest ):
@@ -299,5 +291,19 @@ def test_embed_hazo_binary(self):
299
291
pass
300
292
301
293
294
+ class DiskDuckDBTest (InMemoryDuckDBTest ):
295
+ db_fp = None
296
+ path_args = ()
297
+
298
+ def setUp (self ):
299
+ super ().setUp ()
300
+ self .db_fp = str (new_duckdb_file ())
301
+ self .path_args = (self .db_fp ,)
302
+
303
+ def test_duckdb_is_picked_up (self ):
304
+ # https://github.com/Florents-Tselai/tsellm/issues/28
305
+ super ().test_cli_execute_sql ()
306
+
307
+
302
308
if __name__ == "__main__" :
303
309
unittest .main ()
0 commit comments