ldc-boutique-cnc-sable/tests/Integration/WithApp/App/Services/EmployeeSyncServiceTest.php
Jérémy Munsch fa5abe7470
test(EmployeeSyncService): add logger to EmployeeSyncService instantiation
This change ensures that the logger is properly injected into the EmployeeSyncService for better logging capabilities during tests.
2026-10-27 09:59:01 +01:00

118 lines
4.2 KiB
PHP

<?php
declare(strict_types=1);
use App\Models\Setting;
use App\Queries\Settings\GetSettingsQuery;
use App\Services\ArcadiaEmployee;
use App\Services\ArcadiaEmployeeService;
use App\Services\CodeGenerationService;
use App\Services\EmployeeSyncService;
use Carbon\CarbonImmutable;
use Domain\Models\ValueObjects\Matricule;
use Domain\Models\ValueObjects\ShopperEstablishmentCode;
use Domain\Models\ValueObjects\ShopperServiceCode;
use Domain\Models\ValueObjects\ShopperSiteCode;
use Domain\Ports\Services\EmployeeImportStorageService;
use Illuminate\Contracts\Cache\Repository as CacheRepository;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Psr\Log\LoggerInterface;
uses(RefreshDatabase::class);
afterEach(function (): void {
\Mockery::close();
});
describe('EmployeeSyncService', function (): void {
it('fetches employees for sites configured in settings when sites parameter is null and upserts them', function (): void {
// GIVEN
$setting = Setting::getSingleton();
$setting->employee_sites = ['PA', 'LY'];
$setting->saveOrFail();
$logger = app(LoggerInterface::class);
$cache = app(CacheRepository::class);
$codeService = app(CodeGenerationService::class);
$storageService = \Mockery::mock(EmployeeImportStorageService::class);
$employee = new ArcadiaEmployee(
matricule: new Matricule('1234567'),
lastname: 'Dupont',
firstname: 'Jean',
startDate: CarbonImmutable::parse('2026-01-01'),
endDate: null,
etablissement: new ShopperEstablishmentCode('ETAB'),
site: new ShopperSiteCode('PA'),
service: new ShopperServiceCode('101')
);
$storageService->shouldReceive('upsertEmployees')
->once()
->with(\Mockery::on(static function (array $data): bool {
return count($data) === 1 && $data[0]->matricule->value === '1234567';
}));
$storageService->shouldReceive('getImportedAfter')
->once()
->andReturn((object) [
'insertedCount' => 1,
'updatedCount' => 0,
'matriculesInserted' => [new Matricule('1234567')],
]);
$arcadiaService = \Mockery::mock(ArcadiaEmployeeService::class);
$arcadiaService->shouldReceive('getEmployeesOfSiteSince')
->once()
->with(\Mockery::on(static fn (ShopperSiteCode $code): bool => $code->value === 'PA'), \Mockery::any())
->andReturn([$employee]);
$arcadiaService->shouldReceive('getEmployeesOfSiteSince')
->once()
->with(\Mockery::on(static fn (ShopperSiteCode $code): bool => $code->value === 'LY'), \Mockery::any())
->andReturn([]);
$service = new EmployeeSyncService(
$logger,
$cache,
$arcadiaService,
$codeService,
$storageService,
app(GetSettingsQuery::class)
);
// WHEN
$service->synchronize();
// THEN
expect($service->getLastSync())->not->toBeNull();
});
it('can use explicitly provided sites instead of settings', function (): void {
// GIVEN
$logger = app(LoggerInterface::class);
$cache = app(CacheRepository::class);
$codeService = app(CodeGenerationService::class);
$storageService = \Mockery::mock(EmployeeImportStorageService::class);
$arcadiaService = \Mockery::mock(ArcadiaEmployeeService::class);
$arcadiaService->shouldReceive('getEmployeesOfSiteSince')
->once()
->with(\Mockery::on(static fn (ShopperSiteCode $code): bool => $code->value === 'BO'), \Mockery::any())
->andReturn([]);
$service = new EmployeeSyncService(
$logger,
$cache,
$arcadiaService,
$codeService,
$storageService,
app(GetSettingsQuery::class)
);
// WHEN
$service->synchronize(sites: [new ShopperSiteCode('BO')]);
// THEN
expect($service->getLastSync())->not->toBeNull();
});
});