def test_delete_entities_wo_transaction(self): from gcloud.datastore.connection import datastore_pb from gcloud.datastore.key import Key DATASET_ID = 'DATASET' key_pb = Key(path=[{'kind': 'Kind', 'id': 1234}]).to_protobuf() rsp_pb = datastore_pb.CommitResponse() conn = self._makeOne() URI = '/'.join([ conn.API_BASE_URL, 'datastore', conn.API_VERSION, 'datasets', DATASET_ID, 'commit', ]) http = conn._http = Http({'status': '200'}, rsp_pb.SerializeToString()) result = conn.delete_entities(DATASET_ID, [key_pb]) self.assertEqual(result, True) cw = http._called_with self._verifyProtobufCall(cw, URI, conn) rq_class = datastore_pb.CommitRequest request = rq_class() request.ParseFromString(cw['body']) self.assertEqual(request.transaction, '') mutation = request.mutation self.assertEqual(len(mutation.insert_auto_id), 0) self.assertEqual(len(mutation.upsert), 0) deletes = list(mutation.delete) self.assertEqual(len(deletes), 1) delete = deletes[0] self.assertEqual(delete, key_pb) self.assertEqual(request.mode, rq_class.NON_TRANSACTIONAL)
def test_commit_wo_transaction(self): from gcloud.datastore.connection import datastore_pb from gcloud.datastore.key import Key DATASET_ID = 'DATASET' key_pb = Key(path=[{'kind': 'Kind', 'id': 1234}]).to_protobuf() rsp_pb = datastore_pb.CommitResponse() mutation = datastore_pb.Mutation() insert = mutation.upsert.add() insert.key.CopyFrom(key_pb) prop = insert.property.add() prop.name = 'foo' prop.value.string_value = u'Foo' conn = self._makeOne() URI = '/'.join([ conn.API_BASE_URL, 'datastore', conn.API_VERSION, 'datasets', DATASET_ID, 'commit', ]) http = conn._http = Http({'status': '200'}, rsp_pb.SerializeToString()) result = conn.commit(DATASET_ID, mutation) self.assertEqual(result.index_updates, 0) self.assertEqual(list(result.insert_auto_id_key), []) cw = http._called_with self._verifyProtobufCall(cw, URI, conn) rq_class = datastore_pb.CommitRequest request = rq_class() request.ParseFromString(cw['body']) self.assertEqual(request.transaction, '') self.assertEqual(request.mutation, mutation) self.assertEqual(request.mode, rq_class.NON_TRANSACTIONAL)
def test_commit_w_transaction(self): from gcloud.datastore import _datastore_v1_pb2 as datastore_pb DATASET_ID = 'DATASET' key_pb = self._make_key_pb(DATASET_ID) rsp_pb = datastore_pb.CommitResponse() mutation = datastore_pb.Mutation() insert = mutation.upsert.add() insert.key.CopyFrom(key_pb) prop = insert.property.add() prop.name = 'foo' prop.value.string_value = u'Foo' conn = self._makeOne() URI = '/'.join([ conn.api_base_url, 'datastore', conn.API_VERSION, 'datasets', DATASET_ID, 'commit', ]) http = conn._http = Http({'status': '200'}, rsp_pb.SerializeToString()) result = conn.commit(DATASET_ID, mutation, b'xact') self.assertEqual(result.index_updates, 0) self.assertEqual(list(result.insert_auto_id_key), []) cw = http._called_with self._verifyProtobufCall(cw, URI, conn) rq_class = datastore_pb.CommitRequest request = rq_class() request.ParseFromString(cw['body']) self.assertEqual(request.transaction, b'xact') self.assertEqual(request.mutation, mutation) self.assertEqual(request.mode, rq_class.TRANSACTIONAL)
def test_save_entity_w_exclude_from_indexes(self): from gcloud.datastore.connection import datastore_pb from gcloud.datastore.key import Key import operator DATASET_ID = 'DATASET' key_pb = Key(path=[{'kind': 'Kind', 'id': 1234}]).to_protobuf() rsp_pb = datastore_pb.CommitResponse() conn = self._makeOne() URI = '/'.join([ conn.API_BASE_URL, 'datastore', conn.API_VERSION, 'datasets', DATASET_ID, 'commit', ]) http = conn._http = Http({'status': '200'}, rsp_pb.SerializeToString()) result = conn.save_entity(DATASET_ID, key_pb, { 'foo': u'Foo', 'bar': [u'bar1', u'bar2'] }, exclude_from_indexes=['foo', 'bar']) self.assertEqual(result, True) cw = http._called_with self._verifyProtobufCall(cw, URI, conn) rq_class = datastore_pb.CommitRequest request = rq_class() request.ParseFromString(cw['body']) self.assertEqual(request.transaction, '') mutation = request.mutation self.assertEqual(len(mutation.insert_auto_id), 0) upserts = list(mutation.upsert) self.assertEqual(len(upserts), 1) upsert = upserts[0] self.assertEqual(upsert.key, key_pb) props = sorted(upsert.property, key=operator.attrgetter('name'), reverse=True) self.assertEqual(len(props), 2) self.assertEqual(props[0].name, 'foo') self.assertEqual(props[0].value.string_value, u'Foo') self.assertEqual(props[0].value.indexed, False) self.assertEqual(props[1].name, 'bar') self.assertEqual(props[1].value.list_value[0].string_value, 'bar1') self.assertEqual(props[1].value.list_value[1].string_value, 'bar2') self.assertEqual(props[1].value.HasField('indexed'), False) self.assertEqual(props[1].value.list_value[0].indexed, False) self.assertEqual(props[1].value.list_value[1].indexed, False) self.assertEqual(len(mutation.delete), 0) self.assertEqual(request.mode, rq_class.NON_TRANSACTIONAL)
def test_save_entity_wo_transaction_w_auto_id(self): from gcloud.datastore.connection import datastore_pb from gcloud.datastore.key import Key DATASET_ID = 'DATASET' key_pb = Key(path=[{'kind': 'Kind'}]).to_protobuf() updated_key_pb = Key(path=[{'kind': 'Kind', 'id': 1234}]).to_protobuf() rsp_pb = datastore_pb.CommitResponse() mr_pb = rsp_pb.mutation_result mr_pb.index_updates = 0 iaik_pb = mr_pb.insert_auto_id_key.add() iaik_pb.CopyFrom(updated_key_pb) conn = self._makeOne() URI = '/'.join([ conn.API_BASE_URL, 'datastore', conn.API_VERSION, 'datasets', DATASET_ID, 'commit', ]) http = conn._http = Http({'status': '200'}, rsp_pb.SerializeToString()) result = conn.save_entity(DATASET_ID, key_pb, {'foo': u'Foo'}) self.assertEqual(result, updated_key_pb) cw = http._called_with self.assertEqual(cw['uri'], URI) self.assertEqual(cw['method'], 'POST') self.assertEqual(cw['headers']['Content-Type'], 'application/x-protobuf') self.assertEqual(cw['headers']['User-Agent'], conn.USER_AGENT) rq_class = datastore_pb.CommitRequest request = rq_class() request.ParseFromString(cw['body']) self.assertEqual(request.transaction, '') mutation = request.mutation inserts = list(mutation.insert_auto_id) insert = inserts[0] self.assertEqual(insert.key, key_pb) props = list(insert.property) self.assertEqual(len(props), 1) self.assertEqual(props[0].name, 'foo') self.assertEqual(props[0].value.string_value, u'Foo') self.assertEqual(len(inserts), 1) upserts = list(mutation.upsert) self.assertEqual(len(upserts), 0) self.assertEqual(len(mutation.delete), 0) self.assertEqual(request.mode, rq_class.NON_TRANSACTIONAL)
def test_commit_w_transaction(self): from gcloud.datastore.connection import datastore_pb from gcloud.datastore.key import Key class Xact(object): def id(self): return 'xact' DATASET_ID = 'DATASET' key_pb = Key(path=[{'kind': 'Kind', 'id': 1234}]).to_protobuf() rsp_pb = datastore_pb.CommitResponse() mutation = datastore_pb.Mutation() insert = mutation.upsert.add() insert.key.CopyFrom(key_pb) prop = insert.property.add() prop.name = 'foo' prop.value.string_value = u'Foo' conn = self._makeOne() conn.transaction(Xact()) URI = '/'.join([ conn.API_BASE_URL, 'datastore', conn.API_VERSION, 'datasets', DATASET_ID, 'commit', ]) http = conn._http = Http({'status': '200'}, rsp_pb.SerializeToString()) result = conn.commit(DATASET_ID, mutation) self.assertEqual(result.index_updates, 0) self.assertEqual(list(result.insert_auto_id_key), []) cw = http._called_with self.assertEqual(cw['uri'], URI) self.assertEqual(cw['method'], 'POST') self.assertEqual(cw['headers']['Content-Type'], 'application/x-protobuf') self.assertEqual(cw['headers']['User-Agent'], conn.USER_AGENT) rq_class = datastore_pb.CommitRequest request = rq_class() request.ParseFromString(cw['body']) self.assertEqual(request.transaction, 'xact') self.assertEqual(request.mutation, mutation) self.assertEqual(request.mode, rq_class.TRANSACTIONAL)
def test_delete_entities_w_transaction(self): from gcloud.datastore.connection import datastore_pb from gcloud.datastore.key import Key mutation = datastore_pb.Mutation() class Xact(object): def mutation(self): return mutation DATASET_ID = 'DATASET' key_pb = Key(path=[{'kind': 'Kind', 'id': 1234}]).to_protobuf() rsp_pb = datastore_pb.CommitResponse() conn = self._makeOne() conn.transaction(Xact()) http = conn._http = Http({'status': '200'}, rsp_pb.SerializeToString()) result = conn.delete_entities(DATASET_ID, [key_pb]) self.assertEqual(result, True) self.assertEqual(http._called_with, None) mutation = conn.mutation() self.assertEqual(len(mutation.delete), 1)
def test_save_entity_w_transaction_nested_entity(self): from gcloud.datastore.connection import datastore_pb from gcloud.datastore.entity import Entity from gcloud.datastore.key import Key mutation = datastore_pb.Mutation() class Xact(object): def mutation(self): return mutation DATASET_ID = 'DATASET' nested = Entity() nested['bar'] = u'Bar' key_pb = Key(path=[{'kind': 'Kind', 'id': 1234}]).to_protobuf() rsp_pb = datastore_pb.CommitResponse() conn = self._makeOne() conn.transaction(Xact()) http = conn._http = Http({'status': '200'}, rsp_pb.SerializeToString()) result = conn.save_entity(DATASET_ID, key_pb, {'foo': nested}) self.assertEqual(result, True) self.assertEqual(http._called_with, None) mutation = conn.mutation() self.assertEqual(len(mutation.upsert), 1)