update tests

This commit is contained in:
Radek Stepan 2018-06-29 12:30:22 -04:00
parent bc49357334
commit c5f19a0f64
9 changed files with 333 additions and 473 deletions

View File

@ -52,7 +52,7 @@ export default class AddRepoForm extends React.Component {
if (!/^[^\s\/]+\/[^\s\/]+$/.test(val)) return;
const [ owner, name ] = val.split('/');
actions.emit('repo.add', { owner, name });
actions.emit('repos.add', { owner, name });
// Redirect to the dashboard.
App.navigate({ 'to': 'repos' });
}

View File

@ -16,7 +16,7 @@ export default class EditRepos extends React.Component {
}
_onDelete(repo) {
actions.emit('repo.delete', repo);
actions.emit('repos.delete', repo);
}
render() {

View File

@ -95,7 +95,7 @@ class ReposStore extends Store {
}
// Push to the stack unless it exists already.
onRepoAdd(repo) {
onReposAdd(repo) {
if (!_.find(this.get('list'), repo)) {
this.push('list', repo);
}
@ -124,7 +124,7 @@ class ReposStore extends Store {
}
// Search for repos.
onRepoSearch(text) {
onReposSearch(text) {
if (!text || !text.length) return;
// Wait for the user to get resolved.
@ -168,7 +168,7 @@ class ReposStore extends Store {
}
// Delete a repo.
onRepoDelete(repo) {
onReposDelete(repo) {
const i = this.findIndex(repo);
// Delete the repo.
this.del(`list.${i}`);

View File

@ -9,10 +9,12 @@ import config from '../src/config.js';
import json from './fixtures/issues.json';
let repo = {
// TODO we are not fetching issues like this anymore
const repo = {
'owner': 'radekstepan',
'name': 'burnchart',
'milestone': 1
'project': 1
};
describe('issues', () => {

View File

@ -1,13 +0,0 @@
import { assert } from 'chai';
import moment from 'moment';
import json from './fixtures/milestones.json';
describe('milestones', () => {
it('time format', done => {
// ISO 8601 dates are in UTC timezone.
let utc = moment(json[0].created_at).toDate().toUTCString();
assert(utc, 'Sun, 10 Apr 2011 20:09:31 GMT');
done();
});
});

View File

@ -1,292 +1,15 @@
import { assert } from 'chai';
import path from 'path';
import _ from 'lodash';
import { noCallThru } from 'proxyquire'
let proxy = noCallThru();
import moment from 'moment';
let request = {};
let lscache = {
get: () => [],
set: () => {}
};
// import json from './fixtures/milestones.json';
// Proxy the request module.
let lib = path.resolve(__dirname, '../src/js/stores/projectsStore.js');
let projects = proxy(lib, {
lscache, '../modules/github/request.js': request
}).default;
// TODO expand on payload from GraphQL.
describe('projects', () => {
it('initializes empty', done => {
assert.deepEqual(projects.get('list'), []);
done();
});
it('sorts on new milestones', done => {
projects.set({ 'list': [], 'index': [] });
let project = {
'owner': 'radekstepan',
'name': 'burnchart'
};
let milestone = {
'title': '1.0.0',
'stats': {}
};
projects.push('list', project);
projects.addMilestone(project, milestone);
assert.deepEqual(projects.get('index'), [[0, 0]]);
done();
});
it('sort by progress', done => {
projects.set({ 'list': [], 'index': [], 'sortBy': 'progress' });
let project = {
'owner': 'radekstepan',
'name': 'burnchart'
};
let milestone1 = {
'title': '1.0.0',
'stats': {
'progress': {
'points': 5
}
}
};
let milestone2 = {
'title': '2.0.0',
'stats': {
'progress': {
'points': 7
}
}
};
projects.push('list', project);
projects.addMilestone(project, milestone1);
projects.addMilestone(project, milestone2);
assert.deepEqual(projects.get('index'), [[0, 1], [0, 0]]);
done();
});
it('sort by priority', done => {
projects.set({ 'list': [], 'index': [], 'sortBy': 'priority' });
let project = {
'owner': 'radekstepan',
'name': 'burnchart'
};
let milestone1 = {
'title': '1.0.0',
'stats': {
'progress': {
'points': 2,
'time': 1
},
'days': 2
}
};
let milestone2 = {
'title': '2.0.0',
'stats': {
'progress': {
'points': 2,
'time': 1
},
'days': 3
}
};
let milestone3 = {
'title': '3.0.0',
'stats': {
'progress': {
'points': 1,
'time': 2
},
'days': 4
}
};
projects.push('list', project);
projects.addMilestone(project, milestone1);
projects.addMilestone(project, milestone2);
projects.addMilestone(project, milestone3);
assert.deepEqual(projects.get('index'), [[0, 2], [0, 0], [0, 1]]);
done();
});
it('sort by priority defaults', done => {
projects.set({ 'list': [], 'index': [], 'sortBy': 'priority' });
let project = {
'owner': 'radekstepan',
'name': 'burnchart'
};
let milestone1 = {
'title': '1.0.0',
'stats': {
'progress': {
'points': 3
}
}
};
let milestone2 = {
'title': '2.0.0',
'stats': {
'progress': {
'points': 2
}
}
};
let milestone3 = {
'title': '3.0.0',
'stats': {
'progress': {
'points': 1
}
}
};
projects.push('list', project);
projects.addMilestone(project, milestone1);
projects.addMilestone(project, milestone2);
projects.addMilestone(project, milestone3);
assert.deepEqual(projects.get('index'), [[0, 2], [0, 1], [0, 0]]);
done();
});
it('sort by name', done => {
projects.set({ 'list': [], 'index': [], 'sortBy': 'name' });
let project = {
'owner': 'radekstepan',
'name': 'burnchart'
};
let milestone1 = {
'title': 'B',
'stats': {}
};
let milestone2 = {
'title': 'A',
'stats': {}
};
projects.push('list', project);
projects.addMilestone(project, milestone1);
projects.addMilestone(project, milestone2);
assert.deepEqual(projects.get('index'), [[0, 1], [0, 0]]);
done();
});
it('sort by name semver', done => {
projects.set({ 'list': [], 'index': [], 'sortBy': 'name' });
let project = {
'owner': 'radekstepan',
'name': 'burnchart'
};
let milestone1 = {
'title': '1.2.5',
'stats': {}
};
let milestone2 = {
'title': '1.1.x',
'stats': {}
};
let milestone3 = {
'title': '1.1.7',
'stats': {}
};
projects.push('list', project);
projects.addMilestone(project, milestone1);
projects.addMilestone(project, milestone2);
projects.addMilestone(project, milestone3);
assert.deepEqual(projects.get('index'), [[0, 2], [0, 1], [0, 0]]);
done();
});
it('search', done => {
projects.set({ 'list': [
{ 'owner': 'radek', 'name': 'A' }
], 'index': [], 'sortBy': 'name', 'user': null });
// Skip search.
request.repos = (user, owner, cb) => assert(false);
projects.onProjectsSearch();
// Search on text.
request.repos = (user, owner, cb) => assert(owner == undefined);
projects.onProjectsSearch('radek');
// Search on owner.
request.repos = (user, owner, cb) => assert(owner == 'radek');
projects.onProjectsSearch('radek/project');
request.repos = (user, owner, cb) => {
cb(null, [
{ 'has_issues': true, 'owner': { 'login': 'Radek' }, 'name': 'A', 'full_name': 'Radek/A' }, // exists
{ 'has_issues': true, 'owner': { 'login': 'radek' }, 'name': 'aA', 'full_name': 'radek/aA' }, // ok
{ 'has_issues': true, 'owner': { 'login': 'a' }, 'name': 'A', 'full_name': 'a/A' }, // wrong owner
{ 'has_issues': false, 'owner': { 'login': 'radek' }, 'name': 'aaa', 'full_name': 'radek/aaa' } // no issues
]);
};
projects.onProjectsSearch('radek/a');
assert.deepEqual(projects.get('suggestions'), [ 'radek/aA' ]);
done();
});
it('delete', done => {
let a = { 'owner': 'company', 'name': 'netflix', 'milestones': [ { 'title': 'A', 'stats': {} } ] };
let b = { 'owner': 'company', 'name': 'space-x' };
let c = { 'owner': 'company', 'name': 'tesla-m', 'milestones': [ { 'title': 'C', 'stats': {} } ] };
projects.set({
'list': [ a, b, c ],
'index': [ [ 0, 0 ], [ 1, 0 ], [ 2, 0 ] ],
'sortBy': 'name',
'user': null
});
projects.onProjectsDelete(b);
assert.deepEqual(projects.get('list'), [ a, c ]);
assert.deepEqual(projects.get('index'), [ [ 0, 0 ], [ 1, 0 ] ]);
done();
});
// Issue #116.
it('add milestone (project behind the scenes)', done => {
projects.set({ 'list': [], 'index': [], 'sortBy': 'progress' });
let p = { 'name': 'zcash', 'owner': 'zcash' };
let m = { 'issues': {
'closed': { 'list': [], 'size': 0 },
'open': { 'list': [], 'size': 0 }
}};
projects.addMilestone(p, m);
assert.deepEqual(projects.get('list'), [
_.extend(p, { 'milestones': [ m ] })
]);
it('time format', done => {
// ISO 8601 dates are in UTC timezone.
const utc = moment(json[0].created_at).toDate().toUTCString();
assert(utc, 'Sun, 10 Apr 2011 20:09:31 GMT');
done();
});
});

292
test/repos.js Normal file
View File

@ -0,0 +1,292 @@
import { assert } from 'chai';
import path from 'path';
import _ from 'lodash';
import { noCallThru } from 'proxyquire'
let proxy = noCallThru();
let request = {};
let lscache = {
get: () => [],
set: () => {}
};
// Proxy the request module.
let lib = path.resolve(__dirname, '../src/js/stores/projectsStore.js');
const repos = proxy(lib, {
lscache, '../modules/github/request.js': request
}).default;
describe('repos', () => {
it('initializes empty', done => {
assert.deepEqual(repos.get('list'), []);
done();
});
it('sorts on new projects', done => {
repos.set({ 'list': [], 'index': [] });
const repo = {
'owner': 'radekstepan',
'name': 'burnchart'
};
const project = {
'title': '1.0.0',
'stats': {}
};
repos.push('list', repo);
repos.addProject(repo, project);
assert.deepEqual(repos.get('index'), [[0, 0]]);
done();
});
it('sort by progress', done => {
repos.set({ 'list': [], 'index': [], 'sortBy': 'progress' });
const repo = {
'owner': 'radekstepan',
'name': 'burnchart'
};
const project1 = {
'title': '1.0.0',
'stats': {
'progress': {
'points': 5
}
}
};
const project2 = {
'title': '2.0.0',
'stats': {
'progress': {
'points': 7
}
}
};
repos.push('list', repo);
repos.addProject(repo, project1);
repos.addProject(repo, project2);
assert.deepEqual(repos.get('index'), [[0, 1], [0, 0]]);
done();
});
it('sort by priority', done => {
repos.set({ 'list': [], 'index': [], 'sortBy': 'priority' });
const repo = {
'owner': 'radekstepan',
'name': 'burnchart'
};
const project1 = {
'title': '1.0.0',
'stats': {
'progress': {
'points': 2,
'time': 1
},
'days': 2
}
};
const project2 = {
'title': '2.0.0',
'stats': {
'progress': {
'points': 2,
'time': 1
},
'days': 3
}
};
const project3 = {
'title': '3.0.0',
'stats': {
'progress': {
'points': 1,
'time': 2
},
'days': 4
}
};
repos.push('list', repo);
repos.addProject(repo, project1);
repos.addProject(repo, project2);
repos.addProject(repo, project3);
assert.deepEqual(repos.get('index'), [[0, 2], [0, 0], [0, 1]]);
done();
});
it('sort by priority defaults', done => {
repos.set({ 'list': [], 'index': [], 'sortBy': 'priority' });
const repo = {
'owner': 'radekstepan',
'name': 'burnchart'
};
const projet1 = {
'title': '1.0.0',
'stats': {
'progress': {
'points': 3
}
}
};
const project2 = {
'title': '2.0.0',
'stats': {
'progress': {
'points': 2
}
}
};
const project3 = {
'title': '3.0.0',
'stats': {
'progress': {
'points': 1
}
}
};
repos.push('list', repo);
repos.addProject(repo, project1);
repos.addProject(repo, project2);
repos.addProject(repo, project3);
assert.deepEqual(repos.get('index'), [[0, 2], [0, 1], [0, 0]]);
done();
});
it('sort by name', done => {
repos.set({ 'list': [], 'index': [], 'sortBy': 'name' });
const repo = {
'owner': 'radekstepan',
'name': 'burnchart'
};
const project1 = {
'title': 'B',
'stats': {}
};
const project2 = {
'title': 'A',
'stats': {}
};
repos.push('list', repo);
repos.addProject(repo, project1);
repos.addProject(repo, project2);
assert.deepEqual(repos.get('index'), [[0, 1], [0, 0]]);
done();
});
it('sort by name semver', done => {
repos.set({ 'list': [], 'index': [], 'sortBy': 'name' });
const repo = {
'owner': 'radekstepan',
'name': 'burnchart'
};
const project1 = {
'title': '1.2.5',
'stats': {}
};
const project2 = {
'title': '1.1.x',
'stats': {}
};
const project3 = {
'title': '1.1.7',
'stats': {}
};
repos.push('list', repo);
repos.addProject(repo, project1);
repos.addProject(repo, project2);
repos.addProject(repo, project3);
assert.deepEqual(repos.get('index'), [[0, 2], [0, 1], [0, 0]]);
done();
});
it('search', done => {
repos.set({ 'list': [
{ 'owner': 'radek', 'name': 'A' }
], 'index': [], 'sortBy': 'name', 'user': null });
// Skip search.
request.repos = (user, owner, cb) => assert(false);
repos.onReposSearch();
// Search on text.
request.repos = (user, owner, cb) => assert(owner == undefined);
repos.onReposSearch('radek');
// Search on owner.
request.repos = (user, owner, cb) => assert(owner == 'radek');
repos.onReposSearch('radek/project');
request.repos = (user, owner, cb) => {
cb(null, [
{ 'has_issues': true, 'owner': { 'login': 'Radek' }, 'name': 'A', 'full_name': 'Radek/A' }, // exists
{ 'has_issues': true, 'owner': { 'login': 'radek' }, 'name': 'aA', 'full_name': 'radek/aA' }, // ok
{ 'has_issues': true, 'owner': { 'login': 'a' }, 'name': 'A', 'full_name': 'a/A' }, // wrong owner
{ 'has_issues': false, 'owner': { 'login': 'radek' }, 'name': 'aaa', 'full_name': 'radek/aaa' } // no issues
]);
};
projects.onReposSearch('radek/a');
assert.deepEqual(repos.get('suggestions'), [ 'radek/aA' ]);
done();
});
it('delete', done => {
let a = { 'owner': 'company', 'name': 'netflix', 'projects': [ { 'title': 'A', 'stats': {} } ] };
let b = { 'owner': 'company', 'name': 'space-x' };
let c = { 'owner': 'company', 'name': 'tesla-m', 'projects': [ { 'title': 'C', 'stats': {} } ] };
repos.set({
'list': [ a, b, c ],
'index': [ [ 0, 0 ], [ 1, 0 ], [ 2, 0 ] ],
'sortBy': 'name',
'user': null
});
repos.onReposDelete(b);
assert.deepEqual(repos.get('list'), [ a, c ]);
assert.deepEqual(repos.get('index'), [ [ 0, 0 ], [ 1, 0 ] ]);
done();
});
// Issue #116.
it('add project (repo behind the scenes)', done => {
repos.set({ 'list': [], 'index': [], 'sortBy': 'progress' });
let r = { 'name': 'zcash', 'owner': 'zcash' };
let p = { 'issues': {
'closed': { 'list': [], 'size': 0 },
'open': { 'list': [], 'size': 0 }
}};
repos.addProject(r, p);
assert.deepEqual(repos.get('list'), [
_.extend(r, { 'projects': [ p ] })
]);
done();
});
});

View File

@ -37,150 +37,6 @@ let lib = path.resolve(__dirname, '../src/js/modules/github/request.js');
let request = proxy(lib, { superagent }).default;
describe('request', () => {
it('all milestones (ok)', done => {
superagent.response = {
'statusType': 2,
'error': false,
'body': [ null ]
};
let owner = 'radekstepan';
let name = 'burnchart';
request.allMilestones({}, { owner, name }, (err, data) => {
assert.isNull(err);
assert.deepEqual(superagent.params, {
'uri': 'https://api.github.com/repos/radekstepan/burnchart/milestones?state=open&sort=due_date&direction=asc',
'Content-Type': 'application/json',
'Accept': 'application/vnd.github.v3'
});
assert.deepEqual(data, [null]);
done();
});
});
it('all milestones (403)', done => {
superagent.response = {
'statusType': 4,
'error': false,
'body': {
'message': 'API rate limit exceeded'
}
};
let owner = 'radekstepan';
let name = 'burnchart';
let milestone = 0;
request.oneMilestone({}, { owner, name, milestone }, (err) => {
assert(err, 'Error');
done();
});
});
it('one milestone (ok)', done => {
superagent.response = {
'statusType': 2,
'error': false,
'body': [ null ]
};
let owner = 'radekstepan';
let name = 'burnchart';
let milestone = 1;
request.oneMilestone({}, { owner, name, milestone }, (err, data) => {
assert.isNull(err);
assert.deepEqual(superagent.params, {
'uri': 'https://api.github.com/repos/radekstepan/burnchart/milestones/1?state=open&sort=due_date&direction=asc',
'Content-Type': 'application/json',
'Accept': 'application/vnd.github.v3'
});
assert.deepEqual(data, [null]);
done();
});
});
it('one milestone (404)', done => {
superagent.response = {
'statusType': 4,
'error': Error("cannot GET undefined (404)"),
'body': {
'documentation_url': "http://developer.github.com/v3",
'message': "Not Found"
}
};
let owner = 'radekstepan';
let name = 'burnchart';
let milestone = 0;
request.oneMilestone({}, { owner, name, milestone }, (err) => {
assert(err, 'Not Found');
done();
});
});
it('one milestone (500)', done => {
superagent.response = {
'statusType': 5,
'error': Error("Error"),
'body': null
};
let owner = 'radekstepan';
let name = 'burnchart';
let milestone = 0;
request.oneMilestone({}, { owner, name, milestone }, (err) => {
assert(err, 'Error');
done();
});
});
it('all issues (ok)', done => {
superagent.response = {
'statusType': 2,
'error': false,
'body': [ null ]
};
let owner = 'radekstepan';
let name = 'burnchart';
let milestone = 0;
request.allIssues({}, { owner, name, milestone }, {}, (err, data) => {
assert.isNull(err);
assert.deepEqual(superagent.params, {
'uri': 'https://api.github.com/repos/radekstepan/burnchart/issues?milestone=0&per_page=100',
'Content-Type': 'application/json',
'Accept': 'application/vnd.github.v3'
});
assert.deepEqual(data, [ null ]);
done();
});
});
it('timeout', done => {
opa.set(config, 'request.timeout', 10);
superagent.timeout = 20;
superagent.response = {
'statusType': 2,
'error': false,
'body': [ null ]
};
let owner = 'radekstepan';
let name = 'burnchart';
let milestone = 0;
request.allIssues({}, { owner, name, milestone }, {}, (err) => {
assert(err, 'Request has timed out');
done();
});
});
it('use tokens', done => {
superagent.response = {};

View File

@ -5,8 +5,8 @@ import moment from 'moment';
import stats from '../src/js/modules/stats.js';
export default {
'stats - is milestone empty, on time and overdue? no due date': (done) => {
let milestone = {
'stats - is project empty, on time and overdue? no due date': (done) => {
const project = {
'issues': {
'open': {
'size': 0
@ -17,7 +17,7 @@ export default {
}
};
let { isEmpty, isOverdue, isOnTime } = stats(milestone);
let { isEmpty, isOverdue, isOnTime } = stats(project);
assert.isTrue(isEmpty);
assert.isFalse(isOverdue);
@ -27,7 +27,7 @@ export default {
},
'stats - has no progress been made?': (done) => {
let milestone = {
const project = {
'issues': {
'open': {
'size': 1
@ -38,13 +38,13 @@ export default {
}
};
assert.isTrue(stats(milestone).isEmpty);
assert.isTrue(stats(project).isEmpty);
done();
},
'stats - is milestone done?': (done) => {
let milestone = {
'stats - is project done?': (done) => {
const project = {
'issues': {
'open': {
'size': 0
@ -55,14 +55,14 @@ export default {
}
};
let { isDone } = stats(milestone);
let { isDone } = stats(project);
assert.isTrue(isDone);
done();
},
'stats - is milestone overdue? has due date, yes': (done) => {
let milestone = {
'stats - is project overdue? has due date, yes': (done) => {
const project = {
'created_at': '2011-04-02T00:00:00.000Z',
'due_on': '2011-04-03T00:00:00.000Z',
'issues': {
@ -75,15 +75,15 @@ export default {
}
};
let { isOverdue } = stats(milestone);
let { isOverdue } = stats(project);
assert.isTrue(isOverdue);
done();
},
'stats - is milestone on time? has due date, yes': (done) => {
'stats - is project on time? has due date, yes': (done) => {
let now = moment.utc();
let milestone = {
const project = {
'created_at': now.subtract(1, 'week').toISOString(),
'due_on': now.add(1, 'month').toISOString(),
'issues': {
@ -96,15 +96,15 @@ export default {
}
};
let { isOnTime } = stats(milestone);
let { isOnTime } = stats(project);
assert.isTrue(isOnTime);
done();
},
'stats - is milestone on time? has due date, no': (done) => {
'stats - is project on time? has due date, no': (done) => {
let now = moment.utc();
let milestone = {
const project = {
'created_at': now.subtract(2, 'week').toISOString(),
'due_on': now.add(1, 'day').toISOString(),
'issues': {
@ -117,15 +117,15 @@ export default {
}
};
let { isOnTime } = stats(milestone);
let { isOnTime } = stats(project);
assert.isFalse(isOnTime);
done();
},
'stats - is milestone on time? has due date, all issues closed': (done) => {
'stats - is prokect on time? has due date, all issues closed': (done) => {
let now = moment.utc();
let milestone = {
const project = {
'created_at': now.subtract(2, 'week').toISOString(),
'due_on': now.subtract(1, 'week').toISOString(),
'issues': {
@ -138,19 +138,19 @@ export default {
}
};
let { isOnTime } = stats(milestone);
let { isOnTime } = stats(project);
assert.isTrue(isOnTime);
done();
},
// Make sure milestone hasn't been created after closing an issue; #100.
'stats - milestone created_at': (done) => {
// Make sure project hasn't been created after closing an issue; #100.
'stats - project created_at': (done) => {
let now = moment.utc();
let a = now.clone().subtract(1, 'week').toISOString(),
b = now.clone().subtract(1, 'day').toISOString()
let milestone = {
const project = {
'created_at': b,
'issues': {
'open': {
@ -164,9 +164,9 @@ export default {
};
// By ref.
stats(milestone);
stats(project);
assert.equal(milestone.created_at, a);
assert.equal(project.created_at, a);
done();
}