UNPKG

23.2 kBJavaScriptView Raw
1/**
2 * Test case for create.
3 * Runs with mocha.
4 */
5'use strict'
6
7const create = require('../lib/create.js')
8const apemanport = require('apemanport')
9const fs = require('fs')
10const uuid = require('uuid')
11const assert = require('assert')
12const path = require('path')
13const apemandb = require('apemandb')
14const apemanApp = require('apeman-app')
15const apemanmodel = require('apemanmodel')
16const apemanrequest = require('apemanrequest')
17const apemansleep = require('apemansleep')
18
19const loc = require('../doc/mocks/locales')
20const co = require('co')
21const tmpDir = path.join(__dirname, '/../tmp')
22const dbFile = tmpDir + '/testing-db01.db'
23
24/* global describe, before, after, it */
25describe('create', function () {
26 this.timeout(8000)
27
28 let sleep = apemansleep.create({})
29 let db, request, baseUrl, server
30
31 before(() => co(function * () {
32 request = apemanrequest.create({ jar: true })
33 db = apemandb({
34 env: {
35 DATABASE: 'testing-database02',
36 USERNAME: 'FOO',
37 PASSWORD: 'BAR',
38 DIALECT: 'sqlite',
39 STORAGE: dbFile,
40 LOGGING: false
41 },
42 models: `${apemanmodel.paths.SAMPLE_DEFS_DIR}/*.json`
43 })
44 yield db.sync({ force: true })
45 }))
46
47 before(() => co(function * () {
48 let port = yield apemanport.find()
49 server = yield apemanApp('testing-app', {
50 port,
51 configuration: {
52 $apps: {
53 'testing-app': {
54 '/': [
55 require('apeman-app-body')(),
56 require('apeman-app-link')({
57 protocol: 'http'
58 }),
59 require('apeman-app-locale')(
60 loc
61 ),
62 require('apeman-app-jsonapi')()
63 ],
64 '/api': [
65 create(db.models.User, {
66 pathname: '/users',
67 list: co.wrap(function * listWrap (ctx, next) {
68 ctx.set('test-before-list', true)
69 yield next()
70 ctx.set('test-after-list', true)
71 }),
72 create: {
73 schema: require('../doc/mocks/schemas/user.schema.json'),
74 handle: co.wrap(function * createWrap (ctx, next) {
75 ctx.set('test-before-create', true)
76 yield next()
77 ctx.set('test-after-create', true)
78 })
79 },
80 one: co.wrap(function * oneWrap (ctx, next) {
81 ctx.set('test-before-one', true)
82 yield next()
83 }),
84 update: co.wrap(function * updateWrap (ctx, next) {
85 ctx.set('test-before-update', true)
86 yield next()
87 }),
88 destroy: co.wrap(function * destroyWrap (ctx, next) {
89 ctx.set('test-before-destroy', true)
90 yield next()
91 }),
92 bulkDestroy: co.wrap(function * bulkDestroyWrap (ctx, next) {
93 ctx.set('test-before-destroy-bulk', true)
94 yield next()
95 })
96 }),
97 create(db.models.UserSign, {
98 pathname: '/signs'
99 })
100 ]
101 }
102 }
103 }
104 })
105 baseUrl = `http://localhost:${port}`
106 }))
107
108 after(() => co(function * () {
109 yield sleep.sleep(100)
110 fs.unlinkSync(dbFile)
111 }))
112
113 after(() => co(function * () {
114 yield server.close()
115 }))
116
117 let user01, user02, user03, user04,
118 profile02, sign04
119
120 it('Endpoint spec', () => co(function * () {
121 let res = yield request({
122 method: 'OPTIONS',
123 url: `${baseUrl}/api/users`,
124 json: true
125 })
126 let { body, statusCode } = res
127 assert.equal(statusCode, 200)
128 assert.ok(body)
129 }))
130
131 it('List users', () => co(function * () {
132 let res = yield request({
133 method: 'GET',
134 url: `${baseUrl}/api/users`,
135 json: true
136 })
137 let { body, headers, statusCode } = res
138 assert.equal(statusCode, 200)
139 assert.ok(headers[ 'test-before-list' ])
140 assert.ok(headers[ 'test-after-list' ])
141 assert.equal(body.data.length, 0)
142 assert.equal(body.meta.total, 0)
143 }))
144
145 it('Create user', () => co(function * () {
146 {
147 let res = yield request({
148 method: 'POST',
149 url: `${baseUrl}/api/users/`,
150 json: true,
151 body: {
152 data: {
153 type: 'users',
154 attributes: {
155 email: 'apbc@example.com'
156 }
157 }
158 }
159 })
160 let { body, statusCode } = res
161 assert.equal(statusCode, 400)
162 let { errors } = body
163 assert.equal(errors[ 0 ].source.pointer, '/data/attributes/key')
164 }
165 {
166 let res = yield request({
167 method: 'POST',
168 url: `${baseUrl}/api/users/`,
169 json: true,
170 body: {
171 data: {
172 type: 'users',
173 attributes: {
174 key: 'foo_bar',
175 email: 'apbc@example.com'
176 }
177 }
178 }
179 })
180 let { body, headers, statusCode } = res
181 assert.equal(statusCode, 201)
182 assert.ok(body.links.self)
183 let { data } = body
184 user01 = Object.assign(
185 {},
186 data.attributes,
187 { id: data.id }
188 )
189 assert.ok(!headers[ 'test-before-list' ])
190 assert.ok(headers[ 'test-before-create' ])
191 }
192 }))
193
194 it('Create user 2', () => co(function * () {
195 {
196 let res = yield request({
197 method: 'POST',
198 url: `${baseUrl}/api/users/`,
199 json: true,
200 body: {
201 data: {
202 type: '__invalid_types__',
203 attributes: {
204 key: 'foo_bar2_fail',
205 email: 'apbc2_fail@example.com'
206 }
207 }
208 }
209 })
210 let { body } = res
211 assert.equal(body.meta.action, 'create')
212 assert.equal(body.errors[ 0 ].title, 'RESOURCE_TYPE_INVALID_ERROR')
213 }
214 {
215 let res = yield request({
216 method: 'POST',
217 url: `${baseUrl}/api/users/`,
218 json: true,
219 body: {
220 data: {
221 type: 'users',
222 attributes: {
223 key: 'foo_bar2',
224 email: 'apbc2@example.com'
225 }
226 }
227 }
228 })
229 let { body } = res
230 assert.equal(res.statusCode, 201)
231 let { data } = body
232 user02 = Object.assign(
233 {},
234 data.attributes,
235 { id: data.id }
236 )
237 let headers = res.headers
238 assert.ok(headers[ 'test-before-create' ])
239 }
240 }))
241
242 it('Bulk create users', () => co(function * () {
243 let res = yield request({
244 method: 'POST',
245 url: `${baseUrl}/api/users/`,
246 json: true,
247 body: {
248 data: [
249 {
250 type: 'users',
251 attributes: {
252 key: 'foo_bar3',
253 email: 'apbc3@example.com'
254 }
255 },
256 {
257 type: 'users',
258 id: uuid.v4(),
259 attributes: {
260 key: 'foo_bar4',
261 email: 'apbc4@example.com'
262 }
263 }
264 ]
265 }
266 })
267 let { body } = res
268 let { meta } = body
269 let { data } = body
270 assert.equal(meta.action, 'bulkCreate')
271 assert.equal(meta.status, 201)
272 assert.equal(data.length, 2)
273 user03 = Object.assign({ id: data[ 0 ].id }, data[ 0 ].attributes)
274 user04 = Object.assign({ id: data[ 1 ].id }, data[ 1 ].attributes)
275 }))
276
277 it('Bulk update users', () => co(function * () {
278 let res = yield request({
279 method: 'PATCH',
280 url: `${baseUrl}/api/users/`,
281 json: true,
282 body: {
283 data: [
284 {
285 type: 'users',
286 id: user03.id,
287 attributes: {
288 email: 'apbc3_updated@example.com'
289 }
290 },
291 {
292 type: 'users',
293 id: user04.id,
294 attributes: {
295 email: 'apbc4_updated@example.com'
296 }
297 }
298 ]
299 }
300 })
301 let { body } = res
302 let { meta } = body
303 let { data } = body
304 assert.equal(meta.action, 'bulkUpdate')
305 assert.equal(data.length, 2)
306 assert.equal(data[ 0 ].attributes.email, 'apbc3_updated@example.com')
307 }))
308
309 it('One user', () => co(function * () {
310 let relatedLink, relationLink
311 {
312 let res = yield request({
313 method: 'GET',
314 url: `${baseUrl}/api/users/${user02.id}`,
315 json: true
316 })
317 let { body, headers, statusCode } = res
318 assert.equal(statusCode, 200)
319 let { data } = body
320 assert.equal(data.id, user02.id)
321 assert.ok(headers[ 'test-before-one' ])
322 relationLink = data.relationships.profile.links.self
323 relatedLink = data.relationships.profile.links.related
324 assert.ok(
325 relatedLink.match(
326 '/api/users/2/profile'
327 )
328 )
329 assert.ok(
330 relationLink.match(
331 '/api/users/2/relationships/profile'
332 )
333 )
334 assert.ok(
335 relatedLink.match(
336 '/api/users/2/profile'
337 )
338 )
339 }
340 {
341 let res = yield request({
342 method: 'GET',
343 url: relatedLink,
344 json: true
345 })
346 let { body } = res
347 assert.equal(res.statusCode, 200)
348 assert.equal(body.meta.action, 'relatedList')
349 }
350
351 {
352 let res = yield request({
353 method: 'GET',
354 url: relationLink,
355 json: true
356 })
357 let { body } = res
358 assert.equal(res.statusCode, 200)
359 assert.equal(body.meta.action, 'relationList')
360 assert.equal(body.links.self, relationLink)
361 assert.equal(body.links.related, relatedLink)
362 }
363 }))
364
365 it('Create invalid id', () => co(function * () {
366 let res = yield request({
367 method: 'GET',
368 url: baseUrl + '/api/users/999999999999',
369 json: true
370 })
371 let { body } = res
372 assert.ok(body)
373 assert.equal(res.statusCode, 404)
374 let headers = res.headers
375 assert.ok(headers[ 'test-before-one' ])
376 }))
377
378 it('Update user.', () => co(function * () {
379 {
380 let res = yield request({
381 method: 'PATCH',
382 url: `${baseUrl}/api/users/` + user02.id,
383 json: true,
384 body: {
385 data: {
386 attributes: {
387 key: 'foo_bar2_updated',
388 vr: user02.vr
389 }
390 }
391 }
392 })
393 let { body } = res
394 assert.equal(res.statusCode, 400)
395 let errors = body.errors
396 assert.equal(errors[ 0 ].source.pointer, '/data/type')
397 }
398 {
399 let res = yield request({
400 method: 'PATCH',
401 url: `${baseUrl}/api/users/${user02.id}`,
402 json: true,
403 body: {
404 data: {
405 type: 'users',
406 attributes: {
407 key: 'foo_bar2_updated',
408 vr: user02.vr
409 }
410 }
411 }
412 })
413 let { body } = res
414 assert.equal(res.statusCode, 200)
415 let data = body.data
416 assert.equal(data.id, data.id)
417 assert.equal(data.attributes.key, 'foo_bar2_updated')
418 let headers = res.headers
419 assert.ok(headers[ 'test-before-update' ])
420 }
421 }))
422
423 it('Update user with conflict.', () => co(function * () {
424 let res = yield request({
425 method: 'PATCH',
426 url: `${baseUrl}/api/users/` + user02.id,
427 json: true,
428 body: {
429 data: {
430 type: 'users',
431 attributes: {
432 key: 'foo_bar2_updated',
433 vr: 1
434 }
435 }
436 }
437 })
438 let { body } = res
439 assert.equal(res.statusCode, 409)
440 assert.ok(body)
441 }))
442
443 it('Create user profile.', () => co(function * () {
444 let res = yield request({
445 method: 'POST',
446 url: `${baseUrl}/api/users/${user02.id}/profile`,
447 json: true,
448 body: {
449 data: {
450 type: 'user_profiles',
451 attributes: {
452 name: 'Profile of user02'
453 }
454 }
455 }
456 })
457 let { body } = res
458 assert.equal(res.statusCode, 201)
459 let { meta } = body
460 let data = body.data
461 assert.equal(meta.action, 'relatedCreate')
462 assert.equal(data.type, 'user_profiles')
463 assert.equal(data.attributes.userId, 2)
464 profile02 = Object.assign({ id: data.id }, data.attributes)
465 }))
466
467 it('Update user profile.', () => co(function * () {
468 let res = yield request({
469 method: 'PATCH',
470 url: `${baseUrl}/api/users/` + user02.id + '/profile/' + profile02.id,
471 json: true,
472 body: {
473 data: {
474 type: 'user_profiles',
475 attributes: {
476 name: 'Profile of user02'
477 }
478 }
479 }
480 })
481 let { body } = res
482 assert.equal(res.statusCode, 200)
483 let { meta } = body
484 let data = body.data
485 let links = body.links
486 assert.equal(meta.action, 'relatedUpdate')
487 assert.equal(data.type, 'user_profiles')
488 assert.equal(data.attributes.name, 'Profile of user02')
489 assert.ok(links.self.match('/api/users/2/profile/1'))
490 }))
491
492 it('List user profiles.', () => co(function * () {
493 let res = yield request({
494 method: 'GET',
495 url: `${baseUrl}/api/users/${user02.id}/profile`,
496 json: true,
497 body: {}
498 })
499 let { body } = res
500 assert.equal(res.statusCode, 200)
501 let { meta } = body
502 let data = body.data
503 assert.equal(data.id, profile02.id)
504 assert.equal(meta.action, 'relatedList')
505 }))
506
507 it('Get the user profile.', () => co(function * () {
508 let res = yield request({
509 method: 'GET',
510 url: `${baseUrl}/api/users/` + user02.id + '/profile/' + profile02.id,
511 json: true,
512 body: {}
513 })
514 let { body } = res
515 assert.equal(res.statusCode, 200)
516 let { meta } = body
517 let data = body.data
518 assert.equal(data.id, profile02.id)
519 assert.equal(meta.action, 'relatedOne')
520 }))
521
522 it('Get user include profile.', () => co(function * () {
523 let res = yield request({
524 method: 'get',
525 url: `${baseUrl}/api/users/${user02.id}?include=profile`,
526 json: true
527 })
528 let { body } = res
529 assert.equal(res.statusCode, 200)
530 let data = body.data
531 let included = body.included
532 assert.equal(included[ 0 ].type, 'user_profiles')
533 assert.ok(!data.attributes.profile)
534 }))
535
536 it('List users include profile.', () => co(function * () {
537 let res = yield request({
538 method: 'get',
539 url: baseUrl + '/api/users/?include=profile',
540 json: true
541 })
542 let { body } = res
543 assert.equal(res.statusCode, 200)
544 let data = body.data
545 let included = body.included
546 assert.equal(included[ 0 ].type, 'user_profiles')
547 assert.equal(included[ 0 ].id, 1)
548 data.forEach((data) => {
549 assert.ok(!data.attributes.profile) // Should in included.
550 assert.ok(data.links.self.match('/api/users/' + data.id))
551 let profile = data.relationships.profile
552 assert.ok(profile.links.self)
553 assert.ok(profile.links.related)
554 })
555 }))
556
557 it('Remove user profile relation.', () => co(function * () {
558 let res = yield request({
559 method: 'DELETE',
560 url: `${baseUrl}/api/users/${user02.id}/relationships/profile`,
561 json: true,
562 body: {
563 data: [
564 { type: 'user_profiles', id: profile02.id }
565 ]
566 }
567 })
568 let { body } = res
569 assert.equal(res.statusCode, 200)
570 let { meta } = body
571 assert.equal(meta.action, 'bulkRelationDestroy')
572 }))
573
574 it('Create user profile relation.', () => co(function * () {
575 let res = yield request({
576 method: 'POST',
577 url: `${baseUrl}/api/users/${user02.id}/relationships/profile`,
578 json: true,
579 body: {
580 data: [
581 { type: 'user_profiles', id: profile02.id }
582 ]
583 }
584 })
585 let { body } = res
586 assert.equal(res.statusCode, 200)
587 let { meta } = body
588 assert.equal(meta.action, 'bulkRelationCreate')
589 }))
590
591 it('update user profile relation.', () => co(function * () {
592 {
593 let res = yield request({
594 method: 'PATCH',
595 url: `${baseUrl}/api/users/` + user02.id + '/relationships/profile',
596 json: true,
597 body: {
598 data: []
599 }
600 })
601 let { body } = res
602 assert.equal(res.statusCode, 200)
603 let { meta } = body
604 assert.equal(meta.action, 'relationUpdate')
605 }
606 {
607 let res = yield request({
608 method: 'PATCH',
609 url: `${baseUrl}/api/users/${user02.id}/relationships/profile`,
610 json: true,
611 body: {
612 data: [
613 { type: 'user_profiles', id: profile02.id }
614 ]
615 }
616 })
617 let { body } = res
618 assert.equal(res.statusCode, 200)
619 let { meta } = body
620 assert.equal(meta.action, 'relationUpdate')
621 }
622 }))
623
624 it('Destroy user profile.', () => co(function * () {
625 let res = yield request({
626 method: 'DELETE',
627 url: `${baseUrl}/api/users/${user02.id}/profile/${profile02.id}`,
628 json: true
629 })
630 let { body } = res
631 assert.equal(res.statusCode, 200)
632 let { meta } = body
633 assert.equal(meta.action, 'relatedDestroy')
634 }))
635
636 it('List again', () => co(function * () {
637 let res = yield request({
638 method: 'GET',
639 url: `${baseUrl}/api/users/`,
640 json: true
641 })
642 let { body } = res
643 assert.equal(res.statusCode, 200)
644 let { meta } = body
645 let data = body.data
646 let links = body.links
647 assert.equal(data.length, 4)
648 assert.equal(meta.total, '4')
649 assert.ok(links)
650 let headers = res.headers
651 assert.ok(headers[ 'test-before-list' ])
652 }))
653
654 it('List with limit', () => co(function * () {
655 let res = yield request({
656 method: 'GET',
657 url: baseUrl + '/api/users/?page[size]=1'
658 })
659 let { body } = res
660 assert.equal(res.statusCode, 200)
661 let { meta, data } = body
662 assert.equal(data.length, 1)
663 assert.equal(meta.total, '4')
664 }))
665
666 it('List with keyword.', () => co(function * () {
667 let res = yield request({
668 method: 'GET',
669 url: baseUrl + '/api/users/?filter[key][$like]=%foo_bar2_%'
670 })
671 let { body } = res
672 assert.equal(res.statusCode, 200)
673 let { meta, data } = body
674 assert.equal(data.length, 1)
675 assert.equal(meta.total, '1')
676 }))
677
678 it('Create signs.', () => co(function * () {
679 {
680 let res = yield request({
681 method: 'POST',
682 url: baseUrl + '/api/signs',
683 json: true,
684 body: {
685 data: [
686 {
687 type: 'user_signs',
688 attributes: {
689 key: user03.key,
690 kind: 'user.key',
691 hash: 'hogehoge',
692 userId: user03.id
693 },
694 relationships: {
695 user: {
696 data: [
697 { type: 'users', id: user03.id }
698 ]
699 }
700 }
701 },
702 {
703 type: 'user_signs',
704 attributes: {
705 key: user04.key,
706 kind: 'user.key',
707 hash: 'hogehoge',
708 userId: user04.id
709 }
710 }
711 ]
712 }
713 })
714 let { body, statusCode } = res
715 assert.equal(res.statusCode, 201)
716 let { meta, data } = body
717 assert.equal(meta.action, 'bulkCreate')
718 assert.equal(data[ 0 ].attributes.userId, 3)
719 sign04 = Object.assign({ id: data[ 1 ].id }, data[ 1 ].attributes)
720 }
721 {
722 let res = yield request({
723 method: 'POST',
724 url: `${baseUrl}/api/users/` + user04.id + '/relationships/sign',
725 json: true,
726 body: {
727 data: {
728 type: 'user_signs',
729 id: sign04.id
730 }
731 }
732 })
733 let { body } = res
734 assert.deepEqual(body.data, { type: 'user_signs', id: '2' })
735 }
736 }))
737
738 it('Destroy bulk the users', () => co(function * () {
739 let res = yield request({
740 method: 'DELETE',
741 url: baseUrl + '/api/users',
742 json: true,
743 body: {
744 data: [
745 { type: 'users', id: user03.id },
746 { type: 'users', id: user04.id }
747 ]
748 }
749 })
750 let { body } = res
751 assert.equal(res.statusCode, 200)
752 let { meta } = body
753 assert.equal(meta.count, 2)
754 let headers = res.headers
755 assert.ok(headers[ 'test-before-destroy-bulk' ])
756 }))
757
758 it('Bulk destroy the user', () => co(function * () {
759 let res = yield request({
760 method: 'DELETE',
761 url: `${baseUrl}/api/users/${user02.id}`,
762 json: true
763 })
764 let { body } = res
765 assert.equal(res.statusCode, 200)
766 let { meta } = body
767 assert.equal(meta.count, 1)
768 let headers = res.headers
769 assert.ok(headers[ 'test-before-destroy' ])
770 }))
771
772 it('Create user and signs', () => co(function * () {
773 let sign02Signs
774 let id = uuid.v4()
775 {
776 let res = yield request({
777 method: 'POST',
778 url: `${baseUrl}/api/users/`,
779 json: true,
780 body: {
781 data: {
782 type: 'users',
783 id: id,
784 attributes: {
785 key: 'foo_bar5',
786 email: 'apbc5@example.com'
787 }
788 }
789 }
790 })
791 let { body } = res
792 assert.equal(res.statusCode, 201)
793 let data = body.data
794 user02 = Object.assign(
795 {},
796 data.attributes,
797 { id: data.id }
798 )
799 let headers = res.headers
800 assert.ok(headers[ 'test-before-create' ])
801 }
802 {
803 let res = yield request({
804 method: 'POST',
805 url: `${baseUrl}/api/users/${user02.id}/sign`,
806 json: true,
807 body: {
808 data: [
809 {
810 type: 'user_signs',
811 attributes: {
812 key: user02.key,
813 kind: 'user.key',
814 hash: 'hoge'
815 }
816 },
817 {
818 type: 'user_signs',
819 attributes: {
820 key: user02.email,
821 kind: 'user.email',
822 hash: 'hoge'
823 }
824 }
825 ]
826 }
827 })
828 let { body } = res
829 assert.equal(res.statusCode, 201)
830 let data = body.data
831 assert.equal(data[ 0 ].type, 'user_signs')
832 sign02Signs = data.map((data) => Object.assign(
833 { id: data.id },
834 data.attributes
835 ))
836 }
837 {
838 let res = yield request({
839 method: 'PATCH',
840 url: `${baseUrl}/api/users/` + user02.id + '/sign',
841 json: true,
842 body: {
843 data: sign02Signs.map((sign) =>
844 ({
845 type: 'user_signs',
846 id: sign.id,
847 attributes: {
848 hash: 'fuge'
849 }
850 })
851 )
852 }
853 })
854 let { body } = res
855 assert.equal(res.statusCode, 200)
856 let { meta } = body
857 let data = body.data
858 assert.equal(meta.action, 'bulkRelatedUpdate')
859 assert.equal(data[ 0 ].attributes.hash, 'fuge')
860 }
861 {
862 let res = yield request({
863 method: 'DELETE',
864 url: `${baseUrl}/api/users/${user02.id}/sign`,
865 json: true,
866 body: {
867 data: {
868 type: 'user_signs',
869 id: sign02Signs[ 0 ].id
870 }
871 }
872 })
873 let { body } = res
874 assert.equal(res.statusCode, 200)
875 let { meta } = body
876 assert.equal(meta.action, 'bulkRelatedDestroy')
877 assert.deepEqual(meta, { action: 'bulkRelatedDestroy', count: 1 })
878 }
879 }))
880})
881