-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest.js
More file actions
311 lines (250 loc) · 7.69 KB
/
test.js
File metadata and controls
311 lines (250 loc) · 7.69 KB
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
const tape = require('tape')
const { MongoMemoryServer } = require('mongodb-memory-server')
process.env.NODE_ENV = 'test'
const mongoServer = getMongoSync()
process.env.MONGO_URI = process.env.MONGO_URI || mongoServer.getUri()
const port = (process.env.PORT = process.env.PORT || require('get-port-sync')())
const endpoint = `http://localhost:${port}`
const db = require('./db')
const server = require('./server')
const Client = require('./client')
const Products = require('./models/products')
const allProducts = require('./products.json')
const client = Client({
endpoint
})
tape('setup', async function (t) {
for (let i = 0; i < allProducts.length; i++) {
allProducts[i].description =
allProducts[i].description ||
allProducts[i].alt_description ||
'test description'
await Products.create(allProducts[i])
}
t.end()
})
tape('should list all products', function (t) {
client.listProducts(function (err, products) {
if (err) t.error('should not error')
t.equal(products.length, 25, 'number of products should match')
const product = products[20]
t.equal(product._id, 'cjv32mizj000kc9gl2r2lgj1r', 'id should match')
t.equal(
product.description,
'Oculus NYC facade',
'description should match'
)
t.end()
})
})
tape('should list all products with limit', function (t) {
client.listProducts({ limit: 5 }, function (err, products) {
if (err) t.error('should not error')
t.equal(products.length, 5, 'number of products should match')
const product = products[4]
t.equal(product._id, 'cjv32mizj0004c9glejahg9i4', 'id should match')
t.equal(
product.description,
'blue and black abstract artwork',
'description should match'
)
t.end()
})
})
tape('should list all products with offset', function (t) {
client.listProducts({ offset: 4, limit: 5 }, function (err, products) {
if (err) t.error('should not error')
t.equal(products.length, 5, 'number of products should match')
const product = products[0]
t.equal(product._id, 'cjv32mizj0004c9glejahg9i4', 'id should match')
t.equal(
product.description,
'blue and black abstract artwork',
'description should match'
)
t.end()
})
})
tape('should list all products with filter', function (t) {
client.listProducts({ tag: 'dog', limit: 2 }, function (err, products) {
if (err) t.error('should not error')
t.equal(products.length, 2, 'number of products should match')
const tagSets = products.map(p => p.tags)
tagSets.forEach(ts =>
t.ok(ts.indexOf('dog') > -1, 'product should have selected tag')
)
t.end()
})
})
tape('should get single product', function (t) {
client.getProduct('cjv32mizj0004c9glejahg9i4', function (err, product) {
if (err) t.error('should not error')
t.equal(product._id, 'cjv32mizj0004c9glejahg9i4', 'id should match')
t.equal(
product.description,
'blue and black abstract artwork',
'description should match'
)
t.end()
})
})
tape('should get error for missing single product', function (t) {
client.getProduct('doesntexist', function (err, product) {
t.equal(err.statusCode, 404, 'should get 404')
t.equal(err.message, 'Not Found', 'should get Not Found')
t.end()
})
})
tape('should create new product', function (t) {
const testProduct = {
description: 'test description',
imgThumb:
'https://www.newline.co/fullstack-react/assets/images/fullstack-react-hero-book.png',
img:
'https://www.newline.co/fullstack-react/assets/images/fullstack-react-hero-book.png',
link: 'https://fullstackreact.com',
userId: 'fsreact',
userName: 'David Guttman',
userLink: 'https://fullstackreact.com',
tags: ['react', 'javascript']
}
client.createProduct(testProduct, function (err, product) {
if (err) t.error('should not error')
hasSubset(t, product, testProduct)
t.ok(product._id, 'should have product id')
client.getProduct(product._id, function (err, remoteProduct) {
if (err) t.error('should not error')
t.equal(
remoteProduct.description,
testProduct.description,
'description should match'
)
t.equal(
remoteProduct.userName,
testProduct.userName,
'userName should match'
)
t.end()
})
})
})
tape('should edit product', function (t) {
const productId = 'cjv32mizj0004c9glejahg9i4'
const changes = {
userName: 'FS Test Bot'
}
client.editProduct(productId, changes, function (err, product) {
if (err) t.error('should not error')
t.equal(product.userName, changes.userName, 'userName should match')
t.equal(
product.description,
'blue and black abstract artwork',
'description should stay the same'
)
t.end()
})
})
tape('should not edit product with invalid userName', function (t) {
const productId = 'cjv32mizj0004c9glejahg9i4'
const changes = {
userName: null
}
client.editProduct(productId, changes, function (err, product) {
t.equal(err.statusCode, 400, 'should get 400 status')
t.end()
})
})
tape('should not edit product with invalid url', function (t) {
const productId = 'cjv32mizj0004c9glejahg9i4'
const changes = {
img: 'http//invalid.url'
}
client.editProduct(productId, changes, function (err, product) {
t.equal(err.statusCode, 400, 'should get 400 status')
t.end()
})
})
tape('should delete product', function (t) {
const productId = 'cjv32mizj0004c9glejahg9i4'
client.deleteProduct(productId, function (err, status) {
if (err) t.error('should not error')
t.ok(status.success, 'delete should be successful')
client.getProduct(productId, function (err, product) {
t.ok(err, 'should have error')
t.end()
})
})
})
tape('should create order', function (t) {
const userClient = Client({
endpoint
})
const productId = 'cjv32mizj000kc9gl2r2lgj1r'
const orderProps = {
products: [productId]
}
userClient.createOrder(orderProps, function (err, order) {
if (err) t.error('should not error')
t.ok(order._id, 'should have order id')
t.equal(
order.products[0].description,
'Oculus NYC facade',
'should have product description'
)
t.equal(order.status, 'CREATED', 'should have status')
t.end()
})
})
tape('should list orders as user', function (t) {
const productId = 'cjv32mizj000kc9gl2r2lgj1r'
const opts = { status: 'CREATED', productId }
const client = Client({
endpoint
})
client.listOrders(opts, function (err, orders) {
if (err) t.error('should not error')
const [order] = orders
t.ok(order._id, 'should have order id')
t.equal(
order.products[0].description,
'Oculus NYC facade',
'should have product description'
)
t.equal(order.status, 'CREATED', 'should have status')
t.end()
})
})
tape('should list orders as admin', function (t) {
const opts = { status: 'CREATED' }
client.listOrders(opts, function (err, orders) {
if (err) t.error('should not error')
const [order] = orders
t.ok(order._id, 'should have order id')
t.equal(
order.products[0].description,
'Oculus NYC facade',
'should have product description'
)
t.equal(order.status, 'CREATED', 'should have status')
t.end()
})
})
tape('cleanup', function (t) {
server.close()
db.disconnect()
mongoServer.stop()
t.end()
})
function getMongoSync () {
let server
MongoMemoryServer.create().then(m => {
server = m
})
require('deasync').loopWhile(() => !server)
return server
}
function hasSubset (t, superset, subset) {
Object.keys(subset).forEach(function (key) {
t.deepEqual(superset[key], subset[key], `${key} should match`)
})
}