Commit 4237065f authored by Shinya Maeda's avatar Shinya Maeda

Merge branch 'ff-sort-strategies-in-ui' into 'master'

Sort Feature Flag Strategies by ID for Display in UI

See merge request gitlab-org/gitlab!29629
parents 5436f298 9a56febd
...@@ -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