Browse Source

Add structure for sequelize and tests

sbkwgh 8 years ago
parent
commit
7f6e8d181d
9 changed files with 152 additions and 6 deletions
  1. 16 0
      config/config.json
  2. 0 0
      config/server.js
  3. 30 0
      migrations/20170211174213-create-user.js
  4. 36 0
      models/index.js
  5. 14 0
      models/user.js
  6. 10 5
      package.json
  7. 16 0
      routes/user.js
  8. 3 1
      server.js
  9. 27 0
      test/user.js

+ 16 - 0
config/config.json

@@ -0,0 +1,16 @@
+{
+	"development": {
+		"username": "admin",
+		"password": "password",
+		"database": "forum_dev",
+		"host": "localhost",
+		"dialect": "mysql"
+	},
+	"test": {
+		"username": "admin",
+		"password": "password",
+		"database": "forum_test",
+		"host": "localhost",
+		"dialect": "mysql"
+	}
+}

config.js → config/server.js


+ 30 - 0
migrations/20170211174213-create-user.js

@@ -0,0 +1,30 @@
+'use strict';
+module.exports = {
+  up: function(queryInterface, Sequelize) {
+    return queryInterface.createTable('Users', {
+      id: {
+        allowNull: false,
+        autoIncrement: true,
+        primaryKey: true,
+        type: Sequelize.INTEGER
+      },
+      username: {
+        type: Sequelize.STRING
+      },
+      hash: {
+        type: Sequelize.STRING
+      },
+      createdAt: {
+        allowNull: false,
+        type: Sequelize.DATE
+      },
+      updatedAt: {
+        allowNull: false,
+        type: Sequelize.DATE
+      }
+    });
+  },
+  down: function(queryInterface, Sequelize) {
+    return queryInterface.dropTable('Users');
+  }
+};

+ 36 - 0
models/index.js

@@ -0,0 +1,36 @@
+const fs = require('fs');
+const path = require('path');
+const Sequelize = require('sequelize');
+const basename = path.basename(module.filename);
+const config = require('../config/config.json');
+const env = process.env.NODE_ENV;
+const db = {};
+
+let sequelize = new Sequelize(
+	config[env].database, config[env].username, config[env].password, {
+		host: config[env].host,
+		dialect: config[env].dialect
+	}
+);
+
+fs
+	.readdirSync(__dirname)
+	.filter(file =>
+		(file.indexOf('.') !== 0) &&
+		(file !== basename) &&
+		(file.slice(-3) === '.js'))
+	.forEach(file => {
+		const model = sequelize.import(path.join(__dirname, file));
+		db[model.name] = model;
+	});
+
+Object.keys(db).forEach(modelName => {
+	if (db[modelName].associate) {
+		db[modelName].associate(db);
+	}
+});
+
+db.sequelize = sequelize;
+db.Sequelize = Sequelize;
+
+module.exports = db;

+ 14 - 0
models/user.js

@@ -0,0 +1,14 @@
+'use strict';
+module.exports = function(sequelize, DataTypes) {
+  var User = sequelize.define('User', {
+    username: DataTypes.STRING,
+    hash: DataTypes.STRING
+  }, {
+    classMethods: {
+      associate: function(models) {
+        // associations can be defined here
+      }
+    }
+  });
+  return User;
+};

+ 10 - 5
package.json

@@ -4,19 +4,24 @@
   "description": "Backend for forum",
   "main": "server.js",
   "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1",
-    "start": "node server.js"
+    "test": "cross-env NODE_ENV=test node_modules/.bin/sequelize db:migrate && node ./node_modules/mocha/bin/mocha  --harmony --timeout 10000",
+    "start": "cros-env NODE_ENV=development && node_modules/.bin/sequelize db:migrate && node --harmony server.js"
   },
   "author": "",
   "license": "ISC",
   "dependencies": {
     "body-parser": "^1.16.0",
+    "cross-env": "^3.1.4",
     "express": "^4.14.1",
-    "pg": "^6.1.2",
-    "pg-hstore": "^2.3.2",
-    "sequelize": "^3.30.0"
+    "indicative": "^2.2.1",
+    "mysql": "^2.13.0",
+    "sequelize": "^3.30.0",
+    "sequelize-cli": "^2.5.1"
   },
   "devDependencies": {
+    "chai": "^3.5.0",
+    "chai-http": "^3.0.0",
+    "mocha": "^3.2.0",
     "morgan": "^1.7.0"
   }
 }

+ 16 - 0
routes/user.js

@@ -0,0 +1,16 @@
+let indicative = require('indicative')
+let express = require('express')
+let router = express.Router()
+
+let User = require('../models').User
+
+router.post('/', async (req, res) => {
+	 let user = await User.create({
+		username: req.body.username,
+		hash: req.body.password
+	})
+
+	res.json(user.toJSON())
+})
+
+module.exports = router

+ 3 - 1
server.js

@@ -1,7 +1,7 @@
 let express = require('express')
 let app = express()
 
-let config = require('./config.js')
+let config = require('./config/server.js')
 
 //Middle-ware
 let bodyParser = require('body-parser')
@@ -13,6 +13,8 @@ if(process.env.NODE_ENV !== 'test' && process.env.NODE_ENV !== 'production') {
 	app.use(morgan('dev'))
 }
 
+app.use('/api/v1/user', require('./routes/user'))
+
 app.listen(config.port, () => {
 	console.log('Listening on ' + config.port)
 })

+ 27 - 0
test/user.js

@@ -0,0 +1,27 @@
+process.env.NODE_ENV = 'test'
+
+let chai = require('chai')
+let chaiHttp = require('chai-http')
+let server = require('../server')
+let should = chai.should()
+
+chai.use(chaiHttp)
+
+describe('User', () => {
+	describe('/POST user', () => {
+		it('should create an account', (done) => {
+			chai.request(server)
+				.post('/api/v1/user')
+				.field('username', 'test')
+				.field('password', 'pass')
+				.end((err, res) => {
+					res.should.have.status(200)
+					res.should.be.json
+					res.should.have.property('username', 'test')
+					res.should.have.property('hash')
+					
+					done()
+				})
+		})
+	})
+})