Skip to content

Commit

Permalink
Merge pull request #3 from mauris/develop
Browse files Browse the repository at this point in the history
Development updates for v1.2.0
  • Loading branch information
mauris authored Aug 28, 2016
2 parents cb45b6a + f1e9fdb commit 69ca9d9
Show file tree
Hide file tree
Showing 3 changed files with 163 additions and 45 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "accuser",
"version": "1.1.1",
"version": "1.2.0",
"description": "A Github Pull Request bot for assigning people to pull requests",
"main": "index.js",
"scripts": {
Expand Down
73 changes: 51 additions & 22 deletions src/Accuser.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
Accuser - Github wrapper for pull request automation.
Accuser - Github wrapper for issue and pull request automation.
Written by Sam-Mauris Yong
Code licensed under MIT License.
*/
Expand All @@ -21,26 +21,46 @@ Accuser.prototype.authenticate = function(config) {
return this.github.authenticate(config);
};

Accuser.prototype.accuse = function(pr, usernames) {
Accuser.prototype.accuse = function(repository, issue, usernames) {
var self = this;
self.github.issues.addAssigneesToIssue({
user: pr.base.repo.owner.login,
repo: pr.base.repo.name,
number: pr.number,
assignees: usernames
user: repository.user,
repo: repository.repo,
number: issue.number,
assignees: usernames.constructor == Array ? usernames : [usernames]
});
};

Accuser.prototype.comment = function(pr, comment) {
Accuser.prototype.comment = function(repository, issue, comment) {
var self = this;
self.github.issues.createComment({
user: pr.base.repo.owner.login,
repo: pr.base.repo.name,
number: pr.number,
user: repository.user,
repo: repository.repo,
number: issue.number,
body: comment
});
};

Accuser.prototype.addLabels = function(repository, issue, labels) {
var self = this;
self.github.issues.addLabels({
user: repository.user,
repo: repository.repo,
number: issue.number,
body: labels.constructor == Array ? labels : [labels]
});
};

Accuser.prototype.removeLabel = function(repository, issue, label) {
var self = this;
self.github.issues.removeLabel({
user: repository.user,
repo: repository.repo,
number: issue.number,
name: label
});
};

Accuser.prototype.addRepository = function(user, repo) {
var self = this;
var repository = new Repository(user, repo);
Expand Down Expand Up @@ -69,26 +89,33 @@ var createResponseCallback = function(github, resolve, repository) {
return function(result) {
runWorkers(repository, result);
if (github.hasNextPage(result)) {
github.getNextPage(result)
.then(createResponseCallback(github, resolve, repository));
github.getNextPage(result, function(err, res){
var callback = createResponseCallback(github, resolve, repository);
if (err === null) {
callback(res);
}
});
} else {
// done with all paginations
resolve();
}
};
};

Accuser.prototype.tick = function() {
Accuser.prototype.tick = function(filters) {
var self = this;
var promises = [];

filters = filters || {};
filters.state = filters.state || 'open';
filters.assignee = filters.assignee || '*';

self.repos.forEach(function(repository) {
var repoPromise = new Promise(function(resolve, reject){
self.github.pullRequests
.getAll({
'user': repository.user,
'repo': repository.repo,
'state': 'open'
})
filters.user = repository.user;
filters.repo = repository.repo;
self.github.issues
.getForRepo(filters)
.then(createResponseCallback(self.github, resolve, repository));
});
promises.push(repoPromise);
Expand All @@ -98,18 +125,20 @@ Accuser.prototype.tick = function() {
.all(promises);
};

Accuser.prototype.run = function() {
Accuser.prototype.run = function(filters) {
var self = this;
var github = self.github;

filters = filters || {};

var tickInterval = function() {
self.tick()
self.tick(filters)
.then(function() {
setTimeout(tickInterval, self.interval);
});
};

self.tick()
self.tick(filters)
.then(function() {
setTimeout(tickInterval, self.interval);
});
Expand Down
133 changes: 111 additions & 22 deletions test/testAccuser.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ var Accuser = require('../');

describe("Accuser", function() {
var accuser;
var samplePR = {

var sampleIssue = {
number: 20,
base: {
repo: {
Expand Down Expand Up @@ -45,57 +46,145 @@ describe("Accuser", function() {
next();
});

it("should accuse someone based on a pull request object and username", function(next) {
it("should accuse someone based on an issue object and username", function(next) {
var repository = accuser.addRepository("mauris", "accuser");

accuser.github = {
issues: {
addAssigneesToIssue: function(obj) {
assert(obj.repo === repository.repo);
assert(obj.user === repository.user);
assert(obj.number === sampleIssue.number);
assert(obj.assignees[0] === "mauris");
}
}
};
var mock = sinon.mock(accuser.github.issues);
mock.expects("addAssigneesToIssue").once();
accuser.accuse(repository, sampleIssue, "mauris");
mock.verify();
next();
});

it("should accuse someone based on an issue object and multiple username", function(next) {
var repository = accuser.addRepository("mauris", "accuser");

accuser.github = {
issues: {
addAssigneesToIssue: function(obj) {
assert(obj.repo === samplePR.base.repo.name);
assert(obj.user === samplePR.base.repo.owner.login);
assert(obj.number === samplePR.number);
assert(obj.repo === repository.repo);
assert(obj.user === repository.user);
assert(obj.number === sampleIssue.number);
assert(obj.assignees[0] === "mauris");
assert(obj.assignees[1] === "octocat");
}
}
};
var mock = sinon.mock(accuser.github.issues);
mock.expects("addAssigneesToIssue").once();
accuser.accuse(samplePR, ["mauris"]);
accuser.accuse(repository, sampleIssue, ["mauris", "octocat"]);
mock.verify();
next();
});

it("should add a comment to a pull request", function(next) {
it("should add a comment to an issue", function(next) {
var repository = accuser.addRepository("mauris", "accuser");

accuser.github = {
issues: {
createComment: function(obj) {
assert(obj.repo === samplePR.base.repo.name);
assert(obj.user === samplePR.base.repo.owner.login);
assert(obj.number === samplePR.number);
assert(obj.repo === repository.repo);
assert(obj.user === repository.user);
assert(obj.number === sampleIssue.number);
assert(obj.body === "some comment");
}
}
};
var mock = sinon.mock(accuser.github.issues);
mock.expects("createComment").once();
accuser.comment(samplePR, "some comment");
accuser.comment(repository, sampleIssue, "some comment");
mock.verify();
next();
});

it("should fetch pull requests from an added repository", function(next) {
it("should add a label to an issue", function(next) {
var repository = accuser.addRepository("mauris", "accuser");
var testLabel = "testingonly";
accuser.github = {
issues: {
addLabels: function(obj) {
assert(obj.repo === repository.repo);
assert(obj.user === repository.user);
assert(obj.number === sampleIssue.number);
assert(obj.body[0] === testLabel);
}
}
};
var mock = sinon.mock(accuser.github.issues);
mock.expects("addLabels").once();
accuser.addLabels(repository, sampleIssue, testLabel);
mock.verify();
next();
});

it("should add some labels to an issue", function(next) {
var repository = accuser.addRepository("mauris", "accuser");
var testLabel = [
"testingonly",
"noway"
];
accuser.github = {
issues: {
addLabels: function(obj) {
assert(obj.repo === repository.repo);
assert(obj.user === repository.user);
assert(obj.number === sampleIssue.number);
assert(obj.body === testLabel);
}
}
};
var mock = sinon.mock(accuser.github.issues);
mock.expects("addLabels").once();
accuser.addLabels(repository, sampleIssue, testLabel);
mock.verify();
next();
});

it("should remove a label from an issue", function(next) {
var repository = accuser.addRepository("mauris", "accuser");
var testLabel = "noway";
accuser.github = {
issues: {
removeLabel: function(obj) {
assert(obj.repo === repository.repo);
assert(obj.user === repository.user);
assert(obj.number === sampleIssue.number);
assert(obj.body === testLabel);
}
}
};
var mock = sinon.mock(accuser.github.issues);
mock.expects("removeLabel").once();
accuser.removeLabel(repository, sampleIssue, testLabel);
mock.verify();
next();
});

it("should fetch issues from an added repository", function(next) {
var repository = accuser.addRepository("mauris", "accuser");

var filterSpy = sinon.spy();
var workerFilter = function(repo, pr) {
var workerFilter = function(repo, issue) {
assert(repository === repo);
assert(pr == samplePR);
assert(issue == sampleIssue);
filterSpy();
return true;
};

var doSpy = sinon.spy();
var workerDo = function(repo, pr) {
var workerDo = function(repo, issue) {
assert(repository === repo);
assert(pr == samplePR);
assert(issue == sampleIssue);
doSpy();
};

Expand All @@ -104,20 +193,20 @@ describe("Accuser", function() {
.do(workerDo);

accuser.github = {
pullRequests: {
getAll: function(obj) {
issues: {
getForRepo: function(obj) {
return new Promise(function(resolve, reject){
resolve([samplePR]);
resolve([sampleIssue]);
})
}
},
hasNextPage: function() {
return false
}
};
var mock = sinon.mock(accuser.github.pullRequests);
mock.expects("getAll").once().returns(new Promise(function(resolve, reject){
resolve([samplePR]);
var mock = sinon.mock(accuser.github.issues);
mock.expects("getForRepo").once().returns(new Promise(function(resolve, reject){
resolve([sampleIssue]);
}));

accuser.tick()
Expand Down

0 comments on commit 69ca9d9

Please sign in to comment.