diff --git a/package.json b/package.json index 26624f18b0..9476141a41 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,8 @@ "npm": "~6.4.0" }, "scripts": { - "test-backend": "env-cmd -f tests/.test-full-env jest --coverage --maxWorkers=4", - "test-backend:watch": "env-cmd -f tests/.test-full-env jest --watch", + "test-backend": "env-cmd -f tests/.test-env jest --coverage --maxWorkers=4", + "test-backend:watch": "env-cmd -f tests/.test-env jest --watch", "test-frontend": "jest --config=tests/unit/frontend/jest.config.js", "build": "npm run build-backend && npm run build-frontend", "build-backend": "tsc -p tsconfig.build.json", @@ -28,15 +28,12 @@ "dev": "docker-compose up --build", "docker-dev": "npm run build-frontend-dev:watch & ts-node-dev --respawn --transpile-only --inspect=0.0.0.0 --exit-child -- src/app/server.ts", "test": "npm run test-backend && npm run test-frontend", - "test-e2e-build": "npm run build-backend && npm run build-frontend-dev", - "test-run": "concurrently --success last --kill-others \"mockpass\" \"maildev\" \"node dist/backend/app/server.js\" \"node ./tests/mock-webhook-server.js\"", - "testcafe-full-env": "testcafe --skip-js-errors -c 3 chrome:headless ./tests/end-to-end --test-meta full-env=true --app \"npm run test-run\" --app-init-delay 10000", - "testcafe-basic-env": "testcafe --skip-js-errors -c 3 chrome:headless ./tests/end-to-end --test-meta basic-env=true --app \"npm run test-run\" --app-init-delay 10000", "download-binary": "node tests/end-to-end/helpers/get-mongo-binary.js", - "test-e2e-full": "env-cmd -f tests/.test-full-env --use-shell \"npm run download-binary && npm run testcafe-full-env\"", - "test-e2e-basic": "env-cmd -f tests/.test-basic-env --use-shell \"npm run download-binary && npm run testcafe-basic-env\"", - "test-e2e": "npm run test-e2e-build && npm run test-e2e-full && npm run test-e2e-basic", - "test-e2e-ci": "npm run test-e2e-full && npm run test-e2e-basic", + "test-e2e": "npm run test-e2e-build && npm run test-e2e-ci", + "test-e2e-build": "npm run build-backend && npm run build-frontend-dev", + "test-e2e-ci": "env-cmd -f tests/.test-env --use-shell \"npm run download-binary && npm run testcafe-command\"", + "testcafe-command": "testcafe --skip-js-errors -c 3 chrome:headless ./tests/end-to-end --app \"npm run test-e2e-server\" --app-init-delay 10000", + "test-e2e-server": "concurrently --success last --kill-others \"mockpass\" \"maildev\" \"node dist/backend/app/server.js\" \"node ./tests/mock-webhook-server.js\"", "lint-code": "eslint src/ --quiet --fix", "lint-style": "stylelint '*/**/*.css' --quiet --fix", "lint-html": "htmlhint && prettier --write './src/public/**/*.html' --ignore-path './dist/**' --loglevel silent", diff --git a/tests/.test-basic-env b/tests/.test-basic-env deleted file mode 100644 index 2bfb90ca0a..0000000000 --- a/tests/.test-basic-env +++ /dev/null @@ -1,21 +0,0 @@ -SES_PORT=1025 -SES_HOST=0.0.0.0 - -SERVICES=s3 - -MONGO_BINARY_VERSION=4.0.22 -MOCK_WEBHOOK_CONFIG_FILE=webhook-server-config.csv -MOCK_WEBHOOK_PORT=4000 - -IMAGE_S3_BUCKET=local-image-bucket -LOGO_S3_BUCKET=local-logo-bucket -ATTACHMENT_S3_BUCKET=local-attachment-bucket -NODE_ENV=test -FORMSG_SDK_MODE=test - -AWS_ACCESS_KEY_ID=fakeAccessKeyId -AWS_SECRET_ACCESS_KEY=fakeSecretAccessKey -SESSION_SECRET=sandcrawler-138577 - -AWS_ENDPOINT=http://localhost:4566 -APP_URL=https://example.com \ No newline at end of file diff --git a/tests/.test-full-env b/tests/.test-env similarity index 100% rename from tests/.test-full-env rename to tests/.test-env diff --git a/tests/end-to-end/email-submission.e2e.js b/tests/end-to-end/email-submission.e2e.js index 1ec54bc5ad..b5d7c62f56 100644 --- a/tests/end-to-end/email-submission.e2e.js +++ b/tests/end-to-end/email-submission.e2e.js @@ -65,7 +65,7 @@ fixture('Email mode submissions') // the form and reach the end page. // Form with all basic field types -test.meta('basic-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions() formData.formFields = cloneDeep(allFields) t.ctx.formData = formData @@ -75,7 +75,7 @@ test.meta('basic-env', 'true').before(async (t) => { }) // Form where all basic field types are hidden by logic -test.meta('basic-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions() formData.formFields = cloneDeep(hiddenFieldsData) formData.logicData = cloneDeep(hiddenFieldsLogicData) @@ -86,7 +86,7 @@ test.meta('basic-env', 'true').before(async (t) => { }) // Form where all fields are optional and no field is answered -test.meta('basic-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions() formData.formFields = allFields.map((field) => { return getBlankVersion(getOptionalVersion(field)) @@ -98,7 +98,7 @@ test.meta('basic-env', 'true').before(async (t) => { }) // Form with three attachments to test de-duplication of attachment names -test.meta('basic-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions() formData.formFields = cloneDeep(tripleAttachment) t.ctx.formData = formData @@ -108,7 +108,7 @@ test.meta('basic-env', 'true').before(async (t) => { }) // Form with optional attachment in between mandatory ones -test.meta('basic-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions() formData.formFields = cloneDeep(tripleAttachment) // Modify middle attachment field to be optional and unfilled @@ -127,7 +127,7 @@ test.meta('basic-env', 'true').before(async (t) => { ) // Form where submission is prevented using chained logic -test.meta('basic-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions() formData.formFields = cloneDeep(chainDisabled.fields) formData.logicData = cloneDeep(chainDisabled.logicData) @@ -142,7 +142,7 @@ test.meta('basic-env', 'true').before(async (t) => { ) }) -test.meta('basic-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions() t.ctx.formData = formData // cloneDeep in case other tests in future import and modify templateFields @@ -159,7 +159,7 @@ test.meta('basic-env', 'true').before(async (t) => { }) // Basic form with only one field and CP authentication -test.meta('full-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions({ authType: 'CP', status: 'PRIVATE', @@ -180,7 +180,7 @@ test.meta('full-env', 'true').before(async (t) => { }) // Basic form with only one field and SP authentication -test.meta('full-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions({ authType: 'SP', status: 'PRIVATE', @@ -201,7 +201,7 @@ test.meta('full-env', 'true').before(async (t) => { }) // Form with a mix of autofilled and non-autofilled MyInfo fields -test.meta('full-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions({ authType: 'MyInfo', esrvcId: 'Test-eServiceId-Sp', @@ -214,7 +214,7 @@ test.meta('full-env', 'true').before(async (t) => { await verifySubmissionE2e(t, t.ctx.form, t.ctx.formData, authData) }) -test.meta('full-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions() formData.formFields = cloneDeep(verifiableEmailField) t.ctx.formData = formData diff --git a/tests/end-to-end/encrypt-submission.e2e.js b/tests/end-to-end/encrypt-submission.e2e.js index 8ef89bd79d..75c30a7aab 100644 --- a/tests/end-to-end/encrypt-submission.e2e.js +++ b/tests/end-to-end/encrypt-submission.e2e.js @@ -65,7 +65,7 @@ fixture('Storage mode submissions') }) // Form with all field types available in storage mode -test.meta('basic-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions() formData.formFields = cloneDeep(allFieldsEncrypt) t.ctx.formData = formData @@ -75,7 +75,7 @@ test.meta('basic-env', 'true').before(async (t) => { }) // Form where all basic field types are hidden by logic -test.meta('basic-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions() formData.formFields = cloneDeep(hiddenFieldsDataEncrypt) formData.logicData = cloneDeep(hiddenFieldsLogicDataEncrypt) @@ -86,7 +86,7 @@ test.meta('basic-env', 'true').before(async (t) => { }) // Form where all fields are optional and no field is answered -test.meta('basic-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions() formData.formFields = allFieldsEncrypt.map((field) => { return getBlankVersion(getOptionalVersion(field)) @@ -98,7 +98,7 @@ test.meta('basic-env', 'true').before(async (t) => { }) // Form where submission is prevented using chained logic -test.meta('basic-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions() formData.formFields = cloneDeep(chainDisabled.fields) formData.logicData = cloneDeep(chainDisabled.logicData) @@ -114,7 +114,7 @@ test.meta('basic-env', 'true').before(async (t) => { }) // Basic form with only one field and SP authentication -test.meta('full-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions({ authType: 'SP', status: 'PRIVATE', @@ -135,7 +135,7 @@ test.meta('full-env', 'true').before(async (t) => { }) // Basic form with only one field and CP authentication -test.meta('full-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions({ authType: 'CP', status: 'PRIVATE', @@ -156,7 +156,7 @@ test.meta('full-env', 'true').before(async (t) => { }) // Basic form with verifiable email field -test.meta('full-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions() formData.formFields = cloneDeep(verifiableEmailField) t.ctx.formData = formData @@ -166,7 +166,7 @@ test.meta('full-env', 'true').before(async (t) => { }) // Basic form with only one field -test.meta('full-env', 'true').before(async (t) => { +test.before(async (t) => { const formData = await getDefaultFormOptions() formData.formFields = [ { diff --git a/tests/end-to-end/login.e2e.js b/tests/end-to-end/login.e2e.js index 7c7e4c0601..f047389079 100644 --- a/tests/end-to-end/login.e2e.js +++ b/tests/end-to-end/login.e2e.js @@ -45,23 +45,20 @@ fixture('login') await db.close() }) -test.meta('basic-env', 'true').meta('full-env', 'true')( - 'Reject emails that do not have white-listed domains', - async (t) => { - // Enter email - await enterEmail(t, 'user@non-white-listed-agency.com') - - // Ensure error message is seen - await t - .expect(signInPage.emailErrorMsg.textContent) - .contains( - 'Please log in with your official government or government-linked email address.', - ) - }, -) +test('Reject emails that do not have white-listed domains', async (t) => { + // Enter email + await enterEmail(t, 'user@non-white-listed-agency.com') + + // Ensure error message is seen + await t + .expect(signInPage.emailErrorMsg.textContent) + .contains( + 'Please log in with your official government or government-linked email address.', + ) +}) test - .meta('basic-env', 'true') + .before(async (t) => { t.ctx.user = await createUser('existinguser@data.gov.sg') }) @@ -85,7 +82,7 @@ test ) test - .meta('basic-env', 'true') + .before((t) => { t.ctx.email = 'newuser@data.gov.sg' }) @@ -108,7 +105,7 @@ test ) test - .meta('basic-env', 'true') + .before(async (t) => { t.ctx.user = await createUser('preventuseremail@data.gov.sg') }) @@ -140,7 +137,7 @@ test }) test - .meta('basic-env', 'true') + .before(async (t) => { t.ctx.user = await createUser('resenduseremail@data.gov.sg') }) @@ -174,7 +171,7 @@ test }) test - .meta('basic-env', 'true') + .before(async (t) => { t.ctx.user = await createUser('logoutuseremail@data.gov.sg') })