ldc-arcadia-api/tests/Unit/Application/Arcadia/Usecase/IncoCompositions/FindIncoCompositionTest.php

113 lines
5.3 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Unit\Application\Arcadia\Usecase\IncoCompositions;
use Application\Arcadia\Usecase\IncoCompositions\Find\FindIncoComposition;
use Application\Arcadia\Usecase\IncoCompositions\Find\Input;
use Application\Arcadia\Usecase\IncoCompositions\Find\Output;
use Application\Shared\Exceptions\NotFoundException;
use Domain\Models\Entities\Inco\Composition\IncoComposition;
use Domain\Models\ValueObjects\Inco\Composition\AminoAcids;
use Domain\Models\ValueObjects\Inco\Composition\CarbohydratesDetail;
use Domain\Models\ValueObjects\Inco\Composition\Energy;
use Domain\Models\ValueObjects\Inco\Composition\EnergyValues;
use Domain\Models\ValueObjects\Inco\Composition\FattyAcids;
use Domain\Models\ValueObjects\Inco\Composition\FreshProduceAndNuts;
use Domain\Models\ValueObjects\Inco\Composition\FruitAndNutAmount;
use Domain\Models\ValueObjects\Inco\Composition\Identification;
use Domain\Models\ValueObjects\Inco\Composition\IncoCompositionId;
use Domain\Models\ValueObjects\Inco\Composition\Minerals;
use Domain\Models\ValueObjects\Inco\Composition\NutrientValue;
use Domain\Models\ValueObjects\Inco\Composition\NutriScore;
use Domain\Models\ValueObjects\Inco\Composition\NutriScorePoints;
use Domain\Models\ValueObjects\Inco\Composition\PercentageValue;
use Domain\Models\ValueObjects\Inco\Composition\PortionMacronutrients;
use Domain\Models\ValueObjects\Inco\Composition\ReferenceIntakes;
use Domain\Models\ValueObjects\Inco\Composition\ReferenceMacronutrients;
use Domain\Models\ValueObjects\Inco\Composition\SpecialCompounds;
use Domain\Models\ValueObjects\Inco\Composition\Vitamins;
use Domain\Models\ValueObjects\Inco\IncoId;
use Domain\Ports\Directories\IncoCompositionDirectory;
use Mockery;
covers(FindIncoComposition::class);
describe('FindIncoComposition Usecase Unit Tests', function (): void {
it('executes successfully and returns Output when composition exists', function (): void {
// GIVEN
$incoId = new IncoId('12345');
$compoId = new IncoCompositionId('67890');
$identification = new Identification('Poulet Rôti 1kg Test', '12345', 'LDC');
$energyValues = new EnergyValues('100g', '0', '0');
$energy = new Energy($energyValues, $energyValues);
$nutrient = new NutrientValue('0');
$refMacro = new ReferenceMacronutrients($nutrient, $nutrient, $nutrient, $nutrient, $nutrient, $nutrient, $nutrient);
$porMacro = new PortionMacronutrients($nutrient, $nutrient, $nutrient, $nutrient, $nutrient, $nutrient, $nutrient);
$fnAmount = new FruitAndNutAmount();
$pct = new PercentageValue('0');
$fresh = new FreshProduceAndNuts($fnAmount, $fnAmount, $pct, $pct);
$refIntakes = new ReferenceIntakes($pct, $pct, $pct, $pct, $pct, $pct, $pct, $pct, '100g');
$nutriScore = new NutriScore('0', '0', 'A');
$nutriScorePoints = new NutriScorePoints('0', '0', '0', '0', '0', '0', '0');
$minerals = new Minerals('0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
$vitamins = new Vitamins('0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
$carbs = new CarbohydratesDetail('0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
$fatty = new FattyAcids('0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0');
$amino = new AminoAcids('0', '0', '0');
$special = new SpecialCompounds('0', '0', '0', '0');
$composition = new IncoComposition(
id: $compoId,
idInco: $incoId,
identification: $identification,
energy: $energy,
referenceMacronutrients: $refMacro,
portionMacronutrients: $porMacro,
freshProduceAndNuts: $fresh,
referenceIntakes: $refIntakes,
nutriScore: $nutriScore,
nutriScorePoints: $nutriScorePoints,
minerals: $minerals,
vitamins: $vitamins,
carbohydratesDetail: $carbs,
fattyAcids: $fatty,
aminoAcids: $amino,
specialCompounds: $special,
);
$directory = Mockery::mock(IncoCompositionDirectory::class);
$directory->shouldReceive('findByIncoId')->with($incoId)->andReturn($composition);
$usecase = new FindIncoComposition($directory);
$input = new Input($incoId);
// WHEN
$output = $usecase->execute($input);
// THEN
expect($output)->toBeInstanceOf(Output::class)
->and($output->id)->toBe($compoId)
->and($output->idInco)->toBe($incoId);
});
it('throws NotFoundException when composition does not exist', function (): void {
// GIVEN
$incoId = new IncoId('99999');
$directory = Mockery::mock(IncoCompositionDirectory::class);
$directory->shouldReceive('findByIncoId')->with($incoId)->andReturn(null);
$usecase = new FindIncoComposition($directory);
$input = new Input($incoId);
// WHEN & THEN
expect(fn () => $usecase->execute($input))->toThrow(NotFoundException::class);
});
});