def test_create_does_not_duplicate_names_within_portfolio(): portfolio = PortfolioFactory.create() name = "An Awesome Application" assert Applications.create(portfolio.owner, portfolio, name, "") with pytest.raises(AlreadyExistsError): Applications.create(portfolio.owner, portfolio, name, "")
def test_scoped_portfolio_returns_all_applications_for_portfolio_owner( portfolio, portfolio_owner): for _ in range(5): Applications.create( portfolio.owner, portfolio, "My Application", "My application", ["dev", "staging", "prod"], ) scoped_portfolio = Portfolios.get(portfolio_owner, portfolio.id) assert len(scoped_portfolio.applications) == 5 assert len(scoped_portfolio.applications[0].environments) == 3
def create_or_update_new_application_step_1(portfolio_id=None, application_id=None): form = get_new_application_form({**http_request.form}, NameAndDescriptionForm, application_id) if form.validate(): application = None if application_id: application = Applications.get(application_id) application = Applications.update(application, form.data) flash("application_updated", application_name=application.name) else: portfolio = Portfolios.get_for_update(portfolio_id) application = Applications.create(g.current_user, portfolio, **form.data) flash("application_created", application_name=application.name) return redirect( url_for( "applications.update_new_application_step_2", application_id=application.id, )) else: return ( render_new_application_form( "applications/new/step_1.html", NameAndDescriptionForm, portfolio_id, application_id, form, ), 400, )
def test_create_application_with_multiple_environments(): portfolio = PortfolioFactory.create() application = Applications.create(portfolio.owner, portfolio, "My Test Application", "Test", ["dev", "prod"]) assert application.portfolio == portfolio assert application.name == "My Test Application" assert application.description == "Test" assert sorted(e.name for e in application.environments) == ["dev", "prod"]
def test_scoped_portfolio_for_admin_missing_view_apps_perms( portfolio_owner, portfolio): Applications.create( portfolio.owner, portfolio, "My Application 2", "My application 2", ["dev", "staging", "prod"], ) restricted_admin = UserFactory.create() PortfolioRoleFactory.create( portfolio=portfolio, user=restricted_admin, permission_sets=[PermissionSets.get(PermissionSets.VIEW_PORTFOLIO)], ) scoped_portfolio = Portfolios.get(restricted_admin, portfolio.id) assert scoped_portfolio.id == portfolio.id assert len(portfolio.applications) == 1 assert len(scoped_portfolio.applications) == 0
def test_scoped_portfolio_returns_all_applications_for_portfolio_admin( portfolio, portfolio_owner): for _ in range(5): Applications.create( portfolio.owner, portfolio, "My Application", "My application", ["dev", "staging", "prod"], ) admin = UserFactory.create() perm_sets = get_all_portfolio_permission_sets() PortfolioRoleFactory.create(user=admin, portfolio=portfolio, permission_sets=perm_sets) scoped_portfolio = Portfolios.get(admin, portfolio.id) assert len(scoped_portfolio.applications) == 5 assert len(scoped_portfolio.applications[0].environments) == 3
def test_application_settings(client, user_session): portfolio = PortfolioFactory.create() application = Applications.create( portfolio.owner, portfolio, "Snazzy Application", "A new application for me and my friends", {"env1", "env2"}, ) user_session(portfolio.owner) response = client.get( url_for("applications.settings", application_id=application.id)) assert response.status_code == 200 # the assertion below is a quick check to prevent regressions -- this ensures that # the correct URL for creating a member for an application is _somewhere_ in # the settings page. assert (url_for("applications.create_member", application_id=application.id) in response.data.decode())
def add_applications_to_portfolio(portfolio): applications = random_applications() for application_data in applications: application = Applications.create( portfolio.owner, portfolio=portfolio, name=application_data["name"], description=application_data["description"], environment_names=application_data["environments"], ) users = random.sample(APPLICATION_USERS, k=random.randint(1, 5)) for user_data in users: try: user = Users.get_by_dod_id(user_data["dod_id"]) except NotFoundError: user = Users.create( user_data["dod_id"], None, first_name=user_data["first_name"], last_name=user_data["last_name"], email=user_data["email"], ) app_role = ApplicationRoles.create( user=user, application=application, permission_set_names=[PermissionSets.EDIT_APPLICATION_TEAM], ) ApplicationInvitations.create(portfolio.owner, app_role, user_data, commit=True) user_environments = random.sample( application.environments, k=random.randint(1, len(application.environments)), ) for env in user_environments: role = random.choice([e.value for e in CSPRole]) EnvironmentRoles.create(application_role=app_role, environment=env, role=role)
def test_edit_application_environments_obj(app, client, user_session): portfolio = PortfolioFactory.create() application = Applications.create( portfolio.owner, portfolio, "Snazzy Application", "A new application for me and my friends", {"env"}, ) env = application.environments[0] app_role1 = ApplicationRoleFactory.create(application=application) env_role1 = EnvironmentRoleFactory.create(application_role=app_role1, environment=env, role=CSPRole.BASIC_ACCESS.value) app_role2 = ApplicationRoleFactory.create(application=application, user=None) env_role2 = EnvironmentRoleFactory.create(application_role=app_role2, environment=env, role=CSPRole.NETWORK_ADMIN.value) user_session(portfolio.owner) with captured_templates(app) as templates: response = app.test_client().get( url_for("applications.settings", application_id=application.id)) assert response.status_code == 200 _, context = templates[-1] env_obj = context["environments_obj"][0] assert env_obj["name"] == env.name assert env_obj["id"] == env.id assert isinstance(env_obj["edit_form"], EditEnvironmentForm) assert { "user_name": app_role1.user_name, "status": env_role1.status.value, } in env_obj["members"] assert { "user_name": app_role2.user_name, "status": env_role2.status.value, } in env_obj["members"] assert isinstance(context["audit_events"], Paginator)
def handle_update_application(form, application_id=None, portfolio_id=None): if form.validate(): application = None try: if application_id: application = Applications.get(application_id) application = Applications.update(application, form.data) flash("application_updated", application_name=application.name) else: portfolio = Portfolios.get_for_update(portfolio_id) application = Applications.create(g.current_user, portfolio, **form.data) flash("application_created", application_name=application.name) return application except AlreadyExistsError: flash("application_name_error", name=form.data["name"]) return False
def test_add_user_to_environment(): owner = UserFactory.create() developer = UserFactory.create() portfolio = PortfolioFactory.create(owner=owner) application = Applications.create( portfolio.owner, portfolio, "my test application", "It's mine.", ["dev", "staging", "prod"], ) dev_environment = application.environments[0] application_role = ApplicationRoleFactory.create(user=developer, application=application) EnvironmentRoleFactory.create( application_role=application_role, environment=dev_environment, role=CSPRole.BASIC_ACCESS.value, ) assert developer in dev_environment.users