def test_filter_inheritance_with_mixin(self): data = EndpointFilteringTestCase.DummyClassTwo() filtered_data = filtering.apply_filters_to_object( data, EndpointFilteringTestCase.TEST_FILTERS ) self.assertTrue("foo" in filtered_data) self.assertTrue("bar" in filtered_data)
def test_expand_multi_level_more_than_one_field(self): filtered = filtering.apply_filters_to_object( self.root, filters.DEFAULT_FILTERS, expand_header="parent_field,parent_field.children, parent_field.favorite.test", ) self.assertEqual(4, len(filtered)) self.assertTrue("parent_field" in filtered) self.assertEqual(5, len(filtered["parent_field"])) self.assertEqual( self.p1.nonstandard_id, filtered["parent_field"]["nonstandard_id"] ) self.assertEqual(self.p1.name, filtered["parent_field"]["name"]) self.assertEqual(5, len(filtered["parent_field"]["favorite"])) self.assertTrue("pk" in filtered["parent_field"]["favorite"]) self.assertTrue("name" in filtered["parent_field"]["favorite"]) self.assertTrue("test" in filtered["parent_field"]["favorite"]) self.assertEqual(3, len(filtered["parent_field"]["favorite"]["test"])) self.assertTrue("parent" in filtered["parent_field"]["favorite"]) self.assertEqual(self.p1c1.name, filtered["parent_field"]["favorite"]["name"]) self.assertEqual(2, len(filtered["parent_field"]["children"])) for child in filtered["parent_field"]["children"]: self.assertEqual(5, len(child)) self.assertTrue("pk" in child) self.assertTrue("name" in child) self.assertTrue("test" in child) self.assertEqual(1, len(child["test"])) self.assertTrue("parent" in child) self.assertEqual(1, len(child["parent"]))
def test_expandable_field_not_expanded_by_default(self): filtered = filtering.apply_filters_to_object(self.root, filters.DEFAULT_FILTERS) self.assertEqual(4, len(filtered)) self.assertTrue("parent_field" in filtered) self.assertEqual(1, len(filtered["parent_field"])) self.assertEqual( self.p1.nonstandard_id, filtered["parent_field"]["nonstandard_id"] )
def test_filter_large_collection(self): data = [EndpointFilteringTestCase.DummyClassFour() for _ in range(1000)] filtered_data = filtering.apply_filters_to_object( data, EndpointFilteringTestCase.TEST_FILTERS ) self.assertEqual(1000, len(filtered_data)) self.assertFalse("course" in filtered_data[0]) self.assertTrue("when" in filtered_data[0]) self.assertEqual(10, filtered_data[0]["a_number"]) self.assertEqual("BLAH" * 100, filtered_data[0]["blah"])
def test_rename_expandable_foreign_key(self): filtered = filtering.apply_filters_to_object( self.p1c1, filters.RENAMED_EXPANDABLE_MODEL_FIELDS ) self.assertEqual(filtered["renamed_test"], {"id": self.p1c1.test.pk}) self.assertEqual( filtered["renamed_parent"], {"nonstandard_id": self.p1c1.parent.pk} ) filtered = filtering.apply_filters_to_object( self.p1c1, filters.RENAMED_EXPANDABLE_MODEL_FIELDS, expand_header="renamed_test,renamed_parent", ) self.assertTrue(2, len(filtered["renamed_test"])) self.assertIn("int_field", filtered["renamed_test"]) self.assertNotIn("renamed_expandable_dict", filtered["renamed_test"]) self.assertTrue(4, len(filtered["renamed_parent"])) filtered = filtering.apply_filters_to_object( self.p1c1, filters.RENAMED_EXPANDABLE_MODEL_FIELDS, expand_header="renamed_test,renamed_test.renamed_expandable_dict", ) self.assertTrue(3, len(filtered["renamed_test"])) self.assertIn("renamed_expandable_dict", filtered["renamed_test"]) self.assertEqual( self.test_model.expandable_dict, filtered["renamed_test"]["renamed_expandable_dict"], ) self.assertNotIn("renamed_expandable_string", filtered["renamed_test"]) filtered = filtering.apply_filters_to_object( self.p1c1, filters.RENAMED_EXPANDABLE_MODEL_FIELDS, expand_header="renamed_test,renamed_test.renamed_expandable_dict,renamed_test.renamed_expandable_string", ) self.assertTrue(4, len(filtered["renamed_test"])) self.assertIn("renamed_expandable_dict", filtered["renamed_test"]) self.assertIn("renamed_expandable_string", filtered["renamed_test"])
def test_expandable_absent_if_no_expandable_fields(self): filtered = filtering.apply_filters_to_object( self.test_model, filters.DEFAULT_FILTERS_NO_EXPANDABLE ) self.assertEqual(4, len(filtered)) self.assertTrue("expandable_dict" in filtered) self.assertEqual( filtered["expandable_dict"], models.TestModel.EXPANDABLE_DICT_RETURN ) self.assertTrue("expandable_string" in filtered) self.assertEqual( filtered["expandable_string"], models.TestModel.EXPANDABLE_STRING_RETURN )
def test_expandable_properties(self): filtered = filtering.apply_filters_to_object( self.test_model, filters.DEFAULT_FILTERS, expand_header="expandable_dict,expandable_string", ) self.assertEqual(5, len(filtered)) self.assertTrue("expandable_dict" in filtered) self.assertEqual( filtered["expandable_dict"], models.TestModel.EXPANDABLE_DICT_RETURN ) self.assertTrue("expandable_string" in filtered) self.assertEqual( filtered["expandable_string"], models.TestModel.EXPANDABLE_STRING_RETURN ) self.assertTrue("__expandable__" in filtered) self.assertTrue("expandable_dict" in filtered["__expandable__"]) self.assertTrue("expandable_string" in filtered["__expandable__"]) with mock.patch( "tests.models.TestModel.expandable_dict" ) as dict_mock, mock.patch( "tests.models.TestModel.expandable_string" ) as str_mock: filtered = filtering.apply_filters_to_object( self.test_model, filters.DEFAULT_FILTERS ) self.assertEqual(3, len(filtered)) self.assertFalse("expandable_dict" in filtered) dict_mock.assert_not_called() self.assertFalse("expandable_string" in filtered) str_mock.assert_not_called() self.assertTrue("__expandable__" in filtered) self.assertTrue("expandable_dict" in filtered["__expandable__"]) self.assertTrue("expandable_string" in filtered["__expandable__"])
def test_expand_single_level(self): filtered = filtering.apply_filters_to_object( self.root, filters.DEFAULT_FILTERS, expand_header="parent_field" ) self.assertEqual(4, len(filtered)) self.assertTrue("parent_field" in filtered) self.assertEqual(5, len(filtered["parent_field"])) self.assertEqual( self.p1.nonstandard_id, filtered["parent_field"]["nonstandard_id"] ) self.assertEqual(self.p1.name, filtered["parent_field"]["name"]) self.assertEqual(self.p1c1.name, filtered["parent_field"]["favorite"]["name"]) self.assertEqual(2, len(filtered["parent_field"]["children"])) for child in filtered["parent_field"]["children"]: self.assertEqual(1, len(child)) self.assertTrue("name" in child)
def get_response(self): error = self.binding_exc_info or self.validation_exc_info if error: exc_type, exc_value, exc_traceback = error if isinstance(exc_value, errors.ClientError): logger.warning(exc_value.error_message) else: logger.error( str(exc_value.args) + "\n" + str(exc_traceback)) raise exc_value.with_traceback(exc_traceback) resource = self.bound_endpoint.resource if hasattr(resource, "is_dirty"): if resource and resource.is_dirty(check_relationship=True): resource.save() endpoint_tasks = sorted(self.manager.endpoint_tasks, key=lambda t: t.priority) immediate_tasks = filter( lambda t: not isinstance(t, DeferrableEndpointTask), endpoint_tasks) deferred_tasks = filter( lambda t: isinstance(t, DeferrableEndpointTask), endpoint_tasks) try: for immediate_task in immediate_tasks: immediate_task.run(self.bound_endpoint) except errors.ClientError as ce: if ce.save_changes and resource and resource.is_dirty(): resource.save() raise if hasattr(resource, "is_dirty"): if resource and resource.is_dirty(check_relationship=True): resource.save() for deferred_task in deferred_tasks: deferred_task.run(self.bound_endpoint) if getattr(resource, "_api_filter", False): filter_def = resource._api_filter else: filter_def = self.bound_endpoint.response_filter data = self.bound_endpoint.response status_code = self.bound_endpoint.http_status if isinstance(data, HttpResponse): if 200 <= status_code <= 299: return status_code, data else: raise HttpStatusCode(data) else: return ( status_code, apply_filters_to_object( data, filter_def, self.bound_endpoint.request.META.get("HTTP_X_EXPAND"), ), )