From c38e2cdcfe16937dccd5180e11d853efbd42758d Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@keylocation.sg>
Date: Mon, 14 Aug 2017 22:16:28 +0200
Subject: [PATCH] fix: wrap and warn non-array schedule (#676)

---
 lib/workers/branch/schedule.js       | 24 ++++++++++++++----------
 test/workers/branch/schedule.spec.js |  8 +++++---
 2 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/lib/workers/branch/schedule.js b/lib/workers/branch/schedule.js
index a4e96ed2aa..c3e0b92785 100644
--- a/lib/workers/branch/schedule.js
+++ b/lib/workers/branch/schedule.js
@@ -11,9 +11,6 @@ function fixShortHours(input) {
 }
 
 function hasValidSchedule(schedule) {
-  if (!Array.isArray(schedule)) {
-    return [false, 'Invalid schedule'];
-  }
   let message;
   // check if any of the schedules fail to parse
   const hasFailedSchedules = schedule.some(scheduleText => {
@@ -42,16 +39,23 @@ function hasValidSchedule(schedule) {
 }
 
 function isScheduledNow(config) {
-  config.logger.debug({ schedule: config.schedule }, `Checking schedule`);
+  let configSchedule = config.schedule;
+  config.logger.debug({ schedule: configSchedule }, `Checking schedule`);
   if (
-    !config.schedule ||
-    config.schedule.length === 0 ||
-    config.schedule[0] === ''
+    !configSchedule ||
+    configSchedule.length === 0 ||
+    configSchedule[0] === ''
   ) {
     config.logger.debug('No schedule defined');
     return true;
   }
-  const [validSchedule, errorMessage] = hasValidSchedule(config.schedule);
+  if (!Array.isArray(configSchedule)) {
+    config.logger.warn(
+      `config schedule is not an array: ${JSON.stringify(configSchedule)}`
+    );
+    configSchedule = [configSchedule];
+  }
+  const [validSchedule, errorMessage] = hasValidSchedule(configSchedule);
   if (!validSchedule) {
     config.logger.error(errorMessage);
     return true;
@@ -72,9 +76,9 @@ function isScheduledNow(config) {
     now.hours() * 3600 + now.minutes() * 60 + now.seconds();
   config.logger.debug(`currentSeconds=${currentSeconds}`);
   // Support a single string but massage to array for processing
-  config.logger.debug(`Checking ${config.schedule.length} schedule(s)`);
+  config.logger.debug(`Checking ${configSchedule.length} schedule(s)`);
   // We run if any schedule matches
-  const isWithinSchedule = config.schedule.some(scheduleText => {
+  const isWithinSchedule = configSchedule.some(scheduleText => {
     config.logger.debug(`Checking schedule "${scheduleText}"`);
     const parsedSchedule = later.parse.text(fixShortHours(scheduleText));
     // Later library returns array of schedules
diff --git a/test/workers/branch/schedule.spec.js b/test/workers/branch/schedule.spec.js
index ad668d7fd9..e183e86223 100644
--- a/test/workers/branch/schedule.spec.js
+++ b/test/workers/branch/schedule.spec.js
@@ -7,9 +7,6 @@ describe('workers/branch/schedule', () => {
     beforeEach(() => {
       jest.resetAllMocks();
     });
-    it('returns false if schedule is not an array', () => {
-      expect(schedule.hasValidSchedule({ a: 1 }, logger)[0]).toBe(false);
-    });
     it('returns false for invalid schedule', () => {
       expect(schedule.hasValidSchedule(['foo'], logger)[0]).toBe(false);
     });
@@ -105,6 +102,11 @@ describe('workers/branch/schedule', () => {
       const res = schedule.isScheduledNow(config);
       expect(res).toBe(false);
     });
+    it('massages string', () => {
+      config.schedule = 'before 4:00am';
+      const res = schedule.isScheduledNow(config);
+      expect(res).toBe(false);
+    });
     it('supports outside hours', () => {
       config.schedule = ['after 4:00pm'];
       const res = schedule.isScheduledNow(config);
-- 
GitLab