diff --git a/tests/domain/test_requests.py b/tests/domain/test_requests.py
index fad94973..90e3655d 100644
--- a/tests/domain/test_requests.py
+++ b/tests/domain/test_requests.py
@@ -143,39 +143,6 @@ request_financial_data = {
}
-def test_update_financial_verification_without_task_order(
- extended_financial_verification_data
-):
- request = RequestFactory.create()
- financial_data = {**request_financial_data, **extended_financial_verification_data}
- Requests.update_financial_verification(request.id, financial_data)
- assert request.task_order
- assert request.task_order.clin_0001 == int(
- extended_financial_verification_data["clin_0001"]
- )
- assert request.task_order.source == TaskOrderSource.MANUAL
- assert request.task_order.pdf
-
-
-def test_update_financial_verification_with_task_order():
- task_order = TaskOrderFactory.create(source=TaskOrderSource.EDA)
- financial_data = {**request_financial_data, "task_order_number": task_order.number}
- request = RequestFactory.create()
- Requests.update_financial_verification(request.id, financial_data)
- assert request.task_order == task_order
-
-
-def test_update_financial_verification_with_invalid_task_order():
- request = RequestFactory.create()
- Requests.update_financial_verification(request.id, request_financial_data)
- assert not request.task_order
- assert "task_order_number" in request.body.get("financial_verification")
- assert (
- request.body["financial_verification"]["task_order_number"]
- == request_financial_data["task_order_number"]
- )
-
-
def test_set_status_sets_revision():
request = RequestFactory.create()
Requests.set_status(request, RequestStatus.APPROVED)
diff --git a/tests/domain/test_task_orders.py b/tests/domain/test_task_orders.py
index cc83d284..1a8fe59a 100644
--- a/tests/domain/test_task_orders.py
+++ b/tests/domain/test_task_orders.py
@@ -1,6 +1,5 @@
import pytest
-from atst.models.task_order import Source as TaskOrderSource
from atst.domain.exceptions import NotFoundError
from atst.domain.task_orders import TaskOrders
from atst.eda_client import MockEDAClient
@@ -15,16 +14,6 @@ def test_can_get_task_order():
assert to.id == to.id
-def test_can_get_task_order_from_eda(monkeypatch):
- monkeypatch.setattr(
- "atst.domain.task_orders.TaskOrders._client", lambda: MockEDAClient()
- )
- to = TaskOrders.get(MockEDAClient.MOCK_CONTRACT_NUMBER)
-
- assert to.number == MockEDAClient.MOCK_CONTRACT_NUMBER
- assert to.source == TaskOrderSource.EDA
-
-
def test_nonexistent_task_order_raises_without_client():
with pytest.raises(NotFoundError):
TaskOrders.get("some fake number")
@@ -36,10 +25,3 @@ def test_nonexistent_task_order_raises_with_client(monkeypatch):
)
with pytest.raises(NotFoundError):
TaskOrders.get("some other fake numer")
-
-
-def test_create_attachment(extended_financial_verification_data):
- task_order_data = extended_financial_verification_data.copy()
- task_order_data["pdf"] = task_order_data.pop("task_order")
- task_order = TaskOrders.get_or_create_task_order("abc123", task_order_data)
- assert task_order.pdf
diff --git a/tests/forms/test_financial.py b/tests/forms/test_financial.py
index 5a4c80dd..05c51ca2 100644
--- a/tests/forms/test_financial.py
+++ b/tests/forms/test_financial.py
@@ -1,8 +1,8 @@
import pytest
from werkzeug.datastructures import ImmutableMultiDict
-from atst.forms.financial import suggest_pe_id, FinancialForm, ExtendedFinancialForm
-from atst.eda_client import MockEDAClient
+from atst.forms.financial import FinancialVerificationForm
+from atst.domain.requests.financial_verification import PENumberValidator
@pytest.mark.parametrize(
@@ -16,21 +16,21 @@ from atst.eda_client import MockEDAClient
],
)
def test_suggest_pe_id(input_, expected):
- assert suggest_pe_id(input_) == expected
+ assert PENumberValidator().suggest_pe_id(input_) == expected
def test_funding_type_other_not_required_if_funding_type_is_not_other():
- form_data = {"funding_type": "PROC"}
- form = ExtendedFinancialForm(data=form_data)
+ form_data = ImmutableMultiDict({"task_order-funding_type": "PROC"})
+ form = FinancialVerificationForm(form_data)
form.validate()
assert "funding_type_other" not in form.errors
def test_funding_type_other_required_if_funding_type_is_other():
- form_data = {"funding_type": "OTHER"}
- form = ExtendedFinancialForm(data=form_data)
+ form_data = ImmutableMultiDict({"task_order-funding_type": "OTHER"})
+ form = FinancialVerificationForm(form_data)
form.validate()
- assert "funding_type_other" in form.errors
+ assert "funding_type_other" in form.errors["task_order"]
@pytest.mark.parametrize(
@@ -47,10 +47,10 @@ def test_funding_type_other_required_if_funding_type_is_other():
],
)
def test_treasury_code_validation(input_, expected):
- form_data = ImmutableMultiDict([("treasury_code", input_)])
- form = FinancialForm(form_data)
+ form_data = ImmutableMultiDict([("request-treasury_code", input_)])
+ form = FinancialVerificationForm(form_data)
form.validate()
- is_valid = "treasury_code" not in form.errors
+ is_valid = "treasury_code" not in form.errors["request"]
assert is_valid == expected
@@ -74,38 +74,19 @@ def test_treasury_code_validation(input_, expected):
],
)
def test_ba_code_validation(input_, expected):
- form_data = ImmutableMultiDict([("ba_code", input_)])
- form = FinancialForm(form_data)
+ form_data = ImmutableMultiDict([("request-ba_code", input_)])
+ form = FinancialVerificationForm(form_data)
form.validate()
- is_valid = "ba_code" not in form.errors
+ is_valid = "ba_code" not in form.errors["request"]
assert is_valid == expected
-def test_task_order_number_validation(monkeypatch):
- monkeypatch.setattr(
- "atst.domain.task_orders.TaskOrders._client", lambda: MockEDAClient()
- )
- monkeypatch.setattr("atst.forms.financial.validate_pe_id", lambda *args: True)
- form_invalid = FinancialForm(data={"task_order_number": "1234"})
- form_invalid.perform_extra_validation({})
-
- assert "task_order_number" in form_invalid.errors
-
- form_valid = FinancialForm(
- data={"task_order_number": MockEDAClient.MOCK_CONTRACT_NUMBER},
- eda_client=MockEDAClient(),
- )
- form_valid.perform_extra_validation({})
-
- assert "task_order_number" not in form_valid.errors
-
-
def test_can_submit_zero_for_clin():
- form_first = ExtendedFinancialForm()
+ form_first = FinancialVerificationForm()
form_first.validate()
- assert "clin_0001" in form_first.errors
- form_data = ImmutableMultiDict([("clin_0001", "0")])
- form_second = ExtendedFinancialForm(form_data)
+ assert "clin_0001" in form_first.errors["task_order"]
+ form_data = ImmutableMultiDict([("task_order-clin_0001", "0")])
+ form_second = FinancialVerificationForm(form_data)
form_second.validate()
- assert "clin_0001" not in form_second.errors
+ assert "clin_0001" not in form_second.errors["task_order"]
diff --git a/tests/mocks.py b/tests/mocks.py
index e61d80c1..b42521dc 100644
--- a/tests/mocks.py
+++ b/tests/mocks.py
@@ -6,7 +6,7 @@ MOCK_REQUEST = RequestFactory.build(creator=MOCK_USER)
DOD_SDN_INFO = {"first_name": "ART", "last_name": "GARFUNKEL", "dod_id": "5892460358"}
DOD_SDN = f"CN={DOD_SDN_INFO['last_name']}.{DOD_SDN_INFO['first_name']}.G.{DOD_SDN_INFO['dod_id']},OU=OTHER,OU=PKI,OU=DoD,O=U.S. Government,C=US"
-MOCK_VALID_PE_ID = "8675309U"
+MOCK_VALID_PE_ID = "080675309U"
FIXTURE_EMAIL_ADDRESS = "artgarfunkel@uso.mil"
diff --git a/tests/routes/test_financial_verification.py b/tests/routes/test_financial_verification.py
index 91630abe..8ab8790d 100644
--- a/tests/routes/test_financial_verification.py
+++ b/tests/routes/test_financial_verification.py
@@ -1,219 +1,439 @@
-import urllib
import pytest
+from unittest.mock import MagicMock
from flask import url_for
+import datetime
from atst.eda_client import MockEDAClient
-from atst.models.request_status_event import RequestStatus
-from atst.routes.requests.financial_verification import FinancialVerification
-
-from tests.mocks import MOCK_REQUEST, MOCK_USER
-from tests.factories import (
- PENumberFactory,
- RequestFactory,
- UserFactory,
- RequestStatusEventFactory,
- RequestReviewFactory,
+from atst.routes.requests.financial_verification import (
+ GetFinancialVerificationForm,
+ UpdateFinancialVerification,
+ SaveFinancialVerificationDraft,
)
+from tests.mocks import MOCK_VALID_PE_ID
+from tests.factories import RequestFactory, UserFactory
+from atst.forms.exceptions import FormValidationError
+from atst.domain.requests.financial_verification import (
+ PENumberValidator,
+ TaskOrderNumberValidator,
+)
+from atst.utils import pick
+from atst.models.request_status_event import RequestStatus
+from atst.domain.requests.query import RequestsQuery
-class TestPENumberInForm:
- required_data = {
- "pe_id": "123",
- "task_order_number": MockEDAClient.MOCK_CONTRACT_NUMBER,
- "fname_co": "Contracting",
- "lname_co": "Officer",
- "email_co": "jane@mail.mil",
- "office_co": "WHS",
- "fname_cor": "Officer",
- "lname_cor": "Representative",
- "email_cor": "jane@mail.mil",
- "office_cor": "WHS",
- "uii_ids": "1234",
- "treasury_code": "00123456",
- "ba_code": "02A",
+@pytest.fixture
+def fv_data():
+ return {
+ "request-pe_id": "123",
+ "task_order-number": MockEDAClient.MOCK_CONTRACT_NUMBER,
+ "request-fname_co": "Contracting",
+ "request-lname_co": "Officer",
+ "request-email_co": "jane@mail.mil",
+ "request-office_co": "WHS",
+ "request-fname_cor": "Officer",
+ "request-lname_cor": "Representative",
+ "request-email_cor": "jane@mail.mil",
+ "request-office_cor": "WHS",
+ "request-uii_ids": "1234",
+ "request-treasury_code": "00123456",
+ "request-ba_code": "02A",
}
- def _set_monkeypatches(self, monkeypatch):
- monkeypatch.setattr(
- "atst.forms.financial.FinancialForm.validate", lambda s: True
- )
- user = UserFactory.create()
- monkeypatch.setattr("atst.domain.auth.get_current_user", lambda *args: user)
- return user
- def submit_data(self, client, user, data, extended=False):
- request = RequestFactory.create(creator=user)
- url_kwargs = {"request_id": request.id}
- if extended:
- url_kwargs["extended"] = True
- response = client.post(
- url_for("requests.financial_verification", **url_kwargs),
- data=data,
- follow_redirects=False,
- )
- return response
-
- def test_submit_request_form_with_invalid_pe_id(self, monkeypatch, client):
- user = self._set_monkeypatches(monkeypatch)
-
- response = self.submit_data(client, user, self.required_data)
-
- assert "We couldn't find that PE number" in response.data.decode()
- assert response.status_code == 200
-
- def test_submit_request_form_with_unchanged_pe_id(self, monkeypatch, client):
- user = self._set_monkeypatches(monkeypatch)
-
- data = dict(self.required_data)
- data["pe_id"] = "0101110F"
-
- response = self.submit_data(client, user, data)
-
- assert response.status_code == 302
- assert "/workspaces" in response.headers.get("Location")
-
- def test_submit_request_form_with_new_valid_pe_id(self, monkeypatch, client):
- user = self._set_monkeypatches(monkeypatch)
- pe = PENumberFactory.create(number="8675309U", description="sample PE number")
-
- data = dict(self.required_data)
- data["pe_id"] = pe.number
-
- response = self.submit_data(client, user, data)
-
- assert response.status_code == 302
- assert "/workspaces" in response.headers.get("Location")
-
- def test_submit_request_form_with_missing_pe_id(self, monkeypatch, client):
- user = self._set_monkeypatches(monkeypatch)
-
- data = dict(self.required_data)
- data["pe_id"] = ""
-
- response = self.submit_data(client, user, data)
-
- assert "There were some errors" in response.data.decode()
- assert response.status_code == 200
-
- def test_submit_financial_form_with_invalid_task_order(
- self, monkeypatch, user_session, client
- ):
- user = UserFactory.create()
- user_session(user)
-
- data = dict(self.required_data)
- data["pe_id"] = "0101110F"
- data["task_order_number"] = "1234"
-
- response = self.submit_data(client, user, data)
-
- assert "extended=True" in response.data.decode()
-
- def test_submit_financial_form_with_valid_task_order(
- self, monkeypatch, user_session, client
- ):
- user = UserFactory.create()
- monkeypatch.setattr(
- "atst.domain.requests.Requests.get", lambda *args: MOCK_REQUEST
- )
- user_session(user)
-
- data = dict(self.required_data)
- data["pe_id"] = "0101110F"
- data["task_order_number"] = MockEDAClient.MOCK_CONTRACT_NUMBER
-
- response = self.submit_data(client, user, data)
-
- assert "enter TO information manually" not in response.data.decode()
-
- def test_submit_extended_financial_form(
- self, monkeypatch, user_session, client, extended_financial_verification_data
- ):
- user = UserFactory.create()
- request = RequestFactory.create(creator=user)
- monkeypatch.setattr("atst.domain.requests.Requests.get", lambda *args: request)
- monkeypatch.setattr("atst.forms.financial.validate_pe_id", lambda *args: True)
- user_session(user)
- data = {**self.required_data, **extended_financial_verification_data}
- data["task_order_number"] = "1234567"
-
- response = self.submit_data(client, user, data, extended=True)
-
- assert response.status_code == 302
- assert "/requests" in response.headers.get("Location")
-
- def test_submit_invalid_extended_financial_form(
- self, monkeypatch, user_session, client, extended_financial_verification_data
- ):
- monkeypatch.setattr("atst.forms.financial.validate_pe_id", lambda *args: True)
- user = UserFactory.create()
- user_session(user)
- data = {**self.required_data, **extended_financial_verification_data}
- data["task_order_number"] = "1234567"
- del (data["clin_0001"])
-
- response = self.submit_data(client, user, data, extended=True)
-
- assert response.status_code == 200
+@pytest.fixture
+def e_fv_data(pdf_upload):
+ return {
+ "task_order-funding_type": "RDTE",
+ "task_order-funding_type_other": "other",
+ "task_order-expiration_date": "1/1/{}".format(datetime.date.today().year + 1),
+ "task_order-clin_0001": "50000",
+ "task_order-clin_0003": "13000",
+ "task_order-clin_1001": "30000",
+ "task_order-clin_1003": "7000",
+ "task_order-clin_2001": "30000",
+ "task_order-clin_2003": "7000",
+ "task_order-pdf": pdf_upload,
+ }
-def test_displays_ccpo_review_comment(user_session, client):
- creator = UserFactory.create()
- ccpo = UserFactory.from_atat_role("ccpo")
- user_session(creator)
- request = RequestFactory.create(creator=creator)
- status = RequestStatusEventFactory.create(
- revision=request.latest_revision,
- new_status=RequestStatus.CHANGES_REQUESTED_TO_FINVER,
- request=request,
+MANUAL_TO_NUMBER = "DCA10096D0051"
+
+
+TrueValidator = MagicMock()
+TrueValidator.validate = MagicMock(return_value=True)
+
+FalseValidator = MagicMock()
+FalseValidator.validate = MagicMock(return_value=False)
+
+
+def test_update_fv(fv_data):
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ data = {**fv_data, "pe_id": MOCK_VALID_PE_ID}
+
+ updated_request = UpdateFinancialVerification(
+ TrueValidator, TrueValidator, user, request, data, is_extended=False
+ ).execute()
+
+ assert updated_request.is_pending_ccpo_approval
+
+
+def test_update_fv_re_enter_pe_number(fv_data):
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ data = {**fv_data, "pe_id": "0101228M"}
+ update_fv = UpdateFinancialVerification(
+ PENumberValidator(), TrueValidator, user, request, data, is_extended=False
)
- review_comment = "add all of the correct info, instead of the incorrect info"
- RequestReviewFactory.create(reviewer=ccpo, comment=review_comment, status=status)
- response = client.get("/requests/verify/{}".format(request.id))
- body = response.data.decode()
- assert review_comment in body
+
+ with pytest.raises(FormValidationError):
+ update_fv.execute()
+ updated_request = update_fv.execute()
+
+ assert updated_request.is_pending_ccpo_approval
-class TestFinancialVerification:
- def _service_object(self, request=None, extended=False, post_data={}):
- if not request:
- self.request = RequestFactory.create()
- else:
- self.request = request
+def test_update_fv_invalid_task_order_number(fv_data):
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ data = {**fv_data, "task_order-number": MANUAL_TO_NUMBER}
+ update_fv = UpdateFinancialVerification(
+ TrueValidator,
+ TaskOrderNumberValidator(),
+ user,
+ request,
+ data,
+ is_extended=False,
+ )
- return FinancialVerification(
- self.request, extended=extended, post_data=post_data
- )
+ with pytest.raises(FormValidationError):
+ update_fv.execute()
- def test_is_extended(self):
- finver_one = self._service_object()
- assert not finver_one.is_extended
- finver_two = self._service_object(
- request=RequestFactory.create_with_status(
- RequestStatus.CHANGES_REQUESTED_TO_FINVER
- )
- )
- assert finver_two.is_extended
- finver_three = self._service_object(extended=True)
- assert finver_three.is_extended
- def test_is_pending_changes(self):
- finver_one = self._service_object()
- assert not finver_one.is_pending_changes
- finver_two = self._service_object(
- request=RequestFactory.create_with_status(
- RequestStatus.CHANGES_REQUESTED_TO_FINVER
- )
- )
- assert finver_two.is_pending_changes
+def test_update_fv_extended(fv_data, e_fv_data):
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ data = {**fv_data, **e_fv_data}
+ update_fv = UpdateFinancialVerification(
+ TrueValidator, TaskOrderNumberValidator(), user, request, data, is_extended=True
+ )
- def test_pending(self):
- finver_one = self._service_object()
- assert not finver_one.pending
- finver_two = self._service_object(
- request=RequestFactory.create_with_status(
- RequestStatus.PENDING_CCPO_APPROVAL
- )
- )
- assert finver_two.pending
+ assert update_fv.execute()
+
+
+def test_update_fv_missing_extended_data(fv_data):
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ update_fv = UpdateFinancialVerification(
+ TrueValidator,
+ TaskOrderNumberValidator(),
+ user,
+ request,
+ fv_data,
+ is_extended=True,
+ )
+
+ with pytest.raises(FormValidationError):
+ update_fv.execute()
+
+
+def test_update_fv_submission(fv_data):
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ updated_request = UpdateFinancialVerification(
+ TrueValidator, TrueValidator, user, request, fv_data
+ ).execute()
+ assert updated_request
+
+
+def test_save_empty_draft():
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ save_draft = SaveFinancialVerificationDraft(
+ TrueValidator, TrueValidator, user, request, {}, is_extended=False
+ )
+
+ assert save_draft.execute()
+
+
+def test_save_draft_with_ba_code():
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ data = {"ba_code": "02A"}
+ save_draft = SaveFinancialVerificationDraft(
+ TrueValidator, TrueValidator, user, request, data, is_extended=False
+ )
+
+ assert save_draft.execute()
+
+
+def test_save_draft_with_invalid_task_order(fv_data):
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ save_draft = SaveFinancialVerificationDraft(
+ TrueValidator, FalseValidator, user, request, fv_data, is_extended=False
+ )
+
+ with pytest.raises(FormValidationError):
+ assert save_draft.execute()
+
+
+def test_save_draft_with_invalid_pe_number(fv_data):
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ save_draft = SaveFinancialVerificationDraft(
+ FalseValidator, TrueValidator, user, request, fv_data, is_extended=False
+ )
+
+ with pytest.raises(FormValidationError):
+ assert save_draft.execute()
+
+
+def test_save_draft_re_enter_pe_number(fv_data):
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ data = {**fv_data, "pe_id": "0101228M"}
+ save_fv = SaveFinancialVerificationDraft(
+ PENumberValidator(), TrueValidator, user, request, data, is_extended=False
+ )
+
+ with pytest.raises(FormValidationError):
+ save_fv.execute()
+ save_fv.execute()
+
+
+def test_save_draft_and_then_submit():
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ data = {"ba_code": "02A"}
+ updated_request = SaveFinancialVerificationDraft(
+ TrueValidator, TrueValidator, user, request, data, is_extended=False
+ ).execute()
+
+ with pytest.raises(FormValidationError):
+ UpdateFinancialVerification(
+ TrueValidator, TrueValidator, user, updated_request, data
+ ).execute()
+
+
+def test_updated_request_has_pdf(fv_data, e_fv_data):
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ data = {**fv_data, **e_fv_data, "task_order-number": MANUAL_TO_NUMBER}
+ updated_request = UpdateFinancialVerification(
+ TrueValidator, TrueValidator, user, request, data, is_extended=True
+ ).execute()
+ assert updated_request.task_order.pdf
+
+
+def test_can_save_draft_with_just_pdf(e_fv_data):
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ data = {"task_order-pdf": e_fv_data["task_order-pdf"]}
+ SaveFinancialVerificationDraft(
+ TrueValidator, TrueValidator, user, request, data, is_extended=True
+ ).execute()
+
+ form = GetFinancialVerificationForm(user, request, is_extended=True).execute()
+ assert form.task_order.pdf
+
+
+def test_task_order_info_present_in_extended_form(fv_data, e_fv_data):
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ data = {
+ "task_order-clin_0001": "1",
+ "task_order-number": fv_data["task_order-number"],
+ }
+ SaveFinancialVerificationDraft(
+ TrueValidator, TrueValidator, user, request, data, is_extended=True
+ ).execute()
+
+ form = GetFinancialVerificationForm(user, request, is_extended=True).execute()
+ assert form.task_order.clin_0001.data
+
+
+def test_update_ignores_empty_values(fv_data, e_fv_data):
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ data = {**fv_data, **e_fv_data, "task_order-funding_type": ""}
+ SaveFinancialVerificationDraft(
+ TrueValidator, TrueValidator, user, request, data, is_extended=True
+ ).execute()
+
+
+def test_simple_form_does_not_generate_task_order(fv_data):
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ data = pick(["uii_ids"], fv_data)
+ updated_request = SaveFinancialVerificationDraft(
+ TrueValidator, TrueValidator, user, request, data, is_extended=False
+ ).execute()
+
+ assert updated_request.task_order is None
+
+
+def test_can_save_draft_with_funding_type(fv_data, e_fv_data):
+ request = RequestFactory.create()
+ user = UserFactory.create()
+ data = {
+ "task_order-number": fv_data["task_order-number"],
+ "task_order-funding_type": e_fv_data["task_order-funding_type"],
+ }
+ updated_request = SaveFinancialVerificationDraft(
+ TrueValidator, TrueValidator, user, request, data, is_extended=False
+ ).execute()
+
+ assert updated_request.task_order.funding_type
+
+
+def test_update_fv_route(client, user_session, fv_data):
+ user = UserFactory.create()
+ request = RequestFactory.create(creator=user)
+ user_session(user)
+ response = client.post(
+ url_for("requests.financial_verification", request_id=request.id),
+ data=fv_data,
+ follow_redirects=False,
+ )
+
+ assert response.status_code == 200
+
+
+def test_save_fv_draft_route(client, user_session, fv_data):
+ user = UserFactory.create()
+ request = RequestFactory.create(creator=user)
+ user_session(user)
+ response = client.post(
+ url_for("requests.save_financial_verification_draft", request_id=request.id),
+ data=fv_data,
+ follow_redirects=False,
+ )
+
+ assert response.status_code == 200
+
+
+def test_get_fv_form_route(client, user_session, fv_data):
+ user = UserFactory.create()
+ request = RequestFactory.create(creator=user)
+ user_session(user)
+ response = client.get(
+ url_for("requests.financial_verification", request_id=request.id),
+ data=fv_data,
+ follow_redirects=False,
+ )
+
+ assert response.status_code == 200
+
+
+def test_manual_task_order_triggers_extended_form(
+ client, user_session, fv_data, e_fv_data
+):
+ user = UserFactory.create()
+ request = RequestFactory.create(creator=user)
+
+ data = {**fv_data, **e_fv_data, "task_order-number": MANUAL_TO_NUMBER}
+
+ UpdateFinancialVerification(
+ TrueValidator, TrueValidator, user, request, data, is_extended=True
+ ).execute()
+
+ user_session(user)
+ response = client.get(
+ url_for("requests.financial_verification", request_id=request.id),
+ data=fv_data,
+ follow_redirects=False,
+ )
+ assert "extended" in response.headers["Location"]
+
+
+def test_manual_to_does_not_trigger_approval(client, user_session, fv_data, e_fv_data):
+ user = UserFactory.create()
+ request = RequestFactory.create(creator=user)
+ data = {
+ **fv_data,
+ **e_fv_data,
+ "task_order-number": MANUAL_TO_NUMBER,
+ "request-pe_id": "0101228N",
+ }
+ user_session(user)
+ client.post(
+ url_for(
+ "requests.financial_verification", request_id=request.id, extended=True
+ ),
+ data=data,
+ follow_redirects=True,
+ )
+
+ updated_request = RequestsQuery.get(request.id)
+ assert updated_request.status != RequestStatus.APPROVED
+
+
+def test_eda_task_order_does_trigger_approval(client, user_session, fv_data, e_fv_data):
+ user = UserFactory.create()
+ request = RequestFactory.create(creator=user)
+ data = {
+ **fv_data,
+ **e_fv_data,
+ "task_order-number": MockEDAClient.MOCK_CONTRACT_NUMBER,
+ "request-pe_id": "0101228N",
+ }
+ user_session(user)
+ client.post(
+ url_for(
+ "requests.financial_verification", request_id=request.id, extended=True
+ ),
+ data=data,
+ follow_redirects=True,
+ )
+
+ updated_request = RequestsQuery.get(request.id)
+ assert updated_request.status == RequestStatus.APPROVED
+
+
+def test_task_order_number_persists_in_form(fv_data, e_fv_data):
+ user = UserFactory.create()
+ request = RequestFactory.create(creator=user)
+ data = {
+ **fv_data,
+ "task_order-number": MANUAL_TO_NUMBER,
+ "request-pe_id": "0101228N",
+ }
+
+ try:
+ UpdateFinancialVerification(
+ TrueValidator, FalseValidator, user, request, data, is_extended=False
+ ).execute()
+ except FormValidationError:
+ pass
+
+ form = GetFinancialVerificationForm(user, request, is_extended=True).execute()
+ assert form.task_order.number.data == MANUAL_TO_NUMBER
+
+
+def test_can_submit_once_to_details_are_entered(fv_data, e_fv_data):
+ user = UserFactory.create()
+ request = RequestFactory.create(creator=user)
+ data = {
+ **fv_data,
+ "task_order-number": MANUAL_TO_NUMBER,
+ "request-pe_id": "0101228N",
+ }
+
+ try:
+ UpdateFinancialVerification(
+ TrueValidator, FalseValidator, user, request, data, is_extended=False
+ ).execute()
+ except FormValidationError:
+ pass
+
+ data = {
+ **fv_data,
+ **e_fv_data,
+ "task_order-number": MANUAL_TO_NUMBER,
+ "request-pe_id": "0101228N",
+ }
+ assert UpdateFinancialVerification(
+ TrueValidator, TrueValidator, user, request, data, is_extended=True
+ ).execute()