forked from ericpkatz/acme-shopping
-
Notifications
You must be signed in to change notification settings - Fork 1
/
spec.js
155 lines (138 loc) · 5 KB
/
spec.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
const { conn, User, Product } = require('./db');
const app = require('supertest')(require('./app'));
const { expect } = require('chai');
const jwt = require('jsonwebtoken');
describe('Shopping', ()=> {
beforeEach(async()=> {
await conn.sync({ force: true });
await User.create({ username: 'moe', password: 'MOE'});
await Product.create({ name: 'foo'});
});
describe('Successful Authentication', ()=> {
it('Logs the User In', async()=> {
let response = await app.post('/api/sessions')
.send({ username: 'moe', password: 'MOE'});
expect(response.status).to.equal(200);
const token = response.body.token;
expect(token).to.be.ok;
response = await app.get('/api/sessions')
.set('authorization', token);
expect(response.status).to.equal(200);
expect(response.body.username).to.equal('moe');
});
});
describe('The Shopping Experience', ()=> {
it('User can create an order', async()=> {
const moe = await User.findOne({
where: {
username: 'moe'
}
});
const token = jwt.sign({ id: moe.id}, process.env.JWT);
let response = await app.get('/api/orders/cart')
.set('authorization', token);
response = await app.post('/api/orders')
.set('authorization', token);
expect(response.status).to.equal(200);
});
it('For first request, user gets an empty cart', async()=> {
const moe = await User.findOne({
where: {
username: 'moe'
}
});
const token = jwt.sign({ id: moe.id}, process.env.JWT);
const response = await app.get('/api/orders/cart')
.set('authorization', token);
expect(response.status).to.equal(200);
expect(response.body.lineItems).to.eql([]);
});
it('The same cart is returned to user', async()=> {
const moe = await User.findOne({
where: {
username: 'moe'
}
});
const token = jwt.sign({ id: moe.id}, process.env.JWT);
let response = await app.get('/api/orders/cart')
.set('authorization', token);
const cart = response.body;
response = await app.get('/api/orders/cart')
.set('authorization', token);
expect(response.body.id).to.equal(cart.id);
});
describe('adding an item to a cart', ()=> {
describe('setting quantity to zero', ()=> {
it('remove it from cart', async()=> {
const moe = await User.findOne({
where: {
username: 'moe'
}
});
const foo = await Product.findOne({
where: {
name: 'foo'
}
});
const token = jwt.sign({ id: moe.id}, process.env.JWT);
let response = await app.put('/api/orders/cart')
.set('authorization', token)
.send({ product: foo, quantity: 3});
expect(response.status).to.equal(200);
const lineItem = response.body.lineItems.find( lineItem => lineItem.productId === foo.id);
expect(lineItem).to.be.ok;
response = await app.put('/api/orders/cart')
.set('authorization', token)
.send({ product: foo, quantity: 0});
expect(response.body.lineItems).to.eql([]);
});
});
describe('for the first time', ()=> {
it('creates a line item', async()=> {
const moe = await User.findOne({
where: {
username: 'moe'
}
});
const foo = await Product.findOne({
where: {
name: 'foo'
}
});
const token = jwt.sign({ id: moe.id}, process.env.JWT);
const response = await app.put('/api/orders/cart')
.set('authorization', token)
.send({ product: foo, quantity: 3});
expect(response.status).to.equal(200);
const lineItem = response.body.lineItems.find( lineItem => lineItem.productId === foo.id);
expect(lineItem).to.be.ok;
});
});
describe('not the first time', ()=> {
it('updates a lineItem', async()=> {
const moe = await User.findOne({
where: {
username: 'moe'
}
});
const foo = await Product.findOne({
where: {
name: 'foo'
}
});
const token = jwt.sign({ id: moe.id}, process.env.JWT);
let response = await app.put('/api/orders/cart')
.set('authorization', token)
.send({ product: foo, quantity: 3});
expect(response.status).to.equal(200);
const lineItem = response.body.lineItems.find( lineItem => lineItem.productId === foo.id);
response = await app.put('/api/orders/cart')
.set('authorization', token)
.send({ product: foo, quantity: 7});
const updatedLineItem = response.body.lineItems.find( lineItem => lineItem.productId === foo.id);
expect(updatedLineItem.id).to.equal(lineItem.id);
});
});
});
});
});