Repository navigation
Expand file tree
/
Copy pathprompt.test.ts
More file actions
219 lines (189 loc) · 10.1 KB
/
Copy pathprompt.test.ts
File metadata and controls
219 lines (189 loc) · 10.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
/**
* 프롬프트 페이지 테스트
*/
import { describe, it, expect } from 'vitest';
import { generatePromptText, createPromptResponse } from '../../src/pages/prompt.js';
describe('generatePromptText', () => {
it('baseUrl을 포함한 프롬프트 텍스트를 생성한다', () => {
const baseUrl = 'https://example.com';
const text = generatePromptText(baseUrl);
expect(text).toContain('https://example.com');
expect(text).toContain('Base URL: https://example.com');
});
it('API 엔드포인트 문서를 포함한다', () => {
const text = generatePromptText('https://api.test.com');
// 제품 검색 API
expect(text).toContain('/browse/daiso/products');
expect(text).toContain('검색 키워드');
// 제품 상세 정보 API
expect(text).toContain('/browse/daiso/product/{제품ID}');
// 매장 찾기 API
expect(text).toContain('/browse/daiso/stores');
// 재고 확인 API
expect(text).toContain('/browse/daiso/inventory');
expect(text).toContain('/browse/daiso/display-location');
// 올리브영 API
expect(text).toContain('/browse/oliveyoung/stores');
expect(text).toContain('/browse/oliveyoung/products');
expect(text).toContain('products[].imageUrl');
expect(text).toContain('/browse/oliveyoung/inventory');
expect(text).not.toContain('/browse/lottemart/stores');
expect(text).not.toContain('/browse/lottemart/products');
expect(text).toContain('/browse/gs25/stores');
expect(text).toContain('/browse/gs25/products');
expect(text).toContain('/browse/gs25/inventory');
expect(text).toContain('/browse/seveneleven/inventory');
expect(text).toContain('/browse/places/search');
// 메가박스 API
expect(text).toContain('/browse/megabox/theaters');
expect(text).toContain('/browse/megabox/movies');
expect(text).toContain('/browse/megabox/seats');
expect(text).toContain('/browse/lottecinema/theaters');
expect(text).toContain('/browse/lottecinema/movies');
expect(text).toContain('/browse/lottecinema/seats');
// CGV API
expect(text).toContain('/browse/cgv/theaters');
expect(text).toContain('/browse/cgv/movies');
expect(text).toContain('/browse/cgv/timetable');
});
it('파라미터 설명을 포함한다', () => {
const text = generatePromptText('https://test.com');
expect(text).toContain('page');
expect(text).toContain('pageSize');
expect(text).toContain('keyword');
expect(text).toContain('sido');
expect(text).toContain('gugun');
expect(text).toContain('dong');
expect(text).toContain('lat');
expect(text).toContain('lng');
});
it('응답 예시를 포함한다', () => {
const text = generatePromptText('https://test.com');
expect(text).toContain('"success": true');
expect(text).toContain('"products"');
expect(text).toContain('"stores"');
});
it('에러 코드 설명을 포함한다', () => {
const text = generatePromptText('https://test.com');
expect(text).toContain('MISSING_QUERY');
expect(text).toContain('MISSING_PARAMS');
expect(text).toContain('MISSING_STORE_CODE');
expect(text).toContain('NOT_FOUND');
expect(text).toContain('SEARCH_FAILED');
expect(text).toContain('DISPLAY_LOCATION_FAILED');
expect(text).toContain('OLIVEYOUNG_STORE_SEARCH_FAILED');
expect(text).toContain('OLIVEYOUNG_PRODUCT_SEARCH_FAILED');
expect(text).toContain('OLIVEYOUNG_INVENTORY_CHECK_FAILED');
expect(text).toContain('MEGABOX_THEATER_SEARCH_FAILED');
expect(text).toContain('MEGABOX_MOVIE_LIST_FAILED');
expect(text).toContain('MEGABOX_SEAT_LIST_FAILED');
expect(text).toContain('LOTTECINEMA_THEATER_SEARCH_FAILED');
expect(text).toContain('LOTTECINEMA_MOVIE_LIST_FAILED');
expect(text).toContain('LOTTECINEMA_SEAT_LIST_FAILED');
expect(text).toContain('CGV_THEATER_SEARCH_FAILED');
expect(text).toContain('CGV_MOVIE_SEARCH_FAILED');
expect(text).toContain('CGV_TIMETABLE_FETCH_FAILED');
expect(text).toContain('GS25_STORE_SEARCH_FAILED');
expect(text).toContain('GS25_PRODUCT_SEARCH_FAILED');
expect(text).toContain('GS25_INVENTORY_CHECK_FAILED');
expect(text).not.toContain('LOTTEMART_STORE_SEARCH_FAILED');
expect(text).not.toContain('LOTTEMART_PRODUCT_SEARCH_FAILED');
expect(text).toContain('SEVENELEVEN_INVENTORY_CHECK_FAILED');
});
it('MCP 연결 정보를 포함한다', () => {
const text = generatePromptText('https://example.com');
expect(text).toContain('https://example.com/mcp');
for (const name of ['search_products','find_stores','check_inventory','get_product_details','find_places','get_showtimes','get_fuel_info','get_catalog','compare_products','submit_request']) expect(text).toContain(name);
expect(text).not.toContain('lottemart_find_nearby_stores');
expect(text).not.toContain('lottemart_search_products');
expect(text).toContain('service');
expect(text).toContain('operation');
});
it('사용 팁을 포함한다', () => {
const text = generatePromptText('https://test.com');
expect(text).toContain('사용 팁');
expect(text).toContain('한글 검색어');
expect(text).toContain('페이지네이션');
expect(text).toContain('브랜드 고정');
expect(text).toContain('품목상 어색해 보여도 먼저 그 브랜드에서 실제 검색/조회');
expect(text).toContain('사전 판단으로 검색을 거부');
expect(text).toContain('브랜드가 명시되면 일단 해당 브랜드에서 실제 조회 후');
expect(text).toContain('브랜드가 앞부분에만 나와도 뒤 요청 전체를 다이소 기준으로 처리');
expect(text).toContain('결과가 없을 때만 다른 브랜드 대안을 짧게 제안');
expect(text).toContain('이미지 적극 표시');
expect(text).toContain('규칙 1');
expect(text).toContain('반드시 마크다운 이미지로 렌더링');
expect(text).toContain('규칙 2');
expect(text).toContain('이미지를 임의로 생략하지 마세요');
expect(text).toContain('규칙 3');
expect(text).toContain('각 항목의 이미지를 전부 표시');
expect(text).toContain('규칙 4');
expect(text).toContain('길어서 일부만 표시');
expect(text).toContain('규칙 5');
expect(text).toContain('답변 길이 때문에라도 빼지 마세요');
expect(text).toContain('규칙 6');
expect(text).toContain('?l=ko');
expect(text).toContain('전체 URL을 그대로 사용');
expect(text).toContain('규칙 7');
expect(text).toContain('query string까지 포함한 전체 URL');
expect(text).toContain('재고 확인 워크플로우');
expect(text).toContain('최소 정보 요청 처리');
expect(text).toContain('사용자가 상품명만 주면 먼저 상품 검색 도구로 후보를 찾고');
expect(text).toContain(
'사용자가 위치를 대강 말하면 keyword/storeKeyword에 그대로 넣어 먼저 조회',
);
expect(text).toContain('도구가 productId, itemCode, storeCode 같은 내부 ID를 요구하면');
expect(text).toContain('사용자에게 바로 ID를 요구하지 말고');
expect(text).toContain('다이소 재고 조회는 storeCode가 필요하지 않습니다.');
expect(text).toContain('재고 응답의 storeCode를 확인한 뒤');
expect(text).toContain('상품명 단계 검색');
expect(text).toContain('검색어 전체를 먼저 그대로 조회');
expect(text).toContain('공백/브랜드어 제거, 표기 변형, 더 짧은 핵심어 순으로');
expect(text).toContain('추정 매칭임을 짧게 밝힌 뒤 재고를 안내');
expect(text).toContain('위치/브랜드/상품명은 한 인자에 섞지 말고');
expect(text).toContain('pluCd + storeKeyword 조합도 지원');
expect(text).toContain('storeInventory.stores[]');
expect(text).toContain('stockLabel');
expect(text).toContain('/browse/megabox/theaters/');
expect(text).toContain('가장 가까운 지점을 먼저 선택');
expect(text).toContain('/browse/lottecinema/theaters/');
expect(text).toContain('theaterId가 없으면 위치 키워드 기준 최근접 지점을 선택');
expect(text).toContain('/browse/cgv/theaters/안산%20중앙역/playDate/20260315');
expect(text).toContain('CGV 상영 시간표를 조회합니다. theaterCode가 없으면');
expect(text).toContain('올리브영 상품 이미지 표시');
expect(text).toContain('각 상품 이미지를 생략하지 말고 모두 렌더링');
expect(text).toContain('query string을 삭제하지 말고');
});
it('상황별 에이전트 실행 레시피를 포함한다', () => {
const text = generatePromptText('https://test.com');
expect(text).toContain('에이전트 실행 레시피');
expect(text).toContain('콜라 어디가 싸?');
expect(text).toContain('compare_products');
expect(text).toContain('강남역 근처 카페');
expect(text).toContain('find_places');
expect(text).toContain('다이소 핫식스 재고');
expect(text).toContain('브랜드를 바꾸지 말고 먼저 다이소로 검색');
expect(text).toContain('실패하면 같은 도구를 한 번 더 좁은 조건으로 재시도');
expect(text).toContain('결과에 imageUrl이 있으면 각 항목 이미지 표시');
});
});
describe('createPromptResponse', () => {
it('Response 객체를 반환한다', () => {
const response = createPromptResponse('https://test.com');
expect(response).toBeInstanceOf(Response);
});
it('올바른 Content-Type 헤더를 설정한다', () => {
const response = createPromptResponse('https://test.com');
expect(response.headers.get('Content-Type')).toBe('text/plain; charset=utf-8');
});
it('캐시 헤더를 설정한다', () => {
const response = createPromptResponse('https://test.com');
expect(response.headers.get('Cache-Control')).toBe('no-store');
});
it('본문에 프롬프트 텍스트가 포함되어 있다', async () => {
const response = createPromptResponse('https://test.com');
const body = await response.text();
expect(body).toContain('다이소 MCP API');
expect(body).toContain('https://test.com');
});
});