20-02-2026
This commit is contained in:
parent
854ce02bf6
commit
4d6b4930b2
128 changed files with 18247 additions and 2093 deletions
172
tests/Feature/Models/ProductTest.php
Normal file
172
tests/Feature/Models/ProductTest.php
Normal file
|
|
@ -0,0 +1,172 @@
|
|||
<?php
|
||||
|
||||
use App\Enums\PriceType;
|
||||
use App\Enums\ProductStatus;
|
||||
use App\Enums\ProductType;
|
||||
use App\Models\Brand;
|
||||
use App\Models\Category;
|
||||
use App\Models\Collection;
|
||||
use App\Models\Hub;
|
||||
use App\Models\Media;
|
||||
use App\Models\Partner;
|
||||
use App\Models\Product;
|
||||
use App\Models\Tag;
|
||||
|
||||
test('product can be created with factory', function () {
|
||||
$product = Product::factory()->create();
|
||||
|
||||
expect($product)->toBeInstanceOf(Product::class);
|
||||
expect($product->id)->toBeInt();
|
||||
expect($product->name)->toBeString();
|
||||
expect($product->slug)->toBeString();
|
||||
});
|
||||
|
||||
test('product casts product_type to enum', function () {
|
||||
$product = Product::factory()->create(['product_type' => 'local_stock']);
|
||||
|
||||
expect($product->product_type)->toBe(ProductType::LocalStock);
|
||||
});
|
||||
|
||||
test('product casts status to enum', function () {
|
||||
$product = Product::factory()->create(['status' => 'draft']);
|
||||
|
||||
expect($product->status)->toBe(ProductStatus::Draft);
|
||||
});
|
||||
|
||||
test('product casts price_type to enum', function () {
|
||||
$product = Product::factory()->create(['price_type' => 'from_price']);
|
||||
|
||||
expect($product->price_type)->toBe(PriceType::FromPrice);
|
||||
});
|
||||
|
||||
test('product belongs to partner', function () {
|
||||
$partner = Partner::factory()->create();
|
||||
$product = Product::factory()->create(['partner_id' => $partner->id]);
|
||||
|
||||
expect($product->partner->id)->toBe($partner->id);
|
||||
});
|
||||
|
||||
test('product belongs to hub', function () {
|
||||
$hub = Hub::factory()->create();
|
||||
$product = Product::factory()->create(['hub_id' => $hub->id]);
|
||||
|
||||
expect($product->hub->id)->toBe($hub->id);
|
||||
});
|
||||
|
||||
test('product belongs to brand', function () {
|
||||
$partner = Partner::factory()->manufacturer()->create();
|
||||
$brand = Brand::factory()->create(['partner_id' => $partner->id]);
|
||||
$product = Product::factory()->create(['brand_id' => $brand->id]);
|
||||
|
||||
expect($product->brand->id)->toBe($brand->id);
|
||||
});
|
||||
|
||||
test('product belongs to collection', function () {
|
||||
$collection = Collection::create(['name' => 'Test Kollektion', 'slug' => 'test-kollektion']);
|
||||
$product = Product::factory()->create(['collection_id' => $collection->id]);
|
||||
|
||||
expect($product->collection->id)->toBe($collection->id);
|
||||
});
|
||||
|
||||
test('product can have categories', function () {
|
||||
$product = Product::factory()->create();
|
||||
$category = Category::create(['name' => 'Sofas', 'slug' => 'sofas']);
|
||||
|
||||
$product->categories()->attach($category);
|
||||
|
||||
expect($product->categories)->toHaveCount(1);
|
||||
expect($product->categories->first()->name)->toBe('Sofas');
|
||||
});
|
||||
|
||||
test('product can have tags', function () {
|
||||
$product = Product::factory()->create();
|
||||
$tag = Tag::create(['name' => 'Neu', 'slug' => 'neu']);
|
||||
|
||||
$product->tags()->attach($tag);
|
||||
|
||||
expect($product->tags)->toHaveCount(1);
|
||||
expect($product->tags->first()->name)->toBe('Neu');
|
||||
});
|
||||
|
||||
test('product can have media', function () {
|
||||
$product = Product::factory()->create();
|
||||
$media = Media::factory()->create([
|
||||
'model_type' => Product::class,
|
||||
'model_id' => $product->id,
|
||||
]);
|
||||
|
||||
expect($product->media)->toHaveCount(1);
|
||||
expect($product->media->first()->file_path)->toBe($media->file_path);
|
||||
});
|
||||
|
||||
test('product scope active filters correctly', function () {
|
||||
Product::factory()->create(['status' => ProductStatus::Active]);
|
||||
Product::factory()->create(['status' => ProductStatus::Draft]);
|
||||
Product::factory()->create(['status' => ProductStatus::Archived]);
|
||||
|
||||
expect(Product::active()->count())->toBe(1);
|
||||
});
|
||||
|
||||
test('product scope curated filters correctly', function () {
|
||||
Product::factory()->create(['is_curated' => true]);
|
||||
Product::factory()->create(['is_curated' => false]);
|
||||
|
||||
expect(Product::curated()->count())->toBe(1);
|
||||
});
|
||||
|
||||
test('product scope localStock filters correctly', function () {
|
||||
Product::factory()->localStock()->create();
|
||||
Product::factory()->smartOrder()->create();
|
||||
|
||||
expect(Product::localStock()->count())->toBe(1);
|
||||
expect(Product::smartOrder()->count())->toBe(1);
|
||||
});
|
||||
|
||||
test('product scope inHub filters correctly', function () {
|
||||
$hub = Hub::factory()->create();
|
||||
$otherHub = Hub::factory()->create();
|
||||
|
||||
Product::factory()->create(['hub_id' => $hub->id]);
|
||||
Product::factory()->create(['hub_id' => $otherHub->id]);
|
||||
|
||||
expect(Product::inHub($hub->id)->count())->toBe(1);
|
||||
});
|
||||
|
||||
test('product scope available combines active curated and available', function () {
|
||||
Product::factory()->create([
|
||||
'status' => ProductStatus::Active,
|
||||
'is_curated' => true,
|
||||
'is_available' => true,
|
||||
]);
|
||||
Product::factory()->create([
|
||||
'status' => ProductStatus::Active,
|
||||
'is_curated' => false,
|
||||
'is_available' => true,
|
||||
]);
|
||||
Product::factory()->create([
|
||||
'status' => ProductStatus::Draft,
|
||||
'is_curated' => true,
|
||||
'is_available' => true,
|
||||
]);
|
||||
|
||||
expect(Product::available()->count())->toBe(1);
|
||||
});
|
||||
|
||||
test('product factory has localStock state', function () {
|
||||
$product = Product::factory()->localStock()->create();
|
||||
|
||||
expect($product->product_type)->toBe(ProductType::LocalStock);
|
||||
});
|
||||
|
||||
test('product factory has smartOrder state', function () {
|
||||
$product = Product::factory()->smartOrder()->create();
|
||||
|
||||
expect($product->product_type)->toBe(ProductType::SmartOrder);
|
||||
});
|
||||
|
||||
test('product factory has active state', function () {
|
||||
$product = Product::factory()->active()->create();
|
||||
|
||||
expect($product->status)->toBe(ProductStatus::Active);
|
||||
expect($product->is_curated)->toBeTrue();
|
||||
});
|
||||
Loading…
Add table
Add a link
Reference in a new issue