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

124 lines
3.7 KiB
PHP

<?php
namespace Modules\Sirsoft\Board\Tests\Feature\User;
// ModuleTestCase를 수동으로 require (autoload 전에 로드 필요)
require_once __DIR__.'/../../ModuleTestCase.php';
use Illuminate\Support\Facades\Cache;
use Modules\Sirsoft\Board\Models\Board;
use Modules\Sirsoft\Board\Tests\ModuleTestCase;
/**
* 게시판 통계 API 테스트
*
* 홈 페이지에서 사용할 게시판 관련 통계 API의 동작을 검증합니다.
*/
class BoardStatsApiTest extends ModuleTestCase
{
/**
* 테스트 환경 설정
*/
protected function setUp(): void
{
parent::setUp();
// 이전 테스트에서 잔류한 게시판 비활성화 (정확한 카운트 테스트를 위해)
Board::where('is_active', true)->update(['is_active' => false]);
// 캐시 클리어
Cache::flush();
}
/**
* 통계 API가 올바른 구조로 응답하는지 테스트
*/
public function test_stats_returns_correct_structure(): void
{
// Given: 활성화된 게시판 생성
Board::factory()->create([
'is_active' => true,
'slug' => 'test-board',
]);
// When: 통계 API 호출
$response = $this->getJson('/api/modules/sirsoft-board/boards/stats');
// Then: 올바른 구조 반환
$response->assertStatus(200)
->assertJsonStructure([
'success',
'data' => [
'users',
'boards',
'posts',
'comments',
],
]);
}
/**
* 활성화된 게시판 수만 카운트하는지 테스트
*/
public function test_stats_counts_only_active_boards(): void
{
// Given: 활성화/비활성화 게시판 생성
Board::factory()->count(3)->create(['is_active' => true]);
Board::factory()->count(2)->create(['is_active' => false]);
// When: 통계 API 호출
$response = $this->getJson('/api/modules/sirsoft-board/boards/stats');
// Then: 활성화된 게시판만 카운트
$response->assertStatus(200);
$data = $response->json('data');
$this->assertEquals(3, $data['boards']);
}
/**
* 게시판이 없을 때 0을 반환하는지 테스트
*/
public function test_stats_returns_zero_when_no_boards(): void
{
// Given: 게시판 없음
// When: 통계 API 호출
$response = $this->getJson('/api/modules/sirsoft-board/boards/stats');
// Then: 모든 카운트가 0
$response->assertStatus(200);
$data = $response->json('data');
$this->assertEquals(0, $data['boards']);
$this->assertEquals(0, $data['posts']);
$this->assertEquals(0, $data['comments']);
}
/**
* 통계가 캐시되는지 테스트
*/
public function test_stats_are_cached(): void
{
// Given: 활성화된 게시판 생성
Board::factory()->create([
'is_active' => true,
'slug' => 'test-cache',
]);
// When: 첫 번째 API 호출
$response1 = $this->getJson('/api/modules/sirsoft-board/boards/stats');
$response1->assertStatus(200);
// 캐시 키 확인 (ModuleCacheDriver 접두사 `g7:module.sirsoft-board:` + key 'stats')
$this->assertTrue(Cache::has('g7:module.sirsoft-board:stats'));
// When: 두 번째 API 호출
$response2 = $this->getJson('/api/modules/sirsoft-board/boards/stats');
$response2->assertStatus(200);
// Then: 같은 결과 반환
$this->assertEquals($response1->json('data'), $response2->json('data'));
}
}