1
0
Fork 0
mirror of https://github.com/codex-team/codex.docs.git synced 2025-08-09 15:35:25 +02:00

Add eslint and editorconfig + husky

This commit is contained in:
gohabereg 2018-08-17 01:23:25 +03:00
parent 7496897dd9
commit 839dfcfd17
18 changed files with 1300 additions and 575 deletions

9
.editorconfig Normal file
View file

@ -0,0 +1,9 @@
root = false
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

1
.eslintignore Normal file
View file

@ -0,0 +1 @@
node_modules/

15
.eslintrc Normal file
View file

@ -0,0 +1,15 @@
{
"extends": [
"codex"
],
"plugins": [
"chai-friendly"
],
"env": {
"mocha": true
},
"rules": {
"no-unused-expressions": 0,
"chai-friendly/no-unused-expressions": 2
}
}

5
app.js
View file

@ -12,7 +12,6 @@ const app = express();
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'twig');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({extended: true}));
@ -21,12 +20,12 @@ app.use(express.static(path.join(__dirname, 'public')));
app.use('/', routes);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
app.use(function (req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
app.use(function (err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};

View file

@ -84,6 +84,7 @@ function onListening() {
const bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}

View file

@ -1,4 +1,4 @@
const model = require('../models/page');
const Model = require('../models/page');
/**
* @class Pages
@ -11,7 +11,7 @@ class Pages {
*
* @returns {['title', 'body']}
*/
static get REQUIRED_FIELDS () {
static get REQUIRED_FIELDS() {
return ['title', 'body'];
}
@ -22,14 +22,14 @@ class Pages {
* @param {string} id - page id
* @returns {Promise<Page>}
*/
static async get (id) {
const page = await model.get(id);
static async get(id) {
const page = await Model.get(id);
if (!page._id) {
throw new Error('Page with given id does not exist');
}
if (!page._id) {
throw new Error('Page with given id does not exist');
}
return page;
return page;
}
/**
@ -38,7 +38,7 @@ class Pages {
* @returns {Promise<Page[]>}
*/
static async getAll() {
return await model.getAll();
return Model.getAll();
}
/**
@ -47,12 +47,12 @@ class Pages {
* @param {PageData} data
* @returns {Promise<Page>}
*/
static async insert (data) {
static async insert(data) {
if (!Pages.validate(data)) {
throw new Error('Invalid request format')
throw new Error('Invalid request format');
}
const page = new model(data);
const page = new Model(data);
return page.save();
}
@ -63,7 +63,7 @@ class Pages {
* @param {PageData} data
* @returns {boolean}
*/
static validate (data) {
static validate(data) {
return Pages.REQUIRED_FIELDS.every(field => typeof data[field] !== 'undefined');
}
@ -74,8 +74,8 @@ class Pages {
* @param {PageData} data
* @returns {Promise<Page>}
*/
static async update (id, data) {
const page = await model.get(id);
static async update(id, data) {
const page = await Model.get(id);
if (!page._id) {
throw new Error('Page with given id does not exist');
@ -83,7 +83,7 @@ class Pages {
page.data = data;
return page.save()
return page.save();
}
/**
@ -92,15 +92,15 @@ class Pages {
* @param {string} id - page id
* @returns {Promise<Page>}
*/
static async remove (id) {
const page = await model.get(id);
static async remove(id) {
const page = await Model.get(id);
if (!page._id) {
throw new Error('Page with given id does not exist');
}
if (!page._id) {
throw new Error('Page with given id does not exist');
}
return page.destroy();
return page.destroy();
}
}
module.exports = Pages;
module.exports = Pages;

View file

@ -7,13 +7,12 @@ const pages = require('./pages');
* @property db - nedb Datastore object
*/
class Database {
/**
* @constructor
*
* @param {Object} nedbInstance - nedb Datastore object
*/
constructor (nedbInstance) {
constructor(nedbInstance) {
this.db = nedbInstance;
}
@ -24,13 +23,13 @@ class Database {
* @param {Object} doc - object to insert
* @returns {Promise<Object|Error>} - inserted doc or Error object
*/
async insert (doc) {
return new Promise((res, rej) => this.db.insert(doc, (err, newDoc) => {
async insert(doc) {
return new Promise((resolve, reject) => this.db.insert(doc, (err, newDoc) => {
if (err) {
rej(err);
reject(err);
}
res(newDoc);
resolve(newDoc);
}));
}
@ -42,20 +41,20 @@ class Database {
* @param {Object} projection - projection object
* @returns {Promise<Array<Object>|Error>} - found docs or Error object
*/
async find (query, projection) {
const cbk = (res, rej) => (err, docs) => {
async find(query, projection) {
const cbk = (resolve, reject) => (err, docs) => {
if (err) {
rej(err);
reject(err);
}
res(docs);
resolve(docs);
};
return new Promise((res, rej) => {
return new Promise((resolve, reject) => {
if (projection) {
this.db.find(query, projection, cbk(res, rej));
this.db.find(query, projection, cbk(resolve, reject));
} else {
this.db.find(query, cbk(res, rej));
this.db.find(query, cbk(resolve, reject));
}
});
}
@ -68,20 +67,20 @@ class Database {
* @param {Object} projection - projection object
* @returns {Promise<Object|Error>} - found doc or Error object
*/
async findOne (query, projection) {
const cbk = (res, rej) => (err, doc) => {
async findOne(query, projection) {
const cbk = (resolve, reject) => (err, doc) => {
if (err) {
rej(err);
reject(err);
}
res(doc);
resolve(doc);
};
return new Promise((res, rej) => {
return new Promise((resolve, reject) => {
if (projection) {
this.db.findOne(query, projection, cbk(res, rej));
this.db.findOne(query, projection, cbk(resolve, reject));
} else {
this.db.findOne(query, cbk(res, rej));
this.db.findOne(query, cbk(resolve, reject));
}
});
}
@ -99,24 +98,24 @@ class Database {
* @param {Boolean} options.returnUpdatedDocs - (false) if true, returns affected docs
* @returns {Promise<number|Object|Object[]|Error>} - number of updated rows or affected docs or Error object
*/
async update (query, update, options = {}) {
return new Promise((res, rej) => this.db.update(query, update, options, (err, result, affectedDocs) => {
async update(query, update, options = {}) {
return new Promise((resolve, reject) => this.db.update(query, update, options, (err, result, affectedDocs) => {
if (err) {
rej(err);
reject(err);
}
switch (true) {
case options.returnUpdatedDocs:
res(affectedDocs);
break;
case options.upsert:
if (affectedDocs) {
res(affectedDocs);
}
res(result);
break;
default:
res(result)
case options.returnUpdatedDocs:
resolve(affectedDocs);
break;
case options.upsert:
if (affectedDocs) {
resolve(affectedDocs);
}
resolve(result);
break;
default:
resolve(result);
}
}));
}
@ -130,19 +129,18 @@ class Database {
* @param {Boolean} options.multi - (false) if true, remove several docs
* @returns {Promise<number|Error>} - number of removed rows or Error object
*/
async remove (query, options = {}) {
return new Promise((res, rej) => this.db.remove(query, options, (err, result) => {
async remove(query, options = {}) {
return new Promise((resolve, reject) => this.db.remove(query, options, (err, result) => {
if (err) {
rej(err);
reject(err);
}
res(result);
resolve(result);
}));
}
}
module.exports = {
class: Database,
pages: new Database(pages)
};
};

View file

@ -1,5 +1,5 @@
const Datastore = require('nedb');
const db = new Datastore({filename: './db/pages.db', autoload: true}) ;
const db = new Datastore({filename: './db/pages.db', autoload: true});
module.exports = db;

View file

@ -19,7 +19,6 @@ const {pages} = require('../database');
* @property {string} _parent - id of parent page
*/
class Page {
/**
* Find and return model of page with given id
* @param {string} _id - page id
@ -48,18 +47,18 @@ class Page {
*
* @param {PageData} data
*/
constructor (data = {}) {
if (data === null) {
data = {};
}
constructor(data = {}) {
if (data === null) {
data = {};
}
this.db = pages;
this.db = pages;
if (data._id) {
this._id = data._id;
}
if (data._id) {
this._id = data._id;
}
this.data = data;
this.data = data;
}
/**
@ -67,7 +66,7 @@ class Page {
*
* @param {PageData} pageData
*/
set data (pageData) {
set data(pageData) {
const {title, body, parent} = pageData;
this.title = title || this.title;
@ -80,13 +79,13 @@ class Page {
*
* @returns {PageData}
*/
get data () {
get data() {
return {
_id: this._id,
title: this.title,
body: this.body,
parent: this._parent
}
};
}
/**
@ -94,7 +93,7 @@ class Page {
*
* @param {Page} parentPage
*/
set parent (parentPage) {
set parent(parentPage) {
this._parent = parentPage._id;
}
@ -103,9 +102,9 @@ class Page {
*
* @returns {Promise<Page>}
*/
get parent () {
get parent() {
return this.db.findOne({_id: this._parent})
.then(data => new Page(data));
.then(data => new Page(data));
}
/**
@ -113,9 +112,9 @@ class Page {
*
* @returns {Promise<Page[]>}
*/
get children () {
return this.db.find({parent: this._id})
.then(data => data.map(page => new Page(page)));
get children() {
return this.db.find({parent: this._id})
.then(data => data.map(page => new Page(page)));
}
/**
@ -123,16 +122,16 @@ class Page {
*
* @returns {Promise<Page>}
*/
async save () {
if (!this._id) {
const insertedRow = await this.db.insert(this.data);
async save() {
if (!this._id) {
const insertedRow = await this.db.insert(this.data);
this._id = insertedRow._id;
} else {
await this.db.update({_id: this._id}, this.data);
}
this._id = insertedRow._id;
} else {
await this.db.update({_id: this._id}, this.data);
}
return this;
return this;
}
/**
@ -140,7 +139,7 @@ class Page {
*
* @returns {Promise<Page>}
*/
async destroy () {
async destroy() {
await this.db.remove({_id: this._id});
delete this._id;
@ -153,7 +152,7 @@ class Page {
*
* @returns {PageData}
*/
toJSON () {
toJSON() {
return this.data;
}
}

View file

@ -4,7 +4,9 @@
"private": true,
"scripts": {
"start": "nodemon ./bin/www",
"test": "mocha --recursive ./test"
"test": "mocha --recursive ./test",
"lint": "eslint --fix ./**/*.js",
"precommit": "yarn lint && yarn test"
},
"dependencies": {
"body-parser": "latest",
@ -22,6 +24,15 @@
"devDependencies": {
"chai": "^4.1.2",
"chai-http": "^4.0.0",
"eslint": "^5.3.0",
"eslint-config-codex": "github:codex-team/eslint-config",
"eslint-config-standard": "^11.0.0",
"eslint-plugin-chai-friendly": "^0.4.1",
"eslint-plugin-import": "^2.14.0",
"eslint-plugin-node": "^7.0.1",
"eslint-plugin-promise": "^3.8.0",
"eslint-plugin-standard": "^3.1.0",
"husky": "^0.14.3",
"mocha": "^5.2.0",
"nyc": "^12.0.2"
}

View file

@ -1,8 +1,8 @@
const express = require('express')
const express = require('express');
const router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
router.get('/', function (req, res, next) {
res.render('index', { title: 'Express' });
});

View file

@ -1,4 +1,4 @@
const express = require('express')
const express = require('express');
const router = express.Router();
const home = require('./home');

View file

@ -13,14 +13,14 @@ router.get('/page/:id', async (req, res) => {
const page = await Pages.get(req.params.id);
res.json({
success: true,
result: page.data
})
success: true,
result: page.data
});
} catch (err) {
res.status(400).json({
success: false,
error: err.message
})
success: false,
error: err.message
});
}
});
@ -34,14 +34,14 @@ router.get('/pages', async (req, res) => {
const pages = await Pages.getAll();
res.json({
success: true,
result: pages
success: true,
result: pages
});
} catch (err) {
res.status(400).json({
success: false,
error: err.message
});
res.status(400).json({
success: false,
error: err.message
});
}
});
@ -50,10 +50,11 @@ router.get('/pages', async (req, res) => {
*
* Create new page in the database
*/
router.put('/page', multer.any(), async (req, res,) => {
router.put('/page', multer.any(), async (req, res) => {
try {
const {title, body, parent} = req.body
const {title, body, parent} = req.body;
const page = await Pages.insert({title, body, parent});
res.json({
success: true,
result: page
@ -64,7 +65,6 @@ router.put('/page', multer.any(), async (req, res,) => {
error: err.message
});
}
});
/**
@ -76,7 +76,7 @@ router.post('/page/:id', multer.any(), async (req, res) => {
const {id} = req.params;
try {
const {title, body, parent} = req.body
const {title, body, parent} = req.body;
const page = await Pages.update(id, {title, body, parent});
res.json({
@ -103,12 +103,12 @@ router.delete('/page/:id', async (req, res) => {
res.json({
success: true,
result: page
})
});
} catch (err) {
res.status(400).json({
success: false,
error: err.message
})
res.status(400).json({
success: false,
error: err.message
});
}
});

View file

@ -5,174 +5,174 @@ const {class: Database} = require('../database');
const Datastore = require('nedb');
describe('Database', () => {
const pathToDB = './db/test.db';
let nedbInstance;
let db;
const pathToDB = './db/test.db';
let nedbInstance;
let db;
before(() => {
if (fs.existsSync(pathToDB)) {
fs.unlinkSync(pathToDB);
}
before(() => {
if (fs.existsSync(pathToDB)) {
fs.unlinkSync(pathToDB);
}
});
it('Creating db instance', async () => {
nedbInstance = new Datastore({filename: pathToDB, autoload: true});
db = new Database(nedbInstance);
});
it('Inserting document', async () => {
const data = 'Text data';
const insertedDoc = await db.insert({data});
expect(insertedDoc).to.be.a('object');
expect(insertedDoc.data).to.equal(data);
});
it('Finding document', async () => {
const data = 'Text data';
const insertedDoc = await db.insert({data});
expect(insertedDoc).to.be.a('object');
expect(insertedDoc.data).to.equal(data);
const foundDoc = await db.findOne({_id: insertedDoc._id});
expect(foundDoc).not.be.null;
expect(foundDoc._id).to.equal(insertedDoc._id);
expect(foundDoc.data).to.equal(data);
const projectedDoc = await db.findOne({_id: insertedDoc._id}, {data: 1, _id: 0});
expect(Object.keys(projectedDoc).length).to.equal(1);
expect(Object.keys(projectedDoc).pop()).to.equal('data');
});
it('Updating document', async () => {
const data = 'Text data';
const insertedDoc = await db.insert({data});
expect(insertedDoc).to.be.a('object');
expect(insertedDoc.data).to.equal(data);
const updatedData = 'Updated text data';
await db.update({_id: insertedDoc._id}, {data: updatedData});
const updatedDoc = await db.findOne({_id: insertedDoc._id});
expect(updatedDoc).not.be.null;
expect(updatedDoc.data).not.equal(data);
expect(updatedDoc.data).to.equal(updatedData);
});
it('Updating documents with options', async () => {
const data = {update: true, data: 'Text data'};
await db.insert(data);
await db.insert(data);
let numberOfUpdatedDocs = await db.update({update: true}, {$set: {data: 'First update'}}, {multi: true});
expect(numberOfUpdatedDocs).to.equal(2);
const affectedDocs = await db.update({update: true}, {$set: {data: 'Second update'}}, {multi: true, returnUpdatedDocs: true});
expect(affectedDocs).to.be.a('array');
affectedDocs.forEach(doc => {
expect(doc.data).to.equal('Second update');
});
it('Creating db instance', async () => {
nedbInstance = new Datastore({filename: pathToDB, autoload: true});
db = new Database(nedbInstance);
const upsertedDoc = await db.update({update: true, data: 'First update'}, {$set: {data: 'Third update'}}, {upsert: true});
expect(upsertedDoc.update).to.be.true;
expect(upsertedDoc.data).to.equal('Third update');
numberOfUpdatedDocs = await db.update({data: 'Third update'}, {$set: {data: 'Fourth update'}}, {upsert: true});
expect(numberOfUpdatedDocs).to.equal(1);
});
it('Finding documents', async () => {
const data1 = 'Text data 1';
const data2 = 'Text data 2';
const insertedDoc1 = await db.insert({data: data1, flag: true, no: 1});
const insertedDoc2 = await db.insert({data: data2, flag: true, no: 2});
const foundDocs = await db.find({flag: true});
expect(foundDocs).to.be.a('array');
expect(foundDocs.length).to.equal(2);
foundDocs.sort(({no: a}, {no: b}) => a - b);
expect(foundDocs[0]._id).to.equal(insertedDoc1._id);
expect(foundDocs[0].data).to.equal(insertedDoc1.data);
expect(foundDocs[1]._id).to.equal(insertedDoc2._id);
expect(foundDocs[1].data).to.equal(insertedDoc2.data);
const projectedDocs = await db.find({flag: true}, {no: 1, _id: 0});
expect(projectedDocs.length).to.equal(2);
projectedDocs.forEach(data => {
expect(Object.keys(data).length).to.equal(1);
expect(Object.keys(data).pop()).to.equal('no');
});
});
it('Inserting document', async () => {
const data = 'Text data';
it('Removing document', async () => {
const data = 'Text data';
const insertedDoc = await db.insert({data});
const insertedDoc = await db.insert({data});
expect(insertedDoc).to.be.a('object');
expect(insertedDoc.data).to.equal(data);
});
expect(insertedDoc).to.be.a('object');
expect(insertedDoc.data).to.equal(data);
it('Finding document', async () => {
const data = 'Text data';
await db.remove({_id: insertedDoc._id});
const insertedDoc = await db.insert({data});
const deletedDoc = await db.findOne({_id: insertedDoc._id});
expect(insertedDoc).to.be.a('object');
expect(insertedDoc.data).to.equal(data);
expect(deletedDoc).to.be.null;
});
const foundDoc = await db.findOne({_id: insertedDoc._id});
it('Test invalid database queries', async () => {
try {
await db.insert();
} catch (err) {
expect(err.message).to.equal('Cannot read property \'_id\' of undefined');
}
expect(foundDoc).not.be.null;
expect(foundDoc._id).to.equal(insertedDoc._id);
expect(foundDoc.data).to.equal(data);
try {
await db.find({size: {$invalidComparator: 1}});
} catch (err) {
expect(err.message).to.equal('Unknown comparison function $invalidComparator');
}
try {
await db.findOne({field: {$invalidComparator: 1}});
} catch (err) {
expect(err.message).to.equal('Unknown comparison function $invalidComparator');
}
const projectedDoc = await db.findOne({_id: insertedDoc._id}, {data: 1, _id: 0});
try {
await db.update({field: {$undefinedComparator: 1}});
} catch (err) {
expect(err.message).to.equal('Unknown comparison function $undefinedComparator');
}
expect(Object.keys(projectedDoc).length).to.equal(1);
expect(Object.keys(projectedDoc).pop()).to.equal('data');
});
try {
await db.remove({field: {$undefinedComparator: 1}});
} catch (err) {
expect(err.message).to.equal('Unknown comparison function $undefinedComparator');
}
});
it('Updating document', async () => {
const data = 'Text data';
const insertedDoc = await db.insert({data});
expect(insertedDoc).to.be.a('object');
expect(insertedDoc.data).to.equal(data);
const updatedData = 'Updated text data';
await db.update({_id: insertedDoc._id}, {data: updatedData});
const updatedDoc = await db.findOne({_id: insertedDoc._id});
expect(updatedDoc).not.be.null;
expect(updatedDoc.data).not.equal(data);
expect(updatedDoc.data).to.equal(updatedData);
});
it('Updating documents with options', async () => {
const data = {update: true, data: 'Text data'};
await db.insert(data);
await db.insert(data);
let numberOfUpdatedDocs = await db.update({update: true}, {$set: {data: 'First update'}}, {multi: true});
expect(numberOfUpdatedDocs).to.equal(2);
const affectedDocs = await db.update({update: true}, {$set: {data: 'Second update'}}, {multi: true, returnUpdatedDocs: true});
expect(affectedDocs).to.be.a('array');
affectedDocs.forEach(doc => {
expect(doc.data).to.equal('Second update');
});
const upsertedDoc = await db.update({update: true, data: 'First update'}, {$set: {data: 'Third update'}}, {upsert: true});
expect(upsertedDoc.update).to.be.true;
expect(upsertedDoc.data).to.equal('Third update');
numberOfUpdatedDocs = await db.update({data: 'Third update'}, {$set: {data: 'Fourth update'}}, {upsert: true});
expect(numberOfUpdatedDocs).to.equal(1);
});
it('Finding documents', async () => {
const data1 = 'Text data 1';
const data2 = 'Text data 2';
const insertedDoc1 = await db.insert({data: data1, flag: true, no: 1});
const insertedDoc2 = await db.insert({data: data2, flag: true, no: 2});
const foundDocs = await db.find({flag: true});
expect(foundDocs).to.be.a('array');
expect(foundDocs.length).to.equal(2);
foundDocs.sort(({no: a}, {no: b}) => a - b);
expect(foundDocs[0]._id).to.equal(insertedDoc1._id);
expect(foundDocs[0].data).to.equal(insertedDoc1.data);
expect(foundDocs[1]._id).to.equal(insertedDoc2._id);
expect(foundDocs[1].data).to.equal(insertedDoc2.data);
const projectedDocs = await db.find({flag: true}, {no: 1, _id: 0});
expect(projectedDocs.length).to.equal(2);
projectedDocs.forEach(data => {
expect(Object.keys(data).length).to.equal(1);
expect(Object.keys(data).pop()).to.equal('no');
});
});
it('Removing document', async () => {
const data = 'Text data';
const insertedDoc = await db.insert({data});
expect(insertedDoc).to.be.a('object');
expect(insertedDoc.data).to.equal(data);
await db.remove({_id: insertedDoc._id});
const deletedDoc = await db.findOne({_id: insertedDoc._id});
expect(deletedDoc).to.be.null;
});
it('Test invalid database queries', async () => {
try {
await db.insert();
} catch (err) {
expect(err.message).to.equal('Cannot read property \'_id\' of undefined')
}
try {
await db.find({size: {$invalidComparator: 1}});
} catch (err) {
expect(err.message).to.equal('Unknown comparison function $invalidComparator');
}
try {
await db.findOne({field: {$invalidComparator: 1}});
} catch (err) {
expect(err.message).to.equal('Unknown comparison function $invalidComparator');
}
try {
await db.update({field: {$undefinedComparator: 1}})
} catch (err) {
expect(err.message).to.equal('Unknown comparison function $undefinedComparator');
}
try {
await db.remove({field: {$undefinedComparator: 1}})
} catch (err) {
expect(err.message).to.equal('Unknown comparison function $undefinedComparator');
}
});
after(() => {
if (fs.existsSync(pathToDB)) {
fs.unlinkSync(pathToDB);
}
})
after(() => {
if (fs.existsSync(pathToDB)) {
fs.unlinkSync(pathToDB);
}
});
});

View file

@ -5,17 +5,15 @@ const {expect} = chai;
chai.use(chaiHTTP);
describe(`Express app`, () => {
it('App is available', (done) => {
chai
.request(app)
.get('/')
.end((err, res) => {
expect(res).to.have.status(200);
done();
})
});
});
describe('Express app', () => {
it('App is available', (done) => {
chai
.request(app)
.get('/')
.end((err, res) => {
expect(err).to.be.null;
expect(res).to.have.status(200);
done();
});
});
});

View file

@ -3,164 +3,163 @@ const Page = require('../../models/page');
const {pages} = require('../../database');
describe('Page model', () => {
it('Working with empty model', async () => {
let page = new Page();
it('Working with empty model', async () => {
let page = new Page();
expect(page.data).to.be.a('object');
expect(page.data).to.be.a('object');
let {data} = page;
let {data} = page;
expect(data._id).to.be.undefined;
expect(data.title).to.be.undefined;
expect(data.body).to.be.undefined;
expect(data.parent).to.be.undefined;
expect(data._id).to.be.undefined;
expect(data.title).to.be.undefined;
expect(data.body).to.be.undefined;
expect(data.parent).to.be.undefined;
page = new Page(null);
page = new Page(null);
data = page.data;
data = page.data;
expect(data._id).to.be.undefined;
expect(data.title).to.be.undefined;
expect(data.body).to.be.undefined;
expect(data.parent).to.be.undefined;
expect(data._id).to.be.undefined;
expect(data.title).to.be.undefined;
expect(data.body).to.be.undefined;
expect(data.parent).to.be.undefined;
const initialData = {_id: 'page_id', title: 'Test page', body: 'Test page body'};
const initialData = {_id: 'page_id', title: 'Test page', body: 'Test page body'};
page = new Page(initialData);
page = new Page(initialData);
const json = page.toJSON();
const json = page.toJSON();
data = page.data;
data = page.data;
expect(data._id).to.equal(initialData._id);
expect(data.title).to.equal(initialData.title);
expect(data.body).to.equal(initialData.body);
expect(data.parent).to.be.undefined;
expect(data._id).to.equal(initialData._id);
expect(data.title).to.equal(initialData.title);
expect(data.body).to.equal(initialData.body);
expect(data.parent).to.be.undefined;
expect(json._id).to.equal(initialData._id);
expect(json.title).to.equal(initialData.title);
expect(json.body).to.equal(initialData.body);
expect(json.parent).to.be.undefined;
expect(json._id).to.equal(initialData._id);
expect(json.title).to.equal(initialData.title);
expect(json.body).to.equal(initialData.body);
expect(json.parent).to.be.undefined;
const update = {
_id: 12345,
title: 'Test page',
body: 'Test page body'
};
const update = {
_id: 12345,
title: 'Test page',
body: 'Test page body'
};
page.data = update;
page.data = update;
data = page.data;
data = page.data;
expect(data._id).to.equal(initialData._id);
expect(data.title).to.equal(update.title);
expect(data.body).to.equal(update.body);
expect(data.parent).to.be.undefined;
expect(data._id).to.equal(initialData._id);
expect(data.title).to.equal(update.title);
expect(data.body).to.equal(update.body);
expect(data.parent).to.be.undefined;
});
it('Saving, updating and deleting model in the database', async () => {
const initialData = {title: 'Test page', body: 'Test page body'};
const page = new Page(initialData);
let savedPage = await page.save();
expect(savedPage._id).not.be.undefined;
expect(savedPage.title).to.equal(initialData.title);
expect(savedPage.body).to.equal(initialData.body);
expect(page._id).not.be.undefined;
const insertedPage = await pages.findOne({_id: page._id});
expect(insertedPage._id).to.equal(page._id);
expect(insertedPage.title).to.equal(page.title);
expect(insertedPage.body).to.equal(page.body);
const updateData = {title: 'Updated test page', body: 'Updated test page body'};
page.data = updateData;
await page.save();
expect(page._id).to.equal(insertedPage._id);
const updatedPage = await pages.findOne({_id: page._id});
expect(updatedPage._id).to.equal(savedPage._id);
expect(updatedPage.title).to.equal(updateData.title);
expect(updatedPage.body).to.equal(updateData.body);
await page.destroy();
expect(page._id).to.be.undefined;
const removedPage = await pages.findOne({_id: updatedPage._id});
expect(removedPage).to.be.null;
});
it('Static get method', async () => {
const initialData = {title: 'Test page', body: 'Test page body'};
const page = new Page(initialData);
const savedPage = await page.save();
const foundPage = await Page.get(savedPage._id);
const {data} = foundPage;
expect(data._id).to.equal(savedPage._id);
expect(data.title).to.equal(initialData.title);
expect(data.body).to.equal(initialData.body);
await page.destroy();
});
it('Static getAll method', async () => {
const pagesToSave = [
new Page({title: 'Page 1', body: 'Page 1 body'}),
new Page({title: 'Page 2', body: 'Page 2 body'})
];
const savedPages = await Promise.all(pagesToSave.map(page => page.save()));
const foundPages = await Page.getAll({_id: {$in: savedPages.map(page => page._id)}});
expect(foundPages.length).to.equal(2);
foundPages.forEach((page, i) => {
expect(page.title).to.equal(pagesToSave[i].title);
expect(page.body).to.equal(pagesToSave[i].body);
});
});
it('Parent pages', async () => {
const parent = new Page({title: 'Parent page', body: 'Parent page body'});
const {_id: parentId} = await parent.save();
it('Saving, updating and deleting model in the database', async () => {
const initialData = {title: 'Test page', body: 'Test page body'};
const page = new Page(initialData);
const child = new Page({title: 'Child page', body: 'Child page body'});
let savedPage = await page.save();
child.parent = parent;
expect(savedPage._id).not.be.undefined;
expect(savedPage.title).to.equal(initialData.title);
expect(savedPage.body).to.equal(initialData.body);
expect(page._id).not.be.undefined;
const {_id: childId} = await child.save();
const insertedPage = await pages.findOne({_id: page._id});
const testedParent = await child.parent;
expect(insertedPage._id).to.equal(page._id);
expect(insertedPage.title).to.equal(page.title);
expect(insertedPage.body).to.equal(page.body);
expect(testedParent._id).to.equal(parentId);
expect(testedParent.title).to.equal(parent.title);
expect(testedParent.body).to.equal(parent.body);
const updateData = {title: 'Updated test page', body: 'Updated test page body'};
const children = await parent.children;
page.data = updateData;
await page.save();
expect(children.length).to.equal(1);
expect(page._id).to.equal(insertedPage._id);
const testedChild = children.pop();
const updatedPage = await pages.findOne({_id: page._id});
expect(testedChild._id).to.equal(childId);
expect(testedChild.title).to.equal(child.title);
expect(testedChild.body).to.equal(child.body);
expect(testedChild._parent).to.equal(child._parent);
expect(testedChild._parent).to.equal(parent._id);
expect(updatedPage._id).to.equal(savedPage._id);
expect(updatedPage.title).to.equal(updateData.title);
expect(updatedPage.body).to.equal(updateData.body);
await page.destroy();
expect(page._id).to.be.undefined;
const removedPage = await pages.findOne({_id: updatedPage._id});
expect(removedPage).to.be.null;
});
it('Static get method', async () => {
const initialData = {title: 'Test page', body: 'Test page body'};
const page = new Page(initialData);
const savedPage = await page.save();
const foundPage = await Page.get(savedPage._id);
const {data} = foundPage;
expect(data._id).to.equal(savedPage._id);
expect(data.title).to.equal(initialData.title);
expect(data.body).to.equal(initialData.body);
await page.destroy();
});
it('Static getAll method', async () => {
const pages = [
new Page({title: 'Page 1', body: 'Page 1 body'}),
new Page({title: 'Page 2', body: 'Page 2 body'})
];
const savedPages = await Promise.all(pages.map(page => page.save()));
const foundPages = await Page.getAll({_id: {$in: savedPages.map(page => page._id)}});
expect(foundPages.length).to.equal(2);
foundPages.forEach((page, i) => {
expect(page.title).to.equal(pages[i].title);
expect(page.body).to.equal(pages[i].body);
});
});
it('Parent pages', async () => {
const parent = new Page({title: 'Parent page', body: 'Parent page body'});
const {_id: parentId} = await parent.save();
const child = new Page({title: 'Child page', body: 'Child page body'});
child.parent = parent;
const {_id: childId} = await child.save();
const testedParent = await child.parent;
expect(testedParent._id).to.equal(parentId);
expect(testedParent.title).to.equal(parent.title);
expect(testedParent.body).to.equal(parent.body);
const children = await parent.children;
expect(children.length).to.equal(1);
const testedChild = children.pop();
expect(testedChild._id).to.equal(childId);
expect(testedChild.title).to.equal(child.title);
expect(testedChild.body).to.equal(child.body);
expect(testedChild._parent).to.equal(child._parent);
expect(testedChild._parent).to.equal(parent._id);
parent.destroy();
child.destroy();
});
});
parent.destroy();
child.destroy();
});
});

View file

@ -8,192 +8,195 @@ const {expect} = chai;
chai.use(chaiHTTP);
describe('Pages REST: ', () => {
let agent;
let agent;
before(async () => {
agent = chai.request.agent(app);
});
before(async () => {
agent = chai.request.agent(app);
});
it('Creating page', async () => {
const title = 'Test page';
const body = 'Test page body';
it('Creating page', async () => {
const title = 'Test page';
const body = 'Test page body';
const res = await agent
.put('/page')
.send({title, body});
expect(res).to.have.status(200);
expect(res).to.be.json;
const res = await agent
.put('/page')
.send({title, body});
const {success, result} = res.body;
expect(res).to.have.status(200);
expect(res).to.be.json;
expect(success).to.be.true;
expect(result._id).to.be.a('string');
expect(result.title).to.equal(title);
expect(result.body).to.equal(body);
const {success, result} = res.body;
const createdPage = await model.get(result._id);
expect(success).to.be.true;
expect(result._id).to.be.a('string');
expect(result.title).to.equal(title);
expect(result.body).to.equal(body);
expect(createdPage).not.be.null;
expect(createdPage._id).to.equal(result._id);
expect(createdPage.title).to.equal(title);
expect(createdPage.body).to.equal(body);
const createdPage = await model.get(result._id);
createdPage.destroy();
});
expect(createdPage).not.be.null;
expect(createdPage._id).to.equal(result._id);
expect(createdPage.title).to.equal(title);
expect(createdPage.body).to.equal(body);
it('Page data validation on create', async () => {
const res = await agent
.put('/page')
.send({someField: 'Some text'});
createdPage.destroy();
});
expect(res).to.have.status(400);
expect(res).to.be.json;
it('Page data validation on create', async () => {
const res = await agent
.put('/page')
.send({someField: 'Some text'});
const {success, error} = res.body;
expect(res).to.have.status(400);
expect(res).to.be.json;
expect(success).to.be.false;
expect(error).to.equal('Invalid request format');
});
const {success, error} = res.body;
it('Finding page', async () => {
const title = 'Test page';
const body = 'Test page body';
expect(success).to.be.false;
expect(error).to.equal('Invalid request format');
});
const put = await agent
.put('/page')
.send({title, body});
expect(put).to.have.status(200);
expect(put).to.be.json;
it('Finding page', async () => {
const title = 'Test page';
const body = 'Test page body';
const {result: {_id}} = put.body;
const put = await agent
.put('/page')
.send({title, body});
const get = await agent.get(`/page/${_id}`);
expect(put).to.have.status(200);
expect(put).to.be.json;
expect(get).to.have.status(200);
expect(get).to.be.json;
const {result: {_id}} = put.body;
const {success} = get.body;
const get = await agent.get(`/page/${_id}`);
expect(success).to.be.true;
expect(get).to.have.status(200);
expect(get).to.be.json;
const foundPage = await model.get(_id);
const {success} = get.body;
expect(foundPage._id).to.equal(_id);
expect(foundPage.title).to.equal(title);
expect(foundPage.body).to.equal(body);
expect(success).to.be.true;
foundPage.destroy();
});
const foundPage = await model.get(_id);
it('Finding page with not existing id', async () => {
const res = await agent.get('/page/not-existing-id');
expect(foundPage._id).to.equal(_id);
expect(foundPage.title).to.equal(title);
expect(foundPage.body).to.equal(body);
expect(res).to.have.status(400);
expect(res).to.be.json;
foundPage.destroy();
});
const {success, error} = res.body;
it('Finding page with not existing id', async () => {
const res = await agent.get('/page/not-existing-id');
expect(success).to.be.false;
expect(error).to.equal('Page with given id does not exist');
});
expect(res).to.have.status(400);
expect(res).to.be.json;
it('Updating page', async () => {
const title = 'Test page';
const body = 'Test page body';
const {success, error} = res.body;
let res = await agent
.put('/page')
.send({title, body});
expect(res).to.have.status(200);
expect(res).to.be.json;
expect(success).to.be.false;
expect(error).to.equal('Page with given id does not exist');
});
const {result: {_id}} = res.body;
it('Updating page', async () => {
const title = 'Test page';
const body = 'Test page body';
const updatedTitle = 'Updated test page';
const updatedBody = 'Updated test page body';
let res = await agent
.put('/page')
.send({title, body});
res = await agent
.post(`/page/${_id}`)
.send({title: updatedTitle, body: updatedBody});
expect(res).to.have.status(200);
expect(res).to.be.json;
expect(res).to.have.status(200);
expect(res).to.be.json;
const {result: {_id}} = res.body;
const {success, result} = res.body;
const updatedTitle = 'Updated test page';
const updatedBody = 'Updated test page body';
expect(success).to.be.true;
expect(result._id).to.equal(_id);
expect(result.title).not.equal(title);
expect(result.title).to.equal(updatedTitle);
expect(result.body).not.equal(body);
expect(result.body).to.equal(updatedBody);
res = await agent
.post(`/page/${_id}`)
.send({title: updatedTitle, body: updatedBody});
const updatedPage = await model.get(_id);
expect(res).to.have.status(200);
expect(res).to.be.json;
expect(updatedPage._id).to.equal(_id);
expect(updatedPage.title).not.equal(title);
expect(updatedPage.title).to.equal(updatedTitle);
expect(updatedPage.body).not.equal(body);
expect(updatedPage.body).to.equal(updatedBody);
const {success, result} = res.body;
updatedPage.destroy();
});
expect(success).to.be.true;
expect(result._id).to.equal(_id);
expect(result.title).not.equal(title);
expect(result.title).to.equal(updatedTitle);
expect(result.body).not.equal(body);
expect(result.body).to.equal(updatedBody);
it('Updating page with not existing id', async () => {
const res = await agent
. post('/page/not-existing-id')
.send({title: 'Updated title', body: 'Updated body'});
const updatedPage = await model.get(_id);
expect(res).to.have.status(400);
expect(res).to.be.json;
expect(updatedPage._id).to.equal(_id);
expect(updatedPage.title).not.equal(title);
expect(updatedPage.title).to.equal(updatedTitle);
expect(updatedPage.body).not.equal(body);
expect(updatedPage.body).to.equal(updatedBody);
const {success, error} = res.body;
updatedPage.destroy();
});
expect(success).to.be.false;
expect(error).to.equal('Page with given id does not exist');
});
it('Updating page with not existing id', async () => {
const res = await agent
. post('/page/not-existing-id')
.send({title: 'Updated title', body: 'Updated body'});
it('Removing page', async () => {
const title = 'Test page';
const body = 'Test page body';
expect(res).to.have.status(400);
expect(res).to.be.json;
let res = await agent
.put('/page')
.send({title, body});
expect(res).to.have.status(200);
expect(res).to.be.json;
const {success, error} = res.body;
const {result: {_id}} = res.body;
expect(success).to.be.false;
expect(error).to.equal('Page with given id does not exist');
});
res = await agent
.delete(`/page/${_id}`);
it('Removing page', async () => {
const title = 'Test page';
const body = 'Test page body';
expect(res).to.have.status(200);
expect(res).to.be.json;
let res = await agent
.put('/page')
.send({title, body});
const {success, result} = res.body;
expect(res).to.have.status(200);
expect(res).to.be.json;
expect(success).to.be.true;
expect(result._id).to.be.undefined;
expect(result.title).to.equal(title);
expect(result.body).to.equal(body);
const {result: {_id}} = res.body;
const deletedPage = await model.get(_id);
res = await agent
.delete(`/page/${_id}`);
expect(deletedPage._id).to.be.undefined;
});
expect(res).to.have.status(200);
expect(res).to.be.json;
it('Removing page with not existing id', async () => {
const res = await agent
.delete('/page/not-existing-id');
const {success, result} = res.body;
expect(res).to.have.status(400);
expect(res).to.be.json;
expect(success).to.be.true;
expect(result._id).to.be.undefined;
expect(result.title).to.equal(title);
expect(result.body).to.equal(body);
const {success, error} = res.body;
const deletedPage = await model.get(_id);
expect(success).to.be.false;
expect(error).to.equal('Page with given id does not exist');
})
expect(deletedPage._id).to.be.undefined;
});
it('Removing page with not existing id', async () => {
const res = await agent
.delete('/page/not-existing-id');
expect(res).to.have.status(400);
expect(res).to.be.json;
const {success, error} = res.body;
expect(success).to.be.false;
expect(error).to.equal('Page with given id does not exist');
});
});

732
yarn.lock

File diff suppressed because it is too large Load diff