Creator Network API Test Suite
cgen-9cee0578607f4709956432e8e3034c81
This commit is contained in:
parent
23ca5f769b
commit
c87e5285ab
1 changed files with 387 additions and 0 deletions
387
tests/creator-network-api.test.ts
Normal file
387
tests/creator-network-api.test.ts
Normal file
|
|
@ -0,0 +1,387 @@
|
|||
/**
|
||||
* Creator Network API Test Suite
|
||||
* Phase 2: Backend API Integration Tests
|
||||
*/
|
||||
|
||||
interface TestResult {
|
||||
endpoint: string;
|
||||
method: string;
|
||||
status: "✓" | "✗";
|
||||
statusCode?: number;
|
||||
message: string;
|
||||
error?: any;
|
||||
}
|
||||
|
||||
const results: TestResult[] = [];
|
||||
const baseUrl = "http://localhost:5173";
|
||||
|
||||
const log = (result: TestResult) => {
|
||||
results.push(result);
|
||||
const symbol = result.status === "✓" ? "✓" : "✗";
|
||||
console.log(
|
||||
`${symbol} ${result.method.padEnd(6)} ${result.endpoint.padEnd(40)} - ${result.message}`
|
||||
);
|
||||
};
|
||||
|
||||
const testEndpoint = async (
|
||||
method: string,
|
||||
endpoint: string,
|
||||
body?: any
|
||||
): Promise<any> => {
|
||||
try {
|
||||
const options: RequestInit = {
|
||||
method,
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
};
|
||||
|
||||
if (body) {
|
||||
options.body = JSON.stringify(body);
|
||||
}
|
||||
|
||||
const response = await fetch(`${baseUrl}${endpoint}`, options);
|
||||
const data = await response.json();
|
||||
|
||||
return { response, data };
|
||||
} catch (error) {
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
async function runTests() {
|
||||
console.log("🚀 Creator Network API Test Suite\n");
|
||||
|
||||
// Test 1: Get creators (should return empty or existing creators)
|
||||
try {
|
||||
const { response, data } = await testEndpoint(
|
||||
"GET",
|
||||
"/api/creators?page=1&limit=10"
|
||||
);
|
||||
if (response.ok) {
|
||||
log({
|
||||
endpoint: "/api/creators",
|
||||
method: "GET",
|
||||
status: "✓",
|
||||
statusCode: response.status,
|
||||
message: `Retrieved creators - ${data.data?.length || 0} results`,
|
||||
});
|
||||
} else {
|
||||
log({
|
||||
endpoint: "/api/creators",
|
||||
method: "GET",
|
||||
status: "✗",
|
||||
statusCode: response.status,
|
||||
message: `Error: ${data.error || response.statusText}`,
|
||||
});
|
||||
}
|
||||
} catch (error: any) {
|
||||
log({
|
||||
endpoint: "/api/creators",
|
||||
method: "GET",
|
||||
status: "✗",
|
||||
message: `Connection error: ${error.message}`,
|
||||
error,
|
||||
});
|
||||
}
|
||||
|
||||
// Test 2: Get creator by username (should fail - user doesn't exist yet)
|
||||
try {
|
||||
const { response, data } = await testEndpoint(
|
||||
"GET",
|
||||
"/api/creators/testuser123"
|
||||
);
|
||||
if (response.status === 404) {
|
||||
log({
|
||||
endpoint: "/api/creators/:username",
|
||||
method: "GET",
|
||||
status: "✓",
|
||||
statusCode: response.status,
|
||||
message: "Correctly returned 404 for non-existent user",
|
||||
});
|
||||
} else if (response.ok) {
|
||||
log({
|
||||
endpoint: "/api/creators/:username",
|
||||
method: "GET",
|
||||
status: "✓",
|
||||
statusCode: response.status,
|
||||
message: `Retrieved creator: ${data.username}`,
|
||||
});
|
||||
} else {
|
||||
log({
|
||||
endpoint: "/api/creators/:username",
|
||||
method: "GET",
|
||||
status: "✗",
|
||||
statusCode: response.status,
|
||||
message: `Unexpected error: ${data.error}`,
|
||||
});
|
||||
}
|
||||
} catch (error: any) {
|
||||
log({
|
||||
endpoint: "/api/creators/:username",
|
||||
method: "GET",
|
||||
status: "✗",
|
||||
message: `Connection error: ${error.message}`,
|
||||
error,
|
||||
});
|
||||
}
|
||||
|
||||
// Test 3: Create creator (validation test)
|
||||
try {
|
||||
const { response, data } = await testEndpoint("POST", "/api/creators", {
|
||||
user_id: "test-user-123",
|
||||
username: "test-creator",
|
||||
bio: "Test creator bio",
|
||||
avatar_url: "https://example.com/avatar.jpg",
|
||||
experience_level: "intermediate",
|
||||
primary_arm: "gameforge",
|
||||
arm_affiliations: ["gameforge", "labs"],
|
||||
skills: ["react", "typescript"],
|
||||
});
|
||||
|
||||
if (response.status === 201) {
|
||||
log({
|
||||
endpoint: "/api/creators",
|
||||
method: "POST",
|
||||
status: "✓",
|
||||
statusCode: response.status,
|
||||
message: `Created creator: ${data.username}`,
|
||||
});
|
||||
} else if (response.status === 400 && data.error?.includes("already")) {
|
||||
log({
|
||||
endpoint: "/api/creators",
|
||||
method: "POST",
|
||||
status: "✓",
|
||||
statusCode: response.status,
|
||||
message: "Duplicate username validation works",
|
||||
});
|
||||
} else {
|
||||
log({
|
||||
endpoint: "/api/creators",
|
||||
method: "POST",
|
||||
status: response.ok || response.status === 400 ? "✓" : "✗",
|
||||
statusCode: response.status,
|
||||
message: data.error || "Created successfully",
|
||||
});
|
||||
}
|
||||
} catch (error: any) {
|
||||
log({
|
||||
endpoint: "/api/creators",
|
||||
method: "POST",
|
||||
status: "✗",
|
||||
message: `Connection error: ${error.message}`,
|
||||
error,
|
||||
});
|
||||
}
|
||||
|
||||
// Test 4: Get opportunities (should return empty or existing)
|
||||
try {
|
||||
const { response, data } = await testEndpoint(
|
||||
"GET",
|
||||
"/api/opportunities?page=1&limit=10"
|
||||
);
|
||||
if (response.ok) {
|
||||
log({
|
||||
endpoint: "/api/opportunities",
|
||||
method: "GET",
|
||||
status: "✓",
|
||||
statusCode: response.status,
|
||||
message: `Retrieved opportunities - ${data.data?.length || 0} results`,
|
||||
});
|
||||
} else {
|
||||
log({
|
||||
endpoint: "/api/opportunities",
|
||||
method: "GET",
|
||||
status: "✗",
|
||||
statusCode: response.status,
|
||||
message: `Error: ${data.error || response.statusText}`,
|
||||
});
|
||||
}
|
||||
} catch (error: any) {
|
||||
log({
|
||||
endpoint: "/api/opportunities",
|
||||
method: "GET",
|
||||
status: "✗",
|
||||
message: `Connection error: ${error.message}`,
|
||||
error,
|
||||
});
|
||||
}
|
||||
|
||||
// Test 5: Get opportunity by ID (should fail - doesn't exist yet)
|
||||
try {
|
||||
const { response, data } = await testEndpoint(
|
||||
"GET",
|
||||
"/api/opportunities/fake-id-123"
|
||||
);
|
||||
if (response.status === 404) {
|
||||
log({
|
||||
endpoint: "/api/opportunities/:id",
|
||||
method: "GET",
|
||||
status: "✓",
|
||||
statusCode: response.status,
|
||||
message: "Correctly returned 404 for non-existent opportunity",
|
||||
});
|
||||
} else {
|
||||
log({
|
||||
endpoint: "/api/opportunities/:id",
|
||||
method: "GET",
|
||||
status: "✗",
|
||||
statusCode: response.status,
|
||||
message: `Unexpected response: ${data.error}`,
|
||||
});
|
||||
}
|
||||
} catch (error: any) {
|
||||
log({
|
||||
endpoint: "/api/opportunities/:id",
|
||||
method: "GET",
|
||||
status: "✗",
|
||||
message: `Connection error: ${error.message}`,
|
||||
error,
|
||||
});
|
||||
}
|
||||
|
||||
// Test 6: Create opportunity (without creator profile - should fail)
|
||||
try {
|
||||
const { response, data } = await testEndpoint(
|
||||
"POST",
|
||||
"/api/opportunities",
|
||||
{
|
||||
user_id: "non-existent-user",
|
||||
title: "Test Opportunity",
|
||||
description: "A test job opportunity",
|
||||
job_type: "contract",
|
||||
arm_affiliation: "gameforge",
|
||||
}
|
||||
);
|
||||
|
||||
if (response.status === 404) {
|
||||
log({
|
||||
endpoint: "/api/opportunities",
|
||||
method: "POST",
|
||||
status: "✓",
|
||||
statusCode: response.status,
|
||||
message: "Correctly requires creator profile",
|
||||
});
|
||||
} else {
|
||||
log({
|
||||
endpoint: "/api/opportunities",
|
||||
method: "POST",
|
||||
status: "✗",
|
||||
statusCode: response.status,
|
||||
message: `Expected 404, got: ${data.error}`,
|
||||
});
|
||||
}
|
||||
} catch (error: any) {
|
||||
log({
|
||||
endpoint: "/api/opportunities",
|
||||
method: "POST",
|
||||
status: "✗",
|
||||
message: `Connection error: ${error.message}`,
|
||||
error,
|
||||
});
|
||||
}
|
||||
|
||||
// Test 7: Get applications (missing user_id parameter)
|
||||
try {
|
||||
const { response, data } = await testEndpoint("GET", "/api/applications");
|
||||
|
||||
if (response.status === 400) {
|
||||
log({
|
||||
endpoint: "/api/applications",
|
||||
method: "GET",
|
||||
status: "✓",
|
||||
statusCode: response.status,
|
||||
message: "Correctly validates required parameters",
|
||||
});
|
||||
} else {
|
||||
log({
|
||||
endpoint: "/api/applications",
|
||||
method: "GET",
|
||||
status: "✗",
|
||||
statusCode: response.status,
|
||||
message: `Expected validation error, got: ${data.error}`,
|
||||
});
|
||||
}
|
||||
} catch (error: any) {
|
||||
log({
|
||||
endpoint: "/api/applications",
|
||||
method: "GET",
|
||||
status: "✗",
|
||||
message: `Connection error: ${error.message}`,
|
||||
error,
|
||||
});
|
||||
}
|
||||
|
||||
// Test 8: DevConnect link endpoint
|
||||
try {
|
||||
const { response, data } = await testEndpoint(
|
||||
"POST",
|
||||
"/api/devconnect/link",
|
||||
{
|
||||
user_id: "test-user-123",
|
||||
devconnect_username: "testuser",
|
||||
}
|
||||
);
|
||||
|
||||
if (response.status === 404) {
|
||||
log({
|
||||
endpoint: "/api/devconnect/link",
|
||||
method: "POST",
|
||||
status: "✓",
|
||||
statusCode: response.status,
|
||||
message: "Correctly requires creator profile",
|
||||
});
|
||||
} else if (response.status === 201 || response.status === 200) {
|
||||
log({
|
||||
endpoint: "/api/devconnect/link",
|
||||
method: "POST",
|
||||
status: "✓",
|
||||
statusCode: response.status,
|
||||
message: "DevConnect link created/updated",
|
||||
});
|
||||
} else {
|
||||
log({
|
||||
endpoint: "/api/devconnect/link",
|
||||
method: "POST",
|
||||
status: "✗",
|
||||
statusCode: response.status,
|
||||
message: `Unexpected response: ${data.error}`,
|
||||
});
|
||||
}
|
||||
} catch (error: any) {
|
||||
log({
|
||||
endpoint: "/api/devconnect/link",
|
||||
method: "POST",
|
||||
status: "✗",
|
||||
message: `Connection error: ${error.message}`,
|
||||
error,
|
||||
});
|
||||
}
|
||||
|
||||
// Summary
|
||||
console.log("\n" + "=".repeat(80));
|
||||
const passed = results.filter((r) => r.status === "✓").length;
|
||||
const failed = results.filter((r) => r.status === "✗").length;
|
||||
console.log(
|
||||
`\nTest Summary: ${passed} passed, ${failed} failed out of ${results.length} tests`
|
||||
);
|
||||
|
||||
if (failed > 0) {
|
||||
console.log("\n❌ Failed tests:");
|
||||
results.filter((r) => r.status === "✗").forEach((r) => {
|
||||
console.log(` - ${r.method} ${r.endpoint}: ${r.message}`);
|
||||
});
|
||||
} else {
|
||||
console.log("\n✅ All tests passed!");
|
||||
}
|
||||
|
||||
console.log("\n" + "=".repeat(80));
|
||||
|
||||
return { passed, failed, total: results.length };
|
||||
}
|
||||
|
||||
// Run tests
|
||||
runTests().catch((error) => {
|
||||
console.error("Test suite failed:", error);
|
||||
process.exit(1);
|
||||
});
|
||||
Loading…
Reference in a new issue