Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django Postgres IntegrityError

Can somebody please explain to me how to properly test Postgres DB errors, particularly IntegrityError. For example i have next test:

class TestSlugs(TestCase):
    # This slug must be unique
    b = BookPublisher(slug=self.duplicate_slug)
    self.assertRaises(IntegrityError, b.save)

    #check if there's only one BookPublisher
    self.assertEquals(BookPublisher.objects.count(), 1)

Here it catches the IntegrityError but then all operations will fail, because that's how postgres works, ok. I see in docs that i can use transaction.rollback() but where: in test or in save() method?

Also, i don't like the idea of writing rollbacks by hand, why can't django just try to save, and if it fails - give me IntegrityError and let me continue to work.

I'm using django 1.1

like image 244
Dmitry Shevchenko Avatar asked Aug 20 '09 11:08

Dmitry Shevchenko


2 Answers

Don't alter the save() method, since you want it to propagate through under normal operations. You should catch the exception in your Test class and rollback there (note that since you're testing transactions you must subclass TransactionalTestCase instead of the normal TestCase).

like image 136
Alex Gaynor Avatar answered Oct 30 '22 17:10

Alex Gaynor


not 100% sure that this is valid, but you could do:

def save(self):
    transaction.commit()
    try:
        super(MyModel, self).save()
    except IntegrityError:
        transaction.rollback()
    else:
        transaction.commit()
like image 44
Idan Gazit Avatar answered Oct 30 '22 15:10

Idan Gazit