def test_escaping(self): # Underscores, percent signs and backslashes have special meaning in the # underlying SQL code, but Django handles the quoting of them automatically. b8 = Book(title='Book_ with underscore', pubdate=datetime(2005, 11, 20)) b8.save() self.assertQuerysetEqual(Book.objects.filter(title__startswith='Book'), [ '<Book: Book_ with underscore>', '<Book: Book 5>', '<Book: Book 6>', '<Book: Book 4>', '<Book: Book 2>', '<Book: Book 3>', '<Book: Book 7>', '<Book: Book 1>', ]) self.assertQuerysetEqual( Book.objects.filter(title__startswith='Book_'), ['<Book: Book_ with underscore>']) b9 = Book(title='Book% with percent sign', pubdate=datetime(2005, 11, 21)) b9.save() self.assertQuerysetEqual(Book.objects.filter(title__startswith='Book'), [ '<Book: Book% with percent sign>', '<Book: Book_ with underscore>', '<Book: Book 5>', '<Book: Book 6>', '<Book: Book 4>', '<Book: Book 2>', '<Book: Book 3>', '<Book: Book 7>', '<Book: Book 1>', ]) self.assertQuerysetEqual( Book.objects.filter(title__startswith='Book%'), ['<Book: Book% with percent sign>']) b10 = Book(title='Book with \\ backslash', pubdate=datetime(2005, 11, 22)) b10.save() self.assertQuerysetEqual(Book.objects.filter(title__contains='\\'), ['<Book: Book with \ backslash>'])
def test_m2m_signals(self): """ Assigning and removing to/from m2m shouldn't generate an m2m signal """ b1 = Book(title='Snow Crash', pubdate='2012-02-02 12:00') self.get_signal_output(b1.save) a1 = Author(name='Neal Stephenson') self.get_signal_output(a1.save) self.assertEqual(self.get_signal_output(setattr, b1, 'authors', [a1]), []) self.assertEqual(self.get_signal_output(setattr, b1, 'authors', []), [])
def test_model_signals(self): """ Model saves should throw some signals. """ a1 = Author(name='Neal Stephenson') self.assertEqual(self.get_signal_output(a1.save), [ "pre_save signal, Neal Stephenson", "post_save signal, Neal Stephenson", "Is created" ]) b1 = Book(title='Snow Crash', pubdate='2012-02-02 12:00') self.assertEqual(self.get_signal_output(b1.save), [ "pre_save signal, Snow Crash", "post_save signal, Snow Crash", "Is created" ])
def setUp(self): # Create a few Authors. self.au1 = Author(name='Author 1') self.au1.save() self.au2 = Author(name='Author 2') self.au2.save() # Create a couple of Books. self.b1 = Book(title='Book 1', pubdate=datetime(2005, 7, 26), author=self.au1) self.b1.save() self.b2 = Book(title='Book 2', pubdate=datetime(2005, 7, 27), author=self.au1) self.b2.save() self.b3 = Book(title='Book 3', pubdate=datetime(2005, 7, 27), author=self.au1) self.b3.save() self.b4 = Book(title='Book 4', pubdate=datetime(2005, 7, 28), author=self.au1) self.b4.save() self.b5 = Book(title='Book 5', pubdate=datetime(2005, 8, 1, 9, 0), author=self.au2) self.b5.save() self.b6 = Book(title='Book 6', pubdate=datetime(2005, 8, 1, 8, 0), author=self.au2) self.b6.save() self.b7 = Book(title='Book 7', pubdate=datetime(2005, 7, 27), author=self.au2) self.b7.save() # Create a few Tags. self.t1 = Tag(name='Tag 1') self.t1.save() self.t1.articles.add(self.b1, self.b2, self.b3) self.t2 = Tag(name='Tag 2') self.t2.save() self.t2.articles.add(self.b3, self.b4, self.b5) self.t3 = Tag(name='Tag 3') self.t3.save() self.t3.articles.add(self.b5, self.b6, self.b7)
def test_regex_backreferencing(self): # grouping and backreferences now = datetime.now() b10 = Book(pubdate=now, title='foobar') b10.save() b11 = Book(pubdate=now, title='foobaz') b11.save() b12 = Book(pubdate=now, title='ooF') b12.save() b13 = Book(pubdate=now, title='foobarbaz') b13.save() b14 = Book(pubdate=now, title='zoocarfaz') b14.save() b15 = Book(pubdate=now, title='barfoobaz') b15.save() b16 = Book(pubdate=now, title='bazbaRFOO') b16.save() self.assertQuerysetEqual( Book.objects.filter(title__regex=r'b(.).*b\1'), ['<Book: barfoobaz>', '<Book: bazbaRFOO>', '<Book: foobarbaz>'])
def test_regex(self): # Create some articles with a bit more interesting names for testing field lookups: for a in Book.objects.all(): a.delete() now = datetime.now() b1 = Book(pubdate=now, title='f') b1.save() b2 = Book(pubdate=now, title='fo') b2.save() b3 = Book(pubdate=now, title='foo') b3.save() b4 = Book(pubdate=now, title='fooo') b4.save() b5 = Book(pubdate=now, title='hey-Foo') b5.save() b6 = Book(pubdate=now, title='bar') b6.save() b7 = Book(pubdate=now, title='AbBa') b7.save() b8 = Book(pubdate=now, title='baz') b8.save() b9 = Book(pubdate=now, title='baxZ') b9.save() # zero-or-more self.assertQuerysetEqual( Book.objects.filter(title__regex=r'fo*'), ['<Book: f>', '<Book: fo>', '<Book: foo>', '<Book: fooo>']) self.assertQuerysetEqual(Book.objects.filter(title__iregex=r'fo*'), [ '<Book: f>', '<Book: fo>', '<Book: foo>', '<Book: fooo>', '<Book: hey-Foo>', ]) # one-or-more self.assertQuerysetEqual(Book.objects.filter(title__regex=r'fo+'), ['<Book: fo>', '<Book: foo>', '<Book: fooo>']) # wildcard self.assertQuerysetEqual(Book.objects.filter(title__regex=r'fooo?'), ['<Book: foo>', '<Book: fooo>']) # leading anchor self.assertQuerysetEqual( Book.objects.filter(title__regex=r'^b'), ['<Book: bar>', '<Book: baxZ>', '<Book: baz>']) self.assertQuerysetEqual(Book.objects.filter(title__iregex=r'^a'), ['<Book: AbBa>']) # trailing anchor self.assertQuerysetEqual(Book.objects.filter(title__regex=r'z$'), ['<Book: baz>']) self.assertQuerysetEqual(Book.objects.filter(title__iregex=r'z$'), ['<Book: baxZ>', '<Book: baz>']) # character sets self.assertQuerysetEqual(Book.objects.filter(title__regex=r'ba[rz]'), ['<Book: bar>', '<Book: baz>']) self.assertQuerysetEqual(Book.objects.filter(title__regex=r'ba.[RxZ]'), ['<Book: baxZ>']) self.assertQuerysetEqual( Book.objects.filter(title__iregex=r'ba[RxZ]'), ['<Book: bar>', '<Book: baxZ>', '<Book: baz>']) # and more articles: b10 = Book(pubdate=now, title='foobar') b10.save() b11 = Book(pubdate=now, title='foobaz') b11.save() b12 = Book(pubdate=now, title='ooF') b12.save() b13 = Book(pubdate=now, title='foobarbaz') b13.save() b14 = Book(pubdate=now, title='zoocarfaz') b14.save() b15 = Book(pubdate=now, title='barfoobaz') b15.save() b16 = Book(pubdate=now, title='bazbaRFOO') b16.save() # alternation self.assertQuerysetEqual(Book.objects.filter(title__regex=r'oo(f|b)'), [ '<Book: barfoobaz>', '<Book: foobar>', '<Book: foobarbaz>', '<Book: foobaz>', ]) self.assertQuerysetEqual(Book.objects.filter(title__iregex=r'oo(f|b)'), [ '<Book: barfoobaz>', '<Book: foobar>', '<Book: foobarbaz>', '<Book: foobaz>', '<Book: ooF>', ]) self.assertQuerysetEqual( Book.objects.filter(title__regex=r'^foo(f|b)'), ['<Book: foobar>', '<Book: foobarbaz>', '<Book: foobaz>']) # greedy matching self.assertQuerysetEqual(Book.objects.filter(title__regex=r'b.*az'), [ '<Book: barfoobaz>', '<Book: baz>', '<Book: bazbaRFOO>', '<Book: foobarbaz>', '<Book: foobaz>', ]) self.assertQuerysetEqual(Book.objects.filter(title__iregex=r'b.*ar'), [ '<Book: bar>', '<Book: barfoobaz>', '<Book: bazbaRFOO>', '<Book: foobar>', '<Book: foobarbaz>', ])