Files
moonwell-web/tests/Feature/PublicNewsFeatureTest.php

102 lines
3.6 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\News;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Inertia\Testing\AssertableInertia as Assert;
use Tests\TestCase;
class PublicNewsFeatureTest extends TestCase
{
use RefreshDatabase;
public function test_news_index_lists_only_published_articles_with_pagination(): void
{
foreach (range(1, 10) as $number) {
News::query()->create([
'title' => "Новость {$number}",
'body' => "Полный текст новости {$number}.",
'sort_order' => 0,
'is_published' => true,
]);
}
News::query()->create([
'title' => 'Скрытый черновик',
'body' => 'Не должен попасть в список.',
'sort_order' => 0,
'is_published' => false,
]);
$this->get(route('news.index'))
->assertOk()
->assertInertia(fn (Assert $page) => $page
->component('News/Index', false)
->has('articles.data', 9)
->where('articles.data.0.title', 'Новость 10')
->where('articles.total', 10)
->where('articles.last_page', 2)
->where('urls.news', route('news.index'))
->etc()
);
}
public function test_published_news_has_public_inertia_page(): void
{
$news = News::query()->create([
'title' => 'Открытие новой эпохи',
'body' => "Герои завершили путь в Классике.\n\nТеперь открыты врата Запределья.",
'sort_order' => 1,
'is_published' => true,
]);
$this->get(route('news.show', $news))
->assertOk()
->assertInertia(fn (Assert $page) => $page
->component('News/Show', false)
->where('article.id', $news->id)
->where('article.title', 'Открытие новой эпохи')
->where('article.body', $news->body)
->where('article.url', route('news.show', $news))
->where('article.canonical_url', route('news.show', $news))
->where('article.back_url', route('news.index'))
->etc()
);
}
public function test_unpublished_news_is_not_publicly_available(): void
{
$news = News::query()->create([
'title' => 'Черновик',
'body' => 'Эта новость ещё не опубликована.',
'sort_order' => 1,
'is_published' => false,
]);
$this->get(route('news.show', $news))->assertNotFound();
}
public function test_landing_news_card_links_to_full_article(): void
{
$news = collect(range(1, 4))->map(fn (int $number): News => News::query()->create([
'title' => "Обновление {$number}",
'body' => "Полный текст обновления {$number}.",
'sort_order' => 10 - $number,
'is_published' => true,
]));
$this->get(route('landing.index'))
->assertOk()
->assertInertia(fn (Assert $page) => $page
->component('Landing/Main', false)
->has('posts', 3)
->where('posts.0.id', $news[3]->id)
->where('posts.0.url', route('news.show', $news[3]))
->where('posts.2.id', $news[1]->id)
->where('newsIndexUrl', route('news.index'))
->etc()
);
}
}