user.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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('/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/login')
  126. .set('content-type', 'application/x-www-form-urlencoded')
  127. .send({
  128. username: 'invalid_username',
  129. password: 'password'
  130. })
  131. .end((err, res) => {
  132. res.should.have.status(401)
  133. res.body.should.have.property('errors')
  134. res.body.errors.should.contain.something.that.deep.equals(Errors.invalidLoginCredentials)
  135. done()
  136. })
  137. })
  138. it('should throw an error if invalid password is provided', (done) => {
  139. chai.request(server)
  140. .post('/api/v1/user/login')
  141. .set('content-type', 'application/x-www-form-urlencoded')
  142. .send({
  143. username: 'username',
  144. password: 'invalid_password'
  145. })
  146. .end((err, res) => {
  147. res.should.have.status(401)
  148. res.body.should.have.property('errors')
  149. res.body.errors.should.contain.something.that.deep.equals(Errors.invalidLoginCredentials)
  150. done()
  151. })
  152. })
  153. it('should log in the user', (done) => {
  154. agent
  155. .post('/api/v1/user/login')
  156. .set('content-type', 'application/x-www-form-urlencoded')
  157. .send({
  158. username: 'username',
  159. password: 'password'
  160. })
  161. .end((err, res) => {
  162. res.should.have.status(200)
  163. res.should.be.json
  164. res.should.have.cookie('connect.sid')
  165. agent
  166. .get('/api/v1/user/username')
  167. .then((err, res) => {
  168. res.should.have.status(200)
  169. done()
  170. })
  171. })
  172. })
  173. })
  174. describe('/logout POST user', () => {
  175. let agent = chai.request.agent(server)
  176. it('should log out the user', (done) => {
  177. agent
  178. .post('/api/v1/user/login')
  179. .set('content-type', 'application/x-www-form-urlencoded')
  180. .send({
  181. username: 'username',
  182. password: 'password'
  183. })
  184. .end((err, res) => {
  185. agent
  186. .post('/api/v1/user/logout')
  187. .end((err, res) => {
  188. res.should.have.status(200)
  189. agent
  190. .get('/api/v1/user/username')
  191. .then((err, res) => {
  192. res.should.have.status(403)
  193. res.body.errors.should.contain.something.that.deep.equals(Errors.requestNotAuthorized)
  194. done()
  195. })
  196. })
  197. })
  198. })
  199. })
  200. })