diff --git a/tests/strategy_switch_worker_validation.mjs b/tests/strategy_switch_worker_validation.mjs index 120e959..e6057c7 100644 --- a/tests/strategy_switch_worker_validation.mjs +++ b/tests/strategy_switch_worker_validation.mjs @@ -132,6 +132,38 @@ assert.deepEqual(accountOptions.longbridge[0].supported_domains, ["us_equity", " assert.deepEqual(accountOptions.longbridge[1].supported_domains, ["us_equity", "hk_equity"]); assert.deepEqual(accountOptions.ibkr[0].supported_domains, ["us_equity", "hk_equity"]); +const originalFetch = globalThis.fetch; +globalThis.fetch = async (url) => { + const requestUrl = String(url); + if (requestUrl.endsWith("/CLOUD_RUN_SERVICE_TARGETS_JSON")) { + return new Response("", { status: 404 }); + } + if (requestUrl.endsWith("/RUNTIME_TARGET_JSON")) { + return new Response(JSON.stringify({ + value: JSON.stringify({ + platform_id: "schwab", + strategy_profile: "soxl_soxx_trend_income", + dry_run_only: false, + account_scope: "schwab", + service_name: "charles-schwab-quant-service", + execution_mode: "live", + }), + }), { status: 200, headers: { "Content-Type": "application/json" } }); + } + return new Response("", { status: 404 }); +}; +try { + const currentStrategies = await __test.loadCurrentStrategies( + { schwab: accountOptions.schwab }, + { RUNTIME_SETTINGS_DISPATCH_TOKEN: "test-token" }, + ); + assert.equal(currentStrategies.schwab.default.strategy_profile, "soxl_soxx_trend_income"); + assert.equal(currentStrategies.schwab.default.execution_mode, "live"); + assert.equal(currentStrategies.schwab.default.source, "RUNTIME_TARGET_JSON"); +} finally { + globalThis.fetch = originalFetch; +} + const longbridgeHk = __test.assertConfiguredAccount( { platform: "longbridge", diff --git a/web/strategy-switch-console/worker.js b/web/strategy-switch-console/worker.js index 71a94e4..f58b364 100644 --- a/web/strategy-switch-console/worker.js +++ b/web/strategy-switch-console/worker.js @@ -480,14 +480,13 @@ async function loadCurrentStrategies(accountOptions, env) { }; const currentStrategies = {}; - for (const platform of SUPPORTED_PLATFORMS) { + const platformResults = await Promise.all(SUPPORTED_PLATFORMS.map(async (platform) => { const options = Array.isArray(accountOptions[platform]) ? accountOptions[platform] : []; - if (!options.length) continue; + if (!options.length) return [platform, {}]; const repository = PLATFORM_REPOSITORIES[platform]; - if (!repository) continue; - const platformStrategies = {}; + if (!repository) return [platform, {}]; - for (const option of options) { + const optionResults = await Promise.all(options.map(async (option) => { const current = await resolveCurrentStrategyForAccount({ platform, option, @@ -495,9 +494,17 @@ async function loadCurrentStrategies(accountOptions, env) { repository, readVariable, }); - if (current) platformStrategies[option.key] = current; + return [option.key, current]; + })); + + const platformStrategies = {}; + for (const [key, current] of optionResults) { + if (current) platformStrategies[key] = current; } + return [platform, platformStrategies]; + })); + for (const [platform, platformStrategies] of platformResults) { if (Object.keys(platformStrategies).length) currentStrategies[platform] = platformStrategies; } return currentStrategies; @@ -1503,6 +1510,7 @@ export const __test = { assertConfiguredAccount, assertStrategyAllowedForAccount, inferAccountSupportedDomains, + loadCurrentStrategies, normalizeAccountOptionsPayload, normalizeStrategyProfilesPayload, requireSameOrigin,