diff --git a/packages/component-user/index.js b/packages/component-user/index.js new file mode 100644 index 0000000000000000000000000000000000000000..307f862c05b48216eedc7514a3a76bf38f06eb11 --- /dev/null +++ b/packages/component-user/index.js @@ -0,0 +1,10 @@ +const resolvers = require('./resolvers') +const typeDefs = require('./typeDefs') +const model = require('./user') + +module.exports = { + model, + modelName: 'User', + resolvers, + typeDefs, +} diff --git a/packages/component-user/migrations/001-user.sql b/packages/component-user/migrations/001-user.sql new file mode 100644 index 0000000000000000000000000000000000000000..36c7a4ed58c8f9f0886888423b1afca27acdab3b --- /dev/null +++ b/packages/component-user/migrations/001-user.sql @@ -0,0 +1,6 @@ +CREATE TABLE "user" ( + id UUID PRIMARY KEY, + created TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT current_timestamp, + updated TIMESTAMP WITH TIME ZONE, + default_identity TEXT +); \ No newline at end of file diff --git a/packages/component-user/resolvers.js b/packages/component-user/resolvers.js new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/component-user/typeDefs.js b/packages/component-user/typeDefs.js new file mode 100644 index 0000000000000000000000000000000000000000..6247dc4a4a09a01caed390e33a0fd8b4b53828e4 --- /dev/null +++ b/packages/component-user/typeDefs.js @@ -0,0 +1,13 @@ +const typeDefs = ` + extend type Query { + users: [User] + } + + extend type Mutation { + confirmUser(input: confirmUserInput): User! + } + + +` + +module.exports = typeDefs diff --git a/packages/component-user/user.js b/packages/component-user/user.js new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/pubsweet-component-login/graphql/LoginContainer.test.jsx b/packages/pubsweet-component-login/graphql/LoginContainer.test.jsx deleted file mode 100644 index 7df5518babca59528ec37fa596338e687f192365..0000000000000000000000000000000000000000 --- a/packages/pubsweet-component-login/graphql/LoginContainer.test.jsx +++ /dev/null @@ -1,144 +0,0 @@ -import React from 'react' -import { mount } from 'enzyme' -import { MockedProvider } from 'react-apollo/test-utils' -import { ThemeProvider } from 'styled-components' -import { MemoryRouter, Route } from 'react-router-dom' - -import wait from 'waait' -import { LOGIN_USER } from './mutations' -import LoginContainer from './LoginContainer' - -const user1 = { - id: 'user1', - username: 'admin', - password: 'adminadmin', - admin: true, - teams: [], -} - -const mocks = currentUser => [ - { - request: { - query: LOGIN_USER, - variables: { - input: { - username: currentUser.username, - password: currentUser.password, - }, - }, - }, - result: { - data: { - loginUser: { - user: currentUser, - token: 'greatToken', - }, - }, - }, - }, - { - request: { - query: LOGIN_USER, - variables: { - input: { - username: currentUser.username, - password: 'wrongPassword', - }, - }, - }, - result: { - data: { loginUser: null }, - errors: [{ message: 'Wrong username or password.' }], - }, - }, -] - -let globalLocation - -function makeDeepWrapper(currentUser, props = {}) { - // A theme is needed because some components use colors - // specified in the theme to render themselves (e.g. Link) - const theme = { - colorPrimary: '#fff', - colorSecondary: '#fff', - } - - return mount( - <ThemeProvider theme={theme}> - <MockedProvider addTypename={false} mocks={mocks(currentUser)}> - <MemoryRouter initialEntries={['/login']}> - <Route - {...props} - render={p => { - globalLocation = p.location - return <LoginContainer {...p} /> - }} - /> - </MemoryRouter> - </MockedProvider> - </ThemeProvider>, - ) -} - -describe('LoginContainer', () => { - beforeEach(() => { - window.localStorage.clear() - globalLocation = undefined - }) - - it('renders the login form', () => { - const wrapper = makeDeepWrapper(user1) - wrapper.update() - - const fields = wrapper.find('Login') - expect(fields).toHaveLength(1) - }) - - it('submits login information and logs the user in', async () => { - const wrapper = makeDeepWrapper(user1) - wrapper.update() - - const usernameField = wrapper.find('TextField[label="Username"] input') - usernameField.getDOMNode().value = user1.username - usernameField.simulate('change') - const passwordField = wrapper.find('TextField[label="Password"] input') - passwordField.getDOMNode().value = user1.password - passwordField.simulate('change') - - wrapper.update() - const button = wrapper.find('button') - button.simulate('submit') - - wrapper.update() - await wait(50) - - expect(window.localStorage.token).toEqual('greatToken') - expect(globalLocation.pathname).toEqual('/testRedirect') - }) - - it('does not log in user with incorrect credentials', async () => { - const wrapper = makeDeepWrapper(user1) - wrapper.update() - - const usernameField = wrapper.find('TextField[label="Username"] input') - usernameField.getDOMNode().value = user1.username - usernameField.simulate('change') - const passwordField = wrapper.find('TextField[label="Password"] input') - passwordField.getDOMNode().value = 'wrongPassword' - passwordField.simulate('change') - - wrapper.update() - const button = wrapper.find('button') - - button.simulate('submit') - - wrapper.update() - await wait(50) - - expect(wrapper.find('Login').text()).toContain( - 'Wrong username or password.', - ) - expect(window.localStorage.token).toEqual(undefined) - expect(globalLocation.pathname).toEqual('/login') - }) -}) diff --git a/packages/xpub-faraday/config/default.js b/packages/xpub-faraday/config/default.js index 4ac021c51ead4f114dd58b376a2619050fc5687d..a410fa43e53c5f7e91e427f981df974201f8199e 100644 --- a/packages/xpub-faraday/config/default.js +++ b/packages/xpub-faraday/config/default.js @@ -44,6 +44,10 @@ module.exports = { logger, uploads: 'uploads', secret: 'SECRET', + enableExperimentalGraphql: true, + graphiql: true, + // typeDefs: authors.typeDefs, + // resolvers, }, 'pubsweet-client': { API_ENDPOINT: '/api',