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)
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)