@mohamedabdalla I'm not familiar with the Pest browser testing, but you could start with an intermediate test and setup your form parameters and post to the endpoint. This will at least help you work out on which side of the divide your test problem is occurring.
PEST Browser Test Doesn't Create Record, but Manual Testing Works
Hi everyone,
I'm running into an issue with a PEST browser test that I can't figure out.
The feature works perfectly when I test it manually in the browser, but the browser test fails because the record is never created.
Test
it('create idea', function () {
$this->actingAs($user = User::factory()->create());
$title = 'some test title';
$description = 'some test description';
$status = 'in_progress';
visit('/ideas')
->click('@create-idea-button')
->fill('title', $title)
->click('@status-button-'.$status)
->fill('description', $description)
->fill('@new-step-input', 'some step description')
->click('@add-step-button')
->fill('@new-link-input', 'https://example.com')
->click('@add-link-button')
->fill('@new-link-input', 'https://example2.com')
->click('@add-link-button')
->click('Create')
->assertPathIs('/ideas');
expect($user->ideas()->count())->toBe(1);
});
The assertion fails:
Expected: 1 Actual: 0
So it looks like the form submission never creates the Idea.
Controller
public function store(StoreIdeaRequest $request, CreateIdea $action)
{
$action->handle($request->safe()->all());
return to_route('idea.index')
->with('success', 'Idea created successfully.');
}
Action
class CreateIdea
{
public function __construct(
#[CurrentUser] protected User $user
) {}
public function handle(array $attributes): void
{
$data = collect($attributes)->only([
'title',
'description',
'status',
'links',
])->toArray();
if ($attributes['image'] ?? false) {
$data['image_path'] = $attributes['image']->store('ideasImages', 'public');
}
$steps = collect($attributes['steps'] ?? [])
->map(fn ($step) => ['description' => $step]);
DB::transaction(function () use ($steps, $data) {
$idea = $this->user->ideas()->create($data);
$idea->steps()->createMany($steps);
});
}
}
Form
The form is a normal POST form, but it uses Alpine.js to manage the dynamic steps[] and links[] inputs.
The submit button is:
<button type="submit" class="btn btn-primary">
Create
</button>
What I've verified
- The feature works correctly when used manually in the browser.
- The browser test reaches
assertPathIs('/ideas'). - No Idea record is
created ($user->ideas()->count() returns 0). - Earlier I also saw the exception:
No query results for model [App\Models\Idea]
it('create idea', function () {
$this->actingAs($user = User::factory()->create());
$title = 'some test title';
$description = 'some test description';
$status = 'in_progress';
visit('/ideas')
->click('@create-idea-button')
->fill('title', $title)
->click('@status-button-'.$status)
->fill('description', $description)
->fill('@new-step-input', 'some step description')
->click('@add-step-button')
->fill('@new-link-input', 'https://example.com')
->click('@add-link-button')
->fill('@new-link-input', 'https://example2.com')
->click('@add-link-button')
->click('Create')
->assertPathIs('/ideas');
$idea = $user->ideas()->sole();
expect($idea->title)->toBe($title)
->and($idea->description)->toBe($description)
->and($idea->status->value)->toBe($status)
->and($idea->links->getArrayCopy())->toBe([
'https://example.com',
'https://example2.com',
]);
expect($idea->steps)->toHaveCount(1);
});
which I now suspect is just a consequence of the record never being created.
Has anyone experienced this with PEST Browser Testing? Is there something about authentication, Alpine.js updates, form submission, or browser sessions that I might be missing?
Any suggestions would be greatly appreciated.
Please or to participate in this conversation.