tl;dr
ギョームで利用している PaaS の仕様変更で HTTP リダイレクト設定を変更する必要があり, 設定変更後にもちゃんと意図した通りにリダイレクトを行われるかをテストする必要が出てきました. ということで, curl + 目視チェックは 1900 年代に置いてきたので, テストフレームワークを利用して機械的にチェックする仕組みを考えて作ってみましたのでメモです.
参考
以下のサイトを最大限参考にさせて頂きました.
polidog.jp
以前に mocha とか chai を少しだけ触ったことがあったので, 今回も mocha, chai を利用することにしました.
inokara.hateblo.jp
その他, 以下のような mocha エクステンションを利用することで, 意図した通りに動作させることが出来ました.
github.com
仕組み (?)
こういうのを
どういう呼び方したら良いかわかりませんが, とりあえず仕組みと呼ばせていただきます.
作ったもの
github.com
使い方
README まんまですが, redirects.txt
というファイルを以下のような内容で作成しておきます.
# PATH TARGET STATUS_CODE
/yahoo/ https://yahoo.co.jp/ 301
/google/ https://google.com/ 301
/ore/ https://oreno.tools/ 301
#
はコメントとしてご利用下さい. 各列の間はスペースで区切ります.
後は, 以下のように docker-compose run
するだけです.
$ docker-compose run --rm -e BASE_URL=http://10.0.102.10:19190 checker yarn run mocha
リポジトリには, 簡易的なサーバーを用意しているので, 動作の雰囲気を確認することが可能です. 上記の実行例では, 簡易的なサーバーに対してリクエスト投げています. 以下のように出力されます.
$ docker-compose run --rm -e BASE_URL=http://10.0.102.10:19190 checker yarn run mocha
yarn run v1.22.0
$ /work/node_modules/.bin/mocha
redirect 301 checks
✓ Testing code of http://10.0.102.10:19190/yahoo/
✓ Testing code of http://10.0.102.10:19190/google/
✓ Testing code of http://10.0.102.10:19190/ore/
redirected site 200 checks
✓ Testing code of http://10.0.102.10:19190/yahoo/ (234ms)
✓ Testing code of http://10.0.102.10:19190/google/ (207ms)
✓ Testing code of http://10.0.102.10:19190/ore/ (143ms)
6 passing (631ms)
Done in 2.40s.
応用 (と言う程ではないけど
実際に動いているサービスのリダイレクト設定をチェックしたい場合には, redirects.txt を作成した上で, BASE_URL
を実際に動いているサービスに指定するだけです.
$ docker-compose run --rm -e BASE_URL=https://your-service.domain checker yarn run mocha
(個人的に) 苦労したところ
ループ内で request が動かない
動かないというわけではないんですが, 意図したように動かずに苦労しました.
以下のような redirects.txt を用いた場合...
/yahoo/ https://yahoo.co.jp/ 301
/google/ https://google.com/ 301
/ore/ https://oreno.tools/ 301
最後の一行しか request で動いていないように見えて... 以下は, 当初, 参考にさせて頂いた記事から拝借したコードです.
describe('redirect 301 checks', function() {
let data;
for (data of target_urls(file)) {
it('should return 301: ' + data.uri, function(done) {
request.get({
followRedirect: false,
uri: data.uri
}, function(err, res, body) {
expect(res.statusCode).to.equal(Number(data.statusCode));
done();
});
});
}
});
試行錯誤した結果, request をループで順序どおりに実行させるには一手間必要というところまでは解ったので, 今回は it.each という Mocha のエクステンションを利用することにしました. 以下, it.each で書き換えたコードです.
describe('redirect 301 checks', function(){
it.each(URLs, 'should return 301: %s', ['uri'], function(element, done){
request.get({
followRedirect: false,
uri: element.uri,
}, function(err, res, body) {
expect(res.statusCode).to.equal(Number(element.statusCode));
done();
});
});
});
しかし, なぜ, ループ内で request が順序どおりに動作しないのかが明確に理解出来ていないのが残念です. 引き続き, 修行が必要です.
以上
素敵なリダイレクト生活をお送り下さい.