Skip to content

Commit fb31953

Browse files
feat: tests for qr - closes #92
1 parent b682ff6 commit fb31953

File tree

1 file changed

+73
-0
lines changed

1 file changed

+73
-0
lines changed

app/modules/dataset/tests/test_unit.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
from urllib.error import HTTPError
33

44
import pytest
5+
from flask import Response
56
from werkzeug.datastructures import MultiDict
7+
from werkzeug.exceptions import NotFound
68

79
from app import create_app
810
from app.modules.dataset.services import (
@@ -68,6 +70,77 @@ def test_subdomain_index_not_found(test_client):
6870
assert response.status_code == 404
6971

7072

73+
def _mock_dataset_for_qr(dataset_id=1, doi="10.1234/test-doi"):
74+
dataset = MagicMock()
75+
dataset.id = dataset_id
76+
dataset.ds_meta_data = MagicMock()
77+
dataset.ds_meta_data.dataset_doi = doi
78+
return dataset
79+
80+
81+
def test_dataset_qr_by_id_success():
82+
pytest.importorskip("qrcode")
83+
dataset_routes = __import__("app.modules.dataset.routes", fromlist=["routes"])
84+
app = create_app("testing")
85+
with (
86+
patch("app.modules.dataset.routes.dataset_service.get_or_404") as mock_get_or_404,
87+
patch("app.modules.dataset.routes._build_dataset_qr_response") as mock_build_qr,
88+
):
89+
mock_get_or_404.return_value = _mock_dataset_for_qr(dataset_id=7, doi="10.1234/dataset7")
90+
mock_build_qr.return_value = Response(b"qr-image", mimetype="image/png", status=200)
91+
with app.test_request_context("/datasets/7/qr"):
92+
response = dataset_routes.dataset_qr_by_id(7)
93+
94+
assert response.status_code == 200
95+
assert response.mimetype == "image/png"
96+
assert response.data == b"qr-image"
97+
mock_get_or_404.assert_called_once_with(7)
98+
mock_build_qr.assert_called_once()
99+
100+
101+
def test_dataset_qr_by_id_without_doi_returns_404():
102+
pytest.importorskip("qrcode")
103+
dataset_routes = __import__("app.modules.dataset.routes", fromlist=["routes"])
104+
app = create_app("testing")
105+
with patch("app.modules.dataset.routes.dataset_service.get_or_404") as mock_get_or_404:
106+
mock_get_or_404.return_value = _mock_dataset_for_qr(dataset_id=8, doi=None)
107+
with app.test_request_context("/datasets/8/qr"):
108+
with pytest.raises(NotFound):
109+
dataset_routes.dataset_qr_by_id(8)
110+
111+
112+
def test_dataset_qr_by_doi_success():
113+
pytest.importorskip("qrcode")
114+
dataset_routes = __import__("app.modules.dataset.routes", fromlist=["routes"])
115+
app = create_app("testing")
116+
dataset = _mock_dataset_for_qr(dataset_id=9, doi="10.1234/dataset9")
117+
with (
118+
patch("app.modules.dataset.routes.dsmetadata_service.filter_by_doi") as mock_filter_by_doi,
119+
patch("app.modules.dataset.routes._build_dataset_qr_response") as mock_build_qr,
120+
):
121+
mock_filter_by_doi.return_value = MagicMock(dataset=dataset)
122+
mock_build_qr.return_value = Response(b"qr-image", mimetype="image/png", status=200)
123+
with app.test_request_context("/doi/10.1234/dataset9/qr"):
124+
response = dataset_routes.dataset_qr_by_doi("10.1234/dataset9")
125+
126+
assert response.status_code == 200
127+
assert response.mimetype == "image/png"
128+
assert response.data == b"qr-image"
129+
mock_filter_by_doi.assert_called_once_with("10.1234/dataset9")
130+
mock_build_qr.assert_called_once_with(dataset)
131+
132+
133+
def test_dataset_qr_by_doi_not_found_returns_404():
134+
pytest.importorskip("qrcode")
135+
dataset_routes = __import__("app.modules.dataset.routes", fromlist=["routes"])
136+
app = create_app("testing")
137+
with patch("app.modules.dataset.routes.dsmetadata_service.filter_by_doi") as mock_filter_by_doi:
138+
mock_filter_by_doi.return_value = None
139+
with app.test_request_context("/doi/10.1234/non-existent/qr"):
140+
with pytest.raises(NotFound):
141+
dataset_routes.dataset_qr_by_doi("10.1234/non-existent")
142+
143+
71144
def _mock_dataset_for_edit():
72145
dataset = MagicMock()
73146
dataset.ds_meta_data = MagicMock()

0 commit comments

Comments
 (0)