1. import datetime
    
  2. 
    
  3. from django.db import connection
    
  4. from django.test import TestCase, skipUnlessDBFeature
    
  5. from django.test.utils import CaptureQueriesContext
    
  6. 
    
  7. from .models import DumbCategory, NonIntegerPKReturningModel, ReturningModel
    
  8. 
    
  9. 
    
  10. @skipUnlessDBFeature("can_return_columns_from_insert")
    
  11. class ReturningValuesTests(TestCase):
    
  12.     def test_insert_returning(self):
    
  13.         with CaptureQueriesContext(connection) as captured_queries:
    
  14.             DumbCategory.objects.create()
    
  15.         self.assertIn(
    
  16.             "RETURNING %s.%s"
    
  17.             % (
    
  18.                 connection.ops.quote_name(DumbCategory._meta.db_table),
    
  19.                 connection.ops.quote_name(DumbCategory._meta.get_field("id").column),
    
  20.             ),
    
  21.             captured_queries[-1]["sql"],
    
  22.         )
    
  23. 
    
  24.     def test_insert_returning_non_integer(self):
    
  25.         obj = NonIntegerPKReturningModel.objects.create()
    
  26.         self.assertTrue(obj.created)
    
  27.         self.assertIsInstance(obj.created, datetime.datetime)
    
  28. 
    
  29.     def test_insert_returning_multiple(self):
    
  30.         with CaptureQueriesContext(connection) as captured_queries:
    
  31.             obj = ReturningModel.objects.create()
    
  32.         table_name = connection.ops.quote_name(ReturningModel._meta.db_table)
    
  33.         self.assertIn(
    
  34.             "RETURNING %s.%s, %s.%s"
    
  35.             % (
    
  36.                 table_name,
    
  37.                 connection.ops.quote_name(ReturningModel._meta.get_field("id").column),
    
  38.                 table_name,
    
  39.                 connection.ops.quote_name(
    
  40.                     ReturningModel._meta.get_field("created").column
    
  41.                 ),
    
  42.             ),
    
  43.             captured_queries[-1]["sql"],
    
  44.         )
    
  45.         self.assertTrue(obj.pk)
    
  46.         self.assertIsInstance(obj.created, datetime.datetime)
    
  47. 
    
  48.     @skipUnlessDBFeature("can_return_rows_from_bulk_insert")
    
  49.     def test_bulk_insert(self):
    
  50.         objs = [ReturningModel(), ReturningModel(pk=2**11), ReturningModel()]
    
  51.         ReturningModel.objects.bulk_create(objs)
    
  52.         for obj in objs:
    
  53.             with self.subTest(obj=obj):
    
  54.                 self.assertTrue(obj.pk)
    
  55.                 self.assertIsInstance(obj.created, datetime.datetime)