This change ensures that the logger is properly injected into the EmployeeSyncService for better logging capabilities during tests.
118 lines
4.2 KiB
PHP
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();
|
|
});
|
|
});
|