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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
import unittest
import tempfile, os
from tests.common import createTestDbTable
from tilo import handleReq, TolNode, SearchSuggResponse, SearchSugg, InfoResponse, NodeInfo, DescInfo, ImgInfo
def initTestDb(dbFile: str) -> None:
# Test tree (I/D means image/desc):
# oneI -> twoD -> threeD
# -> fourI
# -> fiveI -> sixID -> seven
createTestDbTable(
dbFile,
'CREATE TABLE nodes_t (name TEXT PRIMARY KEY, id TEXT UNIQUE, tips INT)',
'INSERT INTO nodes_t VALUES (?, ?, ?)',
{
('one', 'ott1', 3),
('two', 'ott2', 2),
('three', 'ott3', 1),
('four', 'ott4', 1),
('five', 'ott5', 1),
('six', 'ott6', 1),
('seven', 'ott7', 1),
}
)
createTestDbTable(
dbFile,
'CREATE TABLE edges_t (parent TEXT, child TEXT, p_support INT, PRIMARY KEY (parent, child))',
'INSERT INTO edges_t VALUES (?, ?, ?)',
{
('one', 'two', 1),
('two', 'three', 0),
('two', 'four', 1),
('one', 'five', 0),
('five', 'six', 1),
('six', 'seven', 1),
}
)
createTestDbTable(
dbFile,
'CREATE TABLE names(name TEXT, alt_name TEXT, pref_alt INT, src TEXT, PRIMARY KEY(name, alt_name))',
'INSERT INTO names VALUES (?, ?, ?, ?)',
{
('one', 'turtle', 1, 'eol'),
('two', 'II', 1, 'eol'),
('five', 'V', 0, 'enwiki'),
('six', 'VI', 1, 'enwiki'),
}
)
createTestDbTable(
dbFile,
'CREATE TABLE node_imgs (name TEXT PRIMARY KEY, img_id INT, src TEXT)',
'INSERT INTO node_imgs VALUES (?, ?, ?)',
{
('one', 1, 'eol'),
('four', 10, 'enwiki'),
('five', 10, 'enwiki'),
('six', 1, 'picked'),
}
)
createTestDbTable(
dbFile,
'CREATE TABLE linked_imgs (name TEXT PRIMARY KEY, otol_ids TEXT)',
'INSERT INTO linked_imgs VALUES (?, ?)',
{
('two', 'ott4'),
}
)
createTestDbTable(
dbFile,
'CREATE TABLE images (' \
'id INT, src TEXT, url TEXT, license TEXT, artist TEXT, credit TEXT, PRIMARY KEY (id, src))',
'INSERT INTO images VALUES (?, ?, ?, ?, ?, ?)',
{
(1, 'eol', 'url1', 'license1', 'artist1', 'credit1'),
(10, 'enwiki', 'url2', 'license2', 'artist2', 'credit2'),
(1, 'picked', 'url3', 'license3', 'artist3', 'credit3'),
}
)
createTestDbTable(
dbFile,
'CREATE TABLE node_iucn (name TEXT PRIMARY KEY, iucn TEXT)',
'INSERT INTO node_iucn VALUES (?, ?)',
{
('one', 'vulnerable'),
('six', 'endangered'),
}
)
createTestDbTable(
dbFile,
'CREATE TABLE node_pop (name TEXT PRIMARY KEY, pop INT)',
'INSERT INTO node_pop VALUES (?, ?)',
{
('one', 10),
('two', 20),
}
)
createTestDbTable(
dbFile,
'CREATE TABLE wiki_ids (name TEXT PRIMARY KEY, id INT)',
'INSERT INTO wiki_ids VALUES (?, ?)',
{
('two', 200),
('three', 300),
('six', 600),
}
)
createTestDbTable(
dbFile,
'CREATE TABLE descs (wiki_id INT PRIMARY KEY, desc TEXT, from_dbp INT)',
'INSERT INTO descs VALUES (?, ?, ?)',
{
(200, 'two is 2', 1),
(300, 'three is 3', 0),
(600, 'six is 6', 1),
}
)
class TestHandleReq(unittest.TestCase):
def setUp(self):
self.maxDiff = None
self.tempDir = tempfile.TemporaryDirectory()
self.dbFile = os.path.join(self.tempDir.name, 'data.db')
initTestDb(self.dbFile)
def tearDown(self):
self.tempDir.cleanup()
def test_node_req(self):
response = handleReq(self.dbFile, {'QUERY_STRING': 'name=two&type=node&tree=trimmed'})
self.assertEqual(response, {
'two': TolNode('ott2', ['three', 'four'], 'one', 2, True, 'II', 'ott4.jpg', None),
'three': TolNode('ott3', [], 'two', 1, False, None, None, None),
'four': TolNode('ott4', [], 'two', 1, True, None, 'ott4.jpg', None),
})
def test_node_toroot_req(self):
response = handleReq(self.dbFile, {'QUERY_STRING': 'name=seven&type=node&toroot=1&excl=five&tree=trimmed'})
self.assertEqual(response, {
'five': TolNode('ott5', ['six'], 'one', 1, 0, None, 'ott5.jpg', None),
'six': TolNode('ott6', ['seven'], 'five', 1, 1, 'VI', 'ott6.jpg', 'endangered'),
'seven': TolNode('ott7', [], 'six', 1, 1, None, None, None),
})
def test_sugg_req(self):
response = handleReq(self.dbFile, {'QUERY_STRING': 'name=t&type=sugg&tree=trimmed'})
self.assertEqual(response, SearchSuggResponse(
[
SearchSugg('turtle', 'one', 10),
SearchSugg('two', None, 20),
SearchSugg('three', None, 0),
],
False
))
def test_info_req(self):
response = handleReq(self.dbFile, {'QUERY_STRING': 'name=six&type=info&tree=trimmed'})
self.assertEqual(response, InfoResponse(
NodeInfo(
TolNode('ott6', ['seven'], 'five', 1, True, 'VI', 'ott6.jpg', 'endangered'),
DescInfo('six is 6', 600, True),
ImgInfo(1, 'picked', 'url3', 'license3', 'artist3', 'credit3'),
),
[]
))
|