Testing modal form in resource relation

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,
]);
}
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,
]);
}
No description
19 Replies
Aethyrion
AethyrionOP2mo ago
Anyone able to point me in the right direction with this?
LeandroFerreira
LeandroFerreira2mo ago
try callMountedTableAction() instead of callTableAction('create')
Aethyrion
AethyrionOP2mo ago
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
Punyapal Shah
Punyapal Shah2mo ago
use setTableActionData at the place of fillForm
Aethyrion
AethyrionOP2mo ago
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();
$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
Aethyrion
AethyrionOP2mo ago
No description
Aethyrion
AethyrionOP2mo ago
Actually it is
No description
Punyapal Shah
Punyapal Shah2mo ago
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,
])
->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,
])
Aethyrion
AethyrionOP2mo ago
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
LeandroFerreira
LeandroFerreira2mo ago
Did you solve it?
Aethyrion
AethyrionOP2mo ago
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
LeandroFerreira
LeandroFerreira2mo ago
let me try that..
Aethyrion
AethyrionOP2mo ago
Any joy?
LeandroFerreira
LeandroFerreira2mo ago
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();
$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();
Aethyrion
AethyrionOP2mo ago
No worries! I'm glad of the help ^^
Aethyrion
AethyrionOP2mo ago
Worked a treat - thank you! 🙂
No description
Aethyrion
AethyrionOP2mo ago
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 🙂
LeandroFerreira
LeandroFerreira2mo ago
exactly ✌️
Aethyrion
AethyrionOP2mo ago
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.

Did you find this page helpful?