diff --git a/common/constants/messages.js b/common/constants/messages.js index 4c69e14a9..363e041cc 100644 --- a/common/constants/messages.js +++ b/common/constants/messages.js @@ -7,6 +7,7 @@ export const validationErrorMessages = { 'Minimum password requirements: 8 characters, 1 Lowercase Letter, 1 Uppercase Letter, 1 Number', passwordsMatch: 'Passwords must match', codeOfConduct: 'You must agree to our Code of Conduct', + slackGuidelines: 'You must agree to our Slack workspace guidelines', }; export const networkErrorMessages = { diff --git a/common/constants/urls.js b/common/constants/urls.js index c3417d521..fb4f84545 100644 --- a/common/constants/urls.js +++ b/common/constants/urls.js @@ -2,5 +2,6 @@ const s3hostName = 'operation-code-assets.s3.us-east-2.amazonaws.com'; const s3 = `https://${s3hostName}/`; const leadershipCircleLink = 'https://secure.lglforms.com/form_engine/s/L428AQ2rrsFJQyy5Fbglvg'; const codeOfConduct = `https://github.com/OperationCode/operationcode_docs/blob/master/community/code_of_conduct.md`; +const slackGuidelines = `https://github.com/OperationCode/START_HERE/blob/master/community_guidelines.md`; -module.exports = { s3hostName, s3, leadershipCircleLink, codeOfConduct }; +module.exports = { s3hostName, s3, leadershipCircleLink, codeOfConduct, slackGuidelines }; diff --git a/components/Footer/__tests__/Footer.test.js b/components/Footer/__tests__/Footer.test.js index 59e15ef5f..d53579e4e 100644 --- a/components/Footer/__tests__/Footer.test.js +++ b/components/Footer/__tests__/Footer.test.js @@ -4,7 +4,7 @@ import Footer from '../Footer'; describe('Footer', () => { it('should render with no props passed', () => { - jest.useFakeTimers().setSystemTime(new Date('2023-01-01')); + jest.useFakeTimers().setSystemTime(new Date('2023-03-03')); createShallowSnapshotTest(); }); }); diff --git a/components/Forms/RegistrationForm/RegistrationForm.js b/components/Forms/RegistrationForm/RegistrationForm.js index c6cf50a89..5e009ea7c 100644 --- a/components/Forms/RegistrationForm/RegistrationForm.js +++ b/components/Forms/RegistrationForm/RegistrationForm.js @@ -7,7 +7,7 @@ import { createUser } from 'common/constants/api'; import { getServerErrorMessage } from 'common/utils/api-utils'; import { validationErrorMessages } from 'common/constants/messages'; import { capitalizeFirstLetter } from 'common/utils/string-utils'; -import { codeOfConduct } from 'common/constants/urls'; +import { codeOfConduct, slackGuidelines } from 'common/constants/urls'; import Button from 'components/Buttons/Button/Button'; import Checkbox from 'components/Form/Checkbox/Checkbox'; import Form from 'components/Form/Form'; @@ -27,6 +27,7 @@ const defaultValues = { lastName: '', zipcode: '', codeOfConduct: false, + slackGuidelines: false, }; /** @@ -52,6 +53,7 @@ const registrationSchema = Yup.object().shape({ lastName: Yup.string().trim().required(validationErrorMessages.required), zipcode: Yup.string().trim().required(validationErrorMessages.required), codeOfConduct: Yup.boolean().oneOf([true], validationErrorMessages.codeOfConduct), + slackGuidelines: Yup.boolean().oneOf([true], validationErrorMessages.slackGuidelines), }); RegistrationForm.propTypes = { @@ -66,6 +68,7 @@ RegistrationForm.propTypes = { lastName: string, zipcode: oneOfType([string, number]), codeOfConduct: boolean, + slackGuidelines: boolean, }), }; @@ -114,18 +117,20 @@ function RegistrationForm({ initialValues, onSubmit, onSuccess }) { validationSchema={registrationSchema} > {({ isSubmitting }) => ( -
`; diff --git a/cypress/e2e/join.spec.js b/cypress/e2e/join.spec.js index 480550c4a..00dfd9ee0 100644 --- a/cypress/e2e/join.spec.js +++ b/cypress/e2e/join.spec.js @@ -10,7 +10,8 @@ const inputFields = { firstName: 'First Name*', lastName: 'Last Name*', zipcode: 'Zipcode*', - codeOfConduct: /I have read and agree to/, + codeOfConduct: /Code of Conduct/, + slackGuidelines: /Slack Community Guidelines/, }; const assertError = ({ @@ -70,6 +71,7 @@ describe('join', () => { cy.findByLabelText(inputFields.lastName).type(validUser.lastName); cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); + cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); assertFailedLogin({ numberOfErrors: 2 }); }); @@ -84,6 +86,7 @@ describe('join', () => { cy.findByLabelText(inputFields.lastName).type(validUser.lastName); cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); + cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); assertFailedLogin({ numberOfErrors: 2 }); }); @@ -102,6 +105,7 @@ describe('join', () => { cy.findByLabelText(inputFields.lastName).type(invalidUser.lastName); cy.findByLabelText(inputFields.zipcode).type(invalidUser.zipcode); cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); + cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); assertFailedLogin({ errorMessage: validationErrorMessages.email }); }); @@ -117,6 +121,7 @@ describe('join', () => { cy.findByLabelText(inputFields.lastName).type(validUser.lastName); cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); + cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); assertFailedLogin(); }); @@ -133,6 +138,7 @@ describe('join', () => { cy.findByLabelText(inputFields.lastName).type(validUser.lastName); cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); + cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); assertFailedLogin({ errorMessage: validationErrorMessages.emailsMatch }); }); @@ -144,6 +150,7 @@ describe('join', () => { cy.findByLabelText(inputFields.lastName).type(existingUser.lastName); cy.findByLabelText(inputFields.zipcode).type(existingUser.zipcode); cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); + cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); assertFailedLogin({ errorMessage: validationErrorMessages.emailExists, shouldWait: true }); }); @@ -162,6 +169,7 @@ describe('join', () => { cy.findByLabelText(inputFields.lastName).type(validUser.lastName); cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); + cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); assertFailedLogin(); }); @@ -177,6 +185,7 @@ describe('join', () => { cy.findByLabelText(inputFields.lastName).type(validUser.lastName); cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); + cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); assertFailedLogin(); }); @@ -192,6 +201,7 @@ describe('join', () => { cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); + cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); assertFailedLogin(); }); @@ -207,6 +217,7 @@ describe('join', () => { cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); + cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); assertFailedLogin(); }); @@ -225,6 +236,7 @@ describe('join', () => { assertError(); cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); + cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); assertFailedLogin(); }); @@ -240,6 +252,7 @@ describe('join', () => { assertError(); cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); + cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); assertFailedLogin(); }); @@ -253,15 +266,32 @@ describe('join', () => { cy.findByLabelText(inputFields.codeOfConduct).focus(); cy.findByLabelText(inputFields.codeOfConduct).blur(); + cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); + assertError({ numberOfErrors: 1, errorMessage: validationErrorMessages.codeOfConduct }); assertFailedLogin({ numberOfErrors: 1, errorMessage: validationErrorMessages.codeOfConduct }); }); + it('should NOT be able to register when Slack Community Guidelines is not agreed to', () => { + cy.findByLabelText(inputFields.email).type(validUser.email); + cy.findByLabelText(inputFields.confirmEmail).type(validUser.email); + cy.findByLabelText(inputFields.firstName).type(validUser.firstName); + cy.findByLabelText(inputFields.lastName).type(validUser.lastName); + cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); + cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); + + cy.findByLabelText(inputFields.slackGuidelines).focus(); + cy.findByLabelText(inputFields.slackGuidelines).blur(); + + assertError({ numberOfErrors: 1, errorMessage: validationErrorMessages.slackGuidelines }); + assertFailedLogin({ numberOfErrors: 1, errorMessage: validationErrorMessages.slackGuidelines }); + }); + /** * Registration without all fields */ it('should NOT be able to register without filling all required fields', () => { - assertFailedLogin({ numberOfErrors: 6 }); + assertFailedLogin({ numberOfErrors: 7 }); }); /** @@ -274,6 +304,7 @@ describe('join', () => { cy.findByLabelText(inputFields.lastName).type(validUser.lastName); cy.findByLabelText(inputFields.zipcode).type(validUser.zipcode); cy.findByLabelText(inputFields.codeOfConduct).type(validUser.codeOfConduct); + cy.findByLabelText(inputFields.slackGuidelines).type(validUser.slackGuidelines); cy.findByText('Submit').click(); cy.url({ timeout: 20000 }).should('contain', '/join/form'); diff --git a/test-utils/mockGenerators/mockUser.js b/test-utils/mockGenerators/mockUser.js index 1f801b245..52388f508 100644 --- a/test-utils/mockGenerators/mockUser.js +++ b/test-utils/mockGenerators/mockUser.js @@ -36,6 +36,7 @@ export default function mockUser({ * so that the mocked value is correct in all contexts. */ const codeOfConduct = typeof Cypress === 'object' ? ' ' : true; + const slackGuidelines = typeof Cypress === 'object' ? ' ' : true; const user = { email, @@ -46,6 +47,7 @@ export default function mockUser({ lastName, zipcode, codeOfConduct, + slackGuidelines, }; return user;