Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 50861878 authored by Anna Larch's avatar Anna Larch Committed by Christoph Wurst
Browse files

Change rounding logic to use interval instead of lenght



Signed-off-by: default avatarAnna Larch <anna@nextcloud.com>
parent 85c80ca8
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -70,10 +70,11 @@ class AvailabilityGenerator {
		// E.g. 5m slots should only be available at 10:20 and 10:25, not at 10:17
		//      when the user opens the page at 10:17.
		// But only do this when the time isn't already a "pretty" time
		if ($earliestStart % $config->getLength() !== 0) {
			$roundTo = (int)round(($config->getLength()) / 300) * 300;
		if ($earliestStart % $config->getIncrement() !== 0) {
			$roundTo = (int)round(($config->getIncrement()) / 300) * 300;
			$earliestStart = (int)ceil($earliestStart / $roundTo) * $roundTo;
		}

		$latestEnd = min(
			$end,
			$config->getEnd() ?? $end
+1 −1
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@ import { generateUrl } from '@nextcloud/router'
 * @param timeZone {String} target time zone for the time stamps
 */
export async function findSlots(config, start, timeZone) {
	const url = generateUrl('/apps/calendar/appointment/{id}/slots?startTime={start}&endTime={end}&timeZone={timeZone}', {
	const url = generateUrl('/apps/calendar/appointment/{id}/slots?startTime={start}&timeZone={timeZone}', {
		id: config.id,
		start,
		timeZone,
+60 −24
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ class AvailabilityGeneratorTest extends TestCase {
	public function testNoAvailabilitySet(): void {
		$config = new AppointmentConfig();
		$config->setLength(60 * 60);
		$config->setIncrement(300);
		$config->setAvailability(null);

		$slots = $this->generator->generate($config, 1 * 3600, 2 * 3600);
@@ -72,65 +73,90 @@ class AvailabilityGeneratorTest extends TestCase {

	public function testNoAvailabilitySetRoundToFive(): void {
		$config = new AppointmentConfig();
		$config->setLength(47 * 60);
		$config->setLength(2820);
		$config->setIncrement(900);
		$config->setAvailability(null);

		$slots = $this->generator->generate($config, (int)2.8 * 3600, 4 * 3600);
		$slots = $this->generator->generate($config, 3610, 4 * 3600);

		self::assertCount(1, $slots);
		self::assertEquals(0, $slots[0]->getStart() % 300);
		self::assertEquals(0, $slots[0]->getStart() % 900);
		self::assertEquals(4500, $slots[0]->getStart());
	}

	public function testNoAvailabilitySetRoundWithSpecificTimes(): void {
		$config = new AppointmentConfig();
		$config->setLength(3600);
		$config->setIncrement(900);
		$config->setAvailability(null);

		$slots = $this->generator->generate($config, 1637837100, 1637840700);

		self::assertCount(1, $slots);
		self::assertEquals(0, $slots[0]->getStart() % 900);
		self::assertEquals(3600, ($slots[0]->getEnd() - $slots[0]->getStart()));
		self::assertEquals(
			[new Interval(1637837100, 1637840700)],
			$slots,
		);
	}

	public function testNoAvailabilitySetRoundWithIncrement(): void {
		$config = new AppointmentConfig();
		$config->setLength(90 * 60);
		$config->setIncrement(60 * 60);
		$config->setLength(5400);
		$config->setIncrement(3600);
		$config->setAvailability(null);

		$slots = $this->generator->generate($config, 1 * 5400, 2 * 5400);

		self::assertCount(1, $slots);
		self::assertEquals(0, $slots[0]->getStart() % 5400);
		self::assertEquals(0, $slots[0]->getStart() % 3600);
		self::assertEquals(7200, $slots[0]->getStart());
	}

	public function testNoAvailabilitySetRoundWithPrettyNumbers(): void {
	public function testNoAvailabilitySetRoundToPrettyNumbers(): void {
		$config = new AppointmentConfig();
		$config->setLength(90 * 60);
		$config->setLength(5400);
		$config->setIncrement(300);
		$config->setAvailability(null);

		$slots = $this->generator->generate($config, 1 * 5400 + 1, 2 * 5400 + 1);

		self::assertCount(1, $slots);
		self::assertEquals($slots[0]->getStart(), 2 * 5400);
		self::assertEquals(0, $slots[0]->getStart() % 5400);
		self::assertEquals(0, $slots[0]->getStart() % 300);
		self::assertEquals(5700, $slots[0]->getStart());
	}

	public function testNoAvailabilitySetRoundWithFourtyMinutes(): void {
		$config = new AppointmentConfig();
		$config->setLength(40 * 60);
		$config->setLength(2400);
		$config->setIncrement(600);
		$config->setAvailability(null);

		$slots = $this->generator->generate($config, 1 * 2400, 2 * 2400);

		self::assertCount(1, $slots);
		self::assertEquals(0, $slots[0]->getStart() % 2400);
		self::assertEquals(0, $slots[0]->getStart() % 600);
		self::assertEquals(2400, $slots[0]->getStart());
	}

	public function testNoAvailabilitySetRoundWithFourtyMinutesNotPretty(): void {
		$config = new AppointmentConfig();
		$config->setLength(40 * 60);
		$config->setLength(2400);
		$config->setIncrement(300);
		$config->setAvailability(null);

		$slots = $this->generator->generate($config, 1 * 2400 + 1, 2 * 2400 + 1);

		self::assertCount(1, $slots);
		self::assertEquals($slots[0]->getStart(), 2 * 2400);
		self::assertEquals(0, $slots[0]->getStart() % 2400);
		self::assertEquals(0, $slots[0]->getStart() % 300);
		self::assertEquals(2700, $slots[0]->getStart());
	}

	public function testNoAvailabilityButEndDate(): void {
		$config = new AppointmentConfig();
		$config->setLength(60 * 60);
		$config->setLength(3600);
		$config->setIncrement(300);
		$config->setAvailability(null);
		$config->setEnd(10 * 3600);

@@ -140,13 +166,15 @@ class AvailabilityGeneratorTest extends TestCase {
			[new Interval(4 * 3600, 10 * 3600)],
			$slots,
		);
		self::assertEquals(4 * 3600, $slots[0]->getStart());
	}

	public function testNoAvailabilityAfterEndDate(): void {
		$this->timeFactory->method('getTime')
			->willReturn(15 * 3600);
		$config = new AppointmentConfig();
		$config->setLength(60 * 60);
		$config->setLength(3600);
		$config->setIncrement(3600);
		$config->setAvailability(null);
		$config->setEnd(10 * 3600);

@@ -166,7 +194,8 @@ class AvailabilityGeneratorTest extends TestCase {
			->setTimezone($tz)
			->setTime(17, 0)->getTimestamp();
		$config = new AppointmentConfig();
		$config->setLength(60 * 60);
		$config->setLength(3600);
		$config->setIncrement(3600);
		$config->setAvailability(json_encode([
			'timezoneId' => $tz->getName(),
			'slots' => [
@@ -216,7 +245,8 @@ class AvailabilityGeneratorTest extends TestCase {
		$tz = new DateTimeZone('Europe/Vienna');
		$dateTime = (new DateTimeImmutable())->setTimezone($tz)->setDate(2021, 11, 22);
		$config = new AppointmentConfig();
		$config->setLength(60 * 60);
		$config->setLength(3600);
		$config->setIncrement(3600);
		$config->setAvailability(json_encode([
			'timezoneId' => $tz->getName(),
			'slots' => [
@@ -275,7 +305,8 @@ class AvailabilityGeneratorTest extends TestCase {
		$tz = new DateTimeZone('Europe/Vienna');
		$dateTime = (new DateTimeImmutable())->setTimezone($tz)->setDate(2021, 11, 22);
		$config = new AppointmentConfig();
		$config->setLength(60 * 60);
		$config->setLength(3600);
		$config->setIncrement(3600);
		$config->setAvailability(json_encode([
			'timezoneId' => $tz->getName(),
			'slots' => [
@@ -336,7 +367,8 @@ class AvailabilityGeneratorTest extends TestCase {
		$startTimestamp = $dateTime->setTimezone($tz)->setDate(2021, 11, 22)->setTime(8, 0)->getTimestamp();
		$endTimestamp = $dateTime->setTime(17, 0)->getTimestamp();
		$config = new AppointmentConfig();
		$config->setLength(60 * 60);
		$config->setLength(3600);
		$config->setIncrement(3600);
		$config->setAvailability(json_encode([
			'timezoneId' => $tz->getName(),
			'slots' => [
@@ -386,7 +418,9 @@ class AvailabilityGeneratorTest extends TestCase {
		$tz = new DateTimeZone('Pacific/Auckland');
		$dateTime = (new DateTimeImmutable())->setTimezone($tz)->setDate(2021, 11, 22);
		$config = new AppointmentConfig();
		$config->setLength(60 * 60);
		$config->setLength(3600);
		$config->setIncrement(3600);

		$config->setAvailability(json_encode([
			'timezoneId' => $tz->getName(),
			'slots' => [
@@ -445,7 +479,8 @@ class AvailabilityGeneratorTest extends TestCase {
		$tz = new DateTimeZone('Europe/Vienna');
		$dateTime = (new DateTimeImmutable())->setTimezone($tz)->setDate(2021, 11, 22);
		$config = new AppointmentConfig();
		$config->setLength(60 * 60);
		$config->setLength(3600);
		$config->setIncrement(3600);
		$config->setAvailability(json_encode([
			'timezoneId' => $tz->getName(),
			'slots' => [
@@ -521,7 +556,8 @@ class AvailabilityGeneratorTest extends TestCase {
		$tz = new DateTimeZone('Europe/Vienna');
		$dateTime = (new DateTimeImmutable())->setTimezone($tz)->setDate(2021, 11, 22);
		$config = new AppointmentConfig();
		$config->setLength(60 * 60);
		$config->setLength(3600);
		$config->setIncrement(3600);
		$config->setAvailability(json_encode([
			'timezoneId' => $tz->getName(),
			'slots' => [
+17 −0
Original line number Diff line number Diff line
@@ -89,6 +89,23 @@ class SlotExtrapolatorTest extends TestCase {
		self::assertCount(1, $slots);
	}

	/**
	 * An hour long availability fits exactly one hour long appointment from availability generator
	 * but use an example that could be generated by the slot extrapolator
	 * i. e. Start Time is 3601 and end time is 7201, which would be
	 * parsed to 7200 and 7201
	 */
	public function testExactlyOneButRoundedUpFromAvailability(): void {
		$config = new AppointmentConfig();
		$config->setLength(3600);
		$config->setIncrement(3600);
		$slots = [new Interval(7200, 7201)];

		$slots = $this->extrapolator->extrapolate($config, $slots);

		self::assertCount(0, $slots);
	}

	/**
	 * 1.5h available allow three hour long appointments with 15m increments
	 */