/**
* E2E でアプリの起動が完了するまで待機する。
* 1) フロントのメイン UI(#query)が表示されるまで待つ
* 2) MCP (3001) の /edition が応答するまでポーリング
*
* 各 spec の before() で呼ぶこと。
* @param {import('@wdio/globals').browser} browser - WDIO browser
* @param {{ uiTimeout?: number, mcpTimeout?: number, mcpInterval?: number }} [opts]
*/
export async function waitForAppReady(browser, opts = {}) {
const uiTimeout = opts.uiTimeout ?? 20000;
const mcpMaxAttempts = Math.floor((opts.mcpTimeout ?? 20000) / (opts.mcpInterval ?? 500));
const mcpIntervalMs = opts.mcpInterval ?? 500;
const query = await browser.$('#query');
await query.waitForDisplayed({ timeout: uiTimeout });
for (let i = 0; i < mcpMaxAttempts; i++) {
const ok = await browser.executeAsync(function (done) {
fetch('http://127.0.0.1:3001/edition')
.then((r) => done(r.ok))
.catch(() => done(false));
});
if (ok) return;
await browser.pause(mcpIntervalMs);
}
throw new Error('MCP (3001) did not become ready in time');
}