|
11 | 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | 12 | # See the License for the specific language governing permissions and |
13 | 13 | # limitations under the License. |
14 | | - |
15 | 14 | from google.cloud.spanner_v1 import ( |
16 | 15 | BatchCreateSessionsRequest, |
17 | 16 | ExecuteSqlRequest, |
| 17 | + CommitRequest, |
18 | 18 | ) |
19 | 19 | from tests.mockserver_tests.mock_server_test_base import ( |
20 | 20 | MockServerTestBase, |
21 | 21 | add_select1_result, |
22 | 22 | add_singer_query_result, |
| 23 | + add_update_count, |
23 | 24 | ) |
24 | | -from django.db import connection |
| 25 | +from django.db import connection, models |
25 | 26 |
|
26 | 27 | from tests.mockserver_tests.models import Singer |
| 28 | +from tests.settings import DATABASES |
27 | 29 |
|
28 | 30 |
|
29 | 31 | class TestBasics(MockServerTestBase): |
@@ -60,3 +62,69 @@ def test_django_select_singer(self): |
60 | 62 | self.assertEqual(len(requests), 2) |
61 | 63 | self.assertIsInstance(requests[0], BatchCreateSessionsRequest) |
62 | 64 | self.assertIsInstance(requests[1], ExecuteSqlRequest) |
| 65 | + |
| 66 | + def test_django_select_singer_using_other_db(self): |
| 67 | + add_singer_query_result( |
| 68 | + "SELECT tests_singer.id, tests_singer.first_name, tests_singer.last_name FROM tests_singer" |
| 69 | + ) |
| 70 | + singers = Singer.objects.using("secondary").all() |
| 71 | + self.assertEqual(len(singers), 2) |
| 72 | + requests = self.spanner_service.requests |
| 73 | + self.assertEqual(len(requests), 2) |
| 74 | + self.assertIsInstance(requests[0], BatchCreateSessionsRequest) |
| 75 | + self.assertIsInstance(requests[1], ExecuteSqlRequest) |
| 76 | + |
| 77 | + def test_insert_singer(self): |
| 78 | + add_update_count( |
| 79 | + "INSERT INTO tests_singer " |
| 80 | + "(id, first_name, last_name) " |
| 81 | + "VALUES (@a0, @a1, @a2)", |
| 82 | + 1, |
| 83 | + ) |
| 84 | + singer = Singer(first_name="test", last_name="test") |
| 85 | + singer.save() |
| 86 | + requests = self.spanner_service.requests |
| 87 | + self.assertEqual(len(requests), 3) |
| 88 | + self.assertIsInstance(requests[0], BatchCreateSessionsRequest) |
| 89 | + self.assertIsInstance(requests[1], ExecuteSqlRequest) |
| 90 | + self.assertIsInstance(requests[2], CommitRequest) |
| 91 | + # The ExecuteSqlRequest should have 3 parameters: |
| 92 | + # 1. first_name |
| 93 | + # 2. last_name |
| 94 | + # 3. client-side auto-generated primary key |
| 95 | + self.assertEqual(len(requests[1].params), 3) |
| 96 | + |
| 97 | + def test_insert_singer_with_disabled_random_primary_key(self): |
| 98 | + for db, config in DATABASES.items(): |
| 99 | + if config["ENGINE"] == "django_spanner": |
| 100 | + config["RANDOM_ID_GENERATION_ENABLED"] = "false" |
| 101 | + |
| 102 | + # Define a class locally in this test method to ensure that |
| 103 | + # it is initialized after disabling random ID generation. |
| 104 | + class LocalSinger(models.Model): |
| 105 | + first_name = models.CharField(max_length=200) |
| 106 | + last_name = models.CharField(max_length=200) |
| 107 | + |
| 108 | + try: |
| 109 | + add_update_count( |
| 110 | + "INSERT INTO tests_localsinger " |
| 111 | + "(first_name, last_name) " |
| 112 | + "VALUES (@a0, @a1)", |
| 113 | + 1, |
| 114 | + ) |
| 115 | + singer = LocalSinger(first_name="test", last_name="test") |
| 116 | + singer.save() |
| 117 | + requests = self.spanner_service.requests |
| 118 | + self.assertEqual(len(requests), 3) |
| 119 | + self.assertIsInstance(requests[0], BatchCreateSessionsRequest) |
| 120 | + self.assertIsInstance(requests[1], ExecuteSqlRequest) |
| 121 | + self.assertIsInstance(requests[2], CommitRequest) |
| 122 | + # The ExecuteSqlRequest should have 2 parameters: |
| 123 | + # 1. first_name |
| 124 | + # 2. last_name |
| 125 | + # There should be no client-side auto-generated primary key. |
| 126 | + self.assertEqual(len(requests[1].params), 2) |
| 127 | + finally: |
| 128 | + for db, config in DATABASES.items(): |
| 129 | + if config["ENGINE"] == "django_spanner": |
| 130 | + config.pop("DISABLE_RANDOM_ID_GENERATION", None) |
0 commit comments