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)
Exemple #9
0
        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"),
                    ),
                )