diff --git a/app/Http/Controllers/admin/FeedbackController.php b/app/Http/Controllers/admin/FeedbackController.php
new file mode 100644
index 0000000..f86a3cd
--- /dev/null
+++ b/app/Http/Controllers/admin/FeedbackController.php
@@ -0,0 +1,49 @@
+validated();
+ $feedback = new Feedback();
+
+ $feedback->contact = $validated['contact'];
+ $feedback->text = $validated['text'];
+ $feedback->status_id = $validated['status_id'];
+ $feedback->save();
+
+ return response()->json(["result" => "success"]);
+ }
+
+ public function edit(Feedback $feedback)
+ {
+ $feedbackStatuses = FeedbackStatus::pluck('name', 'id');
+ return view('admin.feedback.edit', compact('feedback', 'feedbackStatuses'));
+ }
+
+ public function update(UpdateFeedbackRequest $request, Feedback $feedback)
+ {
+ $validated = $request->validated();
+
+ $feedback->contact = $validated['contact'];
+ $feedback->text = $validated['text'];
+ $feedback->status_id = $validated['status_id'];
+ $feedback->save();
+
+ return redirect()->route('feedback.index');
+ }
+}
diff --git a/app/Http/Controllers/admin/FeedbackStatusController.php b/app/Http/Controllers/admin/FeedbackStatusController.php
new file mode 100644
index 0000000..30b5bfc
--- /dev/null
+++ b/app/Http/Controllers/admin/FeedbackStatusController.php
@@ -0,0 +1,55 @@
+validated();
+ $feedbackStatus = new FeedbackStatus();
+ $feedbackStatus->name = $validated['name'];
+ $feedbackStatus->save();
+
+ return redirect()->route('feedback_statuses.index');
+ }
+
+ public function edit(FeedbackStatus $feedbackStatus)
+ {
+ return view('admin.feedback_statuses.edit', compact('feedbackStatus'));
+ }
+
+ public function update(UpdateFeedbackStatusRequest $request, FeedbackStatus $feedbackStatus)
+ {
+ $validated = $request->validated();
+ $feedbackStatus->name = $validated['name'];
+ $feedbackStatus->save();
+
+ return redirect()->route('feedback_statuses.index');
+ }
+
+ public function destroy(FeedbackStatus $feedbackStatus)
+ {
+ if ($feedbackStatus->feedbacks()->exists()) {
+ return back();
+ }
+ $feedbackStatus->delete();
+ return redirect()->route('feedback_statuses.index');
+ }
+}
diff --git a/app/Http/Requests/admin/StoreFeedbackRequest.php b/app/Http/Requests/admin/StoreFeedbackRequest.php
new file mode 100644
index 0000000..4a87b35
--- /dev/null
+++ b/app/Http/Requests/admin/StoreFeedbackRequest.php
@@ -0,0 +1,22 @@
+ 'required|string|max:255',
+ 'text' => 'string|nullable',
+ 'status_id' => 'required|numeric|exists:feedback_statuses,id',
+ ];
+ }
+}
diff --git a/app/Http/Requests/admin/StoreFeedbackStatusRequest.php b/app/Http/Requests/admin/StoreFeedbackStatusRequest.php
new file mode 100644
index 0000000..c3b4372
--- /dev/null
+++ b/app/Http/Requests/admin/StoreFeedbackStatusRequest.php
@@ -0,0 +1,20 @@
+ 'required|string|max:255',
+ ];
+ }
+}
diff --git a/app/Http/Requests/admin/UpdateFeedbackRequest.php b/app/Http/Requests/admin/UpdateFeedbackRequest.php
new file mode 100644
index 0000000..edff568
--- /dev/null
+++ b/app/Http/Requests/admin/UpdateFeedbackRequest.php
@@ -0,0 +1,22 @@
+ 'required|string|max:255',
+ 'text' => 'string|nullable',
+ 'status_id' => 'required|numeric|exists:feedback_statuses,id',
+ ];
+ }
+}
diff --git a/app/Http/Requests/admin/UpdateFeedbackStatusRequest.php b/app/Http/Requests/admin/UpdateFeedbackStatusRequest.php
new file mode 100644
index 0000000..ea936a1
--- /dev/null
+++ b/app/Http/Requests/admin/UpdateFeedbackStatusRequest.php
@@ -0,0 +1,20 @@
+ 'required|string|max:255',
+ ];
+ }
+}
diff --git a/app/Models/Feedback.php b/app/Models/Feedback.php
new file mode 100644
index 0000000..067f639
--- /dev/null
+++ b/app/Models/Feedback.php
@@ -0,0 +1,25 @@
+belongsTo(FeedbackStatus::class);
+ }
+}
diff --git a/app/Models/FeedbackStatus.php b/app/Models/FeedbackStatus.php
new file mode 100644
index 0000000..a49a44b
--- /dev/null
+++ b/app/Models/FeedbackStatus.php
@@ -0,0 +1,23 @@
+hasMany('App\Models\Feedback', 'status_id');
+ }
+}
diff --git a/database/factories/FeedbackFactory.php b/database/factories/FeedbackFactory.php
new file mode 100644
index 0000000..f5ddc5a
--- /dev/null
+++ b/database/factories/FeedbackFactory.php
@@ -0,0 +1,18 @@
+ fake()->email(),
+ 'text' => fake()->text(),
+ 'status_id' => 1,
+ ];
+ }
+}
diff --git a/database/factories/FeedbackStatusFactory.php b/database/factories/FeedbackStatusFactory.php
new file mode 100644
index 0000000..995c3e4
--- /dev/null
+++ b/database/factories/FeedbackStatusFactory.php
@@ -0,0 +1,15 @@
+ fake()->name(),
+ ];
+ }
+}
diff --git a/database/migrations/2024_04_22_120816_create_feedback_statuses_table.php b/database/migrations/2024_04_22_120816_create_feedback_statuses_table.php
new file mode 100644
index 0000000..3eaec1c
--- /dev/null
+++ b/database/migrations/2024_04_22_120816_create_feedback_statuses_table.php
@@ -0,0 +1,28 @@
+id();
+ $table->string('name', 255);
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('feedback_statuses');
+ }
+};
diff --git a/database/migrations/2024_04_22_120817_create_feedback_table.php b/database/migrations/2024_04_22_120817_create_feedback_table.php
new file mode 100644
index 0000000..a6a0e20
--- /dev/null
+++ b/database/migrations/2024_04_22_120817_create_feedback_table.php
@@ -0,0 +1,30 @@
+id();
+ $table->string('contact', 255);
+ $table->text('text');
+ $table->foreignId('status_id')->constrained('feedback_statuses');
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ */
+ public function down(): void
+ {
+ Schema::dropIfExists('feedback');
+ }
+};
diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php
index c5ca847..53f700c 100644
--- a/database/seeders/DatabaseSeeder.php
+++ b/database/seeders/DatabaseSeeder.php
@@ -36,5 +36,10 @@ class DatabaseSeeder extends Seeder
AdmissionSeeder::class,
DocumentSeeder::class,
]);
+
+ $this->call([
+ FeedbackStatusSeeder::class,
+ FeedbackSeeder::class,
+ ]);
}
}
diff --git a/database/seeders/FeedbackSeeder.php b/database/seeders/FeedbackSeeder.php
new file mode 100644
index 0000000..37c591f
--- /dev/null
+++ b/database/seeders/FeedbackSeeder.php
@@ -0,0 +1,26 @@
+insert([
+ [
+ 'contact' => '79112223344',
+ 'text' => 'Мое новое обращение',
+ 'status_id' => 1,
+ ],
+ [
+ 'contact' => 'example@example.com',
+ 'text' => 'Мое новое обращение',
+ 'status_id' => 1,
+ ],
+ ]);
+ }
+}
diff --git a/database/seeders/FeedbackStatusSeeder.php b/database/seeders/FeedbackStatusSeeder.php
new file mode 100644
index 0000000..568ab07
--- /dev/null
+++ b/database/seeders/FeedbackStatusSeeder.php
@@ -0,0 +1,22 @@
+insert([
+ [
+ 'name' => 'создано',
+ ],
+ [
+ 'name' => 'в работе',
+ ],
+ ]);
+ }
+}
diff --git a/resources/views/admin/feedback/edit.blade.php b/resources/views/admin/feedback/edit.blade.php
new file mode 100644
index 0000000..fa14a31
--- /dev/null
+++ b/resources/views/admin/feedback/edit.blade.php
@@ -0,0 +1,56 @@
+@php use App\Helpers\PositionHelper; @endphp
+@extends('layouts.admin_layout')
+@section('content')
+ @auth()
+
+
+
Изменить Статус обращения
+ {{ Form::open(['url' => route('feedback.update', $feedback), 'method' => 'PATCH', 'files'=>'true', 'class' => 'needs-validation', 'novalidate']) }}
+
+
+
+ {{ Form::label('contact', 'Контакт', ['data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.feedback.contact')]) }}
+
+
+ {{ Form::text('contact', $feedback->contact, ['class' => 'form-control', 'data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.feedback.contact'), 'required', 'readonly' => ""]) }}
+
+
+ @if ($errors->any())
+ {{ $errors->first('contact') }}
+ @endif
+
+
+
+ {{ Form::label('text', 'Текст', ['data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.feedback.text')]) }}
+
+
+ {{ Form::textarea('text', $feedback->text, ['class' => 'form-control', 'data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.feedback.text'), 'required', 'readonly' => ""]) }}
+
+
+ @if ($errors->any())
+ {{ $errors->first('text') }}
+ @endif
+
+
+
+ {{ Form::label('status_id', 'Статус обращения', ['data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.feedback.status_id')]) }}
+
+
+ {{ Form::select('status_id', $feedbackStatuses, $feedback->status_id, ['class' => 'form-control', 'data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.feedback.status_id'), 'required']) }}
+
+
+ @if ($errors->any())
+ {{ $errors->first('text') }}
+ @endif
+
+
+
+ {{ Form::submit('Изменить', ['class' => 'btn btn-primary']) }}
+
+
+ {{ Form::close() }}
+
+
+ @endauth
+ @include('layouts.bootstrap_validation')
+@endsection
diff --git a/resources/views/admin/feedback/index.blade.php b/resources/views/admin/feedback/index.blade.php
new file mode 100644
index 0000000..696efd3
--- /dev/null
+++ b/resources/views/admin/feedback/index.blade.php
@@ -0,0 +1,35 @@
+@extends('layouts.admin_layout')
+@section('content')
+
+
Обр. связь
+
+
+
+
+
+ Контакт |
+ Текст |
+ Статус |
+ Создано |
+ Действия |
+
+
+
+ @foreach($feedbacks as $feedback)
+
+ {{ $feedback->contact }} |
+ {{ $feedback->text }} |
+ {{ $feedback->status->name }} |
+ {{ $feedback->created_at }} |
+ редактировать
+ |
+
+ @endforeach
+
+
+
+
+
+
+@endsection
diff --git a/resources/views/admin/feedback_statuses/create.blade.php b/resources/views/admin/feedback_statuses/create.blade.php
new file mode 100644
index 0000000..692aeae
--- /dev/null
+++ b/resources/views/admin/feedback_statuses/create.blade.php
@@ -0,0 +1,36 @@
+@php use App\Helpers\PositionHelper; @endphp
+@extends('layouts.admin_layout')
+@section('content')
+ @auth()
+
+
+
Создать Статус
+ {{ Form::open(['url' => route('feedback_statuses.store'), 'method' => 'POST', 'files'=>'true', 'class' => 'needs-validation', 'novalidate']) }}
+
+
+
+ {{ Form::label('name', 'Название', ['data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.news.name')]) }}
+ *
+
+
+ {{ Form::text('name', '', ['class' => 'form-control', 'data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.news.name'), 'required']) }}
+
+ Поле "Название" обязательно!
+
+
+
+ @if ($errors->any())
+ {{ $errors->first('name') }}
+ @endif
+
+
+
+ {{ Form::submit('Создать', ['class' => 'btn btn-primary']) }}
+
+
+ {{ Form::close() }}
+
+
+ @endauth
+ @include('layouts.bootstrap_validation')
+@endsection
diff --git a/resources/views/admin/feedback_statuses/edit.blade.php b/resources/views/admin/feedback_statuses/edit.blade.php
new file mode 100644
index 0000000..343d028
--- /dev/null
+++ b/resources/views/admin/feedback_statuses/edit.blade.php
@@ -0,0 +1,36 @@
+@php use App\Helpers\PositionHelper; @endphp
+@extends('layouts.admin_layout')
+@section('content')
+ @auth()
+
+
+
Изменить Новость
+ {{ Form::open(['url' => route('feedback_statuses.update', $feedbackStatus), 'method' => 'PATCH', 'files'=>'true', 'class' => 'needs-validation', 'novalidate']) }}
+
+
+
+ {{ Form::label('name', 'Название', ['data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.news.name')]) }}
+ *
+
+
+ {{ Form::text('name', $feedbackStatus->name, ['class' => 'form-control', 'data-bs-toggle' => "tooltip", 'data-bs-title' => __('tooltips.news.name'), 'required']) }}
+
+ Поле "Название" обязательно!
+
+
+
+ @if ($errors->any())
+ {{ $errors->first('name') }}
+ @endif
+
+
+
+ {{ Form::submit('Изменить', ['class' => 'btn btn-primary']) }}
+
+
+ {{ Form::close() }}
+
+
+ @endauth
+ @include('layouts.bootstrap_validation')
+@endsection
diff --git a/resources/views/admin/feedback_statuses/index.blade.php b/resources/views/admin/feedback_statuses/index.blade.php
new file mode 100644
index 0000000..01be06e
--- /dev/null
+++ b/resources/views/admin/feedback_statuses/index.blade.php
@@ -0,0 +1,36 @@
+@extends('layouts.admin_layout')
+@section('content')
+
+
+@endsection
diff --git a/resources/views/layouts/admin_layout.blade.php b/resources/views/layouts/admin_layout.blade.php
index 56fe108..2a4d278 100644
--- a/resources/views/layouts/admin_layout.blade.php
+++ b/resources/views/layouts/admin_layout.blade.php
@@ -3,10 +3,13 @@
-
-
-
-
+ @php
+ // phpcs:disable
+ echo '';
+ echo '';
+ echo '';
+ // phpcs:enable
+ @endphp
Панель администратора
@@ -49,6 +52,7 @@
@yield('content')
diff --git a/routes/admin.php b/routes/admin.php
index cd54653..fa4ff38 100644
--- a/routes/admin.php
+++ b/routes/admin.php
@@ -13,6 +13,8 @@ use App\Http\Controllers\admin\Catalog\DirectionController;
use App\Http\Controllers\admin\Catalog\EducationalInstitutionController;
use App\Http\Controllers\admin\Catalog\FacultyController;
use App\Http\Controllers\admin\DocumentController;
+use App\Http\Controllers\admin\FeedbackController;
+use App\Http\Controllers\admin\FeedbackStatusController;
use App\Http\Controllers\admin\UserController;
use App\Http\Controllers\NewsController;
use Rap2hpoutre\LaravelLogViewer\LogViewerController;
@@ -68,6 +70,9 @@ Route::middleware(['auth', 'verified'])->prefix('admin')->group(function () {
Route::resource('/direction_profiles', DirectionProfileController::class)
->scoped(['direction_profile' => 'slug']);
+ Route::resource('/feedback', FeedbackController::class)->only(['index', 'edit', 'update']);
+ Route::resource('/feedback_statuses', FeedbackStatusController::class);
+
Route::resources([
'/documents' => DocumentController::class,
'/users' => UserController::class,
diff --git a/routes/pages.php b/routes/pages.php
index 41dfb92..5b3c0ad 100644
--- a/routes/pages.php
+++ b/routes/pages.php
@@ -1,5 +1,6 @@
name('inostran');
Route::get('/magistr', [PageController::class, 'magistr'])->name('magistr');
+Route::post('/feedback', [FeedbackController::class, 'store'])->name('feedback.store');
-
-
-Route::get('/course', function () {
- return view('menu.course');
-})->name('course');
-
-Route::get('/applicant', function () {
- return view('menu.abitur');
-})->name('abitur');
-
-Route::get('/for-foreign-applicants', function () {
- return view('menu.inostrannym-abiturientam');
-})->name('inostrannym-abiturientam');
-
-Route::get('/paid_edu', function () {
- return view('menu.paid_edu');
-})->name('paid_edu');
-
-Route::get('/olympiads-for-schoolchildren', function () {
- return view('menu.olimpiady-dlya-shkolnikov');
-})->name('olimpiady-dlya-shkolnikov');
-
-Route::get('/training courses', function () {
- return view('menu.podgotovitelnye-kursy');
-})->name('podgotovitelnye-kursy');
+//Route::get('/course', function () {
+// return view('menu.course');
+//})->name('course');
+//
+//Route::get('/applicant', function () {
+// return view('menu.abitur');
+//})->name('abitur');
+//
+//Route::get('/for-foreign-applicants', function () {
+// return view('menu.inostrannym-abiturientam');
+//})->name('inostrannym-abiturientam');
+//
+//Route::get('/paid_edu', function () {
+// return view('menu.paid_edu');
+//})->name('paid_edu');
+//
+//Route::get('/olympiads-for-schoolchildren', function () {
+// return view('menu.olimpiady-dlya-shkolnikov');
+//})->name('olimpiady-dlya-shkolnikov');
+//
+//Route::get('/training courses', function () {
+// return view('menu.podgotovitelnye-kursy');
+//})->name('podgotovitelnye-kursy');
Route::get('/reception-screens', [PageController::class, 'index'])->name('reception-screens');
-Route::get('/web-consultations', function () {
- return view('menu.abitur.web-consultations');
-})->name('web-consultations');
-
-Route::get('/specialty-magistracy', function () {
- return view('menu.abitur.spetsialitet-magistratura');
-})->name('spetsialitet-magistratura');
-
-Route::get('/college', function () {
- return view('menu.abitur.kolledzh');
-})->name('kolledzh');
-
-Route::get('/paid-educational-services', function () {
- return view('menu.abitur.platnye-obrazovatelnye-uslugi');
-})->name('platnye-obrazovatelnye-uslugi');
-
-Route::get('/residency', function () {
- return view('menu.abitur.ordinatura');
-})->name('ordinatura');
-
-Route::get('/traineeship', function () {
- return view('menu.abitur.aspirantura');
-})->name('aspirantura');
-
-Route::get('/video-materials-for-applicants', function () {
- return view('menu.abitur.videomaterialy-dlya-postupayushchikh');
-})->name('videomaterialy-dlya-postupayushchikh');
-
-Route::get('/international-activity', function () {
- return view('menu.inostrannym-abiturientam.mezhdunarodnaya-deyatelnost');
-})->name('mezhdunarodnaya-deyatelnost');
-
-Route::get('/general-information', function () {
- return view('menu.inostrannym-abiturientam.obshchie-svedeniya');
-})->name('obshchie-svedeniya');
-
-Route::get('/departments-list', function () {
- return view('menu.inostrannym-abiturientam.kafedry');
-})->name('kafedry');
-
-Route::get('/international-education-center', function () {
- return view('menu.inostrannym-abiturientam.tsentr-mezhdunarodnogo-obrazovaniya');
-})->name('tsentr-mezhdunarodnogo-obrazovaniya');
-
-Route::get('/academic-mobility-and-international-cooperation', function () {
- return view('menu.inostrannym-abiturientam.akademicheskaya-mobilnost-i-mezhdunarodnoe-sotrudnichestvo');
-})->name('akademicheskaya-mobilnost-i-mezhdunarodnoe-sotrudnichestvo');
+//Route::get('/web-consultations', function () {
+// return view('menu.abitur.web-consultations');
+//})->name('web-consultations');
+//
+//Route::get('/specialty-magistracy', function () {
+// return view('menu.abitur.spetsialitet-magistratura');
+//})->name('spetsialitet-magistratura');
+//
+//Route::get('/college', function () {
+// return view('menu.abitur.kolledzh');
+//})->name('kolledzh');
+//
+//Route::get('/paid-educational-services', function () {
+// return view('menu.abitur.platnye-obrazovatelnye-uslugi');
+//})->name('platnye-obrazovatelnye-uslugi');
+//
+//Route::get('/residency', function () {
+// return view('menu.abitur.ordinatura');
+//})->name('ordinatura');
+//
+//Route::get('/traineeship', function () {
+// return view('menu.abitur.aspirantura');
+//})->name('aspirantura');
+//
+//Route::get('/video-materials-for-applicants', function () {
+// return view('menu.abitur.videomaterialy-dlya-postupayushchikh');
+//})->name('videomaterialy-dlya-postupayushchikh');
+//
+//Route::get('/international-activity', function () {
+// return view('menu.inostrannym-abiturientam.mezhdunarodnaya-deyatelnost');
+//})->name('mezhdunarodnaya-deyatelnost');
+//
+//Route::get('/general-information', function () {
+// return view('menu.inostrannym-abiturientam.obshchie-svedeniya');
+//})->name('obshchie-svedeniya');
+//
+//Route::get('/departments-list', function () {
+// return view('menu.inostrannym-abiturientam.kafedry');
+//})->name('kafedry');
+//
+//Route::get('/international-education-center', function () {
+// return view('menu.inostrannym-abiturientam.tsentr-mezhdunarodnogo-obrazovaniya');
+//})->name('tsentr-mezhdunarodnogo-obrazovaniya');
+//
+//Route::get('/academic-mobility-and-international-cooperation', function () {
+// return view('menu.inostrannym-abiturientam.akademicheskaya-mobilnost-i-mezhdunarodnoe-sotrudnichestvo');
+//})->name('akademicheskaya-mobilnost-i-mezhdunarodnoe-sotrudnichestvo');
diff --git a/tests/Feature/admin/FeedbackStatusTest.php b/tests/Feature/admin/FeedbackStatusTest.php
new file mode 100644
index 0000000..4c13598
--- /dev/null
+++ b/tests/Feature/admin/FeedbackStatusTest.php
@@ -0,0 +1,92 @@
+status = FeedbackStatus::factory()->create();
+ $this->data = FeedbackStatus::factory()->make()->only([
+ 'name',
+ ]);
+
+ $this->user = User::factory()->create([
+ 'name' => 'admin',
+ 'email' => 'test@example.com',
+ 'password' => 123456
+ ]);
+ }
+
+ public function testIndexFeedbackStatusPage(): void
+ {
+ $response = $this->actingAs($this->user)
+ ->withSession(['banned' => false])
+ ->get(route('feedback_statuses.index'));
+
+ $response->assertOk();
+ }
+
+ public function testCreateFeedbackStatusPage(): void
+ {
+ $response = $this->actingAs($this->user)
+ ->withSession(['banned' => false])
+ ->get(route('feedback_statuses.create'));
+
+ $response->assertOk();
+ }
+
+ public function testStoreFeedbackStatus(): void
+ {
+ $file = UploadedFile::fake()->create('fake.jpg', 100);
+ $response = $this->actingAs($this->user)
+ ->withSession(['banned' => false])
+ ->post(route('feedback_statuses.store'), $this->data);
+
+ $response->assertRedirect(route('feedback_statuses.index'));
+
+ $this->assertDatabaseHas('feedback_statuses', $this->data);
+ }
+
+ public function testEditFeedbackStatusPage(): void
+ {
+ $response = $this->actingAs($this->user)
+ ->withSession(['banned' => false])
+ ->get(route('feedback_statuses.edit', $this->status));
+
+ $response->assertOk();
+ }
+
+ public function testUpdateFeedbackStatus(): void
+ {
+ $response = $this->actingAs($this->user)
+ ->withSession(['banned' => false])
+ ->patch(route('feedback_statuses.update', $this->status), $this->data);
+
+ $response->assertRedirect(route('feedback_statuses.index'));
+
+ $this->assertDatabaseHas('feedback_statuses', $this->data);
+ }
+
+ public function testDestroyFeedbackStatus(): void
+ {
+ $response = $this->actingAs($this->user)
+ ->withSession(['banned' => false])
+ ->delete(route('feedback_statuses.destroy', $this->status));
+
+ $response->assertRedirect(route('feedback_statuses.index'));
+
+ $this->assertDatabaseMissing('feedback_statuses', $this->status->toArray());
+ }
+}
diff --git a/tests/Feature/admin/FeedbackTest.php b/tests/Feature/admin/FeedbackTest.php
new file mode 100644
index 0000000..671bbe0
--- /dev/null
+++ b/tests/Feature/admin/FeedbackTest.php
@@ -0,0 +1,75 @@
+feedbackStatus = FeedbackStatus::factory()->create();
+ $this->feedback = Feedback::factory()->create();
+ $this->data = Feedback::factory()->make()->only([
+ 'contact',
+ 'text',
+ 'status_id',
+ ]);
+
+ $this->user = User::factory()->create([
+ 'name' => 'admin',
+ 'email' => 'test@example.com',
+ 'password' => 123456
+ ]);
+ }
+
+ public function testIndexFeedbacksPage(): void
+ {
+ $response = $this->actingAs($this->user)
+ ->withSession(['banned' => false])
+ ->get(route('feedback.index'));
+
+ $response->assertOk();
+ }
+
+ public function testStoreFeedback(): void
+ {
+ $response = $this->actingAs($this->user)
+ ->withSession(['banned' => false])
+ ->post(route('feedback.store'), $this->data);
+
+ $response->assertJson(["result" => "success"]);
+
+ $this->assertDatabaseHas('feedback', $this->data);
+ }
+
+ public function testEditFeedbackPage(): void
+ {
+ $response = $this->actingAs($this->user)
+ ->withSession(['banned' => false])
+ ->get(route('feedback.edit', $this->feedback));
+
+ $response->assertOk();
+ }
+
+ public function testUpdateFeedback(): void
+ {
+ $response = $this->actingAs($this->user)
+ ->withSession(['banned' => false])
+ ->patch(route('feedback.update', $this->feedback), $this->data);
+
+ $response->assertRedirect(route('feedback.index'));
+
+ $this->assertDatabaseHas('feedback', $this->data);
+ }
+}
diff --git a/tests/Feature/admin/catalog/NewsTest.php b/tests/Feature/admin/NewsTest.php
similarity index 95%
rename from tests/Feature/admin/catalog/NewsTest.php
rename to tests/Feature/admin/NewsTest.php
index c384b42..9cbc7d0 100644
--- a/tests/Feature/admin/catalog/NewsTest.php
+++ b/tests/Feature/admin/NewsTest.php
@@ -1,10 +1,7 @@