2021-03-02 00:05:53 +08:00
|
|
|
import {Issue} from '../src/classes/issue';
|
|
|
|
import {IIssuesProcessorOptions} from '../src/interfaces/issues-processor-options';
|
2021-03-02 04:34:35 +08:00
|
|
|
import {IssuesProcessorMock} from './classes/issues-processor-mock';
|
2021-03-02 00:05:53 +08:00
|
|
|
import {DefaultProcessorOptions} from './constants/default-processor-options';
|
|
|
|
import {generateIssue} from './functions/generate-issue';
|
|
|
|
|
|
|
|
describe('any-of-labels option', () => {
|
|
|
|
test('should do nothing when not set', async () => {
|
|
|
|
const sut = new IssuesProcessorBuilder()
|
|
|
|
.emptyAnyOfLabels()
|
|
|
|
.issues([{labels: [{name: 'some-label'}]}])
|
|
|
|
.build();
|
|
|
|
|
|
|
|
await sut.processIssues();
|
|
|
|
|
|
|
|
expect(sut.staleIssues).toHaveLength(1);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('should skip it when none of the issue labels match', async () => {
|
|
|
|
const sut = new IssuesProcessorBuilder()
|
|
|
|
.anyOfLabels('skip-this-issue,and-this-one')
|
|
|
|
.issues([{labels: [{name: 'some-label'}, {name: 'some-other-label'}]}])
|
|
|
|
.build();
|
|
|
|
|
|
|
|
await sut.processIssues();
|
|
|
|
|
|
|
|
expect(sut.staleIssues).toHaveLength(0);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('should skip it when the issue has no labels', async () => {
|
|
|
|
const sut = new IssuesProcessorBuilder()
|
|
|
|
.anyOfLabels('skip-this-issue,and-this-one')
|
|
|
|
.issues([{labels: []}])
|
|
|
|
.build();
|
|
|
|
|
|
|
|
await sut.processIssues();
|
|
|
|
|
|
|
|
expect(sut.staleIssues).toHaveLength(0);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('should process it when one of the issue labels match', async () => {
|
|
|
|
const sut = new IssuesProcessorBuilder()
|
|
|
|
.anyOfLabels('skip-this-issue,and-this-one')
|
|
|
|
.issues([{labels: [{name: 'some-label'}, {name: 'skip-this-issue'}]}])
|
|
|
|
.build();
|
|
|
|
|
|
|
|
await sut.processIssues();
|
|
|
|
|
|
|
|
expect(sut.staleIssues).toHaveLength(1);
|
|
|
|
});
|
|
|
|
|
|
|
|
test('should process it when all the issue labels match', async () => {
|
|
|
|
const sut = new IssuesProcessorBuilder()
|
|
|
|
.anyOfLabels('skip-this-issue,and-this-one')
|
|
|
|
.issues([{labels: [{name: 'and-this-one'}, {name: 'skip-this-issue'}]}])
|
|
|
|
.build();
|
|
|
|
|
|
|
|
await sut.processIssues();
|
|
|
|
|
|
|
|
expect(sut.staleIssues).toHaveLength(1);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
class IssuesProcessorBuilder {
|
|
|
|
private _options: IIssuesProcessorOptions;
|
|
|
|
private _issues: Issue[];
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
this._options = {...DefaultProcessorOptions};
|
|
|
|
this._issues = [];
|
|
|
|
}
|
|
|
|
|
|
|
|
anyOfLabels(labels: string): IssuesProcessorBuilder {
|
|
|
|
this._options.anyOfLabels = labels;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
emptyAnyOfLabels(): IssuesProcessorBuilder {
|
|
|
|
return this.anyOfLabels('');
|
|
|
|
}
|
|
|
|
|
|
|
|
issues(issues: Partial<Issue>[]): IssuesProcessorBuilder {
|
|
|
|
this._issues = issues.map(
|
|
|
|
(issue, index): Issue =>
|
|
|
|
generateIssue(
|
|
|
|
this._options,
|
|
|
|
index,
|
|
|
|
issue.title || 'Issue title',
|
|
|
|
issue.updated_at || '2000-01-01T00:00:00Z', // we only care about stale/expired issues here
|
|
|
|
issue.created_at || '2000-01-01T00:00:00Z',
|
|
|
|
issue.isPullRequest || false,
|
|
|
|
issue.labels ? issue.labels.map(label => label.name) : []
|
|
|
|
)
|
|
|
|
);
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2021-03-02 04:34:35 +08:00
|
|
|
build(): IssuesProcessorMock {
|
|
|
|
return new IssuesProcessorMock(
|
2021-03-02 00:05:53 +08:00
|
|
|
this._options,
|
|
|
|
async () => 'abot',
|
|
|
|
async p => (p === 1 ? this._issues : []),
|
|
|
|
async () => [],
|
|
|
|
async () => new Date().toDateString()
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|