Summer Sale! All accounts are 50% off this week.

seanmccabe's avatar

Tests Fail, but work in real-world

I'm pretty new to testing with PHPUnit, so perhaps it is me.

I've got a bunch of default tests provided by JetStream using Inertia, but whenever I run them, they all fail.

No specific error is given, just the assertion is false.

If I run the same thing in the real-world, it works, no issue.

Where can I begin to look at what is going wrong? I would assume given these are built in, they should be working.

Thanks

Example test:

class UpdateTeamNameTest extends TestCase
{
    use RefreshDatabase;

    public function test_team_names_can_be_updated()
    {
        $this->actingAs($user = User::factory()->withPersonalTeam()->create());

        $response = $this->put('/teams/' . $user->currentTeam->uuid, [
            'name' => 'Test Team',
        ]);

        $this->assertCount(1, $user->fresh()->ownedTeams);
        $this->assertEquals('Test Team', $user->currentTeam->fresh()->name);
    }
}
0 likes
11 replies
Sinnbeck's avatar

Which of the 2 assertions fail? What is the exact message?

seanmccabe's avatar

@Sinnbeck

$this->assertEquals('Test Team', $user->currentTeam->fresh()->name);

"Failed asserting that two strings are equal."

Output:

  --- Expected
  +++ Actual
  @@ @@
  -'Test Team'
  +'Wilhelmine Hill's Team'
tykus's avatar

@seanmccabe it seems that the put request is not working as expected; what is the result of the TestResponse; can you assert against the $response; or simply dump the response?

$response->dump();
seanmccabe's avatar

@tykus outputting a 404 Not Found

<!DOCTYPE html>\n
<html lang="en">\n
    <head>\n
        <meta charset="utf-8">\n
        <meta name="viewport" content="width=device-width, initial-scale=1">\n
\n
        <title>Not Found</title>\n
\n
        <style>\n
            /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}a{background-color:transparent}code{font-family:monospace,monospace;font-size:1em}[hidden]{display:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}a{color:inherit;text-decoration:inherit}code{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}svg,video{display:block;vertical-align:middle}video{max-width:100%;height:auto}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.flex{display:flex}.grid{display:grid}.hidden{display:none}.items-center{align-items:center}.justify-center{justify-content:center}.font-semibold{font-weight:600}.h-5{height:1.25rem}.h-8{height:2rem}.h-16{height:4rem}.text-sm{font-size:.875rem}.text-lg{font-size:1.125rem}.leading-7{line-height:1.75rem}.mx-auto{margin-left:auto;margin-right:auto}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-4{margin-top:1rem}.ml-4{margin-left:1rem}.mt-8{margin-top:2rem}.ml-12{margin-left:3rem}.-mt-px{margin-top:-1px}.max-w-xl{max-width:36rem}.max-w-6xl{max-width:72rem}.min-h-screen{min-height:100vh}.overflow-hidden{overflow:hidden}.p-6{padding:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pt-8{padding-top:2rem}.fixed{position:fixed}.relative{position:relative}.top-0{top:0}.right-0{right:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.text-center{text-align:center}.text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.uppercase{text-transform:uppercase}.underline{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tracking-wider{letter-spacing:.05em}.w-5{width:1.25rem}.w-8{width:2rem}.w-auto{width:auto}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@-webkit-keyframes 
ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@media (min-width:640px){.sm\:rounded-lg{border-radius:.5rem}.sm\:block{display:block}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:h-20{height:5rem}.sm\:ml-0{margin-left:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pt-0{padding-top:0}.sm\:text-left{text-align:left}.sm\:text-right{text-align:right}}@media (min-width:768px){.md\:border-t-0{border-top-width:0}.md\:border-l{border-left-width:1px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:px-8{padding-left:2rem;padding-right:2rem}}@media (prefers-color-scheme:dark){.dark\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.dark\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.dark\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.dark\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.dark\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}}\n
        </style>\n
\n
        <style>\n
            body {\n
                font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple 
Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";\n
            }\n
        </style>\n
    </head>\n
    <body class="antialiased">\n
        <div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center sm:pt-0">\n
            <div class="max-w-xl mx-auto sm:px-6 lg:px-8">\n
                <div class="flex items-center pt-8 sm:justify-start sm:pt-0">\n
                    <div class="px-4 text-lg text-gray-500 border-r border-gray-400 tracking-wider">\n
                        404                    </div>\n
\n
                    <div class="ml-4 text-lg text-gray-500 uppercase tracking-wider">\n
                        Not Found                    </div>\n
                </div>\n
            </div>\n
        </div>\n
    </body>\n
</html>\n
tykus's avatar

@seanmccabe okay, so Not Found should tell you that you either are using the wrong data (UUID?); or the Route is missing altogether!

seanmccabe's avatar

@tykus

That's what I thought, but the route is there (inertia.php) required once in web.php:

if (Jetstream::hasTeamFeatures()) {
	///...
	Route::put('/teams/{team}', [TeamController::class, 'update'])->name('teams.update');
	...///
}

Test outputted this url:

"/teams/0b86c334-5b75-3f9f-b3f9-fa10e5c4cc75" // tests\Feature\UpdateTeamNameTest.php:26

and the db is showing this (turned off refresh for a moment):

id	user_id		name												personal_team		uuid
3			3				Luna Koeplin PhD's Team						1					0b86c334-5b75-3f9f-b3f9-fa10e5c4cc75
tykus's avatar

@seanmccabe the only if teams feature is enabled; does config/jetstream.php have this line uncommented?

Features::teams(['invitations' => true]),

The first part of my comment above related to the use of uuid in the URL - this is non-standard AFAIK; what have you done to use UUID instead of id - did you update the route key name on the model?

// Team Model
public function getRouteKeyName()
{
    return 'uuid';
}

https://laravel.com/docs/9.x/routing#customizing-the-key

seanmccabe's avatar

@tykus

Features::teams(['invitations' => true]),

Yes it does.

I'm only partially using the uuid, only using the uuid where the user can see it, I haven't used it as the primary ID. So in the Controller for the team update, if just set it to look for the team based on the UUID instead.

/**
     * Update the given team's name.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  string  $teamId
     * @return \Illuminate\Http\RedirectResponse
     */
    public function update(Request $request, $teamId)
    {
        $team = Jetstream::newTeamModel()->where('uuid', $teamId)->firstOrFail();

        app(UpdatesTeamNames::class)->update($request->user(), $team, $request->all());

        return back(303);
    }

As per my OP, this works in the real-world without issue.

tykus's avatar

@seanmccabe did you override the TeamController; or are you editing vendor code? How is the Request finding it's way to this code above?

seanmccabe's avatar

@tykus I copied the original TeamController to App\Http\Controllers\JetStream\Inertia

In the Inertia routes file included in my web routes file updated to: use App\Http\Controllers\Jetstream\Inertia\TeamController;

jlrdw's avatar

@seanmccabe I usually use test to see places to refactor code. Not does "this" work. Your test is a case in point. Things worked for real. Will it come to a point where people will have to write test to "test the test".

But just an observation. But certain testing can reveal many areas to refactor.

Please or to participate in this conversation.