Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 3 additions & 20 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,24 +1,7 @@
language: node_js
sudo: true
sudo: false

node_js:
- "5"
- "4"

env:
- CXX=g++-4.8
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.8

cache:
directories:
- node_modules

after_script:
- npm run lint
- npm run coverage
- npm run publish-coverage
- "5"

25 changes: 17 additions & 8 deletions lib/github.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ module.exports = function (options) {

opts = extend(opts, options)
opts.cache = seneca.make$('github')
opts.cache.load$()

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

if (github && !msg.update) {
return done(null, github)
return done(null, github.data$(github))
}

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

var data = JSON.parse(body)
var data = null

try {data = JSON.parse(body)}
catch (e) {return done(e)}

var distTags = data['dist-tags'] || {}
var latest = ((data.versions || {})[distTags.latest]) || {}
var repository = latest.repository || {}
var url = repository.url || ''

var matches = /[\/:]([^\/:]+?)[\/:]([^\/]+?)(\.git)*$/.exec(url) || []
var matches = /[\/:]([^\/:]+?)[\/:]([^\/]+?)(\.git)*$/.exec(url)
var params = {
name: msg.name,
url: url,
user: matches[1] || '',
repo: matches[2] || ''
user: matches[1] || null,
repo: matches[2] || null
}

if (!params.user || !params.repo) {
return done(new Error('not found on npm'))
}

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

payload.data = data
seneca.act('role:info,res:part,part:github', payload)
done()
done(null, {ok: true})
})
}

Expand Down Expand Up @@ -106,9 +115,9 @@ function queryGithub (msg, done) {
cached: Date.now()
}

function complete (err) {
function complete (err, data) {
if (err) return done(err)
else done(null, data)
else done(null, data.data$(data))
}

cache.load$(msg.name, (err, cached) => {
Expand Down
13 changes: 8 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
"scripts": {
"start": "node srv/start.js",
"isolated": "GITHUB_ISOLATED=true node srv/start.js",
"lint": "lab test -dL"
"lint": "lab -P test -dL",
"test": "lab -m 5000 -t 75 -v -P test",
"cov": "lab -s -P test -r lcov | coveralls"
},
"main": "lib/github.js",
"keywords": [
Expand Down Expand Up @@ -33,7 +35,7 @@
"license": "MIT",
"dependencies": {
"github4": "0.5.4",
"request": "2.69.0",
"request": "2.70.0",
"seneca": "2.0.0",
"seneca-balance-client": "0.4.0",
"seneca-entity": "0.0.1",
Expand All @@ -45,10 +47,11 @@
"toolbag-plugin-udp-reporter": "1.0.0"
},
"devDependencies": {
"code": "2.1.0",
"code": "2.2.0",
"coveralls": "2.11.9",
"eslint-config-seneca": "1.1.2",
"eslint-plugin-hapi": "4.0.0",
"eslint-plugin-standard": "1.3.1",
"lab": "8.2.0"
"eslint-plugin-standard": "1.3.2",
"lab": "10.3.1"
}
}
145 changes: 108 additions & 37 deletions test/github.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,66 +2,137 @@

var Lab = require('lab')
var Code = require('code')
var Seneca = require('seneca')
var Proxyquire = require('proxyquire')
var NpmFakeData = require('./npm-data')

var lab = exports.lab = Lab.script()

var describe = lab.describe
var it = lab.it
var expect = Code.expect

var Github = require('..')
var NpmProxy = {
request: {
get: (opts, done) => {
if (opts.url.includes('seneca')) {
done(null, {}, JSON.stringify(NpmFakeData))
}
else {
done(new Error('npm error'), null, null)
}
}
}
}

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

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

seneca.ready(function () {
seneca.act({ role: 'github', cmd: 'get', name: 'nodejs/node.git', giturl: 'git@github.com:nodejs/node.git' }, function (err, res) {
expect(err).to.not.exist()
expect(res.user).to.equal('nodejs')
expect(res.repo).to.equal('node')
expect(res.id).to.equal('nodejs/node.git')
done()
})
function createInstance (done) {
var params = {
log: 'silent',
strict: 'false',
errhandler: (err) => {
if (err.at) done(err)
}
}

return Seneca(params)
.use('entity')
.use(Github, {token: process.env.GITHUB_TOKEN})
}

describe('A valid "role:github,cmd:get" call', () => {
it('has data and no error', (done) => {
var seneca = createInstance(done)
var payload = {name: 'seneca'}

seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
expect(err).to.not.exist()
expect(reply).to.exist()
done()
})
})

it('Fired the query pattern', function (done) {
var seneca = Seneca({ log: 'silent' })
seneca.use(Github, { token: process.env.GITHUB_TOKEN })
it('returns cached data', (done) => {
var seneca = createInstance(done)
var payload = {name: 'seneca'}

seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
expect(err).to.not.exist()

seneca.ready(function () {
seneca.act({ role: 'github', cmd: 'query', name: 'nodejs/node.git', user: 'nodejs', repo: 'node' }, function (err, res) {
var cachedOne = reply.cached

seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
expect(err).to.not.exist()
expect(res.user).to.equal('nodejs')
expect(res.repo).to.equal('node')
expect(res.id).to.equal('nodejs/node.git')

var cachedTwo = reply.cached

expect(cachedOne).to.equal(cachedTwo)
done()
})
})
})

it('Fired the parse pattern', function (done) {
var seneca = Seneca({ log: 'silent' })
seneca.use(Github, { token: process.env.GITHUB_TOKEN })
it('can return non-cached data', (done) => {
var seneca = createInstance(done)
var payload = {name: 'seneca'}

seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
expect(err).to.not.exist()

seneca.ready(function () {
seneca.act({ role: 'github', cmd: 'parse', giturl: 'git@github.com:nodejs/node.git' }, function (err, res) {
var cachedOne = reply.cached
payload.update = true

seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
expect(err).to.not.exist()
expect(res.user).to.equal('nodejs')
expect(res.repo).to.equal('node')

var cachedTwo = reply.cached

expect(cachedOne).to.be.below(cachedTwo)
done()
})
})
})
})

describe('An invalid "role:github,cmd:get" call', () => {
it('has an error and no data', (done) => {
var seneca = createInstance(done)
var payload = {name: 'shooobydoobydooboop'}

seneca.act(`role:github,cmd:get`, payload, (err, reply) => {
expect(err).to.exist()
expect(reply).to.not.exist()
done()
})
})
})

describe('A valid "role:info,req:part" call', () => {
it('has no error and has data', (done) => {
var seneca = createInstance(done)
var payload = {name: 'seneca'}

seneca.act(`role:info,req:part`, payload, (err, reply) => {
expect(err).to.not.exist()
expect(reply).to.exist()
done()
})
})

it('responds via "role:info,res:part"', (done) => {
var seneca = createInstance(done)
var payload = {name: 'seneca'}

seneca.add(`role:info,res:part`, (msg, cb) => {
expect(msg).to.exist()
cb()
done()
})

seneca.act(`role:info,req:part`, payload, (err, reply) => {
expect(err).to.not.exist()
expect(reply).to.exist()
})
})
})
Loading