user.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. process.env.NODE_ENV = 'test'
  2. let chai = require('chai')
  3. let server = require('../server')
  4. let should = chai.should()
  5. let User = require('../models').User
  6. const Errors = require('../lib/errors.js')
  7. chai.use(require('chai-http'))
  8. chai.use(require('chai-things'))
  9. describe('User', () => {
  10. //Delete all rows in table after
  11. //tests completed
  12. after((done) => {
  13. User.sync({ force: true })
  14. .then(() => {
  15. done(null);
  16. })
  17. .catch((err) => {
  18. done(err)
  19. })
  20. })
  21. describe('/ POST user', () => {
  22. it('should create an account', (done) => {
  23. chai.request(server)
  24. .post('/api/v1/user')
  25. .set('content-type', 'application/x-www-form-urlencoded')
  26. .send({
  27. username: 'username',
  28. password: 'password'
  29. })
  30. .end((err, res) => {
  31. res.should.have.status(200)
  32. res.should.be.json
  33. res.body.should.have.property('username', 'username')
  34. res.body.should.have.property('hash')
  35. done()
  36. })
  37. })
  38. it('should throw an error if account already created', (done) => {
  39. chai.request(server)
  40. .post('/api/v1/user')
  41. .set('content-type', 'application/x-www-form-urlencoded')
  42. .send({
  43. username: 'username',
  44. password: 'password'
  45. })
  46. .end((err, res) => {
  47. res.should.have.status(400)
  48. res.should.be.json
  49. res.body.should.have.property('errors')
  50. res.body.errors.should.include.something.that.deep.equals(Errors.accountAlreadyCreated)
  51. done()
  52. })
  53. })
  54. it('should throw an error if no username or password', (done) => {
  55. chai.request(server)
  56. .post('/api/v1/user')
  57. .set('content-type', 'application/x-www-form-urlencoded')
  58. .send({})
  59. .end((err, res) => {
  60. res.should.have.status(400)
  61. res.should.be.json
  62. res.body.should.have.property('errors')
  63. res.body.errors.should.include.something.that.deep.equals(Errors.missingParameter('username'))
  64. res.body.errors.should.include.something.that.deep.equals(Errors.missingParameter('password'))
  65. done()
  66. })
  67. })
  68. it('should throw an error if username or password are not a string', (done) => {
  69. chai.request(server)
  70. .post('/api/v1/user')
  71. .set('content-type', 'application/json')
  72. .send({
  73. username: 123,
  74. password: 123
  75. })
  76. .end((err, res) => {
  77. res.should.have.status(400)
  78. res.should.be.json
  79. res.body.should.have.property('errors')
  80. res.body.should.have.property('errors')
  81. res.body.errors.should.include.something.that.deep.equals(Errors.invalidParameterType('username', 'string'))
  82. res.body.errors.should.include.something.that.deep.equals(Errors.invalidParameterType('password', 'string'))
  83. done()
  84. })
  85. })
  86. it('should throw an error if username or password less than 6 characters', (done) => {
  87. chai.request(server)
  88. .post('/api/v1/user')
  89. .set('content-type', 'application/x-www-form-urlencoded')
  90. .send({
  91. username: 'test',
  92. password: 'pass'
  93. })
  94. .end((err, res) => {
  95. res.should.have.status(400)
  96. res.should.be.json
  97. res.body.should.have.property('errors')
  98. res.body.errors.should.contain.something.that.deep.equals(Errors.parameterLengthTooSmall('username', '6'))
  99. res.body.errors.should.contain.something.that.deep.equals(Errors.parameterLengthTooSmall('password', '6'))
  100. done()
  101. })
  102. })
  103. it('should throw an error if username greater than 50 characters or password is greater than 100 characters', (done) => {
  104. chai.request(server)
  105. .post('/api/v1/user')
  106. .set('content-type', 'application/x-www-form-urlencoded')
  107. .send({
  108. username: '123456789012345678901234567890123456789012345678901',
  109. password: '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901'
  110. })
  111. .end((err, res) => {
  112. res.should.have.status(400)
  113. res.should.be.json
  114. res.body.should.have.property('errors')
  115. res.body.errors.should.contain.something.that.deep.equals(Errors.parameterLengthTooLarge('username', '50'))
  116. res.body.errors.should.contain.something.that.deep.equals(Errors.parameterLengthTooLarge('password', '100'))
  117. done()
  118. })
  119. })
  120. })
  121. describe('/:username/login POST user', () => {
  122. let agent = chai.request.agent(server)
  123. it('should throw an error if invalid username is provided', (done) => {
  124. chai.request(server)
  125. .post('/api/v1/user/invalid_username/login')
  126. .set('content-type', 'application/x-www-form-urlencoded')
  127. .send({
  128. password: 'password'
  129. })
  130. .end((err, res) => {
  131. res.should.have.status(401)
  132. res.body.should.have.property('errors')
  133. res.body.errors.should.contain.something.that.deep.equals(Errors.invalidLoginCredentials)
  134. done()
  135. })
  136. })
  137. it('should throw an error if invalid password is provided', (done) => {
  138. chai.request(server)
  139. .post('/api/v1/user/username/login')
  140. .set('content-type', 'application/x-www-form-urlencoded')
  141. .send({
  142. password: 'invalid_password'
  143. })
  144. .end((err, res) => {
  145. res.should.have.status(401)
  146. res.body.should.have.property('errors')
  147. res.body.errors.should.contain.something.that.deep.equals(Errors.invalidLoginCredentials)
  148. done()
  149. })
  150. })
  151. it('should log in the user', (done) => {
  152. agent
  153. .post('/api/v1/user/username/login')
  154. .set('content-type', 'application/x-www-form-urlencoded')
  155. .send({
  156. password: 'password'
  157. })
  158. .end((err, res) => {
  159. res.should.have.status(200)
  160. res.should.be.json
  161. res.should.have.cookie('connect.sid')
  162. agent
  163. .get('/api/v1/user/username')
  164. .then((err, res) => {
  165. res.should.have.status(200)
  166. done()
  167. })
  168. })
  169. })
  170. })
  171. describe('/logout POST user', () => {
  172. let agent = chai.request.agent(server)
  173. it('should log out the user', (done) => {
  174. agent
  175. .post('/api/v1/user/login')
  176. .set('content-type', 'application/x-www-form-urlencoded')
  177. .send({
  178. username: 'username',
  179. password: 'password'
  180. })
  181. .end((err, res) => {
  182. agent
  183. .post('/api/v1/user/logout')
  184. .end((err, res) => {
  185. res.should.have.status(200)
  186. agent
  187. .get('/api/v1/user/username')
  188. .then((err, res) => {
  189. res.should.have.status(403)
  190. res.body.errors.should.contain.something.that.deep.equals(Errors.requestNotAuthorized)
  191. done()
  192. })
  193. })
  194. })
  195. })
  196. })
  197. })