MoeMail
ブログに戻る

パスワードリセットメールのフローをテストする

パスワードリセットは、壊れやすくテストもしにくい重要な経路です。メールで届く一意のリンクに依存しているからです。ここでは、使い捨ての受信トレイ API を使って、これをエンドツーエンドで自動化する方法を紹介します。開発者のためのメールテストの一部であり、OTP と 2FA のテストマジックリンクログインとも近い関係にあります。

フロー

  1. 新しい受信トレイを払い出し、そのアドレスでユーザーを作成する。
  2. そのアカウントのパスワードリセットを要求する。
  3. リセットメールを読み、リンクを取り出す。
  4. リンクを開いて新しいパスワードを設定し、ログインできることをアサートする。

例(Playwright)

const inbox = await createInbox()
await page.goto('/forgot-password')
await page.getByLabel('Email').fill(inbox.address)
await page.getByRole('button', { name: 'Send reset link' }).click()

const msg = await waitForMessage(inbox.id, 30000)
// take the 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 page.getByLabel('New password').fill('S0me-Str0ng-Pass')
await page.getByRole('button', { name: 'Reset password' }).click()
await expect(page.getByText('Password updated')).toBeVisible()

createInboxwaitForMessage のヘルパーは、Playwright チュートリアルと同じものです。Cypress では代わりにカスタムコマンドを使ってください。

カバーする価値のあるエッジケース

期限切れや使用済みのリンク、存在しないメールアドレスへのリセット要求(ユーザー列挙を避けるため、見た目は成功時と区別がつかないようにすべき)、そしてレート制限です。いずれも上のフローのちょっとしたバリエーションで済みます。

はじめましょう

メールボックスを作成し、API キーを取得して、OpenAPI ドキュメントを読み、受信トレイ呼び出しをスイートに組み込んでください。