Merge branch 'master' into view-task-order
This commit is contained in:
commit
af5cf88e6d
@ -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)
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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>
|
||||||
|
@ -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",
|
||||||
|
@ -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>
|
||||||
|
11
tests/routes/task_orders/test_invite.py
Normal file
11
tests/routes/task_orders/test_invite.py
Normal 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
|
||||||
|
)
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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):
|
||||||
|
@ -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")
|
||||||
|
@ -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
|
|
Loading…
x
Reference in New Issue
Block a user