Skip to content

[인포리스트] 테스트

개요

이 가이드의 모든 예제는 Pest를 사용하여 작성됩니다. Pest의 Livewire 플러그인을 테스트에 사용하려면 Pest 문서의 플러그인 설치 안내를 따라 하세요: Pest용 Livewire 플러그인. 하지만, PHPUnit에 맞게 쉽게 변환할 수 있습니다.

Infolist Builder는 Livewire 컴포넌트에서 동작하므로, Livewire 테스트 헬퍼를 사용할 수 있습니다. 하지만, 인포리스트에서 사용할 수 있는 커스텀 테스트 헬퍼도 제공합니다:

액션

액션을 호출하려면 인포리스트 컴포넌트 키와 액션 이름을 callInfolistAction()에 전달하면 됩니다:

php
use function Pest\Livewire\livewire;

it('송장 전송이 가능하다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->callInfolistAction('customer', 'send', infolistName: 'infolist');

    expect($invoice->refresh())
        ->isSent()->toBeTrue();
});

액션에 데이터를 배열로 전달하려면 data 파라미터를 사용하세요:

php
use function Pest\Livewire\livewire;

it('송장 전송이 가능하다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->callInfolistAction('customer', 'send', data: [
            'email' => $email = fake()->email(),
        ])
        ->assertHasNoInfolistActionErrors();

    expect($invoice->refresh())
        ->isSent()->toBeTrue()
        ->recipient_email->toBe($email);
});

액션의 데이터를 즉시 호출하지 않고 설정만 하고 싶다면, setInfolistActionData()를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('송장 전송이 가능하다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->mountInfolistAction('customer', 'send')
        ->setInfolistActionData([
            'email' => $email = fake()->email(),
        ])
});

실행

액션이 중단되었는지 확인하려면 assertInfolistActionHalted()를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('송장에 이메일 주소가 없으면 전송을 중단한다', function () {
    $invoice = Invoice::factory(['email' => null])->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->callInfolistAction('customer', 'send')
        ->assertInfolistActionHalted('customer', 'send');
});

에러

assertHasNoInfolistActionErrors()는 액션 폼 제출 시 검증 오류가 발생하지 않았는지 확인하는 데 사용됩니다.

데이터에 검증 오류가 발생했는지 확인하려면, Livewire의 assertHasErrors()와 유사하게 assertHasInfolistActionErrors()를 사용하세요:

php
use function Pest\Livewire\livewire;

it('송장 수신자 이메일을 검증할 수 있다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->callInfolistAction('customer', 'send', data: [
            'email' => Str::random(),
        ])
        ->assertHasInfolistActionErrors(['email' => ['email']]);
});

액션이 데이터로 미리 채워져 있는지 확인하려면, assertInfolistActionDataSet() 메서드를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('기본적으로 주요 연락처로 송장을 전송할 수 있다', function () {
    $invoice = Invoice::factory()->create();
    $recipientEmail = $invoice->company->primaryContact->email;

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->mountInfolistAction('customer', 'send')
        ->assertInfolistActionDataSet([
            'email' => $recipientEmail,
        ])
        ->callMountedInfolistAction()
        ->assertHasNoInfolistActionErrors();
        
    expect($invoice->refresh())
        ->isSent()->toBeTrue()
        ->recipient_email->toBe($recipientEmail);
});

액션 상태

인포리스트에 액션이 존재하는지 또는 존재하지 않는지 확인하려면, assertInfolistActionExists() 또는 assertInfolistActionDoesNotExist() 메서드를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('송장은 전송할 수 있지만, 전송 취소는 할 수 없다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertInfolistActionExists('customer', 'send')
        ->assertInfolistActionDoesNotExist('customer', 'unsend');
});

사용자에게 액션이 숨겨져 있거나 보이는지 확인하려면, assertInfolistActionHidden() 또는 assertInfolistActionVisible() 메서드를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('고객만 출력할 수 있다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertInfolistActionHidden('customer', 'send')
        ->assertInfolistActionVisible('customer', 'print');
});

사용자에게 액션이 활성화되어 있거나 비활성화되어 있는지 확인하려면, assertInfolistActionEnabled() 또는 assertInfolistActionDisabled() 메서드를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('전송된 송장에 대해서만 고객을 출력할 수 있다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertInfolistActionDisabled('customer', 'send')
        ->assertInfolistActionEnabled('customer', 'print');
});

액션이 사용자에게 숨겨져 있는지 확인하려면, assertInfolistActionHidden() 메서드를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('송장을 전송할 수 없다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertInfolistActionHidden('customer', 'send');
});

버튼 모양

액션에 올바른 라벨이 있는지 확인하려면, assertInfolistActionHasLabel()assertInfolistActionDoesNotHaveLabel()을 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('send 액션에 올바른 라벨이 있다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertInfolistActionHasLabel('customer', 'send', 'Email Invoice')
        ->assertInfolistActionDoesNotHaveLabel('customer', 'send', 'Send');
});

액션 버튼이 올바른 아이콘을 표시하는지 확인하려면, assertInfolistActionHasIcon() 또는 assertInfolistActionDoesNotHaveIcon()을 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('활성화 시 send 버튼에 올바른 아이콘이 있다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertInfolistActionEnabled('customer', 'send')
        ->assertInfolistActionHasIcon('customer', 'send', 'envelope-open')
        ->assertInfolistActionDoesNotHaveIcon('customer', 'send', 'envelope');
});

액션 버튼이 올바른 색상을 표시하는지 확인하려면, assertInfolistActionHasColor() 또는 assertInfolistActionDoesNotHaveColor()를 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('액션이 올바른 색상을 표시한다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertInfolistActionHasColor('customer', 'delete', 'danger')
        ->assertInfolistActionDoesNotHaveColor('customer', 'print', 'danger');
});

URL

액션에 올바른 URL이 있는지 확인하려면, assertInfolistActionHasUrl(), assertInfolistActionDoesNotHaveUrl(), assertInfolistActionShouldOpenUrlInNewTab(), assertInfolistActionShouldNotOpenUrlInNewTab()을 사용할 수 있습니다:

php
use function Pest\Livewire\livewire;

it('올바른 Filament 사이트로 연결된다', function () {
    $invoice = Invoice::factory()->create();

    livewire(EditInvoice::class, [
        'invoice' => $invoice,
    ])
        ->assertInfolistActionHasUrl('customer', 'filament', 'https://filamentphp.com/')
        ->assertInfolistActionDoesNotHaveUrl('customer', 'filament', 'https://github.com/filamentphp/filament')
        ->assertInfolistActionShouldOpenUrlInNewTab('customer', 'filament')
        ->assertInfolistActionShouldNotOpenUrlInNewTab('customer', 'github');
});

나를 위한 문서 한글화