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

122 lines
5.5 KiB
PHP

<?php
declare(strict_types=1);
namespace Tests\Unit\Application\Arcadia\Usecase\IncoCompositions;
use Application\Arcadia\Exceptions\IncoCompositionNotFoundException;
use Application\Arcadia\Usecase\IncoCompositions\Find\FindIncoComposition;
use Application\Arcadia\Usecase\IncoCompositions\Find\Input;
use Application\Arcadia\Usecase\IncoCompositions\Find\Output;
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 Infra\Adapters\Directories\InMemoryIncoCompositionDirectory;
covers(
FindIncoComposition::class,
Input::class,
Output::class,
);
describe('FindIncoComposition Usecase Unit Tests', function (): void {
$directory = new InMemoryIncoCompositionDirectory();
beforeEach(function () use ($directory): void {
$directory->clear();
});
function createComposition(string $compoIdStr, string $incoIdStr): IncoComposition
{
$compoId = new IncoCompositionId($compoIdStr);
$incoId = new IncoId($incoIdStr);
$identification = new Identification('Poulet Rôti 1kg Test', $incoIdStr, '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');
return IncoComposition::hydrate(
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,
);
}
it('executes successfully and returns Output when composition exists', function () use ($directory): void {
// GIVEN
$incoId = new IncoId('12345');
$composition = createComposition('67890', '12345');
$directory->add($composition);
$usecase = new FindIncoComposition($directory);
$input = new Input($incoId);
// WHEN
$output = $usecase->execute($input);
// THEN
expect($output)->toBeInstanceOf(Output::class)
->and($output->id->value)->toBe('67890')
->and($output->idInco->value)->toBe('12345');
});
it('throws NotFoundException when composition does not exist', function () use ($directory): void {
// GIVEN
$incoId = new IncoId('99999');
$usecase = new FindIncoComposition($directory);
$input = new Input($incoId);
// WHEN & THEN
expect(fn () => $usecase->execute($input))->toThrow(IncoCompositionNotFoundException::class);
});
});