mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-09-10 10:03:21 -04:00
Merge branch 'main' of https://github.com/GSA/notifications-admin into notify-762
This commit is contained in:
30
.github/workflows/checks.yml
vendored
30
.github/workflows/checks.yml
vendored
@@ -44,17 +44,29 @@ jobs:
|
|||||||
run: npm test
|
run: npm test
|
||||||
- name: Run py tests with coverage
|
- name: Run py tests with coverage
|
||||||
run: poetry run coverage run --omit=*/notifications_utils/* -m pytest --maxfail=10 --ignore=tests/end_to_end tests/
|
run: poetry run coverage run --omit=*/notifications_utils/* -m pytest --maxfail=10 --ignore=tests/end_to_end tests/
|
||||||
- name: Run E2E tests
|
# - name: Run E2E tests
|
||||||
run: poetry run pytest -v --browser chromium --browser firefox --browser webkit tests/end_to_end
|
# run: poetry run pytest -v --browser chromium --browser firefox --browser webkit tests/end_to_end
|
||||||
env:
|
# env:
|
||||||
NOTIFY_E2E_AUTH_STATE_PATH: ${{ secrets.NOTIFY_E2E_AUTH_STATE_PATH }}
|
# NOTIFY_E2E_AUTH_STATE_PATH: ${{ secrets.NOTIFY_E2E_AUTH_STATE_PATH }}
|
||||||
NOTIFY_E2E_TEST_EMAIL: ${{ secrets.NOTIFY_E2E_TEST_EMAIL }}
|
# NOTIFY_E2E_TEST_EMAIL: ${{ secrets.NOTIFY_E2E_TEST_EMAIL }}
|
||||||
NOTIFY_E2E_TEST_HTTP_AUTH_PASSWORD: ${{ secrets.NOTIFY_E2E_TEST_HTTP_AUTH_PASSWORD }}
|
# NOTIFY_E2E_TEST_PASSWORD: ${{ secrets.NOTIFY_E2E_TEST_PASSWORD }}
|
||||||
NOTIFY_E2E_TEST_HTTP_AUTH_USER: ${{ secrets.NOTIFY_E2E_TEST_HTTP_AUTH_USER }}
|
# NOTIFY_E2E_TEST_URI: ${{ secrets.NOTIFY_E2E_TEST_URI }}
|
||||||
NOTIFY_E2E_TEST_PASSWORD: ${{ secrets.NOTIFY_E2E_TEST_PASSWORD }}
|
|
||||||
NOTIFY_E2E_TEST_URI: ${{ secrets.NOTIFY_E2E_TEST_URI }}
|
|
||||||
- name: Check coverage threshold
|
- name: Check coverage threshold
|
||||||
run: poetry run coverage report --fail-under=90
|
run: poetry run coverage report --fail-under=90
|
||||||
|
# - name: Health check
|
||||||
|
# run: |
|
||||||
|
# response=$(curl -url ${{secrets.NOTIFY_E2E_TEST_URI}}_status)
|
||||||
|
# if grep -q "ok" <<< "$response"; then
|
||||||
|
# echo "Health check passed"
|
||||||
|
# else
|
||||||
|
# echo "Health check failed"
|
||||||
|
# exit 1
|
||||||
|
# fi
|
||||||
|
# env:
|
||||||
|
# NOTIFY_E2E_AUTH_STATE_PATH: ${{ secrets.NOTIFY_E2E_AUTH_STATE_PATH }}
|
||||||
|
# NOTIFY_E2E_TEST_EMAIL: ${{ secrets.NOTIFY_E2E_TEST_EMAIL }}
|
||||||
|
# NOTIFY_E2E_TEST_PASSWORD: ${{ secrets.NOTIFY_E2E_TEST_PASSWORD }}
|
||||||
|
# NOTIFY_E2E_TEST_URI: ${{ secrets.NOTIFY_E2E_TEST_URI }}
|
||||||
|
|
||||||
validate-new-relic-config:
|
validate-new-relic-config:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
3
.github/workflows/deploy-demo.yml
vendored
3
.github/workflows/deploy-demo.yml
vendored
@@ -52,7 +52,6 @@ jobs:
|
|||||||
DANGEROUS_SALT: ${{ secrets.DANGEROUS_SALT }}
|
DANGEROUS_SALT: ${{ secrets.DANGEROUS_SALT }}
|
||||||
SECRET_KEY: ${{ secrets.SECRET_KEY }}
|
SECRET_KEY: ${{ secrets.SECRET_KEY }}
|
||||||
ADMIN_CLIENT_SECRET: ${{ secrets.ADMIN_CLIENT_SECRET }}
|
ADMIN_CLIENT_SECRET: ${{ secrets.ADMIN_CLIENT_SECRET }}
|
||||||
BASIC_AUTH_PASSWORD: ${{ secrets.BASIC_AUTH_PASSWORD }}
|
|
||||||
NEW_RELIC_LICENSE_KEY: ${{ secrets.NEW_RELIC_LICENSE_KEY }}
|
NEW_RELIC_LICENSE_KEY: ${{ secrets.NEW_RELIC_LICENSE_KEY }}
|
||||||
NR_BROWSER_KEY: ${{ secrets.NR_BROWSER_KEY }}
|
NR_BROWSER_KEY: ${{ secrets.NR_BROWSER_KEY }}
|
||||||
with:
|
with:
|
||||||
@@ -66,8 +65,6 @@ jobs:
|
|||||||
--var SECRET_KEY="$SECRET_KEY"
|
--var SECRET_KEY="$SECRET_KEY"
|
||||||
--var ADMIN_CLIENT_USERNAME="notify-admin"
|
--var ADMIN_CLIENT_USERNAME="notify-admin"
|
||||||
--var ADMIN_CLIENT_SECRET="$ADMIN_CLIENT_SECRET"
|
--var ADMIN_CLIENT_SECRET="$ADMIN_CLIENT_SECRET"
|
||||||
--var BASIC_AUTH_USERNAME="curiousabout"
|
|
||||||
--var BASIC_AUTH_PASSWORD="$BASIC_AUTH_PASSWORD"
|
|
||||||
--var NEW_RELIC_LICENSE_KEY="$NEW_RELIC_LICENSE_KEY"
|
--var NEW_RELIC_LICENSE_KEY="$NEW_RELIC_LICENSE_KEY"
|
||||||
--var NR_BROWSER_KEY="$NR_BROWSER_KEY"
|
--var NR_BROWSER_KEY="$NR_BROWSER_KEY"
|
||||||
|
|
||||||
|
|||||||
3
.github/workflows/deploy-prod.yml
vendored
3
.github/workflows/deploy-prod.yml
vendored
@@ -52,7 +52,6 @@ jobs:
|
|||||||
DANGEROUS_SALT: ${{ secrets.DANGEROUS_SALT }}
|
DANGEROUS_SALT: ${{ secrets.DANGEROUS_SALT }}
|
||||||
SECRET_KEY: ${{ secrets.SECRET_KEY }}
|
SECRET_KEY: ${{ secrets.SECRET_KEY }}
|
||||||
ADMIN_CLIENT_SECRET: ${{ secrets.ADMIN_CLIENT_SECRET }}
|
ADMIN_CLIENT_SECRET: ${{ secrets.ADMIN_CLIENT_SECRET }}
|
||||||
BASIC_AUTH_PASSWORD: ${{ secrets.BASIC_AUTH_PASSWORD }}
|
|
||||||
NEW_RELIC_LICENSE_KEY: ${{ secrets.NEW_RELIC_LICENSE_KEY }}
|
NEW_RELIC_LICENSE_KEY: ${{ secrets.NEW_RELIC_LICENSE_KEY }}
|
||||||
NR_BROWSER_KEY: ${{ secrets.NR_BROWSER_KEY }}
|
NR_BROWSER_KEY: ${{ secrets.NR_BROWSER_KEY }}
|
||||||
with:
|
with:
|
||||||
@@ -66,8 +65,6 @@ jobs:
|
|||||||
--var SECRET_KEY="$SECRET_KEY"
|
--var SECRET_KEY="$SECRET_KEY"
|
||||||
--var ADMIN_CLIENT_USERNAME="notify-admin"
|
--var ADMIN_CLIENT_USERNAME="notify-admin"
|
||||||
--var ADMIN_CLIENT_SECRET="$ADMIN_CLIENT_SECRET"
|
--var ADMIN_CLIENT_SECRET="$ADMIN_CLIENT_SECRET"
|
||||||
--var BASIC_AUTH_USERNAME="curiousabout"
|
|
||||||
--var BASIC_AUTH_PASSWORD="$BASIC_AUTH_PASSWORD"
|
|
||||||
--var NEW_RELIC_LICENSE_KEY="$NEW_RELIC_LICENSE_KEY"
|
--var NEW_RELIC_LICENSE_KEY="$NEW_RELIC_LICENSE_KEY"
|
||||||
--var NR_BROWSER_KEY="$NR_BROWSER_KEY"
|
--var NR_BROWSER_KEY="$NR_BROWSER_KEY"
|
||||||
|
|
||||||
|
|||||||
3
.github/workflows/deploy.yml
vendored
3
.github/workflows/deploy.yml
vendored
@@ -57,7 +57,6 @@ jobs:
|
|||||||
DANGEROUS_SALT: ${{ secrets.DANGEROUS_SALT }}
|
DANGEROUS_SALT: ${{ secrets.DANGEROUS_SALT }}
|
||||||
SECRET_KEY: ${{ secrets.SECRET_KEY }}
|
SECRET_KEY: ${{ secrets.SECRET_KEY }}
|
||||||
ADMIN_CLIENT_SECRET: ${{ secrets.ADMIN_CLIENT_SECRET }}
|
ADMIN_CLIENT_SECRET: ${{ secrets.ADMIN_CLIENT_SECRET }}
|
||||||
BASIC_AUTH_PASSWORD: ${{ secrets.BASIC_AUTH_PASSWORD }}
|
|
||||||
NEW_RELIC_LICENSE_KEY: ${{ secrets.NEW_RELIC_LICENSE_KEY }}
|
NEW_RELIC_LICENSE_KEY: ${{ secrets.NEW_RELIC_LICENSE_KEY }}
|
||||||
NR_BROWSER_KEY: ${{ secrets.NR_BROWSER_KEY }}
|
NR_BROWSER_KEY: ${{ secrets.NR_BROWSER_KEY }}
|
||||||
with:
|
with:
|
||||||
@@ -71,8 +70,6 @@ jobs:
|
|||||||
--var SECRET_KEY="$SECRET_KEY"
|
--var SECRET_KEY="$SECRET_KEY"
|
||||||
--var ADMIN_CLIENT_USERNAME="notify-admin"
|
--var ADMIN_CLIENT_USERNAME="notify-admin"
|
||||||
--var ADMIN_CLIENT_SECRET="$ADMIN_CLIENT_SECRET"
|
--var ADMIN_CLIENT_SECRET="$ADMIN_CLIENT_SECRET"
|
||||||
--var BASIC_AUTH_USERNAME="curiousabout"
|
|
||||||
--var BASIC_AUTH_PASSWORD="$BASIC_AUTH_PASSWORD"
|
|
||||||
--var NEW_RELIC_LICENSE_KEY="$NEW_RELIC_LICENSE_KEY"
|
--var NEW_RELIC_LICENSE_KEY="$NEW_RELIC_LICENSE_KEY"
|
||||||
--var NR_BROWSER_KEY="$NR_BROWSER_KEY"
|
--var NR_BROWSER_KEY="$NR_BROWSER_KEY"
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ from werkzeug.local import LocalProxy
|
|||||||
from app import proxy_fix
|
from app import proxy_fix
|
||||||
from app.asset_fingerprinter import asset_fingerprinter
|
from app.asset_fingerprinter import asset_fingerprinter
|
||||||
from app.config import configs
|
from app.config import configs
|
||||||
from app.custom_auth import CustomBasicAuth
|
|
||||||
from app.extensions import redis_client, zendesk_client
|
from app.extensions import redis_client, zendesk_client
|
||||||
from app.formatters import (
|
from app.formatters import (
|
||||||
convert_to_boolean,
|
convert_to_boolean,
|
||||||
@@ -122,7 +121,6 @@ from app.url_converters import (
|
|||||||
login_manager = LoginManager()
|
login_manager = LoginManager()
|
||||||
csrf = CSRFProtect()
|
csrf = CSRFProtect()
|
||||||
talisman = Talisman()
|
talisman = Talisman()
|
||||||
basic_auth = CustomBasicAuth()
|
|
||||||
|
|
||||||
|
|
||||||
# The current service attached to the request stack.
|
# The current service attached to the request stack.
|
||||||
@@ -235,8 +233,6 @@ def create_app(application):
|
|||||||
login_manager.session_protection = None
|
login_manager.session_protection = None
|
||||||
login_manager.anonymous_user = AnonymousUser
|
login_manager.anonymous_user = AnonymousUser
|
||||||
|
|
||||||
setup_basic_auth(application)
|
|
||||||
|
|
||||||
# make sure we handle unicode correctly
|
# make sure we handle unicode correctly
|
||||||
redis_client.redis_store.decode_responses = True
|
redis_client.redis_store.decode_responses = True
|
||||||
|
|
||||||
@@ -583,7 +579,3 @@ def init_jinja(application):
|
|||||||
]
|
]
|
||||||
jinja_loader = jinja2.FileSystemLoader(template_folders)
|
jinja_loader = jinja2.FileSystemLoader(template_folders)
|
||||||
application.jinja_loader = jinja_loader
|
application.jinja_loader = jinja_loader
|
||||||
|
|
||||||
|
|
||||||
def setup_basic_auth(application):
|
|
||||||
application.basic_auth = CustomBasicAuth(application)
|
|
||||||
|
|||||||
@@ -28,8 +28,6 @@ class Config(object):
|
|||||||
# ZENDESK_API_KEY = getenv('ZENDESK_API_KEY')
|
# ZENDESK_API_KEY = getenv('ZENDESK_API_KEY')
|
||||||
ROUTE_SECRET_KEY_1 = getenv("ROUTE_SECRET_KEY_1", "dev-route-secret-key-1")
|
ROUTE_SECRET_KEY_1 = getenv("ROUTE_SECRET_KEY_1", "dev-route-secret-key-1")
|
||||||
ROUTE_SECRET_KEY_2 = getenv("ROUTE_SECRET_KEY_2", "dev-route-secret-key-2")
|
ROUTE_SECRET_KEY_2 = getenv("ROUTE_SECRET_KEY_2", "dev-route-secret-key-2")
|
||||||
BASIC_AUTH_USERNAME = getenv("BASIC_AUTH_USERNAME")
|
|
||||||
BASIC_AUTH_PASSWORD = getenv("BASIC_AUTH_PASSWORD")
|
|
||||||
|
|
||||||
NR_ACCOUNT_ID = getenv("NR_ACCOUNT_ID")
|
NR_ACCOUNT_ID = getenv("NR_ACCOUNT_ID")
|
||||||
NR_TRUST_KEY = getenv("NR_TRUST_KEY")
|
NR_TRUST_KEY = getenv("NR_TRUST_KEY")
|
||||||
@@ -101,7 +99,6 @@ def _s3_credentials_from_env(bucket_prefix):
|
|||||||
|
|
||||||
|
|
||||||
class Development(Config):
|
class Development(Config):
|
||||||
BASIC_AUTH_FORCE = False
|
|
||||||
DEBUG = True
|
DEBUG = True
|
||||||
SESSION_COOKIE_SECURE = False
|
SESSION_COOKIE_SECURE = False
|
||||||
SESSION_PROTECTION = None
|
SESSION_PROTECTION = None
|
||||||
@@ -138,7 +135,6 @@ class Test(Development):
|
|||||||
class Production(Config):
|
class Production(Config):
|
||||||
HEADER_COLOUR = "#005EA5" # $govuk-blue
|
HEADER_COLOUR = "#005EA5" # $govuk-blue
|
||||||
HTTP_PROTOCOL = "https"
|
HTTP_PROTOCOL = "https"
|
||||||
BASIC_AUTH_FORCE = True
|
|
||||||
ASSET_DOMAIN = "" # TODO use a CDN
|
ASSET_DOMAIN = "" # TODO use a CDN
|
||||||
ASSET_PATH = "/static/" # TODO use a CDN
|
ASSET_PATH = "/static/" # TODO use a CDN
|
||||||
DEBUG = False
|
DEBUG = False
|
||||||
@@ -153,7 +149,6 @@ class Production(Config):
|
|||||||
|
|
||||||
|
|
||||||
class Staging(Production):
|
class Staging(Production):
|
||||||
BASIC_AUTH_FORCE = True
|
|
||||||
HEADER_COLOUR = "#00ff00" # $green
|
HEADER_COLOUR = "#00ff00" # $green
|
||||||
|
|
||||||
|
|
||||||
@@ -166,7 +161,6 @@ class Sandbox(Staging):
|
|||||||
|
|
||||||
|
|
||||||
class Scanning(Production):
|
class Scanning(Production):
|
||||||
BASIC_AUTH_FORCE = False
|
|
||||||
HTTP_PROTOCOL = "http"
|
HTTP_PROTOCOL = "http"
|
||||||
API_HOST_NAME = "https://notify-api-staging.app.cloud.gov/"
|
API_HOST_NAME = "https://notify-api-staging.app.cloud.gov/"
|
||||||
SECRET_KEY = "dev-notify-secret-key" # nosec B105 - only used in development
|
SECRET_KEY = "dev-notify-secret-key" # nosec B105 - only used in development
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
from flask import jsonify, request
|
|
||||||
from flask_basicauth import BasicAuth
|
|
||||||
|
|
||||||
|
|
||||||
class CustomBasicAuth(BasicAuth):
|
|
||||||
"""
|
|
||||||
Description:
|
|
||||||
Override BasicAuth to permit anonymous healthcheck at /_status?simple=true
|
|
||||||
"""
|
|
||||||
|
|
||||||
def challenge(self):
|
|
||||||
if "/_status" in request.url:
|
|
||||||
if request.args.get("elb", None) or request.args.get("simple", None):
|
|
||||||
return jsonify(status="ok"), 200
|
|
||||||
return super(CustomBasicAuth, self).challenge()
|
|
||||||
|
|
||||||
|
|
||||||
custom_basic_auth = CustomBasicAuth()
|
|
||||||
@@ -7,8 +7,6 @@ ADMIN_CLIENT_USERNAME: notify-admin
|
|||||||
ADMIN_CLIENT_SECRET: sandbox-notify-secret-key
|
ADMIN_CLIENT_SECRET: sandbox-notify-secret-key
|
||||||
DANGEROUS_SALT: sandbox-notify-salt
|
DANGEROUS_SALT: sandbox-notify-salt
|
||||||
SECRET_KEY: sandbox-notify-secret-key
|
SECRET_KEY: sandbox-notify-secret-key
|
||||||
BASIC_AUTH_USERNAME: sandbox
|
|
||||||
BASIC_AUTH_PASSWORD: sandbox
|
|
||||||
nr_agent_id: ""
|
nr_agent_id: ""
|
||||||
nr_app_id: ""
|
nr_app_id: ""
|
||||||
NR_BROWSER_KEY: ""
|
NR_BROWSER_KEY: ""
|
||||||
|
|||||||
@@ -77,8 +77,6 @@ and that it has at least these environment variables set in it:
|
|||||||
```
|
```
|
||||||
# E2E Test Configuration - only set for the Admin site.
|
# E2E Test Configuration - only set for the Admin site.
|
||||||
NOTIFY_E2E_TEST_URI
|
NOTIFY_E2E_TEST_URI
|
||||||
NOTIFY_E2E_TEST_HTTP_AUTH_USER # This is optional
|
|
||||||
NOTIFY_E2E_TEST_HTTP_AUTH_PASSWORD # This is optional
|
|
||||||
NOTIFY_E2E_TEST_EMAIL
|
NOTIFY_E2E_TEST_EMAIL
|
||||||
NOTIFY_E2E_TEST_PASSWORD
|
NOTIFY_E2E_TEST_PASSWORD
|
||||||
NOTIFY_E2E_AUTH_STATE_PATH
|
NOTIFY_E2E_AUTH_STATE_PATH
|
||||||
@@ -133,8 +131,6 @@ These are the E2E test environment variables that must be set:
|
|||||||
|
|
||||||
```
|
```
|
||||||
NOTIFY_E2E_TEST_URI
|
NOTIFY_E2E_TEST_URI
|
||||||
NOTIFY_E2E_TEST_HTTP_AUTH_USER # This is optional
|
|
||||||
NOTIFY_E2E_TEST_HTTP_AUTH_PASSWORD # This is optional
|
|
||||||
NOTIFY_E2E_TEST_EMAIL
|
NOTIFY_E2E_TEST_EMAIL
|
||||||
NOTIFY_E2E_TEST_PASSWORD
|
NOTIFY_E2E_TEST_PASSWORD
|
||||||
NOTIFY_E2E_AUTH_STATE_PATH
|
NOTIFY_E2E_AUTH_STATE_PATH
|
||||||
|
|||||||
@@ -1,6 +1,21 @@
|
|||||||
# Notify Sprint Goals Log
|
# Notify Sprint Goals Log
|
||||||
|
|
||||||
## Sprint: Q (8/17/23)
|
## Sprint: S (9/14/23)
|
||||||
|
|
||||||
|
| | Goals | Impact |
|
||||||
|
|-------------|-----------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
| Engineering | Resolve High and Urgent [bugs](https://github.com/GSA/notifications-admin/issues/758), remove cloud.gov [auth wall](https://github.com/GSA/notifications-admin/issues/679), [redirect](https://github.com/GSA/notifications-admin/issues/680) notify.gov to beta.notify.gov, change retention and [quota strategy](https://github.com/GSA/notifications-api/issues/443), begin scoping and obtain access to Login.gov sandbox | Ensure the best possible experience for first partner use, start down path of ATO-required auth solution |
|
||||||
|
| UX | Perform observational and formal user feedback sessions with partners to inform flow and look/feel redesign, surface and remedy straightforward UI changes | Inform future features, flow, and feel of the application |
|
||||||
|
| Security | Align personnel to begin ATO | Source adequate resources to begin process|
|
||||||
|
| Content | Kick off cloud.gov pages IAA for content site | Enable an easy static website for future content
|
||||||
|
|
||||||
|
|
||||||
|
## Sprint: Rook (8/31/23)
|
||||||
|
|
||||||
|
(Sprint planning cancelled)
|
||||||
|
|
||||||
|
|
||||||
|
## Sprint: Quetzal (8/17/23)
|
||||||
|
|
||||||
| | Goals | Impact |
|
| | Goals | Impact |
|
||||||
|-------------|-----------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------|
|
|-------------|-----------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
|
|||||||
@@ -41,8 +41,6 @@ applications:
|
|||||||
ADMIN_CLIENT_USERNAME: ((ADMIN_CLIENT_USERNAME))
|
ADMIN_CLIENT_USERNAME: ((ADMIN_CLIENT_USERNAME))
|
||||||
DANGEROUS_SALT: ((DANGEROUS_SALT))
|
DANGEROUS_SALT: ((DANGEROUS_SALT))
|
||||||
SECRET_KEY: ((SECRET_KEY))
|
SECRET_KEY: ((SECRET_KEY))
|
||||||
BASIC_AUTH_USERNAME: ((BASIC_AUTH_USERNAME))
|
|
||||||
BASIC_AUTH_PASSWORD: ((BASIC_AUTH_PASSWORD))
|
|
||||||
NEW_RELIC_LICENSE_KEY: ((NEW_RELIC_LICENSE_KEY))
|
NEW_RELIC_LICENSE_KEY: ((NEW_RELIC_LICENSE_KEY))
|
||||||
|
|
||||||
NOTIFY_BILLING_DETAILS: '[]'
|
NOTIFY_BILLING_DETAILS: '[]'
|
||||||
|
|||||||
91
poetry.lock
generated
91
poetry.lock
generated
@@ -155,19 +155,30 @@ files = [
|
|||||||
{file = "blinker-1.6.2.tar.gz", hash = "sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213"},
|
{file = "blinker-1.6.2.tar.gz", hash = "sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213"},
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "boolean-py"
|
||||||
|
version = "4.0"
|
||||||
|
description = "Define boolean algebras, create and parse boolean expressions and create custom boolean DSL."
|
||||||
|
optional = false
|
||||||
|
python-versions = "*"
|
||||||
|
files = [
|
||||||
|
{file = "boolean.py-4.0-py3-none-any.whl", hash = "sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd"},
|
||||||
|
{file = "boolean.py-4.0.tar.gz", hash = "sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4"},
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "boto3"
|
name = "boto3"
|
||||||
version = "1.28.40"
|
version = "1.28.47"
|
||||||
description = "The AWS SDK for Python"
|
description = "The AWS SDK for Python"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">= 3.7"
|
python-versions = ">= 3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "boto3-1.28.40-py3-none-any.whl", hash = "sha256:bd7c760afb195eaeaab907dc6b2c21fa64ddbba3fed4a869e80d820ddbd6cc70"},
|
{file = "boto3-1.28.47-py3-none-any.whl", hash = "sha256:27560da44099e7e2ee961d3971d8ea659de2e0dc24e78043d1c3027d89b2d8a2"},
|
||||||
{file = "boto3-1.28.40.tar.gz", hash = "sha256:6ff9a5b815e106656596064d51c9b6ba97a307807baa5f89634384b7d3f7ecc6"},
|
{file = "boto3-1.28.47.tar.gz", hash = "sha256:be69cd28e3732b63ad61f6d2429b1eac92428588911a5a7367faa4e129a4738d"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
botocore = ">=1.31.40,<1.32.0"
|
botocore = ">=1.31.47,<1.32.0"
|
||||||
jmespath = ">=0.7.1,<2.0.0"
|
jmespath = ">=0.7.1,<2.0.0"
|
||||||
s3transfer = ">=0.6.0,<0.7.0"
|
s3transfer = ">=0.6.0,<0.7.0"
|
||||||
|
|
||||||
@@ -176,13 +187,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "botocore"
|
name = "botocore"
|
||||||
version = "1.31.40"
|
version = "1.31.47"
|
||||||
description = "Low-level, data-driven core of boto 3."
|
description = "Low-level, data-driven core of boto 3."
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">= 3.7"
|
python-versions = ">= 3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "botocore-1.31.40-py3-none-any.whl", hash = "sha256:df766969f0d9ef9eda1a9c9946e0e173c10199f37a9e4c92861f11ddb5c9e702"},
|
{file = "botocore-1.31.47-py3-none-any.whl", hash = "sha256:6a60f9601270458102529b17fdcba5551b918f9eedc32bbc2f467e63edfb2662"},
|
||||||
{file = "botocore-1.31.40.tar.gz", hash = "sha256:ce22a82ef8674f49691477d09558992cc87e7331f65c6a5b0da897ab192240ca"},
|
{file = "botocore-1.31.47.tar.gz", hash = "sha256:a0ba5629eb17a37bf449bccda9df6ae652d5755f73145519d5eb244f6963b31b"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
@@ -592,16 +603,17 @@ test-randomorder = ["pytest-randomly"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cyclonedx-python-lib"
|
name = "cyclonedx-python-lib"
|
||||||
version = "4.1.0"
|
version = "4.2.1"
|
||||||
description = "A library for producing CycloneDX SBOM (Software Bill of Materials) files."
|
description = "A library for producing CycloneDX SBOM (Software Bill of Materials) files."
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7,<4.0"
|
python-versions = ">=3.7,<4.0"
|
||||||
files = [
|
files = [
|
||||||
{file = "cyclonedx_python_lib-4.1.0-py3-none-any.whl", hash = "sha256:28b8c6c96372345c61464561b3040ede38d1c82026f706d87e8728ba5f7f4ddb"},
|
{file = "cyclonedx_python_lib-4.2.1-py3-none-any.whl", hash = "sha256:b6b3818d48ed932545d3c5c819cbfe9a1fe452fba363388d2005ba9b054c81cb"},
|
||||||
{file = "cyclonedx_python_lib-4.1.0.tar.gz", hash = "sha256:7996657f9788758ed05bea8c247e3e6ffcccfbc48818cd34795a4ae094b307bd"},
|
{file = "cyclonedx_python_lib-4.2.1.tar.gz", hash = "sha256:adcb074d00e5171754fc2f04269987cdf11342d2dbce2b9eeee7ebb218b1ed94"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
|
license-expression = ">=30,<31"
|
||||||
packageurl-python = ">=0.11"
|
packageurl-python = ">=0.11"
|
||||||
py-serializable = ">=0.11.1,<0.12.0"
|
py-serializable = ">=0.11.1,<0.12.0"
|
||||||
sortedcontainers = ">=2.4.0,<3.0.0"
|
sortedcontainers = ">=2.4.0,<3.0.0"
|
||||||
@@ -788,21 +800,19 @@ testing = ["hatch", "pre-commit", "pytest", "tox"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "filelock"
|
name = "filelock"
|
||||||
version = "3.12.3"
|
version = "3.12.4"
|
||||||
description = "A platform independent file lock."
|
description = "A platform independent file lock."
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.8"
|
python-versions = ">=3.8"
|
||||||
files = [
|
files = [
|
||||||
{file = "filelock-3.12.3-py3-none-any.whl", hash = "sha256:f067e40ccc40f2b48395a80fcbd4728262fab54e232e090a4063ab804179efeb"},
|
{file = "filelock-3.12.4-py3-none-any.whl", hash = "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4"},
|
||||||
{file = "filelock-3.12.3.tar.gz", hash = "sha256:0ecc1dd2ec4672a10c8550a8182f1bd0c0a5088470ecd5a125e45f49472fac3d"},
|
{file = "filelock-3.12.4.tar.gz", hash = "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
|
||||||
typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.11\""}
|
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"]
|
docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"]
|
||||||
testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"]
|
testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"]
|
||||||
|
typing = ["typing-extensions (>=4.7.1)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flake8"
|
name = "flake8"
|
||||||
@@ -994,18 +1004,21 @@ smmap = ">=3.0.1,<6"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gitpython"
|
name = "gitpython"
|
||||||
version = "3.1.35"
|
version = "3.1.36"
|
||||||
description = "GitPython is a Python library used to interact with Git repositories"
|
description = "GitPython is a Python library used to interact with Git repositories"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "GitPython-3.1.35-py3-none-any.whl", hash = "sha256:c19b4292d7a1d3c0f653858db273ff8a6614100d1eb1528b014ec97286193c09"},
|
{file = "GitPython-3.1.36-py3-none-any.whl", hash = "sha256:8d22b5cfefd17c79914226982bb7851d6ade47545b1735a9d010a2a4c26d8388"},
|
||||||
{file = "GitPython-3.1.35.tar.gz", hash = "sha256:9cbefbd1789a5fe9bcf621bb34d3f441f3a90c8461d377f84eda73e721d9b06b"},
|
{file = "GitPython-3.1.36.tar.gz", hash = "sha256:4bb0c2a6995e85064140d31a33289aa5dce80133a23d36fcd372d716c54d3ebf"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
gitdb = ">=4.0.1,<5"
|
gitdb = ">=4.0.1,<5"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mypy", "pre-commit", "pytest", "pytest-cov", "pytest-sugar", "virtualenv"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "govuk-bank-holidays"
|
name = "govuk-bank-holidays"
|
||||||
version = "0.13"
|
version = "0.13"
|
||||||
@@ -1379,6 +1392,24 @@ completion = ["shtab"]
|
|||||||
docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
|
docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
|
||||||
testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-ruff"]
|
testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-ruff"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "license-expression"
|
||||||
|
version = "30.1.1"
|
||||||
|
description = "license-expression is a comprehensive utility library to parse, compare, simplify and normalize license expressions (such as SPDX license expressions) using boolean logic."
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.7"
|
||||||
|
files = [
|
||||||
|
{file = "license-expression-30.1.1.tar.gz", hash = "sha256:42375df653ad85e6f5b4b0385138b2dbea1f5d66360783d8625c3e4f97f11f0c"},
|
||||||
|
{file = "license_expression-30.1.1-py3-none-any.whl", hash = "sha256:8d7e5e2de0d04fc104a4f952c440e8f08a5ba63480a0dad015b294770b7e58ec"},
|
||||||
|
]
|
||||||
|
|
||||||
|
[package.dependencies]
|
||||||
|
"boolean.py" = ">=4.0"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
docs = ["Sphinx (==5.1.0)", "doc8 (>=0.8.1)", "sphinx-rtd-theme (>=0.5.0)", "sphinxcontrib-apidoc (>=0.3.0)"]
|
||||||
|
testing = ["black", "isort", "pytest (>=6,!=7.0.0)", "pytest-xdist (>=2)", "twine"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lml"
|
name = "lml"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
@@ -1565,16 +1596,6 @@ files = [
|
|||||||
{file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"},
|
{file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"},
|
||||||
{file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"},
|
{file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"},
|
||||||
{file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"},
|
{file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"},
|
||||||
{file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"},
|
|
||||||
{file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"},
|
|
||||||
{file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"},
|
|
||||||
{file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"},
|
|
||||||
{file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"},
|
|
||||||
{file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"},
|
|
||||||
{file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"},
|
|
||||||
{file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"},
|
|
||||||
{file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"},
|
|
||||||
{file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"},
|
|
||||||
{file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"},
|
{file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"},
|
||||||
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"},
|
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"},
|
||||||
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"},
|
{file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"},
|
||||||
@@ -1984,13 +2005,13 @@ ptyprocess = ">=0.5"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "phonenumbers"
|
name = "phonenumbers"
|
||||||
version = "8.13.19"
|
version = "8.13.20"
|
||||||
description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers."
|
description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers."
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = "*"
|
python-versions = "*"
|
||||||
files = [
|
files = [
|
||||||
{file = "phonenumbers-8.13.19-py2.py3-none-any.whl", hash = "sha256:ba542f20f6dc83be8f127f240f9b5b7e7c1dec42aceff1879400d4dc0c781d81"},
|
{file = "phonenumbers-8.13.20-py2.py3-none-any.whl", hash = "sha256:97f151fc904b0d6274dd92b02c82a7936e7dcaf9c7204f2f3e9c7ed0381f5098"},
|
||||||
{file = "phonenumbers-8.13.19.tar.gz", hash = "sha256:38180247697240ccedd74dec4bfbdbc22bb108b9c5f991f270ca3e41395e6f96"},
|
{file = "phonenumbers-8.13.20.tar.gz", hash = "sha256:bf2b35a806d37979e5361109429da46d9a047e59d9af98639d733c834e7dab22"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -3260,13 +3281,13 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "virtualenv"
|
name = "virtualenv"
|
||||||
version = "20.24.4"
|
version = "20.24.5"
|
||||||
description = "Virtual Python Environment builder"
|
description = "Virtual Python Environment builder"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "virtualenv-20.24.4-py3-none-any.whl", hash = "sha256:29c70bb9b88510f6414ac3e55c8b413a1f96239b6b789ca123437d5e892190cb"},
|
{file = "virtualenv-20.24.5-py3-none-any.whl", hash = "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b"},
|
||||||
{file = "virtualenv-20.24.4.tar.gz", hash = "sha256:772b05bfda7ed3b8ecd16021ca9716273ad9f4467c801f27e83ac73430246dca"},
|
{file = "virtualenv-20.24.5.tar.gz", hash = "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
|
|||||||
@@ -17,8 +17,6 @@ NODE_VERSION=16.15.1
|
|||||||
# E2E Testing
|
# E2E Testing
|
||||||
|
|
||||||
NOTIFY_E2E_TEST_URI=http://localhost:6012/
|
NOTIFY_E2E_TEST_URI=http://localhost:6012/
|
||||||
#NOTIFY_E2E_TEST_HTTP_AUTH_USER="this is optional"
|
|
||||||
#NOTIFY_E2E_TEST_HTTP_AUTH_PASSWORD="this is optional - don't write secrets to the sample file"
|
|
||||||
NOTIFY_E2E_TEST_EMAIL=fake.user@example.com
|
NOTIFY_E2E_TEST_EMAIL=fake.user@example.com
|
||||||
NOTIFY_E2E_TEST_PASSWORD="don't write secrets to the sample file"
|
NOTIFY_E2E_TEST_PASSWORD="don't write secrets to the sample file"
|
||||||
NOTIFY_E2E_AUTH_STATE_PATH=playwright/.auth/
|
NOTIFY_E2E_AUTH_STATE_PATH=playwright/.auth/
|
||||||
|
|||||||
@@ -3661,18 +3661,7 @@ def login_for_end_to_end_testing(browser):
|
|||||||
|
|
||||||
@pytest.fixture(scope="session")
|
@pytest.fixture(scope="session")
|
||||||
def end_to_end_context(browser):
|
def end_to_end_context(browser):
|
||||||
# Create a context with HTTP Authentication credentials for Playwright E2E
|
context = browser.new_context()
|
||||||
# tests, if the environment variables exist.
|
|
||||||
if os.getenv("NOTIFY_E2E_TEST_HTTP_AUTH_USER"):
|
|
||||||
context = browser.new_context(
|
|
||||||
http_credentials={
|
|
||||||
"username": os.getenv("NOTIFY_E2E_TEST_HTTP_AUTH_USER"),
|
|
||||||
"password": os.getenv("NOTIFY_E2E_TEST_HTTP_AUTH_PASSWORD"),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
context = browser.new_context()
|
|
||||||
|
|
||||||
yield context
|
yield context
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user