Appearance
有料記事 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() のホストが localhost、127.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:installWordPress ドキュメントルートは WP_ROOT で指定できます。Local の slotkouryaku では次のパスを使います。
bash
export WP_ROOT="/Users/a/Local Sites/slotkouryaku/app/public"毎回 export したくない場合は、config/local.env に WP_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_001のpaid_articledb_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_testexternal_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_001cleanup は同じ 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_id は cs_test_ で始まる値のみ受け付けます。external_provider = 'stripe' だけを条件にした広範な DELETE は行いません。
Playwright から使う
config/local.env に WP_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-accessPLAYWRIGHT_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:headedheaded でも、この suite は記事を開いて CTA / 本文の有無を断言するだけです。ログインフォームや Stripe Checkout の操作は出ません(cookie ログイン + DB fixture)。Checkout の画面操作を見たい場合は 有料記事 Stripe Checkout / Webhook E2E 方針 の test:e2e:paid-article-stripe:headed を使います。
WP_ROOT や WP_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:e2e や test:e2e:paid-article-access を実行すると失敗します。
対応:
- 上記「事前準備」どおり
/tmp/wp-cli-slotkouryakuなどの実行可能ラッパーを作る config/local.envまたはexportでWP_CLI_BIN=/tmp/wp-cli-slotkouryakuとWP_ROOT=...を設定する- 必要なら
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-accessDB 接続に失敗する
Error establishing a database connection や mysqli_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 環境が別途必要