Merge branch 'bvl-add-all-settings-to-api' into 'master'
Add all ApplicationSettings attributes to the API See merge request !12851
This commit is contained in:
commit
02b25598cb
8 changed files with 102 additions and 170 deletions
|
@ -76,88 +76,13 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
|
||||||
params.delete(:domain_blacklist_raw) if params[:domain_blacklist_file]
|
params.delete(:domain_blacklist_raw) if params[:domain_blacklist_file]
|
||||||
|
|
||||||
params.require(:application_setting).permit(
|
params.require(:application_setting).permit(
|
||||||
application_setting_params_attributes
|
visible_application_setting_attributes
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
def application_setting_params_attributes
|
def visible_application_setting_attributes
|
||||||
[
|
ApplicationSettingsHelper.visible_attributes + [
|
||||||
:admin_notification_email,
|
|
||||||
:after_sign_out_path,
|
|
||||||
:after_sign_up_text,
|
|
||||||
:akismet_api_key,
|
|
||||||
:akismet_enabled,
|
|
||||||
:container_registry_token_expire_delay,
|
|
||||||
:default_artifacts_expire_in,
|
|
||||||
:default_branch_protection,
|
|
||||||
:default_group_visibility,
|
|
||||||
:default_project_visibility,
|
|
||||||
:default_projects_limit,
|
|
||||||
:default_snippet_visibility,
|
|
||||||
:domain_blacklist_enabled,
|
|
||||||
:domain_blacklist_file,
|
:domain_blacklist_file,
|
||||||
:domain_blacklist_raw,
|
|
||||||
:domain_whitelist_raw,
|
|
||||||
:email_author_in_body,
|
|
||||||
:enabled_git_access_protocol,
|
|
||||||
:gravatar_enabled,
|
|
||||||
:help_page_text,
|
|
||||||
:help_page_hide_commercial_content,
|
|
||||||
:help_page_support_url,
|
|
||||||
:home_page_url,
|
|
||||||
:housekeeping_bitmaps_enabled,
|
|
||||||
:housekeeping_enabled,
|
|
||||||
:housekeeping_full_repack_period,
|
|
||||||
:housekeeping_gc_period,
|
|
||||||
:housekeeping_incremental_repack_period,
|
|
||||||
:html_emails_enabled,
|
|
||||||
:koding_enabled,
|
|
||||||
:koding_url,
|
|
||||||
:password_authentication_enabled,
|
|
||||||
:plantuml_enabled,
|
|
||||||
:plantuml_url,
|
|
||||||
:max_artifacts_size,
|
|
||||||
:max_attachment_size,
|
|
||||||
:max_pages_size,
|
|
||||||
:metrics_enabled,
|
|
||||||
:metrics_host,
|
|
||||||
:metrics_method_call_threshold,
|
|
||||||
:metrics_packet_size,
|
|
||||||
:metrics_pool_size,
|
|
||||||
:metrics_port,
|
|
||||||
:metrics_sample_interval,
|
|
||||||
:metrics_timeout,
|
|
||||||
:performance_bar_allowed_group_id,
|
|
||||||
:performance_bar_enabled,
|
|
||||||
:recaptcha_enabled,
|
|
||||||
:recaptcha_private_key,
|
|
||||||
:recaptcha_site_key,
|
|
||||||
:repository_checks_enabled,
|
|
||||||
:require_two_factor_authentication,
|
|
||||||
:session_expire_delay,
|
|
||||||
:sign_in_text,
|
|
||||||
:signup_enabled,
|
|
||||||
:sentry_dsn,
|
|
||||||
:sentry_enabled,
|
|
||||||
:clientside_sentry_dsn,
|
|
||||||
:clientside_sentry_enabled,
|
|
||||||
:send_user_confirmation_email,
|
|
||||||
:shared_runners_enabled,
|
|
||||||
:shared_runners_text,
|
|
||||||
:sidekiq_throttling_enabled,
|
|
||||||
:sidekiq_throttling_factor,
|
|
||||||
:two_factor_grace_period,
|
|
||||||
:user_default_external,
|
|
||||||
:user_oauth_applications,
|
|
||||||
:unique_ips_limit_per_user,
|
|
||||||
:unique_ips_limit_time_window,
|
|
||||||
:unique_ips_limit_enabled,
|
|
||||||
:version_check_enabled,
|
|
||||||
:terminal_max_session_time,
|
|
||||||
:polling_interval_multiplier,
|
|
||||||
:prometheus_metrics_enabled,
|
|
||||||
:usage_ping_enabled,
|
|
||||||
|
|
||||||
disabled_oauth_sign_in_sources: [],
|
disabled_oauth_sign_in_sources: [],
|
||||||
import_sources: [],
|
import_sources: [],
|
||||||
repository_storages: [],
|
repository_storages: [],
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
module ApplicationSettingsHelper
|
module ApplicationSettingsHelper
|
||||||
|
extend self
|
||||||
delegate :gravatar_enabled?,
|
delegate :gravatar_enabled?,
|
||||||
:signup_enabled?,
|
:signup_enabled?,
|
||||||
:password_authentication_enabled?,
|
:password_authentication_enabled?,
|
||||||
|
@ -91,4 +92,88 @@ module ApplicationSettingsHelper
|
||||||
def sidekiq_queue_options_for_select
|
def sidekiq_queue_options_for_select
|
||||||
options_for_select(Sidekiq::Queue.all.map(&:name), @application_setting.sidekiq_throttling_queues)
|
options_for_select(Sidekiq::Queue.all.map(&:name), @application_setting.sidekiq_throttling_queues)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def visible_attributes
|
||||||
|
[
|
||||||
|
:admin_notification_email,
|
||||||
|
:after_sign_out_path,
|
||||||
|
:after_sign_up_text,
|
||||||
|
:akismet_api_key,
|
||||||
|
:akismet_enabled,
|
||||||
|
:clientside_sentry_dsn,
|
||||||
|
:clientside_sentry_enabled,
|
||||||
|
:container_registry_token_expire_delay,
|
||||||
|
:default_artifacts_expire_in,
|
||||||
|
:default_branch_protection,
|
||||||
|
:default_group_visibility,
|
||||||
|
:default_project_visibility,
|
||||||
|
:default_projects_limit,
|
||||||
|
:default_snippet_visibility,
|
||||||
|
:disabled_oauth_sign_in_sources,
|
||||||
|
:domain_blacklist_enabled,
|
||||||
|
:domain_blacklist_raw,
|
||||||
|
:domain_whitelist_raw,
|
||||||
|
:email_author_in_body,
|
||||||
|
:enabled_git_access_protocol,
|
||||||
|
:gravatar_enabled,
|
||||||
|
:help_page_hide_commercial_content,
|
||||||
|
:help_page_support_url,
|
||||||
|
:help_page_text,
|
||||||
|
:home_page_url,
|
||||||
|
:housekeeping_bitmaps_enabled,
|
||||||
|
:housekeeping_enabled,
|
||||||
|
:housekeeping_full_repack_period,
|
||||||
|
:housekeeping_gc_period,
|
||||||
|
:housekeeping_incremental_repack_period,
|
||||||
|
:html_emails_enabled,
|
||||||
|
:import_sources,
|
||||||
|
:koding_enabled,
|
||||||
|
:koding_url,
|
||||||
|
:max_artifacts_size,
|
||||||
|
:max_attachment_size,
|
||||||
|
:max_pages_size,
|
||||||
|
:metrics_enabled,
|
||||||
|
:metrics_host,
|
||||||
|
:metrics_method_call_threshold,
|
||||||
|
:metrics_packet_size,
|
||||||
|
:metrics_pool_size,
|
||||||
|
:metrics_port,
|
||||||
|
:metrics_sample_interval,
|
||||||
|
:metrics_timeout,
|
||||||
|
:password_authentication_enabled,
|
||||||
|
:performance_bar_allowed_group_id,
|
||||||
|
:performance_bar_enabled,
|
||||||
|
:plantuml_enabled,
|
||||||
|
:plantuml_url,
|
||||||
|
:polling_interval_multiplier,
|
||||||
|
:prometheus_metrics_enabled,
|
||||||
|
:recaptcha_enabled,
|
||||||
|
:recaptcha_private_key,
|
||||||
|
:recaptcha_site_key,
|
||||||
|
:repository_checks_enabled,
|
||||||
|
:repository_storages,
|
||||||
|
:require_two_factor_authentication,
|
||||||
|
:restricted_visibility_levels,
|
||||||
|
:send_user_confirmation_email,
|
||||||
|
:sentry_dsn,
|
||||||
|
:sentry_enabled,
|
||||||
|
:session_expire_delay,
|
||||||
|
:shared_runners_enabled,
|
||||||
|
:shared_runners_text,
|
||||||
|
:sidekiq_throttling_enabled,
|
||||||
|
:sidekiq_throttling_factor,
|
||||||
|
:sidekiq_throttling_queues,
|
||||||
|
:sign_in_text,
|
||||||
|
:signup_enabled,
|
||||||
|
:terminal_max_session_time,
|
||||||
|
:two_factor_grace_period,
|
||||||
|
:unique_ips_limit_enabled,
|
||||||
|
:unique_ips_limit_per_user,
|
||||||
|
:unique_ips_limit_time_window,
|
||||||
|
:usage_ping_enabled,
|
||||||
|
:user_default_external,
|
||||||
|
:user_oauth_applications,
|
||||||
|
:version_check_enabled
|
||||||
|
]
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -315,7 +315,9 @@ class ApplicationSetting < ActiveRecord::Base
|
||||||
Array(read_attribute(:repository_storages))
|
Array(read_attribute(:repository_storages))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# DEPRECATED
|
||||||
# repository_storage is still required in the API. Remove in 9.0
|
# repository_storage is still required in the API. Remove in 9.0
|
||||||
|
# Still used in API v3
|
||||||
def repository_storage
|
def repository_storage
|
||||||
repository_storages.first
|
repository_storages.first
|
||||||
end
|
end
|
||||||
|
|
4
changelogs/unreleased/bvl-add-all-settings-to-api.yml
Normal file
4
changelogs/unreleased/bvl-add-all-settings-to-api.yml
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: Make all application-settings accessible through the API
|
||||||
|
merge_request: 12851
|
||||||
|
author:
|
|
@ -42,7 +42,6 @@ Example response:
|
||||||
"gravatar_enabled" : true,
|
"gravatar_enabled" : true,
|
||||||
"sign_in_text" : null,
|
"sign_in_text" : null,
|
||||||
"container_registry_token_expire_delay": 5,
|
"container_registry_token_expire_delay": 5,
|
||||||
"repository_storage": "default",
|
|
||||||
"repository_storages": ["default"],
|
"repository_storages": ["default"],
|
||||||
"koding_enabled": false,
|
"koding_enabled": false,
|
||||||
"koding_url": null,
|
"koding_url": null,
|
||||||
|
@ -81,7 +80,6 @@ PUT /application/settings
|
||||||
| `after_sign_out_path` | string | no | Where to redirect users after logout |
|
| `after_sign_out_path` | string | no | Where to redirect users after logout |
|
||||||
| `container_registry_token_expire_delay` | integer | no | Container Registry token duration in minutes |
|
| `container_registry_token_expire_delay` | integer | no | Container Registry token duration in minutes |
|
||||||
| `repository_storages` | array of strings | no | A list of names of enabled storage paths, taken from `gitlab.yml`. New projects will be created in one of these stores, chosen at random. |
|
| `repository_storages` | array of strings | no | A list of names of enabled storage paths, taken from `gitlab.yml`. New projects will be created in one of these stores, chosen at random. |
|
||||||
| `repository_storage` | string | no | The first entry in `repository_storages`. Deprecated, but retained for compatibility reasons |
|
|
||||||
| `enabled_git_access_protocol` | string | no | Enabled protocols for Git access. Allowed values are: `ssh`, `http`, and `nil` to allow both protocols. |
|
| `enabled_git_access_protocol` | string | no | Enabled protocols for Git access. Allowed values are: `ssh`, `http`, and `nil` to allow both protocols. |
|
||||||
| `koding_enabled` | boolean | no | Enable Koding integration. Default is `false`. |
|
| `koding_enabled` | boolean | no | Enable Koding integration. Default is `false`. |
|
||||||
| `koding_url` | string | yes (if `koding_enabled` is `true`) | The Koding instance URL for integration. |
|
| `koding_url` | string | yes (if `koding_enabled` is `true`) | The Koding instance URL for integration. |
|
||||||
|
@ -121,7 +119,7 @@ Example response:
|
||||||
"user_oauth_applications": true,
|
"user_oauth_applications": true,
|
||||||
"after_sign_out_path": "",
|
"after_sign_out_path": "",
|
||||||
"container_registry_token_expire_delay": 5,
|
"container_registry_token_expire_delay": 5,
|
||||||
"repository_storage": "default",
|
"repository_storages": ["default"],
|
||||||
"koding_enabled": false,
|
"koding_enabled": false,
|
||||||
"koding_url": null,
|
"koding_url": null,
|
||||||
"plantuml_enabled": false,
|
"plantuml_enabled": false,
|
||||||
|
|
|
@ -671,43 +671,14 @@ module API
|
||||||
|
|
||||||
class ApplicationSetting < Grape::Entity
|
class ApplicationSetting < Grape::Entity
|
||||||
expose :id
|
expose :id
|
||||||
expose :default_projects_limit
|
expose(*::ApplicationSettingsHelper.visible_attributes)
|
||||||
expose :signup_enabled
|
|
||||||
expose :password_authentication_enabled
|
|
||||||
expose :password_authentication_enabled, as: :signin_enabled
|
|
||||||
expose :gravatar_enabled
|
|
||||||
expose :sign_in_text
|
|
||||||
expose :after_sign_up_text
|
|
||||||
expose :created_at
|
|
||||||
expose :updated_at
|
|
||||||
expose :home_page_url
|
|
||||||
expose :default_branch_protection
|
|
||||||
expose(:restricted_visibility_levels) do |setting, _options|
|
expose(:restricted_visibility_levels) do |setting, _options|
|
||||||
setting.restricted_visibility_levels.map { |level| Gitlab::VisibilityLevel.string_level(level) }
|
setting.restricted_visibility_levels.map { |level| Gitlab::VisibilityLevel.string_level(level) }
|
||||||
end
|
end
|
||||||
expose :max_attachment_size
|
|
||||||
expose :session_expire_delay
|
|
||||||
expose(:default_project_visibility) { |setting, _options| Gitlab::VisibilityLevel.string_level(setting.default_project_visibility) }
|
expose(:default_project_visibility) { |setting, _options| Gitlab::VisibilityLevel.string_level(setting.default_project_visibility) }
|
||||||
expose(:default_snippet_visibility) { |setting, _options| Gitlab::VisibilityLevel.string_level(setting.default_snippet_visibility) }
|
expose(:default_snippet_visibility) { |setting, _options| Gitlab::VisibilityLevel.string_level(setting.default_snippet_visibility) }
|
||||||
expose(:default_group_visibility) { |setting, _options| Gitlab::VisibilityLevel.string_level(setting.default_group_visibility) }
|
expose(:default_group_visibility) { |setting, _options| Gitlab::VisibilityLevel.string_level(setting.default_group_visibility) }
|
||||||
expose :default_artifacts_expire_in
|
expose :password_authentication_enabled, as: :signin_enabled
|
||||||
expose :domain_whitelist
|
|
||||||
expose :domain_blacklist_enabled
|
|
||||||
expose :domain_blacklist
|
|
||||||
expose :user_oauth_applications
|
|
||||||
expose :after_sign_out_path
|
|
||||||
expose :container_registry_token_expire_delay
|
|
||||||
expose :repository_storage
|
|
||||||
expose :repository_storages
|
|
||||||
expose :koding_enabled
|
|
||||||
expose :koding_url
|
|
||||||
expose :plantuml_enabled
|
|
||||||
expose :plantuml_url
|
|
||||||
expose :terminal_max_session_time
|
|
||||||
expose :polling_interval_multiplier
|
|
||||||
expose :help_page_hide_commercial_content
|
|
||||||
expose :help_page_text
|
|
||||||
expose :help_page_support_url
|
|
||||||
end
|
end
|
||||||
|
|
||||||
class Release < Grape::Entity
|
class Release < Grape::Entity
|
||||||
|
|
|
@ -20,59 +20,6 @@ module API
|
||||||
success Entities::ApplicationSetting
|
success Entities::ApplicationSetting
|
||||||
end
|
end
|
||||||
params do
|
params do
|
||||||
# CE
|
|
||||||
at_least_one_of_ce = [
|
|
||||||
:admin_notification_email,
|
|
||||||
:after_sign_out_path,
|
|
||||||
:after_sign_up_text,
|
|
||||||
:akismet_enabled,
|
|
||||||
:container_registry_token_expire_delay,
|
|
||||||
:default_artifacts_expire_in,
|
|
||||||
:default_branch_protection,
|
|
||||||
:default_group_visibility,
|
|
||||||
:default_project_visibility,
|
|
||||||
:default_projects_limit,
|
|
||||||
:default_snippet_visibility,
|
|
||||||
:disabled_oauth_sign_in_sources,
|
|
||||||
:domain_blacklist_enabled,
|
|
||||||
:domain_whitelist,
|
|
||||||
:email_author_in_body,
|
|
||||||
:enabled_git_access_protocol,
|
|
||||||
:gravatar_enabled,
|
|
||||||
:help_page_hide_commercial_content,
|
|
||||||
:help_page_text,
|
|
||||||
:help_page_support_url,
|
|
||||||
:home_page_url,
|
|
||||||
:housekeeping_enabled,
|
|
||||||
:html_emails_enabled,
|
|
||||||
:import_sources,
|
|
||||||
:koding_enabled,
|
|
||||||
:max_artifacts_size,
|
|
||||||
:max_attachment_size,
|
|
||||||
:max_pages_size,
|
|
||||||
:metrics_enabled,
|
|
||||||
:plantuml_enabled,
|
|
||||||
:polling_interval_multiplier,
|
|
||||||
:recaptcha_enabled,
|
|
||||||
:repository_checks_enabled,
|
|
||||||
:repository_storage,
|
|
||||||
:require_two_factor_authentication,
|
|
||||||
:restricted_visibility_levels,
|
|
||||||
:send_user_confirmation_email,
|
|
||||||
:sentry_enabled,
|
|
||||||
:clientside_sentry_enabled,
|
|
||||||
:session_expire_delay,
|
|
||||||
:shared_runners_enabled,
|
|
||||||
:sidekiq_throttling_enabled,
|
|
||||||
:sign_in_text,
|
|
||||||
:password_authentication_enabled,
|
|
||||||
:signin_enabled,
|
|
||||||
:signup_enabled,
|
|
||||||
:terminal_max_session_time,
|
|
||||||
:user_default_external,
|
|
||||||
:user_oauth_applications,
|
|
||||||
:version_check_enabled
|
|
||||||
]
|
|
||||||
optional :default_branch_protection, type: Integer, values: [0, 1, 2], desc: 'Determine if developers can push to master'
|
optional :default_branch_protection, type: Integer, values: [0, 1, 2], desc: 'Determine if developers can push to master'
|
||||||
optional :default_project_visibility, type: String, values: Gitlab::VisibilityLevel.string_values, desc: 'The default project visibility'
|
optional :default_project_visibility, type: String, values: Gitlab::VisibilityLevel.string_values, desc: 'The default project visibility'
|
||||||
optional :default_snippet_visibility, type: String, values: Gitlab::VisibilityLevel.string_values, desc: 'The default snippet visibility'
|
optional :default_snippet_visibility, type: String, values: Gitlab::VisibilityLevel.string_values, desc: 'The default snippet visibility'
|
||||||
|
@ -151,7 +98,7 @@ module API
|
||||||
given clientside_sentry_enabled: ->(val) { val } do
|
given clientside_sentry_enabled: ->(val) { val } do
|
||||||
requires :clientside_sentry_dsn, type: String, desc: 'Clientside Sentry Data Source Name'
|
requires :clientside_sentry_dsn, type: String, desc: 'Clientside Sentry Data Source Name'
|
||||||
end
|
end
|
||||||
optional :repository_storage, type: String, desc: 'Storage paths for new projects'
|
optional :repository_storages, type: Array[String], desc: 'Storage paths for new projects'
|
||||||
optional :repository_checks_enabled, type: Boolean, desc: "GitLab will periodically run 'git fsck' in all project and wiki repositories to look for silent disk corruption issues."
|
optional :repository_checks_enabled, type: Boolean, desc: "GitLab will periodically run 'git fsck' in all project and wiki repositories to look for silent disk corruption issues."
|
||||||
optional :koding_enabled, type: Boolean, desc: 'Enable Koding'
|
optional :koding_enabled, type: Boolean, desc: 'Enable Koding'
|
||||||
given koding_enabled: ->(val) { val } do
|
given koding_enabled: ->(val) { val } do
|
||||||
|
@ -174,7 +121,8 @@ module API
|
||||||
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 :polling_interval_multiplier, type: BigDecimal, desc: 'Interval multiplier used by endpoints that perform polling. Set to 0 to disable polling.'
|
optional :polling_interval_multiplier, type: BigDecimal, desc: 'Interval multiplier used by endpoints that perform polling. Set to 0 to disable polling.'
|
||||||
|
|
||||||
at_least_one_of(*at_least_one_of_ce)
|
optional(*::ApplicationSettingsHelper.visible_attributes)
|
||||||
|
at_least_one_of(*::ApplicationSettingsHelper.visible_attributes)
|
||||||
end
|
end
|
||||||
put "application/settings" do
|
put "application/settings" do
|
||||||
attrs = declared_params(include_missing: false)
|
attrs = declared_params(include_missing: false)
|
||||||
|
|
|
@ -11,7 +11,7 @@ describe API::Settings, 'Settings' do
|
||||||
expect(json_response).to be_an Hash
|
expect(json_response).to be_an Hash
|
||||||
expect(json_response['default_projects_limit']).to eq(42)
|
expect(json_response['default_projects_limit']).to eq(42)
|
||||||
expect(json_response['password_authentication_enabled']).to be_truthy
|
expect(json_response['password_authentication_enabled']).to be_truthy
|
||||||
expect(json_response['repository_storage']).to eq('default')
|
expect(json_response['repository_storages']).to eq(['default'])
|
||||||
expect(json_response['koding_enabled']).to be_falsey
|
expect(json_response['koding_enabled']).to be_falsey
|
||||||
expect(json_response['koding_url']).to be_nil
|
expect(json_response['koding_url']).to be_nil
|
||||||
expect(json_response['plantuml_enabled']).to be_falsey
|
expect(json_response['plantuml_enabled']).to be_falsey
|
||||||
|
@ -33,7 +33,7 @@ describe API::Settings, 'Settings' do
|
||||||
put api("/application/settings", admin),
|
put api("/application/settings", admin),
|
||||||
default_projects_limit: 3,
|
default_projects_limit: 3,
|
||||||
password_authentication_enabled: false,
|
password_authentication_enabled: false,
|
||||||
repository_storage: 'custom',
|
repository_storages: ['custom'],
|
||||||
koding_enabled: true,
|
koding_enabled: true,
|
||||||
koding_url: 'http://koding.example.com',
|
koding_url: 'http://koding.example.com',
|
||||||
plantuml_enabled: true,
|
plantuml_enabled: true,
|
||||||
|
@ -47,7 +47,6 @@ describe API::Settings, 'Settings' do
|
||||||
expect(response).to have_http_status(200)
|
expect(response).to have_http_status(200)
|
||||||
expect(json_response['default_projects_limit']).to eq(3)
|
expect(json_response['default_projects_limit']).to eq(3)
|
||||||
expect(json_response['password_authentication_enabled']).to be_falsey
|
expect(json_response['password_authentication_enabled']).to be_falsey
|
||||||
expect(json_response['repository_storage']).to eq('custom')
|
|
||||||
expect(json_response['repository_storages']).to eq(['custom'])
|
expect(json_response['repository_storages']).to eq(['custom'])
|
||||||
expect(json_response['koding_enabled']).to be_truthy
|
expect(json_response['koding_enabled']).to be_truthy
|
||||||
expect(json_response['koding_url']).to eq('http://koding.example.com')
|
expect(json_response['koding_url']).to eq('http://koding.example.com')
|
||||||
|
|
Loading…
Reference in a new issue