Farmbot-Web-App/webpack/farm_designer/farm_events/__tests__/map_state_to_props_test.ts

264 lines
8.0 KiB
TypeScript

import { mapStateToProps, mapResourcesToCalendar } from "../map_state_to_props";
import { fakeState } from "../../../__test_support__/fake_state";
import {
fakeSequence,
fakeRegimen,
fakeFarmEvent
} from "../../../__test_support__/fake_state/resources";
import {
buildResourceIndex
} from "../../../__test_support__/resource_index_builder";
import * as moment from "moment";
import { countBy } from "lodash";
import { TimeUnit } from "../../interfaces";
describe("mapStateToProps()", () => {
function testState(time: number) {
const sequence = fakeSequence();
sequence.body.id = 1;
sequence.body.body = [{ kind: "take_photo", args: {} }];
const regimen = fakeRegimen();
regimen.body.id = 1;
regimen.body.regimen_items = [{
sequence_id: 1,
time_offset: moment(time).add(10, "minutes")
.diff(moment(time).clone().startOf("day"), "milliseconds")
}];
const getFutureTime =
(t: number, value: number, label: string) =>
// tslint:disable-next-line:no-any
moment(t).add(value as any, label).toISOString();
const sequenceFarmEvent = fakeFarmEvent("Sequence", 1);
sequenceFarmEvent.body.id = 1;
const plusOneDay = moment(getFutureTime(time, 1, "day")).valueOf();
sequenceFarmEvent.body.start_time = getFutureTime(plusOneDay, 2, "minutes");
sequenceFarmEvent.body.end_time = getFutureTime(plusOneDay, 3, "minutes");
const regimenFarmEvent = fakeFarmEvent("Regimen", 1);
regimenFarmEvent.body.id = 2;
const plusTwoDays = moment(getFutureTime(time, 2, "days")).valueOf();
regimenFarmEvent.body.start_time = getFutureTime(plusTwoDays, 1, "minute");
regimenFarmEvent.body.end_time = getFutureTime(plusTwoDays, 2, "minutes");
const fakeResources = [
sequence,
regimen,
sequenceFarmEvent,
regimenFarmEvent
];
const state = fakeState();
state.resources = buildResourceIndex(fakeResources);
return state;
}
it("returns calendar rows", () => {
const testTime = moment().startOf("hour").valueOf();
const { calendarRows, push } = mapStateToProps(testState(testTime));
const day1Time = moment(testTime).add(1, "day");
const day1ItemTime = day1Time.add(2, "minutes");
const day2Time = moment(testTime).add(2, "days");
const regimenStartTime = day2Time.clone().add(1, "minutes");
const regimenItemTime = day2Time.clone().add(10, "minutes");
expect(calendarRows).toEqual([
{
day: day1Time.date(),
items: [
{
executableId: 1,
heading: "fake",
id: 1,
mmddyy: day1ItemTime.format("MMDDYY"),
sortKey: day1ItemTime.unix(),
timeStr: day1ItemTime.utcOffset(0).format("hh:mma")
}],
month: day1Time.format("MMM"),
sortKey: day1Time.unix(),
year: day1Time.year() - 2000
},
{
day: day2Time.date(),
items: [
{
executableId: 1,
heading: "Foo",
id: 2,
mmddyy: regimenStartTime.format("MMDDYY"),
sortKey: regimenStartTime.unix(),
subheading: "",
timeStr: regimenStartTime.utcOffset(0).format("hh:mma")
},
{
executableId: 1,
heading: "Foo",
id: 2,
mmddyy: regimenItemTime.format("MMDDYY"),
sortKey: regimenItemTime.unix(),
subheading: "fake",
timeStr: regimenItemTime.utcOffset(0).format("hh:mma")
}],
month: day2Time.format("MMM"),
sortKey: regimenStartTime.unix(),
year: day2Time.year() - 2000
}]);
expect(push).toBeTruthy();
});
});
describe("mapResourcesToCalendar(): sequence farm events", () => {
interface EventData {
start_time: string;
end_time: string;
repeat?: number;
time_unit?: TimeUnit;
}
function fakeSeqFEResources(props: EventData) {
const sequence = fakeSequence();
sequence.body.id = 1;
sequence.body.body = [{ kind: "take_photo", args: {} }];
const sequenceFarmEvent = fakeFarmEvent("Sequence", 1);
sequenceFarmEvent.body.id = 1;
sequenceFarmEvent.body.start_time = props.start_time;
sequenceFarmEvent.body.end_time = props.end_time;
sequenceFarmEvent.body.repeat = props.repeat || 1;
sequenceFarmEvent.body.time_unit = props.time_unit || "never";
return buildResourceIndex([sequence, sequenceFarmEvent]);
}
const fakeSequenceFE = [{
day: expect.any(Number),
items: [{
executableId: 1,
heading: "fake",
id: 1,
mmddyy: expect.stringContaining("17"),
sortKey: expect.any(Number),
timeStr: expect.stringContaining("02")
}],
month: "Dec",
sortKey: expect.any(Number),
year: 17
}];
it("returns calendar rows: single event", () => {
const eventData: EventData = {
start_time: "2017-12-20T01:02:00.000Z",
end_time: "2017-12-20T01:05:00.000Z"
};
const testTime = moment("2017-12-15T01:00:00.000Z");
const calendar = mapResourcesToCalendar(
fakeSeqFEResources(eventData).index, testTime);
expect(calendar.getAll()).toEqual(fakeSequenceFE);
});
it("returns calendar rows: hidden items", () => {
const eventData: EventData = {
start_time: "2017-12-20T01:02:00.000Z",
end_time: "2017-12-20T04:05:00.000Z",
repeat: 1,
time_unit: "minutely"
};
const testTime = moment("2017-12-15T01:00:00.000Z");
const calendar = mapResourcesToCalendar(
fakeSeqFEResources(eventData).index, testTime);
const dayOneItems = calendar.getAll()[0].items;
expect(countBy(dayOneItems, "heading")).toEqual({
"fake": 59,
"+ 123 more: fake": 1
});
});
it("returns calendar rows: empty", () => {
const eventData: EventData = {
start_time: "2017-12-20T01:02:00.000Z",
end_time: "2019-12-20T01:05:00.000Z",
repeat: 100,
time_unit: "yearly"
};
const testTime = moment("2017-12-30T01:00:00.000Z");
const calendar = mapResourcesToCalendar(
fakeSeqFEResources(eventData).index, testTime);
const dayOneItems = calendar.getAll()[0].items;
expect(countBy(dayOneItems, "heading")).toEqual({ "*Empty*": 1 });
});
});
describe("mapResourcesToCalendar(): regimen farm events", () => {
function fakeRegFEResources() {
const sequence = fakeSequence();
sequence.body.id = 1;
sequence.body.body = [{ kind: "take_photo", args: {} }];
const regimen = fakeRegimen();
regimen.body.id = 1;
regimen.body.regimen_items = [{
sequence_id: 1,
time_offset: 288660000
}];
const regimenFarmEvent = fakeFarmEvent("Regimen", 1);
regimenFarmEvent.body.id = 2;
regimenFarmEvent.body.start_time = "2017-12-20T01:02:00.000Z";
regimenFarmEvent.body.end_time = "2017-12-20T01:05:00.000Z";
return buildResourceIndex([sequence, regimen, regimenFarmEvent]);
}
const fakeRegimenFE = [{
day: expect.any(Number),
items: [
{
executableId: 1,
heading: "Foo",
subheading: "",
id: 2,
mmddyy: expect.stringContaining("17"),
sortKey: expect.any(Number),
timeStr: expect.stringContaining("02")
}
],
month: "Dec",
sortKey: expect.any(Number),
year: 17
},
{
day: expect.any(Number),
items: [
{
executableId: 1,
heading: "Foo",
subheading: "fake",
id: 2,
mmddyy: expect.stringContaining("17"),
sortKey: expect.any(Number),
timeStr: expect.stringContaining("11")
}
],
month: "Dec",
sortKey: expect.any(Number),
year: 17
}
];
fit("returns calendar rows", () => {
const testTime = moment("2017-12-15T01:00:00.000Z");
const calendar =
mapResourcesToCalendar(fakeRegFEResources().index, testTime);
expect(calendar.getAll()).toEqual(fakeRegimenFE);
});
fit("doesn't return calendar row after event is over", () => {
const testTime = moment("2017-12-27T01:00:00.000Z");
const calendar =
mapResourcesToCalendar(fakeRegFEResources().index, testTime);
expect(calendar.getAll()).toEqual([]);
});
});