diff --git a/app/assets/images/logos/shimo.svg b/app/assets/images/logos/shimo.svg
new file mode 100644
index 0000000000000000000000000000000000000000..d6f2cad839eee5e90f582e5b9788c1371c28b8ee
--- /dev/null
+++ b/app/assets/images/logos/shimo.svg
@@ -0,0 +1,11 @@
+
diff --git a/app/controllers/projects/integrations/shimo_controller.rb b/app/controllers/projects/integrations/shimo_controller.rb
new file mode 100644
index 0000000000000000000000000000000000000000..c1da33c617d375613e9afb53fd0030211050a0b7
--- /dev/null
+++ b/app/controllers/projects/integrations/shimo_controller.rb
@@ -0,0 +1,19 @@
+# frozen_string_literal: true
+
+module Projects
+ module Integrations
+ class ShimoController < Projects::ApplicationController
+ feature_category :integrations
+
+ before_action :ensure_renderable
+
+ def index; end
+
+ private
+
+ def ensure_renderable
+ render_404 unless project.shimo_integration&.render?
+ end
+ end
+ end
+end
diff --git a/app/models/integration.rb b/app/models/integration.rb
index 4dd3e1a1785831e69b854f162868d4d27aed0279..0a1f61fd5400786c5edfb0e050d72f40127a1bce 100644
--- a/app/models/integration.rb
+++ b/app/models/integration.rb
@@ -14,7 +14,7 @@ class Integration < ApplicationRecord
asana assembla bamboo bugzilla buildkite campfire confluence custom_issue_tracker datadog discord
drone_ci emails_on_push ewm external_wiki flowdock hangouts_chat irker jira
mattermost mattermost_slash_commands microsoft_teams packagist pipelines_email
- pivotaltracker prometheus pushover redmine slack slack_slash_commands teamcity unify_circuit webex_teams youtrack zentao
+ pivotaltracker prometheus pushover redmine shimo slack slack_slash_commands teamcity unify_circuit webex_teams youtrack zentao
].freeze
PROJECT_SPECIFIC_INTEGRATION_NAMES = %w[
diff --git a/app/models/integrations/shimo.rb b/app/models/integrations/shimo.rb
new file mode 100644
index 0000000000000000000000000000000000000000..fe39dd705d002b6d6bfdf305728a18479cdf2c1e
--- /dev/null
+++ b/app/models/integrations/shimo.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+module Integrations
+ class Shimo < Integration
+ prop_accessor :external_wiki_url
+ validates :external_wiki_url, presence: true, public_url: true, if: :activated?
+
+ def feature_flag_enabled?
+ Feature.enabled?(:shimo_integration, project)
+ end
+
+ def render?
+ return false unless feature_flag_enabled?
+
+ valid? && activated?
+ end
+
+ def title
+ s_('Shimo|Shimo')
+ end
+
+ def description
+ s_('Shimo|Link to a Shimo Workspace from the sidebar.')
+ end
+
+ def self.to_param
+ 'shimo'
+ end
+
+ # support for `test` method
+ def execute(_data)
+ response = Gitlab::HTTP.get(properties['external_wiki_url'], verify: true, use_read_total_timeout: true)
+ response.body if response.code == 200
+ rescue StandardError
+ nil
+ end
+
+ def self.supported_events
+ %w()
+ end
+
+ def fields
+ [
+ {
+ type: 'text',
+ name: 'external_wiki_url',
+ title: s_('Shimo|Shimo Workspace URL'),
+ required: true
+ }
+ ]
+ end
+ end
+end
diff --git a/app/models/project.rb b/app/models/project.rb
index f2c26f918069ee9c48984d55fe8fb573109d99b6..34e6f8bca125c723ae82bff9ea5e1caead002701 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -189,6 +189,7 @@ def self.integration_association_name(name)
has_one :prometheus_integration, class_name: 'Integrations::Prometheus', inverse_of: :project
has_one :pushover_integration, class_name: 'Integrations::Pushover'
has_one :redmine_integration, class_name: 'Integrations::Redmine'
+ has_one :shimo_integration, class_name: 'Integrations::Shimo'
has_one :slack_integration, class_name: 'Integrations::Slack'
has_one :slack_slash_commands_integration, class_name: 'Integrations::SlackSlashCommands'
has_one :teamcity_integration, class_name: 'Integrations::Teamcity'
@@ -1453,7 +1454,9 @@ def find_or_initialize_integrations
end
def disabled_integrations
- []
+ disabled_integrations = []
+ disabled_integrations << :shimo unless shimo_integration&.feature_flag_enabled?
+ disabled_integrations
end
def find_or_initialize_integration(name)
diff --git a/app/views/projects/integrations/shimo/index.html.haml b/app/views/projects/integrations/shimo/index.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..fa7505cfe08360123ff6334d1855c68d81665fb7
--- /dev/null
+++ b/app/views/projects/integrations/shimo/index.html.haml
@@ -0,0 +1,11 @@
+- breadcrumb_title s_('Shimo|Shimo Workspace')
+- page_title s_('Shimo|Shimo Workspace')
+- add_page_specific_style 'page_bundles/wiki'
+= render layout: 'shared/empty_states/wikis_layout', locals: { image_path: 'illustrations/wiki_login_empty.svg' } do
+ %h4
+ = s_('Shimo|Shimo Workspace integration is enabled')
+ %p
+ = format s_("Shimo|You've enabled the Shimo Workspace integration. You can view your wiki directly in Shimo.").html_safe
+ = external_link(s_('Shimo|Go to Shimo Workspace'),
+ @project.shimo_integration.external_wiki_url,
+ class: 'gl-button btn btn-success external-url')
diff --git a/config/feature_flags/development/shimo_integration.yml b/config/feature_flags/development/shimo_integration.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3ac45ddb9e81554181c6eb26488b9694d04cf17a
--- /dev/null
+++ b/config/feature_flags/development/shimo_integration.yml
@@ -0,0 +1,8 @@
+---
+name: shimo_integration
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/73129
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/343386
+milestone: '14.5'
+type: development
+group: group::integrations
+default_enabled: false
diff --git a/config/metrics/counts_all/20211028210001_projects_shimo_active.yml b/config/metrics/counts_all/20211028210001_projects_shimo_active.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5be51ba4cb2dd4d4fff76a2ef0a6b507bca87567
--- /dev/null
+++ b/config/metrics/counts_all/20211028210001_projects_shimo_active.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.projects_shimo_active
+name: count_all_projects_shimo_active
+description: Count of projects with active Shimo integrations
+product_section: dev
+product_stage: ecosystem
+product_group: group::integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "14.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/343386
+time_frame: all
+data_source: database
+data_category: Operational
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20211028210002_groups_shimo_active.yml b/config/metrics/counts_all/20211028210002_groups_shimo_active.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f57deeae590d7fe309ee3f4c3a2324307171a16b
--- /dev/null
+++ b/config/metrics/counts_all/20211028210002_groups_shimo_active.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.groups_shimo_active
+name: count_all_groups_shimo_active
+description: Count of groups with active Shimo integrations
+product_section: dev
+product_stage: ecosystem
+product_group: group::integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "14.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/343386
+time_frame: all
+data_source: database
+data_category: Operational
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20211028210003_instances_shimo_active.yml b/config/metrics/counts_all/20211028210003_instances_shimo_active.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7d1c6ea3706b75dc4c0607c089f43c2f6de5f06d
--- /dev/null
+++ b/config/metrics/counts_all/20211028210003_instances_shimo_active.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.instances_shimo_active
+name: count_all_instances_shimo_active
+description: Count of instances with active Shimo integrations
+product_section: dev
+product_stage: ecosystem
+product_group: group::integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "14.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/343386
+time_frame: all
+data_source: database
+data_category: Operational
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20211028210004_projects_inheriting_shimo_active.yml b/config/metrics/counts_all/20211028210004_projects_inheriting_shimo_active.yml
new file mode 100644
index 0000000000000000000000000000000000000000..42f01ccff3a98d7bad07455dd1307f1b11a9bddd
--- /dev/null
+++ b/config/metrics/counts_all/20211028210004_projects_inheriting_shimo_active.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.projects_inheriting_shimo_active
+name: count_all_projects_inheriting_shimo_active
+description: Count of projects that inherit active Shimo integrations
+product_section: dev
+product_stage: ecosystem
+product_group: group::integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "14.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/343386
+time_frame: all
+data_source: database
+data_category: Operational
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/metrics/counts_all/20211028210005_groups_inheriting_shimo_active.yml b/config/metrics/counts_all/20211028210005_groups_inheriting_shimo_active.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6292ad0aaae431c6e6c678ebec14b72ca954c318
--- /dev/null
+++ b/config/metrics/counts_all/20211028210005_groups_inheriting_shimo_active.yml
@@ -0,0 +1,22 @@
+---
+key_path: counts.groups_inheriting_shimo_active
+name: count_all_groups_inheriting_shimo_active
+description: Count of groups that inherit active Shimo integrations
+product_section: dev
+product_stage: ecosystem
+product_group: group::integrations
+product_category: integrations
+value_type: number
+status: active
+milestone: "14.5"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/issues/343386
+time_frame: all
+data_source: database
+data_category: Operational
+distribution:
+- ce
+- ee
+tier:
+- free
+- premium
+- ultimate
diff --git a/config/routes/project.rb b/config/routes/project.rb
index 446ecc4159b2918e30b04c9c414bdcb8206379c7..ea682538111a603e5b4ee4313df59a7440f24661 100644
--- a/config/routes/project.rb
+++ b/config/routes/project.rb
@@ -451,6 +451,10 @@
end
end
end
+
+ namespace :integrations do
+ resources :shimo, only: [:index]
+ end
end
# End of the /-/ scope.
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index ea40b5b1d50e563adec5bd25117c73e7cd0c7f37..20486ccd9daea9be8351edc65b52c717b4c66810 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -16680,6 +16680,7 @@ State of a Sentry error.
| `PROMETHEUS_SERVICE` | PrometheusService type. |
| `PUSHOVER_SERVICE` | PushoverService type. |
| `REDMINE_SERVICE` | RedmineService type. |
+| `SHIMO_SERVICE` | ShimoService type. |
| `SLACK_SERVICE` | SlackService type. |
| `SLACK_SLASH_COMMANDS_SERVICE` | SlackSlashCommandsService type. |
| `TEAMCITY_SERVICE` | TeamcityService type. |
diff --git a/lib/api/helpers/integrations_helpers.rb b/lib/api/helpers/integrations_helpers.rb
index 7ae46abd0971c51630fbfd84d3b7cd6424cd7b9a..e7fdb6645a507f06537ae5dc70a4c3e59f1d11f6 100644
--- a/lib/api/helpers/integrations_helpers.rb
+++ b/lib/api/helpers/integrations_helpers.rb
@@ -530,6 +530,14 @@ def self.integrations
desc: 'The Mattermost token'
}
],
+ 'shimo' => [
+ {
+ required: true,
+ name: :external_wiki_url,
+ type: String,
+ desc: 'Shimo workspace URL'
+ }
+ ],
'slack-slash-commands' => [
{
required: true,
diff --git a/lib/gitlab/integrations/sti_type.rb b/lib/gitlab/integrations/sti_type.rb
index 91797a7b99bcafd911aa68a3eed1361f063e07b7..1350d75b2169a0b5b3dfd2f4c711a09ef0473bfa 100644
--- a/lib/gitlab/integrations/sti_type.rb
+++ b/lib/gitlab/integrations/sti_type.rb
@@ -7,7 +7,7 @@ class StiType < ActiveRecord::Type::String
Asana Assembla Bamboo Bugzilla Buildkite Campfire Confluence CustomIssueTracker Datadog
Discord DroneCi EmailsOnPush Ewm ExternalWiki Flowdock HangoutsChat Irker Jenkins Jira Mattermost
MattermostSlashCommands MicrosoftTeams MockCi MockMonitoring Packagist PipelinesEmail Pivotaltracker
- Prometheus Pushover Redmine Slack SlackSlashCommands Teamcity UnifyCircuit WebexTeams Youtrack Zentao
+ Prometheus Pushover Redmine Shimo Slack SlackSlashCommands Teamcity UnifyCircuit WebexTeams Youtrack Zentao
)).freeze
def self.namespaced_integrations
diff --git a/lib/sidebars/projects/menus/shimo_menu.rb b/lib/sidebars/projects/menus/shimo_menu.rb
new file mode 100644
index 0000000000000000000000000000000000000000..5122f4a369415acabec79ea7115a26e98b088a01
--- /dev/null
+++ b/lib/sidebars/projects/menus/shimo_menu.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+module Sidebars
+ module Projects
+ module Menus
+ class ShimoMenu < ::Sidebars::Menu
+ override :link
+ def link
+ project_integrations_shimo_index_path(context.project)
+ end
+
+ override :title
+ def title
+ s_('Shimo|Shimo')
+ end
+
+ override :image_path
+ def image_path
+ 'logos/shimo.svg'
+ end
+
+ override :image_html_options
+ def image_html_options
+ {
+ size: 16
+ }
+ end
+
+ override :render?
+ def render?
+ context.project.shimo_integration&.render?
+ end
+
+ override :active_routes
+ def active_routes
+ { controller: :shimo }
+ end
+ end
+ end
+ end
+end
diff --git a/lib/sidebars/projects/panel.rb b/lib/sidebars/projects/panel.rb
index 374662162b5c857b19cee8f5fc2d4432e1a2f1cb..41a0baf8fb3d2018cf76afa6e50b15686b508982 100644
--- a/lib/sidebars/projects/panel.rb
+++ b/lib/sidebars/projects/panel.rb
@@ -32,12 +32,17 @@ def add_menus
add_menu(Sidebars::Projects::Menus::InfrastructureMenu.new(context))
add_menu(Sidebars::Projects::Menus::PackagesRegistriesMenu.new(context))
add_menu(Sidebars::Projects::Menus::AnalyticsMenu.new(context))
- add_menu(confluence_or_wiki_menu)
- add_menu(Sidebars::Projects::Menus::ExternalWikiMenu.new(context))
+ add_wiki_menus
add_menu(Sidebars::Projects::Menus::SnippetsMenu.new(context))
add_menu(Sidebars::Projects::Menus::SettingsMenu.new(context))
end
+ def add_wiki_menus
+ add_menu(confluence_or_wiki_menu)
+ add_menu(Sidebars::Projects::Menus::ExternalWikiMenu.new(context))
+ add_menu(Sidebars::Projects::Menus::ShimoMenu.new(context)) if context.project.shimo_integration&.feature_flag_enabled?
+ end
+
def confluence_or_wiki_menu
confluence_menu = ::Sidebars::Projects::Menus::ConfluenceMenu.new(context)
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 658c60aac03579077bf925cf84eaf37d4aca86a1..267d0648e2e9ee81c6d54878d6a6d473c972d122 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -31599,6 +31599,27 @@ msgstr ""
msgid "Sherlock Transactions"
msgstr ""
+msgid "Shimo|Go to Shimo Workspace"
+msgstr ""
+
+msgid "Shimo|Link to a Shimo Workspace from the sidebar."
+msgstr ""
+
+msgid "Shimo|Shimo"
+msgstr ""
+
+msgid "Shimo|Shimo Workspace"
+msgstr ""
+
+msgid "Shimo|Shimo Workspace URL"
+msgstr ""
+
+msgid "Shimo|Shimo Workspace integration is enabled"
+msgstr ""
+
+msgid "Shimo|You've enabled the Shimo Workspace integration. You can view your wiki directly in Shimo."
+msgstr ""
+
msgid "Should you ever lose your phone or access to your one time password secret, each of these recovery codes can be used one time each to regain access to your account. Please save them in a safe place, or you %{boldStart}will%{boldEnd} lose access to your account."
msgstr ""
diff --git a/spec/controllers/projects/integrations/shimo_controller_spec.rb b/spec/controllers/projects/integrations/shimo_controller_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..1dfc1a96fdc0ec1c299faa7902daed0a78b9a148
--- /dev/null
+++ b/spec/controllers/projects/integrations/shimo_controller_spec.rb
@@ -0,0 +1,39 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ::Projects::Integrations::ShimoController do
+ let_it_be(:project) { create(:project) }
+ let_it_be(:user) { create(:user, developer_projects: [project]) }
+ let_it_be(:shimo_integration) { create(:shimo_integration, project: project) }
+
+ before do
+ sign_in(user)
+ end
+
+ describe 'GET #index' do
+ context 'when Shimo integration is inactivated' do
+ before do
+ shimo_integration.update!(active: false)
+ end
+
+ it 'returns 404 status' do
+ get :index, params: { namespace_id: project.namespace, project_id: project }
+
+ expect(response).to have_gitlab_http_status(:not_found)
+ end
+ end
+
+ context 'when Shimo integration is activated' do
+ render_views
+
+ it 'renders the "index" template' do
+ get :index, params: { namespace_id: project.namespace, project_id: project }
+
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template(:index)
+ expect(response.body).to include shimo_integration.external_wiki_url
+ end
+ end
+ end
+end
diff --git a/spec/factories/integrations.rb b/spec/factories/integrations.rb
index 63f85c04ac7a6bcc29ce8e7d7531bd280b27e8f0..63a5fadb6a82a8f5d128b8d1f410517c84444687 100644
--- a/spec/factories/integrations.rb
+++ b/spec/factories/integrations.rb
@@ -111,6 +111,12 @@
end
end
+ factory :shimo_integration, class: 'Integrations::Shimo' do
+ project
+ active { true }
+ external_wiki_url { 'https://shimo.im/desktop' }
+ end
+
factory :confluence_integration, class: 'Integrations::Confluence' do
project
active { true }
diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml
index 95217b43d1397e024e98e2073c9668f8b73bb69b..b474f5825fdf852e122c4b51ac47c8729df832f2 100644
--- a/spec/lib/gitlab/import_export/all_models.yml
+++ b/spec/lib/gitlab/import_export/all_models.yml
@@ -384,6 +384,7 @@ project:
- emails_on_push_integration
- pipelines_email_integration
- mattermost_slash_commands_integration
+- shimo_integration
- slack_slash_commands_integration
- irker_integration
- packagist_integration
diff --git a/spec/lib/sidebars/projects/menus/shimo_menu_spec.rb b/spec/lib/sidebars/projects/menus/shimo_menu_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..636440c96791e0fc4269949b82a667b4cb39ec5e
--- /dev/null
+++ b/spec/lib/sidebars/projects/menus/shimo_menu_spec.rb
@@ -0,0 +1,43 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Sidebars::Projects::Menus::ShimoMenu do
+ let(:project) { create(:project) }
+ let(:context) { Sidebars::Projects::Context.new(current_user: project.owner, container: project) }
+
+ subject(:shimo_menu) { described_class.new(context) }
+
+ describe '#render?' do
+ context 'without a valid Shimo integration' do
+ it "doesn't render the menu" do
+ expect(shimo_menu.render?).to be_falsey
+ end
+ end
+
+ context 'with a valid Shimo integration' do
+ let!(:shimo_integration) { create(:shimo_integration, project: project) }
+
+ context 'when integration is activated' do
+ it 'renders the menu' do
+ expect(shimo_menu.render?).to eq true
+ end
+
+ it 'renders menu link' do
+ expected_url = Rails.application.routes.url_helpers.project_integrations_shimo_index_path(project)
+ expect(shimo_menu.link).to eq expected_url
+ end
+ end
+
+ context 'when integration is inactivated' do
+ before do
+ shimo_integration.update!(active: false)
+ end
+
+ it "doesn't render the menu" do
+ expect(shimo_menu.render?).to eq false
+ end
+ end
+ end
+ end
+end
diff --git a/spec/models/integrations/shimo_spec.rb b/spec/models/integrations/shimo_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..17546d68bcf076c592a55a3407def57bc2fbd48d
--- /dev/null
+++ b/spec/models/integrations/shimo_spec.rb
@@ -0,0 +1,41 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe ::Integrations::Shimo do
+ describe '#fields' do
+ let(:shimo_integration) { create(:shimo_integration) }
+
+ it 'returns custom fields' do
+ expect(shimo_integration.fields.pluck(:name)).to eq(%w[external_wiki_url])
+ end
+ end
+
+ describe '#create' do
+ let(:project) { create(:project, :repository) }
+ let(:external_wiki_url) { 'https://shimo.im/' }
+ let(:params) { { active: true, project: project, external_wiki_url: external_wiki_url } }
+
+ context 'with valid params' do
+ it 'creates the Shimo integration' do
+ shimo = described_class.create!(params)
+
+ expect(shimo.valid?).to be true
+ expect(shimo.render?).to be true
+ expect(shimo.external_wiki_url).to eq(external_wiki_url)
+ end
+ end
+
+ context 'with invalid params' do
+ it 'cannot create the Shimo integration without external_wiki_url' do
+ params['external_wiki_url'] = nil
+ expect { described_class.create!(params) }.to raise_error(ActiveRecord::RecordInvalid)
+ end
+
+ it 'cannot create the Shimo integration with invalid external_wiki_url' do
+ params['external_wiki_url'] = 'Fake Invalid URL'
+ expect { described_class.create!(params) }.to raise_error(ActiveRecord::RecordInvalid)
+ end
+ end
+ end
+end
diff --git a/spec/requests/api/integrations_spec.rb b/spec/requests/api/integrations_spec.rb
index 649647804c0f252295fe596dd4c98d8576dfd340..5cad8863501e43b4d69ab4694c73f25fc96f480e 100644
--- a/spec/requests/api/integrations_spec.rb
+++ b/spec/requests/api/integrations_spec.rb
@@ -105,7 +105,7 @@
delete api("/projects/#{project.id}/#{endpoint}/#{dashed_integration}", user)
expect(response).to have_gitlab_http_status(:no_content)
- project.send(integration_method).reload
+ project.reload.send(integration_method).reload
expect(project.send(integration_method).activated?).to be_falsey
end
end