5353 DockerContainer = None
5454# pylint: enable=wrong-import-order, wrong-import-position, ungrouped-imports
5555
56+ TIMESTAMPS = [Timestamp .of (1234567890.0 + i ) for i in range (1000 )]
57+
5658
5759class SpannerTestKey (NamedTuple ):
5860 f_string : str
@@ -72,10 +74,10 @@ class SpannerPartTestRow(NamedTuple):
7274
7375
7476@pytest .mark .uses_gcp_java_expansion_service
75- @unittest .skipUnless (
76- os .environ .get ('EXPANSION_JARS' ),
77- "EXPANSION_JARS environment var is not provided, "
78- "indicating that jars have not been built" )
77+ # @unittest.skipUnless(
78+ # os.environ.get('EXPANSION_JARS'),
79+ # "EXPANSION_JARS environment var is not provided, "
80+ # "indicating that jars have not been built")
7981@unittest .skipIf (spanner is None , 'GCP dependencies are not installed.' )
8082@unittest .skipIf (
8183 DockerContainer is None , 'testcontainers package is not installed.' )
@@ -129,15 +131,15 @@ def tearDown(self):
129131 def test_spanner_insert_or_update (self ):
130132 self .spanner_helper .insert_values (
131133 self .database_id ,
132- [('or_update0' , 5 , False , Timestamp . of ( 1234567890.0 ) .to_rfc3339 ()),
133- ('or_update1' , 9 , False , Timestamp . of ( 1234567891.0 ) .to_rfc3339 ())])
134+ [('or_update0' , 5 , False , TIMESTAMPS [ 1 ] .to_rfc3339 ()),
135+ ('or_update1' , 9 , False , TIMESTAMPS [ 0 ] .to_rfc3339 ())])
134136
135137 def to_row_fn (i ):
136138 return SpannerTestRow (
137139 f_int64 = i ,
138140 f_string = f'or_update{ i } ' ,
139141 f_boolean = i % 2 == 0 ,
140- f_timestamp = Timestamp . of ( 1234567890.0 + i ) )
142+ f_timestamp = TIMESTAMPS [ i ] )
141143
142144 self .run_write_pipeline (3 , to_row_fn , SpannerTestRow , SpannerInsertOrUpdate )
143145
@@ -148,15 +150,15 @@ def to_row_fn(i):
148150 self .assertEqual (row [0 ], f'or_update{ i } ' )
149151 self .assertEqual (row [1 ], i )
150152 self .assertEqual (row [2 ], i % 2 == 0 )
151- self .assertIsNotNone (row [3 ]) # timestamp field
153+ self .assertEqual (row [3 ]. timestamp_pb (), TIMESTAMPS [ i ]. to_proto ())
152154
153155 def test_spanner_insert (self ):
154156 def to_row_fn (num ):
155157 return SpannerTestRow (
156158 f_string = f'insert{ num } ' ,
157159 f_int64 = num ,
158160 f_boolean = None ,
159- f_timestamp = Timestamp . of ( 1234567890.0 + num ) )
161+ f_timestamp = TIMESTAMPS [ num ] )
160162
161163 self .run_write_pipeline (1000 , to_row_fn , SpannerTestRow , SpannerInsert )
162164
@@ -172,71 +174,68 @@ def compare_row(row):
172174 self .assertEqual (row [0 ], f'insert{ i } ' )
173175 self .assertEqual (row [1 ], i )
174176 self .assertIsNone (row [2 ])
175- self .assertIsNotNone (row [3 ])
177+ self .assertEqual (row [3 ]. timestamp_pb (), TIMESTAMPS [ i ]. to_proto () )
176178
177179 def test_spanner_replace (self ):
178180 self .spanner_helper .insert_values (
179181 self .database_id ,
180- [('replace0' , 0 , True , Timestamp . of ( 1234567890.0 ) .to_rfc3339 ()),
181- ('replace1' , 1 , False , Timestamp . of ( 1234567891.0 ) .to_rfc3339 ())])
182+ [('replace0' , 0 , True , TIMESTAMPS [ 10 ] .to_rfc3339 ()),
183+ ('replace1' , 1 , False , TIMESTAMPS [ 11 ] .to_rfc3339 ())])
182184
183185 def to_row_fn (num ):
184186 return SpannerPartTestRow (
185187 f_string = f'replace{ num } ' ,
186188 f_int64 = num + 10 ,
187- f_timestamp = Timestamp . of ( 1234567900.0 + num ) )
189+ f_timestamp = TIMESTAMPS [ num ] )
188190
189191 self .run_write_pipeline (2 , to_row_fn , SpannerPartTestRow , SpannerReplace )
190-
191192 results = self .spanner_helper .read_data (self .database_id , prefix = 'replace' )
192- self . assertEqual (len (results ), 2 )
193- # In REPLACE, boolean should be NULL but timestamp should be updated
194- self .assertEqual (results [ 0 ][ 0 ], 'replace0' )
195- self . assertEqual ( results [ 0 ][ 1 ], 10 )
196- self . assertIsNone ( results [ 0 ][ 2 ]) # boolean replaced with NULL
197- self . assertIsNotNone ( results [ 0 ][ 3 ]) # timestamp updated
193+ for i in range (len (results )):
194+ results [ i ][ 3 ] = results [ i ][ 3 ]. timestamp_pb ()
195+ self .assertEqual (
196+ results ,
197+ [[ 'replace0' , 10 , None , TIMESTAMPS [ 0 ]. to_proto ()],
198+ [ 'replace1' , 11 , None , TIMESTAMPS [ 1 ]. to_proto ()]])
198199
199200 def test_spanner_update (self ):
200201 self .spanner_helper .insert_values (
201202 self .database_id ,
202- [('update0' , 5 , False , Timestamp . of ( 1234567890.0 ) .to_rfc3339 ()),
203- ('update1' , 9 , False , Timestamp . of ( 1234567891.0 ) .to_rfc3339 ())])
203+ [('update0' , 5 , False , TIMESTAMPS [ 10 ] .to_rfc3339 ()),
204+ ('update1' , 9 , False , TIMESTAMPS [ 100 ] .to_rfc3339 ())])
204205
205206 def to_row_fn (num ):
206207 return SpannerPartTestRow (
207208 f_string = f'update{ num } ' ,
208209 f_int64 = num + 10 ,
209- f_timestamp = Timestamp . of ( 1234567900.0 + num ) )
210+ f_timestamp = TIMESTAMPS [ num ] )
210211
211212 self .run_write_pipeline (2 , to_row_fn , SpannerPartTestRow , SpannerUpdate )
212-
213213 results = self .spanner_helper .read_data (self .database_id , 'update' )
214- self .assertEqual (len (results ), 2 )
215- # In UPDATE, boolean preserved but timestamp updated
216- self .assertEqual (results [0 ][1 ], 10 )
217- self .assertEqual (results [0 ][2 ], False ) # boolean preserved
218- self .assertIsNotNone (results [0 ][3 ]) # timestamp updated
214+ for i in range (len (results )):
215+ results [i ][3 ] = results [i ][3 ].timestamp_pb ()
216+ self .assertEqual (
217+ results ,
218+ [['update0' , 10 , False , TIMESTAMPS [0 ].to_proto ()],
219+ ['update1' , 11 , False , TIMESTAMPS [1 ].to_proto ()]])
219220
220221 def test_spanner_delete (self ):
221222 self .spanner_helper .insert_values (
222223 self .database_id ,
223224 values = [
224- ('delete0' , 0 , None , Timestamp . of ( 1234567890.0 ) .to_rfc3339 ()),
225- ('delete6' , 6 , False , Timestamp . of ( 1234567896.0 ) .to_rfc3339 ()),
226- ('delete20' , 20 , True , Timestamp . of ( 1234567910.0 ) .to_rfc3339 ()),
225+ ('delete0' , 0 , None , TIMESTAMPS [ 0 ] .to_rfc3339 ()),
226+ ('delete6' , 6 , False , TIMESTAMPS [ 0 ] .to_rfc3339 ()),
227+ ('delete20' , 20 , True , TIMESTAMPS [ 0 ] .to_rfc3339 ()),
227228 ])
228229
229230 def to_row_fn (num ):
230231 return SpannerTestKey (f_string = f'delete{ num } ' )
231232
232233 self .run_write_pipeline (10 , to_row_fn , SpannerTestKey , SpannerDelete )
233-
234234 results = self .spanner_helper .read_data (self .database_id , prefix = 'delete' )
235- self .assertEqual (len (results ), 1 )
236- self .assertEqual (results [0 ][0 ], 'delete20' )
237- self .assertEqual (results [0 ][1 ], 20 )
238- self .assertEqual (results [0 ][2 ], True )
239- self .assertIsNotNone (results [0 ][3 ]) # timestamp preserved
235+ for i in range (len (results )):
236+ results [i ][3 ] = results [i ][3 ].timestamp_pb ()
237+ self .assertEqual (
238+ results , [['delete20' , 20 , True , TIMESTAMPS [0 ].to_proto ()]])
240239
241240 def test_spanner_read_query (self ):
242241 self .insert_read_values ('query_read' )
@@ -268,17 +267,17 @@ def run_read_pipeline(self, prefix, table=None, query=None):
268267 f_int64 = 0 ,
269268 f_string = f'{ prefix } 0' ,
270269 f_boolean = None ,
271- f_timestamp = Timestamp . of ( 1234567890.0 ) ),
270+ f_timestamp = TIMESTAMPS [ 0 ] ),
272271 SpannerTestRow (
273272 f_int64 = 1 ,
274273 f_string = f'{ prefix } 1' ,
275274 f_boolean = True ,
276- f_timestamp = Timestamp . of ( 1234567891.0 ) ),
275+ f_timestamp = TIMESTAMPS [ 1 ] ),
277276 SpannerTestRow (
278277 f_int64 = 2 ,
279278 f_string = f'{ prefix } 2' ,
280279 f_boolean = False ,
281- f_timestamp = Timestamp . of ( 1234567892.0 ) ),
280+ f_timestamp = TIMESTAMPS [ 2 ] ),
282281 ]))
283282
284283 def run_write_pipeline (
@@ -303,9 +302,9 @@ def insert_read_values(self, prefix):
303302 self .spanner_helper .insert_values (
304303 self .database_id ,
305304 values = [
306- (f'{ prefix } 0' , 0 , None , Timestamp . of ( 1234567890.0 ) .to_rfc3339 ()),
307- (f'{ prefix } 1' , 1 , True , Timestamp . of ( 1234567891.0 ) .to_rfc3339 ()),
308- (f'{ prefix } 2' , 2 , False , Timestamp . of ( 1234567892.0 ) .to_rfc3339 ()),
305+ (f'{ prefix } 0' , 0 , None , TIMESTAMPS [ 0 ] .to_rfc3339 ()),
306+ (f'{ prefix } 1' , 1 , True , TIMESTAMPS [ 1 ] .to_rfc3339 ()),
307+ (f'{ prefix } 2' , 2 , False , TIMESTAMPS [ 2 ] .to_rfc3339 ()),
309308 ])
310309
311310
0 commit comments