mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
Syncer for user absence, from the msgraph reader
This commit is contained in:
parent
5b42b85b50
commit
2861945a52
@ -13,8 +13,8 @@ namespace Chill\CalendarBundle\Exception;
|
||||
|
||||
class UserAbsenceSyncException extends \LogicException
|
||||
{
|
||||
public function __construct(string $message = "", int $code = 20230706)
|
||||
public function __construct(string $message = "", int $code = 20230706, ?\Throwable $previous = null)
|
||||
{
|
||||
parent::__construct($message, $code);
|
||||
parent::__construct($message, $code, $previous);
|
||||
}
|
||||
}
|
||||
|
@ -21,7 +21,7 @@ use Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface;
|
||||
use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
|
||||
use Symfony\Contracts\HttpClient\HttpClientInterface;
|
||||
|
||||
readonly class MSUserAbsenceReader
|
||||
final readonly class MSUserAbsenceReader implements MSUserAbsenceReaderInterface
|
||||
{
|
||||
public function __construct(
|
||||
private HttpClientInterface $machineHttpClient,
|
||||
|
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* Chill is a software for social workers
|
||||
*
|
||||
* For the full copyright and license information, please view
|
||||
* the LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph;
|
||||
|
||||
use Chill\MainBundle\Entity\User;
|
||||
|
||||
interface MSUserAbsenceReaderInterface
|
||||
{
|
||||
/**
|
||||
* @throw UserAbsenceSyncException when the data cannot be reached or is not valid from microsoft
|
||||
*/
|
||||
public function isUserAbsent(User $user): bool|null;
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* Chill is a software for social workers
|
||||
*
|
||||
* For the full copyright and license information, please view
|
||||
* the LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph;
|
||||
|
||||
use Chill\MainBundle\Entity\User;
|
||||
use Symfony\Component\Clock\ClockInterface;
|
||||
|
||||
readonly class MSUserAbsenceSync
|
||||
{
|
||||
public function __construct(
|
||||
private MSUserAbsenceReaderInterface $absenceReader,
|
||||
private ClockInterface $clock,
|
||||
) {
|
||||
}
|
||||
|
||||
public function syncUserAbsence(User $user): void
|
||||
{
|
||||
$absence = $this->absenceReader->isUserAbsent($user);
|
||||
|
||||
if (null === $absence) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($absence === $user->isAbsent()) {
|
||||
// nothing to do
|
||||
return;
|
||||
}
|
||||
|
||||
if ($absence) {
|
||||
$user->setAbsenceStart($this->clock->now());
|
||||
} else {
|
||||
$user->setAbsenceStart(null);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/*
|
||||
* Chill is a software for social workers
|
||||
*
|
||||
* For the full copyright and license information, please view
|
||||
* the LICENSE file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Chill\CalendarBundle\Tests\RemoteCalendar\Connector\MSGraph;
|
||||
|
||||
use Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph\MSUserAbsenceReader;
|
||||
use Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph\MSUserAbsenceReaderInterface;
|
||||
use Chill\CalendarBundle\RemoteCalendar\Connector\MSGraph\MSUserAbsenceSync;
|
||||
use Chill\MainBundle\Entity\User;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use Prophecy\PhpUnit\ProphecyTrait;
|
||||
use Symfony\Component\Clock\MockClock;
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* @coversNothing
|
||||
*/
|
||||
class MSUserAbsenceSyncTest extends TestCase
|
||||
{
|
||||
use ProphecyTrait;
|
||||
|
||||
/**
|
||||
* @dataProvider provideDataTestSyncUserAbsence
|
||||
*/
|
||||
public function testSyncUserAbsence(User $user, ?bool $absenceFromMicrosoft, bool $expectedAbsence, ?\DateTimeImmutable $expectedAbsenceStart, string $message): void
|
||||
{
|
||||
$userAbsenceReader = $this->prophesize(MSUserAbsenceReaderInterface::class);
|
||||
$userAbsenceReader->isUserAbsent($user)->willReturn($absenceFromMicrosoft);
|
||||
|
||||
$clock = new MockClock(new \DateTimeImmutable('2023-07-01T12:00:00'));
|
||||
|
||||
$syncer = new MSUserAbsenceSync($userAbsenceReader->reveal(), $clock);
|
||||
|
||||
$syncer->syncUserAbsence($user);
|
||||
|
||||
self::assertEquals($expectedAbsence, $user->isAbsent(), $message);
|
||||
self::assertEquals($expectedAbsenceStart, $user->getAbsenceStart(), $message);
|
||||
}
|
||||
|
||||
public function provideDataTestSyncUserAbsence(): iterable
|
||||
{
|
||||
yield [new User(), false, false, null, "user present remains present"];
|
||||
yield [new User(), true, true, new \DateTimeImmutable('2023-07-01T12:00:00'), "user present becomes absent"];
|
||||
|
||||
$user = new User();
|
||||
$user->setAbsenceStart($abs = new \DateTimeImmutable("2023-07-01T12:00:00"));
|
||||
yield [$user, true, true, $abs, "user absent remains absent"];
|
||||
|
||||
$user = new User();
|
||||
$user->setAbsenceStart($abs = new \DateTimeImmutable("2023-07-01T12:00:00"));
|
||||
yield [$user, false, false, null, "user absent becomes present"];
|
||||
|
||||
yield [new User(), null, false, null, "user not syncable: presence do not change"];
|
||||
|
||||
$user = new User();
|
||||
$user->setAbsenceStart($abs = new \DateTimeImmutable("2023-07-01T12:00:00"));
|
||||
yield [$user, null, true, $abs, "user not syncable: absence do not change"];
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user