feat: add availability template deviation calculation logic

This commit is contained in:
Freek van de Ven 2024-07-09 09:44:44 +02:00 committed by Bart Ribbers
parent baad9204c2
commit 2edd540f51
3 changed files with 181 additions and 0 deletions

View file

@ -0,0 +1,34 @@
import "package:flutter_availability/src/util/utils.dart";
import "package:flutter_availability_data_interface/flutter_availability_data_interface.dart";
/// Determines if the availability is deviated from the template that it is
/// based on
bool isTemplateDeviated(
AvailabilityModel availability,
AvailabilityTemplateModel template,
) {
var dayOfWeek = availability.startDate.weekday;
DateTime? templateStartDate;
DateTime? templateEndDate;
if (template.templateType == AvailabilityTemplateType.week) {
templateStartDate = (template.templateData as WeekTemplateData)
.data[WeekDay.values[dayOfWeek - 1]]
?.startTime;
templateEndDate = (template.templateData as WeekTemplateData)
.data[WeekDay.values[dayOfWeek - 1]]
?.endTime;
} else {
templateStartDate = (template.templateData as DayTemplateData).startTime;
templateEndDate = (template.templateData as DayTemplateData).endTime;
}
if (templateStartDate == null || templateEndDate == null) {
return true;
}
var templateIsDeviated =
!isAtSameTime(availability.startDate, templateStartDate) ||
!isAtSameTime(availability.endDate, templateEndDate);
return templateIsDeviated;
}

View file

@ -0,0 +1,4 @@
/// method to return if 2 dates are at the same time of the day
/// ignoring the date
bool isAtSameTime(DateTime date1, DateTime date2) =>
date1.hour == date2.hour && date1.minute == date2.minute;

View file

@ -0,0 +1,143 @@
import "package:flutter_availability/src/util/availability_deviation.dart";
import "package:flutter_availability_data_interface/flutter_availability_data_interface.dart";
import "package:flutter_test/flutter_test.dart";
void main() {
group("isTemplateDeviated", () {
group("day templates", () {
test("returns false when availability matches the day template", () {
var availability = AvailabilityModel(
userId: "user1",
startDate: DateTime(2023, 7, 9, 9, 0),
endDate: DateTime(2023, 7, 9, 17, 0),
breaks: [],
);
var template = AvailabilityTemplateModel(
userId: "user1",
name: "Day Template",
color: 0,
templateType: AvailabilityTemplateType.day,
templateData: DayTemplateData(
startTime: DateTime(2023, 7, 9, 9, 0),
endTime: DateTime(2023, 7, 9, 17, 0),
breaks: [],
),
);
var result = isTemplateDeviated(availability, template);
expect(result, isFalse);
});
test("returns true when availability does not match the day template",
() {
var availability = AvailabilityModel(
userId: "user1",
startDate: DateTime(2023, 7, 9, 10, 0),
endDate: DateTime(2023, 7, 9, 18, 0),
breaks: [],
);
var template = AvailabilityTemplateModel(
userId: "user1",
name: "Day Template",
color: 0,
templateType: AvailabilityTemplateType.day,
templateData: DayTemplateData(
startTime: DateTime(2023, 7, 9, 9, 0),
endTime: DateTime(2023, 7, 9, 17, 0),
breaks: [],
),
);
var result = isTemplateDeviated(availability, template);
expect(result, isTrue);
});
});
group("week templates", () {
test("returns false when availability matches the week template", () {
var availability = AvailabilityModel(
userId: "user1",
startDate: DateTime(2023, 7, 9, 9, 0),
endDate: DateTime(2023, 7, 9, 17, 0),
breaks: [],
);
var template = AvailabilityTemplateModel(
userId: "user1",
name: "Week Template",
color: 0,
templateType: AvailabilityTemplateType.week,
templateData: WeekTemplateData.forDays(
sunday: DayTemplateData(
startTime: DateTime(2023, 7, 9, 9, 0),
endTime: DateTime(2023, 7, 9, 17, 0),
breaks: [],
),
),
);
var result = isTemplateDeviated(availability, template);
expect(result, isFalse);
});
test("returns true when availability does not match the week template",
() {
var availability = AvailabilityModel(
userId: "user1",
startDate: DateTime(2023, 7, 9, 10, 0), // sunday
endDate: DateTime(2023, 7, 9, 18, 0), // sunday
breaks: [],
);
var template = AvailabilityTemplateModel(
userId: "user1",
name: "Week Template",
color: 0,
templateType: AvailabilityTemplateType.week,
templateData: WeekTemplateData.forDays(
sunday: DayTemplateData(
startTime: DateTime(2023, 7, 9, 9, 0),
endTime: DateTime(2023, 7, 9, 17, 0),
breaks: [],
),
),
);
var result = isTemplateDeviated(availability, template);
expect(result, isTrue);
});
test(
"returns true when the template is missing the "
"day of the availability", () {
var availability = AvailabilityModel(
userId: "user1",
startDate: DateTime(2023, 7, 10, 10, 0), // monday
endDate: DateTime(2023, 7, 10, 18, 0), // monday
breaks: [],
);
var template = const AvailabilityTemplateModel(
userId: "user1",
name: "Week Template",
color: 0,
templateType: AvailabilityTemplateType.week,
templateData: WeekTemplateData(data: {}),
);
var result = isTemplateDeviated(availability, template);
expect(result, isTrue);
});
test("returns true when the template is fully null", () {
var availability = AvailabilityModel(
userId: "user1",
startDate: DateTime(2023, 7, 10, 10, 0),
endDate: DateTime(2023, 7, 10, 18, 0),
breaks: [],
);
var template = const AvailabilityTemplateModel(
userId: "user1",
name: "Week Template",
color: 0,
templateType: AvailabilityTemplateType.week,
templateData: WeekTemplateData(data: {}),
);
var result = isTemplateDeviated(availability, template);
expect(result, isTrue);
});
});
});
}