マジックリンク / パスワードレスログインをテストする
パスワードレス(マジックリンク)ログインは、ユーザーには心地よく、テストには厄介です。入力するパスワードがなく、メールで届く一度きりのリンクだけだからです。とはいえ朗報があります。これは開発者のためのメールテストに出てくる他のすべてと同じ「受信トレイを読む」パターンで、パスワードリセットのテストとはほぼ双子のような関係です。
フロー
- 新しい使い捨て受信トレイを払い出し、そのアドレス宛にマジックリンクを要求する。
- メールを読み、サインイン URL を取り出す。
- その URL を開き、認証済みセッションに入れることをアサートする。
例(Playwright)
const inbox = await createInbox()
await page.goto('/login')
await page.getByLabel('Email').fill(inbox.address)
await page.getByRole('button', { name: 'Send magic link' }).click()
const msg = await waitForMessage(inbox.id, 30000)
// first http(s) URL in the email body
const link = (msg.links && msg.links[0])
|| msg.text.split(/\s+/).find(w => w.indexOf('http') === 0)
await page.goto(link)
await expect(page.getByText('Signed in')).toBeVisible()
createInbox と waitForMessage のヘルパーは、Playwright チュートリアルのものです。Cypress のカスタムコマンドも同じように動きます。
エッジケース
期限切れのリンク、使い切り制御の確認(2 回目のクリックは失敗すべき)、そして存在しないアドレスへのリンク要求(ユーザー列挙を避けるため、応答は成功時と同じにする)です。いずれも上のフローの小さなバリエーションです。第二要素も絡む場合は、OTP と 2FA のテストと見比べてください。
はじめましょう
メールボックスを作成し、OpenAPI ドキュメントを読んで、受信トレイ呼び出しをスイートに組み込んでください。