refactor: 추천 시스템 제거
삭제된 파일: - src/routes/recommend.ts - src/services/recommendation.ts - src/services/recommendation.test.ts - src/services/stackConfig.ts - src/services/regionFilter.ts 수정된 파일: - src/index.ts: /recommend 라우트 제거 - src/routes/index.ts: handleRecommend export 제거 - src/constants.ts: RECOMMENDATIONS TTL, rate limit 제거 - src/middleware/rateLimit.ts: /recommend 설정 제거 - src/types.ts: 추천 관련 타입 제거 - scripts/e2e-tester.ts: recommend 시나리오 제거 - scripts/api-tester.ts: recommend 테스트 제거 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -281,38 +281,6 @@ function validateSyncResponse(data: unknown): boolean | string {
|
||||
return true;
|
||||
}
|
||||
|
||||
function validateRecommendResponse(data: unknown): boolean | string {
|
||||
if (typeof data !== 'object' || data === null) {
|
||||
return 'Response is not an object';
|
||||
}
|
||||
|
||||
const response = data as Record<string, unknown>;
|
||||
|
||||
if (!response.success) {
|
||||
return 'Response success field is false or missing';
|
||||
}
|
||||
|
||||
if (!response.data || typeof response.data !== 'object') {
|
||||
return 'Missing or invalid data field';
|
||||
}
|
||||
|
||||
const responseData = response.data as Record<string, unknown>;
|
||||
|
||||
if (!Array.isArray(responseData.recommendations)) {
|
||||
return 'Missing or invalid recommendations array';
|
||||
}
|
||||
|
||||
if (!responseData.requirements || typeof responseData.requirements !== 'object') {
|
||||
return 'Missing or invalid requirements field';
|
||||
}
|
||||
|
||||
if (!responseData.metadata || typeof responseData.metadata !== 'object') {
|
||||
return 'Missing or invalid metadata field';
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// Test Suites
|
||||
// ============================================================
|
||||
@@ -484,95 +452,6 @@ async function testSyncEndpoint(): Promise<TestResult[]> {
|
||||
return tests;
|
||||
}
|
||||
|
||||
async function testRecommendEndpoint(): Promise<TestResult[]> {
|
||||
console.log(color('\n📍 Testing /recommend', colors.cyan));
|
||||
|
||||
const tests: TestResult[] = [];
|
||||
|
||||
// Test basic recommendation
|
||||
tests.push(
|
||||
await testWithDelay('POST /recommend (nginx+mysql)', '/recommend', {
|
||||
method: 'POST',
|
||||
headers: { 'X-API-Key': API_KEY },
|
||||
body: {
|
||||
stack: ['nginx', 'mysql'],
|
||||
scale: 'small',
|
||||
},
|
||||
expectStatus: 200,
|
||||
validateResponse: validateRecommendResponse,
|
||||
})
|
||||
);
|
||||
|
||||
// Test with budget constraint
|
||||
tests.push(
|
||||
await testWithDelay('POST /recommend (with budget)', '/recommend', {
|
||||
method: 'POST',
|
||||
headers: { 'X-API-Key': API_KEY },
|
||||
body: {
|
||||
stack: ['nginx', 'mysql', 'redis'],
|
||||
scale: 'medium',
|
||||
budget_max: 100,
|
||||
},
|
||||
expectStatus: 200,
|
||||
validateResponse: validateRecommendResponse,
|
||||
})
|
||||
);
|
||||
|
||||
// Test large scale
|
||||
tests.push(
|
||||
await testWithDelay('POST /recommend (large scale)', '/recommend', {
|
||||
method: 'POST',
|
||||
headers: { 'X-API-Key': API_KEY },
|
||||
body: {
|
||||
stack: ['nginx', 'nodejs', 'postgresql', 'redis'],
|
||||
scale: 'large',
|
||||
},
|
||||
expectStatus: 200,
|
||||
validateResponse: validateRecommendResponse,
|
||||
})
|
||||
);
|
||||
|
||||
// Test invalid stack (should fail with 400)
|
||||
tests.push(
|
||||
await testWithDelay('POST /recommend (invalid stack - error)', '/recommend', {
|
||||
method: 'POST',
|
||||
headers: { 'X-API-Key': API_KEY },
|
||||
body: {
|
||||
stack: ['invalid-technology'],
|
||||
scale: 'small',
|
||||
},
|
||||
expectStatus: 400, // Invalid stack returns 400 Bad Request
|
||||
})
|
||||
);
|
||||
|
||||
// Test invalid scale (should fail with 400)
|
||||
tests.push(
|
||||
await testWithDelay('POST /recommend (invalid scale - error)', '/recommend', {
|
||||
method: 'POST',
|
||||
headers: { 'X-API-Key': API_KEY },
|
||||
body: {
|
||||
stack: ['nginx'],
|
||||
scale: 'invalid',
|
||||
},
|
||||
expectStatus: 400, // Invalid scale returns 400 Bad Request
|
||||
})
|
||||
);
|
||||
|
||||
// Test without auth (should fail)
|
||||
tests.push(
|
||||
await testWithDelay('POST /recommend (no auth - error)', '/recommend', {
|
||||
method: 'POST',
|
||||
body: {
|
||||
stack: ['nginx'],
|
||||
scale: 'small',
|
||||
},
|
||||
expectStatus: 401,
|
||||
})
|
||||
);
|
||||
|
||||
return tests;
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// Test Runner
|
||||
// ============================================================
|
||||
@@ -639,12 +518,6 @@ async function runTests(): Promise<TestReport> {
|
||||
allResults.push(...syncResults);
|
||||
}
|
||||
|
||||
if (!TARGET_ENDPOINT || TARGET_ENDPOINT === '/recommend') {
|
||||
const recommendResults = await testRecommendEndpoint();
|
||||
recommendResults.forEach(printTestResult);
|
||||
allResults.push(...recommendResults);
|
||||
}
|
||||
|
||||
const duration = Date.now() - startTime;
|
||||
const passed = allResults.filter(r => r.passed).length;
|
||||
const failed = allResults.filter(r => !r.passed).length;
|
||||
|
||||
Reference in New Issue
Block a user