put requests workflow tests behind a feature toggle
This commit is contained in:
@@ -147,3 +147,8 @@ def extended_financial_verification_data(pdf_upload):
|
||||
def queue():
|
||||
yield atst_queue
|
||||
atst_queue.get_queue().empty()
|
||||
|
||||
|
||||
pytest.mark.requests_workflow = pytest.mark.skipif(
|
||||
not make_config().get("REQUESTS_WORKFLOW"), reason="requests workflow is deprecated"
|
||||
)
|
||||
|
@@ -21,6 +21,7 @@ def new_request(session):
|
||||
return RequestFactory.create()
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_can_get_request():
|
||||
factory_req = RequestFactory.create()
|
||||
request = Requests.get(factory_req.creator, factory_req.id)
|
||||
@@ -28,17 +29,20 @@ def test_can_get_request():
|
||||
assert request.id == factory_req.id
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_nonexistent_request_raises():
|
||||
a_user = UserFactory.build()
|
||||
with pytest.raises(NotFoundError):
|
||||
Requests.get(a_user, uuid4())
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_new_request_has_started_status():
|
||||
request = Requests.create(UserFactory.build(), {})
|
||||
assert request.status == RequestStatus.STARTED
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_auto_approve_less_than_1m():
|
||||
new_request = RequestFactory.create(initial_revision={"dollar_value": 999_999})
|
||||
request = Requests.submit(new_request)
|
||||
@@ -48,6 +52,7 @@ def test_auto_approve_less_than_1m():
|
||||
assert request.reviews[0].full_name_reviewer == "System"
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_dont_auto_approve_if_dollar_value_is_1m_or_above():
|
||||
new_request = RequestFactory.create(initial_revision={"dollar_value": 1_000_000})
|
||||
request = Requests.submit(new_request)
|
||||
@@ -55,6 +60,7 @@ def test_dont_auto_approve_if_dollar_value_is_1m_or_above():
|
||||
assert request.status == RequestStatus.PENDING_CCPO_ACCEPTANCE
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_dont_auto_approve_if_no_dollar_value_specified():
|
||||
new_request = RequestFactory.create(initial_revision={})
|
||||
request = Requests.submit(new_request)
|
||||
@@ -62,6 +68,7 @@ def test_dont_auto_approve_if_no_dollar_value_specified():
|
||||
assert request.status == RequestStatus.PENDING_CCPO_ACCEPTANCE
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_should_allow_submission():
|
||||
new_request = RequestFactory.create()
|
||||
|
||||
@@ -79,15 +86,18 @@ def test_should_allow_submission():
|
||||
assert not Requests.should_allow_submission(new_request)
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_request_knows_its_last_submission_timestamp(new_request):
|
||||
submitted_request = Requests.submit(new_request)
|
||||
assert submitted_request.last_submission_timestamp
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_request_knows_if_it_has_no_last_submission_timestamp(new_request):
|
||||
assert new_request.last_submission_timestamp is None
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_exists(session):
|
||||
user_allowed = UserFactory.create()
|
||||
user_denied = UserFactory.create()
|
||||
@@ -96,6 +106,7 @@ def test_exists(session):
|
||||
assert not Requests.exists(request.id, user_denied)
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_status_count(session):
|
||||
# make sure table is empty
|
||||
session.query(Request).delete()
|
||||
@@ -114,6 +125,7 @@ def test_status_count(session):
|
||||
assert Requests.in_progress_count() == 2
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_status_count_scoped_to_creator(session):
|
||||
# make sure table is empty
|
||||
session.query(Request).delete()
|
||||
@@ -143,12 +155,14 @@ request_financial_data = {
|
||||
}
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_set_status_sets_revision():
|
||||
request = RequestFactory.create()
|
||||
Requests.set_status(request, RequestStatus.APPROVED)
|
||||
assert request.latest_revision == request.status_events[-1].revision
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_advance_to_financial_verification():
|
||||
request = RequestFactory.create_with_status(
|
||||
status=RequestStatus.PENDING_CCPO_ACCEPTANCE
|
||||
@@ -160,6 +174,7 @@ def test_advance_to_financial_verification():
|
||||
assert current_review.fname_mao == review_data["fname_mao"]
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_advance_to_approval():
|
||||
request = RequestFactory.create_with_status(
|
||||
status=RequestStatus.PENDING_CCPO_APPROVAL
|
||||
@@ -169,6 +184,7 @@ def test_advance_to_approval():
|
||||
assert request.status == RequestStatus.APPROVED
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_request_changes_to_request_application():
|
||||
request = RequestFactory.create_with_status(
|
||||
status=RequestStatus.PENDING_CCPO_ACCEPTANCE
|
||||
@@ -180,6 +196,7 @@ def test_request_changes_to_request_application():
|
||||
assert current_review.fname_mao == review_data["fname_mao"]
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_request_changes_to_financial_verification_info():
|
||||
request = RequestFactory.create_with_status(
|
||||
status=RequestStatus.PENDING_CCPO_APPROVAL
|
||||
@@ -191,6 +208,7 @@ def test_request_changes_to_financial_verification_info():
|
||||
assert current_review.fname_mao == review_data["fname_mao"]
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_add_internal_comment():
|
||||
request = RequestFactory.create()
|
||||
ccpo = UserFactory.from_atat_role("ccpo")
|
||||
@@ -203,6 +221,7 @@ def test_add_internal_comment():
|
||||
assert request.internal_comments[0].text == "this is my comment"
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_creator_can_view_own_request():
|
||||
creator = UserFactory.create()
|
||||
request = RequestFactory.create(creator=creator)
|
||||
@@ -210,6 +229,7 @@ def test_creator_can_view_own_request():
|
||||
assert RequestsAuthorization(creator, request).can_view
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_ccpo_can_view_request():
|
||||
ccpo = UserFactory.from_atat_role("ccpo")
|
||||
request = RequestFactory.create()
|
||||
@@ -217,6 +237,7 @@ def test_ccpo_can_view_request():
|
||||
assert RequestsAuthorization(ccpo, request).can_view
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_random_user_cannot_view_request():
|
||||
user = UserFactory.create()
|
||||
request = RequestFactory.create()
|
||||
@@ -224,6 +245,7 @@ def test_random_user_cannot_view_request():
|
||||
assert not RequestsAuthorization(user, request).can_view
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_auto_approve_and_create_workspace():
|
||||
request = RequestFactory.create()
|
||||
workspace = Requests.auto_approve_and_create_workspace(request)
|
||||
@@ -239,6 +261,7 @@ class TestStatusNotifications(object):
|
||||
assert job.func == queue._send_mail
|
||||
assert job.args[0] == [request.creator.email]
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_pending_finver_triggers_notification(self, queue):
|
||||
request = RequestFactory.create()
|
||||
request = Requests.set_status(request, RequestStatus.PENDING_CCPO_ACCEPTANCE)
|
||||
@@ -247,12 +270,14 @@ class TestStatusNotifications(object):
|
||||
)
|
||||
self._assert_job(queue, request)
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_changes_requested_triggers_notification(self, queue):
|
||||
request = RequestFactory.create()
|
||||
request = Requests.set_status(request, RequestStatus.PENDING_CCPO_ACCEPTANCE)
|
||||
request = Requests.set_status(request, RequestStatus.CHANGES_REQUESTED)
|
||||
self._assert_job(queue, request)
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_changes_requested_to_finver_triggers_notification(self, queue):
|
||||
request = RequestFactory.create()
|
||||
request = Requests.set_status(request, RequestStatus.PENDING_CCPO_APPROVAL)
|
||||
@@ -261,12 +286,14 @@ class TestStatusNotifications(object):
|
||||
)
|
||||
self._assert_job(queue, request)
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_approval_triggers_notification(self, queue):
|
||||
request = RequestFactory.create()
|
||||
request = Requests.set_status(request, RequestStatus.PENDING_CCPO_APPROVAL)
|
||||
request = Requests.set_status(request, RequestStatus.APPROVED)
|
||||
self._assert_job(queue, request)
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_submitted_does_not_trigger_notification(self, queue):
|
||||
request = RequestFactory.create()
|
||||
request = Requests.set_status(request, RequestStatus.SUBMITTED)
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import pytest
|
||||
import re
|
||||
from flask import url_for
|
||||
|
||||
@@ -6,6 +7,7 @@ from atst.models.request_status_event import RequestStatus
|
||||
from tests.factories import RequestFactory, LegacyTaskOrderFactory, UserFactory
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_can_show_financial_data(client, user_session):
|
||||
user = UserFactory.create()
|
||||
user_session(user)
|
||||
@@ -24,6 +26,7 @@ def test_can_show_financial_data(client, user_session):
|
||||
assert re.search(r">\s+Financial Verification\s+<", body)
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_can_not_show_financial_data(client, user_session):
|
||||
user = UserFactory.create()
|
||||
user_session(user)
|
||||
|
@@ -1,7 +1,9 @@
|
||||
import pytest
|
||||
from tests.factories import UserFactory, RequestFactory
|
||||
from atst.models.request_status_event import RequestStatus
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_creator_pending_finver(client, user_session):
|
||||
request = RequestFactory.create_with_status(
|
||||
RequestStatus.PENDING_FINANCIAL_VERIFICATION
|
||||
@@ -13,6 +15,7 @@ def test_creator_pending_finver(client, user_session):
|
||||
assert "verify" in response.location
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_creator_pending_finver_changes(client, user_session):
|
||||
request = RequestFactory.create_with_status(
|
||||
RequestStatus.CHANGES_REQUESTED_TO_FINVER
|
||||
@@ -24,6 +27,7 @@ def test_creator_pending_finver_changes(client, user_session):
|
||||
assert "verify" in response.location
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_creator_approved(client, user_session):
|
||||
request = RequestFactory.create_with_status(RequestStatus.APPROVED)
|
||||
user_session(request.creator)
|
||||
@@ -33,6 +37,7 @@ def test_creator_approved(client, user_session):
|
||||
assert "details" in response.location
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_creator_approved(client, user_session):
|
||||
request = RequestFactory.create_with_status(RequestStatus.STARTED)
|
||||
user_session(request.creator)
|
||||
@@ -42,6 +47,7 @@ def test_creator_approved(client, user_session):
|
||||
assert "new" in response.location
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_ccpo(client, user_session):
|
||||
ccpo = UserFactory.from_atat_role("ccpo")
|
||||
request = RequestFactory.create_with_status(RequestStatus.STARTED)
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import pytest
|
||||
import datetime
|
||||
import re
|
||||
from tests.factories import (
|
||||
@@ -17,6 +18,7 @@ from tests.assert_util import dict_contains
|
||||
ERROR_CLASS = "alert--error"
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_submit_invalid_request_form(monkeypatch, client, user_session):
|
||||
user_session()
|
||||
response = client.post(
|
||||
@@ -27,6 +29,7 @@ def test_submit_invalid_request_form(monkeypatch, client, user_session):
|
||||
assert re.search(ERROR_CLASS, response.data.decode())
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_submit_valid_request_form(monkeypatch, client, user_session):
|
||||
user_session()
|
||||
monkeypatch.setattr(
|
||||
@@ -41,6 +44,7 @@ def test_submit_valid_request_form(monkeypatch, client, user_session):
|
||||
assert "/requests/new/2" in response.headers.get("Location")
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_owner_can_view_request(client, user_session):
|
||||
user = UserFactory.create()
|
||||
user_session(user)
|
||||
@@ -53,6 +57,7 @@ def test_owner_can_view_request(client, user_session):
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_non_owner_cannot_view_request(client, user_session):
|
||||
user = UserFactory.create()
|
||||
user_session(user)
|
||||
@@ -65,6 +70,7 @@ def test_non_owner_cannot_view_request(client, user_session):
|
||||
assert response.status_code == 404
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_ccpo_can_view_request(client, user_session):
|
||||
ccpo = Roles.get("ccpo")
|
||||
user = UserFactory.create(atat_role=ccpo)
|
||||
@@ -78,6 +84,7 @@ def test_ccpo_can_view_request(client, user_session):
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_nonexistent_request(client, user_session):
|
||||
user_session()
|
||||
response = client.get("/requests/new/1/foo", follow_redirects=True)
|
||||
@@ -85,6 +92,7 @@ def test_nonexistent_request(client, user_session):
|
||||
assert response.status_code == 404
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_creator_info_is_autopopulated_for_existing_request(
|
||||
monkeypatch, client, user_session
|
||||
):
|
||||
@@ -108,6 +116,7 @@ def test_creator_info_is_autopopulated_for_existing_request(
|
||||
assert "initial-value='{}'".format(value) in body
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_creator_info_is_autopopulated_for_new_request(
|
||||
monkeypatch, client, user_session
|
||||
):
|
||||
@@ -121,6 +130,7 @@ def test_creator_info_is_autopopulated_for_new_request(
|
||||
assert "initial-value='{}'".format(user.email) in body
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_non_creator_info_is_not_autopopulated(monkeypatch, client, user_session):
|
||||
user = UserFactory.create()
|
||||
creator = UserFactory.create()
|
||||
@@ -134,6 +144,7 @@ def test_non_creator_info_is_not_autopopulated(monkeypatch, client, user_session
|
||||
assert not user.email in body
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_am_poc_causes_poc_to_be_autopopulated(client, user_session):
|
||||
creator = UserFactory.create()
|
||||
user_session(creator)
|
||||
@@ -147,6 +158,7 @@ def test_am_poc_causes_poc_to_be_autopopulated(client, user_session):
|
||||
assert request.body["primary_poc"]["dodid_poc"] == creator.dod_id
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_not_am_poc_requires_poc_info_to_be_completed(client, user_session):
|
||||
creator = UserFactory.create()
|
||||
user_session(creator)
|
||||
@@ -160,6 +172,7 @@ def test_not_am_poc_requires_poc_info_to_be_completed(client, user_session):
|
||||
assert ERROR_CLASS in response.data.decode()
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_not_am_poc_allows_user_to_fill_in_poc_info(client, user_session):
|
||||
creator = UserFactory.create()
|
||||
user_session(creator)
|
||||
@@ -179,6 +192,7 @@ def test_not_am_poc_allows_user_to_fill_in_poc_info(client, user_session):
|
||||
assert ERROR_CLASS not in response.data.decode()
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_poc_details_can_be_autopopulated_on_new_request(client, user_session):
|
||||
creator = UserFactory.create()
|
||||
user_session(creator)
|
||||
@@ -193,6 +207,7 @@ def test_poc_details_can_be_autopopulated_on_new_request(client, user_session):
|
||||
assert request.body["primary_poc"]["dodid_poc"] == creator.dod_id
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_poc_autofill_checks_information_about_you_form_first(client, user_session):
|
||||
creator = UserFactory.create()
|
||||
user_session(creator)
|
||||
@@ -221,6 +236,7 @@ def test_poc_autofill_checks_information_about_you_form_first(client, user_sessi
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_can_review_data(user_session, client):
|
||||
creator = UserFactory.create()
|
||||
user_session(creator)
|
||||
@@ -232,6 +248,7 @@ def test_can_review_data(user_session, client):
|
||||
assert request.body["information_about_you"]["email_request"] in body
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_displays_ccpo_review_comment(user_session, client):
|
||||
creator = UserFactory.create()
|
||||
ccpo = UserFactory.from_atat_role("ccpo")
|
||||
|
@@ -8,6 +8,7 @@ def _mock_func(*args, **kwargs):
|
||||
return RequestFactory.create()
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_submit_reviewed_request(monkeypatch, client, user_session):
|
||||
user_session()
|
||||
monkeypatch.setattr("atst.domain.requests.Requests.get", _mock_func)
|
||||
@@ -24,6 +25,7 @@ def test_submit_reviewed_request(monkeypatch, client, user_session):
|
||||
assert "modal=pendingCCPOAcceptance" in response.headers["Location"]
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_submit_autoapproved_reviewed_request(monkeypatch, client, user_session):
|
||||
user_session()
|
||||
monkeypatch.setattr("atst.domain.requests.Requests.get", _mock_func)
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import pytest
|
||||
import os
|
||||
from flask import url_for
|
||||
|
||||
@@ -14,6 +15,7 @@ from tests.factories import (
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_ccpo_can_view_approval(user_session, client):
|
||||
ccpo = Roles.get("ccpo")
|
||||
user = UserFactory.create(atat_role=ccpo)
|
||||
@@ -24,6 +26,7 @@ def test_ccpo_can_view_approval(user_session, client):
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_ccpo_prepopulated_as_mission_owner(user_session, client):
|
||||
user = UserFactory.from_atat_role("ccpo")
|
||||
user_session(user)
|
||||
@@ -36,6 +39,7 @@ def test_ccpo_prepopulated_as_mission_owner(user_session, client):
|
||||
assert user.last_name in body
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_non_ccpo_cannot_view_approval(user_session, client):
|
||||
user = UserFactory.create()
|
||||
user_session(user)
|
||||
@@ -45,6 +49,7 @@ def test_non_ccpo_cannot_view_approval(user_session, client):
|
||||
assert response.status_code == 404
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def prepare_request_pending_approval(creator, pdf_attachment=None):
|
||||
legacy_task_order = LegacyTaskOrderFactory.create(
|
||||
number="abc123", pdf=pdf_attachment
|
||||
@@ -56,6 +61,7 @@ def prepare_request_pending_approval(creator, pdf_attachment=None):
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_ccpo_sees_pdf_link(user_session, client, pdf_upload):
|
||||
ccpo = UserFactory.from_atat_role("ccpo")
|
||||
user_session(ccpo)
|
||||
@@ -70,6 +76,7 @@ def test_ccpo_sees_pdf_link(user_session, client, pdf_upload):
|
||||
assert download_url in body
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_ccpo_does_not_see_pdf_link_if_no_pdf(user_session, client, pdf_upload):
|
||||
ccpo = UserFactory.from_atat_role("ccpo")
|
||||
user_session(ccpo)
|
||||
@@ -83,6 +90,7 @@ def test_ccpo_does_not_see_pdf_link_if_no_pdf(user_session, client, pdf_upload):
|
||||
assert download_url not in body
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_task_order_download(app, client, user_session, pdf_upload):
|
||||
user = UserFactory.create()
|
||||
user_session(user)
|
||||
@@ -108,6 +116,7 @@ def test_task_order_download(app, client, user_session, pdf_upload):
|
||||
assert response.data == pdf_content
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_task_order_download_does_not_exist(client, user_session):
|
||||
user = UserFactory.create()
|
||||
user_session(user)
|
||||
@@ -118,6 +127,7 @@ def test_task_order_download_does_not_exist(client, user_session):
|
||||
assert response.status_code == 404
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_can_submit_request_approval(client, user_session):
|
||||
user = UserFactory.from_atat_role("ccpo")
|
||||
user_session(user)
|
||||
@@ -133,6 +143,7 @@ def test_can_submit_request_approval(client, user_session):
|
||||
assert request.status == RequestStatus.PENDING_FINANCIAL_VERIFICATION
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_can_submit_request_denial(client, user_session):
|
||||
user = UserFactory.from_atat_role("ccpo")
|
||||
user_session(user)
|
||||
@@ -148,6 +159,7 @@ def test_can_submit_request_denial(client, user_session):
|
||||
assert request.status == RequestStatus.CHANGES_REQUESTED
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_ccpo_user_can_comment_on_request(client, user_session):
|
||||
user = UserFactory.from_atat_role("ccpo")
|
||||
user_session(user)
|
||||
@@ -167,6 +179,7 @@ def test_ccpo_user_can_comment_on_request(client, user_session):
|
||||
assert request.internal_comments[0].text == comment_text
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_comment_text_is_required(client, user_session):
|
||||
user = UserFactory.from_atat_role("ccpo")
|
||||
user_session(user)
|
||||
@@ -184,6 +197,7 @@ def test_comment_text_is_required(client, user_session):
|
||||
assert len(request.internal_comments) == 0
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_other_user_cannot_comment_on_request(client, user_session):
|
||||
user = UserFactory.create()
|
||||
user_session(user)
|
||||
|
@@ -69,6 +69,7 @@ FalseValidator = MagicMock()
|
||||
FalseValidator.validate = MagicMock(return_value=False)
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_update_fv(fv_data):
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -81,6 +82,7 @@ def test_update_fv(fv_data):
|
||||
assert updated_request.is_pending_ccpo_approval
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_update_fv_re_enter_pe_number(fv_data):
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -96,6 +98,7 @@ def test_update_fv_re_enter_pe_number(fv_data):
|
||||
assert updated_request.is_pending_ccpo_approval
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_update_fv_invalid_task_order_number(fv_data):
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -113,6 +116,7 @@ def test_update_fv_invalid_task_order_number(fv_data):
|
||||
update_fv.execute()
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_draft_without_pe_id(fv_data):
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -127,6 +131,7 @@ def test_draft_without_pe_id(fv_data):
|
||||
).execute()
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_update_fv_extended(fv_data, e_fv_data):
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -138,6 +143,7 @@ def test_update_fv_extended(fv_data, e_fv_data):
|
||||
assert update_fv.execute()
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_update_fv_extended_does_not_validate_task_order(fv_data, e_fv_data):
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -149,6 +155,7 @@ def test_update_fv_extended_does_not_validate_task_order(fv_data, e_fv_data):
|
||||
assert update_fv.execute()
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_update_fv_missing_extended_data(fv_data):
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -165,6 +172,7 @@ def test_update_fv_missing_extended_data(fv_data):
|
||||
update_fv.execute()
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_update_fv_submission(fv_data):
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -174,6 +182,7 @@ def test_update_fv_submission(fv_data):
|
||||
assert updated_request
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_save_empty_draft():
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -184,6 +193,7 @@ def test_save_empty_draft():
|
||||
assert save_draft.execute()
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_save_draft_with_ba_code():
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -195,6 +205,7 @@ def test_save_draft_with_ba_code():
|
||||
assert save_draft.execute()
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_save_draft_allows_invalid_data():
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -214,6 +225,7 @@ def test_save_draft_allows_invalid_data():
|
||||
).execute()
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_save_draft_and_then_submit():
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -228,6 +240,7 @@ def test_save_draft_and_then_submit():
|
||||
).execute()
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_updated_request_has_pdf(fv_data, e_fv_data):
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -238,6 +251,7 @@ def test_updated_request_has_pdf(fv_data, e_fv_data):
|
||||
assert updated_request.legacy_task_order.pdf
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_can_save_draft_with_just_pdf(e_fv_data):
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -250,6 +264,7 @@ def test_can_save_draft_with_just_pdf(e_fv_data):
|
||||
assert form.legacy_task_order.pdf
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_task_order_info_present_in_extended_form(fv_data, e_fv_data):
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -265,6 +280,7 @@ def test_task_order_info_present_in_extended_form(fv_data, e_fv_data):
|
||||
assert form.legacy_task_order.clin_0001.data
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_update_ignores_empty_values(fv_data, e_fv_data):
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -274,6 +290,7 @@ def test_update_ignores_empty_values(fv_data, e_fv_data):
|
||||
).execute()
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_can_save_draft_with_funding_type(fv_data, e_fv_data):
|
||||
request = RequestFactory.create()
|
||||
user = UserFactory.create()
|
||||
@@ -288,6 +305,7 @@ def test_can_save_draft_with_funding_type(fv_data, e_fv_data):
|
||||
assert updated_request.legacy_task_order.funding_type
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_update_fv_route(client, user_session, fv_data):
|
||||
user = UserFactory.create()
|
||||
request = RequestFactory.create(creator=user)
|
||||
@@ -301,6 +319,7 @@ def test_update_fv_route(client, user_session, fv_data):
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_save_fv_draft_route(client, user_session, fv_data):
|
||||
user = UserFactory.create()
|
||||
request = RequestFactory.create(creator=user)
|
||||
@@ -314,6 +333,7 @@ def test_save_fv_draft_route(client, user_session, fv_data):
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_get_fv_form_route(client, user_session, fv_data):
|
||||
user = UserFactory.create()
|
||||
request = RequestFactory.create(creator=user)
|
||||
@@ -327,6 +347,7 @@ def test_get_fv_form_route(client, user_session, fv_data):
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_manual_task_order_triggers_extended_form(
|
||||
client, user_session, fv_data, e_fv_data
|
||||
):
|
||||
@@ -348,6 +369,7 @@ def test_manual_task_order_triggers_extended_form(
|
||||
assert "extended" in response.headers["Location"]
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_manual_to_does_not_trigger_approval(client, user_session, fv_data, e_fv_data):
|
||||
user = UserFactory.create()
|
||||
request = RequestFactory.create(creator=user)
|
||||
@@ -370,6 +392,7 @@ def test_manual_to_does_not_trigger_approval(client, user_session, fv_data, e_fv
|
||||
assert updated_request.status != RequestStatus.APPROVED
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_eda_task_order_does_trigger_approval(client, user_session, fv_data, e_fv_data):
|
||||
user = UserFactory.create()
|
||||
request = RequestFactory.create(creator=user)
|
||||
@@ -392,6 +415,7 @@ def test_eda_task_order_does_trigger_approval(client, user_session, fv_data, e_f
|
||||
assert updated_request.status == RequestStatus.APPROVED
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_attachment_on_non_extended_form(client, user_session, fv_data, e_fv_data):
|
||||
user = UserFactory.create()
|
||||
request = RequestFactory.create(creator=user)
|
||||
@@ -417,6 +441,7 @@ def test_attachment_on_non_extended_form(client, user_session, fv_data, e_fv_dat
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_task_order_number_persists_in_form(fv_data, e_fv_data):
|
||||
user = UserFactory.create()
|
||||
request = RequestFactory.create(creator=user)
|
||||
@@ -437,6 +462,7 @@ def test_task_order_number_persists_in_form(fv_data, e_fv_data):
|
||||
assert form.legacy_task_order.number.data == MANUAL_TO_NUMBER
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_can_submit_once_to_details_are_entered(fv_data, e_fv_data):
|
||||
user = UserFactory.create()
|
||||
request = RequestFactory.create(creator=user)
|
||||
@@ -464,6 +490,7 @@ def test_can_submit_once_to_details_are_entered(fv_data, e_fv_data):
|
||||
).execute()
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_existing_task_order_with_pdf(fv_data, e_fv_data, client, user_session):
|
||||
# Use finver route to create initial TO #1, complete with PDF
|
||||
user = UserFactory.create()
|
||||
@@ -496,6 +523,7 @@ def test_existing_task_order_with_pdf(fv_data, e_fv_data, client, user_session):
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_pdf_clearing(fv_data, e_fv_data, pdf_upload, pdf_upload2):
|
||||
user = UserFactory.create()
|
||||
request = RequestFactory.create(creator=user)
|
||||
@@ -521,6 +549,7 @@ def test_pdf_clearing(fv_data, e_fv_data, pdf_upload, pdf_upload2):
|
||||
# in the related attachment entity. I have changed the handling in
|
||||
# FinancialVerificationBase#_get_form to be more generous in how it finds the
|
||||
# PDF filename and prepopulates the form data with that name.
|
||||
@pytest.mark.requests_workflow
|
||||
def test_always_derives_pdf_filename(fv_data, e_fv_data, pdf_upload):
|
||||
user = UserFactory.create()
|
||||
request_one = RequestFactory.create(creator=user)
|
||||
|
@@ -1,3 +1,4 @@
|
||||
import pytest
|
||||
from flask import url_for
|
||||
|
||||
from atst.routes.requests.index import RequestsIndex
|
||||
@@ -5,6 +6,7 @@ from tests.factories import RequestFactory, UserFactory
|
||||
from atst.domain.requests import Requests
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_action_required_mission_owner():
|
||||
creator = UserFactory.create()
|
||||
requests = RequestFactory.create_batch(5, creator=creator)
|
||||
@@ -16,6 +18,7 @@ def test_action_required_mission_owner():
|
||||
assert context["requests"][0]["action_required"] == False
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_action_required_ccpo():
|
||||
creator = UserFactory.create()
|
||||
requests = RequestFactory.create_batch(5, creator=creator)
|
||||
|
@@ -4,20 +4,22 @@ from urllib.parse import quote
|
||||
from tests.factories import UserFactory
|
||||
|
||||
|
||||
PROTECTED_URL = "/workspaces"
|
||||
|
||||
|
||||
def test_request_page_with_complete_profile(client, user_session):
|
||||
user = UserFactory.create()
|
||||
user_session(user)
|
||||
response = client.get("/requests", follow_redirects=False)
|
||||
response = client.get(PROTECTED_URL, follow_redirects=False)
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
def test_redirect_when_profile_missing_fields(client, user_session):
|
||||
user = UserFactory.create(date_latest_training=None)
|
||||
user_session(user)
|
||||
requested_url = "/requests"
|
||||
response = client.get(requested_url, follow_redirects=False)
|
||||
response = client.get(PROTECTED_URL, follow_redirects=False)
|
||||
assert response.status_code == 302
|
||||
assert "/user?next={}".format(quote(requested_url, safe="")) in response.location
|
||||
assert "/user?next={}".format(quote(PROTECTED_URL, safe="")) in response.location
|
||||
|
||||
|
||||
def test_unprotected_route_with_incomplete_profile(client, user_session):
|
||||
@@ -30,7 +32,7 @@ def test_unprotected_route_with_incomplete_profile(client, user_session):
|
||||
def test_completing_user_profile(client, user_session):
|
||||
user = UserFactory.create(phone_number=None)
|
||||
user_session(user)
|
||||
response = client.get("/requests", follow_redirects=True)
|
||||
response = client.get(PROTECTED_URL, follow_redirects=True)
|
||||
assert b"You must complete your profile" in response.data
|
||||
|
||||
updated_data = {**user.to_dictionary(), "phone_number": "5558675309"}
|
||||
@@ -40,6 +42,6 @@ def test_completing_user_profile(client, user_session):
|
||||
response = client.post(url_for("users.update_user"), data=updated_data)
|
||||
assert response.status_code == 200
|
||||
|
||||
response = client.get("/requests", follow_redirects=False)
|
||||
response = client.get(PROTECTED_URL, follow_redirects=False)
|
||||
assert response.status_code == 200
|
||||
assert b"You must complete your profile" not in response.data
|
||||
|
@@ -1,4 +1,5 @@
|
||||
import pytest
|
||||
from flask import url_for
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
@@ -10,7 +11,7 @@ def csrf_enabled_app(app):
|
||||
|
||||
def test_csrf_error(csrf_enabled_app, client):
|
||||
response = client.post(
|
||||
"/requests/new/1",
|
||||
url_for("users.user"),
|
||||
headers={"Content-Type": "application/x-www-form-urlencoded"},
|
||||
data="csrf_token=invalid_token",
|
||||
follow_redirects=True,
|
||||
|
@@ -19,6 +19,7 @@ def test_user_without_workspaces_has_no_workspaces_nav(client, user_session):
|
||||
assert b'href="/workspaces"' not in response.data
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="this may no longer be accurate")
|
||||
def test_request_owner_with_no_workspaces_redirected_to_requests(client, user_session):
|
||||
request = RequestFactory.create()
|
||||
user_session(request.creator)
|
||||
@@ -50,6 +51,7 @@ def test_request_owner_with_more_than_one_workspace_redirected_to_workspaces(
|
||||
assert "/workspaces" in response.location
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="this may no longer be accurate")
|
||||
def test_non_owner_user_with_no_workspaces_redirected_to_requests(client, user_session):
|
||||
user = UserFactory.create()
|
||||
|
||||
@@ -86,6 +88,7 @@ def test_non_owner_user_with_mulitple_workspaces_redirected_to_workspaces(
|
||||
assert "/workspaces" in response.location
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="this may no longer be accurate")
|
||||
def test_ccpo_user_redirected_to_requests(client, user_session):
|
||||
user = UserFactory.from_atat_role("ccpo")
|
||||
for _ in range(3):
|
||||
|
@@ -189,11 +189,11 @@ def test_logout(app, client, monkeypatch):
|
||||
)
|
||||
# create a real session
|
||||
resp = _login(client)
|
||||
resp_success = client.get(url_for("requests.requests_index"))
|
||||
resp_success = client.get(url_for("users.user"))
|
||||
# verify session is valid
|
||||
assert resp_success.status_code == 200
|
||||
client.get(url_for("atst.logout"))
|
||||
resp_failure = client.get(url_for("requests.requests_index"))
|
||||
resp_failure = client.get(url_for("users.user"))
|
||||
# verify that logging out has cleared the session
|
||||
assert resp_failure.status_code == 302
|
||||
destination = urlparse(resp_failure.headers["Location"]).path
|
||||
@@ -208,6 +208,6 @@ def test_redirected_on_login(client, monkeypatch):
|
||||
"atst.domain.authnid.AuthenticationContext.get_user",
|
||||
lambda *args: UserFactory.create(),
|
||||
)
|
||||
target_route = url_for("requests.requests_form_new", screen=1)
|
||||
target_route = url_for("users.user")
|
||||
response = _login(client, next=target_route)
|
||||
assert target_route in response.headers.get("Location")
|
||||
|
@@ -26,6 +26,7 @@ def serialize_dates(data):
|
||||
return new_data
|
||||
|
||||
|
||||
@pytest.mark.requests_workflow
|
||||
def test_stepthrough_request_form(user_session, screens, client):
|
||||
user = UserFactory.create()
|
||||
user_session(user)
|
||||
|
@@ -1,19 +0,0 @@
|
||||
import pytest
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"path",
|
||||
(
|
||||
"/workspaces",
|
||||
"/requests",
|
||||
"/requests/new/1",
|
||||
"/users",
|
||||
"/reports",
|
||||
"/calculator",
|
||||
),
|
||||
)
|
||||
def test_routes(path, client, user_session):
|
||||
user_session()
|
||||
|
||||
response = client.get(path)
|
||||
assert response.status_code == 200
|
Reference in New Issue
Block a user