from django.test import TestCase
from django.db import IntegrityError, transaction

from ..models import Project, Grant, GrantReport
from ..factories import ProjectFactory, GrantFactory, GrantReportFactory


class ProjectTestCase(TestCase):
    def test_creation(self):
        p = ProjectFactory()
        self.assertTrue(isinstance(p, Project))
        self.assertEqual(p.__str__(), p.name)

    def test_uniqueness(self):
        p1 = ProjectFactory()
        with transaction.atomic(), self.assertRaises(IntegrityError):
            ProjectFactory(name=p1.name, code=p1.code)
        p3 = ProjectFactory()
        self.assertTrue(isinstance(p3, Project))


class GrantTestCase(TestCase):
    def test_creation(self):
        g = GrantFactory()
        self.assertTrue(isinstance(g, Grant))
        self.assertEqual(g.__str__(), g.title)

    def test_uniqueness(self):
        g1 = GrantFactory()
        with transaction.atomic(), self.assertRaises(IntegrityError):
            GrantFactory(title=g1.title, code=g1.code)
        g3 = GrantFactory()
        self.assertTrue(isinstance(g3, Grant))


class GrantReportTestCase(TestCase):
    def test_creation(self):
        g = GrantReportFactory()
        self.assertTrue(isinstance(g, GrantReport))
        self.assertEqual(g.__str__(), g.title)

    def test_uniqueness(self):
        g1 = GrantReportFactory()
        with transaction.atomic(), self.assertRaises(IntegrityError):
            GrantReportFactory(title=g1.title, grant=g1.grant)
        g3 = GrantReportFactory()
        self.assertTrue(isinstance(g3, GrantReport))