From b0d25a9ad3cc1df2fcc11ddb84e4603b94520b09 Mon Sep 17 00:00:00 2001 From: Wes Bos Date: Mon, 10 Sep 2018 14:29:32 -0400 Subject: almost done --- .../64/frontend/__tests__/Signup.test.js | 80 ++++++++++++++++++++ .../__tests__/__snapshots__/Signup.test.js.snap | 62 +++++++++++++++ stepped-solutions/64/frontend/components/Signup.js | 87 ++++++++++++++++++++++ stepped-solutions/64/frontend/components/User.js | 41 ++++++++++ 4 files changed, 270 insertions(+) create mode 100755 stepped-solutions/64/frontend/__tests__/Signup.test.js create mode 100755 stepped-solutions/64/frontend/__tests__/__snapshots__/Signup.test.js.snap create mode 100755 stepped-solutions/64/frontend/components/Signup.js create mode 100755 stepped-solutions/64/frontend/components/User.js (limited to 'stepped-solutions/64') diff --git a/stepped-solutions/64/frontend/__tests__/Signup.test.js b/stepped-solutions/64/frontend/__tests__/Signup.test.js new file mode 100755 index 0000000..e18bdee --- /dev/null +++ b/stepped-solutions/64/frontend/__tests__/Signup.test.js @@ -0,0 +1,80 @@ +import { mount } from 'enzyme'; +import wait from 'waait'; +import toJSON from 'enzyme-to-json'; +import { MockedProvider } from 'react-apollo/test-utils'; +import { ApolloConsumer } from 'react-apollo'; +import Signup, { SIGNUP_MUTATION } from '../components/Signup'; +import { CURRENT_USER_QUERY } from '../components/User'; +import { fakeUser } from '../lib/testUtils'; + +function type(wrapper, name, value) { + wrapper.find(`input[name="${name}"]`).simulate('change', { + target: { name, value }, + }); +} + +const me = fakeUser(); +const mocks = [ + // signup mock mutation + { + request: { + query: SIGNUP_MUTATION, + variables: { + name: me.name, + email: me.email, + password: 'wes', + }, + }, + result: { + data: { + signup: { + __typename: 'User', + id: 'abc123', + email: me.email, + name: me.name, + }, + }, + }, + }, + // current user query mock + { + request: { query: CURRENT_USER_QUERY }, + result: { data: { me } }, + }, +]; + +describe('', () => { + it('renders and matches snapshot', async () => { + const wrapper = mount( + + + + ); + expect(toJSON(wrapper.find('form'))).toMatchSnapshot(); + }); + + it('calls the mutation properly', async () => { + let apolloClient; + const wrapper = mount( + + + {client => { + apolloClient = client; + return ; + }} + + + ); + await wait(); + wrapper.update(); + type(wrapper, 'name', me.name); + type(wrapper, 'email', me.email); + type(wrapper, 'password', 'wes'); + wrapper.update(); + wrapper.find('form').simulate('submit'); + await wait(); + // query the user out of the apollo client + const user = await apolloClient.query({ query: CURRENT_USER_QUERY }); + expect(user.data.me).toMatchObject(me); + }); +}); diff --git a/stepped-solutions/64/frontend/__tests__/__snapshots__/Signup.test.js.snap b/stepped-solutions/64/frontend/__tests__/__snapshots__/Signup.test.js.snap new file mode 100755 index 0000000..14c5912 --- /dev/null +++ b/stepped-solutions/64/frontend/__tests__/__snapshots__/Signup.test.js.snap @@ -0,0 +1,62 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` renders and matches snapshot 1`] = ` +
+
+

+ Sign Up for An Account +

+ + + + + +
+
+`; diff --git a/stepped-solutions/64/frontend/components/Signup.js b/stepped-solutions/64/frontend/components/Signup.js new file mode 100755 index 0000000..e2f1a3f --- /dev/null +++ b/stepped-solutions/64/frontend/components/Signup.js @@ -0,0 +1,87 @@ +import React, { Component } from 'react'; +import { Mutation } from 'react-apollo'; +import gql from 'graphql-tag'; +import Form from './styles/Form'; +import Error from './ErrorMessage'; +import { CURRENT_USER_QUERY } from './User'; + +const SIGNUP_MUTATION = gql` + mutation SIGNUP_MUTATION($email: String!, $name: String!, $password: String!) { + signup(email: $email, name: $name, password: $password) { + id + email + name + } + } +`; + +class Signup extends Component { + state = { + name: '', + email: '', + password: '', + }; + saveToState = e => { + this.setState({ [e.target.name]: e.target.value }); + }; + render() { + return ( + + {(signup, { error, loading }) => ( +
{ + e.preventDefault(); + await signup(); + this.setState({ name: '', email: '', password: '' }); + }} + > +
+

Sign Up for An Account

+ + + + + + +
+
+ )} +
+ ); + } +} + +export default Signup; +export { SIGNUP_MUTATION }; diff --git a/stepped-solutions/64/frontend/components/User.js b/stepped-solutions/64/frontend/components/User.js new file mode 100755 index 0000000..6f8a4fb --- /dev/null +++ b/stepped-solutions/64/frontend/components/User.js @@ -0,0 +1,41 @@ +import { Query } from 'react-apollo'; +import gql from 'graphql-tag'; +import PropTypes from 'prop-types'; + +const CURRENT_USER_QUERY = gql` + query { + me { + id + email + name + permissions + orders { + id + } + cart { + id + quantity + item { + id + price + image + title + description + } + } + } + } +`; + +const User = props => ( + + {payload => props.children(payload)} + +); + +User.propTypes = { + children: PropTypes.func.isRequired, +}; + +export default User; +export { CURRENT_USER_QUERY }; -- cgit v1.3