Commit e16e82b5 authored by Luke Bennett's avatar Luke Bennett

Port CE

parent c0f3a40c
# frozen_string_literal: true
class InstanceStatistics::ApplicationController < ApplicationController
before_action :authorize_read_instance_statistics!
layout 'instance_statistics'
def authorize_read_instance_statistics!
render_404 unless can?(current_user, :read_instance_statistics)
end
end
class Admin::CohortsController < Admin::ApplicationController # frozen_string_literal: true
class InstanceStatistics::CohortsController < InstanceStatistics::ApplicationController
def index def index
if Gitlab::CurrentSettings.usage_ping_enabled if Gitlab::CurrentSettings.usage_ping_enabled
cohorts_results = Rails.cache.fetch('cohorts', expires_in: 1.day) do cohorts_results = Rails.cache.fetch('cohorts', expires_in: 1.day) do
......
class Admin::ConversationalDevelopmentIndexController < Admin::ApplicationController # frozen_string_literal: true
def show
class InstanceStatistics::ConversationalDevelopmentIndexController < InstanceStatistics::ApplicationController
def index
@metric = ConversationalDevelopmentIndex::Metric.order(:created_at).last&.present @metric = ConversationalDevelopmentIndex::Metric.order(:created_at).last&.present
end end
end end
...@@ -253,6 +253,7 @@ module ApplicationSettingsHelper ...@@ -253,6 +253,7 @@ module ApplicationSettingsHelper
:unique_ips_limit_per_user, :unique_ips_limit_per_user,
:unique_ips_limit_time_window, :unique_ips_limit_time_window,
:usage_ping_enabled, :usage_ping_enabled,
:instance_statistics_visibility_private,
:user_default_external, :user_default_external,
:user_oauth_applications, :user_oauth_applications,
:version_check_enabled :version_check_enabled
......
...@@ -296,6 +296,7 @@ class ApplicationSetting < ActiveRecord::Base ...@@ -296,6 +296,7 @@ class ApplicationSetting < ActiveRecord::Base
unique_ips_limit_per_user: 10, unique_ips_limit_per_user: 10,
unique_ips_limit_time_window: 3600, unique_ips_limit_time_window: 3600,
usage_ping_enabled: Settings.gitlab['usage_ping_enabled'], usage_ping_enabled: Settings.gitlab['usage_ping_enabled'],
instance_statistics_visibility_private: false,
user_default_external: false user_default_external: false
} }
end end
......
...@@ -19,6 +19,11 @@ class GlobalPolicy < BasePolicy ...@@ -19,6 +19,11 @@ class GlobalPolicy < BasePolicy
@user&.required_terms_not_accepted? @user&.required_terms_not_accepted?
end end
condition(:private_instance_statistics, score: 0) { Gitlab::CurrentSettings.instance_statistics_visibility_private? }
rule { admin | (~private_instance_statistics & ~anonymous) }
.enable :read_instance_statistics
rule { anonymous }.policy do rule { anonymous }.policy do
prevent :log_in prevent :log_in
prevent :receive_notifications prevent :receive_notifications
......
...@@ -23,13 +23,16 @@ ...@@ -23,13 +23,16 @@
periodically collect usage information. periodically collect usage information.
= link_to 'Learn more', help_page_path("user/admin_area/settings/usage_statistics", anchor: "usage-ping") = link_to 'Learn more', help_page_path("user/admin_area/settings/usage_statistics", anchor: "usage-ping")
about what information is shared with GitLab Inc. Visit about what information is shared with GitLab Inc. Visit
= link_to 'Cohorts', admin_cohorts_path(anchor: 'usage-ping') = link_to _('Cohorts'), instance_statistics_cohorts_path(anchor: 'usage-ping')
to see the JSON payload sent. to see the JSON payload sent.
- else - else
The usage ping is disabled, and cannot be configured through this The usage ping is disabled, and cannot be configured through this
form. For more information, see the documentation on form. For more information, see the documentation on
= succeed '.' do = succeed '.' do
= link_to 'deactivating the usage ping', help_page_path('user/admin_area/settings/usage_statistics', anchor: 'deactivate-the-usage-ping') = link_to 'deactivating the usage ping', help_page_path('user/admin_area/settings/usage_statistics', anchor: 'deactivate-the-usage-ping')
.form-group
= f.label :instance_statistics_visibility_private, _('Instance Statistics visibility')
= f.select :instance_statistics_visibility_private, options_for_select({_('All users') => false, _('Only admins') => true}, Gitlab::CurrentSettings.instance_statistics_visibility_private?), {}, class: 'form-control'
= f.submit 'Save changes', class: "btn btn-success" = f.submit 'Save changes', class: "btn btn-success"
- page_title _('Instance Statistics')
- header_title _('Instance Statistics'), instance_statistics_root_path
- nav 'instance_statistics'
- @left_sidebar = true
= render template: 'layouts/application'
...@@ -64,11 +64,15 @@ ...@@ -64,11 +64,15 @@
= link_to '#', class: 'dashboard-shortcuts-web-ide', title: _('Web IDE') do = link_to '#', class: 'dashboard-shortcuts-web-ide', title: _('Web IDE') do
= _('Web IDE') = _('Web IDE')
- if current_user.admin? || Gitlab::Sherlock.enabled? - if Gitlab::Sherlock.enabled? || can?(current_user, :read_instance_statistics)
%li.line-separator.d-none.d-sm-block %li.line-separator.d-none.d-sm-block
- if can?(current_user, :read_instance_statistics)
= nav_link(controller: [:conversational_development_index, :cohorts]) do
= link_to instance_statistics_root_path, title: _('Instance Statistics'), aria: { label: _('Instance Statistics') }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
= sprite_icon('chart', size: 18)
- if current_user.admin? - if current_user.admin?
= nav_link(controller: 'admin/dashboard') do = nav_link(controller: 'admin/dashboard') do
= link_to admin_root_path, class: 'admin-icon qa-admin-area-link', title: _('Admin area'), aria: { label: _("Admin area") }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do = link_to admin_root_path, class: 'admin-icon qa-admin-area-link', title: _('Admin area'), aria: { label: _('Admin area') }, data: {toggle: 'tooltip', placement: 'bottom', container: 'body'} do
= sprite_icon('admin', size: 18) = sprite_icon('admin', size: 18)
- if Gitlab::Sherlock.enabled? - if Gitlab::Sherlock.enabled?
%li %li
......
...@@ -7,14 +7,14 @@ ...@@ -7,14 +7,14 @@
.sidebar-context-title .sidebar-context-title
= _('Admin Area') = _('Admin Area')
%ul.sidebar-top-level-items %ul.sidebar-top-level-items
= nav_link(controller: %w(dashboard admin projects users groups jobs runners gitaly_servers cohorts conversational_development_index), html_options: {class: 'home'}) do = nav_link(controller: %w(dashboard admin projects users groups jobs runners gitaly_servers), html_options: {class: 'home'}) do
= link_to admin_root_path, class: 'shortcuts-tree' do = link_to admin_root_path, class: 'shortcuts-tree' do
.nav-icon-container .nav-icon-container
= sprite_icon('overview') = sprite_icon('overview')
%span.nav-item-name %span.nav-item-name
= _('Overview') = _('Overview')
%ul.sidebar-sub-level-items %ul.sidebar-sub-level-items
= nav_link(controller: %w(dashboard admin projects users groups jobs runners gitaly_servers cohorts conversational_development_index), html_options: { class: "fly-out-top-item" } ) do = nav_link(controller: %w(dashboard admin projects users groups jobs runners gitaly_servers), html_options: { class: "fly-out-top-item" } ) do
= link_to admin_root_path do = link_to admin_root_path do
%strong.fly-out-top-item-name %strong.fly-out-top-item-name
= _('Overview') = _('Overview')
...@@ -47,14 +47,6 @@ ...@@ -47,14 +47,6 @@
= link_to admin_gitaly_servers_path, title: 'Gitaly Servers' do = link_to admin_gitaly_servers_path, title: 'Gitaly Servers' do
%span %span
= _('Gitaly Servers') = _('Gitaly Servers')
= nav_link path: 'cohorts#index' do
= link_to admin_cohorts_path, title: _('Cohorts') do
%span
= _('Cohorts')
= nav_link(controller: :conversational_development_index) do
= link_to admin_conversational_development_index_path, title: _('ConvDev Index') do
%span
= _('ConvDev Index')
= nav_link(controller: %w(system_info background_jobs logs health_check requests_profiles audit_logs)) do = nav_link(controller: %w(system_info background_jobs logs health_check requests_profiles audit_logs)) do
= link_to admin_system_info_path do = link_to admin_system_info_path do
......
.nav-sidebar{ class: ("sidebar-collapsed-desktop" if collapsed_sidebar?) }
.nav-sidebar-inner-scroll
.context-header
= link_to instance_statistics_root_path, title: _('Instance Statistics') do
.avatar-container.s40.settings-avatar
= sprite_icon('chart', size: 24)
.sidebar-context-title= _('Instance Statistics')
%ul.sidebar-top-level-items
= nav_link(controller: :conversational_development_index) do
= link_to instance_statistics_conversational_development_index_index_path do
.nav-icon-container
= sprite_icon('comment')
%span.nav-item-name
= _('ConvDev Index')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :conversational_development_index, html_options: { class: "fly-out-top-item" } ) do
= link_to instance_statistics_conversational_development_index_index_path do
%strong.fly-out-top-item-name
= _('ConvDev Index')
= nav_link(controller: :cohorts) do
= link_to instance_statistics_cohorts_path do
.nav-icon-container
= sprite_icon('users')
%span.nav-item-name
= _('Cohorts')
%ul.sidebar-sub-level-items.is-fly-out-only
= nav_link(controller: :cohorts, html_options: { class: "fly-out-top-item" } ) do
= link_to instance_statistics_cohorts_path do
%strong.fly-out-top-item-name
= _('Cohorts')
= render 'shared/sidebar_toggle_button'
---
title: Allow non-admins to view instance statistics (if permitted by the instance admins)
merge_request: 20874
author:
type: changed
...@@ -88,6 +88,8 @@ Rails.application.routes.draw do ...@@ -88,6 +88,8 @@ Rails.application.routes.draw do
get 'ide' => 'ide#index' get 'ide' => 'ide#index'
get 'ide/*vueroute' => 'ide#index', format: false get 'ide/*vueroute' => 'ide#index', format: false
draw :instance_statistics
end end
# Koding route # Koding route
......
...@@ -88,8 +88,6 @@ namespace :admin do ...@@ -88,8 +88,6 @@ namespace :admin do
resource :system_info, controller: 'system_info', only: [:show] resource :system_info, controller: 'system_info', only: [:show]
resources :requests_profiles, only: [:index, :show], param: :name, constraints: { name: /.+\.html/ } resources :requests_profiles, only: [:index, :show], param: :name, constraints: { name: /.+\.html/ }
get 'conversational_development_index' => 'conversational_development_index#show'
resources :projects, only: [:index] resources :projects, only: [:index]
scope(path: 'projects/*namespace_id', scope(path: 'projects/*namespace_id',
...@@ -152,8 +150,6 @@ namespace :admin do ...@@ -152,8 +150,6 @@ namespace :admin do
end end
end end
resources :cohorts, only: :index
resources :jobs, only: :index do resources :jobs, only: :index do
collection do collection do
post :cancel_all post :cancel_all
......
# frozen_string_literal: true
namespace :instance_statistics do
root to: redirect('/-/instance_statistics/conversational_development_index')
resources :cohorts, only: :index
resources :conversational_development_index, only: :index
end
# frozen_string_literal: true
class AddInstanceStatisticsVisibilityToApplicationSetting < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
DOWNTIME = false
disable_ddl_transaction!
def up
add_column_with_default(:application_settings, :instance_statistics_visibility_private,
:boolean,
default: false,
allow_null: false)
end
def down
remove_column(:application_settings, :instance_statistics_visibility_private)
end
end
...@@ -208,7 +208,8 @@ ActiveRecord::Schema.define(version: 20180726172057) do ...@@ -208,7 +208,8 @@ ActiveRecord::Schema.define(version: 20180726172057) do
t.boolean "enforce_terms", default: false t.boolean "enforce_terms", default: false
t.boolean "pseudonymizer_enabled", default: false, null: false t.boolean "pseudonymizer_enabled", default: false, null: false
t.boolean "hide_third_party_offers", default: false, null: false t.boolean "hide_third_party_offers", default: false, null: false
t.integer "custom_project_templates_group_id" t.integer "custom_project_templates_group_id",
t.boolean "instance_statistics_visibility_private", default: false, null: false
end end
create_table "approvals", force: :cascade do |t| create_table "approvals", force: :cascade do |t|
......
...@@ -55,7 +55,8 @@ Example response: ...@@ -55,7 +55,8 @@ Example response:
"ed25519_key_restriction": 0, "ed25519_key_restriction": 0,
"enforce_terms": true, "enforce_terms": true,
"terms": "Hello world!", "terms": "Hello world!",
"performance_bar_allowed_group_id": 42 "performance_bar_allowed_group_id": 42,
"instance_statistics_visibility_private": false
} }
``` ```
...@@ -182,6 +183,7 @@ PUT /application/settings ...@@ -182,6 +183,7 @@ PUT /application/settings
| `external_auth_client_key_pass` | string | no | Passphrase to use for the private key when authenticating with the external service this is encrypted when stored | | `external_auth_client_key_pass` | string | no | Passphrase to use for the private key when authenticating with the external service this is encrypted when stored |
| `enforce_terms` | boolean | no | Enforce application ToS to all users | | `enforce_terms` | boolean | no | Enforce application ToS to all users |
| `terms` | text | yes (if `enforce_terms` is true) | Markdown content for the ToS | | `terms` | text | yes (if `enforce_terms` is true) | Markdown content for the ToS |
| `instance_statistics_visibility_private` | boolean | no | When set to `true` Instance statistics will only be available to admins |
```bash ```bash
curl --request PUT --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/application/settings?signup_enabled=false&default_project_visibility=internal curl --request PUT --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v4/application/settings?signup_enabled=false&default_project_visibility=internal
...@@ -230,6 +232,7 @@ Example response: ...@@ -230,6 +232,7 @@ Example response:
"ed25519_key_restriction": 0, "ed25519_key_restriction": 0,
"enforce_terms": true, "enforce_terms": true,
"terms": "Hello world!", "terms": "Hello world!",
"performance_bar_allowed_group_id": 42 "performance_bar_allowed_group_id": 42,
"instance_statistics_visibility_private": false
} }
``` ```
...@@ -127,9 +127,7 @@ module API ...@@ -127,9 +127,7 @@ module API
optional :signup_enabled, type: Boolean, desc: 'Flag indicating if sign up is enabled' optional :signup_enabled, type: Boolean, desc: 'Flag indicating if sign up is enabled'
optional :terminal_max_session_time, type: Integer, desc: 'Maximum time for web terminal websocket connection (in seconds). Set to 0 for unlimited time.' optional :terminal_max_session_time, type: Integer, desc: 'Maximum time for web terminal websocket connection (in seconds). Set to 0 for unlimited time.'
optional :usage_ping_enabled, type: Boolean, desc: 'Every week GitLab will report license usage back to GitLab, Inc.' optional :usage_ping_enabled, type: Boolean, desc: 'Every week GitLab will report license usage back to GitLab, Inc.'
optional :user_default_external, type: Boolean, desc: 'Newly registered users will by default be external' optional :instance_statistics_visibility_private, type: Boolean, desc: 'When set to `true` Instance statistics will only be available to admins'
optional :user_oauth_applications, type: Boolean, desc: 'Allow users to register any application to use GitLab as an OAuth provider'
optional :version_check_enabled, type: Boolean, desc: 'Let GitLab inform you when an update is available.'
ApplicationSetting::SUPPORTED_KEY_TYPES.each do |type| ApplicationSetting::SUPPORTED_KEY_TYPES.each do |type|
optional :"#{type}_key_restriction", optional :"#{type}_key_restriction",
......
...@@ -457,6 +457,9 @@ msgstr "" ...@@ -457,6 +457,9 @@ msgstr ""
msgid "All features are enabled for blank projects, from templates, or when importing, but you can disable them afterward in the project settings." msgid "All features are enabled for blank projects, from templates, or when importing, but you can disable them afterward in the project settings."
msgstr "" msgstr ""
msgid "All users"
msgstr ""
msgid "Allow commits from members who can merge to the target branch." msgid "Allow commits from members who can merge to the target branch."
msgstr "" msgstr ""
...@@ -3660,6 +3663,12 @@ msgid_plural "Instances" ...@@ -3660,6 +3663,12 @@ msgid_plural "Instances"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
msgid "Instance Statistics"
msgstr ""
msgid "Instance Statistics visibility"
msgstr ""
msgid "Instance does not support multiple Kubernetes clusters" msgid "Instance does not support multiple Kubernetes clusters"
msgstr "" msgstr ""
...@@ -4537,6 +4546,9 @@ msgstr "" ...@@ -4537,6 +4546,9 @@ msgstr ""
msgid "Online IDE integration settings." msgid "Online IDE integration settings."
msgstr "" msgstr ""
msgid "Only admins"
msgstr ""
msgid "Only comments from the following commit are shown below" msgid "Only comments from the following commit are shown below"
msgstr "" msgstr ""
......
# frozen_string_literal: true
require 'spec_helper'
describe InstanceStatistics::CohortsController do
it_behaves_like 'instance statistics availability'
end
# frozen_string_literal: true
require 'spec_helper'
describe InstanceStatistics::ConversationalDevelopmentIndexController do
it_behaves_like 'instance statistics availability'
end
...@@ -7,32 +7,38 @@ RSpec.describe 'Dashboard Active Tab', :js do ...@@ -7,32 +7,38 @@ RSpec.describe 'Dashboard Active Tab', :js do
shared_examples 'page has active tab' do |title| shared_examples 'page has active tab' do |title|
it "#{title} tab" do it "#{title} tab" do
subject
expect(page).to have_selector('.navbar-sub-nav li.active', count: 1) expect(page).to have_selector('.navbar-sub-nav li.active', count: 1)
expect(find('.navbar-sub-nav li.active')).to have_content(title) expect(find('.navbar-sub-nav li.active')).to have_content(title)
end end
end end
context 'on dashboard projects' do context 'on dashboard projects' do
before do it_behaves_like 'page has active tab', 'Projects' do
visit dashboard_projects_path subject { visit dashboard_projects_path }
end end
it_behaves_like 'page has active tab', 'Projects'
end end
context 'on dashboard groups' do context 'on dashboard groups' do
before do it_behaves_like 'page has active tab', 'Groups' do
visit dashboard_groups_path subject { visit dashboard_groups_path }
end end
it_behaves_like 'page has active tab', 'Groups'
end end
context 'on activity projects' do context 'on activity projects' do
before do it_behaves_like 'page has active tab', 'Activity' do
visit activity_dashboard_path subject { visit activity_dashboard_path }
end
end end
it_behaves_like 'page has active tab', 'Activity' context 'on instance statistics' do
subject { visit instance_statistics_root_path }
it 'shows Instance Statistics` as active' do
subject
expect(find('.navbar-sub-nav li.active')).to have_link('Instance Statistics')
end
end end
end end
# frozen_string_literal: true
require 'spec_helper'
describe 'Showing instance statistics' do
before do
sign_in user if user
end
# Using a path that is publicly accessible
subject { visit explore_projects_path }
context 'for unauthenticated users' do
let(:user) { nil }
it 'does not show the instance statistics link' do
subject
expect(page).not_to have_link('Instance Statistics')
end
end
context 'for regular users' do
let(:user) { create(:user) }
context 'when instance statistics are publicly available' do
before do
stub_application_setting(instance_statistics_visibility_private: false)
end
it 'shows the instance statistics link' do
subject
expect(page).to have_link('Instance Statistics')
end
end
context 'when instance statistics are not publicly available' do
before do
stub_application_setting(instance_statistics_visibility_private: true)
end
it 'shows the instance statistics link' do
subject
expect(page).not_to have_link('Instance Statistics')
end
end
end
context 'for admins' do
let(:user) { create(:admin) }
it 'shows the instance statistics link' do
subject
expect(page).to have_link('Instance Statistics')
end
end
end
require 'rails_helper' require 'rails_helper'
describe 'Admin cohorts page' do describe 'Cohorts page' do
before do before do
sign_in(create(:admin)) sign_in(create(:admin))
end end
...@@ -8,7 +8,7 @@ describe 'Admin cohorts page' do ...@@ -8,7 +8,7 @@ describe 'Admin cohorts page' do
it 'See users count per month' do it 'See users count per month' do
2.times { create(:user) } 2.times { create(:user) }
visit admin_cohorts_path visit instance_statistics_cohorts_path
expect(page).to have_content("#{Time.now.strftime('%b %Y')} 3 0") expect(page).to have_content("#{Time.now.strftime('%b %Y')} 3 0")
end end
......
require 'spec_helper' require 'spec_helper'
describe 'Admin Conversational Development Index' do describe 'Conversational Development Index' do
before do before do
sign_in(create(:admin)) sign_in(create(:admin))
end end
...@@ -9,7 +9,7 @@ describe 'Admin Conversational Development Index' do ...@@ -9,7 +9,7 @@ describe 'Admin Conversational Development Index' do
it 'shows empty state' do it 'shows empty state' do
stub_application_setting(usage_ping_enabled: false) stub_application_setting(usage_ping_enabled: false)
visit admin_conversational_development_index_path visit instance_statistics_conversational_development_index_index_path
expect(page).to have_content('Usage ping is not enabled') expect(page).to have_content('Usage ping is not enabled')
end end
...@@ -19,7 +19,7 @@ describe 'Admin Conversational Development Index' do ...@@ -19,7 +19,7 @@ describe 'Admin Conversational Development Index' do
it 'shows empty state' do it 'shows empty state' do
stub_application_setting(usage_ping_enabled: true) stub_application_setting(usage_ping_enabled: true)
visit admin_conversational_development_index_path visit instance_statistics_conversational_development_index_index_path
expect(page).to have_content('Data is still calculating') expect(page).to have_content('Data is still calculating')
end end
...@@ -30,7 +30,7 @@ describe 'Admin Conversational Development Index' do ...@@ -30,7 +30,7 @@ describe 'Admin Conversational Development Index' do
stub_application_setting(usage_ping_enabled: true) stub_application_setting(usage_ping_enabled: true)
create(:conversational_development_index_metric) create(:conversational_development_index_metric)
visit admin_conversational_development_index_path visit instance_statistics_conversational_development_index_index_path
expect(page).to have_content( expect(page).to have_content(
'Issues created per active user 1.2 You 9.3 Lead 13.3%' 'Issues created per active user 1.2 You 9.3 Lead 13.3%'
......
...@@ -180,4 +180,38 @@ describe GlobalPolicy do ...@@ -180,4 +180,38 @@ describe GlobalPolicy do
end end
end end
end end
describe 'read instance statistics' do
context 'regular user' do
it { is_expected.to be_allowed(:read_instance_statistics) }
context 'when instance statistics are set to private' do
before do
stub_application_setting(instance_statistics_visibility_private: true)
end
it { is_expected.not_to be_allowed(:read_instance_statistics) }
end
end
context 'admin' do
let(:current_user) { create(:admin) }
it { is_expected.to be_allowed(:read_instance_statistics) }
context 'when instance statistics are set to private' do
before do
stub_application_setting(instance_statistics_visibility_private: true)
end
it { is_expected.to be_allowed(:read_instance_statistics) }
end
end
context 'anonymous' do
let(:current_user) { nil }
it { is_expected.not_to be_allowed(:read_instance_statistics) }
end
end
end end
...@@ -27,6 +27,7 @@ describe API::Settings, 'Settings' do ...@@ -27,6 +27,7 @@ describe API::Settings, 'Settings' do
expect(json_response['ed25519_key_restriction']).to eq(0) expect(json_response['ed25519_key_restriction']).to eq(0)
expect(json_response['circuitbreaker_failure_count_threshold']).not_to be_nil expect(json_response['circuitbreaker_failure_count_threshold']).not_to be_nil
expect(json_response['performance_bar_allowed_group_id']).to be_nil expect(json_response['performance_bar_allowed_group_id']).to be_nil
expect(json_response['instance_statistics_visibility_private']).to be(false)
expect(json_response).not_to have_key('performance_bar_allowed_group_path') expect(json_response).not_to have_key('performance_bar_allowed_group_path')
expect(json_response).not_to have_key('performance_bar_enabled') expect(json_response).not_to have_key('performance_bar_enabled')
end end
...@@ -66,7 +67,8 @@ describe API::Settings, 'Settings' do ...@@ -66,7 +67,8 @@ describe API::Settings, 'Settings' do
circuitbreaker_check_interval: 2, circuitbreaker_check_interval: 2,
enforce_terms: true, enforce_terms: true,
terms: 'Hello world!', terms: 'Hello world!',
performance_bar_allowed_group_path: group.full_path performance_bar_allowed_group_path: group.full_path,
instance_statistics_visibility_private: true
expect(response).to have_gitlab_http_status(200) expect(response).to have_gitlab_http_status(200)
expect(json_response['default_projects_limit']).to eq(3) expect(json_response['default_projects_limit']).to eq(3)
...@@ -91,6 +93,7 @@ describe API::Settings, 'Settings' do ...@@ -91,6 +93,7 @@ describe API::Settings, 'Settings' do
expect(json_response['enforce_terms']).to be(true) expect(json_response['enforce_terms']).to be(true)
expect(json_response['terms']).to eq('Hello world!') expect(json_response['terms']).to eq('Hello world!')
expect(json_response['performance_bar_allowed_group_id']).to eq(group.id) expect(json_response['performance_bar_allowed_group_id']).to eq(group.id)
expect(json_response['instance_statistics_visibility_private']).to be(true)
end end
end end
......
# frozen_string_literal: true
require 'spec_helper'
describe 'Instance Statistics', 'routing' do
include RSpec::Rails::RequestExampleGroup
it "routes '/-/instance_statistics' to conversational development index" do
expect(get('/-/instance_statistics')).to redirect_to('/-/instance_statistics/conversational_development_index')
end
end
# frozen_string_literal: true
shared_examples 'instance statistics availability' do
let(:user) { create(:user) }
before do
sign_in(user)
end
describe 'GET #index' do
it 'is available when the feature is available publicly' do
get :index
expect(response).to have_gitlab_http_status(:success)
end
it 'renders a 404 when the feature is not available publicly' do
stub_application_setting(instance_statistics_visibility_private: true)
get :index
expect(response).to have_gitlab_http_status(:not_found)
end
context 'for admins' do
let(:user) { create(:admin) }
it 'allows access when the feature is not available publicly' do
stub_application_setting(instance_statistics_visibility_private: true)
get :index
expect(response).to have_gitlab_http_status(:success)
end
end
end
end
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