From 5744ae9f5e6ecc6721f784deeedc57e8f095f841 Mon Sep 17 00:00:00 2001 From: Casper Welzel Andersen Date: Wed, 3 Jun 2020 00:15:10 +0200 Subject: [PATCH] Test sorting --- .../test_filter.py} | 1 - tests/server/query_params/test_sort.py | 120 ++++++++++++++++++ 2 files changed, 120 insertions(+), 1 deletion(-) rename tests/server/{test_query_params.py => query_params/test_filter.py} (99%) create mode 100644 tests/server/query_params/test_sort.py diff --git a/tests/server/test_query_params.py b/tests/server/query_params/test_filter.py similarity index 99% rename from tests/server/test_query_params.py rename to tests/server/query_params/test_filter.py index 16b64e26..01ccc015 100644 --- a/tests/server/test_query_params.py +++ b/tests/server/query_params/test_filter.py @@ -4,7 +4,6 @@ from optimade.server.config import CONFIG -# Filter @pytest.mark.skip( "Un-skip when a fix for optimade-python-tools issue #102 is in place." ) diff --git a/tests/server/query_params/test_sort.py b/tests/server/query_params/test_sort.py new file mode 100644 index 00000000..a724c189 --- /dev/null +++ b/tests/server/query_params/test_sort.py @@ -0,0 +1,120 @@ +from datetime import datetime +from aiida import orm + + +def fmt_datetime(object_: datetime) -> str: + """Parse datetime into pydantic's JSON encoded datetime string""" + as_string = object_.strftime("%Y-%m-%dT%H:%M:%S.%f%z") + return f"{as_string[:-2]}:{as_string[-2:]}" + + +def test_int_asc(get_good_response): + """Ascending sort (integer)""" + limit = 5 + + request = f"/structures?sort=nelements&page_limit={limit}" + builder = ( + orm.QueryBuilder(limit=5) + .append(orm.StructureData, project="extras.optimade.nelements") + .order_by( + { + orm.StructureData: [ + {"extras.optimade.nelements": {"order": "asc", "cast": "i"}} + ] + } + ) + ) + expected_nelements = [nelement for nelement, in builder.all()] + + response = get_good_response(request, page_limit=limit) + nelements_list = [ + struct.get("attributes", {}).get("nelements") for struct in response["data"] + ] + assert nelements_list == expected_nelements + + +def test_int_desc(get_good_response): + """Descending sort (integer)""" + limit = 5 + + request = f"/structures?sort=-nelements&page_limit={limit}" + builder = ( + orm.QueryBuilder(limit=limit) + .append(orm.StructureData, project="extras.optimade.nelements") + .order_by( + { + orm.StructureData: [ + {"extras.optimade.nelements": {"order": "desc", "cast": "i"}} + ] + } + ) + ) + expected_nelements = [nelement for nelement, in builder.all()] + + response = get_good_response(request, page_limit=limit) + nelements_list = [ + struct.get("attributes", {}).get("nelements") for struct in response["data"] + ] + assert nelements_list == expected_nelements + + +def test_str_asc(check_response): + """Ascending sort (string)""" + request = "/structures?sort=immutable_id&page_limit=5" + builder = ( + orm.QueryBuilder() + .append(orm.StructureData, project="id") + .order_by({orm.StructureData: [{"uuid": {"order": "asc", "cast": "t"}}]}) + ) + expected_ids = [str(id_) for id_, in builder.all()] + check_response(request=request, expected_id=expected_ids, page_limit=5) + + +def test_str_desc(check_response): + """Descending sort (string)""" + request = "/structures?sort=-immutable_id&page_limit=5" + builder = ( + orm.QueryBuilder() + .append(orm.StructureData, project="id") + .order_by({orm.StructureData: [{"uuid": {"order": "desc", "cast": "t"}}]}) + ) + expected_ids = [str(id_) for id_, in builder.all()] + check_response(request=request, expected_id=expected_ids, page_limit=5) + + +def test_datetime_asc(get_good_response): + """Ascending sort (datetime)""" + limit = 5 + + request = f"/structures?sort=last_modified&page_limit={limit}" + builder = ( + orm.QueryBuilder(limit=5) + .append(orm.StructureData, project="mtime") + .order_by({orm.StructureData: [{"mtime": {"order": "asc", "cast": "i"}}]}) + ) + expected_mtime = [fmt_datetime(mtime) for mtime, in builder.all()] + + response = get_good_response(request, page_limit=limit) + last_modified_list = [ + struct.get("attributes", {}).get("last_modified") for struct in response["data"] + ] + assert last_modified_list == expected_mtime + + +def test_datetime_desc(get_good_response): + """Descending sort (datetime)""" + limit = 5 + + request = f"/structures?sort=-last_modified&page_limit={limit}" + builder = ( + orm.QueryBuilder(limit=limit) + .append(orm.StructureData, project="mtime") + .order_by({orm.StructureData: [{"mtime": {"order": "desc", "cast": "i"}}]}) + ) + expected_mtime = [fmt_datetime(mtime) for mtime, in builder.all()] + + response = get_good_response(request, page_limit=limit) + last_modified_list = [ + struct.get("attributes", {}).get("last_modified") for struct in response["data"] + ] + assert last_modified_list == expected_mtime