def test_read_expanded_navigation_property(self): # Initial data ######################################################## def request_callback(request): payload = { 'ProductID': 51, 'ProductName': 'Foo', 'Category': 'Bar', 'Price': 12.3, 'Parts': [{ 'PartID': 512, 'PartName': 'Bits and bobs', 'Size': 5.333, }] } resp_body = {'value': [payload]} headers = {} return requests.codes.ok, headers, json.dumps(resp_body) responses.add_callback( responses.GET, ProductWithNavigation.__odata_url__(), callback=request_callback, content_type='application/json', ) ####################################################################### query = Service.query(ProductWithNavigation) query.expand(ProductWithNavigation.parts) product = query.first() # Get parts ########################################################### parts_url = product.__odata__.instance_url + '/Parts' def request_callback_parts(request): assert False, 'Expanded NavigationProperty should not cause GET' responses.add_callback( responses.GET, parts_url, callback=request_callback_parts, content_type='application/json', ) ####################################################################### for part in product.parts: assert isinstance(part, ProductPart)
def test_read_single_navigation_property(self): # Initial data ######################################################## def request_callback(request): payload = { 'ProductID': 51, 'ProductName': 'Foo', 'Category': 'Bar', 'Price': 12.3, } resp_body = {'value': [payload]} headers = {} return requests.codes.ok, headers, json.dumps(resp_body) with responses.RequestsMock() as rsps: rsps.add_callback( rsps.GET, ProductWithNavigation.__odata_url__(), callback=request_callback, content_type='application/json', ) product = Service.query(ProductWithNavigation).first() # Get parts ########################################################### parts_url = product.__odata__.instance_url + '/Manufacturer' def request_callback_manufacturer(request): payload = { 'ManufacturerID': 33, 'Name': 'Best Parts Ltd.', 'DateEstablished': '2007-06-05T12:00:00Z', } resp_body = payload headers = {} return requests.codes.ok, headers, json.dumps(resp_body) with responses.RequestsMock() as rsps: rsps.add_callback( rsps.GET, parts_url, callback=request_callback_manufacturer, content_type='application/json', ) mf = product.manufacturer assert isinstance(mf, Manufacturer)
def test_read_collection_navigation_property(self): # Initial data ######################################################## def request_callback(request): payload = { 'ProductID': 51, 'ProductName': 'Foo', 'Category': 'Bar', 'Price': 12.3, } resp_body = {'value': [payload]} headers = {} return requests.codes.ok, headers, json.dumps(resp_body) with responses.RequestsMock() as rsps: rsps.add_callback( rsps.GET, ProductWithNavigation.__odata_url__(), callback=request_callback, content_type='application/json', ) product = Service.query(ProductWithNavigation).first() # Get parts ########################################################### parts_url = product.__odata__.instance_url + '/Parts' def request_callback_parts(request): payload = { 'PartID': 512, 'PartName': 'Bits and bobs', 'Size': 5.333, } resp_body = {'value': [payload]} headers = {} return requests.codes.ok, headers, json.dumps(resp_body) with responses.RequestsMock() as rsps: rsps.add_callback( rsps.GET, parts_url, callback=request_callback_parts, content_type='application/json', ) for part in product.parts: assert isinstance(part, ProductPart)
def test_read_expanded_navigation_property(self): # Initial data ######################################################## def request_callback(request): payload = { 'ProductID': 51, 'ProductName': 'Foo', 'Category': 'Bar', 'Price': 12.3, 'Parts': [ { 'PartID': 512, 'PartName': 'Bits and bobs', 'Size': 5.333, } ] } resp_body = {'value': [payload]} headers = {} return requests.codes.ok, headers, json.dumps(resp_body) responses.add_callback( responses.GET, ProductWithNavigation.__odata_url__(), callback=request_callback, content_type='application/json', ) ####################################################################### query = Service.query(ProductWithNavigation) query.expand(ProductWithNavigation.parts) product = query.first() # Get parts ########################################################### parts_url = product.__odata__.instance_url + '/Parts' def request_callback_parts(request): assert False, 'Expanded NavigationProperty should not cause GET' responses.add_callback( responses.GET, parts_url, callback=request_callback_parts, content_type='application/json', ) ####################################################################### for part in product.parts: assert isinstance(part, ProductPart)
def test_read_single_navigation_property(self): # Initial data ######################################################## def request_callback(request): payload = { 'ProductID': 51, 'ProductName': 'Foo', 'Category': 'Bar', 'Price': 12.3, } resp_body = {'value': [payload]} headers = {} return requests.codes.ok, headers, json.dumps(resp_body) responses.add_callback( responses.GET, ProductWithNavigation.__odata_url__(), callback=request_callback, content_type='application/json', ) ####################################################################### product = Service.query(ProductWithNavigation).first() # Get parts ########################################################### parts_url = product.__odata__.instance_url + '/Manufacturer' def request_callback_manufacturer(request): payload = { 'ManufacturerID': 33, 'Name': 'Best Parts Ltd.', 'DateEstablished': '2007-06-05T12:00:00Z', } resp_body = payload headers = {} return requests.codes.ok, headers, json.dumps(resp_body) responses.add_callback( responses.GET, parts_url, callback=request_callback_manufacturer, content_type='application/json', ) ####################################################################### mf = product.manufacturer assert isinstance(mf, Manufacturer)
def test_set_navigation_property(self): # Initial data ######################################################## def request_callback(request): payload = { 'ProductID': 51, 'ProductName': 'Foo', 'Category': 'Bar', 'Price': 12.3, } resp_body = {'value': [payload]} headers = {} return requests.codes.ok, headers, json.dumps(resp_body) with responses.RequestsMock() as rsps: rsps.add_callback( rsps.GET, ProductWithNavigation.__odata_url__(), callback=request_callback, content_type='application/json', ) product = Service.query(ProductWithNavigation).first() # Get part ############################################################ def request_callback_parts(request): payload = { 'PartID': 512, 'PartName': 'Bits and bobs', 'Size': 5.333, } resp_body = {'value': [payload]} headers = {} return requests.codes.ok, headers, json.dumps(resp_body) with responses.RequestsMock() as rsps: rsps.add_callback( rsps.GET, ProductPart.__odata_url__(), callback=request_callback_parts, content_type='application/json', ) part = Service.query(ProductPart).first() product.parts = [part] # Patch call ########################################################## def request_callback_set_parts(request): payload = json.loads(request.body) key = '*****@*****.**' assert key in payload assert payload.get(key) == ['ProductParts(512)'] headers = {} return requests.codes.no_content, headers, '' with responses.RequestsMock() as rsps: rsps.add_callback( rsps.PATCH, product.__odata__.instance_url, callback=request_callback_set_parts, content_type='application/json', ) # Reload data ##################################################### rsps.add_callback( rsps.GET, product.__odata__.instance_url, callback=request_callback, content_type='application/json', ) Service.save(product)
def test_create_deep_inserts(self): # Initial part data ################################################### def request_callback_part(request): payload = { 'PartID': 35, 'PartName': 'Testing', 'Size': 55, } resp_body = {'value': [payload]} headers = {} return requests.codes.created, headers, json.dumps(resp_body) responses.add_callback( responses.GET, ProductPart.__odata_url__(), callback=request_callback_part, content_type='application/json', ) ####################################################################### queried_part = Service.query(ProductPart).first() # Post call ########################################################### def request_callback(request): payload = json.loads(request.body) assert 'OData-Version' in request.headers, 'OData-Version header not in request' assert 'ProductID' not in payload, 'Payload contains primary key' assert '@odata.type' in payload, 'Payload did not contain @odata.type' assert '*****@*****.**' in payload, 'Parts bind not in payload' assert payload['*****@*****.**'] == ['ProductParts(35)'] assert 'Parts' in payload, 'Parts not in payload' parts = payload['Parts'] assert isinstance(parts, list), 'Parts is not a list' part = parts[0] assert len(part) == 3, 'Extra keys in deep inserted part: {0}'.format(part) assert '@odata.type' in part assert part['PartName'] == 'Foo' assert part['Size'] == 12.5 payload['ProductID'] = 1 resp_body = payload headers = {} return requests.codes.created, headers, json.dumps(resp_body) responses.add_callback( responses.POST, ProductWithNavigation.__odata_url__(), callback=request_callback, content_type='application/json', ) ####################################################################### part = ProductPart() part.name = 'Foo' part.size = 12.5 new_product = ProductWithNavigation() new_product.name = u'New Test Product' new_product.category = u'Category #1' new_product.price = 34.5 new_product.parts = [part, queried_part] Service.save(new_product) assert new_product.id is not None, 'Product.id is not set'
def test_set_navigation_property(self): # Initial data ######################################################## def request_callback(request): payload = { 'ProductID': 51, 'ProductName': 'Foo', 'Category': 'Bar', 'Price': 12.3, } resp_body = {'value': [payload]} headers = {} return requests.codes.ok, headers, json.dumps(resp_body) responses.add_callback( responses.GET, ProductWithNavigation.__odata_url__(), callback=request_callback, content_type='application/json', ) ####################################################################### product = Service.query(ProductWithNavigation).first() # Get part ############################################################ def request_callback_parts(request): payload = { 'PartID': 512, 'PartName': 'Bits and bobs', 'Size': 5.333, } resp_body = {'value': [payload]} headers = {} return requests.codes.ok, headers, json.dumps(resp_body) responses.add_callback( responses.GET, ProductPart.__odata_url__(), callback=request_callback_parts, content_type='application/json', ) ####################################################################### part = Service.query(ProductPart).first() product.parts = [part] # Patch call ########################################################## def request_callback_set_parts(request): payload = json.loads(request.body) key = '*****@*****.**' assert key in payload assert payload.get(key) == ['ProductParts(512)'] headers = {} return requests.codes.no_content, headers, '' responses.add_callback( responses.PATCH, product.__odata__.instance_url, callback=request_callback_set_parts, content_type='application/json', ) ####################################################################### # Reload data ######################################################### responses.add_callback( responses.GET, product.__odata__.instance_url, callback=request_callback, content_type='application/json', ) ####################################################################### Service.save(product)
def test_create_deep_inserts(self): # Initial part data ################################################### def request_callback_part(request): payload = { 'PartID': 35, 'PartName': 'Testing', 'Size': 55, } resp_body = {'value': [payload]} headers = {} return requests.codes.created, headers, json.dumps(resp_body) responses.add_callback( responses.GET, ProductPart.__odata_url__(), callback=request_callback_part, content_type='application/json', ) ####################################################################### queried_part = Service.query(ProductPart).first() # Post call ########################################################### def request_callback(request): payload = json.loads(request.body) assert 'OData-Version' in request.headers, 'OData-Version header not in request' assert 'ProductID' not in payload, 'Payload contains primary key' assert '@odata.type' in payload, 'Payload did not contain @odata.type' assert '*****@*****.**' in payload, 'Parts bind not in payload' assert payload['*****@*****.**'] == ['ProductParts(35)'] assert 'Parts' in payload, 'Parts not in payload' parts = payload['Parts'] assert isinstance(parts, list), 'Parts is not a list' part = parts[0] assert len( part) == 3, 'Extra keys in deep inserted part: {0}'.format( part) assert '@odata.type' in part assert part['PartName'] == 'Foo' assert part['Size'] == 12.5 payload['ProductID'] = 1 resp_body = payload headers = {} return requests.codes.created, headers, json.dumps(resp_body) responses.add_callback( responses.POST, ProductWithNavigation.__odata_url__(), callback=request_callback, content_type='application/json', ) ####################################################################### part = ProductPart() part.name = 'Foo' part.size = 12.5 new_product = ProductWithNavigation() new_product.name = u'New Test Product' new_product.category = u'Category #1' new_product.price = 34.5 new_product.parts = [part, queried_part] Service.save(new_product) assert new_product.id is not None, 'Product.id is not set'