File: //var/www/hobbyistgarage/vendor/inertiajs/inertia-laravel/tests/ResponseTest.php
<?php
namespace Inertia\Tests;
use Illuminate\Contracts\Support\Arrayable;
use Inertia\Response;
use Illuminate\View\View;
use Illuminate\Http\Request;
use Illuminate\Support\Fluent;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Collection;
use Illuminate\Http\Response as BaseResponse;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Http\Resources\Json\ResourceCollection;
class ResponseTest extends TestCase
{
public function test_server_response()
{
$request = Request::create('/user/123', 'GET');
$user = ['name' => 'Jonathan'];
$response = new Response('User/Edit', ['user' => $user], 'app', '123');
$response = $response->toResponse($request);
$view = $response->getOriginalContent();
$page = $view->getData()['page'];
$this->assertInstanceOf(BaseResponse::class, $response);
$this->assertInstanceOf(View::class, $view);
$this->assertSame('User/Edit', $page['component']);
$this->assertSame('Jonathan', $page['props']['user']['name']);
$this->assertSame('/user/123', $page['url']);
$this->assertSame('123', $page['version']);
$this->assertSame('<div id="app" data-page="{"component":"User\/Edit","props":{"user":{"name":"Jonathan"}},"url":"\/user\/123","version":"123"}"></div>'."\n", $view->render());
}
public function test_xhr_response()
{
$request = Request::create('/user/123', 'GET');
$request->headers->add(['X-Inertia' => 'true']);
$user = (object) ['name' => 'Jonathan'];
$response = new Response('User/Edit', ['user' => $user], 'app', '123');
$response = $response->toResponse($request);
$page = $response->getData();
$this->assertInstanceOf(JsonResponse::class, $response);
$this->assertSame('User/Edit', $page->component);
$this->assertSame('Jonathan', $page->props->user->name);
$this->assertSame('/user/123', $page->url);
$this->assertSame('123', $page->version);
}
public function test_resource_response()
{
$request = Request::create('/user/123', 'GET');
$request->headers->add(['X-Inertia' => 'true']);
$user = (object) ['name' => 'Jonathan'];
$resource = new class($user) extends JsonResource {
public static $wrap = null;
public function toArray($request)
{
return ['name' => $this->name];
}
};
$response = new Response('User/Edit', ['user' => $resource], 'app', '123');
$response = $response->toResponse($request);
$page = $response->getData();
$this->assertInstanceOf(JsonResponse::class, $response);
$this->assertSame('User/Edit', $page->component);
$this->assertSame('Jonathan', $page->props->user->name);
$this->assertSame('/user/123', $page->url);
$this->assertSame('123', $page->version);
}
public function test_lazy_resource_response()
{
$request = Request::create('/users', 'GET', ['page' => 1]);
$request->headers->add(['X-Inertia' => 'true']);
$users = Collection::make([
new Fluent(['name' => 'Jonathan']),
new Fluent(['name' => 'Taylor']),
new Fluent(['name' => 'Jeffrey']),
]);
$callable = function () use ($users) {
$page = new LengthAwarePaginator($users->take(2), $users->count(), 2);
return new class($page, JsonResource::class) extends ResourceCollection {
};
};
$response = new Response('User/Index', ['users' => $callable], 'app', '123');
$response = $response->toResponse($request);
$page = $response->getData();
$expected = [
'data' => $users->take(2),
'links' => [
'first' => '/?page=1',
'last' => '/?page=2',
'prev' => null,
'next' => '/?page=2',
],
'meta' => [
'current_page' => 1,
'from' => 1,
'last_page' => 2,
'path' => '/',
'per_page' => 2,
'to' => 2,
'total' => 3,
],
];
$this->assertInstanceOf(JsonResponse::class, $response);
$this->assertSame('User/Index', $page->component);
$this->assertSame(json_encode($expected), json_encode($page->props->users));
$this->assertSame('/users?page=1', $page->url);
$this->assertSame('123', $page->version);
}
public function test_arrayable_prop_response()
{
$request = Request::create('/user/123', 'GET');
$request->headers->add(['X-Inertia' => 'true']);
$user = (object) ['name' => 'Jonathan'];
$resource = new class($user) implements Arrayable {
public $user;
public function __construct($user)
{
$this->user = $user;
}
public function toArray()
{
return ['name' => $this->user->name];
}
};
$response = new Response('User/Edit', ['user' => $resource], 'app', '123');
$response = $response->toResponse($request);
$page = $response->getData();
$this->assertInstanceOf(JsonResponse::class, $response);
$this->assertSame('User/Edit', $page->component);
$this->assertSame('Jonathan', $page->props->user->name);
$this->assertSame('/user/123', $page->url);
$this->assertSame('123', $page->version);
}
public function test_xhr_partial_response()
{
$request = Request::create('/user/123', 'GET');
$request->headers->add(['X-Inertia' => 'true']);
$request->headers->add(['X-Inertia-Partial-Component' => 'User/Edit']);
$request->headers->add(['X-Inertia-Partial-Data' => 'partial']);
$user = (object) ['name' => 'Jonathan'];
$response = new Response('User/Edit', ['user' => $user, 'partial' => 'partial-data'], 'app', '123');
$response = $response->toResponse($request);
$page = $response->getData();
$props = get_object_vars($page->props);
$this->assertInstanceOf(JsonResponse::class, $response);
$this->assertSame('User/Edit', $page->component);
$this->assertFalse(isset($props['user']));
$this->assertCount(1, $props);
$this->assertSame('partial-data', $page->props->partial);
$this->assertSame('/user/123', $page->url);
$this->assertSame('123', $page->version);
}
}