Api Testing With Laravel 5.1 (jwt-auth)
<?php
namespace Tests\Api\Admin;
use App\Track;
use Tests\Api\TestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;
class TrackTest extends TestCase
{
use DatabaseMigrations;
/** @test */
public function it_should_list_tracks()
{
factory(Track::class, 3)->create();
$this->actingAsAdmin()
->get("api/admin/tracks")
->seeStatusCode(200)
->assertCount(3, json_decode($this->response->getContent()));
}
/** @test */
public function it_should_create_tracks()
{
$data = ['name' => 'FooBar'];
$this->actingAsAdmin()
->post('api/admin/tracks', $data)
->seeStatusCode(200)
->seeInDatabase('tracks', ['name' => 'FooBar']);
}
/** @test */
public function it_should_update_tracks()
{
$track = factory(Track::class)->create(['name' => 'FooBar']);
$data = ['name' => 'FooBarBaz'];
$this->actingAsAdmin()
->post("api/admin/tracks/{$track->id}", $data)
->seeStatusCode(200)
->seeInDatabase('tracks', ['name' => 'FooBarBaz']);
}
/** @test */
public function it_should_delete_tracks()
{
$track = factory(Track::class)->create(['name' => 'FooBar']);
$this->actingAsAdmin()
->delete("api/admin/tracks/{$track->id}")
->seeStatusCode(204)
->notSeeInDatabase('tracks', ['id' => $track->id]);
}
}
<?php
namespace Tests\Api;
use App\User;
use Tests\TestCase as BaseTestCase;
use Illuminate\Contracts\Auth\Authenticatable as UserContract;
class TestCase extends BaseTestCase
{
/**
* @var User
*/
protected $user;
/**
* Set the currently logged in user for the application.
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param string|null $driver
* @return $this
*/
public function actingAs(UserContract $user, $driver = null)
{
$this->user = $user;
return $this;
}
/**
* Call the given URI and return the Response.
*
* @param string $method
* @param string $uri
* @param array $parameters
* @param array $cookies
* @param array $files
* @param array $server
* @param string $content
* @return \Illuminate\Http\Response
*/
public function call($method, $uri, $parameters = [], $cookies = [], $files = [], $server = [], $content = null)
{
if ($this->user) {
$server['HTTP_AUTHORIZATION'] = 'Bearer ' . \JWTAuth::fromUser($this->user);
}
$server['HTTP_ACCEPT'] = 'application/json';
return parent::call($method, $uri, $parameters, $cookies, $files, $server, $content);
}
/**
* @return $this
*/
protected function actingAsAdmin()
{
return $this->actingAs(factory(User::class, 'admin')->create());
}
}