Skip to content

有料記事 E2E fixture 実行ガイド

目的

有料記事 E2E で使うテストユーザー、テスト用 paid_article、単号購入価格、購入履歴を run_id 単位で準備・片付けします。Stripe Checkout や Webhook は通さず、購入済み判定に必要な db_paid_article_purchase だけを external_provider = 'manual_test' で投入します。

責務

  • WP-CLI fixture: WordPress ユーザー、投稿、価格、購入履歴の作成・片付け
  • Playwright helper: WP-CLI fixture を呼び出し、テストから JSON 結果を利用する薄いラッパー
  • Playwright spec: fixture の戻り値を使って未購入・購入済み状態を検証する

fixture 本体は scripts/e2e/paid-article-fixture.php、Playwright helper は tests/e2e/helpers/paidArticleFixture.js です。

サイト内表示制御の E2E は tests/e2e/paid-article-access.spec.js に配置しています。

安全ガード

fixture 実行には SLOT_KOURYAKU_E2E_FIXTURE=1 が必要です。

また、home_url() のホストが localhost127.0.0.1*.local*.test のいずれかでない場合は停止します。承認済みの非本番リモート環境でだけ ALLOW_REMOTE_E2E_FIXTURE=1 を併用できます。

wp_get_environment_type()production の場合は、ALLOW_REMOTE_E2E_FIXTURE=1 を指定しても実行しません。

削除対象は以下に限定します。

  • external_provider = 'manual_test' かつ run_id 由来の external_transaction_id を持つ購入履歴
  • fixture marker meta _slot_kouryaku_e2e_fixture_run_id が一致する paid_article
  • run_id 由来の e2e_paid_article_* ユーザー。ただし、削除前に fixture marker user meta が run_id と一致することも確認します

prepare 時も同じ run_id 由来のユーザーまたは paid_article が既に存在する場合は、fixture marker meta が run_id と一致するものだけ再利用します。marker が無い既存データや、別 run_id の marker が付いたデータは更新しません。

事前準備

WordPress の Local 環境を起動し、WP-CLI が WordPress ドキュメントルートで使える状態にします。

bash
npm install
npm run test:e2e:install

WordPress ドキュメントルートは WP_ROOT で指定できます。Local の slotkouryaku では次のパスを使います。

bash
export WP_ROOT="/Users/a/Local Sites/slotkouryaku/app/public"

毎回 export したくない場合は、config/local.envWP_ROOT / WP_CLI_BIN を設定できます。config/local.env は Git 追跡外です。値の例は config/local.env.example を参照してください。

Local の MySQL socket を PHP/WP-CLI が自動検出できない場合は、mysqli.default_socket を指定した WP-CLI ラッパーを用意します。

bash
cat > /tmp/wp-cli-slotkouryaku <<'EOF'
#!/bin/sh
exec php \
  -d mysqli.default_socket="/Users/a/Library/Application Support/Local/run/<site-id>/mysql/mysqld.sock" \
  /path/to/wp-cli.phar "$@"
EOF
chmod +x /tmp/wp-cli-slotkouryaku

export WP_CLI_BIN=/tmp/wp-cli-slotkouryaku

<site-id> は Local の site ごとに異なります。次のように探せます。

bash
find "$HOME/Library/Application Support/Local/run" \
  -path '*/mysql/mysqld.sock' \
  -print

未購入状態を作る

tests/e2e/paid-article-access.spec.js は、テスト内で未購入状態を自動作成してから検証します。このコマンドは fixture だけを単体確認したい場合に使います。

bash
SLOT_KOURYAKU_E2E_FIXTURE=1 npm run test:e2e:fixture -- action=prepare state=unpaid run_id=local_unpaid_001

作成されるもの:

  • e2e_paid_article_local_unpaid_001 ユーザー(メール確認済み・現行利用規約同意済み。Checkout 到達可能な状態)
  • e2e-paid-article-local_unpaid_001paid_article
  • db_member_plan_master.plan_key = paid_article_single のテスト価格

購入履歴は作成しません。

購入済み状態を作る

bash
SLOT_KOURYAKU_E2E_FIXTURE=1 npm run test:e2e:fixture -- action=prepare state=purchased run_id=local_purchased_001 price=110

未購入状態のデータに加えて、db_paid_article_purchase に以下の購入履歴を投入します。

  • external_provider: manual_test
  • external_transaction_id: e2e_paid_article_<run_id>
  • user_id: fixture ユーザー
  • post_id: fixture 有料記事

片付け

bash
SLOT_KOURYAKU_E2E_FIXTURE=1 npm run test:e2e:fixture -- action=cleanup run_id=local_purchased_001

cleanup は同じ run_id の購入履歴(manual_test のみ)、投稿、ユーザーを削除します。fixture 実行前に存在していた paid_article_single の価格が保存されている場合は、その価格へ戻します。

Stripe 購入履歴の確認・片付け

Stripe Checkout 通し E2E(npm run test:e2e:paid-article-stripe)が作成した行は、external_provider = 'stripe' です。通常の cleanup では消しません。Session ID(cs_test_...)を指定して削除します。

bash
SLOT_KOURYAKU_E2E_FIXTURE=1 npm run test:e2e:fixture -- \
  action=find_stripe_purchase user_id=<user_id> post_id=<post_id>

SLOT_KOURYAKU_E2E_FIXTURE=1 npm run test:e2e:fixture -- \
  action=cleanup_stripe_purchase session_id=cs_test_... user_id=<user_id> post_id=<post_id>

session_idcs_test_ で始まる値のみ受け付けます。external_provider = 'stripe' だけを条件にした広範な DELETE は行いません。

Playwright から使う

config/local.envWP_ROOT / WP_CLI_BIN を設定済みの場合、通常は追加の export なしで実行できます。

js
const { cleanupPaidArticleFixture, preparePaidArticleFixture } = require('./helpers/paidArticleFixture');

test('購入済み状態を検証する', async ({ page }) => {
  const fixture = preparePaidArticleFixture({ state: 'purchased' });

  try {
    await page.goto(fixture.post.permalink);
    // fixture.user.login / fixture.user.password でログインして検証する
  } finally {
    cleanupPaidArticleFixture({ runId: fixture.runId });
  }
});

サイト内表示制御 E2E だけを実行する場合:

bash
npm run test:e2e:paid-article-access

PLAYWRIGHT_BASE_URL 未指定時は http://slotkouryaku.local を使います。別の Local URL で実行する場合だけ指定してください。

bash
PLAYWRIGHT_BASE_URL=http://example.local npm run test:e2e:paid-article-access

ブラウザを表示しながら確認する場合:

bash
npm run test:e2e:paid-article-access:headed

headed でも、この suite は記事を開いて CTA / 本文の有無を断言するだけです。ログインフォームや Stripe Checkout の操作は出ません(cookie ログイン + DB fixture)。Checkout の画面操作を見たい場合は 有料記事 Stripe Checkout / Webhook E2E 方針test:e2e:paid-article-stripe:headed を使います。

WP_ROOTWP_CLI_BIN を明示する場合:

bash
WP_ROOT="/Users/a/Local Sites/slotkouryaku/app/public" \
WP_CLI_BIN=/tmp/wp-cli-slotkouryaku \
SLOT_KOURYAKU_E2E_FIXTURE=1 \
npx playwright test tests/e2e/paid-article-access.spec.js

ブラウザを表示しながら確認する場合は --headed を付けます。

bash
WP_ROOT="/Users/a/Local Sites/slotkouryaku/app/public" \
WP_CLI_BIN=/tmp/wp-cli-slotkouryaku \
SLOT_KOURYAKU_E2E_FIXTURE=1 \
npx playwright test tests/e2e/paid-article-access.spec.js --headed

トラブルシュート

spawnSync wp ENOENT / WP-CLI binary not found

Playwright の execFileSync はシェルの alias wp=... を使いません。which wp がエイリアスだけを返す環境では、WP_CLI_BIN 未設定のまま npm run test:e2etest:e2e:paid-article-access を実行すると失敗します。

対応:

  1. 上記「事前準備」どおり /tmp/wp-cli-slotkouryaku などの実行可能ラッパーを作る
  2. config/local.env または exportWP_CLI_BIN=/tmp/wp-cli-slotkouryakuWP_ROOT=... を設定する
  3. 必要なら export SLOT_KOURYAKU_E2E_FIXTURE=1 を付けて再実行する
bash
WP_ROOT="/Users/a/Local Sites/slotkouryaku/app/public" \
WP_CLI_BIN=/tmp/wp-cli-slotkouryaku \
SLOT_KOURYAKU_E2E_FIXTURE=1 \
npm run test:e2e:paid-article-access

DB 接続に失敗する

Error establishing a database connectionmysqli_real_connect(): No such file or directory が出る場合は、Local の DB が起動しているか、mysqli.default_socket が Local の mysqld.sock を指しているか確認します。

core_src/vendor/autoload.php が見つからない

依存ディレクトリが未インストールの可能性があります。リポジトリルートと core_src/ で Composer 依存をインストールしてから再実行してください。

bash
composer install
composer install --working-dir=core_src

注意事項

  • 本番 DB では実行しない
  • 実ユーザー、実購入済み記事、実 Stripe 購入履歴を削除しない
  • run_id はテストごとに一意にする
  • paid_article_single の価格は共有値のため、fixture の並列実行は避ける
  • GitHub-hosted Actions での実行には、fixture を投入できる WordPress / DB / WP-CLI 環境が別途必要