Add tests for the applications.new routes for adding a new member and updating a member

Add tests for creating and updating app member helper methods
This commit is contained in:
leigh-mil 2019-11-18 14:09:52 -05:00
parent f9fd9cac13
commit 7c8717c2fe
4 changed files with 146 additions and 6 deletions

View File

@ -157,6 +157,10 @@ def view_new_application_step_3(application_id):
@applications_bp.route("/applications/<application_id>/new/step_3", methods=["POST"]) @applications_bp.route("/applications/<application_id>/new/step_3", methods=["POST"])
@applications_bp.route(
"/applications/<application_id>/new/step_3/member/<application_role_id>",
methods=["POST"],
)
@user_can(Permissions.CREATE_APPLICATION, message="view create new application form") @user_can(Permissions.CREATE_APPLICATION, message="view create new application form")
def update_new_application_step_3(application_id, application_role_id=None): def update_new_application_step_3(application_id, application_role_id=None):
if application_role_id: if application_role_id:

View File

@ -5,6 +5,7 @@ import alembic.command
from logging.config import dictConfig from logging.config import dictConfig
from werkzeug.datastructures import FileStorage from werkzeug.datastructures import FileStorage
from collections import OrderedDict from collections import OrderedDict
from unittest.mock import Mock
from atst.app import make_app, make_config from atst.app import make_app, make_config
from atst.database import db as _db from atst.database import db as _db

View File

@ -1,6 +1,11 @@
from flask import url_for from flask import url_for
from tests.factories import PortfolioFactory, ApplicationFactory, UserFactory from tests.factories import (
PortfolioFactory,
ApplicationFactory,
UserFactory,
ApplicationRoleFactory,
)
from unittest.mock import Mock from unittest.mock import Mock
from atst.forms.data import ENV_ROLE_NO_ACCESS as NO_ACCESS from atst.forms.data import ENV_ROLE_NO_ACCESS as NO_ACCESS
from atst.models.application_invitation import ApplicationInvitation from atst.models.application_invitation import ApplicationInvitation
@ -109,7 +114,7 @@ def test_get_members(client, session, user_session):
assert response.status_code == 200 assert response.status_code == 200
def test_post_member(monkeypatch, client, user_session, session): def test_post_new_member(monkeypatch, client, user_session, session):
job_mock = Mock() job_mock = Mock()
monkeypatch.setattr("atst.jobs.send_mail.delay", job_mock) monkeypatch.setattr("atst.jobs.send_mail.delay", job_mock)
user = UserFactory.create() user = UserFactory.create()
@ -121,7 +126,9 @@ def test_post_member(monkeypatch, client, user_session, session):
user_session(application.portfolio.owner) user_session(application.portfolio.owner)
response = client.post( response = client.post(
url_for("applications.create_member", application_id=application.id), url_for(
"applications.update_new_application_step_3", application_id=application.id
),
data={ data={
"user_data-first_name": user.first_name, "user_data-first_name": user.first_name,
"user_data-last_name": user.last_name, "user_data-last_name": user.last_name,
@ -141,10 +148,8 @@ def test_post_member(monkeypatch, client, user_session, session):
assert response.status_code == 302 assert response.status_code == 302
expected_url = url_for( expected_url = url_for(
"applications.settings", "applications.view_new_application_step_3",
application_id=application.id, application_id=application.id,
fragment="application-members",
_anchor="application-members",
_external=True, _external=True,
) )
assert response.location == expected_url assert response.location == expected_url
@ -159,3 +164,43 @@ def test_post_member(monkeypatch, client, user_session, session):
assert invitation.role.application == application assert invitation.role.application == application
assert job_mock.called assert job_mock.called
def test_post_update_member(client, user_session):
user = UserFactory.create()
application = ApplicationFactory.create(
environments=[{"name": "Naboo"}, {"name": "Endor"}]
)
(env, env_1) = application.environments
app_role = ApplicationRoleFactory(application=application)
user_session(application.portfolio.owner)
response = client.post(
url_for(
"applications.update_new_application_step_3",
application_id=application.id,
application_role_id=app_role.id,
),
data={
"environment_roles-0-environment_id": env.id,
"environment_roles-0-role": "Basic Access",
"environment_roles-0-environment_name": env.name,
"environment_roles-1-environment_id": env_1.id,
"environment_roles-1-role": NO_ACCESS,
"environment_roles-1-environment_name": env_1.name,
"perms_env_mgmt": True,
"perms_team_mgmt": True,
"perms_del_env": True,
},
)
assert response.status_code == 302
expected_url = url_for(
"applications.view_new_application_step_3",
application_id=application.id,
_external=True,
)
assert response.location == expected_url
assert len(application.roles) == 1
assert len(app_role.environment_roles) == 1
assert app_role.environment_roles[0].environment == env

View File

@ -2,6 +2,8 @@ import uuid
from flask import url_for, get_flashed_messages from flask import url_for, get_flashed_messages
from unittest.mock import Mock from unittest.mock import Mock
import datetime import datetime
from werkzeug.datastructures import ImmutableMultiDict
import pytest
from tests.factories import * from tests.factories import *
@ -20,6 +22,8 @@ from atst.routes.applications.settings import (
filter_env_roles_form_data, filter_env_roles_form_data,
filter_env_roles_data, filter_env_roles_data,
get_environments_obj_for_app, get_environments_obj_for_app,
handle_create_member,
handle_update_member,
) )
from tests.utils import captured_templates from tests.utils import captured_templates
@ -658,3 +662,89 @@ def test_filter_env_roles_data():
# ensure that the environment roles and environments are associated with the # ensure that the environment roles and environments are associated with the
# same application. # same application.
assert [env["environment_name"] for env in env_role_data] == ["a", "b", "c"] assert [env["environment_name"] for env in env_role_data] == ["a", "b", "c"]
@pytest.fixture
def set_g(monkeypatch):
_g = Mock()
monkeypatch.setattr("atst.app.g", _g)
monkeypatch.setattr("atst.routes.applications.settings.g", _g)
def _set_g(attr, val):
setattr(_g, attr, val)
yield _set_g
def test_handle_create_member(monkeypatch, set_g, session):
user = UserFactory.create()
application = ApplicationFactory.create(
environments=[{"name": "Naboo"}, {"name": "Endor"}]
)
(env, env_1) = application.environments
job_mock = Mock()
monkeypatch.setattr("atst.jobs.send_mail.delay", job_mock)
set_g("current_user", application.portfolio.owner)
set_g("portfolio", application.portfolio)
set_g("application", application)
form_data = ImmutableMultiDict(
{
"user_data-first_name": user.first_name,
"user_data-last_name": user.last_name,
"user_data-dod_id": user.dod_id,
"user_data-email": user.email,
"environment_roles-0-environment_id": env.id,
"environment_roles-0-role": "Basic Access",
"environment_roles-0-environment_name": env.name,
"environment_roles-1-environment_id": env_1.id,
"environment_roles-1-role": NO_ACCESS,
"environment_roles-1-environment_name": env_1.name,
"perms_env_mgmt": True,
"perms_team_mgmt": True,
"perms_del_env": True,
}
)
handle_create_member(application.id, form_data)
assert len(application.roles) == 1
environment_roles = application.roles[0].environment_roles
assert len(environment_roles) == 1
assert environment_roles[0].environment == env
invitation = (
session.query(ApplicationInvitation).filter_by(dod_id=user.dod_id).one()
)
assert invitation.role.application == application
assert job_mock.called
def test_handle_update_member(set_g):
user = UserFactory.create()
application = ApplicationFactory.create(
environments=[{"name": "Naboo"}, {"name": "Endor"}]
)
(env, env_1) = application.environments
app_role = ApplicationRoleFactory(application=application)
set_g("current_user", application.portfolio.owner)
set_g("portfolio", application.portfolio)
set_g("application", application)
form_data = ImmutableMultiDict(
{
"environment_roles-0-environment_id": env.id,
"environment_roles-0-role": "Basic Access",
"environment_roles-0-environment_name": env.name,
"environment_roles-1-environment_id": env_1.id,
"environment_roles-1-role": NO_ACCESS,
"environment_roles-1-environment_name": env_1.name,
"perms_env_mgmt": True,
"perms_team_mgmt": True,
"perms_del_env": True,
}
)
handle_update_member(application.id, app_role.id, form_data)
assert len(application.roles) == 1
assert len(app_role.environment_roles) == 1
assert app_role.environment_roles[0].environment == env