2018-11-11 10:51:22 +01:00
|
|
|
from falcon import testing
|
|
|
|
import json
|
|
|
|
import pytest
|
2020-10-06 15:26:44 +02:00
|
|
|
from unittest.mock import patch
|
2018-11-11 10:51:22 +01:00
|
|
|
|
|
|
|
from dspace_statistics_api.app import api
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def client():
|
|
|
|
return testing.TestClient(api)
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_docs(client):
|
2019-12-14 11:39:58 +01:00
|
|
|
"""Test requesting the documentation at the root."""
|
2018-11-11 10:51:22 +01:00
|
|
|
|
2019-12-14 11:39:58 +01:00
|
|
|
response = client.simulate_get("/")
|
2018-11-11 10:51:22 +01:00
|
|
|
|
|
|
|
assert isinstance(response.content, bytes)
|
|
|
|
assert response.status_code == 200
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_item(client):
|
2019-12-14 11:39:58 +01:00
|
|
|
"""Test requesting a single item."""
|
2018-11-11 10:51:22 +01:00
|
|
|
|
2020-03-02 10:10:41 +01:00
|
|
|
response = client.simulate_get("/item/c3910974-c3a5-4053-9dce-104aa7bb1621")
|
2018-11-11 16:01:17 +01:00
|
|
|
response_doc = json.loads(response.text)
|
2018-11-11 10:51:22 +01:00
|
|
|
|
2019-12-14 11:39:58 +01:00
|
|
|
assert isinstance(response_doc["downloads"], int)
|
2020-03-02 10:10:41 +01:00
|
|
|
assert isinstance(response_doc["id"], str)
|
2019-12-14 11:39:58 +01:00
|
|
|
assert isinstance(response_doc["views"], int)
|
2018-11-11 10:51:22 +01:00
|
|
|
assert response.status_code == 200
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_missing_item(client):
|
2019-12-14 11:39:58 +01:00
|
|
|
"""Test requesting a single non-existing item."""
|
2018-11-11 10:51:22 +01:00
|
|
|
|
2020-03-02 10:10:41 +01:00
|
|
|
response = client.simulate_get("/item/c3910974-c3a5-4053-9dce-104aa7bb1620")
|
2018-11-11 10:51:22 +01:00
|
|
|
|
|
|
|
assert response.status_code == 404
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_items(client):
|
2019-12-14 11:39:58 +01:00
|
|
|
"""Test requesting 100 items."""
|
2018-11-11 10:51:22 +01:00
|
|
|
|
2019-12-14 11:39:58 +01:00
|
|
|
response = client.simulate_get("/items", query_string="limit=100")
|
2018-11-11 16:05:31 +01:00
|
|
|
response_doc = json.loads(response.text)
|
2018-11-11 10:51:22 +01:00
|
|
|
|
2019-12-14 11:39:58 +01:00
|
|
|
assert isinstance(response_doc["currentPage"], int)
|
|
|
|
assert isinstance(response_doc["totalPages"], int)
|
|
|
|
assert isinstance(response_doc["statistics"], list)
|
2018-11-11 10:51:22 +01:00
|
|
|
assert response.status_code == 200
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_items_invalid_limit(client):
|
2019-12-14 11:39:58 +01:00
|
|
|
"""Test requesting 100 items with an invalid limit parameter."""
|
2018-11-11 10:51:22 +01:00
|
|
|
|
2019-12-14 11:39:58 +01:00
|
|
|
response = client.simulate_get("/items", query_string="limit=101")
|
2018-11-11 10:51:22 +01:00
|
|
|
|
|
|
|
assert response.status_code == 400
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_items_invalid_page(client):
|
2019-12-14 11:39:58 +01:00
|
|
|
"""Test requesting 100 items with an invalid page parameter."""
|
2018-11-11 10:51:22 +01:00
|
|
|
|
2019-12-14 11:39:58 +01:00
|
|
|
response = client.simulate_get("/items", query_string="page=-1")
|
2018-11-11 10:51:22 +01:00
|
|
|
|
|
|
|
assert response.status_code == 400
|
2020-10-06 15:26:44 +02:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.xfail
|
|
|
|
def test_post_items_valid_dateFrom(client):
|
|
|
|
"""Test POSTing a request with a valid dateFrom parameter in the request body."""
|
|
|
|
|
|
|
|
request_body = {
|
|
|
|
"dateFrom": "2020-01-01T00:00:00Z",
|
|
|
|
"items": [
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620",
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313",
|
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
response = client.simulate_post("/items", json=request_body)
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert response.json["limit"] == 100
|
|
|
|
assert response.json["currentPage"] == 0
|
|
|
|
assert isinstance(response.json["totalPages"], int)
|
|
|
|
assert len(response.json["statistics"]) == 2
|
|
|
|
assert isinstance(response.json["statistics"][0]["views"], int)
|
|
|
|
assert isinstance(response.json["statistics"][0]["downloads"], int)
|
|
|
|
assert isinstance(response.json["statistics"][1]["views"], int)
|
|
|
|
assert isinstance(response.json["statistics"][1]["downloads"], int)
|
|
|
|
|
|
|
|
|
|
|
|
def test_post_items_valid_dateFrom_mocked(client):
|
|
|
|
"""Mock test POSTing a request with a valid dateFrom parameter in the request body."""
|
|
|
|
|
|
|
|
request_body = {
|
|
|
|
"dateFrom": "2020-01-01T00:00:00Z",
|
|
|
|
"items": [
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620",
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313",
|
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
get_views_return_value = {
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620": 21,
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313": 0,
|
|
|
|
}
|
|
|
|
get_downloads_return_value = {
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620": 575,
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313": 899,
|
|
|
|
}
|
|
|
|
|
|
|
|
with patch(
|
|
|
|
"dspace_statistics_api.app.get_views", return_value=get_views_return_value
|
|
|
|
):
|
|
|
|
with patch(
|
|
|
|
"dspace_statistics_api.app.get_downloads",
|
|
|
|
return_value=get_downloads_return_value,
|
|
|
|
):
|
|
|
|
response = client.simulate_post("/items", json=request_body)
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert response.json["limit"] == 100
|
|
|
|
assert response.json["currentPage"] == 0
|
|
|
|
assert isinstance(response.json["totalPages"], int)
|
|
|
|
assert len(response.json["statistics"]) == 2
|
|
|
|
assert isinstance(response.json["statistics"][0]["views"], int)
|
|
|
|
assert isinstance(response.json["statistics"][0]["downloads"], int)
|
|
|
|
assert isinstance(response.json["statistics"][1]["views"], int)
|
|
|
|
assert isinstance(response.json["statistics"][1]["downloads"], int)
|
|
|
|
|
|
|
|
|
|
|
|
def test_post_items_invalid_dateFrom(client):
|
|
|
|
"""Test POSTing a request with an invalid dateFrom parameter in the request body."""
|
|
|
|
|
|
|
|
request_body = {
|
|
|
|
"dateFrom": "2020-01-01T00:00:00",
|
|
|
|
"items": [
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620",
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313",
|
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
response = client.simulate_post("/items", json=request_body)
|
|
|
|
|
|
|
|
assert response.status_code == 400
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.xfail
|
|
|
|
def test_post_items_valid_dateTo(client):
|
|
|
|
"""Test POSTing a request with a valid dateTo parameter in the request body."""
|
|
|
|
|
|
|
|
request_body = {
|
|
|
|
"dateTo": "2020-01-01T00:00:00Z",
|
|
|
|
"items": [
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620",
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313",
|
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
response = client.simulate_post("/items", json=request_body)
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert response.json["limit"] == 100
|
|
|
|
assert response.json["currentPage"] == 0
|
|
|
|
assert isinstance(response.json["totalPages"], int)
|
|
|
|
assert len(response.json["statistics"]) == 2
|
|
|
|
assert isinstance(response.json["statistics"][0]["views"], int)
|
|
|
|
assert isinstance(response.json["statistics"][0]["downloads"], int)
|
|
|
|
assert isinstance(response.json["statistics"][1]["views"], int)
|
|
|
|
assert isinstance(response.json["statistics"][1]["downloads"], int)
|
|
|
|
|
|
|
|
|
|
|
|
def test_post_items_valid_dateTo_mocked(client):
|
|
|
|
"""Mock test POSTing a request with a valid dateTo parameter in the request body."""
|
|
|
|
|
|
|
|
request_body = {
|
|
|
|
"dateTo": "2020-01-01T00:00:00Z",
|
|
|
|
"items": [
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620",
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313",
|
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
get_views_return_value = {
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620": 21,
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313": 0,
|
|
|
|
}
|
|
|
|
get_downloads_return_value = {
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620": 575,
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313": 899,
|
|
|
|
}
|
|
|
|
|
|
|
|
with patch(
|
|
|
|
"dspace_statistics_api.app.get_views", return_value=get_views_return_value
|
|
|
|
):
|
|
|
|
with patch(
|
|
|
|
"dspace_statistics_api.app.get_downloads",
|
|
|
|
return_value=get_downloads_return_value,
|
|
|
|
):
|
|
|
|
response = client.simulate_post("/items", json=request_body)
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert response.json["limit"] == 100
|
|
|
|
assert response.json["currentPage"] == 0
|
|
|
|
assert isinstance(response.json["totalPages"], int)
|
|
|
|
assert len(response.json["statistics"]) == 2
|
|
|
|
assert isinstance(response.json["statistics"][0]["views"], int)
|
|
|
|
assert isinstance(response.json["statistics"][0]["downloads"], int)
|
|
|
|
assert isinstance(response.json["statistics"][1]["views"], int)
|
|
|
|
assert isinstance(response.json["statistics"][1]["downloads"], int)
|
|
|
|
|
|
|
|
|
|
|
|
def test_post_items_invalid_dateTo(client):
|
|
|
|
"""Test POSTing a request with an invalid dateTo parameter in the request body."""
|
|
|
|
|
|
|
|
request_body = {
|
|
|
|
"dateFrom": "2020-01-01T00:00:00",
|
|
|
|
"items": [
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620",
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313",
|
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
response = client.simulate_post("/items", json=request_body)
|
|
|
|
|
|
|
|
assert response.status_code == 400
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.xfail
|
|
|
|
def test_post_items_valid_limit(client):
|
|
|
|
"""Test POSTing a request with a valid limit parameter in the request body."""
|
|
|
|
|
|
|
|
request_body = {
|
|
|
|
"limit": 1,
|
|
|
|
"items": [
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620",
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313",
|
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
response = client.simulate_post("/items", json=request_body)
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert response.json["limit"] == 1
|
|
|
|
assert response.json["currentPage"] == 0
|
|
|
|
assert isinstance(response.json["totalPages"], int)
|
|
|
|
assert len(response.json["statistics"]) == 1
|
|
|
|
assert isinstance(response.json["statistics"][0]["views"], int)
|
|
|
|
assert isinstance(response.json["statistics"][0]["downloads"], int)
|
|
|
|
|
|
|
|
|
|
|
|
def test_post_items_valid_limit_mocked(client):
|
|
|
|
"""Mock test POSTing a request with a valid limit parameter in the request body."""
|
|
|
|
|
|
|
|
request_body = {
|
|
|
|
"limit": 1,
|
|
|
|
"items": [
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620",
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313",
|
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
get_views_return_value = {"c3910974-c3a5-4053-9dce-104aa7bb1620": 21}
|
|
|
|
get_downloads_return_value = {"c3910974-c3a5-4053-9dce-104aa7bb1620": 575}
|
|
|
|
|
|
|
|
with patch(
|
|
|
|
"dspace_statistics_api.app.get_views", return_value=get_views_return_value
|
|
|
|
):
|
|
|
|
with patch(
|
|
|
|
"dspace_statistics_api.app.get_downloads",
|
|
|
|
return_value=get_downloads_return_value,
|
|
|
|
):
|
|
|
|
response = client.simulate_post("/items", json=request_body)
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert response.json["limit"] == 1
|
|
|
|
assert response.json["currentPage"] == 0
|
|
|
|
assert isinstance(response.json["totalPages"], int)
|
|
|
|
assert len(response.json["statistics"]) == 1
|
|
|
|
assert isinstance(response.json["statistics"][0]["views"], int)
|
|
|
|
assert isinstance(response.json["statistics"][0]["downloads"], int)
|
|
|
|
|
|
|
|
|
|
|
|
def test_post_items_invalid_limit(client):
|
|
|
|
"""Test POSTing a request with an invalid limit parameter in the request body."""
|
|
|
|
|
|
|
|
request_body = {
|
|
|
|
"limit": -1,
|
|
|
|
"items": [
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620",
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313",
|
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
response = client.simulate_post("/items", json=request_body)
|
|
|
|
|
|
|
|
assert response.status_code == 400
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.xfail
|
|
|
|
def test_post_items_valid_page(client):
|
|
|
|
"""Test POSTing a request with a valid page parameter in the request body."""
|
|
|
|
|
|
|
|
request_body = {
|
|
|
|
"page": 0,
|
|
|
|
"items": [
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620",
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313",
|
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
response = client.simulate_post("/items", json=request_body)
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert response.json["limit"] == 100
|
|
|
|
assert response.json["currentPage"] == 0
|
|
|
|
assert response.json["totalPages"] == 0
|
|
|
|
assert len(response.json["statistics"]) == 2
|
|
|
|
assert isinstance(response.json["statistics"][0]["views"], int)
|
|
|
|
assert isinstance(response.json["statistics"][0]["downloads"], int)
|
|
|
|
assert isinstance(response.json["statistics"][1]["views"], int)
|
|
|
|
assert isinstance(response.json["statistics"][1]["downloads"], int)
|
|
|
|
|
|
|
|
|
|
|
|
def test_post_items_valid_page_mocked(client):
|
|
|
|
"""Mock test POSTing a request with a valid page parameter in the request body."""
|
|
|
|
|
|
|
|
request_body = {
|
|
|
|
"page": 0,
|
|
|
|
"items": [
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620",
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313",
|
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
get_views_return_value = {
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620": 21,
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313": 0,
|
|
|
|
}
|
|
|
|
get_downloads_return_value = {
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620": 575,
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313": 899,
|
|
|
|
}
|
|
|
|
|
|
|
|
with patch(
|
|
|
|
"dspace_statistics_api.app.get_views", return_value=get_views_return_value
|
|
|
|
):
|
|
|
|
with patch(
|
|
|
|
"dspace_statistics_api.app.get_downloads",
|
|
|
|
return_value=get_downloads_return_value,
|
|
|
|
):
|
|
|
|
response = client.simulate_post("/items", json=request_body)
|
|
|
|
|
|
|
|
assert response.status_code == 200
|
|
|
|
assert response.json["limit"] == 100
|
|
|
|
assert response.json["currentPage"] == 0
|
|
|
|
assert isinstance(response.json["totalPages"], int)
|
|
|
|
assert len(response.json["statistics"]) == 2
|
|
|
|
assert isinstance(response.json["statistics"][0]["views"], int)
|
|
|
|
assert isinstance(response.json["statistics"][0]["downloads"], int)
|
|
|
|
assert isinstance(response.json["statistics"][1]["views"], int)
|
|
|
|
assert isinstance(response.json["statistics"][1]["downloads"], int)
|
|
|
|
|
|
|
|
|
|
|
|
def test_post_items_invalid_page(client):
|
|
|
|
"""Test POSTing a request with an invalid page parameter in the request body."""
|
|
|
|
|
|
|
|
request_body = {
|
|
|
|
"page": -1,
|
|
|
|
"items": [
|
|
|
|
"c3910974-c3a5-4053-9dce-104aa7bb1620",
|
|
|
|
"887cc5f8-b5e7-4a2f-9053-49c91ab81313",
|
|
|
|
],
|
|
|
|
}
|
|
|
|
|
|
|
|
response = client.simulate_post("/items", json=request_body)
|
|
|
|
|
|
|
|
assert response.status_code == 400
|