Skip to content

Commit ef62df4

Browse files
authored
test(spanner): update mock server tests to check for inline begin (#16656)
This PR updates the `sqlalchemy-spanner` mock server tests to account for the dialect now inlining `BeginTransaction` requests into the first statement execution. ### Changes - Updated expected request counts in multiple tests (typically reducing by 1). - Removed assertions for separate `BeginTransactionRequest` where applicable. - Added assertions to verify that the first statement request contains `transaction.begin` options. - Updated assertions to verify that subsequent requests use the transaction ID returned by the mock server. These changes resolve the off-by-one failures in request counts across multiple mock server tests.
1 parent acd8c8f commit ef62df4

File tree

9 files changed

+65
-65
lines changed

9 files changed

+65
-65
lines changed

packages/sqlalchemy-spanner/tests/mockserver_tests/test_auto_increment.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,12 @@
1313
# limitations under the License.
1414

1515
from sqlalchemy.orm import Session
16-
from sqlalchemy.testing import eq_, is_instance_of
16+
from sqlalchemy.testing import eq_, is_instance_of, is_not_none
1717
from google.cloud.spanner_v1 import (
1818
ResultSet,
1919
CreateSessionRequest,
2020
ExecuteSqlRequest,
2121
CommitRequest,
22-
BeginTransactionRequest,
2322
)
2423
from tests.mockserver_tests.mock_server_test_base import (
2524
MockServerTestBase,
@@ -126,11 +125,12 @@ def test_insert_row(self):
126125
session.commit()
127126
# Verify the requests that we got.
128127
requests = self.spanner_service.requests
129-
eq_(4, len(requests))
128+
# Dialect now inlines BeginTransaction into the first statement.
129+
eq_(3, len(requests))
130130
is_instance_of(requests[0], CreateSessionRequest)
131-
is_instance_of(requests[1], BeginTransactionRequest)
132-
is_instance_of(requests[2], ExecuteSqlRequest)
133-
is_instance_of(requests[3], CommitRequest)
131+
is_instance_of(requests[1], ExecuteSqlRequest)
132+
is_instance_of(requests[2], CommitRequest)
133+
is_not_none(requests[1].transaction.begin) # First request inlines begin
134134

135135
def test_insert_row_with_pk_value(self):
136136
from tests.mockserver_tests.auto_increment_model import Singer

packages/sqlalchemy-spanner/tests/mockserver_tests/test_bit_reversed_sequence.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,12 @@
1313
# limitations under the License.
1414

1515
from sqlalchemy.orm import Session
16-
from sqlalchemy.testing import eq_, is_instance_of
16+
from sqlalchemy.testing import eq_, is_instance_of, is_not_none
1717
from google.cloud.spanner_v1 import (
1818
ResultSet,
1919
CreateSessionRequest,
2020
ExecuteSqlRequest,
2121
CommitRequest,
22-
BeginTransactionRequest,
2322
)
2423
from tests.mockserver_tests.mock_server_test_base import (
2524
MockServerTestBase,
@@ -119,8 +118,9 @@ def test_insert_row(self):
119118
session.commit()
120119
# Verify the requests that we got.
121120
requests = self.spanner_service.requests
122-
eq_(4, len(requests))
121+
# Dialect now inlines BeginTransaction into the first statement.
122+
eq_(3, len(requests))
123123
is_instance_of(requests[0], CreateSessionRequest)
124-
is_instance_of(requests[1], BeginTransactionRequest)
125-
is_instance_of(requests[2], ExecuteSqlRequest)
126-
is_instance_of(requests[3], CommitRequest)
124+
is_instance_of(requests[1], ExecuteSqlRequest)
125+
is_instance_of(requests[2], CommitRequest)
126+
is_not_none(requests[1].transaction.begin) # First request inlines begin

packages/sqlalchemy-spanner/tests/mockserver_tests/test_float32.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
eq_,
1818
is_instance_of,
1919
is_false,
20+
is_not_none,
2021
)
2122
from google.cloud.spanner_v1 import (
2223
CreateSessionRequest,
2324
ExecuteSqlRequest,
2425
ResultSet,
2526
ResultSetStats,
26-
BeginTransactionRequest,
2727
CommitRequest,
2828
TypeCode,
2929
)
@@ -58,12 +58,13 @@ def test_insert_data(self):
5858
session.commit()
5959

6060
requests = self.spanner_service.requests
61-
eq_(4, len(requests))
61+
# Dialect now inlines BeginTransaction into the first statement.
62+
eq_(3, len(requests))
6263
is_instance_of(requests[0], CreateSessionRequest)
63-
is_instance_of(requests[1], BeginTransactionRequest)
64-
is_instance_of(requests[2], ExecuteSqlRequest)
65-
is_instance_of(requests[3], CommitRequest)
66-
request: ExecuteSqlRequest = requests[2]
64+
is_instance_of(requests[1], ExecuteSqlRequest)
65+
is_instance_of(requests[2], CommitRequest)
66+
is_not_none(requests[1].transaction.begin) # First request inlines begin
67+
request: ExecuteSqlRequest = requests[1]
6768
eq_(3, len(request.params))
6869
eq_("1", request.params["a0"])
6970
eq_("One", request.params["a1"])

packages/sqlalchemy-spanner/tests/mockserver_tests/test_insertmany.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,11 @@
1717

1818
import sqlalchemy
1919
from sqlalchemy.orm import Session
20-
from sqlalchemy.testing import eq_, is_instance_of
20+
from sqlalchemy.testing import eq_, is_instance_of, is_not_none
2121
from google.cloud.spanner_v1 import (
2222
ExecuteSqlRequest,
2323
CommitRequest,
2424
RollbackRequest,
25-
BeginTransactionRequest,
2625
CreateSessionRequest,
2726
)
2827
from tests.mockserver_tests.mock_server_test_base import (
@@ -53,11 +52,12 @@ def test_insertmany_with_uuid_sentinels(self):
5352

5453
# Verify the requests that we got.
5554
requests = self.spanner_service.requests
56-
eq_(4, len(requests))
55+
# Dialect now inlines BeginTransaction into the first statement.
56+
eq_(3, len(requests))
5757
is_instance_of(requests[0], CreateSessionRequest)
58-
is_instance_of(requests[1], BeginTransactionRequest)
59-
is_instance_of(requests[2], ExecuteSqlRequest)
60-
is_instance_of(requests[3], CommitRequest)
58+
is_instance_of(requests[1], ExecuteSqlRequest)
59+
is_instance_of(requests[2], CommitRequest)
60+
is_not_none(requests[1].transaction.begin) # First request inlines begin
6161

6262
def test_no_insertmany_with_bit_reversed_id(self):
6363
"""Ensures we don't try to bulk insert rows with bit-reversed PKs.
@@ -93,12 +93,13 @@ def test_no_insertmany_with_bit_reversed_id(self):
9393

9494
# Verify the requests that we got.
9595
requests = self.spanner_service.requests
96-
eq_(5, len(requests))
96+
# Dialect now inlines BeginTransaction into the first statement.
97+
eq_(4, len(requests))
9798
is_instance_of(requests[0], CreateSessionRequest)
98-
is_instance_of(requests[1], BeginTransactionRequest)
99+
is_instance_of(requests[1], ExecuteSqlRequest)
99100
is_instance_of(requests[2], ExecuteSqlRequest)
100-
is_instance_of(requests[3], ExecuteSqlRequest)
101-
is_instance_of(requests[4], RollbackRequest)
101+
is_instance_of(requests[3], RollbackRequest)
102+
is_not_none(requests[1].transaction.begin) # First request inlines begin
102103

103104
def add_uuid_insert_result(self, sql):
104105
result = result_set.ResultSet(

packages/sqlalchemy-spanner/tests/mockserver_tests/test_isolation_level.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
CreateSessionRequest,
2020
ExecuteSqlRequest,
2121
CommitRequest,
22-
BeginTransactionRequest,
2322
TransactionOptions,
2423
)
2524

@@ -150,20 +149,20 @@ def test_invalid_isolation_level(self):
150149
def verify_isolation_level(self, level):
151150
# Verify the requests that we got.
152151
requests = self.spanner_service.requests
153-
eq_(4, len(requests))
152+
# Dialect now inlines BeginTransaction into the first statement.
153+
eq_(3, len(requests))
154154
is_instance_of(requests[0], CreateSessionRequest)
155-
is_instance_of(requests[1], BeginTransactionRequest)
156-
is_instance_of(requests[2], ExecuteSqlRequest)
157-
is_instance_of(requests[3], CommitRequest)
158-
begin_request: BeginTransactionRequest = requests[1]
155+
is_instance_of(requests[1], ExecuteSqlRequest)
156+
is_instance_of(requests[2], CommitRequest)
157+
execute_request: ExecuteSqlRequest = requests[1]
159158
eq_(
160159
TransactionOptions(
161160
dict(
162161
isolation_level=level,
163162
read_write=TransactionOptions.ReadWrite(),
164163
)
165164
),
166-
begin_request.options,
165+
execute_request.transaction.begin,
167166
)
168167

169168
def add_insert_result(self, sql):

packages/sqlalchemy-spanner/tests/mockserver_tests/test_json.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,12 @@
1414

1515
from sqlalchemy import func, select, text
1616
from sqlalchemy.orm import Session
17-
from sqlalchemy.testing import eq_, is_instance_of
17+
from sqlalchemy.testing import eq_, is_instance_of, is_not_none
1818
from google.cloud.spanner_v1 import (
1919
ResultSet,
2020
CreateSessionRequest,
2121
ExecuteSqlRequest,
2222
CommitRequest,
23-
BeginTransactionRequest,
2423
TypeCode,
2524
JsonObject,
2625
)
@@ -105,12 +104,13 @@ def _test_insert_json(
105104

106105
# Verify the requests that we got.
107106
requests = self.spanner_service.requests
108-
eq_(4, len(requests))
107+
# Dialect now inlines BeginTransaction into the first statement.
108+
eq_(3, len(requests))
109109
is_instance_of(requests[0], CreateSessionRequest)
110-
is_instance_of(requests[1], BeginTransactionRequest)
111-
is_instance_of(requests[2], ExecuteSqlRequest)
112-
is_instance_of(requests[3], CommitRequest)
113-
request: ExecuteSqlRequest = requests[2]
110+
is_instance_of(requests[1], ExecuteSqlRequest)
111+
is_instance_of(requests[2], CommitRequest)
112+
is_not_none(requests[1].transaction.begin) # First request inlines begin
113+
request: ExecuteSqlRequest = requests[1]
114114
eq_(3, len(request.params))
115115
eq_("1", request.params["a0"])
116116
eq_("Test", request.params["a1"])

packages/sqlalchemy-spanner/tests/mockserver_tests/test_pickle_type.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,12 @@
1313
# limitations under the License.
1414

1515
from sqlalchemy.orm import Session
16-
from sqlalchemy.testing import eq_, is_instance_of
16+
from sqlalchemy.testing import eq_, is_instance_of, is_not_none
1717
from google.cloud.spanner_v1 import (
1818
ResultSet,
1919
CreateSessionRequest,
2020
ExecuteSqlRequest,
2121
CommitRequest,
22-
BeginTransactionRequest,
2322
TypeCode,
2423
)
2524
from tests.mockserver_tests.mock_server_test_base import (
@@ -85,12 +84,13 @@ def test_insert_and_query(self):
8584

8685
# Verify the requests that we got.
8786
requests = self.spanner_service.requests
88-
eq_(4, len(requests))
87+
# Dialect now inlines BeginTransaction into the first statement.
88+
eq_(3, len(requests))
8989
is_instance_of(requests[0], CreateSessionRequest)
90-
is_instance_of(requests[1], BeginTransactionRequest)
91-
is_instance_of(requests[2], ExecuteSqlRequest)
92-
is_instance_of(requests[3], CommitRequest)
93-
request: ExecuteSqlRequest = requests[2]
90+
is_instance_of(requests[1], ExecuteSqlRequest)
91+
is_instance_of(requests[2], CommitRequest)
92+
is_not_none(requests[1].transaction.begin) # First request inlines begin
93+
request: ExecuteSqlRequest = requests[1]
9494
eq_(4, len(request.params))
9595
eq_("1", request.params["a0"])
9696
eq_("test_user", request.params["a1"])

packages/sqlalchemy-spanner/tests/mockserver_tests/test_quickstart.py

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
CreateSessionRequest,
2020
ExecuteBatchDmlRequest,
2121
CommitRequest,
22-
BeginTransactionRequest,
2322
)
2423
from sqlalchemy.orm import Session
2524
from sqlalchemy.testing import eq_, is_instance_of, is_not_none
@@ -115,12 +114,12 @@ def test_insert_data(self):
115114
session.commit()
116115

117116
requests = self.spanner_service.requests
118-
eq_(5, len(requests))
117+
# Dialect now inlines BeginTransaction into the first statement.
118+
eq_(4, len(requests))
119119
is_instance_of(requests[0], CreateSessionRequest)
120-
is_instance_of(requests[1], BeginTransactionRequest)
120+
is_instance_of(requests[1], ExecuteBatchDmlRequest)
121121
is_instance_of(requests[2], ExecuteBatchDmlRequest)
122-
is_instance_of(requests[3], ExecuteBatchDmlRequest)
123-
is_instance_of(requests[4], CommitRequest)
124-
is_not_none(requests[2].transaction.id)
125-
eq_(requests[2].transaction.id, requests[3].transaction.id)
126-
eq_(requests[2].transaction.id, requests[4].transaction_id)
122+
is_instance_of(requests[3], CommitRequest)
123+
is_not_none(requests[1].transaction.begin) # First request inlines begin
124+
is_not_none(requests[2].transaction.id) # Subsequent requests use ID
125+
eq_(requests[2].transaction.id, requests[3].transaction_id)

packages/sqlalchemy-spanner/tests/mockserver_tests/test_tags.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,18 +83,18 @@ def test_transaction_tag(self):
8383

8484
# Verify the requests that we got.
8585
requests = self.spanner_service.requests
86-
eq_(6, len(requests))
86+
# Dialect now inlines BeginTransaction into the first statement.
87+
eq_(5, len(requests))
8788
is_instance_of(requests[0], CreateSessionRequest)
88-
is_instance_of(requests[1], BeginTransactionRequest)
89+
is_instance_of(requests[1], ExecuteSqlRequest)
8990
is_instance_of(requests[2], ExecuteSqlRequest)
9091
is_instance_of(requests[3], ExecuteSqlRequest)
91-
is_instance_of(requests[4], ExecuteSqlRequest)
92-
is_instance_of(requests[5], CommitRequest)
93-
for request in requests[2:]:
92+
is_instance_of(requests[4], CommitRequest)
93+
for request in requests[1:]:
9494
eq_("my-transaction-tag", request.request_options.transaction_tag)
95-
eq_("my-tag-1", requests[2].request_options.request_tag)
96-
eq_("my-tag-2", requests[3].request_options.request_tag)
97-
eq_("insert-singer", requests[4].request_options.request_tag)
95+
eq_("my-tag-1", requests[1].request_options.request_tag)
96+
eq_("my-tag-2", requests[2].request_options.request_tag)
97+
eq_("insert-singer", requests[3].request_options.request_tag)
9898

9999

100100
def empty_singer_result_set():

0 commit comments

Comments
 (0)