Skip to content

Commit 194fe59

Browse files
author
Matt Lewis
committed
feat: add runtime validation of event properties
Closes #362
1 parent e887b89 commit 194fe59

9 files changed

+70
-4
lines changed

package-lock.json

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@
167167
"dependencies": {
168168
"angular-draggable-droppable": "^1.1.1",
169169
"angular-resizable-element": "^1.2.4",
170-
"calendar-utils": "0.0.57",
170+
"calendar-utils": "0.0.58",
171171
"date-fns": "^1.28.5",
172172
"positioning": "^1.3.1"
173173
}

src/components/common/util.ts

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import {
2+
CalendarEvent,
3+
validateEvents as validateEventsWithoutLog
4+
} from 'calendar-utils';
5+
6+
export const validateEvents = (events: CalendarEvent[]) => {
7+
const warn = (...args) => console.warn('angular-calendar', ...args);
8+
return validateEventsWithoutLog(events, warn);
9+
};

src/components/day/calendarDayView.component.ts

+5
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { CalendarDragHelper } from '../../providers/calendarDragHelper.provider'
2626
import { CalendarResizeHelper } from '../../providers/calendarResizeHelper.provider';
2727
import { CalendarEventTimesChangedEvent } from '../../interfaces/calendarEventTimesChangedEvent.interface';
2828
import { CalendarUtils } from '../../providers/calendarUtils.provider';
29+
import { validateEvents } from '../common/util';
2930

3031
/**
3132
* @hidden
@@ -327,6 +328,10 @@ export class CalendarDayViewComponent implements OnChanges, OnInit, OnDestroy {
327328
this.refreshHourGrid();
328329
}
329330

331+
if (changes.events) {
332+
validateEvents(this.events);
333+
}
334+
330335
if (
331336
changes.viewDate ||
332337
changes.events ||

src/components/month/calendarMonthView.component.ts

+5
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import differenceInSeconds from 'date-fns/difference_in_seconds';
3030
import addSeconds from 'date-fns/add_seconds';
3131
import { CalendarEventTimesChangedEvent } from '../../interfaces/calendarEventTimesChangedEvent.interface';
3232
import { CalendarUtils } from '../../providers/calendarUtils.provider';
33+
import { validateEvents } from '../common/util';
3334

3435
/**
3536
* Shows all events on a given month. Example usage:
@@ -254,6 +255,10 @@ export class CalendarMonthViewComponent
254255
this.refreshHeader();
255256
}
256257

258+
if (changes.events) {
259+
validateEvents(this.events);
260+
}
261+
257262
if (
258263
changes.viewDate ||
259264
changes.events ||

src/components/week/calendarWeekView.component.ts

+5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { CalendarDragHelper } from '../../providers/calendarDragHelper.provider'
2525
import { CalendarResizeHelper } from '../../providers/calendarResizeHelper.provider';
2626
import { CalendarEventTimesChangedEvent } from '../../interfaces/calendarEventTimesChangedEvent.interface';
2727
import { CalendarUtils } from '../../providers/calendarUtils.provider';
28+
import { validateEvents } from '../common/util';
2829

2930
export interface WeekViewEventResize {
3031
originalOffset: number;
@@ -261,6 +262,10 @@ export class CalendarWeekViewComponent implements OnChanges, OnInit, OnDestroy {
261262
this.refreshHeader();
262263
}
263264

265+
if (changes.events) {
266+
validateEvents(this.events);
267+
}
268+
264269
if (changes.events || changes.viewDate || changes.excludeDays) {
265270
this.refreshBody();
266271
}

test/calendarDayView.component.spec.ts

+14
Original file line numberDiff line numberDiff line change
@@ -981,4 +981,18 @@ describe('CalendarDayViewComponent component', () => {
981981
.toDate()
982982
});
983983
});
984+
985+
it('should log on invalid events', () => {
986+
const stub = sinon.stub(console, 'warn');
987+
const fixture: ComponentFixture<
988+
CalendarDayViewComponent
989+
> = TestBed.createComponent(CalendarDayViewComponent);
990+
fixture.componentInstance.events = [
991+
{ start: '2017-01-01', title: '', color: { primary: '', secondary: '' } }
992+
] as any;
993+
fixture.componentInstance.ngOnChanges({ events: {} });
994+
fixture.detectChanges();
995+
stub.restore();
996+
expect(stub).to.have.been.calledOnce; // tslint:disable-line
997+
});
984998
});

test/calendarMonthView.component.spec.ts

+14
Original file line numberDiff line numberDiff line change
@@ -741,4 +741,18 @@ describe('calendarMonthView component', () => {
741741
subscription.unsubscribe();
742742
fixture.destroy();
743743
});
744+
745+
it('should log on invalid events', () => {
746+
const stub = sinon.stub(console, 'warn');
747+
const fixture: ComponentFixture<
748+
CalendarMonthViewComponent
749+
> = TestBed.createComponent(CalendarMonthViewComponent);
750+
fixture.componentInstance.events = [
751+
{ start: '2017-01-01', title: '', color: { primary: '', secondary: '' } }
752+
] as any;
753+
fixture.componentInstance.ngOnChanges({ events: {} });
754+
fixture.detectChanges();
755+
stub.restore();
756+
expect(stub).to.have.been.calledOnce; // tslint:disable-line
757+
});
744758
});

test/calendarWeekView.component.spec.ts

+14
Original file line numberDiff line numberDiff line change
@@ -823,4 +823,18 @@ describe('calendarWeekView component', () => {
823823
).to.equal(true);
824824
fixture.destroy();
825825
});
826+
827+
it('should log on invalid events', () => {
828+
const stub = sinon.stub(console, 'warn');
829+
const fixture: ComponentFixture<
830+
CalendarWeekViewComponent
831+
> = TestBed.createComponent(CalendarWeekViewComponent);
832+
fixture.componentInstance.events = [
833+
{ start: '2017-01-01', title: '', color: { primary: '', secondary: '' } }
834+
] as any;
835+
fixture.componentInstance.ngOnChanges({ events: {} });
836+
fixture.detectChanges();
837+
stub.restore();
838+
expect(stub).to.have.been.calledOnce; // tslint:disable-line
839+
});
826840
});

0 commit comments

Comments
 (0)