class TestGDBTableUpdater(TestCase):

    @classmethod
    def setUpClass(cls):
        tool = PythonTool()
        parameters = tool.getParameterInfo()
        params = tool.processParameters(parameters=parameters)
        out_f = params["connection_folder"]
        out_n = params["edit_connection_name"]
        plat = params["platform"]
        inst = params["instance"]

        cls.weaver_attributes = params["table_attributes"]

        edit_version_name = params["edit_version_name"]
        sql_table = params["sql_table"]
        gdb_table = params["gdb_table"]
        gdb_table_name = params["gdb_table_name"]
        opt = params["opt"]

        cls.sde_file = params["gis_gdb"]
        manager = Manager(opt=opt, connection_folder=out_f, target_sde=cls.sde_file,
                          new_version=edit_version_name, new_connection=out_n, platform=plat, instance=inst)
        manager.clean_previous()
        cls.version_sde_file = manager.connect_version()

        result = Tool.compare_tables(sql_table=sql_table, gdb_table=gdb_table)

        cls.match_fields = result["match_fields"]
        cls.add_rows = result["add_rows"]
        cls.exist_rows = result["exist_rows"]
        cls.folio_ids = result["folioIds"]

        env.workspace = cls.version_sde_file
        cls.editor = da.Editor(cls.version_sde_file)
        cls.version_gdb_table = arcpy.ListTables("*{}*".format(gdb_table_name))[0]

    def setUp(self):
        self.editor.startEditing()
        # All of the tests use this updater which has write rows and remove rows determined by the compare tables function
        self.updater = Updater(weaver_attributes=self.weaver_attributes, folioIds=self.folio_ids, match_fields=self.match_fields, write_table=self.version_gdb_table, read_rows=self.add_rows,
                               remove_rows=self.exist_rows, version_sde=self.version_sde_file, editor=self.editor)

    # def test_count_pid(self):
    #     result = self.updater.count_pid()
    #     if not len(self.updater.read_rows):
    #         self.assertEquals(result, {})
    #     else:
    #         self.assertTrue(result)

    def test_delete_rows(self):
        # change this to a folio in to be removed
        result = self.updater.delete_rows()
        if not len(self.updater.remove_rows):
            self.assertEquals(0, result)
        else:
            self.assertGreater(result, 0)

    def test_insert_rows(self):
        result = self.updater.insert_rows()
        if not len(self.updater.read_rows):
            self.assertEquals(0, result)
        else:
            self.assertEquals(len(self.updater.read_rows), result)

    def test_update_table(self):
        result = self.updater.update_table()
        if len(self.updater.read_rows) == len(self.updater.remove_rows):
            self.assertEqual(result[0], result[1])
        elif len(self.updater.read_rows) < len(self.updater.remove_rows):
            self.assertGreater(result[0], result[1])
        elif len(self.updater.read_rows) > len(self.updater.remove_rows):
            self.assertLess(result[0], result[1])

    def test_perform_update(self):
        result = self.updater.perform_update()
        self.assertTrue(result)

    def tearDown(self):
        self.updater = None
        self.editor.stopEditing(False)

    @classmethod
    def tearDownClass(cls):
        for x in [cls.version_sde_file]:
            try:
                os.remove(x)
            except:
                pass

        del cls.editor
class TestLeaseTableUpdater(TestCase):

    @classmethod
    def setUpClass(cls):
        tool = LeaseUpdateTool()
        params = tool.getParameterInfo()
        params = tool.processParameters(parameters=params)
        out_f = params["connection_folder"]
        out_n = params["edit_connection_name"]
        plat = params["platform"]
        inst = params["instance"]

        edit_version_name = params["edit_version_name"]
        sql_table = params["sql_table"]
        gdb_table = params["gdb_table"]
        gdb_table_name = params["gdb_table_name"]
        opt = params["opt"]

        cls.sde_file = params["gis_gdb"]
        manager = Manager(opt=opt, connection_folder=out_f, target_sde=cls.sde_file,
                          new_version=edit_version_name, new_connection=out_n, platform=plat, instance=inst)
        manager.clean_previous()
        cls.version_sde_file = manager.connect_version()

        cls.join_field = params["join_field"]
        cls.agreement_field = params["agreement_field"]
        cls.leasehold_field = params["leasehold_field"]

        result = Tool.compare_tables(sql_table=sql_table, gdb_table=gdb_table)

        cls.match_fields = result["match_fields"]
        cls.add_rows = result["add_rows"]
        cls.exist_rows = result["exist_rows"]

        env.workspace = cls.version_sde_file
        cls.editor = da.Editor(cls.version_sde_file)
        cls.version_gdb_table = arcpy.ListTables("*{}*".format(gdb_table_name))[0]

    def setUp(self):
        self.editor.startEditing(False, True)
        # All of the tests use this updater which has write rows and remove rows determined by the compare tables function
        self.updater = Updater(match_fields=self.match_fields, write_table=self.version_gdb_table,
                               read_rows=self.add_rows,
                               remove_rows=self.exist_rows, version_sde=self.version_sde_file, editor=self.editor)

    def test_delete_rows(self):
        # change this to a folio in to be removed
        result = self.updater.delete_rows()
        if not len(self.updater.remove_rows):
            self.assertEquals(0, result)
        else:
            self.assertGreater(result, 0)

    def test_insert_rows(self):
        result = self.updater.insert_rows()
        if not len(self.updater.read_rows):
            self.assertEquals(0, result)
        else:
            self.assertEquals(len(self.updater.read_rows), result)

    def test_update_table(self):
        result = self.updater.update_table()
        if len(self.updater.read_rows) == len(self.updater.remove_rows):
            self.assertEqual(result[0], result[1])
        elif len(self.updater.read_rows) < len(self.updater.remove_rows):
            self.assertGreater(result[0], result[1])
        elif len(self.updater.read_rows) > len(self.updater.remove_rows):
            self.assertLess(result[0], result[1])

    def test_perform_update(self):
        result = self.updater.perform_update()
        self.assertTrue(result)

    def test_concatenate(self):
        result = self.updater.concatenate(self.join_field, self.agreement_field, self.leasehold_field)
        self.assertTrue(result)

    def tearDown(self):
        self.updater = None
        self.editor.stopEditing(False)