ようへいの日々精進XP

よかろうもん

mocha とか chai を利用して HTTP リダイレクトの設定が意図した通りにリダイレクトされるかチェックする

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 を用いた場合...

# PATH TARGET STATUS_CODE
/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 が順序どおりに動作しないのかが明確に理解出来ていないのが残念です. 引き続き, 修行が必要です.

以上

素敵なリダイレクト生活をお送り下さい.