# -*- coding: utf-8 -*-
"""Test database access."""
+from datetime import datetime, timedelta
from os import path, remove
from sqlite3 import connect
from unittest import TestCase
from cbconf import Conf
-from cbdb import Db
+from cbdb import ArgCountError, Db, FileNotSetError
TESTDB_FILENAME = ".tmptest.db"
);
insert or ignore into flavors values
+("tea", 7),
("espresso", 2),
("espresso lungo", 3),
("cappuccino", 1),
;
""")
cur.executescript("""
-INSERT INTO users VALUES('1111','tester');
-INSERT INTO users VALUES('2222','newer');
+INSERT OR IGNORE INTO users VALUES('1111','tester');
+INSERT OR IGNORE INTO users VALUES('2222','newer');
+INSERT OR IGNORE INTO users VALUES('3333','clone');
INSERT INTO coffees (id, flavor, time) VALUES
('1111', 'espresso lungo', datetime('now', 'localtime', '-99 seconds')),
('1111', 'Club-Mate 0,5 l', datetime('now', 'localtime', '-99 seconds')),
('1111', 'espresso lungo', datetime('now', 'localtime', '-95 second')),
('1111', 'Club-Mate 0,5 l', datetime('now', 'localtime', '-95 second')),
('1111', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-95 second')),
+('1111', 'tea', datetime('now', 'localtime', '-95 second')),
('1111', 'espresso lungo', datetime('now', 'localtime', '-90 second')),
('1111', 'Club-Mate 0,5 l', datetime('now', 'localtime', '-90 second')),
('1111', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-90 second')),
('1111', 'Club-Mate 0,5 l', datetime('now', 'localtime', '-85 second')),
('1111', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-85 second')),
('2222', 'espresso lungo', datetime('now', 'localtime', '-99 seconds')),
-('2222', 'Club-Mate 0,5 l', datetime('now', 'localtime', '-99 seconds')),
('2222', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-99 seconds')),
('2222', 'espresso lungo', datetime('now', 'localtime', '-95 second')),
-('2222', 'Club-Mate 0,5 l', datetime('now', 'localtime', '-95 second')),
-('2222', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-95 second'));
+('2222', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-95 second')),
+('3333', 'espresso lungo', datetime('now', 'localtime', '-99 seconds')),
+('3333', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-99 seconds')),
+('3333', 'tea', datetime('now', 'localtime', '-99 second')),
+('3333', 'tea', datetime('now', 'localtime', '-95 second')),
+('3333', 'espresso lungo', datetime('now', 'localtime', '-95 second')),
+('3333', 'Club-Mate 0,5 l', datetime('now', 'localtime', '-95 second')),
+('3333', 'Club-Mate 0,33 l', datetime('now', 'localtime', '-95 second'));
""")
con.close()
remove(fn)
class CoffeeDb(TestCase):
- def test_db_exists(self):
+ def test_db_loads(self):
cfg = Conf()
self.assertTrue(path.isfile(cfg.getCoffeeDbPath()))
- db = Db()
+ db = Db(cfg.getCoffeeDbPath())
self.assertIsNotNone(db.con)
self.assertIsNotNone(db.cur)
- def test_test_db_exists(self):
+ def test_test_db_loads(self):
create_test_db(TESTDB_FILENAME)
try:
db = Db(TESTDB_FILENAME)
self.assertIsNotNone(db.cur)
finally:
delete_test_db(TESTDB_FILENAME)
+
+class FailCoffeeDb(TestCase):
+ def test_db_path_not_set(self):
+ self.assertRaises(FileNotSetError, Db)
+
+class TopMateDrinkers(TestCase):
+ def test_test_top_mate_drinkers(self):
+ create_test_db(TESTDB_FILENAME)
+ try:
+ db = Db(TESTDB_FILENAME)
+ top = db.getTopMateDrinkers()
+ self.assertEqual(
+ top,
+ [
+ ("tester", 4*0.5 + 4*0.33),
+ ("clone", 0.5 + 2*0.33),
+ ("newer", 2*0.33),
+ ]
+ )
+ finally:
+ delete_test_db(TESTDB_FILENAME)
+
+ def test_test_top_mate_drinkers_len(self):
+ create_test_db(TESTDB_FILENAME)
+ try:
+ db = Db(TESTDB_FILENAME)
+ top = db.getTopMateDrinkers()
+ self.assertIsNotNone(top)
+ self.assertEqual(len(top), 3)
+ finally:
+ delete_test_db(TESTDB_FILENAME)
+
+ def test_top_mate_drinkers_len(self):
+ cfg = Conf()
+ db = Db(cfg.getCoffeeDbPath())
+ top = db.getTopMateDrinkers()
+ self.assertIsNotNone(top)
+ self.assertTrue(0 <= len(top))
+
+ def test_test_top_mate_drinkers_order(self):
+ create_test_db(TESTDB_FILENAME)
+ try:
+ db = Db(TESTDB_FILENAME)
+ top = db.getTopMateDrinkers()
+ topsorted = list(top)
+ topsorted.sort(key=lambda x: (x[1], x[0]), reverse=True)
+ self.assertEqual(
+ top,
+ topsorted
+ )
+ finally:
+ delete_test_db(TESTDB_FILENAME)
+
+ def test_top_mate_drinkers_order(self):
+ cfg = Conf()
+ db = Db(cfg.getCoffeeDbPath())
+ top = db.getTopMateDrinkers()
+ topsorted = list(top)
+ topsorted.sort(key=lambda x: (x[1], x[0]), reverse=True)
+ self.assertEqual(
+ top,
+ topsorted
+ )
+
+class TopTeaDrinkers(TestCase):
+ def setUp(self):
+ create_test_db(TESTDB_FILENAME)
+ self.db = Db(TESTDB_FILENAME)
+
+ def tearDown(self):
+ delete_test_db(TESTDB_FILENAME)
+
+ def test_top_tea_drinkers(self):
+ top = self.db.get_top_tea_drinkers()
+ assert top == [
+ ("clone", 2),
+ ("tester", 1),
+ ]
+
+class DrunkSum(TestCase):
+ tdy = datetime.now()
+ tdy += timedelta(days=1)
+ tdystr = tdy.strftime("%Y-%m-%d")
+ lw = tdy - timedelta(days=8)
+ lwstr = lw.strftime("%Y-%m-%d")
+
+ def test_espresso_sum(self):
+ create_test_db(TESTDB_FILENAME)
+ try:
+ db = Db(TESTDB_FILENAME)
+ drunk = db.getDrunkSum("espresso", self.lwstr, self.tdystr)
+ self.assertEqual(drunk, [])
+ finally:
+ delete_test_db(TESTDB_FILENAME)
+
+ def test_espressolungo_sum(self):
+ create_test_db(TESTDB_FILENAME)
+ try:
+ db = Db(TESTDB_FILENAME)
+ drunk = db.getDrunkSum("espresso lungo", self.lwstr, self.tdystr)
+ self.assertEqual(drunk, [
+ ("tester", 4),
+ ("newer", 2),
+ ("clone", 2),
+ ])
+ finally:
+ delete_test_db(TESTDB_FILENAME)
+
+ def test_mate_3_sum(self):
+ create_test_db(TESTDB_FILENAME)
+ try:
+ db = Db(TESTDB_FILENAME)
+ drunk = db.getDrunkSum("Club-Mate 0,33 l", self.lwstr, self.tdystr)
+ self.assertEqual(drunk, [
+ ("tester", 4),
+ ("newer", 2),
+ ("clone", 2),
+ ])
+ finally:
+ delete_test_db(TESTDB_FILENAME)
+
+ def test_mate_5_sum(self):
+ create_test_db(TESTDB_FILENAME)
+ try:
+ db = Db(TESTDB_FILENAME)
+ drunk = db.getDrunkSum("Club-Mate 0,5 l", self.lwstr, self.tdystr)
+ self.assertEqual(drunk, [
+ ("tester", 4),
+ ("clone", 1),
+ ])
+ finally:
+ delete_test_db(TESTDB_FILENAME)
+
+ def test_nof_args(self):
+ cfg = Conf()
+ db = Db(cfg.getCoffeeDbPath())
+ self.assertRaises(ArgCountError, db.getDrunkSum)
+ self.assertRaises(ArgCountError, db.getDrunkSum, "espresso")
+ self.assertRaises(
+ ArgCountError,
+ db.getDrunkSum,
+ "espresso", "2010-10-20"
+ )
+ self.assertRaises(
+ ArgCountError,
+ db.getDrunkSum,
+ "espresso", "lungo", "2010-10-20", "2020-10-20"
+ )
+
+ def test_all_mate_sum(self):
+ create_test_db(TESTDB_FILENAME)
+ try:
+ db = Db(TESTDB_FILENAME)
+ drunk = db.getDrunkSum(
+ "Club-Mate 0,5 l;Club-Mate 0,33 l",
+ self.lwstr,
+ self.tdystr
+ )
+ self.assertEqual(drunk, [
+ ("tester", 8),
+ ("newer", 2),
+ ("clone", 3),
+ ])
+ finally:
+ delete_test_db(TESTDB_FILENAME)
+
+ def test_all_mate_list(self):
+ create_test_db(TESTDB_FILENAME)
+ try:
+ db = Db(TESTDB_FILENAME)
+ drunk = db.getDrunkList(
+ "Club-Mate 0,5 l;Club-Mate 0,33 l",
+ self.lwstr,
+ self.tdystr
+ )
+ self.assertEqual(drunk, {
+ "tester": [4, 4],
+ "newer": [0, 2],
+ "clone": [1, 2],
+ })
+ finally:
+ delete_test_db(TESTDB_FILENAME)