@@ -24,14 +24,31 @@ def tearDown(self):
2424 entity .delete ()
2525
2626
27+ class TestDatastoreAllocateIDs (TestDatastore ):
28+
29+ def test_allocate_ids (self ):
30+ incomplete_key = datastore .key .Key (path = [{'kind' : 'Kind' }])
31+ incomplete_key_pb = incomplete_key .to_protobuf ()
32+ incomplete_key_pbs = [incomplete_key_pb ] * 10
33+
34+ connection = self .dataset .connection ()
35+ allocated_key_pbs = connection .allocate_ids (self .dataset .id (),
36+ incomplete_key_pbs )
37+ allocated_keys = [datastore .helpers .key_from_protobuf (key_pb )
38+ for key_pb in allocated_key_pbs ]
39+ self .assertEqual (len (allocated_keys ), 10 )
40+ for key in allocated_keys :
41+ self .assertFalse (key .is_partial ())
42+
43+
2744class TestDatastoreSave (TestDatastore ):
2845
2946 def _get_post (self , name = None , key_id = None , post_content = None ):
3047 post_content = post_content or {
31- 'title' : 'How to make the perfect pizza in your grill' ,
32- 'tags' : ['pizza' , 'grill' ],
48+ 'title' : u 'How to make the perfect pizza in your grill' ,
49+ 'tags' : [u 'pizza' , u 'grill' ],
3350 'publishedAt' : datetime .datetime (2001 , 1 , 1 , tzinfo = pytz .utc ),
34- 'author' : 'Silvano' ,
51+ 'author' : u 'Silvano' ,
3552 'isDraft' : False ,
3653 'wordCount' : 400 ,
3754 'rating' : 5.0 ,
@@ -90,10 +107,10 @@ def test_save_multiple(self):
90107 self .case_entities_to_delete .append (entity1 )
91108
92109 second_post_content = {
93- 'title' : 'How to make the perfect homemade pasta' ,
94- 'tags' : ['pasta' , 'homemade' ],
110+ 'title' : u 'How to make the perfect homemade pasta' ,
111+ 'tags' : [u 'pasta' , u 'homemade' ],
95112 'publishedAt' : datetime .datetime (2001 , 1 , 1 ),
96- 'author' : 'Silvano' ,
113+ 'author' : u 'Silvano' ,
97114 'isDraft' : False ,
98115 'wordCount' : 450 ,
99116 'rating' : 4.5 ,
@@ -112,6 +129,29 @@ def test_empty_kind(self):
112129 self .assertEqual (posts , [])
113130
114131
132+ class TestDatastoreSaveKeys (TestDatastore ):
133+
134+ def test_save_key_self_reference (self ):
135+ key = datastore .key .Key .from_path ('Person' , 'name' )
136+ entity = self .dataset .entity (kind = None ).key (key )
137+ entity ['fullName' ] = u'Full name'
138+ entity ['linkedTo' ] = key # Self reference.
139+
140+ entity .save ()
141+ self .case_entities_to_delete .append (entity )
142+
143+ query = self .dataset .query ('Person' ).filter (
144+ 'linkedTo =' , key ).limit (2 )
145+
146+ stored_persons = query .fetch ()
147+ self .assertEqual (len (stored_persons ), 1 )
148+
149+ stored_person = stored_persons [0 ]
150+ self .assertEqual (stored_person ['fullName' ], entity ['fullName' ])
151+ self .assertEqual (stored_person .key ().path (), key .path ())
152+ self .assertEqual (stored_person .key ().namespace (), key .namespace ())
153+
154+
115155class TestDatastoreQuery (TestDatastore ):
116156
117157 @classmethod
@@ -286,3 +326,24 @@ def test_query_group_by(self):
286326
287327 self .assertEqual (entities [0 ]['name' ], 'Catelyn' )
288328 self .assertEqual (entities [1 ]['name' ], 'Arya' )
329+
330+
331+ class TestDatastoreTransaction (TestDatastore ):
332+
333+ def test_transaction (self ):
334+ key = datastore .key .Key .from_path ('Company' , 'Google' )
335+ entity = self .dataset .entity (kind = None ).key (key )
336+ entity ['url' ] = u'www.google.com'
337+
338+ with self .dataset .transaction ():
339+ retrieved_entity = self .dataset .get_entity (key )
340+ if retrieved_entity is None :
341+ entity .save ()
342+ self .case_entities_to_delete .append (entity )
343+
344+ # This will always return after the transaction.
345+ retrieved_entity = self .dataset .get_entity (key )
346+ retrieved_dict = dict (retrieved_entity .items ())
347+ entity_dict = dict (entity .items ())
348+ self .assertEqual (retrieved_dict , entity_dict )
349+ retrieved_entity .delete ()
0 commit comments