diff --git a/lib/sympto/index.js b/lib/sympto/index.js index 291c378bd2f9a4a67decb21b128d3f6b40d2e506..6a9f66a31788e76fcf076ae05b0fc602d3a01035 100644 --- a/lib/sympto/index.js +++ b/lib/sympto/index.js @@ -2,6 +2,7 @@ import getTemperatureShift from './temperature' import getMucusShift from './mucus' import getPreOvulatoryPhase from './pre-ovulatory' import { LocalDate } from 'js-joda' +import assert from 'assert' export default function ({ cycle, previousCycle }) { throwIfArgsAreNotInRequiredFormat(cycle, previousCycle) @@ -70,23 +71,16 @@ export default function ({ cycle, previousCycle }) { } function throwIfArgsAreNotInRequiredFormat(cycle, previousCycle) { - if (!Array.isArray(cycle) || !cycle.length) throw new Error('Please provide all cycle days as array') - if (!Array.isArray(previousCycle) || !previousCycle.length) throw new Error('Please provide previous cycle days as array') - if ( - !cycle[0].bleeding || typeof cycle[0].bleeding.value != 'number' || - !previousCycle[0].bleeding || typeof previousCycle[0].bleeding.value != 'number' - ) throw new Error('Cycle must start with bleeding') - - if ([cycle, previousCycle].some(cycle => { - return cycle.some(day => { - if (!day.date) return true - try { - LocalDate.parse(day.date) - } catch(err) { - throw new Error('Please provide dates in ISO8601 format') - } - if (day.temperature && typeof day.temperature.value != 'number') return true - if (day.mucus && typeof day.mucus.value != 'number') return true + [cycle, previousCycle].forEach(cycle => { + assert.ok(Array.isArray(cycle)) + assert.ok(cycle.length > 0) + assert.equal(typeof cycle[0].bleeding, 'object') + assert.equal(typeof cycle[0].bleeding.value, 'number') + cycle.forEach(day => { + assert.equal(typeof day.date, 'string') + assert.doesNotThrow(() => LocalDate.parse(day.date)) + if (day.temperature) assert.equal(typeof day.temperature.value, 'number') + if (day.mucus) assert.equal(typeof day.mucus.value, 'number') }) - })) throw new Error('Cycle days are not in correct format') + }) } \ No newline at end of file diff --git a/test/sympto/index.spec.js b/test/sympto/index.spec.js index 6bc56e7a9f0dd94292fd446fce5859ee999e1ded..5a9bc38389a350e59351acc94677cb94455650a5 100644 --- a/test/sympto/index.spec.js +++ b/test/sympto/index.spec.js @@ -1,5 +1,6 @@ import chai from 'chai' import getSensiplanStatus from '../../lib/sympto' +import { AssertionError } from 'assert' import { cycleWithoutTempShift, cycleWithTempAndMucusShift, @@ -141,10 +142,10 @@ describe('sympto', () => { describe('when args are wrong', () => { it('throws when arg object is not in right format', () => { const wrongObject = { hello: 'world' } - expect(() => getSensiplanStatus(wrongObject)).to.throw('cycle days as array') + expect(() => getSensiplanStatus(wrongObject)).to.throw(AssertionError) }) it('throws if cycle array is empty', () => { - expect(() => getSensiplanStatus({cycle: []})).to.throw('cycle days as array') + expect(() => getSensiplanStatus({cycle: []})).to.throw(AssertionError) }) it('throws if cycle days are not in right format', () => { expect(() => getSensiplanStatus({ @@ -156,7 +157,7 @@ describe('sympto', () => { date: '1992-09-09', bleeding: { value: 0 } }] - })).to.throw('correct format') + })).to.throw(AssertionError) expect(() => getSensiplanStatus({ cycle: [{ date: '2018-04-13', @@ -167,7 +168,7 @@ describe('sympto', () => { date: '1992-09-09', bleeding: { value: 0 } }] - })).to.throw('correct format') + })).to.throw(AssertionError) expect(() => getSensiplanStatus({ cycle: [{ date: '09-14-2017', @@ -177,7 +178,7 @@ describe('sympto', () => { date: '1992-09-09', bleeding: { value: 0 } }] - })).to.throw('ISO') + })).to.throw(AssertionError) }) it('throws if first cycle day does not have bleeding value', () => { expect(() => getSensiplanStatus({ @@ -192,7 +193,7 @@ describe('sympto', () => { date: '2017-09-23', } ] - })).to.throw('start with bleeding') + })).to.throw(AssertionError) }) }) }) \ No newline at end of file