First Friction with Coverage and PHPStan

While building Sunny, I’ve been vaguely checking my code coverage and checking PHPstan and seeing what I’m “forced” to write to get to 100% coverage or to make stan happy. So far, everything it has found has been something I missed. I’ve encountered an instance where these tools encourage me to break my patterns. I probably wouldn’t have written a test for this without coverage or PHPstan.

Below is a computed property from the CreateRecipe component:

#[Computed]
public function previewUrl(): ?string
{
    if ($this->form->image) {
        return $this->form->image->temporaryUrl();
    }
}

Using the code above, the CreateRecipe class is 100% covered. However, PHPStan is angry that there isn’t a return statement.

To make stan happy, I added a return, however doing so decreased the code coverage because I hadn’t added a test specifically testing that a null can be returned.

So now the method looks like this:

#[Computed]
public function previewUrl(): ?string
{
    if ($this->form->image) {
        return $this->form->image->temporaryUrl();
    }

    return null;
}

This is now going to force me to write a test that the previewUrl() function can return null.

Adding the following test increased the coverage back to 100%:

test('previewUrl is null by default', function () {
    Livewire::test(CreateRecipe::class)
        ->assertOk()
        ->assertSet('previewUrl', null);
});

However, I think this test is useless since it tests the language, not my feature implementation.

Here are the classes as of December 22nd, 2024:

What do you think? Is the previewUrl is null be default test useless? How would you improve it?