Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(183)

Side by Side Diff: appengine/findit/model/test/versioned_model_test.py

Issue 2345093002: [Findit] Extending versioned_model.py to support versioning multiple entities of the same class. (Closed)
Patch Set: clean up Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright 2015 The Chromium Authors. All rights reserved. 1 # Copyright 2015 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 from google.appengine.api import datastore_errors 5 from google.appengine.api import datastore_errors
6 from google.appengine.ext import ndb 6 from google.appengine.ext import ndb
7 7
8 from testing_utils import testing 8 from testing_utils import testing
9 9
10 from model.versioned_model import VersionedModel 10 from model.versioned_model import VersionedModel
11 11
12 12
13 class _Entity(VersionedModel): 13 class _Entity(VersionedModel):
14 value = ndb.IntegerProperty(indexed=False) 14 value = ndb.IntegerProperty(indexed=False)
15 15
16 16
17 class VersionedModelTest(testing.AppengineTestCase): 17 class VersionedModelTest(testing.AppengineTestCase):
18 18
19 def testGetRootModel(self): 19 def testGetRootModel(self):
20 root_model_class = _Entity._GetRootModel() 20 root_model_class = _Entity._GetRootModel()
21 self.assertEqual('_EntityRoot', root_model_class._get_kind()) 21 self.assertEqual('_EntityRoot', root_model_class._get_kind())
22 self.assertTrue(issubclass(root_model_class, ndb.Model)) 22 self.assertTrue(issubclass(root_model_class, ndb.Model))
23 self.assertEqual(3, root_model_class(current=3).current) 23 self.assertEqual(3, root_model_class(current=3).current)
24 24
25 def testDefaultVersionIsZero(self): 25 def testDefaultVersionIsZero(self):
26 entity = _Entity() 26 self.assertEqual(0, _Entity().version)
27 self.assertEqual(0, entity.version) 27 self.assertEqual(0, _Entity.Create('m1').version)
28 28
29 def testGetMostRecentVersionWhenNoData(self): 29 def testRootId(self):
30 entity = _Entity.GetVersion() 30 self.assertIsNone(_Entity()._root_id)
31 self.assertIsNone(entity) 31 self.assertEqual(1, _Entity(key=ndb.Key('_Entity', 1))._root_id)
32 self.assertEqual('m1', _Entity(key=ndb.Key('_Entity', 'm1'))._root_id)
33 self.assertEqual(
34 'm1', _Entity(key=ndb.Key('_EntityRoot', 'm1', '_Entity', 1))._root_id)
32 35
33 def testGetMostRecentVersionWhenDataExists(self): 36 def testGetMostRecentVersionWhenDataExists(self):
34 root_key = ndb.Key('_EntityRoot', 1) 37 root_key = ndb.Key('_EntityRoot', 1)
35 _Entity._GetRootModel()(key=root_key, current=2).put() 38 _Entity._GetRootModel()(key=root_key, current=2).put()
36 _Entity(key=ndb.Key('_Entity', 1, parent=root_key), value=1).put() 39 _Entity(key=ndb.Key('_Entity', 1, parent=root_key), value=1).put()
37 _Entity(key=ndb.Key('_Entity', 2, parent=root_key), value=2).put() 40 _Entity(key=ndb.Key('_Entity', 2, parent=root_key), value=2).put()
38 41
39 entity = _Entity.GetVersion() 42 entity = _Entity.GetVersion()
40 self.assertEqual(2, entity.version) 43 self.assertEqual(2, entity.version)
41 self.assertEqual(2, entity.value) 44 self.assertEqual(2, entity.value)
42 45
46 def testGetMostRecentVersionWhenNoData(self):
47 self.assertIsNone(_Entity.GetVersion())
48 self.assertIsNone(_Entity.Create('m1').GetVersion())
stgao 2016/09/24 01:43:11 Why testing instance.GetVersion?
lijeffrey 2016/09/24 06:13:14 oops this was supposed to be _Entity.GetVersion('m
49
50 def testCreate(self):
51 self.assertEqual(_Entity(key=ndb.Key('_EntityRoot', 'm1', '_Entity', 0)),
52 _Entity.Create('m1'))
53
43 def testGetNextVersionWhenDataExists(self): 54 def testGetNextVersionWhenDataExists(self):
44 root_key = ndb.Key('_EntityRoot', 1) 55 root_key = ndb.Key('_EntityRoot', 1)
45 _Entity._GetRootModel()(key=root_key, current=2).put() 56 _Entity._GetRootModel()(key=root_key, current=2).put()
46 _Entity(key=ndb.Key('_Entity', 1, parent=root_key), value=1).put() 57 _Entity(key=ndb.Key('_Entity', 1, parent=root_key), value=1).put()
47 _Entity(key=ndb.Key('_Entity', 2, parent=root_key), value=2).put() 58 _Entity(key=ndb.Key('_Entity', 2, parent=root_key), value=2).put()
48 59
49 entity = _Entity.GetVersion(2) 60 entity = _Entity.GetVersion(version=2)
50 self.assertEqual(2, entity.version) 61 self.assertEqual(2, entity.version)
51 self.assertEqual(2, entity.value) 62 self.assertEqual(2, entity.value)
52 self.assertIsNone(_Entity.GetVersion(0)) 63 self.assertIsNone(_Entity.GetVersion(version=0))
53 self.assertIsNone(_Entity.GetVersion(3)) 64 self.assertIsNone(_Entity.GetVersion(version=3))
54 65
55 def testGetLatestVersionNumber(self): 66 def testGetLatestVersionNumber(self):
56 root_key = ndb.Key('_EntityRoot', 1) 67 root_key = ndb.Key('_EntityRoot', 1)
57 _Entity._GetRootModel()(key=root_key, current=1).put() 68 _Entity._GetRootModel()(key=root_key, current=1).put()
58 _Entity(key=ndb.Key('_Entity', 1, parent=root_key), value=2).put() 69 _Entity(key=ndb.Key('_Entity', 1, parent=root_key), value=2).put()
70 self.assertEqual(1, _Entity.GetLatestVersionNumber())
59 71
60 self.assertEqual(1, _Entity.GetLatestVersionNumber()) 72 def testGetVersionForEntitWithKeyId(self):
stgao 2016/09/24 01:43:11 typo: Entit -> Entity
lijeffrey 2016/09/24 06:13:14 Done.
73 entity = _Entity.Create('m1')
74 entity.value = 1
75 entity.Save()
76 entity.value = 2
77 entity.Save()
78 self.assertEqual(2, _Entity.GetVersion('m1').version)
79 self.assertEqual(2, _Entity.GetVersion('m1').value)
80 self.assertIsNone(_Entity.GetVersion('m1', version=0))
81 self.assertIsNone(_Entity.GetVersion('m1', version=3))
61 82
62 def testGetLatestVersionNumberWhenNoRecordYet(self): 83 def testGetLatestVersionNumberWhenNoRecordYet(self):
63 self.assertEqual(-1, _Entity.GetLatestVersionNumber()) 84 self.assertEqual(-1, _Entity.GetLatestVersionNumber())
85 self.assertEqual(-1, _Entity.GetLatestVersionNumber('m1'))
64 86
65 def testSaveNewVersion(self): 87 def testSaveNewVersion(self):
66 entity = _Entity() 88 entity = _Entity()
67 entity.value = 1 89 entity.value = 1
68 key = entity.Save() 90 key, saved = entity.Save()
69 91
70 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1) 92 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1)
71 self.assertEqual(expected_key, key) 93 self.assertEqual(expected_key, key)
94 self.assertTrue(saved)
72 95
73 entity = _Entity.GetVersion() 96 entity = _Entity.GetVersion()
74 self.assertEqual(1, entity.version) 97 self.assertEqual(1, entity.version)
75 self.assertEqual(1, entity.value) 98 self.assertEqual(1, entity.value)
76 99
77 def testSaveNewVersionAlreadyExist(self): 100 def testSaveEntityWithRootId(self):
101 entity = _Entity.Create('m1')
102 entity.value = 1
103 entity.Save()
104 entity.value = 3
105 entity.Save()
106
107 self.assertEqual(entity.version, 2)
108 self.assertEqual(entity.value, 3)
109
110 def testSaveNewVersionOfEntityWithKeyId(self):
111 entity = _Entity.Create('m1')
112 entity.value = 1
113 key, saved = entity.Save()
114 expected_key = ndb.Key('_EntityRoot', 'm1', '_Entity', 1)
115 self.assertEqual(expected_key, key)
116 self.assertTrue(saved)
117
118 def testSaveNewVersionWithConflictRetry(self):
78 original_ndb_transaction = ndb.transaction 119 original_ndb_transaction = ndb.transaction
79 120
80 def MockNdbTransaction(func, **options): 121 def MockNdbTransaction(func, **options):
81 _Entity(key=ndb.Key('_EntityRoot', 1, '_Entity', 1), value=1).put() 122 _Entity(key=ndb.Key('_EntityRoot', 1, '_Entity', 1), value=1).put()
82 _Entity(key=ndb.Key('_EntityRoot', 1, '_Entity', 2), value=2).put() 123 _Entity(key=ndb.Key('_EntityRoot', 1, '_Entity', 2), value=2).put()
83 return original_ndb_transaction(func, **options) 124 return original_ndb_transaction(func, **options)
84 self.mock(ndb, 'transaction', MockNdbTransaction) 125 self.mock(ndb, 'transaction', MockNdbTransaction)
85 126
86 entity = _Entity() 127 entity = _Entity()
87 key = entity.Save() 128 key, saved = entity.Save()
88 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 3) 129 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 3)
89 self.assertEqual(expected_key, key) 130 self.assertEqual(expected_key, key)
131 self.assertTrue(saved)
132
133 def testSaveNewVersionWithConflictBeforeTransactionNoRetry(self):
134 original_ndb_transaction = ndb.transaction
135
136 def MockNdbTransaction(func, **options):
137 # To simulate another transaction occuring before this one, write a new
138 # version first before the transaction is called.
139 _Entity(key=ndb.Key('_EntityRoot', 1, '_Entity', 1), value=1).put()
140 return original_ndb_transaction(func, **options)
141 self.mock(ndb, 'transaction', MockNdbTransaction)
142
143 entity = _Entity()
144 key, saved = entity.Save(retry_on_conflict=False)
145 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1)
146 self.assertEqual(expected_key, key)
147 self.assertFalse(saved)
148
149 def testSaveNewVersionConflictBeforeSaving(self):
150 original_save = VersionedModel.Save
151
152 def MockSave(*args, **kwargs):
153 # Smulate another transaction beating this call to Save() to creating a
154 # new entity.
155 _Entity(key=ndb.Key('_EntityRoot', 1, '_Entity', 1), value=1).put()
156 return original_save(*args, **kwargs)
157 self.mock(VersionedModel, 'Save', MockSave)
158
159 entity = _Entity()
160 key, saved = entity.Save(retry_on_conflict=False)
161 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1)
162 self.assertEqual(expected_key, key)
163 self.assertFalse(saved)
90 164
91 def testLikelyTransactionFailure(self): 165 def testLikelyTransactionFailure(self):
92 original_ndb_transaction = ndb.transaction 166 original_ndb_transaction = ndb.transaction
93 167
94 calls = [] 168 calls = []
95 def MockNdbTransaction(func, **options): 169 def MockNdbTransaction(func, **options):
96 if len(calls) < 1: 170 if len(calls) < 1:
97 calls.append(1) 171 calls.append(1)
98 raise datastore_errors.Timeout() 172 raise datastore_errors.Timeout()
99 return original_ndb_transaction(func, **options) 173 return original_ndb_transaction(func, **options)
100 self.mock(ndb, 'transaction', MockNdbTransaction) 174 self.mock(ndb, 'transaction', MockNdbTransaction)
101 175
102 entity = _Entity() 176 entity = _Entity()
103 key = entity.Save() 177 key, saved = entity.Save()
104 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1) 178 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1)
105 self.assertEqual(expected_key, key) 179 self.assertEqual(expected_key, key)
180 self.assertTrue(saved)
106 self.assertEqual([1], calls) 181 self.assertEqual([1], calls)
107 182
108 def testTransactionFailure(self): 183 def testTransactionFailure(self):
109 original_ndb_transaction = ndb.transaction 184 original_ndb_transaction = ndb.transaction
110 185
111 calls = [] 186 calls = []
112 def MockNdbTransaction(func, **options): 187 def MockNdbTransaction(func, **options):
113 if len(calls) < 1: 188 if len(calls) < 1:
114 calls.append(1) 189 calls.append(1)
115 raise datastore_errors.BadRequestError() 190 raise datastore_errors.BadRequestError()
116 return original_ndb_transaction(func, **options) 191 return original_ndb_transaction(func, **options)
117 self.mock(ndb, 'transaction', MockNdbTransaction) 192 self.mock(ndb, 'transaction', MockNdbTransaction)
118 193
119 entity = _Entity() 194 entity = _Entity()
120 key = entity.Save() 195 key, saved = entity.Save()
121 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1) 196 expected_key = ndb.Key('_EntityRoot', 1, '_Entity', 1)
122 self.assertEqual(expected_key, key) 197 self.assertEqual(expected_key, key)
123 self.assertEqual([1], calls) 198 self.assertEqual([1], calls)
199 self.assertTrue(saved)
OLDNEW
« no previous file with comments | « no previous file | appengine/findit/model/versioned_config.py » ('j') | appengine/findit/model/versioned_model.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698