Files
Gnuboard7/modules/_bundled/sirsoft-board/tests/Unit/AttachmentRepositoryTest.php
T
2026-04-22 10:43:31 +09:00

277 lines
9.1 KiB
PHP

<?php
namespace Modules\Sirsoft\Board\Tests\Unit;
// ModuleTestCase를 수동으로 require (autoload 전에 로드 필요)
require_once __DIR__.'/../ModuleTestCase.php';
use App\Models\User;
use Modules\Sirsoft\Board\Models\Attachment;
use Modules\Sirsoft\Board\Models\Board;
use Modules\Sirsoft\Board\Repositories\AttachmentRepository;
use Modules\Sirsoft\Board\Tests\ModuleTestCase;
use PHPUnit\Framework\Attributes\Test;
/**
* AttachmentRepository 통합 테스트
*
* 임시 업로드(board_id=0) → 게시글 연결(실제 board_id) 흐름을 검증합니다.
*/
class AttachmentRepositoryTest extends ModuleTestCase
{
private AttachmentRepository $repository;
private User $user;
private Board $board;
protected function setUp(): void
{
parent::setUp();
// Telescope 비활성화
config(['telescope.enabled' => false]);
$this->repository = new AttachmentRepository;
$this->user = User::factory()->create();
$this->board = Board::firstOrCreate(
['slug' => 'attach-repo-test'],
[
'name' => ['ko' => '첨부파일 레포지토리 테스트 게시판'],
'type' => 'list',
'per_page' => 20,
'per_page_mobile' => 10,
'order_by' => 'created_at',
'order_direction' => 'DESC',
'secret_mode' => 'disabled',
'use_comment' => true,
'use_reply' => false,
'use_file_upload' => true,
'permissions' => [],
'notify_admin_on_post' => false,
'notify_author_on_comment' => false,
]
);
}
/**
* 임시 첨부파일 레코드를 생성합니다 (board_id=0).
*
* @param array $overrides 오버라이드할 속성
* @return Attachment 생성된 첨부파일
*/
private function createTempAttachment(array $overrides = []): Attachment
{
return Attachment::create(array_merge([
'board_id' => 0,
'post_id' => null,
'temp_key' => 'test-temp-key',
'original_filename' => 'test-file.pdf',
'stored_filename' => 'uuid-test.pdf',
'disk' => 'local',
'path' => 'attach-repo-test/temp/test-temp-key/uuid-test.pdf',
'mime_type' => 'application/pdf',
'size' => 1024,
'collection' => 'attachments',
'order' => 1,
'created_by' => $this->user->id,
], $overrides));
}
#[Test]
public function test_link_attachments_by_ids_moves_temp_to_real_board_id(): void
{
// Given: board_id=0인 임시 첨부파일 2개 생성
$attachment1 = $this->createTempAttachment([
'original_filename' => 'file1.pdf',
'stored_filename' => 'uuid1.pdf',
'order' => 1,
]);
$attachment2 = $this->createTempAttachment([
'original_filename' => 'file2.pdf',
'stored_filename' => 'uuid2.pdf',
'order' => 2,
]);
$postId = 100;
// When: linkAttachmentsByIds 호출
$linkedCount = $this->repository->linkAttachmentsByIds(
'attach-repo-test',
[$attachment1->id, $attachment2->id],
$postId
);
// Then: 2개 연결됨
$this->assertEquals(2, $linkedCount);
// board_id가 실제 게시판 ID로 변경되었는지 확인
$updated1 = Attachment::find($attachment1->id);
$updated2 = Attachment::find($attachment2->id);
$this->assertEquals($this->board->id, $updated1->board_id);
$this->assertEquals($postId, $updated1->post_id);
$this->assertNull($updated1->temp_key);
$this->assertEquals($this->board->id, $updated2->board_id);
$this->assertEquals($postId, $updated2->post_id);
$this->assertNull($updated2->temp_key);
}
#[Test]
public function test_link_attachments_by_ids_with_empty_array_returns_zero(): void
{
// When: 빈 배열로 호출
$result = $this->repository->linkAttachmentsByIds('attach-repo-test', [], 1);
// Then: 0 반환
$this->assertEquals(0, $result);
}
#[Test]
public function test_link_attachments_by_ids_ignores_already_linked_attachments(): void
{
// Given: 이미 게시글에 연결된 첨부파일 (board_id != 0)
$linkedAttachment = Attachment::create([
'board_id' => $this->board->id,
'post_id' => 50,
'temp_key' => null,
'original_filename' => 'already-linked.pdf',
'stored_filename' => 'uuid-linked.pdf',
'disk' => 'local',
'path' => 'attach-repo-test/2026/03/03/uuid-linked.pdf',
'mime_type' => 'application/pdf',
'size' => 1024,
'collection' => 'attachments',
'order' => 1,
'created_by' => $this->user->id,
]);
// When: 이미 연결된 첨부파일 ID로 linkAttachmentsByIds 호출
$result = $this->repository->linkAttachmentsByIds(
'attach-repo-test',
[$linkedAttachment->id],
100
);
// Then: board_id=0이 아니므로 0개 연결
$this->assertEquals(0, $result);
// 기존 연결 상태 유지 확인
$unchanged = Attachment::find($linkedAttachment->id);
$this->assertEquals(50, $unchanged->post_id);
$this->assertEquals($this->board->id, $unchanged->board_id);
}
#[Test]
public function test_link_temp_attachments_moves_temp_to_real_board_id(): void
{
// Given: board_id=0인 임시 첨부파일 (temp_key 기반)
$tempKey = 'temp-link-test';
$attachment = $this->createTempAttachment([
'temp_key' => $tempKey,
'original_filename' => 'temp-file.pdf',
]);
$postId = 200;
// When: linkTempAttachments 호출
$linkedCount = $this->repository->linkTempAttachments(
'attach-repo-test',
$tempKey,
$postId
);
// Then: 1개 연결됨
$this->assertEquals(1, $linkedCount);
// board_id가 실제 게시판 ID로 변경되었는지 확인
$updated = Attachment::find($attachment->id);
$this->assertEquals($this->board->id, $updated->board_id);
$this->assertEquals($postId, $updated->post_id);
$this->assertNull($updated->temp_key);
}
#[Test]
public function test_linked_attachments_are_queryable_by_board_id(): void
{
// Given: 임시 첨부파일 생성 후 게시글에 연결 (고유 postId로 격리)
$postId = 300000 + random_int(1, 99999);
$attachment = $this->createTempAttachment([
'original_filename' => 'queryable-file.pdf',
'stored_filename' => 'uuid-queryable.pdf',
]);
$this->repository->linkAttachmentsByIds(
'attach-repo-test',
[$attachment->id],
$postId
);
// When: 게시판 slug + postId로 조회
$result = $this->repository->getByPost('attach-repo-test', $postId);
// Then: 연결된 첨부파일이 조회됨
$this->assertCount(1, $result);
$this->assertEquals($attachment->id, $result->first()->id);
$this->assertEquals($this->board->id, $result->first()->board_id);
}
#[Test]
public function test_get_by_temp_key_returns_temp_attachments(): void
{
// Given: 고유 temp_key로 임시 첨부파일 2개 생성 (테스트 격리)
$tempKey = 'get-temp-test-' . uniqid();
$this->createTempAttachment([
'temp_key' => $tempKey,
'original_filename' => 'temp1.pdf',
'stored_filename' => 'uuid-t1.pdf',
'order' => 1,
]);
$this->createTempAttachment([
'temp_key' => $tempKey,
'original_filename' => 'temp2.pdf',
'stored_filename' => 'uuid-t2.pdf',
'order' => 2,
]);
// When: temp_key로 조회
$result = $this->repository->getByTempKey('attach-repo-test', $tempKey);
// Then: 2개 조회됨
$this->assertCount(2, $result);
}
#[Test]
public function test_get_max_order_by_temp_key_returns_correct_value(): void
{
// Given: 임시 첨부파일 2개 (order 1, 3)
$tempKey = 'max-order-test';
$this->createTempAttachment([
'temp_key' => $tempKey,
'order' => 1,
]);
$this->createTempAttachment([
'temp_key' => $tempKey,
'order' => 3,
]);
// When: 최대 order 조회
$maxOrder = $this->repository->getMaxOrderByTempKey('attach-repo-test', $tempKey, 'attachments');
// Then: 3 반환
$this->assertEquals(3, $maxOrder);
}
#[Test]
public function test_get_max_order_by_temp_key_returns_zero_for_null_key(): void
{
// When: null temp_key로 조회
$maxOrder = $this->repository->getMaxOrderByTempKey('attach-repo-test', null, 'attachments');
// Then: 0 반환
$this->assertEquals(0, $maxOrder);
}
}