summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2017-09-13 20:12:32 +0200
committerGitHub <noreply@github.com>2017-09-13 20:12:32 +0200
commitc6a1faecc3d6e25597a7105df74f11678f2f2aac (patch)
tree84f7d7ce04ec478ba9652ecdf3728a259538864a /tests
parentc2ecef869ce46349e79c39610cd66a576d78289e (diff)
Refs #27090 -- Added real database sequence introspection.
Thanks Mariusz Felisiak for the Oracle part and Tim Graham for the review.
Diffstat (limited to 'tests')
-rw-r--r--tests/backends/oracle/test_introspection.py29
-rw-r--r--tests/backends/postgresql/test_introspection.py23
-rw-r--r--tests/introspection/tests.py5
3 files changed, 55 insertions, 2 deletions
diff --git a/tests/backends/oracle/test_introspection.py b/tests/backends/oracle/test_introspection.py
new file mode 100644
index 0000000000..ac084e93df
--- /dev/null
+++ b/tests/backends/oracle/test_introspection.py
@@ -0,0 +1,29 @@
+import unittest
+
+from django.db import connection
+from django.test import TransactionTestCase
+
+from ..models import Person
+
+
+@unittest.skipUnless(connection.vendor == 'oracle', 'Oracle tests')
+class DatabaseSequenceTests(TransactionTestCase):
+ available_apps = []
+
+ def test_get_sequences(self):
+ with connection.cursor() as cursor:
+ seqs = connection.introspection.get_sequences(cursor, Person._meta.db_table, Person._meta.local_fields)
+ self.assertEqual(len(seqs), 1)
+ self.assertIsNotNone(seqs[0]['name'])
+ self.assertEqual(seqs[0]['table'], Person._meta.db_table)
+ self.assertEqual(seqs[0]['column'], 'id')
+
+ def test_get_sequences_manually_created_index(self):
+ with connection.cursor() as cursor:
+ with connection.schema_editor() as editor:
+ editor._drop_identity(Person._meta.db_table, 'id')
+ seqs = connection.introspection.get_sequences(cursor, Person._meta.db_table, Person._meta.local_fields)
+ self.assertEqual(seqs, [{'table': Person._meta.db_table, 'column': 'id'}])
+ # Recreate model, because adding identity is impossible.
+ editor.delete_model(Person)
+ editor.create_model(Person)
diff --git a/tests/backends/postgresql/test_introspection.py b/tests/backends/postgresql/test_introspection.py
new file mode 100644
index 0000000000..cfa801a77f
--- /dev/null
+++ b/tests/backends/postgresql/test_introspection.py
@@ -0,0 +1,23 @@
+import unittest
+
+from django.db import connection
+from django.test import TestCase
+
+from ..models import Person
+
+
+@unittest.skipUnless(connection.vendor == 'postgresql', "Test only for PostgreSQL")
+class DatabaseSequenceTests(TestCase):
+ def test_get_sequences(self):
+ cursor = connection.cursor()
+ seqs = connection.introspection.get_sequences(cursor, Person._meta.db_table)
+ self.assertEqual(
+ seqs,
+ [{'table': Person._meta.db_table, 'column': 'id', 'name': 'backends_person_id_seq'}]
+ )
+ cursor.execute('ALTER SEQUENCE backends_person_id_seq RENAME TO pers_seq')
+ seqs = connection.introspection.get_sequences(cursor, Person._meta.db_table)
+ self.assertEqual(
+ seqs,
+ [{'table': Person._meta.db_table, 'column': 'id', 'name': 'pers_seq'}]
+ )
diff --git a/tests/introspection/tests.py b/tests/introspection/tests.py
index c449b6de82..ed10927b2a 100644
--- a/tests/introspection/tests.py
+++ b/tests/introspection/tests.py
@@ -61,8 +61,9 @@ class IntrospectionTests(TransactionTestCase):
def test_sequence_list(self):
sequences = connection.introspection.sequence_list()
- expected = {'table': Reporter._meta.db_table, 'column': 'id'}
- self.assertIn(expected, sequences, 'Reporter sequence not found in sequence_list()')
+ reporter_seqs = [seq for seq in sequences if seq['table'] == Reporter._meta.db_table]
+ self.assertEqual(len(reporter_seqs), 1, 'Reporter sequence not found in sequence_list()')
+ self.assertEqual(reporter_seqs[0]['column'], 'id')
def test_get_table_description_names(self):
with connection.cursor() as cursor: