Update TO form based on new model
This commit is contained in:
@@ -2,21 +2,21 @@ import datetime
|
||||
import pytest
|
||||
import re
|
||||
|
||||
from atst.domain.invitations import (
|
||||
PortfolioInvitations,
|
||||
InvitationError,
|
||||
WrongUserError,
|
||||
ExpiredError,
|
||||
NotFoundError,
|
||||
)
|
||||
from atst.domain.audit_log import AuditLog
|
||||
from atst.domain.invitations import (
|
||||
ExpiredError,
|
||||
InvitationError,
|
||||
NotFoundError,
|
||||
PortfolioInvitations,
|
||||
WrongUserError,
|
||||
)
|
||||
from atst.models import InvitationStatus
|
||||
|
||||
from tests.factories import (
|
||||
PortfolioFactory,
|
||||
PortfolioInvitationFactory,
|
||||
PortfolioRoleFactory,
|
||||
UserFactory,
|
||||
PortfolioInvitationFactory,
|
||||
)
|
||||
|
||||
|
||||
|
@@ -1,20 +1,28 @@
|
||||
import pytest
|
||||
from flask import url_for
|
||||
|
||||
from atst.domain.task_orders import TaskOrders
|
||||
from atst.domain.permission_sets import PermissionSets
|
||||
from atst.domain.task_orders import TaskOrders
|
||||
from atst.models.attachment import Attachment
|
||||
from atst.routes.task_orders.new import ShowTaskOrderWorkflow, UpdateTaskOrderWorkflow
|
||||
from atst.utils.localization import translate
|
||||
|
||||
from tests.factories import (
|
||||
UserFactory,
|
||||
TaskOrderFactory,
|
||||
PortfolioFactory,
|
||||
PortfolioRoleFactory,
|
||||
TaskOrderFactory,
|
||||
UserFactory,
|
||||
)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def task_order():
|
||||
user = UserFactory.create()
|
||||
portfolio = PortfolioFactory.create(owner=user)
|
||||
attachment = Attachment(filename="sample_attachment", object_name="sample")
|
||||
|
||||
return TaskOrderFactory.create(creator=user, portfolio=portfolio)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def portfolio():
|
||||
return PortfolioFactory.create()
|
||||
@@ -25,143 +33,20 @@ def user():
|
||||
return UserFactory.create()
|
||||
|
||||
|
||||
class TestShowTaskOrderWorkflow:
|
||||
def test_portfolio_when_task_order_exists(self):
|
||||
portfolio = PortfolioFactory.create()
|
||||
task_order = TaskOrderFactory(portfolio=portfolio)
|
||||
assert portfolio.num_task_orders > 0
|
||||
|
||||
workflow = ShowTaskOrderWorkflow(
|
||||
user=task_order.creator, task_order_id=task_order.id
|
||||
)
|
||||
assert portfolio == workflow.portfolio
|
||||
|
||||
def test_portfolio_with_portfolio_id(self):
|
||||
user = UserFactory.create()
|
||||
portfolio = PortfolioFactory.create(owner=user)
|
||||
workflow = ShowTaskOrderWorkflow(
|
||||
user=portfolio.owner, portfolio_id=portfolio.id
|
||||
)
|
||||
assert portfolio == workflow.portfolio
|
||||
def test_task_orders_new():
|
||||
pass
|
||||
|
||||
|
||||
def test_new_task_order(client, user_session):
|
||||
creator = UserFactory.create()
|
||||
user_session()
|
||||
response = client.get(url_for("task_orders.new", screen=1))
|
||||
assert response.status_code == 200
|
||||
def test_task_orders_create():
|
||||
pass
|
||||
|
||||
|
||||
def post_to_task_order_step(client, data, screen, task_order_id=None):
|
||||
return client.post(
|
||||
url_for("task_orders.update", screen=screen, task_order_id=task_order_id),
|
||||
data=data,
|
||||
follow_redirects=False,
|
||||
)
|
||||
def test_task_orders_edit():
|
||||
pass
|
||||
|
||||
|
||||
def slice_data_for_section(task_order_data, section):
|
||||
attrs = TaskOrders.SECTIONS[section]
|
||||
return {k: v for k, v in task_order_data.items() if k in attrs}
|
||||
|
||||
|
||||
def serialize_dates(data):
|
||||
if not data:
|
||||
return data
|
||||
|
||||
dates = {
|
||||
k: v.strftime("%m/%d/%Y") for k, v in data.items() if hasattr(v, "strftime")
|
||||
}
|
||||
|
||||
data.update(dates)
|
||||
|
||||
return data
|
||||
|
||||
|
||||
def test_new_to_can_edit_pf_attributes_screen_1():
|
||||
portfolio = PortfolioFactory.create()
|
||||
workflow = ShowTaskOrderWorkflow(user=portfolio.owner)
|
||||
assert not workflow.pf_attributes_read_only
|
||||
|
||||
|
||||
def test_new_pf_can_edit_pf_attributes_on_back_navigation():
|
||||
portfolio = PortfolioFactory.create()
|
||||
pf_task_order = TaskOrderFactory(portfolio=portfolio)
|
||||
pf_workflow = ShowTaskOrderWorkflow(
|
||||
user=pf_task_order.creator, task_order_id=pf_task_order.id
|
||||
)
|
||||
assert not pf_workflow.pf_attributes_read_only
|
||||
|
||||
|
||||
def test_to_on_pf_cannot_edit_pf_attributes():
|
||||
portfolio = PortfolioFactory.create()
|
||||
pf_task_order = TaskOrderFactory(portfolio=portfolio)
|
||||
|
||||
workflow = ShowTaskOrderWorkflow(user=portfolio.owner, portfolio_id=portfolio.id)
|
||||
assert portfolio.num_task_orders == 1
|
||||
assert workflow.pf_attributes_read_only
|
||||
|
||||
second_task_order = TaskOrderFactory(portfolio=portfolio)
|
||||
second_workflow = ShowTaskOrderWorkflow(
|
||||
user=portfolio.owner, task_order_id=second_task_order.id
|
||||
)
|
||||
assert portfolio.num_task_orders > 1
|
||||
assert second_workflow.pf_attributes_read_only
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="Reimplement after TO form is updated")
|
||||
def test_create_new_task_order(client, user_session, pdf_upload):
|
||||
creator = UserFactory.create()
|
||||
user_session(creator)
|
||||
|
||||
task_order_data = TaskOrderFactory.dictionary()
|
||||
app_info_data = slice_data_for_section(task_order_data, "app_info")
|
||||
|
||||
response = client.post(
|
||||
url_for("task_orders.update", screen=1),
|
||||
data=app_info_data,
|
||||
follow_redirects=False,
|
||||
)
|
||||
assert url_for("task_orders.new", screen=2) in response.headers["Location"]
|
||||
|
||||
created_task_order_id = response.headers["Location"].split("/")[-1]
|
||||
created_task_order = TaskOrders.get(created_task_order_id)
|
||||
assert created_task_order.portfolio is not None
|
||||
|
||||
funding_data = slice_data_for_section(task_order_data, "funding")
|
||||
funding_data = serialize_dates(funding_data)
|
||||
response = client.post(
|
||||
response.headers["Location"], data=funding_data, follow_redirects=False
|
||||
)
|
||||
assert url_for("task_orders.new", screen=3) in response.headers["Location"]
|
||||
|
||||
oversight_data = slice_data_for_section(task_order_data, "oversight")
|
||||
response = client.post(
|
||||
response.headers["Location"], data=oversight_data, follow_redirects=False
|
||||
)
|
||||
assert url_for("task_orders.new", screen=4) in response.headers["Location"]
|
||||
|
||||
|
||||
def test_create_new_task_order_for_portfolio(client, user_session):
|
||||
portfolio = PortfolioFactory.create()
|
||||
creator = portfolio.owner
|
||||
user_session(creator)
|
||||
|
||||
task_order_data = TaskOrderFactory.dictionary()
|
||||
app_info_data = slice_data_for_section(task_order_data, "app_info")
|
||||
app_info_data["portfolio_name"] = portfolio.name
|
||||
|
||||
response = client.post(
|
||||
url_for("task_orders.update", screen=1, portfolio_id=portfolio.id),
|
||||
data=app_info_data,
|
||||
follow_redirects=False,
|
||||
)
|
||||
assert url_for("task_orders.new", screen=2) in response.headers["Location"]
|
||||
|
||||
created_task_order_id = response.headers["Location"].split("/")[-1]
|
||||
created_task_order = TaskOrders.get(created_task_order_id)
|
||||
assert created_task_order.portfolio_name == portfolio.name
|
||||
assert created_task_order.portfolio == portfolio
|
||||
def test_task_orders_update():
|
||||
pass
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="Update after implementing new TO form")
|
||||
@@ -186,87 +71,15 @@ def test_task_order_form_shows_errors(client, user_session, task_order):
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="Update after implementing new TO form")
|
||||
def test_review_screen_when_all_sections_complete(client, user_session, task_order):
|
||||
user_session(task_order.creator)
|
||||
response = client.get(
|
||||
url_for("task_orders.new", screen=4, task_order_id=task_order.id)
|
||||
)
|
||||
|
||||
body = response.data.decode()
|
||||
assert translate("task_orders.form.draft_alert_title") not in body
|
||||
assert response.status_code == 200
|
||||
def test_task_order_review_when_complete(client, user_session, task_order):
|
||||
pass
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="Update after implementing new TO form")
|
||||
def test_review_screen_when_not_all_sections_complete(client, user_session, task_order):
|
||||
TaskOrders.update(task_order, clin_01=None)
|
||||
user_session(task_order.creator)
|
||||
response = client.get(
|
||||
url_for("task_orders.new", screen=4, task_order_id=task_order.id)
|
||||
)
|
||||
|
||||
body = response.data.decode()
|
||||
assert translate("task_orders.form.draft_alert_title") in body
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def task_order():
|
||||
user = UserFactory.create()
|
||||
portfolio = PortfolioFactory.create(owner=user)
|
||||
attachment = Attachment(filename="sample_attachment", object_name="sample")
|
||||
|
||||
return TaskOrderFactory.create(creator=user, portfolio=portfolio)
|
||||
|
||||
|
||||
def test_show_task_order(task_order):
|
||||
workflow = ShowTaskOrderWorkflow(task_order.creator)
|
||||
assert workflow.task_order is None
|
||||
another_workflow = ShowTaskOrderWorkflow(
|
||||
task_order.creator, task_order_id=task_order.id
|
||||
)
|
||||
assert another_workflow.task_order == task_order
|
||||
|
||||
|
||||
def test_show_task_order_display_screen(task_order):
|
||||
workflow = ShowTaskOrderWorkflow(task_order.creator, task_order_id=task_order.id)
|
||||
screens = workflow.display_screens
|
||||
# every form section is complete
|
||||
for i in range(2):
|
||||
assert screens[i]["completion"] == "complete"
|
||||
# the review section is not
|
||||
assert screens[3]["completion"] == "incomplete"
|
||||
def test_task_order_review_when_not_complete(client, user_session, task_order):
|
||||
pass
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="Update after implementing new TO form")
|
||||
def test_update_task_order_with_existing_task_order(task_order):
|
||||
to_data = serialize_dates(TaskOrderFactory.dictionary())
|
||||
workflow = UpdateTaskOrderWorkflow(
|
||||
task_order.creator, to_data, screen=2, task_order_id=task_order.id
|
||||
)
|
||||
assert workflow.task_order.start_date != to_data["start_date"]
|
||||
workflow.update()
|
||||
assert workflow.task_order.start_date.strftime("%m/%d/%Y") == to_data["start_date"]
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="Update after implementing new TO form")
|
||||
def test_review_task_order_form(client, user_session, task_order):
|
||||
user_session(task_order.creator)
|
||||
|
||||
for idx, section in enumerate(TaskOrders.SECTIONS):
|
||||
response = client.get(
|
||||
url_for("task_orders.new", screen=idx + 1, task_order_id=task_order.id)
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
|
||||
|
||||
@pytest.mark.skip(reason="Reimplement after TO form is updated")
|
||||
def test_mo_redirected_to_build_page(client, user_session, portfolio):
|
||||
user_session(portfolio.owner)
|
||||
task_order = TaskOrderFactory.create(portfolio=portfolio)
|
||||
|
||||
response = client.get(
|
||||
url_for("task_orders.new", screen=1, task_order_id=task_order.id)
|
||||
)
|
||||
assert response.status_code == 200
|
||||
def test_task_order_review_and_sign(client, user_session, task_order):
|
||||
pass
|
||||
|
@@ -3,11 +3,11 @@ from urllib.parse import quote
|
||||
|
||||
from tests.factories import UserFactory
|
||||
|
||||
|
||||
PROTECTED_URL = "/task_orders/new/get_started"
|
||||
# TODO: update w/ new home url
|
||||
PROTECTED_URL = "/home"
|
||||
|
||||
|
||||
def test_request_page_with_complete_profile(client, user_session):
|
||||
def test_home_page_with_complete_profile(client, user_session):
|
||||
user = UserFactory.create()
|
||||
user_session(user)
|
||||
response = client.get(PROTECTED_URL, follow_redirects=False)
|
||||
|
@@ -13,21 +13,20 @@ from atst.models import CSPRole, PortfolioRoleStatus, ApplicationRoleStatus
|
||||
from tests.factories import *
|
||||
|
||||
_NO_ACCESS_CHECK_REQUIRED = _NO_LOGIN_REQUIRED + [
|
||||
"task_orders.get_started", # all users can start a new TO
|
||||
"atst.csp_environment_access", # internal redirect
|
||||
"atst.jedi_csp_calculator", # internal redirect
|
||||
"atst.styleguide", # dev reference
|
||||
"dev.test_email", # dev tool
|
||||
"dev.messages", # dev tool
|
||||
"atst.home", # available to all users
|
||||
"users.user", # available to all users
|
||||
"users.update_user", # available to all users
|
||||
"portfolios.accept_invitation", # available to all users; access control is built into invitation logic
|
||||
"applications.accept_invitation", # available to all users; access control is built into invitation logic
|
||||
"atst.catch_all", # available to all users
|
||||
"portfolios.portfolios", # the portfolios list is scoped to the user separately
|
||||
"atst.csp_environment_access", # internal redirect
|
||||
"atst.home", # available to all users
|
||||
"atst.jedi_csp_calculator", # internal redirect
|
||||
"atst.styleguide", # dev reference
|
||||
"dev.messages", # dev tool
|
||||
"dev.test_email", # dev tool
|
||||
"portfolios.accept_invitation", # available to all users; access control is built into invitation logic
|
||||
"portfolios.create_portfolio", # create a portfolio"portfolios.portfolios", # the portfolios list is scoped to the user separately
|
||||
"portfolios.new_portfolio", # all users can create a portfolio
|
||||
"portfolios.create_portfolio", # create a portfolio
|
||||
"task_orders.get_started", # all users can start a new TO
|
||||
"users.update_user", # available to all users
|
||||
"users.user", # available to all users
|
||||
]
|
||||
|
||||
|
||||
@@ -479,25 +478,14 @@ def test_task_orders_download_task_order_pdf_access(get_url_assert_status, monke
|
||||
|
||||
|
||||
# task_orders.new
|
||||
@pytest.mark.skip(reason="Update after new TO form implemented")
|
||||
def test_task_orders_new_access(get_url_assert_status):
|
||||
ccpo = user_with(PermissionSets.EDIT_PORTFOLIO_FUNDING)
|
||||
owner = user_with()
|
||||
rando = user_with()
|
||||
|
||||
url = url_for("task_orders.new", screen=1)
|
||||
get_url_assert_status(owner, url, 200)
|
||||
get_url_assert_status(ccpo, url, 200)
|
||||
get_url_assert_status(rando, url, 200)
|
||||
|
||||
portfolio = PortfolioFactory.create(owner=owner)
|
||||
task_order = TaskOrderFactory.create(portfolio=portfolio)
|
||||
|
||||
url = url_for("task_orders.new", screen=2, task_order_id=task_order.id)
|
||||
get_url_assert_status(owner, url, 200)
|
||||
get_url_assert_status(ccpo, url, 200)
|
||||
get_url_assert_status(rando, url, 404)
|
||||
|
||||
url = url_for("task_orders.new", screen=1, portfolio_id=portfolio.id)
|
||||
url = url_for("task_orders.new", portfolio_id=portfolio.id)
|
||||
get_url_assert_status(owner, url, 200)
|
||||
get_url_assert_status(ccpo, url, 200)
|
||||
get_url_assert_status(rando, url, 404)
|
||||
|
Reference in New Issue
Block a user