Files
2026-04-20 20:37:49 +09:00

188 lines
6.0 KiB
PHP

<?php
namespace Modules\Sirsoft\Board\Tests\Feature\User;
// ModuleTestCase를 수동으로 require (autoload 전에 로드 필요)
require_once __DIR__.'/../../ModuleTestCase.php';
use Illuminate\Support\Facades\DB;
use Modules\Sirsoft\Board\Models\Board;
use Modules\Sirsoft\Board\Services\BoardService;
use Modules\Sirsoft\Board\Tests\ModuleTestCase;
/**
* 게시판 네비게이션 메뉴 API 테스트
*
* 네비게이션 메뉴용 경량 API의 동작을 검증합니다.
*/
class BoardMenuApiTest extends ModuleTestCase
{
/**
* 테스트 환경 설정
*/
protected function setUp(): void
{
parent::setUp();
// DDL implicit commit으로 커밋된 게시판 비활성화 (데이터 격리 보장)
DB::table('boards')->update(['is_active' => false]);
// 이 테스트 클래스에서 사용하는 슬러그 정리 (커밋된 경우 대비)
DB::table('boards')->whereIn('slug', ['free', 'inactive', 'old', 'new'])->delete();
// board-menu 캐시 플러시 (이전 테스트 캐시가 남아있으면 데이터 격리 실패)
app(BoardService::class)->clearAllBoardCaches();
}
/**
* 네비게이션 메뉴 API가 활성화된 게시판만 반환하는지 테스트
*/
public function test_board_menu_returns_only_active_boards(): void
{
// Given: 활성화/비활성화 게시판 생성
$activeBoard = Board::factory()->create([
'is_active' => true,
'name' => ['ko' => '자유게시판', 'en' => 'Free Board'],
'slug' => 'free',
]);
Board::factory()->create([
'is_active' => false,
'name' => ['ko' => '비활성 게시판', 'en' => 'Inactive Board'],
'slug' => 'inactive',
]);
// When: API 호출
$response = $this->getJson('/api/modules/sirsoft-board/boards/board-menu');
// Then: 활성화된 게시판만 반환
$response->assertStatus(200)
->assertJsonStructure([
'success',
'data' => [
'*' => ['id', 'name', 'slug'],
],
])
->assertJsonCount(1, 'data')
->assertJsonFragment([
'slug' => 'free',
])
->assertJsonMissing([
'slug' => 'inactive',
]);
}
/**
* 네비게이션 메뉴 API가 최소 필드만 반환하는지 테스트
*/
public function test_board_menu_returns_minimal_fields_only(): void
{
// Given: 게시판 생성
Board::factory()->create([
'is_active' => true,
'name' => ['ko' => '자유게시판', 'en' => 'Free Board'],
'slug' => 'free',
'description' => ['ko' => '설명', 'en' => 'Description'],
'type' => 'basic',
]);
// When: API 호출
$response = $this->getJson('/api/modules/sirsoft-board/boards/board-menu');
// Then: id, name, slug만 반환
$response->assertStatus(200);
$data = $response->json('data.0');
$this->assertArrayHasKey('id', $data);
$this->assertArrayHasKey('name', $data);
$this->assertArrayHasKey('slug', $data);
// 다른 필드는 포함되지 않아야 함
$this->assertArrayNotHasKey('description', $data);
$this->assertArrayNotHasKey('type', $data);
$this->assertArrayNotHasKey('is_active', $data);
$this->assertArrayNotHasKey('permissions', $data);
}
/**
* 네비게이션 메뉴 API가 오래된 순으로 정렬되는지 테스트
*/
public function test_board_menu_returns_boards_in_created_order(): void
{
// Given: 게시판을 시간 순서대로 생성
$oldBoard = Board::factory()->create([
'is_active' => true,
'name' => ['ko' => '오래된 게시판', 'en' => 'Old Board'],
'slug' => 'old',
'created_at' => now()->subDays(10),
]);
$newBoard = Board::factory()->create([
'is_active' => true,
'name' => ['ko' => '새 게시판', 'en' => 'New Board'],
'slug' => 'new',
'created_at' => now(),
]);
// When: API 호출
$response = $this->getJson('/api/modules/sirsoft-board/boards/board-menu');
// Then: 오래된 순으로 정렬
$response->assertStatus(200);
$data = $response->json('data');
$this->assertEquals('old', $data[0]['slug']);
$this->assertEquals('new', $data[1]['slug']);
}
/**
* 네비게이션 메뉴 API가 다국어를 올바르게 처리하는지 테스트
*/
public function test_board_menu_returns_localized_names(): void
{
// Given: 다국어 게시판 생성
Board::factory()->create([
'is_active' => true,
'name' => ['ko' => '자유게시판', 'en' => 'Free Board'],
'slug' => 'free',
]);
// When: 한국어로 API 호출
$response = $this->getJson('/api/modules/sirsoft-board/boards/board-menu', [
'Accept-Language' => 'ko',
]);
// Then: 한국어 이름 반환
$response->assertStatus(200)
->assertJsonFragment([
'name' => '자유게시판',
]);
// When: 영어로 API 호출
$response = $this->getJson('/api/modules/sirsoft-board/boards/board-menu', [
'Accept-Language' => 'en',
]);
// Then: 영어 이름 반환
$response->assertStatus(200)
->assertJsonFragment([
'name' => 'Free Board',
]);
}
/**
* 게시판이 없을 때 빈 배열을 반환하는지 테스트
*/
public function test_board_menu_returns_empty_array_when_no_boards(): void
{
// Given: 게시판 없음
// When: API 호출
$response = $this->getJson('/api/modules/sirsoft-board/boards/board-menu');
// Then: 빈 배열 반환
$response->assertStatus(200)
->assertJsonCount(0, 'data');
}
}