Selaa lähdekoodia

Add admin_test route, test and model

sbkwgh 8 vuotta sitten
vanhempi
commit
d2a4147dbc
3 muutettua tiedostoa jossa 136 lisäystä ja 0 poistoa
  1. 25 0
      models/admin_token.js
  2. 33 0
      routes/admin_token.js
  3. 78 0
      test/admin_token.js

+ 25 - 0
models/admin_token.js

@@ -0,0 +1,25 @@
+let crypto = require('crypto')
+
+module.exports = (sequelize, DataTypes) => {
+	let AdminToken = sequelize.define('AdminToken', {
+		token: {
+			type: DataTypes.STRING,
+			defaultValue () {
+				return crypto.randomBytes(64).toString('hex')
+			}
+		}
+	}, {
+		instanceMethods: {
+			isValid () {
+				let ms = Date.now() - this.createdAt
+				let dayMs = 1000*60*60*24
+				
+				//Has less than 1 day passed
+				//since generating token?
+				return ms / dayMs < 1
+			}
+		}
+	})
+
+	return AdminToken
+}

+ 33 - 0
routes/admin_token.js

@@ -0,0 +1,33 @@
+let express = require('express')
+let router = express.Router()
+
+const Errors = require('../lib/errors.js')
+let AdminToken = require('../models').AdminToken
+
+router.post('/', async (req, res) => {
+	try {
+		if(!req.session.loggedIn && !req.session.admin) {
+			throw Errors.requestNotAuthorized
+		} else {
+			let token = await AdminToken.create()
+
+			res.json(token.toJSON())
+		}
+	} catch (err) {
+		if(err === Errors.requestNotAuthorized) {
+			res.status(403)
+			res.json({
+				errors: [Errors.requestNotAuthorized]
+			})
+		} else {
+			console.log(err)
+
+			res.status(500)
+			res.json{
+				errors: [Errors.unknown]
+			}
+		}
+	}
+})
+
+module.exports = router

+ 78 - 0
test/admin_token.js

@@ -0,0 +1,78 @@
+process.env.NODE_ENV = 'test'
+
+let chai = require('chai')
+let server = require('../server')
+let should = chai.should()
+
+let Models = require('../models')
+let User = Models.User
+let AdminToken = Models.AdminToken
+const Errors = require('../lib/errors.js')
+
+chai.use(require('chai-http'))
+chai.use(require('chai-things'))
+
+describe('User', () => {
+	//Delete all rows in table after
+	//tests completed
+	after((done) => {
+		Promise.all[
+			User.sync({ force: true }),
+			AdminToken.sync({ force: true })
+		]
+			.then(() => {
+				done(null);
+			})
+			.catch((err) => {
+				done(err)
+			})
+	})
+
+	describe('POST /admin_token', async (done) => {
+		try {
+			let token
+			let agent = chai.request.agent(server)
+
+			await agent
+				.post('/api/v1/user')
+				.set('content-type', 'application/json')
+				.send({
+					username: 'adminaccount',
+					password: 'password',
+					admin: true
+				})
+
+			it('should generate a token if logged in', (done) => {
+				let res = await agent.post('/api/v1/admin_token')
+
+				res.should.have.status(200)
+				res.body.should.have.property('token')
+
+				token = res.body.token
+
+				done()
+			})
+
+			it('should generate a different token if logged in', (done) => {
+				let res = await agent.post('/api/v1/admin_token')
+
+				res.should.have.status(200)
+				res.body.should.have.property('token')
+				res.body.token.should.not.equal(token)
+
+				done()
+			})
+
+			it('should give an error if not logged in', (done) => {
+				let res = await chai.request(server).post('/api/v1/admin_token')
+
+				res.should.have.status(403)
+				res.body.errors.should.contain.something.that.deep.equals(Errors.requestNotAuthorized)
+
+				done()
+			})
+		} catch (err) {
+			done(err)
+		}
+	})
+})