Commit 9a56febd authored by Jason Goodman's avatar Jason Goodman Committed by Shinya Maeda

Sort feature flag strategies by ID for display in UI

Add features spec for user updates feature flag
parent ba7292b6
...@@ -28,7 +28,9 @@ class FeatureFlagEntity < Grape::Entity ...@@ -28,7 +28,9 @@ class FeatureFlagEntity < Grape::Entity
feature_flag.scopes.sort_by(&:id) feature_flag.scopes.sort_by(&:id)
end end
expose :strategies, with: FeatureFlags::StrategyEntity expose :strategies, with: FeatureFlags::StrategyEntity do |feature_flag|
feature_flag.strategies.sort_by(&:id)
end
private private
......
...@@ -358,6 +358,15 @@ describe Projects::FeatureFlagsController do ...@@ -358,6 +358,15 @@ describe Projects::FeatureFlagsController do
expect(response).to have_gitlab_http_status(:not_found) expect(response).to have_gitlab_http_status(:not_found)
end end
it 'returns strategies ordered by id' do
first_strategy = create(:operations_strategy, feature_flag: new_version_feature_flag)
second_strategy = create(:operations_strategy, feature_flag: new_version_feature_flag)
subject
expect(json_response['strategies'].map { |s| s['id'] }).to eq([first_strategy.id, second_strategy.id])
end
end end
end end
......
...@@ -31,6 +31,25 @@ describe 'User creates feature flag', :js do ...@@ -31,6 +31,25 @@ describe 'User creates feature flag', :js do
expect(page).to have_text('test_feature') expect(page).to have_text('test_feature')
end end
it 'user creates a flag with default environment scopes' do
visit(new_project_feature_flag_path(project))
set_feature_flag_info('test_flag', 'Test flag')
within_strategy_row(1) do
select 'All users', from: 'Type'
end
click_button 'Create feature flag'
expect_user_to_see_feature_flags_index_page
expect(page).to have_text('test_flag')
edit_feature_flag_button.click
within_strategy_row(1) do
expect(page).to have_text('All users')
expect(page).to have_text('All environments')
end
end
context 'with new version flags disabled' do context 'with new version flags disabled' do
before do before do
stub_feature_flags(feature_flags_new_version: false) stub_feature_flags(feature_flags_new_version: false)
......
...@@ -8,124 +8,166 @@ describe 'User updates feature flag', :js do ...@@ -8,124 +8,166 @@ describe 'User updates feature flag', :js do
let(:user) { create(:user) } let(:user) { create(:user) }
let(:project) { create(:project, namespace: user.namespace) } let(:project) { create(:project, namespace: user.namespace) }
let!(:feature_flag) do
create_flag(project, 'ci_live_trace', true,
description: 'For live trace feature')
end
let!(:scope) { create_scope(feature_flag, 'review/*', true) }
before do before do
project.add_developer(user) project.add_developer(user)
stub_licensed_features(feature_flags: true) stub_licensed_features(feature_flags: true)
stub_feature_flags(feature_flag_permissions: false) stub_feature_flags(feature_flag_permissions: false)
sign_in(user) sign_in(user)
visit(edit_project_feature_flag_path(project, feature_flag))
end end
it 'user sees persisted default scope' do context 'with a new version feature flag' do
within_scope_row(1) do let!(:feature_flag) do
within_environment_spec do create_flag(project, 'test_flag', true, version: Operations::FeatureFlag.versions['new_version_flag'],
expect(page).to have_content('* (All Environments)') description: 'For testing')
end
let!(:strategy) do
create(:operations_strategy, feature_flag: feature_flag,
name: 'default', parameters: {})
end
let!(:scope) do
create(:operations_scope, strategy: strategy, environment_scope: '*')
end
it 'user adds a second strategy' do
visit(edit_project_feature_flag_path(project, feature_flag))
click_button 'Add strategy'
within_strategy_row(2) do
select 'Percent rollout (logged in users)', from: 'Type'
fill_in 'Percentage', with: '15'
end end
click_button 'Save changes'
edit_feature_flag_button.click
within_status do within_strategy_row(1) do
expect(find('.project-feature-toggle')['aria-label']) expect(page).to have_text 'All users'
.to eq('Toggle Status: ON') expect(page).to have_text 'All environments'
end
within_strategy_row(2) do
expect(page).to have_text 'Percent rollout (logged in users)'
expect(page).to have_field 'Percentage', with: '15'
expect(page).to have_text 'All environments'
end end
end end
end end
context 'when user updates a status of a scope' do context 'with a legacy feature flag' do
before do let!(:feature_flag) do
within_scope_row(2) do create_flag(project, 'ci_live_trace', true,
within_status { find('.project-feature-toggle').click } description: 'For live trace feature')
end end
click_button 'Save changes' let!(:scope) { create_scope(feature_flag, 'review/*', true) }
expect(page).to have_current_path(project_feature_flags_path(project))
before do
visit(edit_project_feature_flag_path(project, feature_flag))
end end
it 'shows the updated feature flag' do it 'user sees persisted default scope' do
within_feature_flag_row(1) do within_scope_row(1) do
expect(page.find('.feature-flag-name')).to have_content('ci_live_trace') within_environment_spec do
expect(page).to have_css('.js-feature-flag-status button.is-checked') expect(page).to have_content('* (All Environments)')
end
within_feature_flag_scopes do within_status do
expect(page.find('.badge:nth-child(1)')).to have_content('*') expect(find('.project-feature-toggle')['aria-label'])
expect(page.find('.badge:nth-child(1)')['class']).to include('badge-active') .to eq('Toggle Status: ON')
expect(page.find('.badge:nth-child(2)')).to have_content('review/*')
expect(page.find('.badge:nth-child(2)')['class']).to include('badge-inactive')
end end
end end
end end
it 'records audit event' do context 'when user updates a status of a scope' do
visit(project_audit_events_path(project)) before do
within_scope_row(2) do
within_status { find('.project-feature-toggle').click }
end
expect(page).to( click_button 'Save changes'
have_text("Updated feature flag ci_live_trace. Updated rule review/* active state from true to false.") expect(page).to have_current_path(project_feature_flags_path(project))
) end
end
end
context 'when user adds a new scope' do it 'shows the updated feature flag' do
before do within_feature_flag_row(1) do
within_scope_row(3) do expect(page.find('.feature-flag-name')).to have_content('ci_live_trace')
within_environment_spec do expect(page).to have_css('.js-feature-flag-status button.is-checked')
find('.js-env-input').set('production')
find('.js-create-button').click within_feature_flag_scopes do
expect(page.find('.badge:nth-child(1)')).to have_content('*')
expect(page.find('.badge:nth-child(1)')['class']).to include('badge-active')
expect(page.find('.badge:nth-child(2)')).to have_content('review/*')
expect(page.find('.badge:nth-child(2)')['class']).to include('badge-inactive')
end
end end
end end
click_button 'Save changes' it 'records audit event' do
expect(page).to have_current_path(project_feature_flags_path(project)) visit(project_audit_events_path(project))
end
it 'shows the newly created scope' do expect(page).to(
within_feature_flag_row(1) do have_text("Updated feature flag ci_live_trace. Updated rule review/* active state from true to false.")
within_feature_flag_scopes do )
expect(page.find('.badge:nth-child(3)')).to have_content('production')
expect(page.find('.badge:nth-child(3)')['class']).to include('badge-inactive')
end
end end
end end
it 'records audit event' do context 'when user adds a new scope' do
visit(project_audit_events_path(project)) before do
within_scope_row(3) do
within_environment_spec do
find('.js-env-input').set('production')
find('.js-create-button').click
end
end
expect(page).to( click_button 'Save changes'
have_text("Updated feature flag ci_live_trace") expect(page).to have_current_path(project_feature_flags_path(project))
) end
end
end
context 'when user deletes a scope' do it 'shows the newly created scope' do
before do within_feature_flag_row(1) do
within_scope_row(2) do within_feature_flag_scopes do
within_delete { find('.js-delete-scope').click } expect(page.find('.badge:nth-child(3)')).to have_content('production')
expect(page.find('.badge:nth-child(3)')['class']).to include('badge-inactive')
end
end
end end
click_button 'Save changes' it 'records audit event' do
expect(page).to have_current_path(project_feature_flags_path(project)) visit(project_audit_events_path(project))
expect(page).to(
have_text("Updated feature flag ci_live_trace")
)
end
end end
it 'shows the updated feature flag' do context 'when user deletes a scope' do
within_feature_flag_row(1) do before do
within_feature_flag_scopes do within_scope_row(2) do
expect(page).to have_css('.badge:nth-child(1)') within_delete { find('.js-delete-scope').click }
expect(page).not_to have_css('.badge:nth-child(2)')
end end
click_button 'Save changes'
expect(page).to have_current_path(project_feature_flags_path(project))
end end
end
it 'records audit event' do it 'shows the updated feature flag' do
visit(project_audit_events_path(project)) within_feature_flag_row(1) do
within_feature_flag_scopes do
expect(page).to have_css('.badge:nth-child(1)')
expect(page).not_to have_css('.badge:nth-child(2)')
end
end
end
expect(page).to( it 'records audit event' do
have_text("Updated feature flag ci_live_trace") visit(project_audit_events_path(project))
)
expect(page).to(
have_text("Updated feature flag ci_live_trace")
)
end
end end
end end
end end
# frozen_string_literal: true # frozen_string_literal: true
module FeatureFlagHelpers module FeatureFlagHelpers
def create_flag(project, name, active = true, description: nil) def create_flag(project, name, active = true, description: nil, version: Operations::FeatureFlag.versions['legacy_flag'])
create(:operations_feature_flag, name: name, active: active, create(:operations_feature_flag, name: name, active: active, version: version,
description: description, project: project) description: description, project: project)
end end
...@@ -56,6 +56,10 @@ module FeatureFlagHelpers ...@@ -56,6 +56,10 @@ module FeatureFlagHelpers
end end
end end
def edit_feature_flag_button
find('.js-feature-flag-edit-button')
end
def expect_user_to_see_feature_flags_index_page def expect_user_to_see_feature_flags_index_page
expect(page).to have_css('h3.page-title', text: 'Feature Flags') expect(page).to have_css('h3.page-title', text: 'Feature Flags')
expect(page).to have_text('All') expect(page).to have_text('All')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment