diff --git a/atst/app.py b/atst/app.py index 99279958..4c206878 100644 --- a/atst/app.py +++ b/atst/app.py @@ -18,6 +18,7 @@ from atst.routes.dev import bp as dev_routes from atst.routes.errors import make_error_pages from atst.domain.authnid.crl import CRLCache from atst.domain.auth import apply_authentication +from atst.eda_client import MockEDAClient ENV = os.getenv("FLASK_ENV", "dev") @@ -41,6 +42,7 @@ def make_app(config): make_flask_callbacks(app) make_crl_validator(app) register_filters(app) + make_eda_client(app) db.init_app(app) csrf.init_app(app) @@ -139,3 +141,5 @@ def make_crl_validator(app): crl_locations.append(filename.absolute()) app.crl_cache = CRLCache(app.config["CA_CHAIN"], crl_locations, logger=app.logger) +def make_eda_client(app): + app.eda_client = MockEDAClient() diff --git a/atst/forms/financial.py b/atst/forms/financial.py index 72fad1a8..bb55896d 100644 --- a/atst/forms/financial.py +++ b/atst/forms/financial.py @@ -1,10 +1,11 @@ import re from wtforms.fields.html5 import EmailField from wtforms.fields import StringField -from wtforms.validators import Required, Email, Regexp +from wtforms.validators import Required, Email, Regexp, ValidationError from atst.domain.exceptions import NotFoundError from atst.domain.pe_numbers import PENumbers +from atst.domain.task_orders import TaskOrders from .fields import NewlineListField, SelectField from .forms import ValidatedForm @@ -114,7 +115,17 @@ class BaseFinancialForm(ValidatedForm): class FinancialForm(BaseFinancialForm): - pass + def __init__(self, *args, **kwargs): + self.eda_client = kwargs.get("eda_client") + if self.eda_client: + del(kwargs["eda_client"]) + super().__init__(*args, **kwargs) + + def validate_task_order_id(form, field): + try: + TaskOrders.get(field.data, client=form.eda_client) + except NotFoundError: + raise ValidationError("Task Order number not found") class ExtendedFinancialForm(BaseFinancialForm): diff --git a/atst/routes/requests/financial_verification.py b/atst/routes/requests/financial_verification.py index b7fc4993..7eef589f 100644 --- a/atst/routes/requests/financial_verification.py +++ b/atst/routes/requests/financial_verification.py @@ -1,5 +1,6 @@ from flask import render_template, redirect, url_for from flask import request as http_request +from flask import current_app as app from . import requests_bp from atst.domain.requests import Requests @@ -10,7 +11,7 @@ def financial_form(data): if http_request.args.get("extended"): return ExtendedFinancialForm(data=data) else: - return FinancialForm(data=data) + return FinancialForm(data=data, eda_client=app.eda_client) @requests_bp.route("/requests/verify/", methods=["GET"]) diff --git a/tests/forms/test_financial.py b/tests/forms/test_financial.py index 19bb0612..fa9f27bd 100644 --- a/tests/forms/test_financial.py +++ b/tests/forms/test_financial.py @@ -1,6 +1,7 @@ import pytest from atst.forms.financial import suggest_pe_id, FinancialForm, ExtendedFinancialForm +from atst.eda_client import MockEDAClient @pytest.mark.parametrize("input_,expected", [ @@ -67,3 +68,15 @@ def test_ba_code_validation(input_, expected): is_valid = "ba_code" not in form.errors assert is_valid == expected + +def test_task_order_id_validation(): + form_invalid = FinancialForm(data={"task_order_id": "1234"}, eda_client=MockEDAClient()) + form_invalid.validate() + + assert "task_order_id" in form_invalid.errors + + form_valid = FinancialForm(data={"task_order_id": MockEDAClient.MOCK_CONTRACT_NUMBER}, eda_client=MockEDAClient()) + form_valid.validate() + + assert "task_order_id" not in form_valid.errors +