105 lines
2.7 KiB
Ruby
105 lines
2.7 KiB
Ruby
|
require 'spec_helper'
|
||
|
|
||
|
describe API::Features do
|
||
|
let(:user) { create(:user) }
|
||
|
let(:admin) { create(:admin) }
|
||
|
|
||
|
describe 'GET /features' do
|
||
|
let(:expected_features) do
|
||
|
[
|
||
|
{
|
||
|
'name' => 'feature_1',
|
||
|
'state' => 'on',
|
||
|
'gates' => [{ 'key' => 'boolean', 'value' => true }]
|
||
|
},
|
||
|
{
|
||
|
'name' => 'feature_2',
|
||
|
'state' => 'off',
|
||
|
'gates' => [{ 'key' => 'boolean', 'value' => false }]
|
||
|
}
|
||
|
]
|
||
|
end
|
||
|
|
||
|
before do
|
||
|
Feature.get('feature_1').enable
|
||
|
Feature.get('feature_2').disable
|
||
|
end
|
||
|
|
||
|
it 'returns a 401 for anonymous users' do
|
||
|
get api('/features')
|
||
|
|
||
|
expect(response).to have_http_status(401)
|
||
|
end
|
||
|
|
||
|
it 'returns a 403 for users' do
|
||
|
get api('/features', user)
|
||
|
|
||
|
expect(response).to have_http_status(403)
|
||
|
end
|
||
|
|
||
|
it 'returns the feature list for admins' do
|
||
|
get api('/features', admin)
|
||
|
|
||
|
expect(response).to have_http_status(200)
|
||
|
expect(json_response).to match_array(expected_features)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe 'POST /feature' do
|
||
|
let(:feature_name) { 'my_feature' }
|
||
|
it 'returns a 401 for anonymous users' do
|
||
|
post api("/features/#{feature_name}")
|
||
|
|
||
|
expect(response).to have_http_status(401)
|
||
|
end
|
||
|
|
||
|
it 'returns a 403 for users' do
|
||
|
post api("/features/#{feature_name}", user)
|
||
|
|
||
|
expect(response).to have_http_status(403)
|
||
|
end
|
||
|
|
||
|
it 'creates an enabled feature if passed true' do
|
||
|
post api("/features/#{feature_name}", admin), value: 'true'
|
||
|
|
||
|
expect(response).to have_http_status(201)
|
||
|
expect(Feature.get(feature_name)).to be_enabled
|
||
|
end
|
||
|
|
||
|
it 'creates a feature with the given percentage if passed an integer' do
|
||
|
post api("/features/#{feature_name}", admin), value: '50'
|
||
|
|
||
|
expect(response).to have_http_status(201)
|
||
|
expect(Feature.get(feature_name).percentage_of_time_value).to be(50)
|
||
|
end
|
||
|
|
||
|
context 'when the feature exists' do
|
||
|
let(:feature) { Feature.get(feature_name) }
|
||
|
|
||
|
before do
|
||
|
feature.disable # This also persists the feature on the DB
|
||
|
end
|
||
|
|
||
|
it 'enables the feature if passed true' do
|
||
|
post api("/features/#{feature_name}", admin), value: 'true'
|
||
|
|
||
|
expect(response).to have_http_status(201)
|
||
|
expect(feature).to be_enabled
|
||
|
end
|
||
|
|
||
|
context 'with a pre-existing percentage value' do
|
||
|
before do
|
||
|
feature.enable_percentage_of_time(50)
|
||
|
end
|
||
|
|
||
|
it 'updates the percentage of time if passed an integer' do
|
||
|
post api("/features/#{feature_name}", admin), value: '30'
|
||
|
|
||
|
expect(response).to have_http_status(201)
|
||
|
expect(Feature.get(feature_name).percentage_of_time_value).to be(30)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|