1+ import { mount } from 'enzyme' ;
2+ import wait from 'waait' ;
3+ import toJSON from 'enzyme-to-json' ;
4+ import { MockedProvider } from 'react-apollo/test-utils' ;
5+ import { ApolloConsumer } from 'react-apollo' ;
6+ import AddToCart , { ADD_TO_CART_MUTATION } from '../components/AddToCart' ;
7+ import { CURRENT_USER_QUERY } from '../components/User' ;
8+ import { fakeUser , fakeCartItem } from '../lib/testUtils' ;
9+
10+ const mocks = [
11+ {
12+ request : { query : CURRENT_USER_QUERY } ,
13+ result : {
14+ data : {
15+ me : {
16+ ...fakeUser ( ) ,
17+ cart : [ ] ,
18+ } ,
19+ } ,
20+ } ,
21+ } ,
22+ {
23+ request : { query : CURRENT_USER_QUERY } ,
24+ result : {
25+ data : {
26+ me : {
27+ ...fakeUser ( ) ,
28+ cart : [ fakeCartItem ( ) ] ,
29+ } ,
30+ } ,
31+ } ,
32+ } ,
33+ {
34+ request : { query : ADD_TO_CART_MUTATION , variables : { id : 'abc123' } } ,
35+ result : {
36+ data : {
37+ addToCart : {
38+ ...fakeCartItem ( ) ,
39+ quantity : 1 ,
40+ } ,
41+ } ,
42+ } ,
43+ } ,
44+ ] ;
45+
46+ describe ( '<AddToCart/>' , ( ) => {
47+ it ( 'renders and matches the snap shot' , async ( ) => {
48+ const wrapper = mount (
49+ < MockedProvider mocks = { mocks } >
50+ < AddToCart id = "abc123" />
51+ </ MockedProvider >
52+ ) ;
53+ await wait ( ) ;
54+ wrapper . update ( ) ;
55+ expect ( toJSON ( wrapper . find ( 'button' ) ) ) . toMatchSnapshot ( ) ;
56+ } ) ;
57+
58+ it ( 'adds an item to cart when clicked' , async ( ) => {
59+ let apolloClient ;
60+ const wrapper = mount (
61+ < MockedProvider mocks = { mocks } >
62+ < ApolloConsumer >
63+ { client => {
64+ apolloClient = client ;
65+ return < AddToCart id = "abc123" /> ;
66+ } }
67+ </ ApolloConsumer >
68+ </ MockedProvider >
69+ ) ;
70+ await wait ( ) ;
71+ wrapper . update ( ) ;
72+ const { data : { me } } = await apolloClient . query ( { query : CURRENT_USER_QUERY } ) ;
73+ // console.log(me);
74+ expect ( me . cart ) . toHaveLength ( 0 ) ;
75+ // add an item to the cart
76+ wrapper . find ( 'button' ) . simulate ( 'click' ) ;
77+ await wait ( ) ;
78+ // check if the item is in the cart
79+ const { data : { me : me2 } } = await apolloClient . query ( { query : CURRENT_USER_QUERY } ) ;
80+ expect ( me2 . cart ) . toHaveLength ( 1 ) ;
81+ expect ( me2 . cart [ 0 ] . id ) . toBe ( 'omg123' ) ;
82+ expect ( me2 . cart [ 0 ] . quantity ) . toBe ( 3 ) ;
83+ } ) ;
84+
85+ it ( 'changes from add to adding when clicked' , async ( ) => {
86+ const wrapper = mount (
87+ < MockedProvider mocks = { mocks } >
88+ < AddToCart id = "abc123" />
89+ </ MockedProvider >
90+ ) ;
91+ await wait ( ) ;
92+ wrapper . update ( ) ;
93+ expect ( wrapper . text ( ) ) . toContain ( 'Add To Cart' ) ;
94+ wrapper . find ( 'button' ) . simulate ( 'click' ) ;
95+ expect ( wrapper . text ( ) ) . toContain ( 'Adding To Cart' ) ;
96+ } ) ;
97+ } ) ;
0 commit comments