🏄

rspec実行時にリクエストパラメーターがOpenAPIに定義されているかをチェックする方法

2024/03/31に公開

前置き、前提

  • committee前提です
  • 色々と端折って書いています(特にoperation_objectの部分)。すみません

本題

OpenAPIではtype: objectadditionalPropertiesは定義可能ですが、parametersにはadditionalParametersのような項目が用意されていません。

これにより、例えばスキーマ定義されていないパラメーターをrspec実行時にリクエストしても、エラーにならず(エラーにする方法が無く)、スキーマ定義漏れが起きる可能性があると感じていました。

そこで、rspec実行時に「スキーマ定義されているparametersと、rspecのリクエストされたパラメーターを比較し、スキーマ定義されていなければエラーにする」コードを書いてみました。

schema_path_item = operation_object.instance_variable_get(:@request_operation).instance_variable_get(:@path_item)
schema_parameter_keys = schema_path_item.send('get').parameters.map(&:name)
req_parameter_keys = request.query_parameters.keys
diffs = req_parameter_keys - schema_parameter_keys
raise Committee::InvalidRequest, "#{diffs.join(', ')は未定義です} if diffs.present?

参考になれば幸いです。

Discussion