Skip to content
Snippets Groups Projects
Commit fc2096a9 authored by Sebastian Mihalache's avatar Sebastian Mihalache :hammer_pick:
Browse files

feat(user-graphql): build component structure

parent c50c6aa1
No related branches found
No related tags found
3 merge requests!222Sprint #26,!217Sprint #26,!192Hin 1085 user component graphql
const resolvers = require('./resolvers')
const typeDefs = require('./typeDefs')
const model = require('./user')
module.exports = {
model,
modelName: 'User',
resolvers,
typeDefs,
}
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
const typeDefs = `
extend type Query {
users: [User]
}
extend type Mutation {
confirmUser(input: confirmUserInput): User!
}
`
module.exports = typeDefs
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')
})
})
......@@ -44,6 +44,10 @@ module.exports = {
logger,
uploads: 'uploads',
secret: 'SECRET',
enableExperimentalGraphql: true,
graphiql: true,
// typeDefs: authors.typeDefs,
// resolvers,
},
'pubsweet-client': {
API_ENDPOINT: '/api',
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment