#Testing modal form in resource relation

27 messages · Page 1 of 1 (latest)

grim shore
#

I want to test creating an address which is a sub-resource of customers but the form opens in a modal rather than go to a dedicated form page. How can I test this? I've tried the below and this isn't working

public function test_a_new_address_can_be_created(): void
{
    $customer = Customer::factory()->create();

    $livewire = Livewire::test(
        name: AddressesRelationManager::class,
        params: [
            'ownerRecord' => $customer,
            'pageClass' => EditCustomer::class,
        ],
    );

    $livewire
        ->mountTableAction('create')
        ->fillForm([
            'line_1' => $line1 = 'Test Line 1',
            'line_2' => $line2 = 'Test Line 2',
            'city' => $city = 'Test City',
            'state' => $state = 'Test State',
            'postal_code' => $postalCode = 'TE1 1ST',
            'type' => $type = AddressType::BILLING->value,
        ])
        ->callTableAction('create')
        ->assertHasNoFormErrors();

    $this->assertDatabaseHas(CustomerAddress::class, [
        'line_1' => $line1,
        'line_2' => $line2,
        'city' => $city,
        'state' => $state,
        'postal_code' => $postalCode,
        'type' => $type,
    ]);
}
grim shore
#

Anyone able to point me in the right direction with this?

vivid void
grim shore
#

No bueno. I get the same error as in that screengrab

#

fillForm has a second argument $form which defaults to "form", as this is a relation manager form do I need to pass in a form name? Not sure what I'd pass in though or how I'd find the name

spark estuary
#

use setTableActionData at the place of fillForm

grim shore
#

Hmm, still the same. This is what the test looks like at the moment with these couple of updates:

$customer = Customer::factory()->create();

$livewire = Livewire::test(
    name: AddressesRelationManager::class,
    params: [
        'ownerRecord' => $customer,
        'pageClass' => EditCustomer::class,
    ],
);

$livewire
    ->mountTableAction('create')
    ->setTableActionData([
        'line_1' => $line1 = 'Test Line 1',
        'line_2' => $line2 = 'Test Line 2',
        'city' => $city = 'Test City',
        'state' => $state = 'Test State',
        'postal_code' => $postalCode = 'TE1 1ST',
        'type' => $type = AddressType::BILLING->value,
    ])
    ->callMountedTableAction()
    ->assertHasNoFormErrors();
#

It's weird because the error says that InfoList is being passed into form(), but I dd it out and it's an instance of Filament\Forms\Form which is what I expect

#

So I'm not sure where InfoList is coming from

#

Actually it is

spark estuary
#

best

->callTableAction('create', data: [
      'line_1' => $line1 = 'Test Line 1',
      'line_2' => $line2 = 'Test Line 2',
      'city' => $city = 'Test City',
      'state' => $state = 'Test State',
      'postal_code' => $postalCode = 'TE1 1ST',
      'type' => $type = AddressType::BILLING->value,
  ])
grim shore
#

Still getting that same error 😮‍💨

#

I'm not sure exactly what an InfoList is, but I'm not explicitly using one in anything I've set up so far

#

The form itself works fine if I were to create an address manually

grim shore
#

Unfortunately not. I keep getting that same error about InfoList

#

Which I don’t understand why because I’m not using an info list anywhere

grim shore
vivid void
# grim shore Any joy?

sorry for the delay.. try this

$customer = Customer::factory()->create();
$class = EditCustomer::class;

Livewire::test(AddressesRelationManager::class, [
    'ownerRecord' => $customer,
    'pageClass' => $class,
])
    ->assertTableActionExists(\Filament\Tables\Actions\CreateAction::class)
    ->mountTableAction(\Filament\Tables\Actions\CreateAction::class)
    ->setTableActionData([
        'line_1' => $line1 = 'Test Line 1',
        'line_2' => $line2 = 'Test Line 2',
        'city' => $city = 'Test City',
        'state' => $state = 'Test State',
        'postal_code' => $postalCode = 'TE1 1ST',
        'type' => $type = AddressType::BILLING->value,
    ])
    ->callMountedTableAction()
    ->assertHasNoTableActionErrors();
grim shore
#

No worries! I'm glad of the help ^^

#

Worked a treat - thank you! 🙂

#

It looks like it was assertHasNoFormErrors that was the issue. If I put that back in place of assertHasNoTableActionErrors then the InfoList error comes back. I thought because it's a form despite it being in a modal and not on a page that I could still use formFill, assertHasNoFormErrors, etc.

#

Really appreciate you taking the time to help with this 🙂

grim shore
#

I know I’ve marked this as solved already, but just had a thought: what if I had multiple relation managers on a resource? This works at the moment as there’s only one.