Closed KEINOS closed 3 years ago
う〜ん。基本動作のテストをしようにも色々と関数化しないとテストできないや。
例えば enc KEINOS ./sample.txt
時に https://github.com/KEINOS.keys
から公開鍵を取得する箇所を関数化しないとモックしづらいし、環境変数にセットされていた場合にそれを利用するにしても、いささか煩雑な分岐が発生してしまう。
shellspec
の「関数のモック」自体は簡単。例えば、以下のような関数があった場合:
unixtime() { date +%s; }
unixtime
の中で使われる date
の挙動を変えて色々試したい場合は、テスト内で関数をオーバーライドできる。
Describe 'unixtime return value'
Mock date
echo 1546268400
End
It 'should return the mocked value'
When call unixtime
The output should eq 1546268400
End
End
(Mocking @ shellspec.info より)
つまり、引数の KEINOS
から該当する GitHub からの公開鍵を返す箇所を関数化して、テスト時にテスト用の公開鍵を返すようにモックできればガチャピンも喜ぶ、と。
なので、必要最低限な箇所の関数化もすることにしよう。
curl をモック化できればいい感じですかね
(関数のモックと同様にコマンドのモックもできるってどこかで見かけた気がするのですが、関数内限定ということなのかな)
手元で curl のモックができないのか確認してみたのですが、モック可能のようです。
hello.sh:
#!/bin/bash
curl -s https://github.com/KEINOS.keys
spec/hello_spec.sh:
# shellcheck shell=sh
Describe "hello"
Mock curl
echo "hello"
End
It 'curl test'
When run source ./hello.sh
The output should eq 'hello'
End
End
私、何か勘違いしてますかね?
curl をモック化できればいい感じ
O! M! G! 😱 そうじゃん!それ一発だけで結構テストできそうじゃん!さすが!!
こういうイメージよね。(バイナリで文字列比較ができるのかってのもあるけど)
Describe 'enc command'
Mock curl
echo [ここにダミーの公開鍵]
End
It 'should return the mocked value'
When run enc KEINOS "/path/to/test/data.txt" "/path/to/encoded/data.enc"
expect=$(cat "/path/to/test/data.enc")
actual=$(cat "/path/to/encoded/data.enc")
The path "/path/to/encoded/data.enc" should be file
The variable "$expect" should equal "$actual"
End
End
関数化とそのテストをはじめちゃったので、一旦それらをスタッシュして、cURL
のモックで試してみる!!
ありがとうござい 💪 !!!
モック可能のようです。
おお、その動きだとできそうですね!!あざっす!!
全部のコマンドのテストの実装を 1 つの PR でやるのは粒度が大きいので、一旦テストのベースだけを PR しようと思います。 各コマンドのテストは個別の PR でしたいと思います。
なんか、curl
のモックがうまくいかないので、とりあえず「引数がない場合は、エラー表示とステータス 1 で終了するか」のテストだけ実装したので、先に進めたいと思います。今日の夕方にはドラフトを外して PR します。
全コマンドの基本テストは、わたし荷は重かったでごめんなさい。
コミット数多めで申し訳ありませんが、お手隙にレビューお願いします。m( )m
動きは問題ないと思います。
が、一つ気になるのは、秘密鍵っぽいファイルをアップロードしてあると、GitHub のセキュリティチェックで警告が出ないですかね? (誤って秘密鍵を公開していると、GitHubが親切心から警告をしてくれるんじゃないかと思ったのです。そんなセキュリティチェックはないのかな?)
ともかく、LGTM です。
GitHub のセキュリティチェックで警告が出ないですかね?
そうなんですよね。ソース内に埋め込みどころか、全部盛り盛りにファイルをぶっ込んでますもんね。
なんか IT 系ニュースとかで、それっぽい話を見た気もするのですが、公式には載ってなくて。サードパーティの GitHub App などはあるみたいなのですが。
なので、(今後テストに必要になるし)とりあえずマージして、警告が出たら OptOut する設定が出てくると思うので、報告したいと思います。
ドラフト〜
やること
./tests/.ssh
./.github/run-test.sh
可能ならやりたいこと
やらないこと
Note
rebase
&force push
でmain
ブランチの変更に追随します。