From fda320668ab5c7977589385590e67bebf75db0b2 Mon Sep 17 00:00:00 2001
From: Robin Sonnabend <robin@fsmpi.rwth-aachen.de>
Date: Sat, 11 Mar 2017 20:05:21 +0100
Subject: [PATCH] Add unit tests

---
 server.py |   3 +-
 tests.py  | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 111 insertions(+), 2 deletions(-)
 create mode 100644 tests.py

diff --git a/server.py b/server.py
index 77cc687..556db2d 100755
--- a/server.py
+++ b/server.py
@@ -1155,7 +1155,6 @@ def logout():
         flash("You are not logged in.", "alert-error")
     return redirect(url_for(".index"))
 
-print("making scheduler")
 def make_scheduler():
     pass
 try:
@@ -1166,8 +1165,8 @@ try:
         if signum == 0:
             check_and_send_reminders()
 except ImportError as exc:
-    print("uwsgi not found, falling back to apscheduler for cron-like tasks")
     def make_scheduler():
+        print("uwsgi not found, falling back to apscheduler for cron-like tasks")
         scheduler = BackgroundScheduler()
         scheduler.start()
         scheduler.add_job(
diff --git a/tests.py b/tests.py
new file mode 100644
index 0000000..b8602a0
--- /dev/null
+++ b/tests.py
@@ -0,0 +1,110 @@
+#!/usr/bin/env python3
+import os
+import unittest
+import tempfile
+import server as proto3
+from flask_migrate import upgrade as db_upgrade
+from models.database import ProtocolType, Protocol, DefaultTOP, TOP, Document, DecisionDocument, TodoState, Todo, Decision, MeetingReminder, Error, TodoMail, OldTodo, DefaultMeta, Meta
+
+import sqlite3
+
+def _create_db(sql_script, database_file):
+    connection = sqlite3.connect(database_file)
+    with open(sql_script, "r") as script_file:
+        connection.executescript(script_file.read())
+    connection.close()
+
+def _upgrade_db(program_dir):
+    migrations_path = os.path.join(program_dir, "migrations")
+    db_upgrade(directory=migrations_path)
+
+class GeneralTestCase(unittest.TestCase):
+    def _general_setup(self):
+        self.program_dir = os.getcwd()
+        proto3.app.config["TESTING"] = True
+        self.app = proto3.app.test_client()
+
+    def _create_tempdir(self):
+        self.tempdir = tempfile.TemporaryDirectory()
+        os.chdir(self.tempdir.name)
+
+    def _create_db(self, script_name):
+        self.database_file = "{}/{}".format(self.tempdir.name, "test-db.sqlite")
+        _create_db(os.path.join(self.program_dir, "dbdumps", "{}.sql".format(script_name)), self.database_file)
+        proto3.app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///{}".format(self.database_file)
+        with proto3.app.app_context():
+            _upgrade_db(self.program_dir)
+        
+    def _general_teardown(self):
+        self.tempdir.cleanup()
+        os.chdir(self.program_dir)
+        
+    def setUp(self):
+        pass
+
+    def tearDown(self):
+        pass
+
+STATUS_OK = 200
+STATUS_REDIRECT = 302
+STATUS_METHOD = 405
+
+class FullDBAnonymousTestCase(GeneralTestCase):
+    EXPECTED_SIMPLE_RESULTS = {
+        "/": (STATUS_OK, STATUS_METHOD),
+        "/documentation": (STATUS_REDIRECT, STATUS_METHOD),
+        "/types/list": (STATUS_REDIRECT, STATUS_METHOD),
+        "/protocols/list": (STATUS_OK, STATUS_METHOD),
+        "/todos/list": (STATUS_REDIRECT, STATUS_METHOD),
+        "/decisions/list": (STATUS_OK, STATUS_METHOD),
+        "/errors/list": (STATUS_REDIRECT, STATUS_METHOD),
+        "/todomails/list": (STATUS_REDIRECT, STATUS_METHOD),
+        "/login": (STATUS_OK, STATUS_OK),
+        "/logout": (STATUS_REDIRECT, STATUS_METHOD),
+    }
+
+    def setUp(self):
+        self._general_setup()
+        self._create_tempdir()
+        self._create_db("full")
+
+    def tearDown(self):
+        self._general_teardown()
+
+    def test_simple_status(self):
+        for route in self.EXPECTED_SIMPLE_RESULTS:
+            get_result = self.app.get(route)
+            post_result = self.app.post(route)
+            expected_get, expected_post = self.EXPECTED_SIMPLE_RESULTS[route]
+            assert get_result.status_code == expected_get
+            assert post_result.status_code == expected_post
+
+    def test_protocoltypes(self):
+        with proto3.app.app_context():
+            new_route = "/type/new"
+            assert self.app.get(new_route).status_code == STATUS_REDIRECT
+            assert self.app.post(new_route).status_code == STATUS_REDIRECT
+            protocoltypes = ProtocolType.query.all()
+            for protocoltype in protocoltypes:
+                show_route = "/type/show/{}".format(protocoltype.id)
+                assert self.app.get(show_route).status_code == STATUS_REDIRECT
+                assert self.app.post(show_route).status_code == STATUS_METHOD
+                edit_route = "/type/edit/{}".format(protocoltype.id)
+                assert self.app.get(edit_route).status_code == STATUS_REDIRECT
+                assert self.app.post(edit_route).status_code == STATUS_REDIRECT
+                delete_route = "/type/delete/{}".format(protocoltype.id)
+                assert self.app.get(delete_route).status_code == STATUS_REDIRECT
+                assert self.app.post(delete_route).status_code == STATUS_METHOD
+                new_reminder_route = "/type/reminders/new/{}".format(protocoltype.id)
+                assert self.app.get(new_reminder_route).status_code == STATUS_REDIRECT
+                assert self.app.post(new_reminder_route).status_code == STATUS_REDIRECT
+                new_top_route = "/type/tops/new/{}".format(protocoltype.id)
+                assert self.app.get(new_top_route).status_code == STATUS_REDIRECT
+                assert self.app.post(new_top_route).status_code == STATUS_REDIRECT
+                new_meta_route = "/defaultmeta/new/{}".format(protocoltype.id)
+                assert self.app.get(new_meta_route).status_code == STATUS_REDIRECT
+                assert self.app.post(new_meta_route).status_code == STATUS_REDIRECT
+                
+
+if __name__ == "__main__":
+    unittest.main()
-- 
GitLab