Qithub-BOT / QiiCipher

✅ GitHub の SSH 公開鍵でファイルを暗号化およびローカルの秘密鍵で復号・署名・検証するスクリプトのリポジトリです。
https://qiita.com/KEINOS/items/2abce1e5b15d799ac6d7
Creative Commons Attribution Share Alike 4.0 International
4 stars 3 forks source link

動作テストの実装 〜 ヘルプ表示編 〜( Issue #14) #18

Closed KEINOS closed 3 years ago

KEINOS commented 3 years ago

ドラフト〜

やること

可能ならやりたいこと

やらないこと

Note

KEINOS commented 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 からの公開鍵を返す箇所を関数化して、テスト時にテスト用の公開鍵を返すようにモックできればガチャピンも喜ぶ、と。

なので、必要最低限な箇所の関数化もすることにしよう。

yoshi389111 commented 3 years ago

curl をモック化できればいい感じですかね

(関数のモックと同様にコマンドのモックもできるってどこかで見かけた気がするのですが、関数内限定ということなのかな)

yoshi389111 commented 3 years ago

手元で 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

私、何か勘違いしてますかね?

KEINOS commented 3 years ago

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 のモックで試してみる!!

ありがとうござい 💪 !!!

KEINOS commented 3 years ago

モック可能のようです。

おお、その動きだとできそうですね!!あざっす!!

KEINOS commented 3 years ago

全部のコマンドのテストの実装を 1 つの PR でやるのは粒度が大きいので、一旦テストのベースだけを PR しようと思います。 各コマンドのテストは個別の PR でしたいと思います。

KEINOS commented 3 years ago

なんか、curl のモックがうまくいかないので、とりあえず「引数がない場合は、エラー表示とステータス 1 で終了するか」のテストだけ実装したので、先に進めたいと思います。今日の夕方にはドラフトを外して PR します。

全コマンドの基本テストは、わたし荷は重かったでごめんなさい。

KEINOS commented 3 years ago

コミット数多めで申し訳ありませんが、お手隙にレビューお願いします。m( )m

yoshi389111 commented 3 years ago

動きは問題ないと思います。

が、一つ気になるのは、秘密鍵っぽいファイルをアップロードしてあると、GitHub のセキュリティチェックで警告が出ないですかね? (誤って秘密鍵を公開していると、GitHubが親切心から警告をしてくれるんじゃないかと思ったのです。そんなセキュリティチェックはないのかな?)

ともかく、LGTM です。

LGTM

KEINOS commented 3 years ago

GitHub のセキュリティチェックで警告が出ないですかね?

そうなんですよね。ソース内に埋め込みどころか、全部盛り盛りにファイルをぶっ込んでますもんね。

なんか IT 系ニュースとかで、それっぽい話を見た気もするのですが、公式には載ってなくて。サードパーティの GitHub App などはあるみたいなのですが。

なので、(今後テストに必要になるし)とりあえずマージして、警告が出たら OptOut する設定が出てくると思うので、報告したいと思います。