From d027c6e9c45703deb4dab46f965a9482b5f83838 Mon Sep 17 00:00:00 2001 From: Julia Friesel <julia.friesel@gmail.com> Date: Tue, 10 Jul 2018 16:37:38 +0200 Subject: [PATCH] Throw if args are wrong --- lib/sympto/index.js | 25 +++++++- test/sympto/fixtures.js | 2 + test/sympto/index.spec.js | 129 +++++++++++++++++++++++++++----------- 3 files changed, 118 insertions(+), 38 deletions(-) diff --git a/lib/sympto/index.js b/lib/sympto/index.js index e32f8a29..291c378b 100644 --- a/lib/sympto/index.js +++ b/lib/sympto/index.js @@ -4,7 +4,8 @@ import getPreOvulatoryPhase from './pre-ovulatory' import { LocalDate } from 'js-joda' export default function ({ cycle, previousCycle }) { - // TODO check for basic stuff, throw if nonexistent + throwIfArgsAreNotInRequiredFormat(cycle, previousCycle) + const status = { assumeFertility: true, phases: {} @@ -66,4 +67,26 @@ export default function ({ cycle, previousCycle }) { status.assumeFertility = false return status +} + +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 + }) + })) throw new Error('Cycle days are not in correct format') } \ No newline at end of file diff --git a/test/sympto/fixtures.js b/test/sympto/fixtures.js index a7b237d4..4304f820 100644 --- a/test/sympto/fixtures.js +++ b/test/sympto/fixtures.js @@ -10,10 +10,12 @@ function convertToSymptoFormat(val) { const cycleWithTempShift = [36.6, 36.6, 36.6, 36.6, 36.6, 36.6, 36.8, 36.8, 36.8] .map(num => ({ date: '2018-06-01', temperature: num })) .map(convertToSymptoFormat) +cycleWithTempShift.unshift({date: '2018-05-30', bleeding: { value: 2 }}) const cycleWithoutTempShift = [36.6, 36.6, 36.6, 36.6, 36.6, 36.6, 36.8, 36.8] .map(num => ({ date: '2018-06-01', temperature: num })) .map(convertToSymptoFormat) +cycleWithoutTempShift.unshift({date: '2018-05-30', bleeding: { value: 2 }}) const cycleWithTempAndMucusShift = [ { date: '2018-06-01', temperature: 36.6, bleeding: 2 }, diff --git a/test/sympto/index.spec.js b/test/sympto/index.spec.js index 46d234f0..e9502804 100644 --- a/test/sympto/index.spec.js +++ b/test/sympto/index.spec.js @@ -7,47 +7,45 @@ import { const expect = chai.expect describe('sympto', () => { - describe('evaluating mucus and temperature shift together', () => { - describe('with no previous higher measurement', () => { - it('with no shifts detects only peri-ovulatory', function () { - const status = getSensiplanStatus({ - cycle: cycleWithoutAnyShifts, - previousCycle: cycleWithoutTempShift - }) + describe('with no previous higher measurement', () => { + it('with no shifts detects only peri-ovulatory', function () { + const status = getSensiplanStatus({ + cycle: cycleWithoutAnyShifts, + previousCycle: cycleWithoutTempShift + }) - expect(status).to.eql({ - assumeFertility: true, - phases: { - periOvulatory: { - start: { date: '2018-06-01' }, - cycleDays: cycleWithoutAnyShifts - } - }, - }) + expect(status).to.eql({ + assumeFertility: true, + phases: { + periOvulatory: { + start: { date: '2018-06-01' }, + cycleDays: cycleWithoutAnyShifts + } + }, }) + }) - it('with shifts detects only peri-ovulatory and post-ovulatory', function () { - const status = getSensiplanStatus({ - cycle: cycleWithTempAndMucusShift, - previousCycle: cycleWithoutTempShift - }) + it('with shifts detects only peri-ovulatory and post-ovulatory', function () { + const status = getSensiplanStatus({ + cycle: cycleWithTempAndMucusShift, + previousCycle: cycleWithoutTempShift + }) - expect(status.temperatureShift).to.be.an('object') - expect(status.mucusShift).to.be.an('object') - expect(status.assumeFertility).to.be.false() - expect(Object.keys(status.phases).length).to.eql(2) - expect(status.phases.periOvulatory).to.eql({ - start: { date: '2018-06-01' }, - end: { date: '2018-06-21', time: '18:00' }, - cycleDays: cycleWithTempAndMucusShift.filter(({date}) => date <= '2018-06-21') - }) - expect(status.phases.postOvulatory).to.eql({ - start: { - date: '2018-06-21', - time: '18:00' - }, - cycleDays: cycleWithTempAndMucusShift.filter(({date}) => date >= '2018-06-21') - }) + expect(status.temperatureShift).to.be.an('object') + expect(status.mucusShift).to.be.an('object') + expect(status.assumeFertility).to.be.false() + expect(Object.keys(status.phases).length).to.eql(2) + expect(status.phases.periOvulatory).to.eql({ + start: { date: '2018-06-01' }, + end: { date: '2018-06-21', time: '18:00' }, + cycleDays: cycleWithTempAndMucusShift.filter(({date}) => date <= '2018-06-21') + }) + expect(status.phases.postOvulatory).to.eql({ + start: { + date: '2018-06-21', + time: '18:00' + }, + cycleDays: cycleWithTempAndMucusShift.filter(({date}) => date >= '2018-06-21') }) }) }) @@ -117,4 +115,61 @@ 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') + }) + it('throws if cycle array is empty', () => { + expect(() => getSensiplanStatus({cycle: []})).to.throw('cycle days as array') + }) + it('throws if cycle days are not in right format', () => { + expect(() => getSensiplanStatus({ + cycle: [{ + hello: 'world', + bleeding: { value: 0 } + }], + previousCycle: [{ + date: '1992-09-09', + bleeding: { value: 0 } + }] + })).to.throw('correct format') + expect(() => getSensiplanStatus({ + cycle: [{ + date: '2018-04-13', + temperature: {value: '35'}, + bleeding: { value: 0 } + }], + previousCycle: [{ + date: '1992-09-09', + bleeding: { value: 0 } + }] + })).to.throw('correct format') + expect(() => getSensiplanStatus({ + cycle: [{ + date: '09-14-2017', + bleeding: { value: 0 } + }], + previousCycle: [{ + date: '1992-09-09', + bleeding: { value: 0 } + }] + })).to.throw('ISO') + }) + it('throws if first cycle day does not have bleeding value', () => { + expect(() => getSensiplanStatus({ + cycle: [{ + date: '2017-01-01', + bleeding: { + value: 'medium' + } + }], + previousCycle: [ + { + date: '2017-09-23', + } + ] + })).to.throw('start with bleeding') + }) + }) }) \ No newline at end of file -- GitLab