Skip to content

Commit

Permalink
Fix warning about missing assertions when using assert_api_conform in…
Browse files Browse the repository at this point in the history
… Minitest
  • Loading branch information
ahx committed Jan 16, 2025
1 parent 42a6b2a commit 73db585
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 16 deletions.
3 changes: 1 addition & 2 deletions examples/rack_handler.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@

App = Rack::Builder.new do
spec = OpenapiFirst.load(File.expand_path('./openapi.yaml', __dir__))
use(OpenapiFirst::Middlewares::RequestValidation, raise_error: true, spec:)
use(OpenapiFirst::Middlewares::ResponseValidation, spec:)
use(OpenapiFirst::Middlewares::RequestValidation, spec:)

not_found = ->(_request) { [404, {}, []] }
handlers = {
Expand Down
25 changes: 15 additions & 10 deletions lib/openapi_first/test/methods.rb
Original file line number Diff line number Diff line change
@@ -1,20 +1,25 @@
# frozen_string_literal: true

require_relative 'minitest_helpers'
require_relative 'plain_helpers'

module OpenapiFirst
# Test integration
module Test
def self.minitest?(base)
base.include?(::Minitest::Assertions)
rescue NameError
false
end

# Methods to use in integration tests
module Methods
def assert_api_conform(status: nil, api: :default)
api = OpenapiFirst::Test[api]
request = respond_to?(:last_request) ? last_request : @request
response = respond_to?(:last_response) ? last_response : @response
if status && status != response.status
raise OpenapiFirst::Error,
"Expected status #{status}, but got #{response.status} " \
"from #{request.request_method.upcase} #{request.path}."
def self.included(base)
if Test.minitest?(base)
base.include(OpenapiFirst::Test::MinitestHelpers)
else
base.include(OpenapiFirst::Test::PlainHelpers)
end
api.validate_request(request, raise_error: true)
api.validate_response(request, response, raise_error: true)
end
end
end
Expand Down
26 changes: 26 additions & 0 deletions lib/openapi_first/test/minitest_helpers.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# frozen_string_literal: true

module OpenapiFirst
module Test
# Assertion methods for Minitest
module MinitestHelpers
def assert_api_conform(status: nil, api: :default)
api = OpenapiFirst::Test[api]
request = respond_to?(:last_request) ? last_request : @request
response = respond_to?(:last_response) ? last_response : @response

if status
assert_equal status, response.status,
"Expected status #{status}, but got #{response.status} " \
"from #{request.request_method.upcase} #{request.path}."
end

validated_request = api.validate_request(request, raise_error: false)
validated_response = api.validate_response(request, response, raise_error: false)

assert validated_request.valid?, validated_request.error&.exception_message
assert validated_response.valid?, validated_response.error&.exception_message
end
end
end
end
24 changes: 24 additions & 0 deletions lib/openapi_first/test/plain_helpers.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# frozen_string_literal: true

module OpenapiFirst
module Test
# Assertion methods to use when no known test framework was found
# These methods just raise an exception if an error was found
module PlainHelpers
def assert_api_conform(status: nil, api: :default)
api = OpenapiFirst::Test[api]
request = respond_to?(:last_request) ? last_request : @request
response = respond_to?(:last_response) ? last_response : @response

if status && status != response.status
raise OpenapiFirst::Error,
"Expected status #{status}, but got #{response.status} " \
"from #{request.request_method.upcase} #{request.path}."
end

api.validate_request(request, raise_error: true)
api.validate_response(request, response, raise_error: true)
end
end
end
end
15 changes: 11 additions & 4 deletions spec/example_app_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,29 @@
require_relative 'spec_helper'
require_relative '../examples/rack_handler'

OpenapiFirst::Test.register(File.join(__dir__, '../examples/openapi.yaml'), as: :example_app)

RSpec.describe 'Example App' do
include Rack::Test::Methods
include OpenapiFirst::Test::Methods

def app
App
end

it 'is API conform' do
get '/'
assert_api_conform(status: 200, api: :example_app)
end

it 'does not explode' do
get '/'
expect(last_response.status).to eq(200)
expect(JSON.parse(last_response.body)).to eq('hello' => 'world')
end

it 'raises OpenapiFirst::NotFoundError' do
expect do
get '/unknown'
end.to raise_error OpenapiFirst::NotFoundError
it 'returns 404' do
get '/unknown'
expect(last_response.status).to eq(404)
end
end

0 comments on commit 73db585

Please sign in to comment.