mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-24 00:07:02 -04:00
Removed dead code and dead depcrecated route
This commit is contained in:
20
.ds.baseline
20
.ds.baseline
@@ -483,24 +483,6 @@
|
|||||||
"is_secret": false
|
"is_secret": false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"tests/app/main/views/organizations/test_organization_invites.py": [
|
|
||||||
{
|
|
||||||
"type": "Secret Keyword",
|
|
||||||
"filename": "tests/app/main/views/organizations/test_organization_invites.py",
|
|
||||||
"hashed_secret": "bdbb156d25d02fd7792865824201dda1c60f4473",
|
|
||||||
"is_verified": false,
|
|
||||||
"line_number": 274,
|
|
||||||
"is_secret": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "Secret Keyword",
|
|
||||||
"filename": "tests/app/main/views/organizations/test_organization_invites.py",
|
|
||||||
"hashed_secret": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8",
|
|
||||||
"is_verified": false,
|
|
||||||
"line_number": 282,
|
|
||||||
"is_secret": false
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"tests/app/main/views/test_accept_invite.py": [
|
"tests/app/main/views/test_accept_invite.py": [
|
||||||
{
|
{
|
||||||
"type": "Secret Keyword",
|
"type": "Secret Keyword",
|
||||||
@@ -634,5 +616,5 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"generated_at": "2025-10-14T19:59:45Z"
|
"generated_at": "2025-10-30T18:36:19Z"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -634,26 +634,6 @@ class RegisterUserFromInviteForm(RegisterUserForm):
|
|||||||
raise ValidationError("Cannot be empty")
|
raise ValidationError("Cannot be empty")
|
||||||
|
|
||||||
|
|
||||||
class RegisterUserFromOrgInviteForm(StripWhitespaceForm):
|
|
||||||
def __init__(self, invited_org_user):
|
|
||||||
super().__init__(
|
|
||||||
organization=invited_org_user.organization,
|
|
||||||
email_address=invited_org_user.email_address,
|
|
||||||
)
|
|
||||||
|
|
||||||
name = UsaTextInputField(
|
|
||||||
"Full name", validators=[DataRequired(message="Cannot be empty")]
|
|
||||||
)
|
|
||||||
|
|
||||||
mobile_number = InternationalPhoneNumber(
|
|
||||||
"Mobile number", validators=[DataRequired(message="Cannot be empty")]
|
|
||||||
)
|
|
||||||
password = password()
|
|
||||||
organization = HiddenField("organization")
|
|
||||||
email_address = HiddenField("email_address")
|
|
||||||
auth_type = HiddenField("auth_type", validators=[DataRequired()])
|
|
||||||
|
|
||||||
|
|
||||||
def uswds_checkbox_field_widget(self, field, param_extensions=None, **kwargs):
|
def uswds_checkbox_field_widget(self, field, param_extensions=None, **kwargs):
|
||||||
# error messages
|
# error messages
|
||||||
error_message = None
|
error_message = None
|
||||||
|
|||||||
@@ -140,4 +140,4 @@ def accept_org_invite(token):
|
|||||||
url_for("main.organization_dashboard", org_id=invited_org_user.organization)
|
url_for("main.organization_dashboard", org_id=invited_org_user.organization)
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
return redirect(url_for("main.register_from_org_invite"))
|
return redirect(url_for("main.sign_in"))
|
||||||
|
|||||||
@@ -1,26 +1,13 @@
|
|||||||
import json
|
import json
|
||||||
import uuid
|
import uuid
|
||||||
from datetime import datetime, timedelta
|
|
||||||
from urllib.parse import unquote
|
from urllib.parse import unquote
|
||||||
|
|
||||||
from flask import (
|
from flask import abort, current_app, flash, redirect, render_template, request, url_for
|
||||||
abort,
|
|
||||||
current_app,
|
|
||||||
flash,
|
|
||||||
redirect,
|
|
||||||
render_template,
|
|
||||||
request,
|
|
||||||
session,
|
|
||||||
url_for,
|
|
||||||
)
|
|
||||||
|
|
||||||
from app import redis_client, user_api_client
|
from app import redis_client, user_api_client
|
||||||
from app.enums import InvitedUserStatus
|
from app.enums import InvitedUserStatus
|
||||||
from app.main import main
|
from app.main import main
|
||||||
from app.main.forms import (
|
from app.main.forms import SetupUserProfileForm
|
||||||
RegisterUserFromOrgInviteForm,
|
|
||||||
SetupUserProfileForm,
|
|
||||||
)
|
|
||||||
from app.main.views import sign_in
|
from app.main.views import sign_in
|
||||||
from app.main.views.verify import activate_user
|
from app.main.views.verify import activate_user
|
||||||
from app.models.user import InvitedOrgUser, InvitedUser, User
|
from app.models.user import InvitedOrgUser, InvitedUser, User
|
||||||
@@ -34,69 +21,6 @@ def register():
|
|||||||
abort(404)
|
abort(404)
|
||||||
|
|
||||||
|
|
||||||
@main.route("/register-from-org-invite", methods=["GET", "POST"])
|
|
||||||
# TODO This is deprecated, we are now handling invites in the
|
|
||||||
# login.gov workflow. Leaving it here until we write the new
|
|
||||||
# org registration.
|
|
||||||
def register_from_org_invite():
|
|
||||||
invited_org_user = InvitedOrgUser.from_session()
|
|
||||||
if not invited_org_user:
|
|
||||||
abort(404, "No invited_org_user")
|
|
||||||
|
|
||||||
form = RegisterUserFromOrgInviteForm(
|
|
||||||
invited_org_user,
|
|
||||||
)
|
|
||||||
form.auth_type.data = "sms_auth"
|
|
||||||
|
|
||||||
if form.validate_on_submit():
|
|
||||||
if (
|
|
||||||
form.organization.data != invited_org_user.organization
|
|
||||||
or form.email_address.data != invited_org_user.email_address
|
|
||||||
):
|
|
||||||
abort(400, "organization or email address doesn't match")
|
|
||||||
_do_registration(
|
|
||||||
form,
|
|
||||||
send_email=False,
|
|
||||||
send_sms=True,
|
|
||||||
organization_id=invited_org_user.organization,
|
|
||||||
)
|
|
||||||
invited_org_user.accept_invite()
|
|
||||||
|
|
||||||
return redirect(url_for("main.verify"))
|
|
||||||
return render_template(
|
|
||||||
"views/register-from-org-invite.html",
|
|
||||||
invited_org_user=invited_org_user,
|
|
||||||
form=form,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def _do_registration(form, send_sms=True, send_email=True, organization_id=None):
|
|
||||||
user = User.from_email_address_or_none(form.email_address.data)
|
|
||||||
if user:
|
|
||||||
if send_email:
|
|
||||||
user.send_already_registered_email()
|
|
||||||
session["expiry_date"] = str(datetime.utcnow() + timedelta(hours=1))
|
|
||||||
session["user_details"] = {"email": user.email_address, "id": user.id}
|
|
||||||
else:
|
|
||||||
user = User.register(
|
|
||||||
name=form.name.data,
|
|
||||||
email_address=form.email_address.data,
|
|
||||||
mobile_number=form.mobile_number.data,
|
|
||||||
password=form.password.data,
|
|
||||||
auth_type=form.auth_type.data,
|
|
||||||
)
|
|
||||||
|
|
||||||
if send_email:
|
|
||||||
user.send_verify_email()
|
|
||||||
|
|
||||||
if send_sms:
|
|
||||||
user.send_verify_code()
|
|
||||||
session["expiry_date"] = str(datetime.utcnow() + timedelta(hours=1))
|
|
||||||
session["user_details"] = {"email": user.email_address, "id": user.id}
|
|
||||||
if organization_id:
|
|
||||||
session["organization_id"] = organization_id
|
|
||||||
|
|
||||||
|
|
||||||
@main.route("/registration-continue")
|
@main.route("/registration-continue")
|
||||||
def registration_continue():
|
def registration_continue():
|
||||||
abort(404)
|
abort(404)
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
{% extends "base.html" %}
|
|
||||||
{% from "components/page-footer.html" import page_footer %}
|
|
||||||
{% from "components/form.html" import form_wrapper %}
|
|
||||||
|
|
||||||
{% block per_page_title %}
|
|
||||||
Create an account
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block maincolumn_content %}
|
|
||||||
|
|
||||||
<div class="grid-row">
|
|
||||||
<div class="grid-col-8">
|
|
||||||
<h1 class="font-body-2xl margin-bottom-3">Create an account</h1>
|
|
||||||
<p>Your account will be created with this email: {{invited_org_user.email_address}}</p>
|
|
||||||
{% call form_wrapper() %}
|
|
||||||
{{ form.name(param_extensions={}) }}
|
|
||||||
<div class="extra-tracking">
|
|
||||||
{{ form.mobile_number(param_extensions={
|
|
||||||
"hint": {"text": "We’ll send you a security code by text message"}
|
|
||||||
}) }}
|
|
||||||
</div>
|
|
||||||
{{ form.password(param_extensions={
|
|
||||||
"hint": {"text": "At least 8 characters"},
|
|
||||||
"autocomplete": "new-password"
|
|
||||||
}) }}
|
|
||||||
{{ page_footer("Continue") }}
|
|
||||||
{{form.organization}}
|
|
||||||
{{form.email_address}}
|
|
||||||
{% endcall %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
200
gulpfile.js
200
gulpfile.js
@@ -1,200 +0,0 @@
|
|||||||
const { src, dest, series } = require('gulp');
|
|
||||||
const mergeStream = require('merge-stream');
|
|
||||||
const uswds = require('@uswds/compile');
|
|
||||||
const { exec } = require('child_process');
|
|
||||||
const plugins = {};
|
|
||||||
plugins.addSrc = require('gulp-add-src');
|
|
||||||
plugins.babel = require('gulp-babel');
|
|
||||||
plugins.cleanCSS = require('gulp-clean-css');
|
|
||||||
plugins.concat = require('gulp-concat');
|
|
||||||
plugins.prettyerror = require('gulp-prettyerror');
|
|
||||||
plugins.uglify = require('gulp-uglify');
|
|
||||||
|
|
||||||
const paths = {
|
|
||||||
src: 'app/assets/',
|
|
||||||
dist: 'app/static/',
|
|
||||||
npm: 'node_modules/'
|
|
||||||
};
|
|
||||||
|
|
||||||
const javascripts = () => {
|
|
||||||
// Files that don't use NotifyModules and can be uglified
|
|
||||||
const localUglified = src([
|
|
||||||
paths.src + 'javascripts/modules/init.js',
|
|
||||||
paths.src + 'javascripts/modules/uswds-modules.js',
|
|
||||||
paths.src + 'javascripts/modules/show-hide-content.js',
|
|
||||||
paths.src + 'javascripts/radioSelect.js',
|
|
||||||
paths.src + 'javascripts/liveSearch.js',
|
|
||||||
paths.src + 'javascripts/preventDuplicateFormSubmissions.js',
|
|
||||||
paths.src + 'javascripts/errorBanner.js',
|
|
||||||
paths.src + 'javascripts/notifyModal.js',
|
|
||||||
paths.src + 'javascripts/date.js',
|
|
||||||
paths.src + 'javascripts/sidenav.js',
|
|
||||||
paths.src + 'javascripts/validation.js',
|
|
||||||
paths.src + 'javascripts/scrollPosition.js',
|
|
||||||
])
|
|
||||||
.pipe(plugins.prettyerror())
|
|
||||||
.pipe(
|
|
||||||
plugins.babel({
|
|
||||||
presets: ['@babel/preset-env'],
|
|
||||||
})
|
|
||||||
)
|
|
||||||
.pipe(plugins.uglify());
|
|
||||||
|
|
||||||
// Files that use NotifyModules - split into two groups to avoid stream issues
|
|
||||||
const notifyModules1 = src([
|
|
||||||
paths.src + 'javascripts/copyToClipboard.js',
|
|
||||||
paths.src + 'javascripts/enhancedTextbox.js',
|
|
||||||
paths.src + 'javascripts/fileUpload.js',
|
|
||||||
paths.src + 'javascripts/errorTracking.js',
|
|
||||||
paths.src + 'javascripts/fullscreenTable.js',
|
|
||||||
paths.src + 'javascripts/templateFolderForm.js',
|
|
||||||
])
|
|
||||||
.pipe(plugins.prettyerror())
|
|
||||||
.pipe(
|
|
||||||
plugins.babel({
|
|
||||||
presets: ['@babel/preset-env'],
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
const notifyModules2 = src([
|
|
||||||
paths.src + 'javascripts/collapsibleCheckboxes.js',
|
|
||||||
paths.src + 'javascripts/updateStatus.js',
|
|
||||||
paths.src + 'javascripts/timeoutPopup.js',
|
|
||||||
paths.src + 'javascripts/main.js',
|
|
||||||
])
|
|
||||||
.pipe(plugins.prettyerror())
|
|
||||||
.pipe(
|
|
||||||
plugins.babel({
|
|
||||||
presets: ['@babel/preset-env'],
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
// First create vendored with jquery-expose immediately after jQuery
|
|
||||||
const vendoredWithExpose = src([
|
|
||||||
paths.npm + 'jquery/dist/jquery.min.js',
|
|
||||||
paths.src + 'javascripts/jquery-expose.js',
|
|
||||||
paths.npm + 'query-command-supported/dist/queryCommandSupported.min.js',
|
|
||||||
paths.npm + 'textarea-caret/index.js',
|
|
||||||
paths.npm + 'cbor-js/cbor.js',
|
|
||||||
paths.npm + 'd3/dist/d3.min.js'
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Concatenate all streams
|
|
||||||
const mainBundle = mergeStream(vendoredWithExpose, localUglified, notifyModules1, notifyModules2);
|
|
||||||
|
|
||||||
// Use the mainBundle as the base and append remaining non-transpiled files at the end
|
|
||||||
return mainBundle
|
|
||||||
.pipe(plugins.addSrc.append(paths.src + 'javascripts/listEntry.js'))
|
|
||||||
.pipe(plugins.addSrc.append(paths.src + 'javascripts/stick-to-window-when-scrolling.js'))
|
|
||||||
.pipe(plugins.addSrc.append(paths.src + 'javascripts/totalMessagesChart.js'))
|
|
||||||
.pipe(plugins.addSrc.append(paths.src + 'javascripts/activityChart.js'))
|
|
||||||
.pipe(plugins.addSrc.append(paths.src + 'javascripts/job-polling.js'))
|
|
||||||
.pipe(plugins.concat('all.js'))
|
|
||||||
.pipe(dest(paths.dist + 'javascripts/'));
|
|
||||||
};
|
|
||||||
|
|
||||||
// Task to copy `gtm_head.js`
|
|
||||||
const copyGtmHead = () => {
|
|
||||||
return src(paths.src + 'js/gtm_head.js').pipe(dest(paths.dist + 'js/'));
|
|
||||||
};
|
|
||||||
|
|
||||||
// Task to copy `setTimezone.js`
|
|
||||||
const copySetTimezone = () => {
|
|
||||||
return src(paths.src + 'js/setTimezone.js').pipe(dest(paths.dist + 'js/'));
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Task to copy images
|
|
||||||
const copyImages = () => {
|
|
||||||
return src(paths.src + 'images/**/*', { encoding: false }).pipe(
|
|
||||||
dest(paths.dist + 'images/')
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Task to pdf files
|
|
||||||
const copyPDF = () => {
|
|
||||||
return src(paths.src + 'pdf/**/*', { encoding: false }).pipe(
|
|
||||||
dest(paths.dist + 'pdf/')
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const copyUSWDSJS = () => {
|
|
||||||
return src('node_modules/@uswds/uswds/dist/js/uswds.min.js')
|
|
||||||
.pipe(dest(paths.dist + 'js/'));
|
|
||||||
};
|
|
||||||
|
|
||||||
// Configure USWDS paths
|
|
||||||
uswds.settings.version = 3;
|
|
||||||
uswds.settings.compile = {
|
|
||||||
sass: true,
|
|
||||||
javascript: true,
|
|
||||||
sprites: false
|
|
||||||
};
|
|
||||||
|
|
||||||
uswds.paths.dist.css = paths.dist + 'css';
|
|
||||||
uswds.paths.dist.js = paths.dist + 'js';
|
|
||||||
uswds.paths.dist.img = paths.dist + 'img';
|
|
||||||
uswds.paths.dist.pdf = paths.dist + 'pdf';
|
|
||||||
uswds.paths.dist.fonts = paths.dist + 'fonts';
|
|
||||||
uswds.paths.dist.theme = paths.src + 'sass/uswds';
|
|
||||||
|
|
||||||
// Task to compile USWDS styles
|
|
||||||
const styles = async () => {
|
|
||||||
await uswds.compileSass();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Task to copy USWDS assets
|
|
||||||
const copyUSWDSAssets = () => {
|
|
||||||
return src([
|
|
||||||
'node_modules/@uswds/uswds/dist/img/**/*',
|
|
||||||
'node_modules/@uswds/uswds/dist/fonts/**/*'
|
|
||||||
], { encoding: false })
|
|
||||||
.pipe(dest((file) => {
|
|
||||||
if (file.path.includes('/img/')) {
|
|
||||||
return paths.dist + 'img/';
|
|
||||||
} else if (file.path.includes('/fonts/')) {
|
|
||||||
return paths.dist + 'fonts/';
|
|
||||||
}
|
|
||||||
return paths.dist;
|
|
||||||
}));
|
|
||||||
};
|
|
||||||
|
|
||||||
// Optional backstopJS task
|
|
||||||
// Install gulp globally and run `gulp backstopTest`
|
|
||||||
const backstopTest = (done) => {
|
|
||||||
exec(
|
|
||||||
'npx backstop test --configPath=backstop.config.js',
|
|
||||||
(err, stdout, stderr) => {
|
|
||||||
console.log(stdout);
|
|
||||||
console.error(stderr);
|
|
||||||
done(err);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Optional backstopJS reference task
|
|
||||||
// Install gulp globally and run `gulp backstopReference`
|
|
||||||
const backstopReference = (done) => {
|
|
||||||
exec(
|
|
||||||
'npx backstop reference --configPath=backstop.config.js',
|
|
||||||
(err, stdout, stderr) => {
|
|
||||||
console.log(stdout);
|
|
||||||
console.error(stderr);
|
|
||||||
done(err);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Export tasks
|
|
||||||
exports.default = series(
|
|
||||||
styles,
|
|
||||||
javascripts,
|
|
||||||
copyGtmHead,
|
|
||||||
copySetTimezone,
|
|
||||||
copyImages,
|
|
||||||
copyPDF,
|
|
||||||
copyUSWDSAssets,
|
|
||||||
copyUSWDSJS
|
|
||||||
);
|
|
||||||
exports.backstopTest = backstopTest;
|
|
||||||
exports.backstopReference = backstopReference;
|
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
"version": "0.0.1",
|
"version": "0.0.1",
|
||||||
"description": "Admin front end for Notify",
|
"description": "Admin front end for Notify",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=24.0.0"
|
"node": "^24.10.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"lint": "jshint app/assets/javascripts",
|
"lint": "jshint app/assets/javascripts",
|
||||||
|
|||||||
4
poetry.lock
generated
4
poetry.lock
generated
@@ -1,4 +1,4 @@
|
|||||||
# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand.
|
# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand.
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ago"
|
name = "ago"
|
||||||
@@ -4421,4 +4421,4 @@ cffi = ["cffi (>=1.17) ; python_version >= \"3.13\" and platform_python_implemen
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "2.1"
|
lock-version = "2.1"
|
||||||
python-versions = "^3.13.2"
|
python-versions = "^3.13.2"
|
||||||
content-hash = "1f845516e43b849ec3778eeec39783aafc81cdef092b3528f9a3a35e1604dae5"
|
content-hash = "9e8c9d15671b2e9567ada7a222d79490b9b6eae6c26a141c536dc004853fbe23"
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ markupsafe = "^3.0.3"
|
|||||||
python-dateutil = "^2.9.0.post0"
|
python-dateutil = "^2.9.0.post0"
|
||||||
pyyaml = "^6.0.3"
|
pyyaml = "^6.0.3"
|
||||||
requests = "^2.32.5"
|
requests = "^2.32.5"
|
||||||
six = "^1.16.0"
|
|
||||||
urllib3 = "^2.5.0"
|
urllib3 = "^2.5.0"
|
||||||
webencodings = "^0.5.1"
|
webencodings = "^0.5.1"
|
||||||
virtualenv = "<20.36"
|
virtualenv = "<20.36"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
[tool:pytest]
|
[tool:pytest]
|
||||||
norecursedirs=node_modules bower_components
|
norecursedirs=node_modules
|
||||||
xfail_strict=true
|
xfail_strict=true
|
||||||
|
|
||||||
[tool:isort]
|
[tool:isort]
|
||||||
|
|||||||
@@ -245,7 +245,7 @@ def test_user_accepts_invite(
|
|||||||
client_request.get(
|
client_request.get(
|
||||||
"main.accept_org_invite",
|
"main.accept_org_invite",
|
||||||
token="thisisnotarealtoken",
|
token="thisisnotarealtoken",
|
||||||
_expected_redirect=url_for("main.register_from_org_invite"),
|
_expected_redirect=url_for("main.sign_in"),
|
||||||
)
|
)
|
||||||
|
|
||||||
mock_check_org_invite_token.assert_called_once_with("thisisnotarealtoken")
|
mock_check_org_invite_token.assert_called_once_with("thisisnotarealtoken")
|
||||||
@@ -253,167 +253,6 @@ def test_user_accepts_invite(
|
|||||||
mock_get_users_for_organization.assert_called_once_with(ORGANISATION_ID)
|
mock_get_users_for_organization.assert_called_once_with(ORGANISATION_ID)
|
||||||
|
|
||||||
|
|
||||||
def test_registration_from_org_invite_404s_if_user_not_in_session(
|
|
||||||
client_request, mocker
|
|
||||||
):
|
|
||||||
mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user")
|
|
||||||
client_request.logout()
|
|
||||||
client_request.get(
|
|
||||||
"main.register_from_org_invite",
|
|
||||||
_expected_status=404,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
|
||||||
("data", "error"),
|
|
||||||
[
|
|
||||||
(
|
|
||||||
{
|
|
||||||
"name": "Bad Mobile",
|
|
||||||
"mobile_number": "not good",
|
|
||||||
"password": "validPassword!", # noqa
|
|
||||||
},
|
|
||||||
"The string supplied did not seem to be a phone number",
|
|
||||||
),
|
|
||||||
(
|
|
||||||
{
|
|
||||||
"name": "Bad Password",
|
|
||||||
"mobile_number": "+12021234123",
|
|
||||||
"password": "password", # noqa
|
|
||||||
},
|
|
||||||
"Choose a password that’s harder to guess",
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
def test_registration_from_org_invite_has_bad_data(
|
|
||||||
client_request,
|
|
||||||
sample_org_invite,
|
|
||||||
data,
|
|
||||||
error,
|
|
||||||
mock_get_invited_org_user_by_id,
|
|
||||||
mocker,
|
|
||||||
):
|
|
||||||
mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user")
|
|
||||||
client_request.logout()
|
|
||||||
|
|
||||||
with client_request.session_transaction() as session:
|
|
||||||
session["invited_org_user_id"] = sample_org_invite["id"]
|
|
||||||
|
|
||||||
page = client_request.post(
|
|
||||||
"main.register_from_org_invite",
|
|
||||||
_data=data,
|
|
||||||
_expected_status=200,
|
|
||||||
)
|
|
||||||
|
|
||||||
assert error in page.text
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
|
||||||
"diff_data",
|
|
||||||
[["email_address"], ["organization"], ["email_address", "organization"]],
|
|
||||||
)
|
|
||||||
def test_registration_from_org_invite_has_different_email_or_organization(
|
|
||||||
client_request,
|
|
||||||
sample_org_invite,
|
|
||||||
diff_data,
|
|
||||||
mock_get_invited_org_user_by_id,
|
|
||||||
):
|
|
||||||
client_request.logout()
|
|
||||||
with client_request.session_transaction() as session:
|
|
||||||
session["invited_org_user_id"] = sample_org_invite["id"]
|
|
||||||
|
|
||||||
data = {
|
|
||||||
"name": "Test User",
|
|
||||||
"mobile_number": "+12024900460",
|
|
||||||
"password": "validPassword!",
|
|
||||||
"email_address": sample_org_invite["email_address"],
|
|
||||||
"organization": sample_org_invite["organization"],
|
|
||||||
}
|
|
||||||
for field in diff_data:
|
|
||||||
data[field] = "different"
|
|
||||||
|
|
||||||
client_request.post(
|
|
||||||
"main.register_from_org_invite",
|
|
||||||
_data=data,
|
|
||||||
_expected_status=400,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def test_org_user_registers_with_email_already_in_use(
|
|
||||||
client_request,
|
|
||||||
sample_org_invite,
|
|
||||||
mock_get_user_by_email,
|
|
||||||
mock_accept_org_invite,
|
|
||||||
mock_add_user_to_organization,
|
|
||||||
mock_send_already_registered_email,
|
|
||||||
mock_register_user,
|
|
||||||
mock_get_invited_org_user_by_id,
|
|
||||||
):
|
|
||||||
client_request.logout()
|
|
||||||
with client_request.session_transaction() as session:
|
|
||||||
session["invited_org_user_id"] = sample_org_invite["id"]
|
|
||||||
|
|
||||||
client_request.post(
|
|
||||||
"main.register_from_org_invite",
|
|
||||||
_data={
|
|
||||||
"name": "Test User",
|
|
||||||
"mobile_number": "+12024900460",
|
|
||||||
"password": "validPassword!",
|
|
||||||
"email_address": sample_org_invite["email_address"],
|
|
||||||
"organization": sample_org_invite["organization"],
|
|
||||||
},
|
|
||||||
_expected_redirect=url_for("main.verify"),
|
|
||||||
)
|
|
||||||
|
|
||||||
mock_get_user_by_email.assert_called_once_with(sample_org_invite["email_address"])
|
|
||||||
assert mock_register_user.called is False
|
|
||||||
assert mock_send_already_registered_email.called is False
|
|
||||||
|
|
||||||
|
|
||||||
def test_org_user_registration(
|
|
||||||
client_request,
|
|
||||||
sample_org_invite,
|
|
||||||
mock_email_is_not_already_in_use,
|
|
||||||
mock_register_user,
|
|
||||||
mock_send_verify_code,
|
|
||||||
mock_get_user_by_email,
|
|
||||||
mock_send_verify_email,
|
|
||||||
mock_accept_org_invite,
|
|
||||||
mock_add_user_to_organization,
|
|
||||||
mock_get_invited_org_user_by_id,
|
|
||||||
):
|
|
||||||
client_request.logout()
|
|
||||||
with client_request.session_transaction() as session:
|
|
||||||
session["invited_org_user_id"] = sample_org_invite["id"]
|
|
||||||
|
|
||||||
client_request.post(
|
|
||||||
"main.register_from_org_invite",
|
|
||||||
_data={
|
|
||||||
"name": "Test User",
|
|
||||||
"email_address": sample_org_invite["email_address"],
|
|
||||||
"mobile_number": "+12024900460",
|
|
||||||
"password": "validPassword!",
|
|
||||||
"organization": sample_org_invite["organization"],
|
|
||||||
},
|
|
||||||
_expected_redirect=url_for("main.verify"),
|
|
||||||
)
|
|
||||||
|
|
||||||
assert mock_get_user_by_email.called is False
|
|
||||||
mock_register_user.assert_called_once_with(
|
|
||||||
"Test User",
|
|
||||||
sample_org_invite["email_address"],
|
|
||||||
"+12024900460",
|
|
||||||
"validPassword!",
|
|
||||||
"sms_auth",
|
|
||||||
)
|
|
||||||
mock_send_verify_code.assert_called_once_with(
|
|
||||||
"6ce466d0-fd6a-11e5-82f5-e0accb9d11a6",
|
|
||||||
"sms",
|
|
||||||
"+12024900460",
|
|
||||||
)
|
|
||||||
mock_get_invited_org_user_by_id.assert_called_once_with(sample_org_invite["id"])
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skip("TODO unskip asap")
|
@pytest.mark.skip("TODO unskip asap")
|
||||||
def test_verified_org_user_redirects_to_dashboard(
|
def test_verified_org_user_redirects_to_dashboard(
|
||||||
client_request,
|
client_request,
|
||||||
|
|||||||
@@ -152,7 +152,6 @@ EXCLUDED_ENDPOINTS = tuple(
|
|||||||
"received_text_messages_callback",
|
"received_text_messages_callback",
|
||||||
"redact_template",
|
"redact_template",
|
||||||
"register",
|
"register",
|
||||||
"register_from_org_invite",
|
|
||||||
"registration_continue",
|
"registration_continue",
|
||||||
"remove_user_from_organization",
|
"remove_user_from_organization",
|
||||||
"remove_user_from_service",
|
"remove_user_from_service",
|
||||||
|
|||||||
Reference in New Issue
Block a user