Skip to content

Commit c977549

Browse files
committed
Merge pull request #64 from nodezoo/tests
[WIP] Initial tests
2 parents 9ba6c7c + 0afec01 commit c977549

File tree

5 files changed

+255
-70
lines changed

5 files changed

+255
-70
lines changed

.travis.yml

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,7 @@
11
language: node_js
2-
sudo: true
2+
sudo: false
33

44
node_js:
5-
- "5"
65
- "4"
7-
8-
env:
9-
- CXX=g++-4.8
10-
addons:
11-
apt:
12-
sources:
13-
- ubuntu-toolchain-r-test
14-
packages:
15-
- g++-4.8
16-
17-
cache:
18-
directories:
19-
- node_modules
20-
21-
after_script:
22-
- npm run lint
23-
- npm run coverage
24-
- npm run publish-coverage
6+
- "5"
7+

lib/github.js

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ module.exports = function (options) {
1515

1616
opts = extend(opts, options)
1717
opts.cache = seneca.make$('github')
18+
opts.cache.load$()
1819

1920
seneca.add('role:github,cmd:get', cmdGet)
2021
seneca.add('role:info,req:part', aliasGet)
@@ -32,24 +33,32 @@ function cmdGet (msg, done) {
3233
if (err) return done(err)
3334

3435
if (github && !msg.update) {
35-
return done(null, github)
36+
return done(null, github.data$(github))
3637
}
3738

3839
Request.get({url: registry, gzip: true}, (err, res, body) => {
3940
if (err) return done(err)
4041

41-
var data = JSON.parse(body)
42+
var data = null
43+
44+
try {data = JSON.parse(body)}
45+
catch (e) {return done(e)}
46+
4247
var distTags = data['dist-tags'] || {}
4348
var latest = ((data.versions || {})[distTags.latest]) || {}
4449
var repository = latest.repository || {}
4550
var url = repository.url || ''
4651

47-
var matches = /[\/:]([^\/:]+?)[\/:]([^\/]+?)(\.git)*$/.exec(url) || []
52+
var matches = /[\/:]([^\/:]+?)[\/:]([^\/]+?)(\.git)*$/.exec(url)
4853
var params = {
4954
name: msg.name,
5055
url: url,
51-
user: matches[1] || '',
52-
repo: matches[2] || ''
56+
user: matches[1] || null,
57+
repo: matches[2] || null
58+
}
59+
60+
if (!params.user || !params.repo) {
61+
return done(new Error('not found on npm'))
5362
}
5463

5564
queryGithub(params, done)
@@ -66,7 +75,7 @@ function aliasGet (msg, done) {
6675

6776
payload.data = data
6877
seneca.act('role:info,res:part,part:github', payload)
69-
done()
78+
done(null, {ok: true})
7079
})
7180
}
7281

@@ -106,9 +115,9 @@ function queryGithub (msg, done) {
106115
cached: Date.now()
107116
}
108117

109-
function complete (err) {
118+
function complete (err, data) {
110119
if (err) return done(err)
111-
else done(null, data)
120+
else done(null, data.data$(data))
112121
}
113122

114123
cache.load$(msg.name, (err, cached) => {

package.json

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
"scripts": {
66
"start": "node srv/start.js",
77
"isolated": "GITHUB_ISOLATED=true node srv/start.js",
8-
"lint": "lab test -dL"
8+
"lint": "lab -P test -dL",
9+
"test": "lab -m 5000 -t 75 -v -P test",
10+
"cov": "lab -s -P test -r lcov | coveralls"
911
},
1012
"main": "lib/github.js",
1113
"keywords": [
@@ -33,7 +35,7 @@
3335
"license": "MIT",
3436
"dependencies": {
3537
"github4": "0.5.4",
36-
"request": "2.69.0",
38+
"request": "2.70.0",
3739
"seneca": "2.0.0",
3840
"seneca-balance-client": "0.4.0",
3941
"seneca-entity": "0.0.1",
@@ -42,10 +44,11 @@
4244
"seneca-redis-store": "0.0.8"
4345
},
4446
"devDependencies": {
45-
"code": "2.1.0",
47+
"code": "2.2.0",
48+
"coveralls": "2.11.9",
4649
"eslint-config-seneca": "1.1.2",
4750
"eslint-plugin-hapi": "4.0.0",
48-
"eslint-plugin-standard": "1.3.1",
49-
"lab": "8.2.0"
51+
"eslint-plugin-standard": "1.3.2",
52+
"lab": "10.3.1"
5053
}
5154
}

test/github.test.js

Lines changed: 108 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,66 +2,137 @@
22

33
var Lab = require('lab')
44
var Code = require('code')
5-
var Seneca = require('seneca')
5+
var Proxyquire = require('proxyquire')
6+
var NpmFakeData = require('./npm-data')
67

78
var lab = exports.lab = Lab.script()
8-
99
var describe = lab.describe
1010
var it = lab.it
1111
var expect = Code.expect
1212

13-
var Github = require('..')
13+
var NpmProxy = {
14+
request: {
15+
get: (opts, done) => {
16+
if (opts.url.includes('seneca')) {
17+
done(null, {}, JSON.stringify(NpmFakeData))
18+
}
19+
else {
20+
done(new Error('npm error'), null, null)
21+
}
22+
}
23+
}
24+
}
1425

15-
/*
16-
* Notice: For travis/CI, tests have been configured with a token provided by
17-
* https://github.com/thekemkid. However, This is a read only token which will
18-
* only be able to read from public repos. You can create a similar token in
19-
* your github settings > personal access tokens > generate new token. You do
20-
* not have to enable any special permissions for this token.
21-
*/
2226

23-
describe('nodezoo-github', function () {
24-
it('Fired the get pattern', function (done) {
25-
var seneca = Seneca({ log: 'silent' })
26-
seneca.use(Github, { token: process.env.GITHUB_TOKEN })
27+
var Seneca = Proxyquire('seneca', {})
28+
var Github = Proxyquire('..', NpmProxy)
2729

28-
seneca.ready(function () {
29-
seneca.act({ role: 'github', cmd: 'get', name: 'nodejs/node.git', giturl: 'git@github.com:nodejs/node.git' }, function (err, res) {
30-
expect(err).to.not.exist()
31-
expect(res.user).to.equal('nodejs')
32-
expect(res.repo).to.equal('node')
33-
expect(res.id).to.equal('nodejs/node.git')
34-
done()
35-
})
30+
function createInstance (done) {
31+
var params = {
32+
log: 'silent',
33+
strict: 'false',
34+
errhandler: (err) => {
35+
if (err.at) done(err)
36+
}
37+
}
38+
39+
return Seneca(params)
40+
.use('entity')
41+
.use(Github, {token: process.env.GITHUB_TOKEN})
42+
}
43+
44+
describe('A valid "role:github,cmd:get" call', () => {
45+
it('has data and no error', (done) => {
46+
var seneca = createInstance(done)
47+
var payload = {name: 'seneca'}
48+
49+
seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
50+
expect(err).to.not.exist()
51+
expect(reply).to.exist()
52+
done()
3653
})
3754
})
3855

39-
it('Fired the query pattern', function (done) {
40-
var seneca = Seneca({ log: 'silent' })
41-
seneca.use(Github, { token: process.env.GITHUB_TOKEN })
56+
it('returns cached data', (done) => {
57+
var seneca = createInstance(done)
58+
var payload = {name: 'seneca'}
59+
60+
seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
61+
expect(err).to.not.exist()
4262

43-
seneca.ready(function () {
44-
seneca.act({ role: 'github', cmd: 'query', name: 'nodejs/node.git', user: 'nodejs', repo: 'node' }, function (err, res) {
63+
var cachedOne = reply.cached
64+
65+
seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
4566
expect(err).to.not.exist()
46-
expect(res.user).to.equal('nodejs')
47-
expect(res.repo).to.equal('node')
48-
expect(res.id).to.equal('nodejs/node.git')
67+
68+
var cachedTwo = reply.cached
69+
70+
expect(cachedOne).to.equal(cachedTwo)
4971
done()
5072
})
5173
})
5274
})
5375

54-
it('Fired the parse pattern', function (done) {
55-
var seneca = Seneca({ log: 'silent' })
56-
seneca.use(Github, { token: process.env.GITHUB_TOKEN })
76+
it('can return non-cached data', (done) => {
77+
var seneca = createInstance(done)
78+
var payload = {name: 'seneca'}
79+
80+
seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
81+
expect(err).to.not.exist()
5782

58-
seneca.ready(function () {
59-
seneca.act({ role: 'github', cmd: 'parse', giturl: 'git@github.com:nodejs/node.git' }, function (err, res) {
83+
var cachedOne = reply.cached
84+
payload.update = true
85+
86+
seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
6087
expect(err).to.not.exist()
61-
expect(res.user).to.equal('nodejs')
62-
expect(res.repo).to.equal('node')
88+
89+
var cachedTwo = reply.cached
90+
91+
expect(cachedOne).to.be.below(cachedTwo)
6392
done()
6493
})
6594
})
6695
})
6796
})
97+
98+
describe('An invalid "role:github,cmd:get" call', () => {
99+
it('has an error and no data', (done) => {
100+
var seneca = createInstance(done)
101+
var payload = {name: 'shooobydoobydooboop'}
102+
103+
seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
104+
expect(err).to.exist()
105+
expect(reply).to.not.exist()
106+
done()
107+
})
108+
})
109+
})
110+
111+
describe('A valid "role:info,req:part" call', () => {
112+
it('has no error and has data', (done) => {
113+
var seneca = createInstance(done)
114+
var payload = {name: 'seneca'}
115+
116+
seneca.act(`role:info,req:part`, payload, (err, reply) => {
117+
expect(err).to.not.exist()
118+
expect(reply).to.exist()
119+
done()
120+
})
121+
})
122+
123+
it('responds via "role:info,res:part"', (done) => {
124+
var seneca = createInstance(done)
125+
var payload = {name: 'seneca'}
126+
127+
seneca.add(`role:info,res:part`, (msg, cb) => {
128+
expect(msg).to.exist()
129+
cb()
130+
done()
131+
})
132+
133+
seneca.act(`role:info,req:part`, payload, (err, reply) => {
134+
expect(err).to.not.exist()
135+
expect(reply).to.exist()
136+
})
137+
})
138+
})

0 commit comments

Comments
 (0)