<?php

namespace App\Tests\Integration;

use Illuminate\Http\Response;
use Illuminate\Testing\Assert as PHPUnit;
use App\Exceptions\DisplayException;
use Illuminate\Validation\ValidationException;
use Illuminate\Testing\TestResponse as IlluminateTestResponse;

class TestResponse extends IlluminateTestResponse
{
    /**
     * Overrides the default assert status logic to dump out the error to the
     * test output if it is caused by a 500 level error, and we were not specifically
     * look for that status response.
     */
    public function assertStatus($status): TestResponse
    {
        $actual = $this->getStatusCode();

        // Dump the response to the screen before making the assertion which is going
        // to fail so that debugging isn't such a nightmare.
        if ($actual !== $status && $status !== 500) {
            $this->dump();
            if (!is_null($this->exception) && !$this->exception instanceof DisplayException && !$this->exception instanceof ValidationException) {
                dump([
                    'exception_class' => get_class($this->exception),
                    'message' => $this->exception->getMessage(),
                    'trace' => $this->exception->getTrace(),
                ]);
            }
        }

        PHPUnit::assertSame($actual, $status, "Expected status code {$status} but received {$actual}.");

        return $this;
    }

    public function assertForbidden(): self
    {
        return self::assertStatus(Response::HTTP_FORBIDDEN);
    }
}
