committee-railsで読み込むOpen APIのスキーマを切り替える

2021/02/16に公開

https://zenn.dev/t_fukumoto/articles/576ae8e68f6975

そこまでめんどくさいことしなくていい気がしたのでやってみた。

やる

Committee::Rails::Test::Methods は Committee::Test::Methods になんかメソッドかぶせてるやつで、committee_options についてはデフォルト値をセットする or RSpec config を読んできてるだけみたい。

https://github.com/willnet/committee-rails/blob/master/lib/committee/rails/test/methods.rb

本体である Committee::Test::Methods はいろいろあるけど schema 経由で利用するスキーマを選んでいる。なので、schemaをハックしてやる。

https://github.com/interagent/committee/blob/master/lib/committee/test/methods.rb

RSpec.configure do |config|
  # あとで committee_options とか schema を置き換えるために先に include する
  include ::Committee::Rails::Test::Methods

  config.before(:each, type: :request) do |example|
    if # example で判定してやる
      @schema_variant = 'schema.release.yml'
    else
      @schema_variant = 'schema.debug.yml'
    end
  end

  # RSpec.config でやるのではなくメソッドを書くことで @schema_variant によって置き換わるように調整
  def committee_options
    {
      schema_path: Rails.root.join("path/to/schemadir", @schema_variant).to_s,
      prefix: '/v1',
      parse_response_by_content_type: false
    }
  end

  # Committee 本体は1行コードでキャッシュしてるので、こっちも @schema_variant によってキャッシュしてやる
  def schema
    @schemas ||= {}
    @schemas[@schema_variant] ||= Committee::Middleware::Base.get_schema(committee_options)
  end
end

RSpec の configure がそのままテストで使われるのでこれで動くけどバージョンとかによっては死ぬのかもしれない。手元のプロジェクトではうまく動いたので良しとする。

感想

Committee::Test::Methods の schema とか router だけど、名前被って事故りそうだなって思った。rubyのモジュール周りの細かい挙動しらないんだけど、モジュール同士で相互に上書きのリスクあるよね……?ないのかな。

Discussion