def test_joint_conditions(self): """ Test that joint conditions must be on the same aliased instance. In particular P(rel__attr1=val1, rel__attr2=val2) produces only a single join, so the two conditions must be jointly satisfied on the same database row. """ self._assert_P_matches_Q( self.test_obj, p=P(m2ms__int_value=10, m2ms__char_value='bar'), q=Q(m2ms__int_value=10, m2ms__char_value='bar'), ) self._assert_P_matches_Q( self.test_obj, p=P(m2ms__int_value=10, m2ms__char_value='foo'), q=Q(m2ms__int_value=10, m2ms__char_value='foo'), ) self._assert_P_matches_Q( self.test_obj, p=P(m2ms__int_value=10) & OrmP(m2ms__char_value='bar'), q=Q(m2ms__int_value=10) & Q(m2ms__char_value='bar'), ) self._assert_P_matches_Q( self.test_obj, p=P(m2ms__int_value=10) & OrmP(m2ms__char_value='foo'), q=Q(m2ms__int_value=10) & Q(m2ms__char_value='foo'), )
def test_nested_q(self): predicate = OrmP(Q(int_value=1)) self.assertEqual(set(TestObj.objects.filter(predicate)), {self.obj1}) self.assertEqual(set(predicate.filter(self.objects)), {self.obj1}) predicate = OrmP(Q(Q(int_value=1))) self.assertEqual(set(TestObj.objects.filter(predicate)), {self.obj1}) self.assertEqual(set(predicate.filter(self.objects)), {self.obj1})
def test_children_relationship_single(self): parent = TestObj.objects.create(int_value=100) TestObj.objects.bulk_create( [TestObj(int_value=i, parent=parent) for i in range(3)]) self.assertIn(parent, TestObj.objects.filter(OrmP(children__int_value=2))) pred = OrmP(children__int_value=2) self.assertIn(parent, pred)
def test_reverse_foreign_key_default_name(self): test_obj = TestObj.objects.create(int_value=20) fkey = ForeignKeyModel.objects.create(test_obj=test_obj, int_value=30) other_fkey = ForeignKeyModel.objects.create() self.assertIn(fkey, test_obj.foreignkeymodel_set.all()) self.assertIn(test_obj, OrmP(foreignkeymodel=fkey)) self.assertIn(test_obj, OrmP(foreignkeymodel__int_value=30)) self.assertNotIn(test_obj, OrmP(foreignkeymodel=other_fkey))
def test_random_follow_relationship(self): make_test_objects() p1 = OrmP(parent__int_value__gt=10) obj = TestObj.objects.filter(parent__int_value__gt=10)[0] self.assertTrue(p1.eval(obj)) p2 = OrmP(parent__parent__int_value__gt=10) obj = TestObj.objects.filter(parent__parent__int_value__gt=10)[0] self.assertTrue(p2.eval(obj))
def test_m2m(self): test_obj = TestObj.objects.create(int_value=20) m2m = test_obj.m2ms.create(int_value=10) self.assertIn(test_obj, OrmP(m2ms=m2m)) self.assertIn(test_obj, OrmP(m2ms__int_value=10)) m2m2 = M2MModel.objects.create(int_value=30) self.assertNotIn(test_obj, OrmP(m2ms=m2m2)) self.assertNotIn(test_obj, OrmP(m2ms__int_value=30))
def test_and(self): p1 = OrmP(char_value__contains='hello') p2 = OrmP(int_value=50) p3 = OrmP(int_value__lt=20) pand1 = p1 & p2 pand2 = p2 & p3 self.assertTrue(pand1.eval(self.testobj)) self.assertFalse(pand2.eval(self.testobj)) self.assertNotIn(self.testobj, OrmP(int_value=20) & OrmP(int_value=50))
def test_reverse_one_to_one_relationships(self): test_obj = TestObj.objects.create() one_to_one = OneToOneModel.objects.create(test_obj=test_obj, int_value=10) other_one_to_one = OneToOneModel.objects.create() self.assertNotIn(test_obj, OrmP(onetoonemodel=other_one_to_one)) self.assertNotIn(test_obj, OrmP(onetoonemodel__int_value=20)) self.assertIn(test_obj, OrmP(onetoonemodel=one_to_one)) self.assertIn(test_obj, OrmP(onetoonemodel__int_value=10))
def test_direct_one_to_one_relationships(self): test_obj = TestObj.objects.create(int_value=1) other_test_obj = TestObj.objects.create(int_value=2) one_to_one = OneToOneModel.objects.create(test_obj=test_obj, int_value=10) self.assertIn(one_to_one, OrmP(test_obj=test_obj)) self.assertIn(one_to_one, OrmP(test_obj__int_value=1)) self.assertNotIn(one_to_one, OrmP(test_obj=other_test_obj)) self.assertNotIn(one_to_one, OrmP(test_obj__int_value=2))
def test_debug_orm_validations(self): self.assertIn(self.test_obj, P(int_value=10)) with mock.patch('predicate.debug.original_eval', return_value=False) as patched: with self.assertRaises(AssertionError): self.test_obj in OrmP(int_value=10) self.assertTrue(patched.called) with mock.patch('predicate.debug.original_eval', return_value=True) as patched: self.assertIn(self.test_obj, OrmP(int_value=10)) self.assertTrue(patched.called)
def test_reverse_one_to_one_relationships_custom_related_name(self): test_obj = TestObj.objects.create() custom_one_to_one = CustomRelatedNameOneToOneModel.objects.create( test_obj=test_obj, int_value=10) other_custom_one_to_one = CustomRelatedNameOneToOneModel.objects.create( ) self.assertNotIn(test_obj, OrmP(custom_one_to_one=other_custom_one_to_one)) self.assertNotIn(test_obj, OrmP(custom_one_to_one__int_value=20)) self.assertIn(test_obj, OrmP(custom_one_to_one=custom_one_to_one)) self.assertIn(test_obj, OrmP(custom_one_to_one__int_value=10))
def test_filter(self): predicate = OrmP(int_value=3) self.assertEqual(set(TestObj.objects.filter(predicate)), set()) self.assertEqual(set(predicate.filter(self.objects)), set()) predicate = OrmP(int_value=1) self.assertEqual(set(TestObj.objects.filter(predicate)), {self.obj1}) self.assertEqual(set(predicate.filter(self.objects)), {self.obj1}) predicate = OrmP(int_value=2) self.assertEqual(set(TestObj.objects.filter(predicate)), {self.obj2}) self.assertEqual(set(predicate.filter(self.objects)), {self.obj2}) predicate = OrmP(int_value__in=[1, 2]) self.assertEqual( set(TestObj.objects.filter(predicate)), {self.obj1, self.obj2}) self.assertEqual( set(predicate.filter(self.objects)), {self.obj1, self.obj2})
def test_dates(self): self.assertTrue( OrmP(date_value__year=self.date_obj.year).eval(self.testobj)) self.assertTrue( OrmP(date_value__month=self.date_obj.month).eval(self.testobj)) self.assertTrue( OrmP(date_value__day=self.date_obj.day).eval(self.testobj)) orm_week_day = self.date_obj.isoweekday() % 7 + 1 self.assertTrue( OrmP(date_value__week_day=orm_week_day).eval(self.testobj)) self.assertFalse( OrmP(date_value__year=self.date_obj.year + 1).eval(self.testobj)) self.assertFalse( OrmP(date_value__month=self.date_obj.month + 1).eval(self.testobj)) self.assertFalse( OrmP(date_value__day=self.date_obj.day + 1).eval(self.testobj)) self.assertFalse( P(date_value__week_day=orm_week_day + 1).eval(self.testobj))
def test_get_return_value(self): predicate = OrmP(int_value=1) self.assertEqual(TestObj.objects.get(predicate), self.obj1) self.assertEqual(predicate.get(self.objects), self.obj1)
def test_not(self): self.assertIn(self.testobj, OrmP(int_value=self.testobj.int_value)) self.assertNotIn(self.testobj, ~OrmP(int_value=self.testobj.int_value))
def test_or(self): self.testobj.m2ms.create(int_value=10) p1 = OrmP(char_value__contains='hello', int_value=50) p2 = OrmP(int_value__gt=80) p3 = OrmP(int_value__lt=20) por1 = p1 | p2 por2 = p2 | p3 self.assertTrue(por1.eval(self.testobj)) self.assertFalse(por2.eval(self.testobj)) self.assertIn(self.testobj, OrmP(char_value='hello world') | OrmP(int_value=50)) self.assertIn(self.testobj, OrmP(char_value='hello world') | ~OrmP(int_value=50)) self.assertNotIn( self.testobj, ~(OrmP(char_value='hello world') | OrmP(int_value=50))) self.assertIn(self.testobj, OrmP(m2ms__int_value=10)) self.assertIn( self.testobj, OrmP(char_value='hello world') | OrmP(m2ms__int_value=10)) self.assertIn( self.testobj, OrmP(m2ms__int_value=10) | OrmP(char_value='hello world')) self.assertIn( self.testobj, OrmP(m2ms__int_value=10) | OrmP(char_value='something else')) self.assertIn( self.testobj, OrmP(char_value='something else') | OrmP(m2ms__int_value=10)) self.assertIn(self.testobj, OrmP(int_value__in=[50, 20])) self.assertIn(self.testobj, OrmP(int_value=50) | OrmP(int_value=20))
def test_lte(self): self.assertFalse(OrmP(int_value__lte=20).eval(self.testobj)) self.assertTrue(OrmP(int_value__lte=50).eval(self.testobj))
def test_exclude(self): predicate = OrmP(int_value=3) self.assertEqual(set(TestObj.objects.exclude(predicate)), {self.obj1, self.obj2}) self.assertEqual(set(predicate.exclude(self.objects)), {self.obj1, self.obj2}) predicate = OrmP(int_value=1) self.assertEqual(set(TestObj.objects.exclude(predicate)), {self.obj2}) self.assertEqual(set(predicate.exclude(self.objects)), {self.obj2}) predicate = OrmP(int_value=2) self.assertEqual(set(TestObj.objects.exclude(predicate)), {self.obj1}) self.assertEqual(set(predicate.exclude(self.objects)), {self.obj1}) predicate = OrmP(int_value__in=[1, 2]) self.assertEqual(set(TestObj.objects.exclude(predicate)), set()) self.assertEqual(set(predicate.exclude(self.objects)), set())
def test_in_operator(self): p = OrmP(int_value__in=[50, 60]) p2 = OrmP(int_value__in=[60, 70]) self.assertTrue(self.testobj in p) self.assertFalse(self.testobj in p2)
def test_iregex(self): self.assertTrue(OrmP(char_value__iregex='Hel*o').eval(self.testobj))
def test_get_no_objects(self): predicate = OrmP(int_value=3) with self.assertRaises(ObjectDoesNotExist): TestObj.objects.get(predicate) with self.assertRaises(ObjectDoesNotExist): predicate.get(self.objects)
def test_null(self): self.assertTrue(OrmP(parent__isnull=True).eval(self.testobj)) self.assertFalse(OrmP(parent__isnull=False).eval(self.testobj))
def test_iendswith(self): self.assertFalse( OrmP(char_value__iendswith='hello').eval(self.testobj)) self.assertTrue(OrmP(char_value__iendswith='World').eval(self.testobj))
def test_istartswith(self): self.assertTrue( OrmP(char_value__istartswith='heLLo').eval(self.testobj)) self.assertFalse( OrmP(char_value__startswith='world').eval(self.testobj))
def test_case_sensitive_lookups_are_case_sensitive(self): self.assertFalse(OrmP(char_value='Hello world').eval(self.testobj)) self.assertFalse(OrmP(char_value__contains='heLLo').eval(self.testobj)) self.assertFalse( OrmP(char_value__startswith='Hello').eval(self.testobj)) self.assertFalse(OrmP(char_value__endswith='World').eval(self.testobj))
def test_datetime_cast(self): """ Tests that the Django ORM casting rules are obeyed in filtering by dates and times. """ self.assertIn( self.testobj, OrmP(datetime_value__gt=self.date_obj - timedelta(days=1))) self.assertIn( self.testobj, OrmP(datetime_value__gte=self.date_obj - timedelta(days=1))) self.assertNotIn( self.testobj, OrmP(datetime_value__lte=self.date_obj - timedelta(days=1))) self.assertNotIn( self.testobj, OrmP(datetime_value__lt=self.date_obj - timedelta(days=1))) self.assertNotIn( self.testobj, OrmP(datetime_value__gt=self.date_obj + timedelta(days=1))) self.assertNotIn( self.testobj, OrmP(datetime_value__gte=self.date_obj + timedelta(days=1))) self.assertIn( self.testobj, OrmP(datetime_value__lte=self.date_obj + timedelta(days=1))) self.assertIn( self.testobj, OrmP(datetime_value__lt=self.date_obj + timedelta(days=1))) self.assertNotIn( self.testobj, OrmP(datetime_value__gt=self.datetime_obj + timedelta(seconds=1))) self.assertNotIn( self.testobj, OrmP(datetime_value__gte=self.datetime_obj + timedelta(seconds=1))) self.assertIn( self.testobj, OrmP(datetime_value__lte=self.datetime_obj + timedelta(seconds=1))) self.assertIn( self.testobj, OrmP(datetime_value__lt=self.datetime_obj + timedelta(seconds=1))) self.assertIn( self.testobj, OrmP(date_value__gt=self.datetime_obj - timedelta(days=1))) self.assertIn( self.testobj, OrmP(date_value__gte=self.datetime_obj - timedelta(days=1))) self.assertNotIn( self.testobj, OrmP(date_value__lte=self.datetime_obj - timedelta(days=1))) self.assertNotIn( self.testobj, OrmP(date_value__lt=self.datetime_obj - timedelta(days=1))) self.assertNotIn( self.testobj, OrmP(date_value__gt=self.datetime_obj + timedelta(days=1))) self.assertNotIn( self.testobj, OrmP(date_value__gte=self.datetime_obj + timedelta(days=1))) self.assertIn( self.testobj, OrmP(date_value__lte=self.datetime_obj + timedelta(days=1))) self.assertIn( self.testobj, OrmP(date_value__lt=self.datetime_obj + timedelta(days=1)))
def test_get_multiple_objects(self): predicate = OrmP(int_value__in=[1, 2]) with self.assertRaises(MultipleObjectsReturned): TestObj.objects.get(predicate) with self.assertRaises(MultipleObjectsReturned): predicate.get(self.objects)
def test_pk_casting_queryset(self): qs = TestObj.objects.all() self.assertIn(self.testobj, TestObj.objects.filter(pk__in=qs)) self.assertIn(self.testobj, OrmP(pk__in=qs))
def test_lt(self): self.assertFalse(OrmP(int_value__lt=20).eval(self.testobj)) self.assertTrue(OrmP(int_value__lt=80).eval(self.testobj)) self.assertFalse(OrmP(int_value__lt=20.0).eval(self.testobj)) self.assertTrue(OrmP(int_value__lt=80.0).eval(self.testobj)) self.assertFalse(OrmP(int_value__lt=50).eval(self.testobj))
def test_regex(self): self.assertTrue(OrmP(char_value__regex='hel*o').eval(self.testobj)) self.assertFalse(OrmP(char_value__regex='Hel*o').eval(self.testobj))
def test_pk_casting_flat(self): pk_values_list = TestObj.objects.values_list('pk', flat=True) self.assertIn(self.testobj, TestObj.objects.filter(pk__in=pk_values_list)) self.assertIn(self.testobj, OrmP(pk__in=pk_values_list))