]> rtime.felk.cvut.cz Git - hubacji1/coffee-getter.git/blobdiff - ut/test_db.py
Add tea drinkers ut
[hubacji1/coffee-getter.git] / ut / test_db.py
index 913af2a84951bd8a0769bff8ffc7a5c5ac132465..7f58aa5cb3b81c390cffb440e527e16698b4b7e3 100644 (file)
@@ -1,14 +1,16 @@
 # -*- coding: utf-8 -*-
 """Test database access."""
-from os import remove
+from datetime import datetime, timedelta
+from os import path, remove
 from sqlite3 import connect
 from unittest import TestCase
-from cbdb import Db
+from cbconf import Conf
+from cbdb import ArgCountError, Db, FileNotSetError
 
 TESTDB_FILENAME = ".tmptest.db"
 
-def create_test_db():
-    con = connect(TESTDB_FILENAME)
+def create_test_db(fn):
+    con = connect(fn)
     cur = con.cursor()
     cur.executescript("""
 pragma foreign_keys = ON;
@@ -24,6 +26,7 @@ ord integer not null default 999
 );
 
 insert or ignore into flavors values
+("tea", 7),
 ("espresso", 2),
 ("espresso lungo", 3),
 ("cappuccino", 1),
@@ -50,36 +53,235 @@ insert or ignore into days values
 ;
     """)
     cur.executescript("""
-INSERT INTO "users" VALUES('1111','tester');
-INSERT INTO "coffees" VALUES(1,'1111','espresso lungo','2019-03-20 11:22:43');
-INSERT INTO "coffees" VALUES(2,'1111','Club-Mate 0,5 l','2019-03-20 11:22:43');
-INSERT INTO "coffees" VALUES(3,'1111','Club-Mate 0,33 l','2019-03-20 11:22:43');
-INSERT INTO "coffees" VALUES(4,'1111','espresso lungo','2019-03-20 11:22:44');
-INSERT INTO "coffees" VALUES(5,'1111','Club-Mate 0,5 l','2019-03-20 11:22:44');
-INSERT INTO "coffees" VALUES(6,'1111','Club-Mate 0,33 l','2019-03-20 11:22:44');
-INSERT INTO "coffees" VALUES(7,'1111','espresso lungo','2019-03-20 11:22:45');
-INSERT INTO "coffees" VALUES(8,'1111','Club-Mate 0,5 l','2019-03-20 11:22:45');
-INSERT INTO "coffees" VALUES(9,'1111','Club-Mate 0,33 l','2019-03-20 11:22:45');
-INSERT INTO "coffees" VALUES(10,'1111','espresso lungo','2019-03-20 11:22:46');
-INSERT INTO "coffees" VALUES(11,'1111','Club-Mate 0,5 l','2019-03-20 11:22:46');
-INSERT INTO "coffees" VALUES(12,'1111','Club-Mate 0,33 l','2019-03-20 11:22:46');
+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', 'Club-Mate 0,33 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', 'espresso lungo', datetime('now', 'localtime', '-85 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,33 l', datetime('now', 'localtime', '-99 seconds')),
+('2222', 'espresso lungo', 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()
 
-def delete_test_db():
-    remove(TESTDB_FILENAME)
+def delete_test_db(fn):
+    remove(fn)
 
-class CoffeesTable(TestCase):
-    def test_db_exists(self):
-        db = Db()
+class CoffeeDb(TestCase):
+    def test_db_loads(self):
+        cfg = Conf()
+        self.assertTrue(path.isfile(cfg.getCoffeeDbPath()))
+        db = Db(cfg.getCoffeeDbPath())
         self.assertIsNotNone(db.con)
         self.assertIsNotNone(db.cur)
 
-    def test_test_db_exists(self):
-        create_test_db()
+    def test_test_db_loads(self):
+        create_test_db(TESTDB_FILENAME)
         try:
             db = Db(TESTDB_FILENAME)
             self.assertIsNotNone(db.con)
             self.assertIsNotNone(db.cur)
         finally:
-            delete_test_db()
+            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)