gruene-seele/tests/Feature/ProductPhase0Test.php

186 lines
4.8 KiB
PHP

<?php
use App\Models\Attribute;
use App\Models\AttributeType;
use App\Models\Ingredient;
use App\Models\Product;
use App\Models\ProductAttribute;
use App\Models\ProductIngredient;
use App\Repositories\ProductRepository;
use App\Services\HTMLHelper;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
uses(TestCase::class, RefreshDatabase::class);
test('product_ingredients relation uses product_id foreign key', function () {
$product = Product::create([
'name' => 'Relation Test',
'title' => 'Relation Test',
'active' => true,
]);
$ingredient = Ingredient::create([
'name' => 'Test INCI',
'trans_name' => '',
'inci' => '',
'trans_inci' => '',
'effect' => '',
'trans_effect' => '',
'active' => true,
'pos' => 0,
]);
ProductIngredient::create([
'product_id' => $product->id,
'ingredient_id' => $ingredient->id,
]);
$product->refresh();
expect($product->product_ingredients)->toHaveCount(1);
expect($product->product_ingredients->first()->ingredient_id)->toBe($ingredient->id);
});
test('ingredient product_ingredients relation uses ingredient_id foreign key', function () {
$product = Product::create([
'name' => 'Relation Test 2',
'title' => 'Relation Test 2',
'active' => true,
]);
$ingredient = Ingredient::create([
'name' => 'Test INCI 2',
'trans_name' => '',
'inci' => '',
'trans_inci' => '',
'effect' => '',
'trans_effect' => '',
'active' => true,
'pos' => 0,
]);
ProductIngredient::create([
'product_id' => $product->id,
'ingredient_id' => $ingredient->id,
]);
$ingredient->refresh();
expect($ingredient->product_ingredients)->toHaveCount(1);
expect($ingredient->product_ingredients->first()->product_id)->toBe($product->id);
});
test('updateIngredients removes deselected ingredients', function () {
$product = Product::create([
'name' => 'Sync Test',
'title' => 'Sync Test',
'active' => true,
]);
$a = Ingredient::create([
'name' => 'Alpha',
'trans_name' => '',
'inci' => '',
'trans_inci' => '',
'effect' => '',
'trans_effect' => '',
'active' => true,
'pos' => 0,
]);
$b = Ingredient::create([
'name' => 'Beta',
'trans_name' => '',
'inci' => '',
'trans_inci' => '',
'effect' => '',
'trans_effect' => '',
'active' => true,
'pos' => 0,
]);
$repo = new ProductRepository($product);
$repo->updateIngredients(['product_ingredients' => [(string) $a->id, (string) $b->id]]);
expect($product->fresh()->p_ingredients)->toHaveCount(2);
$repo->updateIngredients(['product_ingredients' => [(string) $a->id]]);
expect($product->fresh()->p_ingredients)->toHaveCount(1);
expect($product->fresh()->p_ingredients->first()->id)->toBe($a->id);
});
test('getProductIngredientsOptions lists ingredients alphabetically by name', function () {
Ingredient::create([
'name' => 'Zebra',
'trans_name' => '',
'inci' => '',
'trans_inci' => '',
'effect' => '',
'trans_effect' => '',
'active' => true,
'pos' => 0,
]);
Ingredient::create([
'name' => 'Alpha',
'trans_name' => '',
'inci' => '',
'trans_inci' => '',
'effect' => '',
'trans_effect' => '',
'active' => true,
'pos' => 0,
]);
$html = HTMLHelper::getProductIngredientsOptions([], false);
expect(strpos($html, 'Alpha'))->toBeLessThan(strpos($html, 'Zebra'));
});
test('copy preserves product attribute type_id', function () {
$type = AttributeType::create([
'name' => 'Type A',
'slug' => 'type-a-'.uniqid(),
'pos' => 0,
'active' => true,
]);
$typeB = AttributeType::create([
'name' => 'Type B',
'slug' => 'type-b-'.uniqid(),
'pos' => 1,
'active' => true,
]);
$attr = Attribute::create([
'attribute_type_id' => $type->id,
'name' => 'Attr',
'trans_name' => '',
'pos' => 0,
'active' => true,
'slug' => 'attr-'.uniqid(),
]);
$source = Product::create([
'name' => 'Source',
'title' => 'Source',
'active' => true,
]);
ProductAttribute::create([
'product_id' => $source->id,
'type_id' => $typeB->id,
'attribute_id' => $attr->id,
]);
$repo = new ProductRepository(new Product);
$copy = $repo->copy($source->fresh());
$copied = $copy->attributes()->first();
expect($copied)->not->toBeNull();
expect($copied->type_id)->toBe($typeB->id);
expect($copied->attribute_id)->toBe($attr->id);
});