def test_reorder(self):
        new_cat_1 = self.db.add_category(title="TITLE1")
        new_cat_2 = self.db.add_category(title="TITLE2")
        new_cat_1_filter = self.db.add_filter(new_cat_1.id)
        new_cat_2_filter = self.db.add_filter(new_cat_2.id)
        cats = [pst.db.row2dict(row) for row in self.db.get_process_categories()]
        self.assertGreater(len(cats), 2)
        for cat in cats:
            if cat["title"] == "TITLE2":
                cat["order"] = 1
            if cat["title"] == "TITLE1":
                cat["order"] = 2
        test_json = json.dumps(cats, indent=4, sort_keys=True)
        response = self.webapp_request("/data/reorder_categories", method="POST", data=test_json)

        jsonobj = json.loads("\n\r".join(response.body))
        new_cat_1_amended_from_json = [x for x in jsonobj if x["title"] == "TITLE1"][0]
        new_cat_2_amended_from_json = [x for x in jsonobj if x["title"] == "TITLE2"][0]
        self.assertEqual(int(new_cat_1_amended_from_json["order"]), 2)
        self.assertEqual(int(new_cat_2_amended_from_json["order"]), 1)

        self.db.session.close()
        self.db = DBConnection(db_filename=self.testdb)

        cats2 = [pst.db.row2dict(row) for row in self.db.get_process_categories()]
        new_cat_1_amended = [x for x in cats2 if x["title"] == "TITLE1"][0]
        new_cat_2_amended = [x for x in cats2 if x["title"] == "TITLE2"][0]
        self.assertEqual(int(new_cat_1_amended["order"]), 2)
        self.assertEqual(int(new_cat_2_amended["order"]), 1)
    def setUp(self):

        self.testdb = str(time.time()) + ".db"
        self.db = DBConnection(db_filename=self.testdb)
        # testhelpers.add_process_and_type(self.db)

        WEB_PORT = 8076
        self.local = cherrypy.lib.httputil.Host("127.0.0.1", 50000, "")
        self.remote = cherrypy.lib.httputil.Host("127.0.0.1", WEB_PORT, "")
        SCREENSHOT_FOLDER = "testscreenshots/"
        self.server = pst.WebServer({"port": WEB_PORT, "screenshots_dir": SCREENSHOT_FOLDER, "db": self.testdb})
class TestWebService(BaseCherryPyTestCase):
    def setUp(self):

        self.testdb = str(time.time()) + ".db"
        self.db = DBConnection(db_filename=self.testdb)
        # testhelpers.add_process_and_type(self.db)

        WEB_PORT = 8076
        self.local = cherrypy.lib.httputil.Host("127.0.0.1", 50000, "")
        self.remote = cherrypy.lib.httputil.Host("127.0.0.1", WEB_PORT, "")
        SCREENSHOT_FOLDER = "testscreenshots/"
        self.server = pst.WebServer({"port": WEB_PORT, "screenshots_dir": SCREENSHOT_FOLDER, "db": self.testdb})

    def test_get_process_categories(self):
        response = self.webapp_request("/data/process_categories")
        self.assertEqual(response.output_status, "200 OK")
        # response body is wrapped into a list internally by CherryPy
        jsonobj = json.loads("\n\r".join(response.body))
        print jsonobj
        self.assertTrue(len(jsonobj) > 0)
        # self.assertEqual(response.body, ['hello world'])

    def test_create_process_category(self):
        test_title = random_string(10)
        test_title_search = random_string(10)
        test_filename_search = random_string(10)
        current_process = pst.processes.get_current()
        current_process.title = "TEST TITLE " + test_title_search
        current_process.filename = "TEST FILENAME " + test_filename_search
        process = self.db.add_process(current_process)
        response = self.webapp_request(
            "/data/process_categories",
            method="POST",
            title=test_title,
            title_search=test_title_search,
            filename_search=test_filename_search,
            assign=True,
        )
        jsonobj = json.loads("\n\r".join(response.body))
        new_cat = [x for x in jsonobj if x["title"] == test_title][0]
        self.assertEqual(new_cat["title"], test_title)
        self.assertEqual(new_cat["filters"][0]["title_search"], test_title_search)
        self.assertEqual(new_cat["filters"][0]["filename_search"], test_filename_search)

        process_responce = self.webapp_request("/data/processes", id=process.id)
        process_jsonobj = json.loads("\n\r".join(process_responce.body))
        self.assertEqual(new_cat["id"], process_jsonobj[0]["process_categories"][0]["id"])

    def test_add_process_category_filter(self):
        test_title = random_string(10)
        test_title_search = random_string(10)
        test_filename_search = random_string(10)
        current_process = pst.processes.get_current()
        current_process.title = "TEST TITLE " + test_title_search
        current_process.filename = "TEST FILENAME " + test_filename_search
        process = self.db.add_process(current_process)
        response = self.webapp_request(
            "/data/process_categories",
            method="POST",
            title=test_title,
            title_search=test_title_search,
            filename_search=test_filename_search,
            assign=True,
        )
        jsonobj = json.loads("\n\r".join(response.body))
        new_cat = [x for x in jsonobj if x["title"] == test_title][0]
        self.assertEqual(new_cat["title"], test_title)
        self.assertEqual(new_cat["filters"][0]["title_search"], test_title_search)
        self.assertEqual(new_cat["filters"][0]["filename_search"], test_filename_search)
        test_title_search2 = random_string(10)
        test_filename_search2 = random_string(10)
        response2 = self.webapp_request(
            "/data/category_filters",
            method="POST",
            title_search=test_title_search2,
            filename_search=test_filename_search2,
            category_id=new_cat["id"],
            assign=True,
        )
        jsonobj2 = json.loads("\n\r".join(response2.body))
        response3 = self.webapp_request("/data/process_categories")
        jsonobj3 = json.loads("\n\r".join(response3.body))
        new_cat2 = [x for x in jsonobj3 if x["title"] == test_title][0]
        self.assertGreater(len(new_cat2["filters"]), 1)
        self.assertEqual(new_cat2["filters"][1]["title_search"], test_title_search2)
        self.assertEqual(new_cat2["filters"][1]["filename_search"], test_filename_search2)

    def test_delete_process(self):
        added_process = testhelpers.add_process(self.db)
        response = self.webapp_request("/data/processes", method="DELETE", id=added_process.id)
        print response.body
        processes = self.db.get_processes()
        self.assertEqual(processes.count(), 0)

    def test_delete_process_category(self):
        test_title = random_string(10)
        test_title_search = random_string(10)
        test_filename_search = random_string(10)
        response = self.webapp_request(
            "/data/process_categories",
            method="POST",
            title=test_title,
            title_search=test_title_search,
            filename_search=test_filename_search,
            assign=True,
        )
        jsonobj = json.loads("\n\r".join(response.body))
        new_cat = [x for x in jsonobj if x["title"] == test_title][0]
        self.assertEqual(new_cat["title"], test_title)
        self.assertEqual(new_cat["filters"][0]["title_search"], test_title_search)
        self.assertEqual(new_cat["filters"][0]["filename_search"], test_filename_search)
        response2 = self.webapp_request("/data/process_categories", method="DELETE", id=new_cat["id"], assign=True)
        jsonobj2 = json.loads("\n\r".join(response2.body))
        print jsonobj2
        self.assertEqual(len(jsonobj2), 1)
        self.assertEqual(len([x for x in jsonobj2 if x["title"] == test_title]), 0)

    def test_delete_category_filter(self):
        test_title = random_string(10)
        test_title_search = random_string(10)
        test_filename_search = random_string(10)
        response = self.webapp_request(
            "/data/process_categories",
            method="POST",
            title=test_title,
            title_search=test_title_search,
            filename_search=test_filename_search,
            assign=True,
        )
        jsonobj = json.loads("\n\r".join(response.body))
        new_cat = [x for x in jsonobj if x["title"] == test_title][0]
        self.assertEqual(new_cat["title"], test_title)
        self.assertEqual(new_cat["filters"][0]["title_search"], test_title_search)
        self.assertEqual(new_cat["filters"][0]["filename_search"], test_filename_search)
        test_title_search2 = random_string(10)
        test_filename_search2 = random_string(10)
        response2 = self.webapp_request(
            "/data/category_filters",
            method="POST",
            title_search=test_title_search2,
            filename_search=test_filename_search2,
            category_id=new_cat["id"],
            assign=True,
        )

        response3 = self.webapp_request("/data/process_categories")
        jsonobj3 = json.loads("\n\r".join(response3.body))
        new_cat2 = [x for x in jsonobj3 if x["title"] == test_title][0]
        self.assertGreater(len(new_cat2["filters"]), 1)
        self.assertEqual(new_cat2["filters"][1]["title_search"], test_title_search2)
        self.assertEqual(new_cat2["filters"][1]["filename_search"], test_filename_search2)

        response4 = self.webapp_request(
            "/data/category_filters",
            method="DELETE",
            id=new_cat2["filters"][1]["id"],
            category_id=new_cat2["id"],
            assign=True,
        )
        jsonobj4 = json.loads("\n\r".join(response4.body))
        self.assertEqual(1, len(jsonobj4))

        response5 = self.webapp_request("/data/process_categories")
        jsonobj5 = json.loads("\n\r".join(response3.body))
        new_cat5 = [x for x in jsonobj5 if x["title"] == test_title][0]
        self.assertGreater(len(new_cat5["filters"]), 1)

    def test_reorder(self):
        new_cat_1 = self.db.add_category(title="TITLE1")
        new_cat_2 = self.db.add_category(title="TITLE2")
        new_cat_1_filter = self.db.add_filter(new_cat_1.id)
        new_cat_2_filter = self.db.add_filter(new_cat_2.id)
        cats = [pst.db.row2dict(row) for row in self.db.get_process_categories()]
        self.assertGreater(len(cats), 2)
        for cat in cats:
            if cat["title"] == "TITLE2":
                cat["order"] = 1
            if cat["title"] == "TITLE1":
                cat["order"] = 2
        test_json = json.dumps(cats, indent=4, sort_keys=True)
        response = self.webapp_request("/data/reorder_categories", method="POST", data=test_json)

        jsonobj = json.loads("\n\r".join(response.body))
        new_cat_1_amended_from_json = [x for x in jsonobj if x["title"] == "TITLE1"][0]
        new_cat_2_amended_from_json = [x for x in jsonobj if x["title"] == "TITLE2"][0]
        self.assertEqual(int(new_cat_1_amended_from_json["order"]), 2)
        self.assertEqual(int(new_cat_2_amended_from_json["order"]), 1)

        self.db.session.close()
        self.db = DBConnection(db_filename=self.testdb)

        cats2 = [pst.db.row2dict(row) for row in self.db.get_process_categories()]
        new_cat_1_amended = [x for x in cats2 if x["title"] == "TITLE1"][0]
        new_cat_2_amended = [x for x in cats2 if x["title"] == "TITLE2"][0]
        self.assertEqual(int(new_cat_1_amended["order"]), 2)
        self.assertEqual(int(new_cat_2_amended["order"]), 1)

    def tearDown(self):
        self.server.close()
        self.db.session.close()
        rm(self.testdb)