۰ پویا پارسایی
اشتباه بودن متد paginate و تستش
جامعه پی اچ پی ایجاد شده در ۰۹ اردیبهشت ۱۴۰۱

سلام و عرض ادب.

متد paginate و تستش اشتباه پیاده سازی شد.

توی تستی که واسه paginate کردن دسته بندی‌ها نوشتیم ما یه مقدار ثابت بهش میدادیم و چون تمامی ۳۰ رکوردی که میسازیم اون مقدار رو دارن، تستمون پاس میشد. در صورتیکه اگه دیتایی که میساختیم با faker به صورت random بود متوجه میشدیم که توی تست get_filtered_categories داره تمام رکوردها رو برمیگردونه و عملا هیچ فیتلر سرچی رو نتیجه جستجومون اعمال نمیشه.

راه درستش به این صورته:

متد paginate در EloquentBaseRepository:

namespace App\\Repositories\\Eloquent;
use App\\Repositories\\Contracts\\RepositoryInterface;
class EloquentBaseRepository implements RepositoryInterface
{
    protected $model;
    public function paginate(int $page, int $pageSize = 20, string $search = null, array $columns = []): array{
        return $this->model::when(!is_null($search),function($query) use ($search,$columns){
            foreach($columns as $column){
                return $query->orWhere($column,$search);
            }
        })->paginate($pageSize, $columns, null, $page)->toArray();
    }
}

پاس دادن دیتای random به تست برای سرچ کردن: (نحوه استفاده از faker توی تستهای لومن رو در نکات آموزشی جلسه قبل توی این لینک توضیح دادم.

public function test_ensure_can_get_filtered_categories()
{
    $categories = $this->createCategories(30);
    $pageSize = 5;
    $categorySlug = $categories[array_rand($categories)]->getSlug();
    $response = $this->call('GET', 'api/v1/categories', [
        'search' => $categorySlug,
        'page' => 1,
        'pagesize' => $pageSize
    ]);
    $data = json_decode($response->getContent(), true)['data'];
    foreach ($data as $category) {
        $this->assertEquals($categorySlug, $category['slug']);
    }
    $this->assertResponseOk();
    $this->seeJsonStructure([
        'success',
        'message',
        'data'
    ]);
}
private function createCategories($count = 1)
{
    $this->setUpFaker();
    $categoryRepository = $this->app->make(CategoryRepositoryInterface::class);
    $categories = [];
    foreach (range(0, $count) as $item) {
        $newCategory = [
            'name' => $this->faker->name,
            'slug' => $this->faker->slug
        ];
        $categories[] = $categoryRepository->store($newCategory);
    }
    return $categories;
}