diff --git a/resources/js/Pages/Categories/CreateEdit.vue b/resources/js/Pages/Categories/CreateEdit.vue
new file mode 100644
index 0000000..d9d948a
--- /dev/null
+++ b/resources/js/Pages/Categories/CreateEdit.vue
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+ Create
+
+
+
+
diff --git a/resources/js/Pages/Categories/Index.vue b/resources/js/Pages/Categories/Index.vue
new file mode 100644
index 0000000..d923406
--- /dev/null
+++ b/resources/js/Pages/Categories/Index.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+ Categories
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/js/Pages/Management/Dashboard.vue b/resources/js/Pages/Management/Dashboard.vue
index fc195d2..f963358 100644
--- a/resources/js/Pages/Management/Dashboard.vue
+++ b/resources/js/Pages/Management/Dashboard.vue
@@ -1,53 +1,15 @@
-
-
Dashboard
-
This is where you can manage your online store
+
Dashboard
+
This is where you can manage your online store
-
-
+ What to put here?
diff --git a/routes/store.php b/routes/store.php
index 94024df..453b38a 100644
--- a/routes/store.php
+++ b/routes/store.php
@@ -11,5 +11,14 @@
Route::delete('/profile', \App\Http\Controllers\Profile\DeleteProfileController::class)->name('destroy');
});
+ Route::middleware('role:admin,manager')->prefix('categories')->name('categories.')->group(function () {
+ Route::get('/', \App\Http\Controllers\Categories\IndexCategoryController::class)->name('index');
+ Route::get('/create', \App\Http\Controllers\Categories\CreateCategoryController::class)->name('create');
+ Route::post('/store', \App\Http\Controllers\Categories\StoreCategoryController::class)->name('store');
+ Route::get('/edit/{category}', \App\Http\Controllers\Categories\EditCategoryController::class)->name('edit');
+ Route::post('/update/{category}', \App\Http\Controllers\Categories\UpdateCategoryController::class)->name('update');
+ Route::delete('/delete/{category}', \App\Http\Controllers\Categories\DeleteCategoryController::class)->name('delete');
+ });
+
Route::post('/store/file', \App\Http\Controllers\Files\StoreFileController::class)->name('file.store');
});
diff --git a/tests/Http/Controllers/Categories/DeleteCategoryTest.php b/tests/Http/Controllers/Categories/DeleteCategoryTest.php
new file mode 100644
index 0000000..cc69055
--- /dev/null
+++ b/tests/Http/Controllers/Categories/DeleteCategoryTest.php
@@ -0,0 +1,47 @@
+category = Category::factory()->create();
+ }
+
+ /** @test */
+ public function must_be_authenticated()
+ {
+ $this->delete(route('categories.delete', $this->category))
+ ->assertRedirect(route('login'));
+ }
+
+ /** @test */
+ public function must_be_admin_or_manager()
+ {
+ $this->actingAs(User::factory()->create())
+ ->delete(route('categories.delete', $this->category), [])
+ ->assertForbidden();
+ }
+
+ /** @test */
+ public function can_delete_category()
+ {
+ $this->actingAs(User::factory()->admin()->create())
+ ->delete(route('categories.delete', $this->category))
+ ->assertRedirect()
+ ->assertSessionHas('success', 'Successfully deleted category!');
+
+ $this->assertDatabaseMissing('categories', [
+ 'name' => 'Some category',
+ ]);
+ }
+}
diff --git a/tests/Http/Controllers/Categories/StoreCategroryTest.php b/tests/Http/Controllers/Categories/StoreCategroryTest.php
new file mode 100644
index 0000000..9b1ec78
--- /dev/null
+++ b/tests/Http/Controllers/Categories/StoreCategroryTest.php
@@ -0,0 +1,78 @@
+post(route('categories.store'))
+ ->assertRedirect(route('login'));
+ }
+
+ /** @test */
+ public function must_be_admin_or_manager()
+ {
+ $this->actingAs(User::factory()->create())
+ ->postJson(route('categories.store'), [])
+ ->assertForbidden();
+ }
+
+ /** @test */
+ public function name_is_required()
+ {
+ $this->actingAs(User::factory()->admin()->create())
+ ->postJson(route('categories.store'), [
+ 'name' => null
+ ])
+ ->assertJsonValidationErrors([
+ 'name' => 'The name field is required.'
+ ]);
+ }
+
+ /** @test */
+ public function file_must_be_image()
+ {
+ $this->actingAs(User::factory()->admin()->create())
+ ->postJson(route('categories.store'), [
+ 'name' => 'Some category',
+ 'description' => 'Some description',
+ 'file' => 12345
+ ])
+ ->assertJsonValidationErrors([
+ 'file' => 'The file field must be an image.'
+ ]);
+ }
+
+ /** @test */
+ public function can_store_category()
+ {
+ Storage::fake();
+
+ $file = UploadedFile::fake()->image('file.jpg');
+
+ $this->actingAs(User::factory()->admin()->create())
+ ->postJson(route('categories.store'), [
+ 'name' => 'Some category',
+ 'description' => 'Some description',
+ 'file' => $file
+ ])
+ ->assertRedirect()
+ ->assertSessionHas('success', 'Successfully created new category!');
+
+ $file = File::first();
+
+ $this->assertDatabaseHas('categories', [
+ 'name' => 'Some category',
+ 'description' => 'Some description',
+ 'file_id' => $file->id
+ ]);
+ }
+}
diff --git a/tests/Http/Controllers/Categories/UpdateCategoryTest.php b/tests/Http/Controllers/Categories/UpdateCategoryTest.php
new file mode 100644
index 0000000..2bd2608
--- /dev/null
+++ b/tests/Http/Controllers/Categories/UpdateCategoryTest.php
@@ -0,0 +1,88 @@
+category = Category::factory()->create();
+ }
+
+ /** @test */
+ public function must_be_authenticated()
+ {
+ $this->post(route('categories.update', $this->category))
+ ->assertRedirect(route('login'));
+ }
+
+ /** @test */
+ public function must_be_admin_or_manager()
+ {
+ $this->actingAs(User::factory()->create())
+ ->postJson(route('categories.update', $this->category), [])
+ ->assertForbidden();
+ }
+
+ /** @test */
+ public function name_is_required()
+ {
+ $this->actingAs(User::factory()->admin()->create())
+ ->postJson(route('categories.update', $this->category), [
+ 'name' => null
+ ])
+ ->assertJsonValidationErrors([
+ 'name' => 'The name field is required.'
+ ]);
+ }
+
+ /** @test */
+ public function file_must_be_image()
+ {
+ $this->actingAs(User::factory()->admin()->create())
+ ->postJson(route('categories.update', $this->category), [
+ 'name' => 'Some category',
+ 'description' => 'Some description',
+ 'file' => 12345
+ ])
+ ->assertJsonValidationErrors([
+ 'file' => 'The file field must be an image.'
+ ]);
+ }
+
+ /** @test */
+ public function can_update_category()
+ {
+ Storage::fake();
+
+ $file = UploadedFile::fake()->image('file.jpg');
+
+ $this->actingAs(User::factory()->admin()->create())
+ ->postJson(route('categories.update', $this->category), [
+ 'name' => 'Some category',
+ 'description' => 'Some description',
+ 'file' => $file
+ ])
+ ->assertRedirect()
+ ->assertSessionHas('success', 'Successfully updated category!');
+
+ $file = File::first();
+
+ $this->assertDatabaseHas('categories', [
+ 'name' => 'Some category',
+ 'description' => 'Some description',
+ 'file_id' => $file->id
+ ]);
+ }
+}