diff --git a/optimade/validator/validator.py b/optimade/validator/validator.py index 055458a14a..2ae9e8de5a 100644 --- a/optimade/validator/validator.py +++ b/optimade/validator/validator.py @@ -34,6 +34,15 @@ LINKS_ENDPOINT = "links" REQUIRED_ENTRY_ENDPOINTS = ["references", "structures"] +ENDPOINT_MANDATORY_QUERIES = { + "structures": [ + 'elements HAS "Na"', + 'elements HAS ANY "Na","Cl"', + 'elements HAS ALL "Na","Cl"', + ], + "references": [], +} + RESPONSE_CLASSES = { "references": ValidatorReferenceResponseMany, "references/": ValidatorReferenceResponseOne, @@ -317,6 +326,12 @@ def main(self): self._log.debug("Testing single entry request of type %s", endp) self.test_single_entry_endpoint(endp) + for endp in ENDPOINT_MANDATORY_QUERIES: + # skip empty endpoint query lists + if ENDPOINT_MANDATORY_QUERIES[endp]: + self._log.debug("Testing mandatory query syntax on endpoint %s", endp) + self.test_mandatory_query_syntax(endp, ENDPOINT_MANDATORY_QUERIES[endp]) + self._log.debug("Testing %s endpoint", LINKS_ENDPOINT) self.test_info_or_links_endpoints(LINKS_ENDPOINT) @@ -491,3 +506,18 @@ def get_endpoint(self, request_str): f"Request to '{request_str}' returned HTTP code: {response.status_code}" ) return response, "request successful." + + def test_mandatory_query_syntax(self, endpoint, endpoint_queries): + """ Perform a list of valid queries and assert that no errors are raised. + + Parameters: + endpoint (str): the endpoint to query (e.g. "structures"). + endpoint_queries (list): the list of valid mandatory queries + for that endpoint, where the queries do not include the + "?filter=" prefix, e.g. ['elements HAS "Na"']. + + """ + + valid_queries = [f"{endpoint}?filter={query}" for query in endpoint_queries] + for query in valid_queries: + self.get_endpoint(query)