mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Refs #18586 - Refactored model get_or_create test.
Refactored get_or_create test into several smaller test functions across two different test classes. Also converted the comments over to docstrings.
This commit is contained in:
		| @@ -13,11 +13,12 @@ from .models import DefaultPerson, Person, ManualPrimaryKeyTest, Profile, Tag, T | ||||
|  | ||||
| class GetOrCreateTests(TestCase): | ||||
|  | ||||
|     def test_get_or_create(self): | ||||
|         p = Person.objects.create( | ||||
|     def setUp(self): | ||||
|         self.lennon = Person.objects.create( | ||||
|             first_name='John', last_name='Lennon', birthday=date(1940, 10, 9) | ||||
|         ) | ||||
|  | ||||
|     def test_get_or_create_method_with_get(self): | ||||
|         p, created = Person.objects.get_or_create( | ||||
|             first_name="John", last_name="Lennon", defaults={ | ||||
|                 "birthday": date(1940, 10, 9) | ||||
| @@ -26,6 +27,8 @@ class GetOrCreateTests(TestCase): | ||||
|         self.assertFalse(created) | ||||
|         self.assertEqual(Person.objects.count(), 1) | ||||
|  | ||||
|  | ||||
|     def test_get_or_create_method_with_create(self): | ||||
|         p, created = Person.objects.get_or_create( | ||||
|             first_name='George', last_name='Harrison', defaults={ | ||||
|                 'birthday': date(1943, 2, 25) | ||||
| @@ -34,35 +37,59 @@ class GetOrCreateTests(TestCase): | ||||
|         self.assertTrue(created) | ||||
|         self.assertEqual(Person.objects.count(), 2) | ||||
|  | ||||
|         # If we execute the exact same statement, it won't create a Person. | ||||
|         p, created = Person.objects.get_or_create( | ||||
|  | ||||
|     def test_get_or_create_redundant_instance(self): | ||||
|         """ | ||||
|         If we execute the exact same statement twice, the second time, | ||||
|         it won't create a Person. | ||||
|         """ | ||||
|         george, created = Person.objects.get_or_create( | ||||
|             first_name='George', last_name='Harrison', defaults={ | ||||
|                 'birthday': date(1943, 2, 25) | ||||
|             } | ||||
|         ) | ||||
|         evil_george, created = Person.objects.get_or_create( | ||||
|             first_name='George', last_name='Harrison', defaults={ | ||||
|                 'birthday': date(1943, 2, 25) | ||||
|             } | ||||
|         ) | ||||
|  | ||||
|         self.assertFalse(created) | ||||
|         self.assertEqual(Person.objects.count(), 2) | ||||
|  | ||||
|         # If you don't specify a value or default value for all required | ||||
|         # fields, you will get an error. | ||||
|     def test_get_or_create_invalid_params(self): | ||||
|         """ | ||||
|         If you don't specify a value or default value for all required | ||||
|         fields, you will get an error. | ||||
|         """ | ||||
|         self.assertRaises( | ||||
|             IntegrityError, | ||||
|             Person.objects.get_or_create, first_name="Tom", last_name="Smith" | ||||
|         ) | ||||
|  | ||||
|         # If you specify an existing primary key, but different other fields, | ||||
|         # then you will get an error and data will not be updated. | ||||
|         ManualPrimaryKeyTest.objects.create(id=1, data="Original") | ||||
| class GetOrCreateTestsWithManualPKs(TestCase): | ||||
|  | ||||
|     def setUp(self): | ||||
|         self.first_pk = ManualPrimaryKeyTest.objects.create(id=1, data="Original") | ||||
|  | ||||
|     def test_create_with_duplicate_primary_key(self): | ||||
|         """ | ||||
|         If you specify an existing primary key, but different other fields, | ||||
|         then you will get an error and data will not be updated. | ||||
|         """ | ||||
|         self.assertRaises( | ||||
|             IntegrityError, | ||||
|             ManualPrimaryKeyTest.objects.get_or_create, id=1, data="Different" | ||||
|         ) | ||||
|         self.assertEqual(ManualPrimaryKeyTest.objects.get(id=1).data, "Original") | ||||
|  | ||||
|         # get_or_create should raise IntegrityErrors with the full traceback. | ||||
|         # This is tested by checking that a known method call is in the traceback. | ||||
|         # We cannot use assertRaises/assertRaises here because we need to inspect | ||||
|         # the actual traceback. Refs #16340. | ||||
|     def test_get_or_create_raises_IntegrityError_plus_traceback(self): | ||||
|         """ | ||||
|         get_or_create should raise IntegrityErrors with the full traceback. | ||||
|         This is tested by checking that a known method call is in the traceback. | ||||
|         We cannot use assertRaises here because we need to inspect | ||||
|         the actual traceback. Refs #16340. | ||||
|         """ | ||||
|         try: | ||||
|             ManualPrimaryKeyTest.objects.get_or_create(id=1, data="Different") | ||||
|         except IntegrityError: | ||||
| @@ -70,8 +97,10 @@ class GetOrCreateTests(TestCase): | ||||
|             self.assertIn(str('obj.save'), formatted_traceback) | ||||
|  | ||||
|     def test_savepoint_rollback(self): | ||||
|         # Regression test for #20463: the database connection should still be | ||||
|         # usable after a DataError or ProgrammingError in .get_or_create(). | ||||
|         """ | ||||
|         Regression test for #20463: the database connection should still be | ||||
|         usable after a DataError or ProgrammingError in .get_or_create(). | ||||
|         """ | ||||
|         try: | ||||
|             # Hide warnings when broken data is saved with a warning (MySQL). | ||||
|             with warnings.catch_warnings(): | ||||
| @@ -86,7 +115,9 @@ class GetOrCreateTests(TestCase): | ||||
|             self.skipTest("This backend accepts broken utf-8.") | ||||
|  | ||||
|     def test_get_or_create_empty(self): | ||||
|         # Regression test for #16137: get_or_create does not require kwargs. | ||||
|         """ | ||||
|         Regression test for #16137: get_or_create does not require kwargs. | ||||
|         """ | ||||
|         try: | ||||
|             DefaultPerson.objects.get_or_create() | ||||
|         except AssertionError: | ||||
| @@ -99,9 +130,11 @@ class GetOrCreateTransactionTests(TransactionTestCase): | ||||
|     available_apps = ['get_or_create'] | ||||
|  | ||||
|     def test_get_or_create_integrityerror(self): | ||||
|         # Regression test for #15117. Requires a TransactionTestCase on | ||||
|         # databases that delay integrity checks until the end of transactions, | ||||
|         # otherwise the exception is never raised. | ||||
|         """ | ||||
|         Regression test for #15117. Requires a TransactionTestCase on | ||||
|         databases that delay integrity checks until the end of transactions, | ||||
|         otherwise the exception is never raised. | ||||
|         """ | ||||
|         try: | ||||
|             Profile.objects.get_or_create(person=Person(id=1)) | ||||
|         except IntegrityError: | ||||
| @@ -174,14 +207,18 @@ class UpdateOrCreateTests(TestCase): | ||||
|         self.assertFalse(created) | ||||
|  | ||||
|     def test_integrity(self): | ||||
|         # If you don't specify a value or default value for all required | ||||
|         # fields, you will get an error. | ||||
|         """ | ||||
|         If you don't specify a value or default value for all required | ||||
|         fields, you will get an error. | ||||
|         """ | ||||
|         self.assertRaises(IntegrityError, | ||||
|             Person.objects.update_or_create, first_name="Tom", last_name="Smith") | ||||
|  | ||||
|     def test_manual_primary_key_test(self): | ||||
|         # If you specify an existing primary key, but different other fields, | ||||
|         # then you will get an error and data will not be updated. | ||||
|         """ | ||||
|         If you specify an existing primary key, but different other fields, | ||||
|         then you will get an error and data will not be updated. | ||||
|         """ | ||||
|         ManualPrimaryKeyTest.objects.create(id=1, data="Original") | ||||
|         self.assertRaises( | ||||
|             IntegrityError, | ||||
| @@ -190,10 +227,12 @@ class UpdateOrCreateTests(TestCase): | ||||
|         self.assertEqual(ManualPrimaryKeyTest.objects.get(id=1).data, "Original") | ||||
|  | ||||
|     def test_error_contains_full_traceback(self): | ||||
|         # update_or_create should raise IntegrityErrors with the full traceback. | ||||
|         # This is tested by checking that a known method call is in the traceback. | ||||
|         # We cannot use assertRaises/assertRaises here because we need to inspect | ||||
|         # the actual traceback. Refs #16340. | ||||
|         """ | ||||
|         update_or_create should raise IntegrityErrors with the full traceback. | ||||
|         This is tested by checking that a known method call is in the traceback. | ||||
|         We cannot use assertRaises/assertRaises here because we need to inspect | ||||
|         the actual traceback. Refs #16340. | ||||
|         """ | ||||
|         try: | ||||
|             ManualPrimaryKeyTest.objects.update_or_create(id=1, data="Different") | ||||
|         except IntegrityError: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user