1. from unittest import mock, skipUnless
    
  2. 
    
  3. from django.db import connection
    
  4. from django.db.backends.mysql.features import DatabaseFeatures
    
  5. from django.test import TestCase
    
  6. 
    
  7. 
    
  8. @skipUnless(connection.vendor == "mysql", "MySQL tests")
    
  9. class TestFeatures(TestCase):
    
  10.     def test_supports_transactions(self):
    
  11.         """
    
  12.         All storage engines except MyISAM support transactions.
    
  13.         """
    
  14.         del connection.features.supports_transactions
    
  15.         with mock.patch(
    
  16.             "django.db.connection.features._mysql_storage_engine", "InnoDB"
    
  17.         ):
    
  18.             self.assertTrue(connection.features.supports_transactions)
    
  19.         del connection.features.supports_transactions
    
  20.         with mock.patch(
    
  21.             "django.db.connection.features._mysql_storage_engine", "MyISAM"
    
  22.         ):
    
  23.             self.assertFalse(connection.features.supports_transactions)
    
  24.         del connection.features.supports_transactions
    
  25. 
    
  26.     def test_skip_locked_no_wait(self):
    
  27.         with mock.MagicMock() as _connection:
    
  28.             _connection.mysql_version = (8, 0, 1)
    
  29.             _connection.mysql_is_mariadb = False
    
  30.             database_features = DatabaseFeatures(_connection)
    
  31.             self.assertTrue(database_features.has_select_for_update_skip_locked)
    
  32.             self.assertTrue(database_features.has_select_for_update_nowait)
    
  33.         with mock.MagicMock() as _connection:
    
  34.             _connection.mysql_version = (8, 0, 0)
    
  35.             _connection.mysql_is_mariadb = False
    
  36.             database_features = DatabaseFeatures(_connection)
    
  37.             self.assertFalse(database_features.has_select_for_update_skip_locked)
    
  38.             self.assertFalse(database_features.has_select_for_update_nowait)
    
  39. 
    
  40.     def test_allows_auto_pk_0(self):
    
  41.         with mock.MagicMock() as _connection:
    
  42.             _connection.sql_mode = {"NO_AUTO_VALUE_ON_ZERO"}
    
  43.             database_features = DatabaseFeatures(_connection)
    
  44.             self.assertIs(database_features.allows_auto_pk_0, True)