Skip to content

Commit ab804ba

Browse files
author
Guilherme Oenning
committed
adding unit tests and lint fix
1 parent 2cdb7e4 commit ab804ba

File tree

9 files changed

+194
-41
lines changed

9 files changed

+194
-41
lines changed

README.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
Node.js implementation of Stack Exchange's MiniProfiler
44

5-
### This is working but not yet considered production ready. Use with caution.
5+
### This is working, but not yet considered production ready. Use with caution.
66

77
# requirements
88

@@ -12,12 +12,17 @@ Currently requires express and connect to run, because it uses `res.on('header',
1212

1313
Clone this repo into your project's node_modules directory. You can also install from npm, but the package may be outdated: https://www.npmjs.org/package/miniprofiler.
1414

15-
Then see [connect_test.js](https://github.com/MiniProfiler/node/blob/master/connect_test.js) for example use.
15+
Then see [examples/express/server.js](/blob/master/examples/express/server.js) for example use.
1616

1717
# Want to help?
1818

19-
Things that need doing:
19+
Things to do:
2020

2121
- remove dependency from express and connect
2222
- storing of client timings on first result postback (there's a todo in the `results` function about where to do this)
2323
- document more things
24+
- tests for everything
25+
- add examples for every frameworks
26+
- add examples for every provider
27+
- add more providers (mongodb, mysql, redis)
28+
- remove old ids from global storage

examples/express/server.js

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,31 @@
1-
var miniprofiler = require('../../miniprofiler.js')
2-
var pg = require('pg')
1+
var miniprofiler = require('../../miniprofiler.js');
2+
var pg = require('pg');
33

4-
var express = require('express')
5-
var connString = 'postgres://postgres:postgres@localhost/async_demo'
4+
var express = require('express');
5+
var connString = 'postgres://postgres:postgres@localhost/async_demo';
66

7-
var app = express()
8-
app.use(miniprofiler.profile())
9-
app.use(miniprofiler.for.pg(pg))
7+
var app = express();
8+
app.use(miniprofiler.profile());
9+
app.use(miniprofiler.for.pg(pg));
1010

11-
app.set('view engine', 'pug')
12-
app.set('views', './examples/views')
11+
app.set('view engine', 'pug');
12+
app.set('views', './examples/views');
1313

1414
app.get('/', function (req, res) {
15-
res.render('home')
16-
})
15+
res.render('home');
16+
});
1717

1818
app.get('/multi-query', function (req, res) {
1919
pg.connect(connString, function (err, client, done) {
20-
client.query('SELECT pg_sleep(1)', [], function (err, result) {
21-
client.query('SELECT $1::int AS number', ['2'], function (err, result) {
22-
console.log(result)
23-
done()
24-
res.render('multi-query')
25-
})
26-
})
27-
})
28-
})
20+
client.query('SELECT pg_sleep(1)', [], function (err, result) {
21+
console.log(result);
22+
client.query('SELECT $1::int AS number', ['2'], function (err, result) {
23+
console.log(result);
24+
done();
25+
res.render('multi-query');
26+
});
27+
});
28+
});
29+
});
2930

30-
app.listen(8080)
31+
app.listen(8080);

examples/http/server.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
var http = require('http');
2+
var miniprofiler = require('../../miniprofiler.js');
3+
4+
http.createServer(function (req, res) {
5+
var profile = miniprofiler.profile();
6+
profile(req, res, function(){
7+
req.miniprofiler.step('a', function(){
8+
res.end('home');
9+
})
10+
})
11+
}).listen(8080);

miniprofiler.js

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
/*
2-
* Miniprofiler implementation for node.js.
2+
* MiniProfiler implementation for node.js.
33
*
44
* Apache License, Version 2.0
55
*
6-
* Kevin Montrose, 2013
7-
* Matt Jibson, 2013
6+
* Kevin Montrose, 2013 @kevin-montrose
7+
* Matt Jibson, 2013 @mjibson
8+
* Guilherme Oenning, 2016 @goenning
89
*/
910

1011
var _ = require('./underscore-min.js');
@@ -24,7 +25,7 @@ exports.instrument = addProfilingInstrumentation;
2425
exports.profile = middleware;
2526
exports.for = {
2627
pg: require('./providers/miniprofiler.pg.js')
27-
}
28+
};
2829

2930
// GLOBALS
3031
var storage = function(id, json) {
@@ -48,6 +49,7 @@ var storage = function(id, json) {
4849

4950
return null;
5051
};
52+
5153
var ignoredPaths = [];
5254
var trivialDurationThresholdMilliseconds = 2.5;
5355
var popupShowTimeWithChildren = false;
@@ -121,7 +123,6 @@ var includes = {
121123
};
122124

123125
// FUNCTIONS
124-
125126
if (typeof String.prototype.startsWith != 'function') {
126127
String.prototype.startsWith = function (str){
127128
return this.slice(0, str.length) == str;
@@ -151,8 +152,8 @@ function middleware(f) {
151152
var id = startProfiling(req, enabled);
152153

153154
res.locals.miniprofiler = enabled ? req.miniprofiler : {
154-
include: function() { return '' }
155-
}
155+
include: function() { return ''; }
156+
};
156157

157158
if (enabled) {
158159
res.on('finish', function() {
@@ -266,7 +267,7 @@ function startProfiling(request, enabled) {
266267
}
267268
};
268269
currentRequestExtension.step = function(name, call) {
269-
var args = Array.prototype.slice.call(arguments, enabled ? 0 : 2);
270+
//var args = Array.prototype.slice.call(arguments, enabled ? 0 : 2);
270271
if (enabled) {
271272
step(name, request, call);
272273
} else {
@@ -299,7 +300,7 @@ function stopProfiling(request){
299300

300301
// get those references gone, we can't assume much about GC here
301302
// (is the above comment still true? is this line needed? - mjibson)
302-
delete request.miniprofiler
303+
delete request.miniprofiler;
303304

304305
var json = describePerformance(extension, request);
305306
var ret = extension.id;

package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"description": "A simple but effective mini-profiler.",
55
"main": "miniprofiler.js",
66
"scripts": {
7-
"lint": "eslint ."
7+
"lint": "eslint .",
8+
"test": "mocha tests/"
89
},
910
"repository": {
1011
"type": "git",
@@ -14,11 +15,13 @@
1415
"license": "Apache-2.0",
1516
"readmeFilename": "README.md",
1617
"devDependencies": {
18+
"chai": "^3.5.0",
1719
"eslint": "^2.9.0",
1820
"express": "^4.13.4",
1921
"mocha": "^2.4.5",
2022
"pg": "^4.5.5",
2123
"pug": "^2.0.0-alpha6",
22-
"redis": "^2.6.0-2"
24+
"redis": "^2.6.0-2",
25+
"request": "^2.72.0"
2326
}
2427
}

providers/miniprofiler.pg.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
var pgQuery;
22

33
module.exports = function (pg) {
4-
pgQuery = pgQuery || pg.Client.prototype.query
4+
pgQuery = pgQuery || pg.Client.prototype.query;
55
return function (req, res, next) {
66
if (req.miniprofiler.enabled) {
77
pg.Client.query = function (config, values, callback) {
8-
req.miniprofiler.timeQuery('sql', config.toString(), pgQuery.bind(this), config, values, callback)
9-
}
8+
req.miniprofiler.timeQuery('sql', config.toString(), pgQuery.bind(this), config, values, callback);
9+
};
1010
}
11-
next()
12-
}
13-
}
11+
next();
12+
};
13+
};

tests/basic.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
var expect = require('chai').expect;
2+
var miniprofiler = require('../miniprofiler.js');
3+
var server = require('./demo-server.js');
4+
5+
describe('MiniProfiler Tests', function() {
6+
before(server.start);
7+
after(server.stop);
8+
9+
it('Unprofiled route should not return Profiler ID', function(done) {
10+
server.get('/unprofiled', (err, response, body) => {
11+
expect(response.headers).to.not.include.keys('x-miniprofiler-ids');
12+
done()
13+
})
14+
});
15+
});

tests/demo-server.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
var miniprofiler = require('../miniprofiler.js');
2+
var express = require('express');
3+
var request = require('request');
4+
5+
var app = express();
6+
var server;
7+
8+
var enableMiniProfiler = (req, res) => {
9+
return req.url != '/unprofiled'
10+
}
11+
12+
app.use(miniprofiler.profile(enableMiniProfiler));
13+
14+
app.get('/', (req, res) => {
15+
res.send();
16+
});
17+
18+
app.get('/step', (req, res) => {
19+
req.miniprofiler.step('Step 1', () => {
20+
res.send();
21+
});
22+
});
23+
24+
app.get('/step-two', (req, res) => {
25+
req.miniprofiler.step('Step 1', () => {
26+
req.miniprofiler.step('Step 2', () => {
27+
res.send();
28+
});
29+
});
30+
});
31+
32+
app.get('/unprofiled', (req, res) => {
33+
res.send();
34+
});
35+
36+
module.exports = {
37+
start: () => {
38+
server = app.listen(8080);
39+
},
40+
stop: () => {
41+
server.close();
42+
},
43+
get: (path, cb) => {
44+
request.get(`http://localhost:8080${path}`, (err, response, body) => {
45+
cb(err, response, body);
46+
});
47+
},
48+
post: (path, params, cb) => {
49+
request.post({url: `http://localhost:8080${path}`, form: params }, (err, response, body) => {
50+
cb(err, response, body);
51+
});
52+
}
53+
};

tests/step.js

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
var expect = require('chai').expect;
2+
var miniprofiler = require('../miniprofiler.js');
3+
var server = require('./demo-server.js');
4+
5+
describe('MiniProfiler Step Tests', function() {
6+
before(server.start);
7+
after(server.stop);
8+
9+
it('Index route should not profile any step', function(done) {
10+
server.get('/', (err, response, body) => {
11+
var ids = JSON.parse(response.headers['x-miniprofiler-ids']);
12+
expect(ids).to.have.lengthOf(1);
13+
14+
server.post('/mini-profiler-resources/results', { id: ids[0], popup: 1 }, (err, response, body) => {
15+
var result = JSON.parse(body)
16+
expect(result.Id).to.equal(ids[0]);
17+
expect(result.Name).to.equal('/');
18+
expect(result.Root.Children).to.be.empty;
19+
20+
done();
21+
});
22+
});
23+
});
24+
25+
it('step route should profile one step', function(done) {
26+
server.get('/step', (err, response, body) => {
27+
var ids = JSON.parse(response.headers['x-miniprofiler-ids']);
28+
expect(ids).to.have.lengthOf(1);
29+
30+
server.post('/mini-profiler-resources/results', { id: ids[0], popup: 1 }, (err, response, body) => {
31+
var result = JSON.parse(body)
32+
expect(result.Id).to.equal(ids[0]);
33+
expect(result.Name).to.equal('/step');
34+
expect(result.Root.Children).to.have.lengthOf(1);
35+
36+
expect(result.Root.Children[0].Name).to.equal('Step 1');
37+
expect(result.Root.Children[0].Children).to.be.empty;
38+
39+
done();
40+
});
41+
});
42+
});
43+
44+
it('step-two route should profile two nested step', function(done) {
45+
server.get('/step-two', (err, response, body) => {
46+
var ids = JSON.parse(response.headers['x-miniprofiler-ids']);
47+
expect(ids).to.have.lengthOf(1);
48+
49+
server.post('/mini-profiler-resources/results', { id: ids[0], popup: 1 }, (err, response, body) => {
50+
var result = JSON.parse(body)
51+
expect(result.Id).to.equal(ids[0]);
52+
expect(result.Name).to.equal('/step-two');
53+
expect(result.Root.Children).to.have.lengthOf(1);
54+
55+
expect(result.Root.Children[0].Name).to.equal('Step 1');
56+
expect(result.Root.Children[0].Children).to.have.lengthOf(1);
57+
58+
expect(result.Root.Children[0].Children[0].Name).to.equal('Step 2');
59+
expect(result.Root.Children[0].Children[0].Children).to.be.empty;
60+
done();
61+
});
62+
});
63+
});
64+
});

0 commit comments

Comments
 (0)