forked from fluentpython/example-code-2e
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdblib_test.py
131 lines (103 loc) · 3.8 KB
/
dblib_test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
from textwrap import dedent
import pytest
from dblib import gen_columns_sql, make_schema_sql, connect, read_columns_sql
from dblib import ColumnSchema, insert_record, fetch_record, update_record
from dblib import NoSuchRecord, delete_record, valid_table
@pytest.fixture
def create_movies_sql():
sql = '''
CREATE TABLE movies (
pk INTEGER PRIMARY KEY,
title TEXT,
revenue REAL
)
'''
return dedent(sql).strip()
@pytest.mark.parametrize(
'fields, expected',
[
(
dict(title=str, awards=int),
[('title', 'TEXT'), ('awards', 'INTEGER')],
),
(
dict(picture=bytes, score=float),
[('picture', 'BLOB'), ('score', 'REAL')],
),
],
)
def test_gen_columns_sql(fields, expected):
result = list(gen_columns_sql(fields))
assert result == expected
def test_make_schema_sql(create_movies_sql):
fields = dict(title=str, revenue=float)
result = make_schema_sql('movies', fields)
assert result == create_movies_sql
def test_read_columns_sql(create_movies_sql):
expected = [
ColumnSchema(name='pk', sql_type='INTEGER'),
ColumnSchema(name='title', sql_type='TEXT'),
ColumnSchema(name='revenue', sql_type='REAL'),
]
with connect() as con:
con.execute(create_movies_sql)
result = read_columns_sql('movies')
assert result == expected
def test_read_columns_sql_no_such_table(create_movies_sql):
with connect() as con:
con.execute(create_movies_sql)
result = read_columns_sql('no_such_table')
assert result == []
def test_insert_record(create_movies_sql):
fields = dict(title='Frozen', revenue=1_290_000_000)
with connect() as con:
con.execute(create_movies_sql)
for _ in range(3):
result = insert_record('movies', fields)
assert result == 3
def test_fetch_record(create_movies_sql):
fields = dict(title='Frozen', revenue=1_290_000_000)
with connect() as con:
con.execute(create_movies_sql)
pk = insert_record('movies', fields)
row = fetch_record('movies', pk)
assert tuple(row) == (1, 'Frozen', 1_290_000_000.0)
def test_fetch_record_no_such_pk(create_movies_sql):
with connect() as con:
con.execute(create_movies_sql)
with pytest.raises(NoSuchRecord) as e:
fetch_record('movies', 42)
assert e.value.pk == 42
def test_update_record(create_movies_sql):
fields = dict(title='Frozen', revenue=1_290_000_000)
with connect() as con:
con.execute(create_movies_sql)
pk = insert_record('movies', fields)
fields['revenue'] = 1_299_999_999
sql, values = update_record('movies', pk, fields)
row = fetch_record('movies', pk)
assert sql == 'UPDATE movies SET (title, revenue) = (?, ?) WHERE pk = ?'
assert values == ('Frozen', 1_299_999_999, 1)
assert tuple(row) == (1, 'Frozen', 1_299_999_999.0)
def test_delete_record(create_movies_sql):
fields = dict(title='Frozen', revenue=1_290_000_000)
with connect() as con:
con.execute(create_movies_sql)
pk = insert_record('movies', fields)
delete_record('movies', pk)
with pytest.raises(NoSuchRecord) as e:
fetch_record('movies', pk)
assert e.value.pk == pk
def test_persistent_valid_table(create_movies_sql):
fields = dict(title=str, revenue=float)
with connect() as con:
con.execute(create_movies_sql)
con.commit()
assert valid_table('movies', fields)
def test_persistent_valid_table_false(create_movies_sql):
# year field not in movies_sql
fields = dict(title=str, revenue=float, year=int)
with connect() as con:
con.execute(create_movies_sql)
con.commit()
assert not valid_table('movies', fields)