Как сгенерировать паспорта oauth_clients для тестирования базы данных?

#laravel #laravel-passport #laravel-testing

Вопрос:

Я тестирую конечную точку api, которая аутентифицируется с помощью паспорта laravel. Я пишу тест функции для проверки oauth/token , может ли он вернуть действительный access_token. В postman это работает нормально, но я использую другую базу данных для тестирования, поэтому, когда я запускаю тест, я всегда получаю 400 ошибок. Хотя я могу протестировать все аутентифицированные маршруты, но я застрял, когда хочу протестировать api/login или oauth/token конечные точки. Я запускаю команду artisan для установки паспорта для тестовой базы данных. Как получить идентификатор клиента и секрет?

В классе TestCase

 public function setUp(): void
    {
        parent::setUp();

        Artisan::call('migrate', ['-vvv' => true]);
        Artisan::call('passport:install', ['-vvv' => true]);
        Artisan::call('db:seed', ['-vvv' => true]);
    }
 

Класс LoginTest

 public function test_it_returns_a_valid_token_if_credentials_do_match()
    {
        $client = Passport::client();

        $user = User::factory()->create([
            'email' => $email = 'test@test.com',
            'password' => $password = '12345678'
        ]);

        $body = [
            'client_id' => $client->id,
            'client_secret' => $client->secret,
            'username' => $email,
            'password' => $password
        ];

        $this->json('POST', '/oauth/token', $body)
            ->assertStatus(200);
    }
 

Здесь $client = Passport::client() возвращает значение null. Я не нашел никакого решения для получения учетных данных клиента oauth.

Комментарии:

1. Паспорт oauth уже протестирован их разработчиком, и он отлично работает, зачем вам нужно проверять, может ли он правильно генерировать токен?

2. Потому что я использую подход TDD для разработки. TDD помогает избежать ошибок и ошибок при внедрении новых функций в приложение.

3. Я имею в виду, что, если бы вы сами написали конечную точку входа, было бы очень разумно написать тест для этого, но, поскольку вы пишете тест для конечной точки библиотеки, которая уже сильно протестирована, в чем необходимость?

4. Посмотрите на это, вы пытаетесь написать один и тот же тест, github.com/laravel/passport/blob/10.x/tests/Feature/…

5. Да, но я создал пользовательский маршрут «api/логин» для входа в систему, который использует этот маршрут по умолчанию для паспорта. Моя цель-протестировать маршрут «api/вход». Большое спасибо, что поделились этой ссылкой, я нашел решение.

Ответ №1:

На самом деле $client = Passport::client(); не возвращает клиента. Я нашел решение для создания клиента из LoginTest.

 $user = User::factory()->create([
            'email' => $email = 'test@test.com',
            'password' => $password = '12345678'
        ]);

$client = ClientFactory::new()->asPasswordClient()->create(['user_id' => $user->id]);

        $response = $this->json(
            'POST', '/oauth/token',
            [
                'grant_type' => 'password',
                'client_id' => $client->id,
                'client_secret' => $client->secret,
                'username' => $user->email,
                'password' => $password,
            ]
        )
        ->assertStatus(200);