16bd2cb92a
- 모노레포 구조 (Turborepo + pnpm): @relink/domain, @relink/shared, @relink/infrastructure, @relink/database, @relink/web - 도메인 레이어: 매장(store), 매칭(matching), 업체(vendor), 보조금(subsidy), 계약/에스크로(contract) TDD 완료 (158 단위 테스트) - 서비스 레이어: 전 도메인 서비스 함수 + 통합 테스트 (58 테스트) - 프론트엔드: Next.js 15 App Router, 13개 페이지 (사용자 6 + 관리자 7) - 인프라: PostgreSQL 16 + PostGIS, Prisma ORM, Docker Compose, AuditLog + OutboxEvent 패턴 - .env 파일 포함 (로컬 개발 기본값만 포함, 실제 시크릿 없음) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
54 lines
1.5 KiB
TypeScript
54 lines
1.5 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { acceptMatchRequest, type AcceptMatchRequestInput, type MatchRequestStatus } from '../accept-match-request.js';
|
|
|
|
function validInput(overrides: Partial<AcceptMatchRequestInput> = {}): AcceptMatchRequestInput {
|
|
return {
|
|
currentStatus: 'OPEN',
|
|
actorUserId: 'operator-1',
|
|
...overrides,
|
|
};
|
|
}
|
|
|
|
describe('acceptMatchRequest', () => {
|
|
// U013: 매칭 요청 수락
|
|
it('U013-1: OPEN 상태에서 수락 가능', () => {
|
|
const result = acceptMatchRequest(validInput({ currentStatus: 'OPEN' }));
|
|
|
|
expect(result.ok).toBe(true);
|
|
if (result.ok) {
|
|
expect(result.value.status).toBe('ACCEPTED');
|
|
}
|
|
});
|
|
|
|
it('U013-2: REVIEWING 상태에서 수락 가능', () => {
|
|
const result = acceptMatchRequest(validInput({ currentStatus: 'REVIEWING' }));
|
|
|
|
expect(result.ok).toBe(true);
|
|
if (result.ok) {
|
|
expect(result.value.status).toBe('ACCEPTED');
|
|
}
|
|
});
|
|
|
|
// U013: 수락 불가능한 상태들
|
|
const nonAcceptableStatuses: MatchRequestStatus[] = [
|
|
'ACCEPTED',
|
|
'REJECTED',
|
|
'CONTRACTING',
|
|
'EXPIRED',
|
|
'CANCELLED',
|
|
'COMPLETED',
|
|
];
|
|
|
|
nonAcceptableStatuses.forEach((status) => {
|
|
it(`U013-3: ${status} 상태에서는 수락 불가`, () => {
|
|
const result = acceptMatchRequest(validInput({ currentStatus: status }));
|
|
|
|
expect(result.ok).toBe(false);
|
|
if (!result.ok) {
|
|
expect(result.error.code).toBe('INVALID_STATUS_TRANSITION');
|
|
expect(result.error.details?.currentStatus).toBe(status);
|
|
}
|
|
});
|
|
});
|
|
});
|