emahiro/b.log

Drastically Repeat Yourself !!!!

Firestore が絡んだテストで事前にデータを生成し終わったら削除する

Overview

テストを書くときにテストの実行前にデータを作成し、終わったら削除したくなる時がありますね?僕はあります。
Firestore が絡んだテストを書くときに Firestore Emulator を起動した状態で実際にデータを作成して、終わったら削除する場合の実装方法について記載します。

Sample

事前に Firestore Emulator を起動した状態で、愚直に Add してテストが完了したら defer で Truncatate します。

$gcloud beta emulators firestore start --host-port=localhost:$PORT

実装のサンプルは以下のようになると思います。かなり長ったらしいですが、他のテストのケースに影響を与えないように愚直にやるとこんな感じになるかなと思います。

tx := context.Background()
fs, err := firestore.NewClient(ctx, "$ProjectName")
coll := fs.Collection("$CollectionName")

tests := []struct{
    name string
    // テストデータ
    data interface{}
}{
    name: "case_1"
    data: inteface{}{}
}

for _, tt := range tests {
    tt := tt
    t.Run(tt.name, func(t *testing.T){
        // setup data
        if _, _, err := coll.Add(ctx, tt.data); err != nil {
            t.Fatal(err)
        }
        // data の削除
        defer func(){
            refs, err := coll.DocumentRefs(ctx).GetAll()
            if err != nil {
                t.Fatal(err)
            }
            for _, ref := range refs {
                batch := fs.Batch().Delete(ref)
                if _, err := batch.Commit(ctx); err != nil {
                    t.Fatal(err)
                }    
            }    
        }
    }
}

Refs

See Also

Firestore の js SDK には clearPersisitence というメソッドを教えてもらいまいたが、Go の Firestore SDK には実装されていなかったので使えませんでした...