users.spec.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. import app from '../bin/server'
  2. import supertest from 'supertest'
  3. import {cleanDb} from './utils'
  4. import {expect, should} from 'chai'
  5. should()
  6. const request = supertest.agent(app.listen())
  7. const context = {}
  8. describe('Users', () => {
  9. before((done) => {
  10. cleanDb()
  11. done()
  12. })
  13. describe('POST /users', () => {
  14. it('should reject signup when data is incomplete', (done) => {
  15. request
  16. .post('/users')
  17. .set('Accept', 'application/json')
  18. .send({ username: 'supercoolname' })
  19. .expect(422, done)
  20. })
  21. it('should sign up', (done) => {
  22. request
  23. .post('/users')
  24. .set('Accept', 'application/json')
  25. .send({ user: { username: 'supercoolname', password: 'supersecretpassword' } })
  26. .expect(200, (err, res) => {
  27. if (err) { return done(err) }
  28. res.body.user.should.have.property('username')
  29. res.body.user.username.should.equal('supercoolname')
  30. expect(res.body.user.password).to.not.exist
  31. context.user = res.body.user
  32. context.token = res.body.token
  33. done()
  34. })
  35. })
  36. })
  37. describe('GET /users', () => {
  38. it('should not fetch users if the authorization header is missing', (done) => {
  39. request
  40. .get('/users')
  41. .set('Accept', 'application/json')
  42. .expect(401, done)
  43. })
  44. it('should not fetch users if the authorization header is missing the scheme', (done) => {
  45. request
  46. .get('/users')
  47. .set({
  48. Accept: 'application/json',
  49. Authorization: '1'
  50. })
  51. .expect(401, done)
  52. })
  53. it('should not fetch users if the authorization header has invalid scheme', (done) => {
  54. const { token } = context
  55. request
  56. .get('/users')
  57. .set({
  58. Accept: 'application/json',
  59. Authorization: `Unknown ${token}`
  60. })
  61. .expect(401, done)
  62. })
  63. it('should not fetch users if token is invalid', (done) => {
  64. request
  65. .get('/users')
  66. .set({
  67. Accept: 'application/json',
  68. Authorization: 'Bearer 1'
  69. })
  70. .expect(401, done)
  71. })
  72. it('should fetch all users', (done) => {
  73. const { token } = context
  74. request
  75. .get('/users')
  76. .set({
  77. Accept: 'application/json',
  78. Authorization: `Bearer ${token}`
  79. })
  80. .expect(200, (err, res) => {
  81. if (err) { return done(err) }
  82. res.body.should.have.property('users')
  83. res.body.users.should.have.length(1)
  84. done()
  85. })
  86. })
  87. })
  88. describe('GET /users/:id', () => {
  89. it('should not fetch user if token is invalid', (done) => {
  90. request
  91. .get('/users/1')
  92. .set({
  93. Accept: 'application/json',
  94. Authorization: 'Bearer 1'
  95. })
  96. .expect(401, done)
  97. })
  98. it('should throw 404 if user doesn\'t exist', (done) => {
  99. const { token } = context
  100. request
  101. .get('/users/1')
  102. .set({
  103. Accept: 'application/json',
  104. Authorization: `Bearer ${token}`
  105. })
  106. .expect(404, done)
  107. })
  108. it('should fetch user', (done) => {
  109. const {
  110. user: { _id },
  111. token
  112. } = context
  113. request
  114. .get(`/users/${_id}`)
  115. .set({
  116. Accept: 'application/json',
  117. Authorization: `Bearer ${token}`
  118. })
  119. .expect(200, (err, res) => {
  120. if (err) { return done(err) }
  121. res.body.should.have.property('user')
  122. expect(res.body.user.password).to.not.exist
  123. done()
  124. })
  125. })
  126. })
  127. describe('PUT /users/:id', () => {
  128. it('should not update user if token is invalid', (done) => {
  129. request
  130. .put('/users/1')
  131. .set({
  132. Accept: 'application/json',
  133. Authorization: 'Bearer 1'
  134. })
  135. .expect(401, done)
  136. })
  137. it('should throw 404 if user doesn\'t exist', (done) => {
  138. const { token } = context
  139. request
  140. .put('/users/1')
  141. .set({
  142. Accept: 'application/json',
  143. Authorization: `Bearer ${token}`
  144. })
  145. .expect(404, done)
  146. })
  147. it('should update user', (done) => {
  148. const {
  149. user: { _id },
  150. token
  151. } = context
  152. request
  153. .put(`/users/${_id}`)
  154. .set({
  155. Accept: 'application/json',
  156. Authorization: `Bearer ${token}`
  157. })
  158. .send({ user: { username: 'updatedcoolname' } })
  159. .expect(200, (err, res) => {
  160. if (err) { return done(err) }
  161. res.body.user.should.have.property('username')
  162. res.body.user.username.should.equal('updatedcoolname')
  163. expect(res.body.user.password).to.not.exist
  164. done()
  165. })
  166. })
  167. })
  168. describe('DELETE /users/:id', () => {
  169. it('should not delete user if token is invalid', (done) => {
  170. request
  171. .delete('/users/1')
  172. .set({
  173. Accept: 'application/json',
  174. Authorization: 'Bearer 1'
  175. })
  176. .expect(401, done)
  177. })
  178. it('should throw 404 if user doesn\'t exist', (done) => {
  179. const { token } = context
  180. request
  181. .delete('/users/1')
  182. .set({
  183. Accept: 'application/json',
  184. Authorization: `Bearer ${token}`
  185. })
  186. .expect(404, done)
  187. })
  188. it('should delete user', (done) => {
  189. const {
  190. user: { _id },
  191. token
  192. } = context
  193. request
  194. .delete(`/users/${_id}`)
  195. .set({
  196. Accept: 'application/json',
  197. Authorization: `Bearer ${token}`
  198. })
  199. .expect(200, done)
  200. })
  201. })
  202. })