Search code examples
phplaravelgithubphpunitgithub-actions

Github Laravel workflow getting invalid JSON from routes


For the automated testing of a laravel API I am using the 'laravel' action on github actions, the one made by github actions. The tests keep failing telling me invalid JSON returned from route, expected response code 200 but got 500, cannot read property status on null and cannot find in json

I'm using laravel sanctum. Could it be a csrf-token problem?

My action yml: https://gist.github.com/I2EJeffrey/77df8faac1b0f86623e2e4449f98d858

My response function:

     * success response method.
     *
     * @return \Illuminate\Http\Response
     */
    public function sendResponse($result, $message, $code = 200)
    {
        $response = [
            'success' => true,
            'data'    => $result, // result is most often one or 2 arrays
            'message' => $message,
        ];
        return response()->json($response, 200);
    }

Example test:

    public function testSuccessfullyCreateAccommodationType()
    {
        $this->login(); // Login function that lots of tests need.

        $response = $this->postJson('/api/v5/accommodations/1/types', ['accommodation_name'=>$this->createName()]);

        $response
        ->assertJsonFragment(['success' => true])
        ->assertJsonStructure(['success', 'data' => 
        [], 'message']); // The array is filled with keys
    }

EDIT: 2 errors that I got by using withoutExceptionHandling: https://gist.github.com/I2EJeffrey/da23bfbdf5fba155456bd799a34f6276

EDIT 2: I also get the following warning: TTY mode requires /dev/tty to be read/writable.

EDIT 3: The client model and the client seeder. Whenever I run the tests a mysql docker container starts that gets a db migrated and seeded into it: https://gist.github.com/I2EJeffrey/39c779df217c9a75a7569f6fa3957d77 https://gist.github.com/I2EJeffrey/41cbbdba8025d38547059d3a6f4d4392


Solution

  • My problem was that the DB didn't get seeded due to not having added $this->call(ClientSeeder::class); to the DatabaseSeeder. Which caused the routes to return null and thus wrong json.