1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
# frozen_string_literal: true
require 'spec_helper'
describe Grape::Middleware::Versioner::Path do
subject { described_class.new(app, **options) }
let(:app) { ->(env) { [200, env, env['api.version']] } }
let(:options) { {} }
it 'sets the API version based on the first path' do
expect(subject.call('PATH_INFO' => '/v1/awesome').last).to eq('v1')
end
it 'does not cut the version out of the path' do
expect(subject.call('PATH_INFO' => '/v1/awesome')[1]['PATH_INFO']).to eq('/v1/awesome')
end
it 'provides a nil version if no path is given' do
expect(subject.call('PATH_INFO' => '/').last).to be_nil
end
context 'with a pattern' do
let(:options) { { pattern: /v./i } }
it 'sets the version if it matches' do
expect(subject.call('PATH_INFO' => '/v1/awesome').last).to eq('v1')
end
it 'ignores the version if it fails to match' do
expect(subject.call('PATH_INFO' => '/awesome/radical').last).to be_nil
end
end
[%w[v1 v2], %i[v1 v2], [:v1, 'v2'], ['v1', :v2]].each do |versions|
context "with specified versions as #{versions}" do
let(:options) { { versions: versions } }
it 'throws an error if a non-allowed version is specified' do
expect(catch(:error) { subject.call('PATH_INFO' => '/v3/awesome') }[:status]).to eq(404)
end
it 'allows versions that have been specified' do
expect(subject.call('PATH_INFO' => '/v1/asoasd').last).to eq('v1')
end
end
end
context 'with prefix, but requested version is not matched' do
let(:options) { { prefix: '/v1', pattern: /v./i } }
it 'recognizes potential version' do
expect(subject.call('PATH_INFO' => '/v3/foo').last).to eq('v3')
end
end
context 'with mount path' do
let(:options) { { mount_path: '/mounted', versions: [:v1] } }
it 'recognizes potential version' do
expect(subject.call('PATH_INFO' => '/mounted/v1/foo').last).to eq('v1')
end
end
end
|