Spaces:
Build error
Build error
import { delay, http, HttpResponse } from "msw"; | |
import { | |
GetConfigResponse, | |
Conversation, | |
ResultSet, | |
} from "#/api/open-hands.types"; | |
import { DEFAULT_SETTINGS } from "#/services/settings"; | |
import { STRIPE_BILLING_HANDLERS } from "./billing-handlers"; | |
import { ApiSettings, PostApiSettings, Provider } from "#/types/settings"; | |
import { FILE_SERVICE_HANDLERS } from "./file-service-handlers"; | |
import { GitRepository, GitUser } from "#/types/git"; | |
import { TASK_SUGGESTIONS_HANDLERS } from "./task-suggestions-handlers"; | |
import { SECRETS_HANDLERS } from "./secrets-handlers"; | |
export const MOCK_DEFAULT_USER_SETTINGS: ApiSettings | PostApiSettings = { | |
llm_model: DEFAULT_SETTINGS.LLM_MODEL, | |
llm_base_url: DEFAULT_SETTINGS.LLM_BASE_URL, | |
llm_api_key: null, | |
llm_api_key_set: DEFAULT_SETTINGS.LLM_API_KEY_SET, | |
search_api_key_set: DEFAULT_SETTINGS.SEARCH_API_KEY_SET, | |
agent: DEFAULT_SETTINGS.AGENT, | |
language: DEFAULT_SETTINGS.LANGUAGE, | |
confirmation_mode: DEFAULT_SETTINGS.CONFIRMATION_MODE, | |
security_analyzer: DEFAULT_SETTINGS.SECURITY_ANALYZER, | |
remote_runtime_resource_factor: | |
DEFAULT_SETTINGS.REMOTE_RUNTIME_RESOURCE_FACTOR, | |
provider_tokens_set: DEFAULT_SETTINGS.PROVIDER_TOKENS_SET, | |
enable_default_condenser: DEFAULT_SETTINGS.ENABLE_DEFAULT_CONDENSER, | |
enable_sound_notifications: DEFAULT_SETTINGS.ENABLE_SOUND_NOTIFICATIONS, | |
enable_proactive_conversation_starters: | |
DEFAULT_SETTINGS.ENABLE_PROACTIVE_CONVERSATION_STARTERS, | |
user_consents_to_analytics: DEFAULT_SETTINGS.USER_CONSENTS_TO_ANALYTICS, | |
}; | |
const MOCK_USER_PREFERENCES: { | |
settings: ApiSettings | PostApiSettings | null; | |
} = { | |
settings: null, | |
}; | |
/** | |
* Set the user settings to the default settings | |
* | |
* Useful for resetting the settings in tests | |
*/ | |
export const resetTestHandlersMockSettings = () => { | |
MOCK_USER_PREFERENCES.settings = MOCK_DEFAULT_USER_SETTINGS; | |
}; | |
const conversations: Conversation[] = [ | |
{ | |
conversation_id: "1", | |
title: "My New Project", | |
selected_repository: null, | |
git_provider: null, | |
selected_branch: null, | |
last_updated_at: new Date().toISOString(), | |
created_at: new Date().toISOString(), | |
status: "RUNNING", | |
url: null, | |
session_api_key: null, | |
}, | |
{ | |
conversation_id: "2", | |
title: "Repo Testing", | |
selected_repository: "octocat/hello-world", | |
git_provider: "github", | |
selected_branch: null, | |
// 2 days ago | |
last_updated_at: new Date( | |
Date.now() - 2 * 24 * 60 * 60 * 1000, | |
).toISOString(), | |
created_at: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(), | |
status: "STOPPED", | |
url: null, | |
session_api_key: null, | |
}, | |
{ | |
conversation_id: "3", | |
title: "Another Project", | |
selected_repository: "octocat/earth", | |
git_provider: null, | |
selected_branch: "main", | |
// 5 days ago | |
last_updated_at: new Date( | |
Date.now() - 5 * 24 * 60 * 60 * 1000, | |
).toISOString(), | |
created_at: new Date(Date.now() - 5 * 24 * 60 * 60 * 1000).toISOString(), | |
status: "STOPPED", | |
url: null, | |
session_api_key: null, | |
}, | |
]; | |
const CONVERSATIONS = new Map<string, Conversation>( | |
conversations.map((conversation) => [ | |
conversation.conversation_id, | |
conversation, | |
]), | |
); | |
const openHandsHandlers = [ | |
http.get("/api/options/models", async () => | |
HttpResponse.json([ | |
"gpt-3.5-turbo", | |
"gpt-4o", | |
"gpt-4o-mini", | |
"anthropic/claude-3.5", | |
"anthropic/claude-sonnet-4-20250514", | |
]), | |
), | |
http.get("/api/options/agents", async () => | |
HttpResponse.json(["CodeActAgent", "CoActAgent"]), | |
), | |
http.get("/api/options/security-analyzers", async () => | |
HttpResponse.json(["mock-invariant"]), | |
), | |
http.post("http://localhost:3001/api/submit-feedback", async () => { | |
await delay(1200); | |
return HttpResponse.json({ | |
statusCode: 200, | |
body: { message: "Success", link: "fake-url.com", password: "abc123" }, | |
}); | |
}), | |
]; | |
export const handlers = [ | |
...STRIPE_BILLING_HANDLERS, | |
...FILE_SERVICE_HANDLERS, | |
...TASK_SUGGESTIONS_HANDLERS, | |
...SECRETS_HANDLERS, | |
...openHandsHandlers, | |
http.get("/api/user/repositories", () => { | |
const data: GitRepository[] = [ | |
{ | |
id: 1, | |
full_name: "octocat/hello-world", | |
git_provider: "github", | |
is_public: true, | |
}, | |
{ | |
id: 2, | |
full_name: "octocat/earth", | |
git_provider: "github", | |
is_public: true, | |
}, | |
]; | |
return HttpResponse.json(data); | |
}), | |
http.get("/api/user/info", () => { | |
const user: GitUser = { | |
id: 1, | |
login: "octocat", | |
avatar_url: "https://avatars.githubusercontent.com/u/583231?v=4", | |
company: "GitHub", | |
email: "[email protected]", | |
name: "monalisa octocat", | |
}; | |
return HttpResponse.json(user); | |
}), | |
http.post("http://localhost:3001/api/submit-feedback", async () => | |
HttpResponse.json({ statusCode: 200 }, { status: 200 }), | |
), | |
http.post("https://us.i.posthog.com/e", async () => | |
HttpResponse.json(null, { status: 200 }), | |
), | |
http.get("/api/options/config", () => { | |
const mockSaas = import.meta.env.VITE_MOCK_SAAS === "true"; | |
const config: GetConfigResponse = { | |
APP_MODE: mockSaas ? "saas" : "oss", | |
GITHUB_CLIENT_ID: "fake-github-client-id", | |
POSTHOG_CLIENT_KEY: "fake-posthog-client-key", | |
STRIPE_PUBLISHABLE_KEY: "", | |
FEATURE_FLAGS: { | |
ENABLE_BILLING: false, | |
HIDE_LLM_SETTINGS: mockSaas, | |
}, | |
}; | |
return HttpResponse.json(config); | |
}), | |
http.get("/api/settings", async () => { | |
await delay(); | |
const { settings } = MOCK_USER_PREFERENCES; | |
if (!settings) return HttpResponse.json(null, { status: 404 }); | |
if (Object.keys(settings.provider_tokens_set).length > 0) | |
settings.provider_tokens_set = {}; | |
return HttpResponse.json(settings); | |
}), | |
http.post("/api/settings", async ({ request }) => { | |
await delay(); | |
const body = await request.json(); | |
if (body) { | |
let newSettings: Partial<PostApiSettings> = {}; | |
if (typeof body === "object") { | |
newSettings = { ...body }; | |
} | |
const fullSettings = { | |
...MOCK_DEFAULT_USER_SETTINGS, | |
...MOCK_USER_PREFERENCES.settings, | |
...newSettings, | |
}; | |
MOCK_USER_PREFERENCES.settings = fullSettings; | |
return HttpResponse.json(null, { status: 200 }); | |
} | |
return HttpResponse.json(null, { status: 400 }); | |
}), | |
http.post("/api/authenticate", async () => | |
HttpResponse.json({ message: "Authenticated" }), | |
), | |
http.get("/api/conversations", async () => { | |
const values = Array.from(CONVERSATIONS.values()); | |
const results: ResultSet<Conversation> = { | |
results: values, | |
next_page_id: null, | |
}; | |
return HttpResponse.json(results, { status: 200 }); | |
}), | |
http.delete("/api/conversations/:conversationId", async ({ params }) => { | |
const { conversationId } = params; | |
if (typeof conversationId === "string") { | |
CONVERSATIONS.delete(conversationId); | |
return HttpResponse.json(null, { status: 200 }); | |
} | |
return HttpResponse.json(null, { status: 404 }); | |
}), | |
http.patch( | |
"/api/conversations/:conversationId", | |
async ({ params, request }) => { | |
const { conversationId } = params; | |
if (typeof conversationId === "string") { | |
const conversation = CONVERSATIONS.get(conversationId); | |
if (conversation) { | |
const body = await request.json(); | |
if (typeof body === "object" && body?.title) { | |
CONVERSATIONS.set(conversationId, { | |
...conversation, | |
title: body.title, | |
}); | |
return HttpResponse.json(null, { status: 200 }); | |
} | |
} | |
} | |
return HttpResponse.json(null, { status: 404 }); | |
}, | |
), | |
http.post("/api/conversations", async () => { | |
await delay(); | |
const conversation: Conversation = { | |
conversation_id: (Math.random() * 100).toString(), | |
title: "New Conversation", | |
selected_repository: null, | |
git_provider: null, | |
selected_branch: null, | |
last_updated_at: new Date().toISOString(), | |
created_at: new Date().toISOString(), | |
status: "RUNNING", | |
url: null, | |
session_api_key: null, | |
}; | |
CONVERSATIONS.set(conversation.conversation_id, conversation); | |
return HttpResponse.json(conversation, { status: 201 }); | |
}), | |
http.get("/api/conversations/:conversationId", async ({ params }) => { | |
const { conversationId } = params; | |
if (typeof conversationId === "string") { | |
const project = CONVERSATIONS.get(conversationId); | |
if (project) { | |
return HttpResponse.json(project, { status: 200 }); | |
} | |
} | |
return HttpResponse.json(null, { status: 404 }); | |
}), | |
http.post("/api/logout", () => HttpResponse.json(null, { status: 200 })), | |
http.post("/api/reset-settings", async () => { | |
await delay(); | |
MOCK_USER_PREFERENCES.settings = { ...MOCK_DEFAULT_USER_SETTINGS }; | |
return HttpResponse.json(null, { status: 200 }); | |
}), | |
http.post("/api/add-git-providers", async ({ request }) => { | |
const body = await request.json(); | |
if (typeof body === "object" && body?.provider_tokens) { | |
const rawTokens = body.provider_tokens as Record< | |
string, | |
{ token?: string } | |
>; | |
const providerTokensSet: Partial<Record<Provider, string | null>> = | |
Object.fromEntries( | |
Object.entries(rawTokens) | |
.filter(([, val]) => val && val.token) | |
.map(([provider]) => [provider as Provider, ""]), | |
); | |
const newSettings = { | |
...(MOCK_USER_PREFERENCES.settings ?? MOCK_DEFAULT_USER_SETTINGS), | |
provider_tokens_set: providerTokensSet, | |
}; | |
MOCK_USER_PREFERENCES.settings = newSettings; | |
return HttpResponse.json(true, { status: 200 }); | |
} | |
return HttpResponse.json(null, { status: 400 }); | |
}), | |
]; | |