【時を駆ける】StripeのTest Clocks ベータ版を試してみた

## はじめに
Stripeのテストクロックのベータ版が使えるようになったらしい、ということで軽く試してみました。
テストクロックは最近新しく追加された機能で、仮想の時計を使ってサブスクリプションのライフサイクルを再現できる素敵なツールです。

<b>※ 2022/3/7 追記  テストクロックが正式版としてリリースされました！</b>

https://twitter.com/StripeJapan/status/1500677135669035010

ダッシュボードのサブスクリプションのページに画像のようなリンクが表示されるようになります。

[![Image from Gyazo](https://i.gyazo.com/c90fc350390217feaffd898a237022bd.png)](https://gyazo.com/c90fc350390217feaffd898a237022bd)

## クロックを作成する
まずは、検証に使う架空の時計を作成します。この時計に対して顧客とサブスクリプションを紐づけて検証を行います。

画面の「新しいシミュレーション」からクロックを作成します。**作成したクロックは30日後に勝手に消える**ようです。

[![Image from Gyazo](https://i.gyazo.com/8a7bb0d806e11247af2801f1d3a76740.png)](https://gyazo.com/8a7bb0d806e11247af2801f1d3a76740)
curlコマンドでAPIからも作成できます。

```
curl https://api.stripe.com/v1/test_helpers/test_clocks -u <APIシークレットキー> -d "frozen_time"=1635750000 -d "name"="MySimulation1"
```


## 検証用の顧客を追加する
クロックに顧客を追加します。
[![Image from Gyazo](https://i.gyazo.com/206e80455f639df92fc67f931e89e67e.png)](https://gyazo.com/206e80455f639df92fc67f931e89e67e)
[![Image from Gyazo](https://i.gyazo.com/f9c73ca11f3b6b77cc112683986da4e1.png)](https://gyazo.com/f9c73ca11f3b6b77cc112683986da4e1)

## 顧客にカードを追加する
先ほど作成した顧客に決済するカードを追加します。
[![Image from Gyazo](https://i.gyazo.com/7879cdf76690f1860d81e58f0c311745.png)](https://gyazo.com/7879cdf76690f1860d81e58f0c311745)

[![Image from Gyazo](https://i.gyazo.com/6d81c595234e8e8a34e3cccc17b2131f.png)](https://gyazo.com/6d81c595234e8e8a34e3cccc17b2131f)

検証に使用できるカード番号はドキュメントをご確認ください。
[Testing | Stripe のドキュメント](https://stripe.com/docs/testing#cards)

## 顧客にサブスクリプションを作成する
顧客にサブスクリプションを紐づけます。
サブスクリプションは既存のものが使えるようです。

[![Image from Gyazo](https://i.gyazo.com/d0e2daba4646fa0e58f0ca3c329c9233.png)](https://gyazo.com/d0e2daba4646fa0e58f0ca3c329c9233)
[![Image from Gyazo](https://i.gyazo.com/6dfd780be2c3b78519c8bee7e45a2e93.png)](https://gyazo.com/6dfd780be2c3b78519c8bee7e45a2e93)


## Webhookイベントを待ち受ける
Webhookエンドポイントを設置して、Webhookイベントを処理するアプリケーションが期待通りの動きをするか観察します。
Stripe CLIを使って `stripe listen` すると発火されたイベントをリアルタイムで確認できます。
[Listen for events | Stripe CLI Reference](https://stripe.com/docs/cli/listen)

## 時計を進める
準備ができました。時を進めましょう。
ダッシュボードの _"Advance Time"_ からクロックを進めたい時点を指定します。

[![Image from Gyazo](https://i.gyazo.com/7b788b5bea1f4cf7873f3ed3b13e29fd.png)](https://gyazo.com/7b788b5bea1f4cf7873f3ed3b13e29fd)
[![Image from Gyazo](https://i.gyazo.com/b0289e9507d995a3bc8d48cc9f0812ed.jpg)](https://gyazo.com/b0289e9507d995a3bc8d48cc9f0812ed)

 _"進める"_ を押すと、数秒間かけてクロックの時間が進んでいきます。

## Webhookを確認する
期間中に起こるWebhookイベントが順番に発火されることを確認します。前後には以下のイベントが発火されます。

- `test_helpers.test_clock.advancing` -> 進行開始
- `test_helpers.test_clock.ready` -> 指定した時間まで進行完了
[![Image from Gyazo](https://i.gyazo.com/452b384c3babdc77662bdd46da05f173.png)](https://gyazo.com/452b384c3babdc77662bdd46da05f173)

## クロックを削除する
検証が終わったら、クロックを削除します。画面の _"Finish simulation"_ から削除できます。
[![Image from Gyazo](https://i.gyazo.com/65e89223c831511a50664256a291d642.png)](https://gyazo.com/65e89223c831511a50664256a291d642)

:::note
クロックの中で新しく作成された顧客やサブスクリプションは、このタイミングで一緒に削除されます。
:::



## 注意点
#### クロックは使い捨て
現実と同じようにクロックの時間は巻き戻すことができません。また、作成したクロックは30日後に自動で削除されます。
これらのことから、クロックは検証する度に使い捨てる運用を想定しているようです。

作成からクロックオブジェクトの紐づけまでをスクリプト化しておくのが良さそうです。

## 気になった点
使ってみて気になる点がいくつかありました。これらはフィードバックを送ってみようと思います。

#### Stripe CLIから操作できない
現状、コマンドラインからクロックを操作する際は curl コマンドでAPIを呼び出す必要があります。Stripe CLIから操作できないので正式リリースまでにコマンドが追加されると嬉しいです。
#### APIではfrozen_timeにUNIX時間を指定する
APIから`frozen_time`を指定するときはUNIX時間に変換してから指定する必要があります。UNIX時間以外にも時間とタイムゾーンの組み合わせで指定できるオプションが欲しいところです。
#### ダッシュボードからクロックのIDが分からない
クロックにはそれぞれID（_clock_XXXXXX_）があり、APIからクロックを操作する際は対象のクロックIDを引数に指定するのですが、ダッシュボードではこのIDを確認できません。他のリソースと同様にIDを表示してほしいなと感じました。
[![Image from Gyazo](https://i.gyazo.com/d4c186c802f53ab41dcee05f4a6a258e.png)](https://gyazo.com/d4c186c802f53ab41dcee05f4a6a258e)
[![Image from Gyazo](https://i.gyazo.com/d85951c5304befc3ae23c0d615c91618.png)](https://gyazo.com/d85951c5304befc3ae23c0d615c91618)

## まとめ
ベータ版を使ってみてとても便利な機能だと思いました。

サブスクリプションのWebhook検証は今まで請求間隔の短い商品を作ったり、実際に時間が経つのを待って検証していましたが、テストクロックを使うことでサクッと検証ができるようになりました。
顧客のカードを変更できるので有効期限切れなどのイベントを意図的に発生させたいときにも使えそうです。


## 参考リンク

https://stripe.com/docs/billing/testing/test_clocks