новости в админке для логин скрина

This commit is contained in:
2026-03-15 17:04:31 +04:00
parent d4880d2f05
commit 835f795a48
13 changed files with 699 additions and 2 deletions
@@ -0,0 +1,162 @@
<?php
namespace Tests\Feature;
use App\Models\GameAccountUser;
use App\Models\LoginScreenNews;
use App\Services\LoginScreenNewsService;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class LoginScreenNewsFeatureTest extends TestCase
{
use RefreshDatabase;
public function test_public_feed_returns_published_news_in_sort_order(): void
{
LoginScreenNews::query()->create([
'title' => 'Draft',
'body' => 'HIDDEN',
'sort_order' => 1,
'is_published' => false,
]);
LoginScreenNews::query()->create([
'title' => 'Late',
'body' => "SERVERALERT:\n\n|cFF111111Late|r",
'sort_order' => 20,
'is_published' => true,
]);
LoginScreenNews::query()->create([
'title' => 'Early',
'body' => '|cFF222222Early|r',
'sort_order' => 10,
'is_published' => true,
]);
$response = $this->get(route('launcher.login-news.show'));
$response->assertOk();
$response->assertHeader('Content-Type', 'text/plain; charset=UTF-8');
$response->assertContent(
LoginScreenNewsService::FEED_HEADER
."\n\n|cFF222222Early|r\n"
.LoginScreenNewsService::SECTION_SEPARATOR
."\n|cFF111111Late|r\n"
);
}
public function test_public_feed_returns_fallback_message_when_no_news_is_published(): void
{
LoginScreenNews::query()->create([
'title' => 'Draft',
'body' => 'HIDDEN',
'sort_order' => 0,
'is_published' => false,
]);
$response = $this->get(route('launcher.login-news.show'));
$response->assertOk();
$response->assertContent(
LoginScreenNewsService::FEED_HEADER
."\n\n"
.LoginScreenNewsService::EMPTY_MESSAGE
."\n"
);
}
public function test_regular_player_cannot_open_admin_news_page(): void
{
$response = $this->actingAs($this->makeUser(0))->get(route('admin.login-screen-news.index'));
$response->assertForbidden();
}
public function test_admin_can_open_admin_news_page(): void
{
LoginScreenNews::query()->create([
'title' => 'Wrath Update',
'body' => '|cFF00D1FFWrath update|r',
'sort_order' => 0,
'is_published' => true,
]);
$response = $this->actingAs($this->makeUser(3))->get(route('admin.login-screen-news.index'));
$response->assertOk();
$response->assertSee('Новости логин-экрана WoW');
$response->assertSee('Wrath Update');
$response->assertSee(route('launcher.login-news.show'), false);
}
public function test_admin_can_create_update_and_delete_news_item(): void
{
$admin = $this->makeUser(3);
$createResponse = $this->from(route('admin.login-screen-news.index'))
->actingAs($admin)
->post(route('admin.login-screen-news.store'), [
'title' => 'Launch Notice',
'body' => '|cFFFFD700Server launch tonight|r',
'sort_order' => 5,
'is_published' => '1',
]);
$createResponse->assertRedirect(route('admin.login-screen-news.index'));
$createResponse->assertSessionHas('status', 'Новость для логин-экрана добавлена.');
$this->assertDatabaseHas('login_screen_news', [
'title' => 'Launch Notice',
'sort_order' => 5,
'is_published' => 1,
'created_by_username' => 'ADMIN',
'updated_by_username' => 'ADMIN',
]);
$newsItem = LoginScreenNews::query()->firstOrFail();
$updateResponse = $this->from(route('admin.login-screen-news.index'))
->actingAs($admin)
->patch(route('admin.login-screen-news.update', $newsItem), [
'title' => 'Launch Notice Updated',
'body' => '|cFFFFD700Server launch moved to Friday|r',
'sort_order' => 8,
]);
$updateResponse->assertRedirect(route('admin.login-screen-news.index'));
$updateResponse->assertSessionHas('status', 'Новость для логин-экрана обновлена.');
$this->assertDatabaseHas('login_screen_news', [
'id' => $newsItem->id,
'title' => 'Launch Notice Updated',
'sort_order' => 8,
'is_published' => 0,
]);
$deleteResponse = $this->from(route('admin.login-screen-news.index'))
->actingAs($admin)
->delete(route('admin.login-screen-news.destroy', $newsItem));
$deleteResponse->assertRedirect(route('admin.login-screen-news.index'));
$deleteResponse->assertSessionHas('status', 'Новость для логин-экрана удалена.');
$this->assertDatabaseMissing('login_screen_news', [
'id' => $newsItem->id,
]);
}
private function makeUser(int $gmLevel): GameAccountUser
{
return new GameAccountUser(
id: 1,
username: 'ADMIN',
email: 'ADMIN@EXAMPLE.COM',
regMail: 'ADMIN@EXAMPLE.COM',
gmLevel: $gmLevel,
locked: false,
lastLoginAt: '2026-03-13 18:00:00',
joinedAt: '2026-03-12 12:00:00',
saltHex: str_repeat('AA', 32),
verifierHex: str_repeat('BB', 32),
);
}
}