1 # -*- coding: utf-8 -*-
2 """Test database access."""
3 from datetime import datetime, timedelta
4 from os import path, remove
5 from sqlite3 import connect
6 from unittest import TestCase
7 from cbconf import Conf
8 from cbdb import ArgCountError, Db, FileNotSetError
10 TESTDB_FILENAME = ".tmptest.db"
12 def create_test_db(fn):
16 pragma foreign_keys = ON;
18 create table if not exists users (
19 id varchar(24) primary key not null,
20 name varchar(255) default "human"
23 create table if not exists flavors (
24 name varchar(255) primary key not null,
25 ord integer not null default 999
28 insert or ignore into flavors values
31 ("espresso lungo", 3),
33 ("latte macchiato", 4),
34 ("Club-Mate 0,5 l", 5),
35 ("Club-Mate 0,33 l", 6)
38 create table if not exists coffees (
39 num integer primary key,
40 id varchar(24) references users(id), -- id may be unknown
41 flavor varchar(255) not null references flavors(name),
42 time datetime default current_timestamp,
43 UNIQUE (id, flavor, time)
47 create table if not exists days (
48 num integer primary key not null
51 insert or ignore into days values
52 (0),(1),(2),(3),(4),(5),(6)
56 INSERT OR IGNORE INTO users VALUES('1111','tester');
57 INSERT OR IGNORE INTO users VALUES('2222','newer');
58 INSERT OR IGNORE INTO users VALUES('3333','clone');
59 INSERT INTO coffees (id, flavor, time) VALUES
60 ('1111', 'espresso lungo', datetime('now', 'localtime', '-99 seconds')),
61 ('1111', 'Club-Mate 0,5 l', datetime('now', 'localtime', '-99 seconds')),
62 ('1111', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-99 seconds')),
63 ('1111', 'espresso lungo', datetime('now', 'localtime', '-95 second')),
64 ('1111', 'Club-Mate 0,5 l', datetime('now', 'localtime', '-95 second')),
65 ('1111', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-95 second')),
66 ('1111', 'tea', datetime('now', 'localtime', '-95 second')),
67 ('1111', 'espresso lungo', datetime('now', 'localtime', '-90 second')),
68 ('1111', 'Club-Mate 0,5 l', datetime('now', 'localtime', '-90 second')),
69 ('1111', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-90 second')),
70 ('1111', 'espresso lungo', datetime('now', 'localtime', '-85 second')),
71 ('1111', 'Club-Mate 0,5 l', datetime('now', 'localtime', '-85 second')),
72 ('1111', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-85 second')),
73 ('2222', 'espresso lungo', datetime('now', 'localtime', '-99 seconds')),
74 ('2222', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-99 seconds')),
75 ('2222', 'espresso lungo', datetime('now', 'localtime', '-95 second')),
76 ('2222', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-95 second')),
77 ('3333', 'espresso lungo', datetime('now', 'localtime', '-99 seconds')),
78 ('3333', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-99 seconds')),
79 ('3333', 'tea', datetime('now', 'localtime', '-99 second')),
80 ('3333', 'tea', datetime('now', 'localtime', '-95 second')),
81 ('3333', 'espresso lungo', datetime('now', 'localtime', '-95 second')),
82 ('3333', 'Club-Mate 0,5 l', datetime('now', 'localtime', '-95 second')),
83 ('3333', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-95 second'));
87 def delete_test_db(fn):
90 class CoffeeDb(TestCase):
91 def test_db_loads(self):
93 self.assertTrue(path.isfile(cfg.getCoffeeDbPath()))
94 db = Db(cfg.getCoffeeDbPath())
95 self.assertIsNotNone(db.con)
96 self.assertIsNotNone(db.cur)
98 def test_test_db_loads(self):
99 create_test_db(TESTDB_FILENAME)
101 db = Db(TESTDB_FILENAME)
102 self.assertIsNotNone(db.con)
103 self.assertIsNotNone(db.cur)
105 delete_test_db(TESTDB_FILENAME)
107 class FailCoffeeDb(TestCase):
108 def test_db_path_not_set(self):
109 self.assertRaises(FileNotSetError, Db)
111 class TopDrinks(TestCase):
113 create_test_db(TESTDB_FILENAME)
114 self.db = Db(TESTDB_FILENAME)
117 delete_test_db(TESTDB_FILENAME)
119 def test_top_drinks(self):
120 top = self.db.get_top_drinks()
122 ("espresso lungo", 8),
123 ("Club-Mate 0,33 l", 8),
124 ("Club-Mate 0,5 l", 5),
128 class TopMateDrinkers(TestCase):
129 def test_test_top_mate_drinkers(self):
130 create_test_db(TESTDB_FILENAME)
132 db = Db(TESTDB_FILENAME)
133 top = db.getTopMateDrinkers()
137 ("tester", 4*0.5 + 4*0.33),
138 ("clone", 0.5 + 2*0.33),
143 delete_test_db(TESTDB_FILENAME)
145 def test_test_top_mate_drinkers_len(self):
146 create_test_db(TESTDB_FILENAME)
148 db = Db(TESTDB_FILENAME)
149 top = db.getTopMateDrinkers()
150 self.assertIsNotNone(top)
151 self.assertEqual(len(top), 3)
153 delete_test_db(TESTDB_FILENAME)
155 def test_top_mate_drinkers_len(self):
157 db = Db(cfg.getCoffeeDbPath())
158 top = db.getTopMateDrinkers()
159 self.assertIsNotNone(top)
160 self.assertTrue(0 <= len(top))
162 def test_test_top_mate_drinkers_order(self):
163 create_test_db(TESTDB_FILENAME)
165 db = Db(TESTDB_FILENAME)
166 top = db.getTopMateDrinkers()
167 topsorted = list(top)
168 topsorted.sort(key=lambda x: (x[1], x[0]), reverse=True)
174 delete_test_db(TESTDB_FILENAME)
176 def test_top_mate_drinkers_order(self):
178 db = Db(cfg.getCoffeeDbPath())
179 top = db.getTopMateDrinkers()
180 topsorted = list(top)
181 topsorted.sort(key=lambda x: (x[1], x[0]), reverse=True)
187 class TopTeaDrinkers(TestCase):
189 create_test_db(TESTDB_FILENAME)
190 self.db = Db(TESTDB_FILENAME)
193 delete_test_db(TESTDB_FILENAME)
195 def test_top_tea_drinkers(self):
196 top = self.db.get_top_tea_drinkers()
202 class DrunkSum(TestCase):
204 tdy += timedelta(days=1)
205 tdystr = tdy.strftime("%Y-%m-%d")
206 lw = tdy - timedelta(days=8)
207 lwstr = lw.strftime("%Y-%m-%d")
209 def test_espresso_sum(self):
210 create_test_db(TESTDB_FILENAME)
212 db = Db(TESTDB_FILENAME)
213 drunk = db.getDrunkSum("espresso", self.lwstr, self.tdystr)
214 self.assertEqual(drunk, [])
216 delete_test_db(TESTDB_FILENAME)
218 def test_espressolungo_sum(self):
219 create_test_db(TESTDB_FILENAME)
221 db = Db(TESTDB_FILENAME)
222 drunk = db.getDrunkSum("espresso lungo", self.lwstr, self.tdystr)
223 self.assertEqual(drunk, [
229 delete_test_db(TESTDB_FILENAME)
231 def test_mate_3_sum(self):
232 create_test_db(TESTDB_FILENAME)
234 db = Db(TESTDB_FILENAME)
235 drunk = db.getDrunkSum("Club-Mate 0,33 l", self.lwstr, self.tdystr)
236 self.assertEqual(drunk, [
242 delete_test_db(TESTDB_FILENAME)
244 def test_mate_5_sum(self):
245 create_test_db(TESTDB_FILENAME)
247 db = Db(TESTDB_FILENAME)
248 drunk = db.getDrunkSum("Club-Mate 0,5 l", self.lwstr, self.tdystr)
249 self.assertEqual(drunk, [
254 delete_test_db(TESTDB_FILENAME)
256 def test_nof_args(self):
258 db = Db(cfg.getCoffeeDbPath())
259 self.assertRaises(ArgCountError, db.getDrunkSum)
260 self.assertRaises(ArgCountError, db.getDrunkSum, "espresso")
264 "espresso", "2010-10-20"
269 "espresso", "lungo", "2010-10-20", "2020-10-20"
272 def test_all_mate_sum(self):
273 create_test_db(TESTDB_FILENAME)
275 db = Db(TESTDB_FILENAME)
276 drunk = db.getDrunkSum(
277 "Club-Mate 0,5 l;Club-Mate 0,33 l",
281 self.assertEqual(drunk, [
287 delete_test_db(TESTDB_FILENAME)
289 def test_all_mate_list(self):
290 create_test_db(TESTDB_FILENAME)
292 db = Db(TESTDB_FILENAME)
293 drunk = db.getDrunkList(
294 "Club-Mate 0,5 l;Club-Mate 0,33 l",
298 self.assertEqual(drunk, {
304 delete_test_db(TESTDB_FILENAME)