diff --git a/batch/models/job_multiple.js b/batch/models/job_multiple.js index 85cf1d872..fc431ad8c 100644 --- a/batch/models/job_multiple.js +++ b/batch/models/job_multiple.js @@ -13,22 +13,52 @@ util.inherits(JobMultiple, JobBase); module.exports = JobMultiple; -JobMultiple.is = function (query) { - if (!Array.isArray(query)) { - return false; +function isJobParsed(query) { + // From backend: [{ query: 'select * from ...', status: 'pending' }, + // { query: 'select * from ...', status: 'pending' } ] + + for (var i = 0; i < query.length; i++) { + if (typeof query[i] !== 'object') { + return false; + } + + if (typeof query[i].query !== 'string') { + return false; + } + + if (typeof query[i].status !== 'string') { + return false; + } } - // 1. From user: ['select * from ...', 'select * from ...'] - // 2. From redis: [ { query: 'select * from ...', status: 'pending' }, - // { query: 'select * from ...', status: 'pending' } ] + return true; +} + +function isJobRaw(query) { + // From user: ['select * from ...', 'select * from ...'] for (var i = 0; i < query.length; i++) { if (typeof query[i] !== 'string') { - if (typeof query[i].query !== 'string') { - return false; - } + return false; + } + + if (!query[i].length) { + return false; } } + return true; +} + +JobMultiple.is = function (query) { + + if (!Array.isArray(query)) { + return false; + } + + if (!isJobRaw(query) && !isJobParsed(query)) { + return false; + } + return true; }; diff --git a/test/integration/batch/job_factory.test.js b/test/integration/batch/job_factory.test.js new file mode 100644 index 000000000..3e76fb72d --- /dev/null +++ b/test/integration/batch/job_factory.test.js @@ -0,0 +1,36 @@ +'use strict'; + +require('../../helper'); + +var BATCH_SOURCE = '../../../batch/'; +var assert = require('../../support/assert'); +var JobFactory = require(BATCH_SOURCE + 'models/job_factory'); + +describe('job factory', function() { + + it('should throw error with invalid fallback query', function () { + var jobRaw = { + query: [{ + query: "select * from wadus_table", + onerror: "select * from wadus_table" + }] + }; + + assert.throws(function () { + JobFactory.create(jobRaw); + }); + }); + + it('should throw error with void queries', function () { + var jobRaw = { + query: [ + '', + '' + ] + }; + + assert.throws(function () { + JobFactory.create(jobRaw); + }); + }); +});