Esempio n. 1
0
class PartialIndexMultiTextWhereTest(SimpleTestCase):
    """Test simple fields and methods on the PartialIndex class with separate where_vendor='' arguments."""

    def setUp(self):
        self.idx = PartialIndex(fields=['a', 'b'], unique=True, where_postgresql='a = false', where_sqlite='a = 0')

    def test_no_unique(self):
        with self.assertRaisesMessage(ValueError, 'Unique must be True or False'):
            PartialIndex(fields=['a', 'b'], where_postgresql='a = false', where_sqlite='a = 0')

    def test_fields(self):
        self.assertEqual(self.idx.unique, True)
        self.assertEqual(self.idx.where, '')
        self.assertEqual(self.idx.where_postgresql, 'a = false')
        self.assertEqual(self.idx.where_sqlite, 'a = 0')

    def test_repr(self):
        self.assertEqual(repr(self.idx), "<PartialIndex: fields='a, b', unique=True, where_postgresql='a = false', where_sqlite='a = 0'>")

    def test_deconstruct(self):
        path, args, kwargs = self.idx.deconstruct()
        self.assertEqual(path, 'partial_index.PartialIndex')
        self.assertEqual((), args)
        self.assertEqual(kwargs['fields'], ['a', 'b'])
        self.assertEqual(kwargs['unique'], True)
        self.assertNotIn('where', kwargs)
        self.assertEqual(kwargs['where_postgresql'], 'a = false')
        self.assertEqual(kwargs['where_sqlite'], 'a = 0')
        self.assertIn('name', kwargs)  # Exact value of name is not tested.

    def test_suffix(self):
        self.assertEqual(self.idx.suffix, 'partial')

    def test_generated_name_ends_with_partial(self):
        idx = PartialIndex(fields=['a', 'b'], unique=False, where_postgresql='a = false', where_sqlite='a = 0')
        idx.set_name_with_model(AB)
        self.assertEqual(idx.name[-8:], '_partial')

    def test_where_postgresql_changes_generated_name(self):
        idx1 = PartialIndex(fields=['a', 'b'], unique=False, where_postgresql='a = false', where_sqlite='a = 0')
        idx1.set_name_with_model(AB)
        idx2 = PartialIndex(fields=['a', 'b'], unique=False, where_postgresql='a = true', where_sqlite='a = 0')
        idx2.set_name_with_model(AB)
        self.assertNotEqual(idx1.name, idx2.name)

    def test_where_sqlite_changes_generated_name(self):
        idx1 = PartialIndex(fields=['a', 'b'], unique=False, where_postgresql='a = false', where_sqlite='a = 0')
        idx1.set_name_with_model(AB)
        idx2 = PartialIndex(fields=['a', 'b'], unique=False, where_postgresql='a = false', where_sqlite='a = 1')
        idx2.set_name_with_model(AB)
        self.assertNotEqual(idx1.name, idx2.name)
Esempio n. 2
0
class PartialIndexSinglePQWhereTest(SimpleTestCase):
    """Test simple fields and methods on the PartialIndex class with a Q-based where predicate."""

    def setUp(self):
        self.idx = PartialIndex(fields=['a', 'b'], unique=True, where=PQ(a__isnull=True))

    def test_no_unique(self):
        with self.assertRaisesMessage(ValueError, 'Unique must be True or False'):
            PartialIndex(fields=['a', 'b'], where=PQ(a__isnull=True))

    def test_fields(self):
        self.assertEqual(self.idx.unique, True)
        self.assertEqual(self.idx.where, PQ(a__isnull=True))
        self.assertEqual(self.idx.where_postgresql, '')
        self.assertEqual(self.idx.where_sqlite, '')

    def test_repr(self):
        self.assertEqual(repr(self.idx), "<PartialIndex: fields='a, b', unique=True, where=<PQ: (AND: ('a__isnull', True))>>")

    def test_deconstruct_pq(self):
        path, args, kwargs = self.idx.deconstruct()
        self.assertEqual(path, 'partial_index.PartialIndex')
        self.assertEqual((), args)
        self.assertEqual(kwargs['fields'], ['a', 'b'])
        self.assertEqual(kwargs['unique'], True)
        self.assertEqual(kwargs['where'], PQ(a__isnull=True))
        self.assertNotIn('where_postgresql', kwargs)
        self.assertNotIn('where_sqlite', kwargs)
        self.assertIn('name', kwargs)  # Exact value of name is not tested.

    def test_suffix(self):
        self.assertEqual(self.idx.suffix, 'partial')

    def test_generated_name_ends_with_partial(self):
        idx = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True))
        idx.set_name_with_model(AB)
        self.assertEqual(idx.name[-8:], '_partial')

    def test_same_args_same_name(self):
        idx1 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True))
        idx1.set_name_with_model(AB)
        idx2 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True))
        idx2.set_name_with_model(AB)
        self.assertEqual(idx1.name, idx2.name)

    def test_field_sort_changes_generated_name(self):
        idx1 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True))
        idx1.set_name_with_model(AB)
        idx2 = PartialIndex(fields=['a', '-b'], unique=False, where=PQ(a__isnull=True))
        idx2.set_name_with_model(AB)
        self.assertNotEqual(idx1.name, idx2.name)

    def test_field_order_changes_generated_name(self):
        idx1 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True))
        idx1.set_name_with_model(AB)
        idx2 = PartialIndex(fields=['b', 'a'], unique=False, where=PQ(a__isnull=True))
        idx2.set_name_with_model(AB)
        self.assertNotEqual(idx1.name, idx2.name)

    def test_unique_changes_generated_name(self):
        idx1 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True))
        idx1.set_name_with_model(AB)
        idx2 = PartialIndex(fields=['a', 'b'], unique=True, where=PQ(a__isnull=True))
        idx2.set_name_with_model(AB)
        self.assertNotEqual(idx1.name, idx2.name)

    def test_where_changes_generated_name(self):
        idx1 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=True))
        idx1.set_name_with_model(AB)
        idx2 = PartialIndex(fields=['a', 'b'], unique=False, where=PQ(a__isnull=False))
        idx2.set_name_with_model(AB)
        self.assertNotEqual(idx1.name, idx2.name)