From 50671884dd819dc24d3401330e19734e6ffc37d8 Mon Sep 17 00:00:00 2001 From: sindoring Date: Tue, 28 Jul 2026 15:07:04 +0400 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20=D0=BD=D0=BE=D0=B2=D0=BE=D1=81=D1=82=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../js/Pages/Admin/Components/NewsForm.vue | 8 +++-- tests/Feature/AdminNewsFeatureTest.php | 36 +++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/resources/js/Pages/Admin/Components/NewsForm.vue b/resources/js/Pages/Admin/Components/NewsForm.vue index 1eb2452..cc08f08 100644 --- a/resources/js/Pages/Admin/Components/NewsForm.vue +++ b/resources/js/Pages/Admin/Components/NewsForm.vue @@ -19,15 +19,19 @@ const form = useForm({ }); function submit() { + const hasImage = props.allowImage && Boolean(form.image); const options = { preserveScroll: true, - forceFormData: props.allowImage, + forceFormData: hasImage, + errorBag: props.item ? `news-edit-${props.item.id}` : 'news-create', onSuccess: () => { if (!props.item) form.reset(); }, }; - if (props.item && props.allowImage) { + form.transform((data) => data); + + if (props.item && hasImage) { form.transform((data) => ({ ...data, _method: 'patch' })).post(props.action, options); } else if (props.item) { form.patch(props.action, options); diff --git a/tests/Feature/AdminNewsFeatureTest.php b/tests/Feature/AdminNewsFeatureTest.php index 6b3e259..428b86a 100644 --- a/tests/Feature/AdminNewsFeatureTest.php +++ b/tests/Feature/AdminNewsFeatureTest.php @@ -42,6 +42,42 @@ class AdminNewsFeatureTest extends TestCase ->assertForbidden(); } + public function test_admin_can_create_and_update_news_without_an_image(): void + { + $admin = $this->admin(); + + $this->actingAs($admin) + ->post(route('admin.news.store'), [ + 'title' => 'Новая глава MoonWell', + 'body' => 'Подробности новой главы.', + 'sort_order' => 10, + 'is_published' => true, + ]) + ->assertSessionHas('status', 'Новость добавлена.'); + + $newsItem = News::query()->firstOrFail(); + + $this->assertSame('Новая глава MoonWell', $newsItem->title); + $this->assertTrue($newsItem->is_published); + $this->assertSame('ADMIN', $newsItem->created_by_username); + + $this->actingAs($admin) + ->patch(route('admin.news.update', $newsItem), [ + 'title' => 'Новая глава уже доступна', + 'body' => 'Обновлённые подробности.', + 'sort_order' => 5, + 'is_published' => false, + ]) + ->assertSessionHas('status', 'Новость обновлена.'); + + $this->assertDatabaseHas('news', [ + 'id' => $newsItem->id, + 'title' => 'Новая глава уже доступна', + 'sort_order' => 5, + 'is_published' => false, + ]); + } + private function admin(int $gmLevel = 3): GameAccountUser { return new GameAccountUser(