node-recurring
Version:
A super simple JavaScript library for defining recurring schedules and calculating occurrences for them
595 lines (520 loc) • 17.9 kB
JavaScript
'use strict';
var assert = require('chai').assert;
var recurring = require('./../lib/index');
describe('lib/recurring', function () {
describe('recurring daily', function () {
it('given options for daily recurring every 2 days, result should be as expected', function () {
let result = recurring({
interval: 'd',
every: 2,
start: '2018-01-11',
end: '2018-02-01'
});
let expectedResult = {
results: [
'2018-01-11',
'2018-01-13',
'2018-01-15',
'2018-01-17',
'2018-01-19',
'2018-01-21',
'2018-01-23',
'2018-01-25',
'2018-01-27',
'2018-01-29',
'2018-01-31'
],
iterations: 11,
info: {
lastBaseOccurrence: '2018-01-31'
}
};
assert.deepEqual(result, expectedResult);
});
it('given options for daily recurring every 2 days ignoring weekends, result should be as expected', function () {
let result = recurring({
interval: 'd',
every: 2,
start: '2018-01-11',
end: '2018-02-01',
options: {
skipWeekend: true
}
});
let expectedResult = {
results: [
'2018-01-11',
'2018-01-15',
'2018-01-17',
'2018-01-19',
'2018-01-23',
'2018-01-25',
'2018-01-29',
'2018-01-31'
],
iterations: 8,
info: {
lastBaseOccurrence: '2018-01-31'
}
};
assert.deepEqual(result, expectedResult);
});
it('given options for daily recurring every 2 days ignoring weekends and with limit, result should be as expected', function () {
let result = recurring({
interval: 'd',
every: 2,
start: '2018-01-11',
limit: 3,
options: {
skipWeekend: true
}
});
let expectedResult = {
results: [
'2018-01-11',
'2018-01-15',
'2018-01-17'
],
iterations: 3,
info: {
lastBaseOccurrence: '2018-01-17'
}
};
assert.deepEqual(result, expectedResult);
});
it('given options for daily recurring every 2 days ignoring weekends and with iterations, result should be as expected', function () {
let result = recurring({
interval: 'd',
every: 2,
start: '2018-01-11',
iterations: 3,
options: {
skipWeekend: true
}
});
let expectedResult = {
results: [
'2018-01-11',
'2018-01-15',
'2018-01-17'
],
iterations: 3,
info: {
lastBaseOccurrence: '2018-01-17'
}
};
assert.deepEqual(result, expectedResult);
});
it('given options for daily recurring every 3 days ignoring weekends, result should be as expected', function () {
let result = recurring({
interval: 'd',
every: 3,
start: '2018-01-11',
end: '2018-02-01',
options: {
skipWeekend: true
}
});
let expectedResult = {
results: [
'2018-01-11',
'2018-01-16',
'2018-01-19',
'2018-01-24',
'2018-01-29',
'2018-02-01'
],
iterations: 6,
info: {
lastBaseOccurrence: '2018-02-01'
}
};
assert.deepEqual(result, expectedResult);
});
it('given options for daily recurring every 4 days ignoring weekends, result should be as expected', function () {
let result = recurring({
interval: 'd',
every: 4,
start: '2018-01-11',
end: '2018-02-01',
options: {
skipWeekend: true
}
});
let expectedResult = {
results: [
'2018-01-11',
'2018-01-17',
'2018-01-23',
'2018-01-29'
],
iterations: 4,
info: {
lastBaseOccurrence: '2018-01-29'
}
};
assert.deepEqual(result, expectedResult);
});
it('given options for daily recurring every 5 days ignoring weekends, result should be as expected', function () {
let result = recurring({
interval: 'd',
every: 5,
start: '2018-01-11',
end: '2018-02-01',
options: {
skipWeekend: true
}
});
let expectedResult = {
results: [
'2018-01-11',
'2018-01-18',
'2018-01-25',
'2018-02-01'
],
iterations: 4,
info: {
lastBaseOccurrence: '2018-02-01'
}
};
assert.deepEqual(result, expectedResult);
});
it('given options for daily recurring every 6 days ignoring weekends, result should be as expected', function () {
let result = recurring({
interval: 'd',
every: 6,
start: '2018-01-11',
end: '2018-02-01',
options: {
skipWeekend: true
}
});
let expectedResult = {
results: [
'2018-01-11',
'2018-01-19',
'2018-01-29'
],
iterations: 3,
info: {
lastBaseOccurrence: '2018-01-29'
}
};
assert.deepEqual(result, expectedResult);
});
it('given options for daily recurring every 45 days ignoring weekends, result should be as expected', function () {
let result = recurring({
interval: 'd',
every: 45,
start: '2018-01-11',
end: '2018-12-01',
options: {
skipWeekend: true
}
});
let expectedResult = {
results: [
'2018-01-11',
'2018-03-15',
'2018-05-17',
'2018-07-19',
'2018-09-20',
'2018-11-22'
],
iterations: 6,
info: {
lastBaseOccurrence: '2018-11-22'
}
};
assert.deepEqual(result, expectedResult);
});
});
describe('recurring weekly', function () {
it('given options for weekly recurring every 3 months, result should be as expected', function () {
let result = recurring({
interval: 'w',
every: 3,
start: '2018-01-11',
end: '2019-02-01'
});
let expectedResult = {
results: [
'2018-01-11',
'2018-02-01',
'2018-02-22',
'2018-03-15',
'2018-04-05',
'2018-04-26',
'2018-05-17',
'2018-06-07',
'2018-06-28',
'2018-07-19',
'2018-08-09',
'2018-08-30',
'2018-09-20',
'2018-10-11',
'2018-11-01',
'2018-11-22',
'2018-12-13',
'2019-01-03',
'2019-01-24'
],
iterations: 19,
info: {
lastBaseOccurrence: '2019-01-24'
}
};
assert.deepEqual(result, expectedResult);
});
it('given options for weekly recurring every 2 weeks on wednesday, result should be as expected', function () {
let result = recurring({
interval: 'w',
weekday: 3,
every: 2,
start: '2018-01-11',
end: '2018-05-01'
});
let expectedResult = {
results: [
'2018-01-17',
'2018-01-31',
'2018-02-14',
'2018-02-28',
'2018-03-14',
'2018-03-28',
'2018-04-11',
'2018-04-25'
],
iterations: 8,
info: {
lastBaseOccurrence: '2018-04-25'
}
};
assert.deepEqual(result, expectedResult);
});
it('given options for weekly recurrence every 1 weeks on sunday result should be as expected', function () {
let result = recurring({
interval: 'w',
weekday: 0,
every: 1,
start: '2023-08-28',
end: '2023-12-31'
});
let expectedResult = {
results: [
"2023-09-03",
"2023-09-10",
"2023-09-17",
"2023-09-24",
"2023-10-01",
"2023-10-08",
"2023-10-15",
"2023-10-22",
"2023-10-29",
"2023-11-05",
"2023-11-12",
"2023-11-19",
"2023-11-26",
"2023-12-03",
"2023-12-10",
"2023-12-17",
"2023-12-24",
"2023-12-31"
],
iterations: 18,
info: {
lastBaseOccurrence: '2023-12-31'
}
};
assert.deepEqual(result, expectedResult);
});
});
describe('recurring monthly', function () {
it('given options for monthly recurring every 4 months, result should be as expected', function () {
let result = recurring({
interval: 'M',
every: 4,
start: '2018-01-11',
end: '2020-02-01'
});
let expectedResult = {
results: [
'2018-01-11',
'2018-05-11',
'2018-09-11',
'2019-01-11',
'2019-05-11',
'2019-09-11',
'2020-01-11'
],
iterations: 7,
info: {
lastBaseOccurrence: '2020-01-11'
}
};
assert.deepEqual(result, expectedResult);
});
it('given options for monthly recurring every 3 months on day 15, result should be as expected', function () {
let result = recurring({
interval: 'M',
every: 3,
dayOfMonth: 15,
start: '2018-01-11',
end: '2020-02-01'
});
let expectedResult = {
results: [
'2018-01-15',
'2018-04-15',
'2018-07-15',
'2018-10-15',
'2019-01-15',
'2019-04-15',
'2019-07-15',
'2019-10-15',
'2020-01-15'
],
iterations: 9,
info: {
lastBaseOccurrence: '2020-01-15'
}
};
assert.deepEqual(result, expectedResult);
});
it('given options for monthly recurring every 1 months on day 30 (including February), result should be as expected', function () {
let result = recurring({
interval: 'M',
every: 1,
dayOfMonth: 30,
start: '2018-01-11',
end: '2018-05-01'
});
let expectedResult = {
results: [
'2018-01-30',
'2018-03-30',
'2018-04-30',
],
iterations: 4,
info: {
lastBaseOccurrence: '2018-04-28'
}
};
assert.deepEqual(result, expectedResult);
});
it('given options for monthly recurring every 1 months on day 30 (including February on a leap year), result should be as expected', function () {
let result = recurring({
interval: 'M',
every: 1,
dayOfMonth: 30,
start: '2020-01-11',
end: '2020-05-01'
});
let expectedResult = {
results: [
'2020-01-30',
'2020-03-30',
'2020-04-30',
],
iterations: 4,
info: {
lastBaseOccurrence: '2020-04-29'
}
};
assert.deepEqual(result, expectedResult);
});
it('given options for monthly recurring every 1 month on day 31 (including February), result should be as expected', function () {
let result = recurring({
interval: 'M',
every: 1,
dayOfMonth: 31,
start: '2019-12-23',
end: '2020-05-23'
});
let expectedResult = {
results: [
'2019-12-31',
'2020-01-31',
'2020-03-31'
],
iterations: 5,
info: {
lastBaseOccurrence: '2020-04-29'
}
};
assert.deepEqual(result, expectedResult)
});
it('given options for monthly recurring every 1 month on day 30 (including February on a leap year) skiping weekend, result should be as expected', function () {
let result = recurring({
interval: 'M',
every: 1,
dayOfMonth: 30,
start: '2019-12-23',
end: '2020-06-30',
options: {
skipWeekend: true
}
});
let expectedResult = {
results: [
'2019-12-30',
'2020-01-30',
'2020-03-30',
'2020-04-30',
'2020-06-01',
'2020-06-30'
],
iterations: 7,
info: {
lastBaseOccurrence: '2020-06-29'
}
};
assert.deepEqual(result, expectedResult)
});
it('given options for monthly recurring every 1 month on day 31 (including February) skip weekend, result should be as expected', function () {
let result = recurring({
interval: 'M',
every: 1,
dayOfMonth: 31,
start: '2019-12-23',
end: '2020-10-23',
options: {
skipWeekend: true
}
});
let expectedResult = {
results: [
'2019-12-31',
'2020-01-31',
'2020-03-31',
'2020-06-01',
'2020-07-31',
'2020-08-31'
],
iterations: 10,
info: {
lastBaseOccurrence: '2020-09-29'
}
};
assert.deepEqual(result, expectedResult)
});
});
describe('recurring yearly', function () {
it('given options for yearly recurring every 1 year, result should be as expected', function () {
let result = recurring({
interval: 'y',
every: 1,
start: '2018-01-11',
end: '2021-02-01',
});
let expectedResult = {
results: ['2018-01-11', '2019-01-11', '2020-01-11', '2021-01-11'],
iterations: 4,
info: {
lastBaseOccurrence: '2021-01-11'
}
};
assert.deepEqual(result, expectedResult);
});
});
});