Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

wish_cardのusecase以下を追加 #25

Open
wants to merge 161 commits into
base: develop
Choose a base branch
from

Conversation

akubi0w1
Copy link
Contributor

@akubi0w1 akubi0w1 commented Sep 9, 2020

Issue

【やりたいことリスト詳細画面】やりたいことの追加・削除・更新
close #1

概要

やりたいことのCRUDを追加。

変更内容

wish_card, tag, place, wish_card_tagにおいて、必要なmodel, entity, repository, service, usecaseの追加と、テストの追加。
usecaseについては異常系のテストを書いていない。理由は、usecaseで起きるエラーが基本的にmockから返ってくるエラーのみであるため。
テストにおいてmockを使用する場合、mockは絶対にエラーを返さない前提でテストを記述した。

動作確認方法

  • テストとlogパッケージなどを用いた出力で動作確認。
  • dbはdockerで建てたものにlocalから接続。
  • (dockerにて、走っているAPIの死活監視用エンドポイントにアクセスすることができている & ビルドはできる)

補足事項

必要そうな機能って感じで作ったので、必要十分かはわからん...

@TakumaKurosawa TakumaKurosawa added the enhancement New feature or request label Sep 9, 2020
Copy link
Contributor

@TakumaKurosawa TakumaKurosawa left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

一旦テスト関連でここまで!
内部実装などはまた見ます!

@@ -0,0 +1,201 @@
package wish_card
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

package名は、スネークケースやキャメルケースを利用しない形でお願い!

Suggested change
package wish_card
package wishcard

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

承知です!パッケージなんやけど、自動生成のmockも改めて指定した方がいいですか?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

いや、mockに関してはそのままで大丈夫!!!
@akubi0w1

Comment on lines 34 to 39
var err error
// TODO: 環境変数とか使いたい気持ちもする
db, err = sql.Open("mysql", "root:root@tcp(localhost:3306)/wantum?parseTime=true")
if err != nil {
log.Fatal("faild to connect db: ", err)
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここだけど、素直にwantum/db/mysqlCreateSQLInstanceを使ってあげれば良さそう!
そうしてあげれば、DBの環境依存がなくせるかな!

Suggested change
var err error
// TODO: 環境変数とか使いたい気持ちもする
db, err = sql.Open("mysql", "root:root@tcp(localhost:3306)/wantum?parseTime=true")
if err != nil {
log.Fatal("faild to connect db: ", err)
}
db := mysql.CreateSQLInstance()

Copy link
Contributor Author

@akubi0w1 akubi0w1 Sep 9, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これなんやけど、テストで必ずローカルのDB使いたいから手動で毎回繋いでいるんよね。
CreateSQLInstanceつかってる状態で、gcp導入しちゃうと、本番環境のDBでテスト始めてしまうかも知らんので、それを避けるために毎回作ってる感じです。。。
テスト用に接続用の関数作るのはありかも。。。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@akubi0w1
であれば、mysql.connectLocalSQL()をグローバル化してそれを呼び出したら良いんじゃない??

Comment on lines 49 to 83
func TestInsert(t *testing.T) {
t.Run("success to insert data", func(t *testing.T) {
var err error
ctx := context.Background()
date := time.Date(2020, 9, 1, 12, 0, 0, 0, time.Local)
place := &model.PlaceModel{
Name: "sample place",
CreatedAt: &date,
UpdatedAt: &date,
}

var result int
err = txManager.Transaction(ctx, func(ctx context.Context, masterTx repository.MasterTx) error {
result, err = repo.Insert(ctx, masterTx, place)
return err
})

assert.NoError(t, err)
assert.NotNil(t, result)
})

t.Run("failed to insert data. data is nil", func(t *testing.T) {
var err error
ctx := context.Background()

var result int
err = txManager.Transaction(ctx, func(ctx context.Context, masterTx repository.MasterTx) error {
result, err = repo.Insert(ctx, masterTx, nil)
return err
})

assert.Error(t, err)
assert.Equal(t, 0, result)
})
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここだけじゃないんだけど、基本的にt.Runで入れ子構造は表せないので、素直にTestPlace_Insert_Successなどで定義してあげたほうが良さそう。

現状テストを走らせた時に得られる結果↓

{"level":"INFO","ts":"2020-09-09T16:19:48.646+0900","logger":"AppLogger","caller":"mysql/connect_db.go:63","msg":"connectLocalDB: root:96ta9kfzw1803_Takkuncolon@tcp(localhost:3306)/wantum?parseTime=true"}
=== RUN   TestInsert
--- PASS: TestInsert (0.01s)
=== RUN   TestInsert/success_to_insert_data
    --- PASS: TestInsert/success_to_insert_data (0.01s)
=== RUN   TestInsert/failure_to_insert_data._data_is_nil
    --- PASS: TestInsert/failure_to_insert_data._data_is_nil (0.00s)
=== RUN   TestUpdate
--- PASS: TestUpdate (0.01s)
=== RUN   TestUpdate/success_to_update_data
    --- PASS: TestUpdate/success_to_update_data (0.00s)
=== RUN   TestUpdate/success_to_update_data._done_at_is_null
    --- PASS: TestUpdate/success_to_update_data._done_at_is_null (0.00s)
=== RUN   TestUpdate/failure_to_update_data._data_is_nil
    --- PASS: TestUpdate/failure_to_update_data._data_is_nil (0.00s)
=== RUN   TestUpDeleteFlag
--- PASS: TestUpDeleteFlag (0.03s)
=== RUN   TestUpDeleteFlag/success_to_up_delete_flag
    --- PASS: TestUpDeleteFlag/success_to_up_delete_flag (0.02s)
=== RUN   TestUpDeleteFlag/failure_to_up_delete_flag._flag_is_nil
    --- PASS: TestUpDeleteFlag/failure_to_up_delete_flag._flag_is_nil (0.00s)
=== RUN   TestUpDeleteFlag/failure_to_up_delete_flag._data_is_nil
    --- PASS: TestUpDeleteFlag/failure_to_up_delete_flag._data_is_nil (0.00s)
=== RUN   TestDownDeleteFlag
--- PASS: TestDownDeleteFlag (0.01s)
=== RUN   TestDownDeleteFlag/success_to_down_delete_flag
    --- PASS: TestDownDeleteFlag/success_to_down_delete_flag (0.01s)
=== RUN   TestDownDeleteFlag/failure_to_up_delete_flag._data_is_nil
    --- PASS: TestDownDeleteFlag/failure_to_up_delete_flag._data_is_nil (0.00s)
=== RUN   TestDelete
--- PASS: TestDelete (0.01s)
=== RUN   TestDelete/success_to_up_delete_flag

あと、テストの関数については日本語も使えるので、エラーの検証ケースなどは日本語で条件やケースなどを書いてあげると良さそう!
俺が前内定者バイトでいたプロジェクトでも下記の様な関数名をつけていたよー

func TestInteractor_Enhance_アクセサリ所持上限(t *testing.T) {
	...
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

t.Runのところ、どういうことや...?サブテストみたいな分割でやってて、テスト走ってるから良いかなーと思ってたんだが...以下見た感じでもいけそうだなーと...
https://golang.org/pkg/testing/#hdr-Subtests_and_Sub_benchmarks

日本語いけるやつか!日本語にしますーー!!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

なんか、出力結果見た時にサブテスト(入れ子構造)がGo側では上手い感じで表示してくれないのかなーと思って出力結果を貼ったけど、今見たら、ちゃんと入れ子構造になってたわw
t.Runに関しては気にしないでOK!

Comment on lines 168 to 172
place := &model.PlaceModel{
Name: "sample place",
CreatedAt: &date,
UpdatedAt: &date,
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

この辺の構造体定義も、1ファイルの中で2回以上出てくる様な場合は一番上でvar()宣言してあげたほうが良いかな!
"sample place"も変数として切り出して良さそうだね。

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

そうやね、、、使う変数周りはちょっと見直してみますー!ありがとうーー!

@akubi0w1
Copy link
Contributor Author

レビューいただいたところを修正したりなどしましたー!お手すきの際にみていただけると幸いです(ㅅ ;´꒳`;)

  • pkg/api/usecase/wishcard/interactor.go フィールドに対するupdateを全部作る
  • pkg/api/usecase/wishcard/interactor.go wishcardtagserviceを消す。代わりに、wishcardserviceでタグのリレーションまで賄う
  • testコードのvarを全部一つにまとめる。repoの部分は毎回テストデータ作りたいので切り出してない。条件が割と多様なので。
  • interface定義は全部、改行なくす
  • time.Nowしているところ、命名をnowにする
  • errorのみ戻りで、直上の処理が1行の時は、ワンライナーでエラーハンドリング
  • repositoryでnilチェックしてるやつ、全外し
  • no rowsのエラーをnilにする
  • pkg/infrastructure/mysql/wishcard/repository.goの変数名を変更。record -> wishCard
  • goでバルクインサートの方法。stmt使うことにした。
  • wishCardInteractorでtagservice.getByNameを使うときの、errの握り潰しをなくす
  • service層: repo.insertから帰ってきた結果を、result -> newIDに変更
  • tag, placeのserviceにて、up/down delete flagを削除

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

【やりたいことリスト詳細画面】やりたいことの追加・削除・更新
2 participants