diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6a9870968e93df0c20c5b054fc6afb5fabe2c78e..88c620dd790fcc45156cb8fbf7f76512055c3bee 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -64,5 +64,5 @@ demo:now: url: $NOW_URL script: - npm i -g --unsafe-perm now - - cd ${HOME} - - npm run deploy_now \ No newline at end of file + - cd ${HOME}/now + - now --public --docker --token $NOW_TOKEN -e AWS_S3_ACCESS_KEY=$AWS_S3_ACCESS_KEY -e AWS_S3_SECRET_KEY=$AWS_S3_SECRET_KEY -e AWS_S3_REGION=$AWS_S3_REGION -e AWS_S3_BUCKET=$AWS_S3_BUCKET -e AWS_SES_SECRET_KEY=$AWS_SES_SECRET_KEY -e AWS_SES_ACCESS_KEY=$AWS_SES_ACCESS_KEY -e AWS_SES_REGION=$AWS_SES_REGION -e EMAIL_SENDER=$EMAIL_SENDER -e secret=$SECRET \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 698c88f458e85c2f87bdb64b4f9722ea6a2c6bfc..6b7916c6b878cd4d86b238fdca907fe1ea0aefbf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,6 +3,7 @@ FROM xpub/xpub:base COPY package.json yarn.lock ./ COPY lerna.json .babelrc .eslintignore .eslintrc .prettierrc .stylelintignore .stylelintrc ./ COPY packages packages +COPY now now RUN [ "yarn", "config", "set", "workspaces-experimental", "true" ] diff --git a/package.json b/package.json index d3ba020bbae08ea43170d63411b295dfcbc9a6bd..079e1d213d174a5d15d3b0943eded9c29c5e2881 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,7 @@ "lint:style": "stylelint packages/**/*.scss packages/**/*.css", "precommit": "lint-staged", "styleguide": "lerna run styleguide", - "test": "lerna run test", - "deploy_now": "cd now && now --public --docker --token $NOW_TOKEN -e AWS_S3_ACCESS_KEY=$AWS_S3_ACCESS_KEY -e AWS_S3_SECRET_KEY=$AWS_S3_SECRET_KEY -e AWS_S3_REGION=$AWS_S3_REGION -e AWS_S3_BUCKET=$AWS_S3_BUCKET -e AWS_SES_SECRET_KEY=$AWS_SES_SECRET_KEY -e AWS_SES_ACCESS_KEY=$AWS_SES_ACCESS_KEY -e AWS_SES_REGION=$AWS_SES_REGION -e EMAIL_SENDER=$EMAIL_SENDER -e secret=$SECRET" + "test": "lerna run test" }, "lint-staged": { "*.js": [ diff --git a/packages/component-invite/src/routes/getCollectionUsers.js b/packages/component-invite/src/routes/getCollectionUsers.js index c1389b98c1e00722f03a65309d4263b9d95dd693..3644aa4c50f9f48d965cbeb8f752d955f55a87e2 100644 --- a/packages/component-invite/src/routes/getCollectionUsers.js +++ b/packages/component-invite/src/routes/getCollectionUsers.js @@ -1,6 +1,8 @@ const helpers = require('../helpers/helpers') const teamHelper = require('../helpers/Team') +const config = require('config') +const configRoles = config.get('roles') module.exports = models => async (req, res) => { const { role } = req.query if (!helpers.checkForUndefinedParams(role)) { @@ -8,6 +10,17 @@ module.exports = models => async (req, res) => { return } + if (!configRoles.collection.includes(role)) { + res.status(400).json({ error: `Role ${role} is invalid` }) + return + } + + const reqUser = await models.User.find(req.user) + if (!reqUser.editorInChief) { + res.status(400).json({ error: 'The request user must be Editor in Chief' }) + return + } + const { collectionId } = req.params try { await models.Collection.find(collectionId) diff --git a/packages/component-invite/src/tests/getCollectionUsers.test.js b/packages/component-invite/src/tests/getCollectionUsers.test.js index 2458b1044b8349bbc9f7f00fd6c8732be6cd1ba1..1599ea3c1ee57da7e8b38e25efd7d93d3ef668dd 100644 --- a/packages/component-invite/src/tests/getCollectionUsers.test.js +++ b/packages/component-invite/src/tests/getCollectionUsers.test.js @@ -5,7 +5,8 @@ const httpMocks = require('node-mocks-http') const fixtures = require('./fixtures/fixtures') const Model = require('./helpers/Model') -const user = fixtures.users.editorInChief +const { standardCollection } = fixtures.collections +const { editorInChief, admin } = fixtures.users const query = { role: 'handlingEditor', } @@ -14,7 +15,8 @@ describe('Get collection users route handler', () => { it('should return success when the role is correct, the collection exists and the request user is editorInChief ', async () => { const req = httpMocks.createRequest() req.query = query - req.params.collectionId = '2c4fb766-a798-4c32-b857-c5d21a2ab331' + req.params.collectionId = standardCollection.id + req.user = editorInChief.id const res = httpMocks.createResponse() const models = Model.build() await require(getCollectionUsersPath)(models)(req, res) @@ -27,13 +29,51 @@ describe('Get collection users route handler', () => { delete query.role const req = httpMocks.createRequest() req.query = query - + req.user = editorInChief.id const res = httpMocks.createResponse() - const models = Model.build(user) + const models = Model.build() await require(getCollectionUsersPath)(models)(req, res) expect(res.statusCode).toBe(400) const data = JSON.parse(res._getData()) expect(data.error).toEqual('Role is required') - query.email = 'handlingEditor' + query.role = 'handlingEditor' + }) + it('should return an error when the collection does not exist', async () => { + const req = httpMocks.createRequest() + req.query = query + req.params.collectionId = 'invalid-id' + req.user = editorInChief.id + const res = httpMocks.createResponse() + const models = Model.build() + await require(getCollectionUsersPath)(models)(req, res) + expect(res.statusCode).toBe(404) + const data = JSON.parse(res._getData()) + expect(data.error).toEqual('collection not found') + }) + it('should return an error when the role is invalid', async () => { + query.role = 'invalidRole' + const req = httpMocks.createRequest() + req.query = query + req.params.collectionId = standardCollection.id + req.user = editorInChief.id + const res = httpMocks.createResponse() + const models = Model.build() + await require(getCollectionUsersPath)(models)(req, res) + expect(res.statusCode).toBe(400) + const data = JSON.parse(res._getData()) + expect(data.error).toEqual(`Role ${query.role} is invalid`) + query.role = 'handlingEditor' + }) + it('should return an error when the request user is not editorInChief', async () => { + const req = httpMocks.createRequest() + req.query = query + req.params.collectionId = standardCollection.id + req.user = admin.id + const res = httpMocks.createResponse() + const models = Model.build() + await require(getCollectionUsersPath)(models)(req, res) + expect(res.statusCode).toBe(400) + const data = JSON.parse(res._getData()) + expect(data.error).toEqual('The request user must be Editor in Chief') }) }) diff --git a/packages/components-faraday/src/components/AuthorList/AuthorAdder.js b/packages/components-faraday/src/components/AuthorList/AuthorAdder.js index eccca432675ccaadea8061465644fc4afe690571..2cb1d3258fbd47afa1004fa0fb6af36b29a46314 100644 --- a/packages/components-faraday/src/components/AuthorList/AuthorAdder.js +++ b/packages/components-faraday/src/components/AuthorList/AuthorAdder.js @@ -27,7 +27,7 @@ const AuthorAdder = ({ isFetching, }) => ( <Root> - <Button onClick={setEditMode(true)} primary> + <Button data-test="button-add-author" onClick={setEditMode(true)} primary> {authors.length === 0 ? '+ Add submitting author' : '+ Add author'} </Button> {editMode && ( @@ -54,9 +54,15 @@ const AuthorAdder = ({ <MenuItem label="Country*" name="country" options={countries} /> </Row> <ButtonsContainer> - <Button onClick={setEditMode(false)}>Cancel</Button> + <Button data-test="button-cancel-author" onClick={setEditMode(false)}> + Cancel + </Button> {!isFetching ? ( - <Button onClick={handleSubmit} primary> + <Button + data-test="button-save-author" + onClick={handleSubmit} + primary + > Save </Button> ) : ( diff --git a/packages/components-faraday/src/components/AuthorList/FormItems.js b/packages/components-faraday/src/components/AuthorList/FormItems.js index 807a34fe4cd3103414ecfb16871e67a9ad9851bc..96040013537ca947984c8151894f1e09fa4848e0 100644 --- a/packages/components-faraday/src/components/AuthorList/FormItems.js +++ b/packages/components-faraday/src/components/AuthorList/FormItems.js @@ -19,7 +19,7 @@ export const ValidatedTextField = ({ } export const MenuItem = ({ label, name, options }) => ( - <MenuItemRoot> + <MenuItemRoot data-test="country-selector-author"> <StyledLabel>{label}</StyledLabel> <ValidatedField component={input => <Menu {...input} options={options} />} diff --git a/packages/xpub-faraday/package.json b/packages/xpub-faraday/package.json index 365407d9373fac7980c27e0f9773f0b71db7bc16..84bcffe1ebda407d2399808effe8c1e920bacae4 100644 --- a/packages/xpub-faraday/package.json +++ b/packages/xpub-faraday/package.json @@ -78,7 +78,7 @@ "setupdb": "pubsweet setupdb ./", "reset": "pubsweet setupdb --clobber ./", "start": "pubsweet start", - "start-now": "echo $secret > config/local-development.json && npm run start", + "start-now": "echo $secret > config/local-development.json && npm run reset --username admin --email admin@mailinator.com --password admin123 && npm run start", "build": "NODE_ENV=production pubsweet build" } }