From 5d56016f2ae4e9d047ad91edcb6e2c9e8c2d0930 Mon Sep 17 00:00:00 2001 From: Marc Schneider Date: Sun, 17 Jan 2021 19:19:52 +0100 Subject: [PATCH 1/5] fix: issue #74 use local timezone --- src/index.js | 2 ++ test/test.js | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/index.js b/src/index.js index e3c0473..7ea00d6 100644 --- a/src/index.js +++ b/src/index.js @@ -20,6 +20,8 @@ const { const buildJob = require('./job-builder'); const validateJob = require('./job-validator'); +later.date.localTime(); + // bthreads requires us to do this for web workers (see bthreads docs for insight) threads.Buffer = Buffer; diff --git a/test/test.js b/test/test.js index fc4e00b..90e6aec 100644 --- a/test/test.js +++ b/test/test.js @@ -289,6 +289,41 @@ test('fails if cron pattern is invalid', (t) => { ); }); +test.serial('job created with cron string is using local timezone', (t) => { + t.plan(1); + const bree = new Bree({ + root, + jobs: [{ name: 'basic', cron: '0 18 * * *' }] + }); + + const clock = FakeTimers.install({ now: Date.now() }); + bree.start('basic'); + bree.on('worker created', () => { + const now = new Date(clock.now); + t.is(now.getHours(), 18); + }); + clock.next(); + clock.uninstall(); +}); + +test.serial('job created with human interval is using local timezone', (t) => { + t.plan(2); + const bree = new Bree({ + root, + jobs: [{ name: 'basic', interval: 'at 13:26' }] + }); + + const clock = FakeTimers.install({ now: Date.now() }); + bree.start('basic'); + bree.on('worker created', () => { + const now = new Date(clock.now); + t.is(now.getHours(), 13); + t.is(now.getMinutes(), 26); + }); + clock.next(); + clock.uninstall(); +}); + test('fails if closeWorkersAfterMs is <= 0 or infinite', (t) => { t.throws( () => From 6cb24bd7144f462d5dd031374c9dab6a7f884547 Mon Sep 17 00:00:00 2001 From: Marc Schneider Date: Tue, 19 Jan 2021 01:10:51 +0100 Subject: [PATCH 2/5] fix: updated travisCI config: use Focal dist and include node 14 --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 7ac848b..7cfce2b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,9 @@ +dist: focal language: node_js node_js: - 10 - 12 + - 14 script: - npm run test-coverage after_success: From c669884ab42b0f7b5565d57872c2612aedfefa13 Mon Sep 17 00:00:00 2001 From: Marc Schneider Date: Tue, 19 Jan 2021 01:24:56 +0100 Subject: [PATCH 3/5] fix: reverted travisCI config and refined test --- .travis.yml | 2 -- test/jobs/infinite200.js | 5 +++++ test/test.js | 10 +++++----- 3 files changed, 10 insertions(+), 7 deletions(-) create mode 100644 test/jobs/infinite200.js diff --git a/.travis.yml b/.travis.yml index 7cfce2b..7ac848b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,7 @@ -dist: focal language: node_js node_js: - 10 - 12 - - 14 script: - npm run test-coverage after_success: diff --git a/test/jobs/infinite200.js b/test/jobs/infinite200.js new file mode 100644 index 0000000..b5d0513 --- /dev/null +++ b/test/jobs/infinite200.js @@ -0,0 +1,5 @@ +setInterval(() => { + console.log('hello from infinite200 job'); + // eslint-disable-next-line unicorn/no-process-exit + return process.exit(0); +}, 200); diff --git a/test/test.js b/test/test.js index 90e6aec..571b4fd 100644 --- a/test/test.js +++ b/test/test.js @@ -468,17 +468,17 @@ test.serial('run > job terminates after set time', async (t) => { const bree = new Bree({ root, - jobs: [{ name: 'infinite', closeWorkerAfterMs: 50 }], + jobs: [{ name: 'infinite200', closeWorkerAfterMs: 50 }], logger }); - bree.run('infinite'); - t.true(typeof bree.closeWorkerAfterMs.infinite === 'object'); + bree.run('infinite200'); + t.true(typeof bree.closeWorkerAfterMs.infinite200 === 'object'); await delay(1); await new Promise((resolve, reject) => { - bree.workers.infinite.on('error', reject); - bree.workers.infinite.on('exit', (code) => { + bree.workers.infinite200.on('error', reject); + bree.workers.infinite200.on('exit', (code) => { t.true(code === 1); resolve(); }); From b6b96a5399c9055f709de38cfec3c91095fa8e79 Mon Sep 17 00:00:00 2001 From: Marc Schneider Date: Tue, 19 Jan 2021 01:33:11 +0100 Subject: [PATCH 4/5] fix: refined test --- test/jobs/infinite200.js | 5 ----- test/test.js | 14 +++++++------- 2 files changed, 7 insertions(+), 12 deletions(-) delete mode 100644 test/jobs/infinite200.js diff --git a/test/jobs/infinite200.js b/test/jobs/infinite200.js deleted file mode 100644 index b5d0513..0000000 --- a/test/jobs/infinite200.js +++ /dev/null @@ -1,5 +0,0 @@ -setInterval(() => { - console.log('hello from infinite200 job'); - // eslint-disable-next-line unicorn/no-process-exit - return process.exit(0); -}, 200); diff --git a/test/test.js b/test/test.js index 571b4fd..d73e5ed 100644 --- a/test/test.js +++ b/test/test.js @@ -468,18 +468,18 @@ test.serial('run > job terminates after set time', async (t) => { const bree = new Bree({ root, - jobs: [{ name: 'infinite200', closeWorkerAfterMs: 50 }], + jobs: [{ name: 'infinite', closeWorkerAfterMs: 50 }], logger }); - bree.run('infinite200'); - t.true(typeof bree.closeWorkerAfterMs.infinite200 === 'object'); + bree.run('infinite'); + t.true(typeof bree.closeWorkerAfterMs.infinite === 'object'); await delay(1); await new Promise((resolve, reject) => { - bree.workers.infinite200.on('error', reject); - bree.workers.infinite200.on('exit', (code) => { - t.true(code === 1); + bree.workers.infinite.on('error', reject); + bree.workers.infinite.on('exit', (code) => { + t.is(code, 1); resolve(); }); }); @@ -502,7 +502,7 @@ test.serial('run > job terminates before set time', async (t) => { await new Promise((resolve, reject) => { bree.workers.basic.on('error', reject); bree.workers.basic.on('exit', (code) => { - t.true(code === 0); + t.is(code, 0); resolve(); }); }); From ebb2ae3e1392e1409892cc162780446d63b205b7 Mon Sep 17 00:00:00 2001 From: Marc Schneider Date: Mon, 1 Feb 2021 08:25:03 +0100 Subject: [PATCH 5/5] fix: refactoring and improved test moved localTime init to job-builder.js; new test to verify functionality when job is added; extended verification of timezone offset in test --- src/index.js | 2 -- src/job-builder.js | 2 ++ test/test.js | 39 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/index.js b/src/index.js index 7ea00d6..e3c0473 100644 --- a/src/index.js +++ b/src/index.js @@ -20,8 +20,6 @@ const { const buildJob = require('./job-builder'); const validateJob = require('./job-validator'); -later.date.localTime(); - // bthreads requires us to do this for web workers (see bthreads docs for insight) threads.Buffer = Buffer; diff --git a/src/job-builder.js b/src/job-builder.js index 82214f6..6666fbb 100644 --- a/src/job-builder.js +++ b/src/job-builder.js @@ -5,6 +5,8 @@ const { boolean } = require('boolean'); const later = require('@breejs/later'); const { isSchedule, parseValue } = require('./job-utils'); +later.date.localTime(); + // eslint-disable-next-line complexity const buildJob = (job, config) => { if (isSANB(job)) { diff --git a/test/test.js b/test/test.js index d73e5ed..19b6699 100644 --- a/test/test.js +++ b/test/test.js @@ -64,7 +64,9 @@ test('fails if jobs is not an array', (t) => { root: path.join(__dirname, 'noIndexJobs'), jobs: null, // hide MODULE_NOT_FOUND error - logger: { error: () => {} } + logger: { + error: () => {} + } }), { message: 'Jobs must be an Array' } ); @@ -290,7 +292,7 @@ test('fails if cron pattern is invalid', (t) => { }); test.serial('job created with cron string is using local timezone', (t) => { - t.plan(1); + t.plan(2); const bree = new Bree({ root, jobs: [{ name: 'basic', cron: '0 18 * * *' }] @@ -300,12 +302,43 @@ test.serial('job created with cron string is using local timezone', (t) => { bree.start('basic'); bree.on('worker created', () => { const now = new Date(clock.now); + const offsetOfLocalDates = new Date().getTimezoneOffset(); + + t.is(now.getTimezoneOffset(), offsetOfLocalDates); t.is(now.getHours(), 18); }); clock.next(); clock.uninstall(); }); +test.serial( + 'add > job created with cron string is using local timezone', + (t) => { + t.plan(2); + const bree = new Bree({ + root: false + }); + + bree.add({ + name: 'basic', + cron: '0 18 * * *', + path: path.join(__dirname, 'jobs/basic.js') + }); + + const clock = FakeTimers.install({ now: Date.now() }); + bree.start('basic'); + bree.on('worker created', () => { + const now = new Date(clock.now); + const offsetOfLocalDates = new Date().getTimezoneOffset(); + + t.is(now.getTimezoneOffset(), offsetOfLocalDates); + t.is(now.getHours(), 18); + }); + clock.next(); + clock.uninstall(); + } +); + test.serial('job created with human interval is using local timezone', (t) => { t.plan(2); const bree = new Bree({ @@ -1746,7 +1779,9 @@ test('remove > fails if job does not exist', (t) => { test('add > successfully adds job object', (t) => { const bree = new Bree({ root: false }); + function noop() {} + bree.add({ name: 'basic', path: noop.toString() }); t.pass(); });