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 TopMateDrinkers(TestCase):
112 def test_test_top_mate_drinkers(self):
113 create_test_db(TESTDB_FILENAME)
115 db = Db(TESTDB_FILENAME)
116 top = db.getTopMateDrinkers()
120 ("tester", 4*0.5 + 4*0.33),
121 ("clone", 0.5 + 2*0.33),
126 delete_test_db(TESTDB_FILENAME)
128 def test_test_top_mate_drinkers_len(self):
129 create_test_db(TESTDB_FILENAME)
131 db = Db(TESTDB_FILENAME)
132 top = db.getTopMateDrinkers()
133 self.assertIsNotNone(top)
134 self.assertEqual(len(top), 3)
136 delete_test_db(TESTDB_FILENAME)
138 def test_top_mate_drinkers_len(self):
140 db = Db(cfg.getCoffeeDbPath())
141 top = db.getTopMateDrinkers()
142 self.assertIsNotNone(top)
143 self.assertTrue(0 <= len(top))
145 def test_test_top_mate_drinkers_order(self):
146 create_test_db(TESTDB_FILENAME)
148 db = Db(TESTDB_FILENAME)
149 top = db.getTopMateDrinkers()
150 topsorted = list(top)
151 topsorted.sort(key=lambda x: (x[1], x[0]), reverse=True)
157 delete_test_db(TESTDB_FILENAME)
159 def test_top_mate_drinkers_order(self):
161 db = Db(cfg.getCoffeeDbPath())
162 top = db.getTopMateDrinkers()
163 topsorted = list(top)
164 topsorted.sort(key=lambda x: (x[1], x[0]), reverse=True)
170 class TopTeaDrinkers(TestCase):
172 create_test_db(TESTDB_FILENAME)
173 self.db = Db(TESTDB_FILENAME)
176 delete_test_db(TESTDB_FILENAME)
178 def test_top_tea_drinkers(self):
179 top = self.db.get_top_tea_drinkers()
185 class DrunkSum(TestCase):
187 tdy += timedelta(days=1)
188 tdystr = tdy.strftime("%Y-%m-%d")
189 lw = tdy - timedelta(days=8)
190 lwstr = lw.strftime("%Y-%m-%d")
192 def test_espresso_sum(self):
193 create_test_db(TESTDB_FILENAME)
195 db = Db(TESTDB_FILENAME)
196 drunk = db.getDrunkSum("espresso", self.lwstr, self.tdystr)
197 self.assertEqual(drunk, [])
199 delete_test_db(TESTDB_FILENAME)
201 def test_espressolungo_sum(self):
202 create_test_db(TESTDB_FILENAME)
204 db = Db(TESTDB_FILENAME)
205 drunk = db.getDrunkSum("espresso lungo", self.lwstr, self.tdystr)
206 self.assertEqual(drunk, [
212 delete_test_db(TESTDB_FILENAME)
214 def test_mate_3_sum(self):
215 create_test_db(TESTDB_FILENAME)
217 db = Db(TESTDB_FILENAME)
218 drunk = db.getDrunkSum("Club-Mate 0,33 l", self.lwstr, self.tdystr)
219 self.assertEqual(drunk, [
225 delete_test_db(TESTDB_FILENAME)
227 def test_mate_5_sum(self):
228 create_test_db(TESTDB_FILENAME)
230 db = Db(TESTDB_FILENAME)
231 drunk = db.getDrunkSum("Club-Mate 0,5 l", self.lwstr, self.tdystr)
232 self.assertEqual(drunk, [
237 delete_test_db(TESTDB_FILENAME)
239 def test_nof_args(self):
241 db = Db(cfg.getCoffeeDbPath())
242 self.assertRaises(ArgCountError, db.getDrunkSum)
243 self.assertRaises(ArgCountError, db.getDrunkSum, "espresso")
247 "espresso", "2010-10-20"
252 "espresso", "lungo", "2010-10-20", "2020-10-20"
255 def test_all_mate_sum(self):
256 create_test_db(TESTDB_FILENAME)
258 db = Db(TESTDB_FILENAME)
259 drunk = db.getDrunkSum(
260 "Club-Mate 0,5 l;Club-Mate 0,33 l",
264 self.assertEqual(drunk, [
270 delete_test_db(TESTDB_FILENAME)
272 def test_all_mate_list(self):
273 create_test_db(TESTDB_FILENAME)
275 db = Db(TESTDB_FILENAME)
276 drunk = db.getDrunkList(
277 "Club-Mate 0,5 l;Club-Mate 0,33 l",
281 self.assertEqual(drunk, {
287 delete_test_db(TESTDB_FILENAME)