Example #1
0
    def test__update(self):
        def initialize():
            t = DbObject(DBH.test)
            t.tbl_.truncate()
            t.db_.commit()

            t.company_id = COMPANY_ID
            t.number = NUMBER
            t.name = NAME
            t.amount = AMOUNT
            t.start_date = START_DATE
            t.status = STATUS
            self.assertTrue(t.add())
            return t

        records = DbObject(DBH.test).set_.get()
        self.assertEqual(len(records), 0)

        t = initialize()
        records = DbObject(DBH.test).set_.get()
        self.assertEqual(len(records), 1)
        self.assertEqual(records[0], t)

        t2 = DbObject(DBH.test)
        t2.company_id = COMPANY_ID_2
        t2.number = NUMBER_2
        t2.name = NAME_2
        t2.amount = AMOUNT_2
        t2.start_date = START_DATE_2
        t2.status = STATUS_2

        # Record is not in database, should add
        self.assertTrue(t2.update())
        records = DbObject(DBH.test).set_.get()
        self.assertEqual(len(records), 2)
        self.assertNotEqual(t.id, t2.id)

        # Record is in database, should modify
        self.assertTrue(t2.update())
        records = DbObject(DBH.test).set_.get()
        self.assertEqual(len(records), 2)
        self.assertNotEqual(t.id, t2.id)

        # Update record with identical key fields, should modify t
        t = initialize()
        t2 = DbObject(DBH.test)
        t2.company_id = COMPANY_ID
        t2.number = NUMBER_2
        t2.name = NAME
        t2.amount = AMOUNT_2
        t2.start_date = START_DATE_2
        t2.status = STATUS_2

        self.assertTrue(t2.update(key_fields=["company_id", "name"]))

        tests = t.set_.get()
        self.assertEqual(len(tests), 1)
        self.assertEqual(t.id, t2.id)

        # Update record with non-identical key fields but matching id, should
        # modify.
        t = initialize()
        t2 = DbObject(DBH.test)
        t2.id = t.id
        t2.company_id = COMPANY_ID_2
        t2.number = NUMBER_2
        t2.name = NAME_2
        t2.amount = AMOUNT_2
        t2.start_date = START_DATE_2
        t2.status = STATUS_2

        self.assertTrue(t2.update(key_fields=["company_id", "name"]))

        tests = t.set_.get()
        self.assertEqual(len(tests), 1)
        self.assertEqual(t.id, t2.id)
        self.assertEqual(tests[0].company_id, t2.company_id)

        # Update record with non-identical key fields, no id, should add
        t = initialize()
        t2 = DbObject(DBH.test)
        t2.id = None
        t2.company_id = COMPANY_ID_2
        t2.number = NUMBER_2
        t2.name = NAME_2
        t2.amount = AMOUNT_2
        t2.start_date = START_DATE_2
        t2.status = STATUS_2

        self.assertTrue(t2.update(key_fields=["company_id", "name"]))

        tests = t.set_.get()
        self.assertEqual(len(tests), 2)
        self.assertNotEqual(t.id, t2.id)

        # Test with a key field not defined.
        t = initialize()
        t2 = DbObject(DBH.test)
        t2.id = None
        t2.company_id = COMPANY_ID_2

        self.assertTrue(t2.update(key_fields=["company_id", "name"]))

        tests = t.set_.get()
        self.assertEqual(len(tests), 2)
        self.assertNotEqual(t.id, t2.id)

        t3 = DbObject(DBH.test)
        t3.id = None
        t3.company_id = COMPANY_ID_2

        self.assertTrue(t3.update(key_fields=["company_id", "name"]))

        tests = t.set_.get()
        self.assertEqual(len(tests), 2)
        self.assertEqual(t2.id, t3.id)

        # Make sure it distinguishes between NULL and empty string.
        t = initialize()
        t2 = DbObject(DBH.test)
        t2.id = None
        t2.company_id = COMPANY_ID_2
        t2.name = ""

        self.assertTrue(t2.update(key_fields=["company_id", "name"]))

        t3 = DbObject(DBH.test)
        t3.id = None
        t3.company_id = COMPANY_ID_2

        self.assertTrue(t3.update(key_fields=["company_id", "name"]))

        tests = t.set_.get()
        self.assertEqual(len(tests), 3)
        self.assertNotEqual(t2.id, t3.id)

        t.tbl_.truncate()
        t.db_.commit()
        return