testing improvements

This commit is contained in:
punkfairie 2025-02-25 18:42:57 -08:00
parent 7ec1c2b7f0
commit 71d401b138
Signed by: punkfairie
GPG key ID: B3C5488E9A1A7CA6
2 changed files with 74 additions and 122 deletions

View file

@ -2,7 +2,9 @@
use App\Http\Controllers\CategoryController; use App\Http\Controllers\CategoryController;
use App\Models\Category; use App\Models\Category;
use App\Models\User; use function Pest\Laravel\delete;
use function Pest\Laravel\get;
use function Pest\Laravel\patch;
covers(CategoryController::class); covers(CategoryController::class);
@ -11,54 +13,39 @@
describe('categories.index', function () { describe('categories.index', function () {
test('can be rendered to guests', function () { test('can be rendered to guests', function () {
$response = $this->get(route('categories.index')); get(route('categories.index'))->assertOk();
$response->assertOk();
}); });
test('can be rendered to logged in users', function () { test('can be rendered to logged in users', function () {
$user = User::factory()->create(); asAdmin()->get(route('categories.index'))->assertOk();
$response = $this->actingAs($user)->get(route('categories.index'));
$response->assertOk();
}); });
test('contains categories', function () { test('contains categories', function () {
$response = $this->get(route('categories.index')); $response = get(route('categories.index'));
$response->assertViewHas('categories', Category::all());
expect($response['categories']) expect($response['categories'])
->toBeEloquentCollection() ->toBeEloquentCollection()
->toContainOnlyInstancesOf(Category::class); ->toContainOnlyInstancesOf(Category::class)
->toEqual(Category::all());
}); });
test('contains trashedCategories', function () { test('contains trashedCategories', function () {
$response = $this->get(route('categories.index')); $response = get(route('categories.index'));
$response->assertViewHas( expect($response['trashedCategories'])
'trashedCategories',
Category::onlyTrashed()->get()
);
expect($response['categories'])
->toBeEloquentCollection() ->toBeEloquentCollection()
->toContainOnlyInstancesOf(Category::class); ->toContainOnlyInstancesOf(Category::class)
->toEqual(Category::onlyTrashed()->get());
}); });
}); });
describe('categories.create', function () { describe('categories.create', function () {
test("can't be rendered to guests", function () { test("can't be rendered to guests", function () {
$response = $this->get(route('categories.create')); get(route('categories.create'))->assertForbidden();
$response->assertForbidden();
}); });
test('can be rendered to logged in users', function () { test('can be rendered to logged in users', function () {
$user = User::factory()->create(); asAdmin()->get(route('categories.create'))->assertOk();
$response = $this->actingAs($user)->get(route('categories.create'));
$response->assertOk();
}); });
}); });
@ -66,90 +53,77 @@
test("can't be accessed by guests", function () { test("can't be accessed by guests", function () {
$category = Category::factory()->make(); $category = Category::factory()->make();
$response = $this->post( $this->post(
route('categories.store'), route('categories.store'),
['name' => $category->name] ['name' => $category->name]
); )->assertForbidden();
$response->assertForbidden();
expect($category)->not->toMatchDatabaseRecord(); expect($category)->not->toMatchDatabaseRecord();
}); });
test('can be accessed by logged in users', function () { test('can be accessed by logged in users', function () {
$user = User::factory()->create();
$category = Category::factory()->make(); $category = Category::factory()->make();
$response = $this->actingAs($user)->post( asAdmin()->post(
route('categories.store'), route('categories.store'),
['name' => $category->name] ['name' => $category->name]
); )->assertRedirect(route('categories.index'));
$response->assertRedirect(route('categories.index', absolute: false));
expect($category)->toMatchDatabaseRecord(); expect($category)->toMatchDatabaseRecord();
}); });
test('stores valid categories', function (string $name) { test('stores valid categories', function (string $name) {
$user = User::factory()->create();
$category = Category::factory()->make(['name' => $name]); $category = Category::factory()->make(['name' => $name]);
$response = $this->actingAs($user)->post( asAdmin()->post(
route('categories.store'), route('categories.store'),
['name' => $name] ['name' => $name]
); )->assertRedirect(route('categories.index'));
$response->assertRedirect(route('categories.index', absolute: false));
expect($category)->toMatchDatabaseRecord(); expect($category)->toMatchDatabaseRecord();
})->with('valid-values'); })->with('valid-values');
test('does not store invalid categories', function (mixed $name) { test('does not store invalid categories', function (mixed $name) {
$user = User::factory()->create();
$category = Category::factory()->make(['name' => $name]); $category = Category::factory()->make(['name' => $name]);
$response = $this->actingAs($user)->post( asAdmin()->post(
route('categories.store'), route('categories.store'),
['name' => $name], ['name' => $name],
); )->assertRedirect();
$response->assertRedirect();
expect($category)->not->toMatchDatabaseRecord(); expect($category)->not->toMatchDatabaseRecord();
})->with('invalid-values'); })->with('invalid-values');
}); });
describe('categories.show', function () { describe('categories.show', function () {
test('can be rendered to guests', function () { test('can be rendered to guests', function () {
$category = Category::factory()->create(); get(route('categories.show', Category::factory()->create()))
->assertOk();
$response = $this->get(route('categories.show', $category));
$response->assertOk();
}); });
test('can be rendered to logged in users', function () { test('can be rendered to logged in users', function () {
$user = User::factory()->create(); asAdmin()
$category = Category::factory()->create(); ->get(route('categories.show', Category::factory()->create()))
->assertOk();
$response = $this
->actingAs($user)
->get(route('categories.show', $category));
$response->assertOk();
}); });
test('contains the category', function () { test('contains the category', function () {
$category = Category::factory()->create(); $category = Category::factory()->create();
$response = $this->get(route('categories.show', $category)); $response = get(route('categories.show', $category));
$response->assertViewHas('category', $category); expect($response['category'])
->id->toBe($category->id)
->name->toBe($category->name);
}); });
test('can show trashed categories', function () { test('can show trashed categories', function () {
$category = Category::factory()->trashed()->create(); $category = Category::factory()->trashed()->create();
$response = $this->get(route('categories.show', $category)); $response = get(route('categories.show', $category));
$response->assertViewHas('category', $category); // @formatter:off
expect($category)->toBeSoftDeleted(); expect($response['category'])
->id->toBe($category->id)
->name->toBe($category->name)
->and($category)->toBeSoftDeleted();
// @formatter:on
}); });
}); });
@ -157,31 +131,26 @@
test("can't be rendered to guests", function () { test("can't be rendered to guests", function () {
$category = Category::factory()->create(); $category = Category::factory()->create();
$response = $this->get(route('categories.edit', $category)); get(route('categories.edit', $category))
->assertForbidden();
$response->assertForbidden();
}); });
test('can be rendered to logged in users', function () { test('can be rendered to logged in users', function () {
$user = User::factory()->create();
$category = Category::factory()->create(); $category = Category::factory()->create();
$response = $this asAdmin()
->actingAs($user) ->get(route('categories.edit', $category))
->get(route('categories.edit', $category)); ->assertOk();
$response->assertOk();
}); });
test('contains the category', function () { test('contains the category', function () {
$user = User::factory()->create();
$category = Category::factory()->create(); $category = Category::factory()->create();
$response = $this $response = asAdmin()->get(route('categories.edit', $category));
->actingAs($user)
->get(route('categories.edit', $category));
$response->assertViewHas('category', $category); expect($response['category'])
->id->toBe($category->id)
->name->toBe($category->name);
}); });
}); });
@ -190,79 +159,64 @@
$category = Category::factory()->create(); $category = Category::factory()->create();
$updated = Category::factory()->make(); $updated = Category::factory()->make();
$response = $this->patch(route('categories.update', $category), [ patch(
'name' => $updated->name route('categories.update', $category),
]); ['name' => $updated->name]
)->assertForbidden();
$response->assertForbidden();
expect($category)->toBeInDatabaseExactly(); expect($category)->toBeInDatabaseExactly();
}); });
test('can be accessed by logged in users', function () { test('can be accessed by logged in users', function () {
$user = User::factory()->create();
$category = Category::factory()->create(); $category = Category::factory()->create();
$updated = Category::factory()->make(); $updated = Category::factory()->make();
$response = $this asAdmin()->patch(
->actingAs($user) route('categories.update', $category),
->patch(route('categories.update', $category), [ ['name' => $updated->name]
'name' => $updated->name )->assertRedirect(route('categories.index', absolute: false));
]);
$category->refresh(); $category->refresh();
$response->assertRedirect(route('categories.index', absolute: false));
expect($category)->toMatchObject($updated); expect($category)->toMatchObject($updated);
}); });
test('updates categories with valid values', function (string $name) { test('updates categories with valid values', function (string $name) {
$user = User::factory()->create();
$category = Category::factory()->create(); $category = Category::factory()->create();
$response = $this asAdmin()->patch(
->actingAs($user) route('categories.update', $category),
->patch(route('categories.update', $category), [ ['name' => $name]
'name' => $name )->assertRedirect(route('categories.index', absolute: false));
]);
$category->refresh(); $category->refresh();
$response->assertRedirect(route('categories.index', absolute: false));
expect($category->name)->toEqual($name); expect($category->name)->toEqual($name);
})->with('valid-values'); })->with('valid-values');
test( test(
'does not update categories with invalid values', 'does not update categories with invalid values',
function (mixed $name) { function (mixed $name) {
$user = User::factory()->create();
$category = Category::factory()->create(); $category = Category::factory()->create();
$response = $this asAdmin()->patch(
->actingAs($user) route('categories.update', $category),
->patch(route('categories.update', $category), [ ['name' => $name]
'name' => $name )->assertRedirect();
]);
$updated = Category::find($category->id); $updated = Category::find($category->id);
$response->assertRedirect();
expect($updated->name)->toEqual($category->name); expect($updated->name)->toEqual($category->name);
} }
)->with('invalid-values'); )->with('invalid-values');
test('restores trashed categories', function () { test('restores trashed categories', function () {
$user = User::factory()->create();
$category = Category::factory()->trashed()->create(); $category = Category::factory()->trashed()->create();
$response = $this asAdmin()
->actingAs($user)
->patch(route('categories.update', $category), [ ->patch(route('categories.update', $category), [
'restore' => 1 'restore' => 1
]); ])->assertRedirect();
$category->refresh(); $category->refresh();
$response->assertRedirect();
expect($category)->not->toBeSoftDeleted(); expect($category)->not->toBeSoftDeleted();
}); });
}); });
@ -271,21 +225,17 @@ function (mixed $name) {
test("can't be accessed by guests", function () { test("can't be accessed by guests", function () {
$category = Category::factory()->create(); $category = Category::factory()->create();
$response = $this->delete(route('categories.destroy', $category)); delete(route('categories.destroy', $category))
->assertForbidden();
$response->assertForbidden();
expect($category)->not->toBeSoftDeleted(); expect($category)->not->toBeSoftDeleted();
}); });
test('can be accessed by logged in users', function () { test('can be accessed by logged in users', function () {
$user = User::factory()->create();
$category = Category::factory()->create(); $category = Category::factory()->create();
$response = $this asAdmin()
->actingAs($user) ->delete(route('categories.destroy', $category))
->delete(route('categories.destroy', $category)); ->assertRedirect(route('categories.index', absolute: false));
$response->assertRedirect(route('categories.index', absolute: false));
expect($category)->toBeSoftDeleted(); expect($category)->toBeSoftDeleted();
}); });
}); });

View file

@ -11,8 +11,10 @@
| |
*/ */
use App\Models\User;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Pest\Expectation; use Pest\Expectation;
use Tests\TestCase;
use function Pest\Laravel\assertDatabaseHas; use function Pest\Laravel\assertDatabaseHas;
use function Pest\Laravel\assertModelExists; use function Pest\Laravel\assertModelExists;
@ -82,7 +84,7 @@ function (Closure $next, mixed $expected) {
| |
*/ */
function something() function asAdmin(): TestCase
{ {
// .. return test()->actingAs(User::factory()->create());
} }