diff --git a/.gitignore b/.gitignore index a49ab451..2341741c 100644 --- a/.gitignore +++ b/.gitignore @@ -43,6 +43,9 @@ coverage.xml # VirtualEnv .venv/ +venv/ + + # Developers *.sw* @@ -51,3 +54,7 @@ manage.py # example database drf_example + +pytest.ini + + diff --git a/example/tests/integration/test_includes.py b/example/tests/integration/test_includes.py index d32ff7e3..e39d2fec 100644 --- a/example/tests/integration/test_includes.py +++ b/example/tests/integration/test_includes.py @@ -36,7 +36,9 @@ def test_missing_field_not_included(author_bio_factory, author_factory, client): # First author does not have a bio author = author_factory(bio=None) response = client.get(reverse("author-detail", args=[author.pk]) + "?include=bio") - assert "included" not in response.json() + content = response.json() + assert "included" in content + assert content["included"] == [] # Second author does author = author_factory() response = client.get(reverse("author-detail", args=[author.pk]) + "?include=bio") @@ -204,3 +206,24 @@ def test_meta_object_added_to_included_resources(single_entry, client): ) assert response.json()["included"][0].get("meta") assert response.json()["included"][1].get("meta") + + +def test_included_empty_array_when_requested(client, author_factory): + author = author_factory(bio=None) # explicitly ensure no related bio + url = reverse("author-detail", args=[author.pk]) + "?include=bio" + response = client.get(url) + assert response.status_code == 200 + + content = response.json() + assert "included" in content + assert content["included"] == [] + + +def test_included_absent_when_not_requested(client, author_factory): + # Create an author (bio can be None or default, doesn't matter here) + author = author_factory(bio=None) + url = reverse("author-detail", args=[author.pk]) + response = client.get(url) + assert response.status_code == 200 + content = response.json() + assert "included" not in content diff --git a/rest_framework_json_api/renderers.py b/rest_framework_json_api/renderers.py index b670338f..e0047cbb 100644 --- a/rest_framework_json_api/renderers.py +++ b/rest_framework_json_api/renderers.py @@ -659,6 +659,10 @@ def render(self, data, accepted_media_type=None, renderer_context=None): render_data["included"].append( included_cache[included_type][included_id] ) + else: + request = renderer_context.get("request") + if request and "include" in request.query_params: + render_data["included"] = [] if json_api_meta: render_data["meta"] = format_field_names(json_api_meta) diff --git a/setup.cfg b/setup.cfg index 92606700..6b6385f9 100644 --- a/setup.cfg +++ b/setup.cfg @@ -20,8 +20,9 @@ exclude = build/lib, .eggs .tox, - env - .venv + env, + .venv, + venv [isort] multi_line_output = 3 diff --git a/tox.ini b/tox.ini index 8dd0e759..3d8b56a7 100644 --- a/tox.ini +++ b/tox.ini @@ -47,3 +47,6 @@ deps = -rrequirements/requirements-documentation.txt commands = sphinx-build -W -b html -d docs/_build/doctrees docs docs/_build/html + + +