Merge branch 'master' into view-task-order

This commit is contained in:
patricksmithdds 2019-01-11 13:35:37 -05:00 committed by GitHub
commit af5cf88e6d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 30 additions and 47 deletions

View File

@ -64,9 +64,10 @@ def make_app(config):
make_error_pages(app) make_error_pages(app)
app.register_blueprint(bp) app.register_blueprint(bp)
app.register_blueprint(workspace_routes) app.register_blueprint(workspace_routes)
app.register_blueprint(requests_bp)
app.register_blueprint(task_orders_bp) app.register_blueprint(task_orders_bp)
app.register_blueprint(user_routes) app.register_blueprint(user_routes)
app.register_blueprint(requests_bp)
if ENV != "prod": if ENV != "prod":
app.register_blueprint(dev_routes) app.register_blueprint(dev_routes)

View File

@ -1,11 +1,10 @@
from flask import g, redirect, url_for from flask import redirect, url_for, g
from . import task_orders_bp from . import task_orders_bp
from atst.domain.task_orders import TaskOrders from atst.domain.task_orders import TaskOrders
from atst.utils.flash import formatted_flash as flash from atst.utils.flash import formatted_flash as flash
# TODO: add a real implementation for this
@task_orders_bp.route("/task_orders/invite/<task_order_id>", methods=["POST"]) @task_orders_bp.route("/task_orders/invite/<task_order_id>", methods=["POST"])
def invite(task_order_id): def invite(task_order_id):
task_order = TaskOrders.get(g.current_user, task_order_id) task_order = TaskOrders.get(g.current_user, task_order_id)

View File

@ -15,7 +15,6 @@
JEDI Cloud provides commercial Infrastructure as a Service (IaaS) and Platform as a Service (PaaS) offerings to support DoD business and mission operations.<br> JEDI Cloud provides commercial Infrastructure as a Service (IaaS) and Platform as a Service (PaaS) offerings to support DoD business and mission operations.<br>
<b>Anyone with a DoD mission may use JEDI</b>. <b>Anyone with a DoD mission may use JEDI</b>.
</p> </p>
<a class="usa-button" href="{{ url_for('requests.requests_form_new', screen=1) }}"><span>New JEDI Request</span></a>
<h2>Five Steps to the JEDI Cloud</h2> <h2>Five Steps to the JEDI Cloud</h2>
@ -27,7 +26,6 @@
<h3 class="h4">Complete a JEDI Cloud Access Request</h3> <h3 class="h4">Complete a JEDI Cloud Access Request</h3>
<p> <p>
A JEDI Cloud Access Request will inform the the Cloud Computing Program Office (CCPO) about your intention to use JEDI's commercial cloud services and provide the preliminary information needed to grant access. A JEDI Cloud Access Request will inform the the Cloud Computing Program Office (CCPO) about your intention to use JEDI's commercial cloud services and provide the preliminary information needed to grant access.
Any DoD employee with a CAC may initiate this request. <a class="icon-link" href="{{ url_for('requests.requests_form_new', screen=1) }}">Start a Request</a>
</p> </p>
</li> </li>
<li> <li>

View File

@ -2,15 +2,6 @@
<div class="global-navigation sidenav {% if workspace %}global-navigation__context--workspace{% endif %}"> <div class="global-navigation sidenav {% if workspace %}global-navigation__context--workspace{% endif %}">
<ul> <ul>
{{ SidenavItem("Requests",
href="/requests",
icon="document",
active=g.matchesPath('/requests'),
subnav=[
{"label":"New Request", "href":url_for("requests.requests_form_new", screen=1), "icon": "plus", "active": g.matchesPath('/requests/new')},
]
) }}
{{ SidenavItem("New Task Order", {{ SidenavItem("New Task Order",
href=url_for("task_orders.new", screen=1), href=url_for("task_orders.new", screen=1),
icon="plus", icon="plus",

View File

@ -53,10 +53,6 @@
</p> </p>
{% endif %} {% endif %}
<a href="{{ url_for('requests.requests_form_new', screen=1) }}" class='menu__button usa-button'>
{{ "navigation.topbar.request_workspace_link_text" | translate }}
</a>
</div> </div>
</template> </template>
</div> </div>

View File

@ -0,0 +1,11 @@
import pytest
from flask import url_for
from tests.factories import TaskOrderFactory
def test_invite(client):
to = TaskOrderFactory.create()
response = client.post(
url_for("task_orders.invite", task_order_id=to.id), follow_redirects=False
)

View File

@ -4,20 +4,22 @@ from urllib.parse import quote
from tests.factories import UserFactory from tests.factories import UserFactory
PROTECTED_URL = "/workspaces"
def test_request_page_with_complete_profile(client, user_session): def test_request_page_with_complete_profile(client, user_session):
user = UserFactory.create() user = UserFactory.create()
user_session(user) user_session(user)
response = client.get("/requests", follow_redirects=False) response = client.get(PROTECTED_URL, follow_redirects=False)
assert response.status_code == 200 assert response.status_code == 200
def test_redirect_when_profile_missing_fields(client, user_session): def test_redirect_when_profile_missing_fields(client, user_session):
user = UserFactory.create(date_latest_training=None) user = UserFactory.create(date_latest_training=None)
user_session(user) user_session(user)
requested_url = "/requests" response = client.get(PROTECTED_URL, follow_redirects=False)
response = client.get(requested_url, follow_redirects=False)
assert response.status_code == 302 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): 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): def test_completing_user_profile(client, user_session):
user = UserFactory.create(phone_number=None) user = UserFactory.create(phone_number=None)
user_session(user) 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 assert b"You must complete your profile" in response.data
updated_data = {**user.to_dictionary(), "phone_number": "5558675309"} 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) response = client.post(url_for("users.update_user"), data=updated_data)
assert response.status_code == 200 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 response.status_code == 200
assert b"You must complete your profile" not in response.data assert b"You must complete your profile" not in response.data

View File

@ -1,4 +1,5 @@
import pytest import pytest
from flask import url_for
@pytest.fixture @pytest.fixture
@ -10,7 +11,7 @@ def csrf_enabled_app(app):
def test_csrf_error(csrf_enabled_app, client): def test_csrf_error(csrf_enabled_app, client):
response = client.post( response = client.post(
"/requests/new/1", url_for("users.user"),
headers={"Content-Type": "application/x-www-form-urlencoded"}, headers={"Content-Type": "application/x-www-form-urlencoded"},
data="csrf_token=invalid_token", data="csrf_token=invalid_token",
follow_redirects=True, follow_redirects=True,

View File

@ -19,6 +19,7 @@ def test_user_without_workspaces_has_no_workspaces_nav(client, user_session):
assert b'href="/workspaces"' not in response.data 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): def test_request_owner_with_no_workspaces_redirected_to_requests(client, user_session):
request = RequestFactory.create() request = RequestFactory.create()
user_session(request.creator) 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 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): def test_non_owner_user_with_no_workspaces_redirected_to_requests(client, user_session):
user = UserFactory.create() user = UserFactory.create()
@ -86,6 +88,7 @@ def test_non_owner_user_with_mulitple_workspaces_redirected_to_workspaces(
assert "/workspaces" in response.location 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): def test_ccpo_user_redirected_to_requests(client, user_session):
user = UserFactory.from_atat_role("ccpo") user = UserFactory.from_atat_role("ccpo")
for _ in range(3): for _ in range(3):

View File

@ -189,11 +189,11 @@ def test_logout(app, client, monkeypatch):
) )
# create a real session # create a real session
resp = _login(client) resp = _login(client)
resp_success = client.get(url_for("requests.requests_index")) resp_success = client.get(url_for("users.user"))
# verify session is valid # verify session is valid
assert resp_success.status_code == 200 assert resp_success.status_code == 200
client.get(url_for("atst.logout")) 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 # verify that logging out has cleared the session
assert resp_failure.status_code == 302 assert resp_failure.status_code == 302
destination = urlparse(resp_failure.headers["Location"]).path destination = urlparse(resp_failure.headers["Location"]).path
@ -208,6 +208,6 @@ def test_redirected_on_login(client, monkeypatch):
"atst.domain.authnid.AuthenticationContext.get_user", "atst.domain.authnid.AuthenticationContext.get_user",
lambda *args: UserFactory.create(), 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) response = _login(client, next=target_route)
assert target_route in response.headers.get("Location") assert target_route in response.headers.get("Location")

View File

@ -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