async def test_query(creds: str, kind: str, project: str) -> None: async with aiohttp.ClientSession(conn_timeout=10, read_timeout=10) as s: ds = Datastore(project, creds, session=s) query = GQLQuery(f'SELECT * FROM {kind} WHERE value = @value', named_bindings={'value': 42}) before = await ds.runQuery(query, session=s) num_results = len(before.entity_results) transaction = await ds.beginTransaction(session=s) mutations = [ ds.make_mutation(Operation.INSERT, Key(project, [PathElement(kind)]), properties={'value': 42}), ds.make_mutation(Operation.INSERT, Key(project, [PathElement(kind)]), properties={'value': 42}), ds.make_mutation(Operation.INSERT, Key(project, [PathElement(kind)]), properties={'value': 42}), ] await ds.commit(transaction, mutations=mutations, session=s) after = await ds.runQuery(query, session=s) assert len(after.entity_results) == num_results + 3
async def test_query(creds: str, kind: str, project: str) -> None: async with Session() as s: ds = Datastore(project=project, service_file=creds, session=s) property_filter = PropertyFilter(prop='value', operator=PropertyFilterOperator.EQUAL, value=Value(42)) query = Query(kind=kind, query_filter=Filter(property_filter)) before = await ds.runQuery(query, session=s) num_results = len(before.entity_results) transaction = await ds.beginTransaction(session=s) mutations = [ ds.make_mutation(Operation.INSERT, Key(project, [PathElement(kind)]), properties={'value': 42}), ds.make_mutation(Operation.INSERT, Key(project, [PathElement(kind)]), properties={'value': 42}), ] await ds.commit(mutations, transaction=transaction, session=s) after = await ds.runQuery(query, session=s) assert len(after.entity_results) == num_results + 2
async def test_gql_query_pagination(creds: str, kind: str, project: str) -> None: async with Session() as s: query_string = (f'SELECT __key__ FROM {kind}' 'WHERE value = @value LIMIT @limit OFFSET @offset') named_bindings = {'value': 42, 'limit': 2**31 - 1, 'offset': 0} ds = Datastore(project=project, service_file=creds, session=s) before = await ds.runQuery(GQLQuery(query_string, named_bindings=named_bindings), session=s) insertion_count = 8 transaction = await ds.beginTransaction(session=s) mutations = [ ds.make_mutation(Operation.INSERT, Key(project, [PathElement(kind)]), properties=named_bindings) ] * insertion_count await ds.commit(mutations, transaction=transaction, session=s) page_size = 5 named_bindings['limit'] = page_size named_bindings['offset'] = GQLCursor(before.end_cursor) first_page = await ds.runQuery(GQLQuery(query_string, named_bindings=named_bindings), session=s) assert (len(first_page.entity_results)) == page_size named_bindings['offset'] = GQLCursor(first_page.end_cursor) second_page = await ds.runQuery(GQLQuery( query_string, named_bindings=named_bindings), session=s) assert len(second_page.entity_results) == insertion_count - page_size
def test_make_mutation_from_value_object(key): value = Value(30, exclude_from_indexes=True) properties = {'value': value} results = Datastore.make_mutation(Operation.INSERT, key, properties) assert results['insert']['properties']['value'] == value.to_repr()
async def test_transaction(creds: str, kind: str, project: str) -> None: key = Key(project, [PathElement(kind, name=f'test_record_{uuid.uuid4()}')]) async with Session() as s: ds = Datastore(project=project, service_file=creds, session=s) transaction = await ds.beginTransaction(session=s) actual = await ds.lookup([key], transaction=transaction, session=s) assert len(actual['missing']) == 1 mutations = [ ds.make_mutation(Operation.INSERT, key, properties={'animal': 'three-toed sloth'}), ds.make_mutation(Operation.UPDATE, key, properties={'animal': 'aardvark'}), ] await ds.commit(mutations, transaction=transaction, session=s) actual = await ds.lookup([key], session=s) assert actual['found'][0].entity.properties == {'animal': 'aardvark'}