79 lines
2.7 KiB
PHP
79 lines
2.7 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit;
|
|
|
|
use App\Models\Criteria;
|
|
use App\Models\Product;
|
|
use App\Services\ToyRecommendationService;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Tests\TestCase;
|
|
|
|
class ToyRecommendationServiceTest extends TestCase
|
|
{
|
|
use RefreshDatabase;
|
|
|
|
protected ToyRecommendationService $service;
|
|
|
|
protected function setUp(): void
|
|
{
|
|
parent::setUp();
|
|
$this->service = new ToyRecommendationService;
|
|
}
|
|
|
|
public function test_returns_empty_when_no_products_match_filter(): void
|
|
{
|
|
Product::create(['name' => 'P1', 'price' => 50000, 'stock' => 0, 'age_range' => '3-6']);
|
|
$result = $this->service->getRecommendations([
|
|
'age_min' => 3,
|
|
'age_max' => 6,
|
|
'budget_min' => 0,
|
|
'budget_max' => 100000,
|
|
'priorities' => [],
|
|
]);
|
|
$this->assertCount(0, $result);
|
|
}
|
|
|
|
public function test_returns_top_5_recommendations_with_scores(): void
|
|
{
|
|
Criteria::insert([
|
|
['name' => 'Harga', 'type' => 'cost', 'weight_order' => 1, 'created_at' => now(), 'updated_at' => now()],
|
|
['name' => 'Kualitas', 'type' => 'benefit', 'weight_order' => 2, 'created_at' => now(), 'updated_at' => now()],
|
|
['name' => 'Keamanan', 'type' => 'benefit', 'weight_order' => 3, 'created_at' => now(), 'updated_at' => now()],
|
|
['name' => 'Edukasi', 'type' => 'benefit', 'weight_order' => 4, 'created_at' => now(), 'updated_at' => now()],
|
|
['name' => 'Popularitas', 'type' => 'benefit', 'weight_order' => 5, 'created_at' => now(), 'updated_at' => now()],
|
|
]);
|
|
$criterias = Criteria::all();
|
|
for ($i = 0; $i < 6; $i++) {
|
|
$p = Product::create([
|
|
'name' => "Product $i",
|
|
'price' => 100000 + $i * 20000,
|
|
'stock' => 10,
|
|
'age_range' => '3-6',
|
|
]);
|
|
$sync = [];
|
|
foreach ($criterias as $c) {
|
|
$sync[$c->id] = ['value' => $c->name === 'Harga' ? $p->price : 4];
|
|
}
|
|
$p->criterias()->sync($sync);
|
|
}
|
|
$priorities = [];
|
|
foreach ($criterias as $c) {
|
|
$priorities[$c->id] = 5;
|
|
}
|
|
$result = $this->service->getRecommendations([
|
|
'age_min' => 3,
|
|
'age_max' => 6,
|
|
'budget_min' => 0,
|
|
'budget_max' => 500000,
|
|
'priorities' => $priorities,
|
|
]);
|
|
$this->assertLessThanOrEqual(5, $result->count());
|
|
foreach ($result as $item) {
|
|
$this->assertArrayHasKey('rank', $item);
|
|
$this->assertArrayHasKey('product', $item);
|
|
$this->assertArrayHasKey('score', $item);
|
|
$this->assertArrayHasKey('explanation', $item);
|
|
}
|
|
}
|
|
}
|