user.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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 log in the user after creating an account', (done) => {
  39. let agent = chai.request.agent(server)
  40. agent
  41. .post('/api/v1/user')
  42. .set('content-type', 'application/x-www-form-urlencoded')
  43. .send({
  44. username: 'username1',
  45. password: 'password'
  46. })
  47. .end((err, res) => {
  48. agent
  49. .get('/api/v1/user/username1')
  50. .then((res) => {
  51. res.should.have.status(200)
  52. done()
  53. })
  54. .catch(done)
  55. })
  56. })
  57. it('should throw an error if account already created', (done) => {
  58. chai.request(server)
  59. .post('/api/v1/user')
  60. .set('content-type', 'application/x-www-form-urlencoded')
  61. .send({
  62. username: 'username',
  63. password: 'password'
  64. })
  65. .end((err, res) => {
  66. res.should.have.status(400)
  67. res.should.be.json
  68. res.body.should.have.property('errors')
  69. res.body.errors.should.include.something.that.deep.equals(Errors.accountAlreadyCreated)
  70. done()
  71. })
  72. })
  73. it('should throw an error if no username or password', (done) => {
  74. chai.request(server)
  75. .post('/api/v1/user')
  76. .set('content-type', 'application/x-www-form-urlencoded')
  77. .send({})
  78. .end((err, res) => {
  79. res.should.have.status(400)
  80. res.should.be.json
  81. res.body.should.have.property('errors')
  82. res.body.errors.should.include.something.that.deep.equals(Errors.missingParameter('username'))
  83. res.body.errors.should.include.something.that.deep.equals(Errors.missingParameter('password'))
  84. done()
  85. })
  86. })
  87. it('should throw an error if username or password are not a string', (done) => {
  88. chai.request(server)
  89. .post('/api/v1/user')
  90. .set('content-type', 'application/json')
  91. .send({
  92. username: 123,
  93. password: 123
  94. })
  95. .end((err, res) => {
  96. res.should.have.status(400)
  97. res.should.be.json
  98. res.body.should.have.property('errors')
  99. res.body.should.have.property('errors')
  100. res.body.errors.should.include.something.that.deep.equals(Errors.invalidParameterType('username', 'string'))
  101. res.body.errors.should.include.something.that.deep.equals(Errors.invalidParameterType('password', 'string'))
  102. done()
  103. })
  104. })
  105. it('should throw an error if username or password less than 6 characters', (done) => {
  106. chai.request(server)
  107. .post('/api/v1/user')
  108. .set('content-type', 'application/x-www-form-urlencoded')
  109. .send({
  110. username: 'test',
  111. password: 'pass'
  112. })
  113. .end((err, res) => {
  114. res.should.have.status(400)
  115. res.should.be.json
  116. res.body.should.have.property('errors')
  117. res.body.errors.should.contain.something.that.deep.equals(Errors.parameterLengthTooSmall('username', '6'))
  118. res.body.errors.should.contain.something.that.deep.equals(Errors.parameterLengthTooSmall('password', '6'))
  119. done()
  120. })
  121. })
  122. it('should throw an error if username greater than 50 characters or password is greater than 100 characters', (done) => {
  123. chai.request(server)
  124. .post('/api/v1/user')
  125. .set('content-type', 'application/x-www-form-urlencoded')
  126. .send({
  127. username: '123456789012345678901234567890123456789012345678901',
  128. password: '12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901'
  129. })
  130. .end((err, res) => {
  131. res.should.have.status(400)
  132. res.should.be.json
  133. res.body.should.have.property('errors')
  134. res.body.errors.should.contain.something.that.deep.equals(Errors.parameterLengthTooLarge('username', '50'))
  135. res.body.errors.should.contain.something.that.deep.equals(Errors.parameterLengthTooLarge('password', '100'))
  136. done()
  137. })
  138. })
  139. })
  140. describe('/:username/login POST user', () => {
  141. let agent = chai.request.agent(server)
  142. it('should throw an error if invalid username is provided', (done) => {
  143. chai.request(server)
  144. .post('/api/v1/user/invalid_username/login')
  145. .set('content-type', 'application/x-www-form-urlencoded')
  146. .send({
  147. password: 'password'
  148. })
  149. .end((err, res) => {
  150. res.should.have.status(401)
  151. res.body.should.have.property('errors')
  152. res.body.errors.should.contain.something.that.deep.equals(Errors.invalidLoginCredentials)
  153. done()
  154. })
  155. })
  156. it('should throw an error if invalid password is provided', (done) => {
  157. chai.request(server)
  158. .post('/api/v1/user/username/login')
  159. .set('content-type', 'application/x-www-form-urlencoded')
  160. .send({
  161. password: 'invalid_password'
  162. })
  163. .end((err, res) => {
  164. res.should.have.status(401)
  165. res.body.should.have.property('errors')
  166. res.body.errors.should.contain.something.that.deep.equals(Errors.invalidLoginCredentials)
  167. done()
  168. })
  169. })
  170. it('should log in the user', (done) => {
  171. agent
  172. .post('/api/v1/user/username/login')
  173. .set('content-type', 'application/x-www-form-urlencoded')
  174. .send({
  175. password: 'password'
  176. })
  177. .end((err, res) => {
  178. res.should.have.status(200)
  179. res.should.be.json
  180. res.should.have.cookie('connect.sid')
  181. agent
  182. .get('/api/v1/user/username')
  183. .then((res) => {
  184. res.should.have.status(200)
  185. done()
  186. })
  187. .catch(done)
  188. })
  189. })
  190. })
  191. describe('/:username/logout POST user', () => {
  192. let agent = chai.request.agent(server)
  193. it('should log out the user', (done) => {
  194. agent
  195. .post('/api/v1/user/login')
  196. .set('content-type', 'application/x-www-form-urlencoded')
  197. .send({
  198. username: 'username',
  199. password: 'password'
  200. })
  201. .end((err, res) => {
  202. agent
  203. .post('/api/v1/user/username/logout')
  204. .end((err, res) => {
  205. res.should.have.status(200)
  206. agent
  207. .get('/api/v1/user/username')
  208. .then((res) => {
  209. res.should.have.status(403)
  210. res.body.errors.should.contain.something.that.deep.equals(Errors.requestNotAuthorized)
  211. done()
  212. })
  213. .catch(done)
  214. })
  215. })
  216. })
  217. })
  218. })