From 0a7af017b4367d795299386e11f4858268379ce5 Mon Sep 17 00:00:00 2001 From: Sam Kagan <skagan@nrao.edu> Date: Wed, 12 Jun 2024 12:34:42 -0600 Subject: [PATCH] Fixed tests, refactoring them so that independent tests run indep'ly --- .../test/test_capability_request_views.py | 22 +++- .../capability/test/test_capability_views.py | 110 ++++++++++++------ 2 files changed, 90 insertions(+), 42 deletions(-) diff --git a/services/capability/test/test_capability_request_views.py b/services/capability/test/test_capability_request_views.py index 6ead542bb..6421eec63 100644 --- a/services/capability/test/test_capability_request_views.py +++ b/services/capability/test/test_capability_request_views.py @@ -23,6 +23,7 @@ The logic can be found in `capability/views/capability_request.py`. import http +import pytest from capability.views.capability_request import ( create_capability_request, delete_capability_request, @@ -210,9 +211,9 @@ def test_delete_capability_request(request_null_capability: DummyRequest): assert response.status_code == http.HTTPStatus.OK -def test_delete_capability_request_error(request_null_capability: DummyRequest): +def test_delete_capability_request_error_undeletable_request(request_null_capability: DummyRequest): """ - Tests that the delete_capability_request view correctly executes its logic + Tests that the delete_capability_request view correctly executes its logic for a request that can't be deleted :param request_null_capability: Dummy Pyramid request object set up with mocked DB access supporting the null capability @@ -224,11 +225,20 @@ def test_delete_capability_request_error(request_null_capability: DummyRequest): request_null_capability.matchdict["capability_name"] = "null" request_null_capability.capability_service.run_capability(capability_request) - response = delete_capability_request(request_null_capability) - assert response.status_code == http.HTTPStatus.BAD_REQUEST - assert isinstance(response, HTTPBadRequest) + with pytest.raises(HTTPBadRequest): + response = delete_capability_request(request_null_capability) + assert response.status_code == http.HTTPStatus.BAD_REQUEST + assert isinstance(response, HTTPBadRequest) + + +def test_delete_capability_request_error_nonexistent_request(request_null_capability: DummyRequest): + """ + Tests that the delete_capability_request view correctly executes its logic when a request does not exist - # Request does not exist + :param request_null_capability: Dummy Pyramid request object set up with mocked DB access + supporting the null capability + """ + request_null_capability.matchdict["capability_name"] = "null" request_null_capability.matchdict["request_id"] = -1 response = delete_capability_request(request_null_capability) assert response.status_code == http.HTTPStatus.PRECONDITION_FAILED diff --git a/services/capability/test/test_capability_views.py b/services/capability/test/test_capability_views.py index b6a741dac..a635db87a 100644 --- a/services/capability/test/test_capability_views.py +++ b/services/capability/test/test_capability_views.py @@ -20,11 +20,13 @@ Tests that test the view functionality of our capability REST API. The logic can be found in `capability/views/capability.py`. """ import http +from typing import Optional import pytest from pyramid.config import Configurator from pyramid.httpexceptions import ( HTTPBadRequest, + HTTPException, HTTPExpectationFailed, HTTPNotFound, HTTPPreconditionFailed, @@ -182,7 +184,22 @@ def test_edit_capability(test_config: Configurator, request_null_capability: Dum assert response_jobs_only.status_code == http.HTTPStatus.OK -def test_edit_capability_error(test_config: Configurator, request_null_capability: DummyRequest): +@pytest.mark.parametrize( + ["capability_name", "max_jobs", "response_type", "is_raised"], + [ + ("not_found", 3, HTTPPreconditionFailed, False), + ("null", None, HTTPBadRequest, False), + ("error", 3, HTTPExpectationFailed, True), + ], +) +def test_edit_capability_error( + test_config: Configurator, + request_null_capability: DummyRequest, + capability_name: str, + max_jobs: int | None, + response_type: HTTPException, + is_raised: bool, +): """ Tests that the edit_capability view correctly responds with exceptions @@ -192,23 +209,20 @@ def test_edit_capability_error(test_config: Configurator, request_null_capabilit """ from capability.views.capability import edit_capability - request_null_capability.matchdict["capability_name"] = "not_found" - request_null_capability.json_body = {"max_jobs": 3} - response_cap_not_exists = edit_capability(request_null_capability) - assert response_cap_not_exists.status_code == http.HTTPStatus.PRECONDITION_FAILED - assert type(response_cap_not_exists) is HTTPPreconditionFailed - - request_null_capability.matchdict["capability_name"] = "null" - request_null_capability.json_body = {} - response_empty = edit_capability(request_null_capability) - assert response_empty.status_code == http.HTTPStatus.BAD_REQUEST - assert type(response_empty) is HTTPBadRequest - - request_null_capability.matchdict["capability_name"] = "error" - request_null_capability.json_body = {"max_jobs": 3} - response_edit_failed = edit_capability(request_null_capability) - assert response_edit_failed.status_code == http.HTTPStatus.EXPECTATION_FAILED - assert type(response_edit_failed) is HTTPExpectationFailed + request_null_capability.matchdict["capability_name"] = capability_name + if max_jobs is not None: + request_null_capability.json_body = {"max_jobs": max_jobs} + else: + request_null_capability.json_body = {} + if is_raised: + with pytest.raises(response_type): + response = edit_capability(request_null_capability) + assert response.status_code == response_type.code + assert type(response) is response_type + else: + response = edit_capability(request_null_capability) + assert response.status_code == response_type.code + assert type(response) is response_type def test_enable_capability(test_config: Configurator, request_null_capability: DummyRequest): @@ -226,7 +240,17 @@ def test_enable_capability(test_config: Configurator, request_null_capability: D assert response.status_code == http.HTTPStatus.OK -def test_enable_capability_error(test_config: Configurator, request_null_capability: DummyRequest): +@pytest.mark.parametrize( + ["capability_name", "response_type", "is_raised"], + [("does_not_exist", HTTPPreconditionFailed, False), ("error", HTTPExpectationFailed, True)], +) +def test_enable_capability_error( + test_config: Configurator, + request_null_capability: DummyRequest, + capability_name: str, + response_type: HTTPException, + is_raised: bool, +): """ Tests that enable_capability view properly responds with HTTP exceptions given bad input @@ -236,14 +260,16 @@ def test_enable_capability_error(test_config: Configurator, request_null_capabil """ from capability.views.capability import enable_capability - request_null_capability.matchdict["capability_name"] = "does_not_exist" - response_does_not_exist = enable_capability(request_null_capability) - assert response_does_not_exist.status_code == http.HTTPStatus.PRECONDITION_FAILED - assert type(response_does_not_exist) is HTTPPreconditionFailed - request_null_capability.matchdict["capability_name"] = "error" - response_enable_failed = enable_capability(request_null_capability) - assert response_enable_failed.status_code == http.HTTPStatus.EXPECTATION_FAILED - assert type(response_enable_failed) is HTTPExpectationFailed + request_null_capability.matchdict["capability_name"] = capability_name + if is_raised: + with pytest.raises(response_type): + response_enable_failed = enable_capability(request_null_capability) + assert response_enable_failed.status_code == response_type.code + assert type(response_enable_failed) is response_type + else: + response_enable_failed = enable_capability(request_null_capability) + assert response_enable_failed.status_code == response_type.code + assert type(response_enable_failed) is response_type def test_disable_capability(test_config: Configurator, request_null_capability: DummyRequest): @@ -261,7 +287,17 @@ def test_disable_capability(test_config: Configurator, request_null_capability: assert response.status_code == http.HTTPStatus.OK -def test_disable_capability_error(test_config: Configurator, request_null_capability: DummyRequest): +@pytest.mark.parametrize( + ["capability_name", "response_type", "is_raised"], + [("does_not_exist", HTTPPreconditionFailed, False), ("error", HTTPExpectationFailed, True)], +) +def test_disable_capability_error( + test_config: Configurator, + request_null_capability: DummyRequest, + capability_name: str, + response_type: HTTPException, + is_raised: bool, +): """ Tests that disable_capability view properly responds with HTTP exceptions given bad input @@ -271,11 +307,13 @@ def test_disable_capability_error(test_config: Configurator, request_null_capabi """ from capability.views.capability import disable_capability - request_null_capability.matchdict["capability_name"] = "does_not_exist" - response_does_not_exist = disable_capability(request_null_capability) - assert response_does_not_exist.status_code == http.HTTPStatus.PRECONDITION_FAILED - assert type(response_does_not_exist) is HTTPPreconditionFailed - request_null_capability.matchdict["capability_name"] = "error" - response_disable_failed = disable_capability(request_null_capability) - assert response_disable_failed.status_code == http.HTTPStatus.EXPECTATION_FAILED - assert type(response_disable_failed) is HTTPExpectationFailed + request_null_capability.matchdict["capability_name"] = capability_name + if is_raised: + with pytest.raises(response_type): + response_enable_failed = disable_capability(request_null_capability) + assert response_enable_failed.status_code == response_type.code + assert type(response_enable_failed) is response_type + else: + response_enable_failed = disable_capability(request_null_capability) + assert response_enable_failed.status_code == response_type.code + assert type(response_enable_failed) is response_type -- GitLab