def test_mutable_parameters(self): dct = {'a': 'http://one/two/three/four'} ctx = mock_context() ctx.formatter = JSONFormatter() get_sha1(ctx, dct) # Make sure that the dct that we pass in is the same dict that gets returned self.assertEqual(dct, {'a': 'http://one/two/three/four'})
def test_get_batch(self): root_resource = self.create_root_resource_with_children( r'^api/v2/(?P<base_resource>.*)$', methods=['GET'], result={'name': 'value'} ) request_data = { "data": [ self._generate_batch_partial( 'get', 'http://localhost:8081/api/v2/child/grandchild', {'business_id': 12345} ) ] } response = savory_dispatch_batch( root_resource, full_host='localhost:8081', method='POST', body=json.dumps(request_data) ) self.assertEqual(response.status_code, 200) response_json = json.loads(response.content) data = response_json['data'] self.assertEqual(len(data), 1) self.assertEqual(data[0]['status'], 200) self.assertEqual(data[0]['uri'], 'http://localhost:8081/api/v2/child/grandchild') self.assertEqual(data[0]['data'], {u'name': u'value'}) ctx = mock_context() ctx.formatter = JSONFormatter() self.assertEqual(data[0]['etag'], get_sha1(ctx, {u'name': u'value'}))
def test_get_batch(self): root_resource = self.create_root_resource_with_children( r'^api/v2/(?P<base_resource>.*)$', methods=['GET'], result={'name': 'value'}) request_data = { "data": [ self._generate_batch_partial( 'get', 'http://localhost:8081/api/v2/child/grandchild', {'business_id': 12345}) ] } response = savory_dispatch_batch(root_resource, full_host='localhost:8081', method='POST', body=json.dumps(request_data)) self.assertEqual(response.status_code, 200) response_json = json.loads(response.content) data = response_json['data'] self.assertEqual(len(data), 1) self.assertEqual(data[0]['status'], 200) self.assertEqual(data[0]['uri'], 'http://localhost:8081/api/v2/child/grandchild') self.assertEqual(data[0]['data'], {u'name': u'value'}) ctx = mock_context() ctx.formatter = JSONFormatter() self.assertEqual(data[0]['etag'], get_sha1(ctx, {u'name': u'value'}))
def get(self, ctx, params): if not self.allow_unfiltered_query and not self.has_valid_key( ctx, params): raise SavoryPieError( 'Request must be filtered, will not return all. Acceptable filters are: {0}' .format([filter.name for filter in self.filters])) complete_queryset = self.queryset.all().distinct() filtered_queryset = self.filter_queryset(ctx, params, complete_queryset) sliced_queryset = self.slice_queryset(ctx, params, filtered_queryset) # prepare must be last for optimization to be respected by Django. final_queryset = self.prepare_queryset(ctx, sliced_queryset) objects = [] for model in final_queryset: model_json = self.to_resource(model).get(ctx, EmptyParams()) model_json['$hash'] = get_sha1(ctx, model_json) objects.append(model_json) meta = dict() count = filtered_queryset.count() meta['count'] = count meta = self.paginate(ctx, params, count, meta) # add meta-level resourceUri to QuerySet response if self.resource_path is not None: meta['resourceUri'] = ctx.build_resource_uri(self) return {'meta': meta, 'objects': objects}
def get(self, ctx, params): if not self.allow_unfiltered_query and not self.has_valid_key(ctx, params): raise SavoryPieError( 'Request must be filtered, will not return all. Acceptable filters are: {0}'.format([filter.name for filter in self.filters]) ) complete_queryset = self.queryset.all().distinct() filtered_queryset = self.filter_queryset(ctx, params, complete_queryset) sliced_queryset = self.slice_queryset(ctx, params, filtered_queryset) # prepare must be last for optimization to be respected by Django. final_queryset = self.prepare_queryset(ctx, sliced_queryset) objects = [] for model in final_queryset: model_json = self.to_resource(model).get(ctx, EmptyParams()) model_json['$hash'] = get_sha1(ctx, model_json) objects.append(model_json) meta = dict() count = filtered_queryset.count() meta['count'] = count meta = self.paginate(ctx, params, count, meta) # add meta-level resourceUri to QuerySet response if self.resource_path is not None: meta['resourceUri'] = ctx.build_resource_uri(self) return { 'meta': meta, 'objects': objects }
def _get_request_for_batch(ctx, resource, data): resource_result = {} get_data = MultiValueDict() get_data.update(data) content_dict = process_get_request(ctx, resource, get_data) resource_result['status'] = 200 resource_result['etag'] = get_sha1(ctx, content_dict) resource_result['data'] = content_dict return resource_result
def get(self, ctx, params): if not self.allow_unfiltered_query and not params.keys(): raise SavoryPieError( 'Request must be filtered, will not return all. Acceptable filters are: {0}'.format([filter.name for filter in self.filters]) ) complete_queryset = self.queryset.all().distinct() filtered_queryset = self.filter_queryset(ctx, params, complete_queryset) sliced_queryset = self.slice_queryset(ctx, params, filtered_queryset) # prepare must be last for optimization to be respected by Django. final_queryset = self.prepare_queryset(ctx, sliced_queryset) objects = [] for model in final_queryset: model_json = self.to_resource(model).get(ctx, EmptyParams()) model_json['$hash'] = get_sha1(ctx, model_json) objects.append(model_json) meta = dict() if self.supports_paging: # When paging the sliced_queryset will not contain all the objects, # so the count of the accumulated objects is insufficient. In that case, # need to make a call to queryset.count. count = filtered_queryset.count() page = params.get_as('page', int, 0) if page > 0: meta['prev'] = self.build_page_uri(ctx, page - 1) meta['count'] = count if (page + 1) * self.page_size < count: meta['next'] = self.build_page_uri(ctx, page + 1) else: # When paging is disabled the sliced_queryset is the complete queryset, # so the accumulated objects contains all the objects. In this case, just # do a len on the accumulated objects to avoid the extra COUNT(*) query. meta['count'] = len(objects) # add meta-level resourceUri to QuerySet response if self.resource_path is not None: meta['resourceUri'] = ctx.build_resource_uri(self) return { 'meta': meta, 'objects': objects }
def _content_success(ctx, resource, request, content_dict): if ctx.streaming_response: response = StreamingHttpResponse( content_dict, status=200, content_type=ctx.formatter.content_type) # No ETag, not practical on streaming else: response = HttpResponse(status=200, content_type=ctx.formatter.content_type) response['ETag'] = get_sha1(ctx, content_dict) ctx.formatter.write_to(content_dict, response) headers = ctx.headers if headers: for header, value in headers.items(): response[header] = value return response
def _content_success(ctx, resource, request, content_dict): if ctx.streaming_response: response = StreamingHttpResponse( content_dict, status=200, content_type=ctx.formatter.content_type) # No ETag, not practical on streaming else: response = HttpResponse( status=200, content_type=ctx.formatter.content_type ) response['ETag'] = get_sha1(ctx, content_dict) ctx.formatter.write_to(content_dict, response) if ctx.headers_dict: for header, value in ctx.headers_dict.items(): response[header] = value return response
def test_has_dictionary(self): dct = {'a': 'b', 'c': 'd'} ctx = mock_context() ctx.formatter = JSONFormatter() self.assertEqual(get_sha1(ctx, dct), '855e751b12bf88bce273d5e1d93a31af9e4945d6')