|
2 | 2 | from urllib.error import HTTPError |
3 | 3 |
|
4 | 4 | import pytest |
| 5 | +from flask import Response |
5 | 6 | from werkzeug.datastructures import MultiDict |
| 7 | +from werkzeug.exceptions import NotFound |
6 | 8 |
|
7 | 9 | from app import create_app |
8 | 10 | from app.modules.dataset.services import ( |
@@ -68,6 +70,77 @@ def test_subdomain_index_not_found(test_client): |
68 | 70 | assert response.status_code == 404 |
69 | 71 |
|
70 | 72 |
|
| 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 | + |
71 | 144 | def _mock_dataset_for_edit(): |
72 | 145 | dataset = MagicMock() |
73 | 146 | dataset.ds_meta_data = MagicMock() |
|
0 commit comments