Skip to content

RSpec: Define a single integration context

Peter Leitzen requested to merge pl-spec-integration-shared-context into master

What does this MR do and why?

Instead of defining a shared context per integration name on load time we now define a single integration context "with integration" during runtime which relies on a let binding integration.

This sidesteps a problem where feature flags were not (yet) stubbed during load time.

See #386731 (closed).

This MR also fixed all 👮 RuboCop offenses in spec/support/shared_contexts/features/integrations/integrations_shared_context.rb.

💡 Review tip

Best reviewed with whitespace changes:

[ ] Show whitespace changes
Screenshot_from_2023-04-19_13-00-55

How to set up and validate locally

bin/rspec --format documentation spec/requests/api/integrations_spec.rb

bundle exec rubocop spec/support/shared_contexts/features/integrations/integrations_shared_context.rb

Before

806 examples, 0 failures
Click to expand
Run options: include {:focus=>true}

All examples were filtered out; ignoring {:focus=>true}
==> Starting GitLab Elasticsearch Indexer (4.3.0) set up...
==> GitLab Elasticsearch Indexer set up in 41.035071567 seconds...

Test environment set up in 48.431594916 seconds

API::Integrations
  GET /projects/:id/integrations
    returns authentication error when unauthenticated
    returns error when authenticated but user is not a project owner
    with integrations
      returns a list of all active integrations
  PUT /projects/:id/integrations/apple-app-store
    updates apple_app_store settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/apple-app-store
    deletes apple_app_store
  GET /projects/:id/integrations/apple-app-store
    returns authentication error when unauthenticated
    returns all properties of active integration apple_app_store, except password fields
    returns all properties of inactive integration apple_app_store, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/asana
    updates asana settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/asana
    deletes asana
  GET /projects/:id/integrations/asana
    returns authentication error when unauthenticated
    returns all properties of active integration asana, except password fields
    returns all properties of inactive integration asana, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/assembla
    updates assembla settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/assembla
    deletes assembla
  GET /projects/:id/integrations/assembla
    returns authentication error when unauthenticated
    returns all properties of active integration assembla, except password fields
    returns all properties of inactive integration assembla, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/bamboo
    updates bamboo settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/bamboo
    deletes bamboo
  GET /projects/:id/integrations/bamboo
    returns authentication error when unauthenticated
    returns all properties of active integration bamboo, except password fields
    returns all properties of inactive integration bamboo, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/bugzilla
    updates bugzilla settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/bugzilla
    deletes bugzilla
  GET /projects/:id/integrations/bugzilla
    returns authentication error when unauthenticated
    returns all properties of active integration bugzilla, except password fields
    returns all properties of inactive integration bugzilla, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/buildkite
    updates buildkite settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/buildkite
    deletes buildkite
  GET /projects/:id/integrations/buildkite
    returns authentication error when unauthenticated
    returns all properties of active integration buildkite, except password fields
    returns all properties of inactive integration buildkite, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/campfire
    updates campfire settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/campfire
    deletes campfire
  GET /projects/:id/integrations/campfire
    returns authentication error when unauthenticated
    returns all properties of active integration campfire, except password fields
    returns all properties of inactive integration campfire, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/confluence
    updates confluence settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/confluence
    deletes confluence
  GET /projects/:id/integrations/confluence
    returns authentication error when unauthenticated
    returns all properties of active integration confluence, except password fields
    returns all properties of inactive integration confluence, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/custom-issue-tracker
    updates custom_issue_tracker settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/custom-issue-tracker
    deletes custom_issue_tracker
  GET /projects/:id/integrations/custom-issue-tracker
    returns authentication error when unauthenticated
    returns all properties of active integration custom_issue_tracker, except password fields
    returns all properties of inactive integration custom_issue_tracker, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/datadog
    updates datadog settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/datadog
    deletes datadog
  GET /projects/:id/integrations/datadog
    returns authentication error when unauthenticated
    returns all properties of active integration datadog, except password fields
    returns all properties of inactive integration datadog, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/discord
    updates discord settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/discord
    deletes discord
  GET /projects/:id/integrations/discord
    returns authentication error when unauthenticated
    returns all properties of active integration discord, except password fields
    returns all properties of inactive integration discord, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/drone-ci
    updates drone_ci settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/drone-ci
    deletes drone_ci
  GET /projects/:id/integrations/drone-ci
    returns authentication error when unauthenticated
    returns all properties of active integration drone_ci, except password fields
    returns all properties of inactive integration drone_ci, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/emails-on-push
    updates emails_on_push settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/emails-on-push
    deletes emails_on_push
  GET /projects/:id/integrations/emails-on-push
    returns authentication error when unauthenticated
    returns all properties of active integration emails_on_push, except password fields
    returns all properties of inactive integration emails_on_push, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/ewm
    updates ewm settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/ewm
    deletes ewm
  GET /projects/:id/integrations/ewm
    returns authentication error when unauthenticated
    returns all properties of active integration ewm, except password fields
    returns all properties of inactive integration ewm, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/external-wiki
    updates external_wiki settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/external-wiki
    deletes external_wiki
  GET /projects/:id/integrations/external-wiki
    returns authentication error when unauthenticated
    returns all properties of active integration external_wiki, except password fields
    returns all properties of inactive integration external_wiki, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/github
    updates github settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/github
    deletes github
  GET /projects/:id/integrations/github
    returns authentication error when unauthenticated
    returns all properties of active integration github, except password fields
    returns all properties of inactive integration github, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/google-play
    updates google_play settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/google-play
    deletes google_play
  GET /projects/:id/integrations/google-play
    returns authentication error when unauthenticated
    returns all properties of active integration google_play, except password fields
    returns all properties of inactive integration google_play, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/hangouts-chat
    updates hangouts_chat settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/hangouts-chat
    deletes hangouts_chat
  GET /projects/:id/integrations/hangouts-chat
    returns authentication error when unauthenticated
    returns all properties of active integration hangouts_chat, except password fields
    returns all properties of inactive integration hangouts_chat, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/harbor
    updates harbor settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/harbor
    deletes harbor
  GET /projects/:id/integrations/harbor
    returns authentication error when unauthenticated
    returns all properties of active integration harbor, except password fields
    returns all properties of inactive integration harbor, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/irker
    updates irker settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/irker
    deletes irker
  GET /projects/:id/integrations/irker
    returns authentication error when unauthenticated
    returns all properties of active integration irker, except password fields
    returns all properties of inactive integration irker, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/jenkins
    updates jenkins settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/jenkins
    deletes jenkins
  GET /projects/:id/integrations/jenkins
    returns authentication error when unauthenticated
    returns all properties of active integration jenkins, except password fields
    returns all properties of inactive integration jenkins, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/jira
    updates jira settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/jira
    deletes jira
  GET /projects/:id/integrations/jira
    returns authentication error when unauthenticated
    returns all properties of active integration jira, except password fields
    returns all properties of inactive integration jira, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/mattermost
    updates mattermost settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/mattermost
    deletes mattermost
  GET /projects/:id/integrations/mattermost
    returns authentication error when unauthenticated
    returns all properties of active integration mattermost, except password fields
    returns all properties of inactive integration mattermost, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/mattermost-slash-commands
    updates mattermost_slash_commands settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/mattermost-slash-commands
    deletes mattermost_slash_commands
  GET /projects/:id/integrations/mattermost-slash-commands
    returns authentication error when unauthenticated
    returns all properties of active integration mattermost_slash_commands, except password fields
    returns all properties of inactive integration mattermost_slash_commands, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/microsoft-teams
    updates microsoft_teams settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/microsoft-teams
    deletes microsoft_teams
  GET /projects/:id/integrations/microsoft-teams
    returns authentication error when unauthenticated
    returns all properties of active integration microsoft_teams, except password fields
    returns all properties of inactive integration microsoft_teams, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/mock-ci
    updates mock_ci settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/mock-ci
    deletes mock_ci
  GET /projects/:id/integrations/mock-ci
    returns authentication error when unauthenticated
    returns all properties of active integration mock_ci, except password fields
    returns all properties of inactive integration mock_ci, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/mock-monitoring
    updates mock_monitoring settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/mock-monitoring
    deletes mock_monitoring
  GET /projects/:id/integrations/mock-monitoring
    returns authentication error when unauthenticated
    returns all properties of active integration mock_monitoring, except password fields
    returns all properties of inactive integration mock_monitoring, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/packagist
    updates packagist settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/packagist
    deletes packagist
  GET /projects/:id/integrations/packagist
    returns authentication error when unauthenticated
    returns all properties of active integration packagist, except password fields
    returns all properties of inactive integration packagist, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/pipelines-email
    updates pipelines_email settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/pipelines-email
    deletes pipelines_email
  GET /projects/:id/integrations/pipelines-email
    returns authentication error when unauthenticated
    returns all properties of active integration pipelines_email, except password fields
    returns all properties of inactive integration pipelines_email, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/pivotaltracker
    updates pivotaltracker settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/pivotaltracker
    deletes pivotaltracker
  GET /projects/:id/integrations/pivotaltracker
    returns authentication error when unauthenticated
    returns all properties of active integration pivotaltracker, except password fields
    returns all properties of inactive integration pivotaltracker, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/prometheus
    updates prometheus settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/prometheus
    deletes prometheus
  GET /projects/:id/integrations/prometheus
    returns authentication error when unauthenticated
    returns all properties of active integration prometheus, except password fields
    returns all properties of inactive integration prometheus, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/pumble
    updates pumble settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/pumble
    deletes pumble
  GET /projects/:id/integrations/pumble
    returns authentication error when unauthenticated
    returns all properties of active integration pumble, except password fields
    returns all properties of inactive integration pumble, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/pushover
    updates pushover settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/pushover
    deletes pushover
  GET /projects/:id/integrations/pushover
    returns authentication error when unauthenticated
    returns all properties of active integration pushover, except password fields
    returns all properties of inactive integration pushover, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/redmine
    updates redmine settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/redmine
    deletes redmine
  GET /projects/:id/integrations/redmine
    returns authentication error when unauthenticated
    returns all properties of active integration redmine, except password fields
    returns all properties of inactive integration redmine, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/shimo
    updates shimo settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/shimo
    deletes shimo
  GET /projects/:id/integrations/shimo
    returns authentication error when unauthenticated
    returns all properties of active integration shimo, except password fields
    returns all properties of inactive integration shimo, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/slack
    updates slack settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/slack
    deletes slack
  GET /projects/:id/integrations/slack
    returns authentication error when unauthenticated
    returns all properties of active integration slack, except password fields
    returns all properties of inactive integration slack, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/slack-slash-commands
    updates slack_slash_commands settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/slack-slash-commands
    deletes slack_slash_commands
  GET /projects/:id/integrations/slack-slash-commands
    returns authentication error when unauthenticated
    returns all properties of active integration slack_slash_commands, except password fields
    returns all properties of inactive integration slack_slash_commands, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/squash-tm
    updates squash_tm settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/squash-tm
    deletes squash_tm
  GET /projects/:id/integrations/squash-tm
    returns authentication error when unauthenticated
    returns all properties of active integration squash_tm, except password fields
    returns all properties of inactive integration squash_tm, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/teamcity
    updates teamcity settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/teamcity
    deletes teamcity
  GET /projects/:id/integrations/teamcity
    returns authentication error when unauthenticated
    returns all properties of active integration teamcity, except password fields
    returns all properties of inactive integration teamcity, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/unify-circuit
    updates unify_circuit settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/unify-circuit
    deletes unify_circuit
  GET /projects/:id/integrations/unify-circuit
    returns authentication error when unauthenticated
    returns all properties of active integration unify_circuit, except password fields
    returns all properties of inactive integration unify_circuit, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/webex-teams
    updates webex_teams settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/webex-teams
    deletes webex_teams
  GET /projects/:id/integrations/webex-teams
    returns authentication error when unauthenticated
    returns all properties of active integration webex_teams, except password fields
    returns all properties of inactive integration webex_teams, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/youtrack
    updates youtrack settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/youtrack
    deletes youtrack
  GET /projects/:id/integrations/youtrack
    returns authentication error when unauthenticated
    returns all properties of active integration youtrack, except password fields
    returns all properties of inactive integration youtrack, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/integrations/zentao
    updates zentao settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/integrations/zentao
    deletes zentao
  GET /projects/:id/integrations/zentao
    returns authentication error when unauthenticated
    returns all properties of active integration zentao, except password fields
    returns all properties of inactive integration zentao, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  POST /projects/:id/integrations/:slug/trigger
    Mattermost integration
      when no integration is available
        returns a not found message
      when the integration exists
        when the integration is not active
          when the integration is inactive
        when the integration is active
          returns status 200
        when the project can not be found
          returns a generic 404
    Slack Integration
      returns status 200
  Mattermost integration
    accepts a username for update
  Microsoft Teams integration
    accepts branches_to_be_notified for update
    accepts notify_only_broken_pipelines for update
  Hangouts Chat integration
    accepts branches_to_be_notified for update
    only requires the webhook param
  Jira integration
    returns the jira_issue_transition_id for get request
    returns the jira_issue_transition_id for put request
  Pipelines Email Integration
    notify_only_broken_pipelines property was saved as a string
      returns boolean values for notify_only_broken_pipelines
  GET /projects/:id/services
    returns authentication error when unauthenticated
    returns error when authenticated but user is not a project owner
    with integrations
      returns a list of all active integrations
  PUT /projects/:id/services/apple-app-store
    updates apple_app_store settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/apple-app-store
    deletes apple_app_store
  GET /projects/:id/services/apple-app-store
    returns authentication error when unauthenticated
    returns all properties of active integration apple_app_store, except password fields
    returns all properties of inactive integration apple_app_store, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/asana
    updates asana settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/asana
    deletes asana
  GET /projects/:id/services/asana
    returns authentication error when unauthenticated
    returns all properties of active integration asana, except password fields
    returns all properties of inactive integration asana, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/assembla
    updates assembla settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/assembla
    deletes assembla
  GET /projects/:id/services/assembla
    returns authentication error when unauthenticated
    returns all properties of active integration assembla, except password fields
    returns all properties of inactive integration assembla, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/bamboo
    updates bamboo settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/bamboo
    deletes bamboo
  GET /projects/:id/services/bamboo
    returns authentication error when unauthenticated
    returns all properties of active integration bamboo, except password fields
    returns all properties of inactive integration bamboo, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/bugzilla
    updates bugzilla settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/bugzilla
    deletes bugzilla
  GET /projects/:id/services/bugzilla
    returns authentication error when unauthenticated
    returns all properties of active integration bugzilla, except password fields
    returns all properties of inactive integration bugzilla, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/buildkite
    updates buildkite settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/buildkite
    deletes buildkite
  GET /projects/:id/services/buildkite
    returns authentication error when unauthenticated
    returns all properties of active integration buildkite, except password fields
    returns all properties of inactive integration buildkite, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/campfire
    updates campfire settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/campfire
    deletes campfire
  GET /projects/:id/services/campfire
    returns authentication error when unauthenticated
    returns all properties of active integration campfire, except password fields
    returns all properties of inactive integration campfire, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/confluence
    updates confluence settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/confluence
    deletes confluence
  GET /projects/:id/services/confluence
    returns authentication error when unauthenticated
    returns all properties of active integration confluence, except password fields
    returns all properties of inactive integration confluence, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/custom-issue-tracker
    updates custom_issue_tracker settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/custom-issue-tracker
    deletes custom_issue_tracker
  GET /projects/:id/services/custom-issue-tracker
    returns authentication error when unauthenticated
    returns all properties of active integration custom_issue_tracker, except password fields
    returns all properties of inactive integration custom_issue_tracker, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/datadog
    updates datadog settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/datadog
    deletes datadog
  GET /projects/:id/services/datadog
    returns authentication error when unauthenticated
    returns all properties of active integration datadog, except password fields
    returns all properties of inactive integration datadog, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/discord
    updates discord settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/discord
    deletes discord
  GET /projects/:id/services/discord
    returns authentication error when unauthenticated
    returns all properties of active integration discord, except password fields
    returns all properties of inactive integration discord, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/drone-ci
    updates drone_ci settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/drone-ci
    deletes drone_ci
  GET /projects/:id/services/drone-ci
    returns authentication error when unauthenticated
    returns all properties of active integration drone_ci, except password fields
    returns all properties of inactive integration drone_ci, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/emails-on-push
    updates emails_on_push settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/emails-on-push
    deletes emails_on_push
  GET /projects/:id/services/emails-on-push
    returns authentication error when unauthenticated
    returns all properties of active integration emails_on_push, except password fields
    returns all properties of inactive integration emails_on_push, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/ewm
    updates ewm settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/ewm
    deletes ewm
  GET /projects/:id/services/ewm
    returns authentication error when unauthenticated
    returns all properties of active integration ewm, except password fields
    returns all properties of inactive integration ewm, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/external-wiki
    updates external_wiki settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/external-wiki
    deletes external_wiki
  GET /projects/:id/services/external-wiki
    returns authentication error when unauthenticated
    returns all properties of active integration external_wiki, except password fields
    returns all properties of inactive integration external_wiki, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/github
    updates github settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/github
    deletes github
  GET /projects/:id/services/github
    returns authentication error when unauthenticated
    returns all properties of active integration github, except password fields
    returns all properties of inactive integration github, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/google-play
    updates google_play settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/google-play
    deletes google_play
  GET /projects/:id/services/google-play
    returns authentication error when unauthenticated
    returns all properties of active integration google_play, except password fields
    returns all properties of inactive integration google_play, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/hangouts-chat
    updates hangouts_chat settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/hangouts-chat
    deletes hangouts_chat
  GET /projects/:id/services/hangouts-chat
    returns authentication error when unauthenticated
    returns all properties of active integration hangouts_chat, except password fields
    returns all properties of inactive integration hangouts_chat, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/harbor
    updates harbor settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/harbor
    deletes harbor
  GET /projects/:id/services/harbor
    returns authentication error when unauthenticated
    returns all properties of active integration harbor, except password fields
    returns all properties of inactive integration harbor, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/irker
    updates irker settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/irker
    deletes irker
  GET /projects/:id/services/irker
    returns authentication error when unauthenticated
    returns all properties of active integration irker, except password fields
    returns all properties of inactive integration irker, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/jenkins
    updates jenkins settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/jenkins
    deletes jenkins
  GET /projects/:id/services/jenkins
    returns authentication error when unauthenticated
    returns all properties of active integration jenkins, except password fields
    returns all properties of inactive integration jenkins, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/jira
    updates jira settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/jira
    deletes jira
  GET /projects/:id/services/jira
    returns authentication error when unauthenticated
    returns all properties of active integration jira, except password fields
    returns all properties of inactive integration jira, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/mattermost
    updates mattermost settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/mattermost
    deletes mattermost
  GET /projects/:id/services/mattermost
    returns authentication error when unauthenticated
    returns all properties of active integration mattermost, except password fields
    returns all properties of inactive integration mattermost, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/mattermost-slash-commands
    updates mattermost_slash_commands settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/mattermost-slash-commands
    deletes mattermost_slash_commands
  GET /projects/:id/services/mattermost-slash-commands
    returns authentication error when unauthenticated
    returns all properties of active integration mattermost_slash_commands, except password fields
    returns all properties of inactive integration mattermost_slash_commands, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/microsoft-teams
    updates microsoft_teams settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/microsoft-teams
    deletes microsoft_teams
  GET /projects/:id/services/microsoft-teams
    returns authentication error when unauthenticated
    returns all properties of active integration microsoft_teams, except password fields
    returns all properties of inactive integration microsoft_teams, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/mock-ci
    updates mock_ci settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/mock-ci
    deletes mock_ci
  GET /projects/:id/services/mock-ci
    returns authentication error when unauthenticated
    returns all properties of active integration mock_ci, except password fields
    returns all properties of inactive integration mock_ci, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/mock-monitoring
    updates mock_monitoring settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/mock-monitoring
    deletes mock_monitoring
  GET /projects/:id/services/mock-monitoring
    returns authentication error when unauthenticated
    returns all properties of active integration mock_monitoring, except password fields
    returns all properties of inactive integration mock_monitoring, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/packagist
    updates packagist settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/packagist
    deletes packagist
  GET /projects/:id/services/packagist
    returns authentication error when unauthenticated
    returns all properties of active integration packagist, except password fields
    returns all properties of inactive integration packagist, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/pipelines-email
    updates pipelines_email settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/pipelines-email
    deletes pipelines_email
  GET /projects/:id/services/pipelines-email
    returns authentication error when unauthenticated
    returns all properties of active integration pipelines_email, except password fields
    returns all properties of inactive integration pipelines_email, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/pivotaltracker
    updates pivotaltracker settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/pivotaltracker
    deletes pivotaltracker
  GET /projects/:id/services/pivotaltracker
    returns authentication error when unauthenticated
    returns all properties of active integration pivotaltracker, except password fields
    returns all properties of inactive integration pivotaltracker, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/prometheus
    updates prometheus settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/prometheus
    deletes prometheus
  GET /projects/:id/services/prometheus
    returns authentication error when unauthenticated
    returns all properties of active integration prometheus, except password fields
    returns all properties of inactive integration prometheus, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/pumble
    updates pumble settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/pumble
    deletes pumble
  GET /projects/:id/services/pumble
    returns authentication error when unauthenticated
    returns all properties of active integration pumble, except password fields
    returns all properties of inactive integration pumble, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/pushover
    updates pushover settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/pushover
    deletes pushover
  GET /projects/:id/services/pushover
    returns authentication error when unauthenticated
    returns all properties of active integration pushover, except password fields
    returns all properties of inactive integration pushover, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/redmine
    updates redmine settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/redmine
    deletes redmine
  GET /projects/:id/services/redmine
    returns authentication error when unauthenticated
    returns all properties of active integration redmine, except password fields
    returns all properties of inactive integration redmine, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/shimo
    updates shimo settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/shimo
    deletes shimo
  GET /projects/:id/services/shimo
    returns authentication error when unauthenticated
    returns all properties of active integration shimo, except password fields
    returns all properties of inactive integration shimo, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/slack
    updates slack settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/slack
    deletes slack
  GET /projects/:id/services/slack
    returns authentication error when unauthenticated
    returns all properties of active integration slack, except password fields
    returns all properties of inactive integration slack, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/slack-slash-commands
    updates slack_slash_commands settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/slack-slash-commands
    deletes slack_slash_commands
  GET /projects/:id/services/slack-slash-commands
    returns authentication error when unauthenticated
    returns all properties of active integration slack_slash_commands, except password fields
    returns all properties of inactive integration slack_slash_commands, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/squash-tm
    updates squash_tm settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/squash-tm
    deletes squash_tm
  GET /projects/:id/services/squash-tm
    returns authentication error when unauthenticated
    returns all properties of active integration squash_tm, except password fields
    returns all properties of inactive integration squash_tm, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/teamcity
    updates teamcity settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/teamcity
    deletes teamcity
  GET /projects/:id/services/teamcity
    returns authentication error when unauthenticated
    returns all properties of active integration teamcity, except password fields
    returns all properties of inactive integration teamcity, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/unify-circuit
    updates unify_circuit settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/unify-circuit
    deletes unify_circuit
  GET /projects/:id/services/unify-circuit
    returns authentication error when unauthenticated
    returns all properties of active integration unify_circuit, except password fields
    returns all properties of inactive integration unify_circuit, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/webex-teams
    updates webex_teams settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/webex-teams
    deletes webex_teams
  GET /projects/:id/services/webex-teams
    returns authentication error when unauthenticated
    returns all properties of active integration webex_teams, except password fields
    returns all properties of inactive integration webex_teams, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/youtrack
    updates youtrack settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/youtrack
    deletes youtrack
  GET /projects/:id/services/youtrack
    returns authentication error when unauthenticated
    returns all properties of active integration youtrack, except password fields
    returns all properties of inactive integration youtrack, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  PUT /projects/:id/services/zentao
    updates zentao settings and returns the correct fields
    returns if required fields missing
  DELETE /projects/:id/services/zentao
    deletes zentao
  GET /projects/:id/services/zentao
    returns authentication error when unauthenticated
    returns all properties of active integration zentao, except password fields
    returns all properties of inactive integration zentao, except password fields
    returns not found if integration does not exist
    returns not found if integration exists but is in `Project#disabled_integrations`
    returns error when authenticated but not a project owner
  POST /projects/:id/services/:slug/trigger
    Mattermost integration
      when no integration is available
        returns a not found message
      when the integration exists
        when the integration is not active
          when the integration is inactive
        when the integration is active
          returns status 200
        when the project can not be found
          returns a generic 404
    Slack Integration
      returns status 200
  Mattermost integration
    accepts a username for update
  Microsoft Teams integration
    accepts branches_to_be_notified for update
    accepts notify_only_broken_pipelines for update
  Hangouts Chat integration
    accepts branches_to_be_notified for update
    only requires the webhook param
  Jira integration
    returns the jira_issue_transition_id for get request
    returns the jira_issue_transition_id for put request
  Pipelines Email Integration
    notify_only_broken_pipelines property was saved as a string
      returns boolean values for notify_only_broken_pipelines

Finished in 4 minutes 40.5 seconds (files took 12.14 seconds to load)
806 examples, 0 failures

[TEST PROF INFO] Time spent in factories: 00:23.725 (8.37% of total time)

After

806 examples, 0 failures
Click to expand
Run options: include {:focus=>true}

All examples were filtered out; ignoring {:focus=>true}

Test environment set up in 6.375552356 seconds

API::Integrations
  GET /projects/:id/integrations
    returns authentication error when unauthenticated
    returns error when authenticated but user is not a project owner
    with integrations
      returns a list of all active integrations
  integration: "apple_app_store"
    PUT /projects/:id/integrations/apple-app-store
      updates apple_app_store settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/apple-app-store
      deletes apple_app_store
    GET /projects/:id/integrations/apple-app-store
      returns authentication error when unauthenticated
      returns all properties of active integration apple_app_store, except password fields
      returns all properties of inactive integration apple_app_store, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "asana"
    PUT /projects/:id/integrations/asana
      updates asana settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/asana
      deletes asana
    GET /projects/:id/integrations/asana
      returns authentication error when unauthenticated
      returns all properties of active integration asana, except password fields
      returns all properties of inactive integration asana, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "assembla"
    PUT /projects/:id/integrations/assembla
      updates assembla settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/assembla
      deletes assembla
    GET /projects/:id/integrations/assembla
      returns authentication error when unauthenticated
      returns all properties of active integration assembla, except password fields
      returns all properties of inactive integration assembla, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "bamboo"
    PUT /projects/:id/integrations/bamboo
      updates bamboo settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/bamboo
      deletes bamboo
    GET /projects/:id/integrations/bamboo
      returns authentication error when unauthenticated
      returns all properties of active integration bamboo, except password fields
      returns all properties of inactive integration bamboo, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "bugzilla"
    PUT /projects/:id/integrations/bugzilla
      updates bugzilla settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/bugzilla
      deletes bugzilla
    GET /projects/:id/integrations/bugzilla
      returns authentication error when unauthenticated
      returns all properties of active integration bugzilla, except password fields
      returns all properties of inactive integration bugzilla, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "buildkite"
    PUT /projects/:id/integrations/buildkite
      updates buildkite settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/buildkite
      deletes buildkite
    GET /projects/:id/integrations/buildkite
      returns authentication error when unauthenticated
      returns all properties of active integration buildkite, except password fields
      returns all properties of inactive integration buildkite, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "campfire"
    PUT /projects/:id/integrations/campfire
      updates campfire settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/campfire
      deletes campfire
    GET /projects/:id/integrations/campfire
      returns authentication error when unauthenticated
      returns all properties of active integration campfire, except password fields
      returns all properties of inactive integration campfire, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "confluence"
    PUT /projects/:id/integrations/confluence
      updates confluence settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/confluence
      deletes confluence
    GET /projects/:id/integrations/confluence
      returns authentication error when unauthenticated
      returns all properties of active integration confluence, except password fields
      returns all properties of inactive integration confluence, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "custom_issue_tracker"
    PUT /projects/:id/integrations/custom-issue-tracker
      updates custom_issue_tracker settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/custom-issue-tracker
      deletes custom_issue_tracker
    GET /projects/:id/integrations/custom-issue-tracker
      returns authentication error when unauthenticated
      returns all properties of active integration custom_issue_tracker, except password fields
      returns all properties of inactive integration custom_issue_tracker, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "datadog"
    PUT /projects/:id/integrations/datadog
      updates datadog settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/datadog
      deletes datadog
    GET /projects/:id/integrations/datadog
      returns authentication error when unauthenticated
      returns all properties of active integration datadog, except password fields
      returns all properties of inactive integration datadog, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "discord"
    PUT /projects/:id/integrations/discord
      updates discord settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/discord
      deletes discord
    GET /projects/:id/integrations/discord
      returns authentication error when unauthenticated
      returns all properties of active integration discord, except password fields
      returns all properties of inactive integration discord, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "drone_ci"
    PUT /projects/:id/integrations/drone-ci
      updates drone_ci settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/drone-ci
      deletes drone_ci
    GET /projects/:id/integrations/drone-ci
      returns authentication error when unauthenticated
      returns all properties of active integration drone_ci, except password fields
      returns all properties of inactive integration drone_ci, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "emails_on_push"
    PUT /projects/:id/integrations/emails-on-push
      updates emails_on_push settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/emails-on-push
      deletes emails_on_push
    GET /projects/:id/integrations/emails-on-push
      returns authentication error when unauthenticated
      returns all properties of active integration emails_on_push, except password fields
      returns all properties of inactive integration emails_on_push, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "ewm"
    PUT /projects/:id/integrations/ewm
      updates ewm settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/ewm
      deletes ewm
    GET /projects/:id/integrations/ewm
      returns authentication error when unauthenticated
      returns all properties of active integration ewm, except password fields
      returns all properties of inactive integration ewm, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "external_wiki"
    PUT /projects/:id/integrations/external-wiki
      updates external_wiki settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/external-wiki
      deletes external_wiki
    GET /projects/:id/integrations/external-wiki
      returns authentication error when unauthenticated
      returns all properties of active integration external_wiki, except password fields
      returns all properties of inactive integration external_wiki, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "github"
    PUT /projects/:id/integrations/github
      updates github settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/github
      deletes github
    GET /projects/:id/integrations/github
      returns authentication error when unauthenticated
      returns all properties of active integration github, except password fields
      returns all properties of inactive integration github, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "google_play"
    PUT /projects/:id/integrations/google-play
      updates google_play settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/google-play
      deletes google_play
    GET /projects/:id/integrations/google-play
      returns authentication error when unauthenticated
      returns all properties of active integration google_play, except password fields
      returns all properties of inactive integration google_play, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "hangouts_chat"
    PUT /projects/:id/integrations/hangouts-chat
      updates hangouts_chat settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/hangouts-chat
      deletes hangouts_chat
    GET /projects/:id/integrations/hangouts-chat
      returns authentication error when unauthenticated
      returns all properties of active integration hangouts_chat, except password fields
      returns all properties of inactive integration hangouts_chat, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "harbor"
    PUT /projects/:id/integrations/harbor
      updates harbor settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/harbor
      deletes harbor
    GET /projects/:id/integrations/harbor
      returns authentication error when unauthenticated
      returns all properties of active integration harbor, except password fields
      returns all properties of inactive integration harbor, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "irker"
    PUT /projects/:id/integrations/irker
      updates irker settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/irker
      deletes irker
    GET /projects/:id/integrations/irker
      returns authentication error when unauthenticated
      returns all properties of active integration irker, except password fields
      returns all properties of inactive integration irker, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "jenkins"
    PUT /projects/:id/integrations/jenkins
      updates jenkins settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/jenkins
      deletes jenkins
    GET /projects/:id/integrations/jenkins
      returns authentication error when unauthenticated
      returns all properties of active integration jenkins, except password fields
      returns all properties of inactive integration jenkins, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "jira"
    PUT /projects/:id/integrations/jira
      updates jira settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/jira
      deletes jira
    GET /projects/:id/integrations/jira
      returns authentication error when unauthenticated
      returns all properties of active integration jira, except password fields
      returns all properties of inactive integration jira, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "mattermost"
    PUT /projects/:id/integrations/mattermost
      updates mattermost settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/mattermost
      deletes mattermost
    GET /projects/:id/integrations/mattermost
      returns authentication error when unauthenticated
      returns all properties of active integration mattermost, except password fields
      returns all properties of inactive integration mattermost, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "mattermost_slash_commands"
    PUT /projects/:id/integrations/mattermost-slash-commands
      updates mattermost_slash_commands settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/mattermost-slash-commands
      deletes mattermost_slash_commands
    GET /projects/:id/integrations/mattermost-slash-commands
      returns authentication error when unauthenticated
      returns all properties of active integration mattermost_slash_commands, except password fields
      returns all properties of inactive integration mattermost_slash_commands, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "microsoft_teams"
    PUT /projects/:id/integrations/microsoft-teams
      updates microsoft_teams settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/microsoft-teams
      deletes microsoft_teams
    GET /projects/:id/integrations/microsoft-teams
      returns authentication error when unauthenticated
      returns all properties of active integration microsoft_teams, except password fields
      returns all properties of inactive integration microsoft_teams, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "mock_ci"
    PUT /projects/:id/integrations/mock-ci
      updates mock_ci settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/mock-ci
      deletes mock_ci
    GET /projects/:id/integrations/mock-ci
      returns authentication error when unauthenticated
      returns all properties of active integration mock_ci, except password fields
      returns all properties of inactive integration mock_ci, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "mock_monitoring"
    PUT /projects/:id/integrations/mock-monitoring
      updates mock_monitoring settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/mock-monitoring
      deletes mock_monitoring
    GET /projects/:id/integrations/mock-monitoring
      returns authentication error when unauthenticated
      returns all properties of active integration mock_monitoring, except password fields
      returns all properties of inactive integration mock_monitoring, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "packagist"
    PUT /projects/:id/integrations/packagist
      updates packagist settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/packagist
      deletes packagist
    GET /projects/:id/integrations/packagist
      returns authentication error when unauthenticated
      returns all properties of active integration packagist, except password fields
      returns all properties of inactive integration packagist, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "pipelines_email"
    PUT /projects/:id/integrations/pipelines-email
      updates pipelines_email settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/pipelines-email
      deletes pipelines_email
    GET /projects/:id/integrations/pipelines-email
      returns authentication error when unauthenticated
      returns all properties of active integration pipelines_email, except password fields
      returns all properties of inactive integration pipelines_email, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "pivotaltracker"
    PUT /projects/:id/integrations/pivotaltracker
      updates pivotaltracker settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/pivotaltracker
      deletes pivotaltracker
    GET /projects/:id/integrations/pivotaltracker
      returns authentication error when unauthenticated
      returns all properties of active integration pivotaltracker, except password fields
      returns all properties of inactive integration pivotaltracker, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "prometheus"
    PUT /projects/:id/integrations/prometheus
      updates prometheus settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/prometheus
      deletes prometheus
    GET /projects/:id/integrations/prometheus
      returns authentication error when unauthenticated
      returns all properties of active integration prometheus, except password fields
      returns all properties of inactive integration prometheus, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "pumble"
    PUT /projects/:id/integrations/pumble
      updates pumble settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/pumble
      deletes pumble
    GET /projects/:id/integrations/pumble
      returns authentication error when unauthenticated
      returns all properties of active integration pumble, except password fields
      returns all properties of inactive integration pumble, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "pushover"
    PUT /projects/:id/integrations/pushover
      updates pushover settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/pushover
      deletes pushover
    GET /projects/:id/integrations/pushover
      returns authentication error when unauthenticated
      returns all properties of active integration pushover, except password fields
      returns all properties of inactive integration pushover, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "redmine"
    PUT /projects/:id/integrations/redmine
      updates redmine settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/redmine
      deletes redmine
    GET /projects/:id/integrations/redmine
      returns authentication error when unauthenticated
      returns all properties of active integration redmine, except password fields
      returns all properties of inactive integration redmine, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "shimo"
    PUT /projects/:id/integrations/shimo
      updates shimo settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/shimo
      deletes shimo
    GET /projects/:id/integrations/shimo
      returns authentication error when unauthenticated
      returns all properties of active integration shimo, except password fields
      returns all properties of inactive integration shimo, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "slack"
    PUT /projects/:id/integrations/slack
      updates slack settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/slack
      deletes slack
    GET /projects/:id/integrations/slack
      returns authentication error when unauthenticated
      returns all properties of active integration slack, except password fields
      returns all properties of inactive integration slack, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "slack_slash_commands"
    PUT /projects/:id/integrations/slack-slash-commands
      updates slack_slash_commands settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/slack-slash-commands
      deletes slack_slash_commands
    GET /projects/:id/integrations/slack-slash-commands
      returns authentication error when unauthenticated
      returns all properties of active integration slack_slash_commands, except password fields
      returns all properties of inactive integration slack_slash_commands, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "squash_tm"
    PUT /projects/:id/integrations/squash-tm
      updates squash_tm settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/squash-tm
      deletes squash_tm
    GET /projects/:id/integrations/squash-tm
      returns authentication error when unauthenticated
      returns all properties of active integration squash_tm, except password fields
      returns all properties of inactive integration squash_tm, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "teamcity"
    PUT /projects/:id/integrations/teamcity
      updates teamcity settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/teamcity
      deletes teamcity
    GET /projects/:id/integrations/teamcity
      returns authentication error when unauthenticated
      returns all properties of active integration teamcity, except password fields
      returns all properties of inactive integration teamcity, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "unify_circuit"
    PUT /projects/:id/integrations/unify-circuit
      updates unify_circuit settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/unify-circuit
      deletes unify_circuit
    GET /projects/:id/integrations/unify-circuit
      returns authentication error when unauthenticated
      returns all properties of active integration unify_circuit, except password fields
      returns all properties of inactive integration unify_circuit, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "webex_teams"
    PUT /projects/:id/integrations/webex-teams
      updates webex_teams settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/webex-teams
      deletes webex_teams
    GET /projects/:id/integrations/webex-teams
      returns authentication error when unauthenticated
      returns all properties of active integration webex_teams, except password fields
      returns all properties of inactive integration webex_teams, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "youtrack"
    PUT /projects/:id/integrations/youtrack
      updates youtrack settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/youtrack
      deletes youtrack
    GET /projects/:id/integrations/youtrack
      returns authentication error when unauthenticated
      returns all properties of active integration youtrack, except password fields
      returns all properties of inactive integration youtrack, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "zentao"
    PUT /projects/:id/integrations/zentao
      updates zentao settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/integrations/zentao
      deletes zentao
    GET /projects/:id/integrations/zentao
      returns authentication error when unauthenticated
      returns all properties of active integration zentao, except password fields
      returns all properties of inactive integration zentao, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  POST /projects/:id/integrations/:slug/trigger
    Mattermost integration
      when no integration is available
        returns a not found message
      when the integration exists
        when the integration is not active
          when the integration is inactive
        when the integration is active
          returns status 200
        when the project can not be found
          returns a generic 404
    Slack Integration
      returns status 200
  Mattermost integration
    accepts a username for update
  Microsoft Teams integration
    accepts branches_to_be_notified for update
    accepts notify_only_broken_pipelines for update
  Hangouts Chat integration
    accepts branches_to_be_notified for update
    only requires the webhook param
  Jira integration
    returns the jira_issue_transition_id for get request
    returns the jira_issue_transition_id for put request
  Pipelines Email Integration
    notify_only_broken_pipelines property was saved as a string
      returns boolean values for notify_only_broken_pipelines
  GET /projects/:id/services
    returns authentication error when unauthenticated
    returns error when authenticated but user is not a project owner
    with integrations
      returns a list of all active integrations
  integration: "apple_app_store"
    PUT /projects/:id/services/apple-app-store
      updates apple_app_store settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/apple-app-store
      deletes apple_app_store
    GET /projects/:id/services/apple-app-store
      returns authentication error when unauthenticated
      returns all properties of active integration apple_app_store, except password fields
      returns all properties of inactive integration apple_app_store, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "asana"
    PUT /projects/:id/services/asana
      updates asana settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/asana
      deletes asana
    GET /projects/:id/services/asana
      returns authentication error when unauthenticated
      returns all properties of active integration asana, except password fields
      returns all properties of inactive integration asana, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "assembla"
    PUT /projects/:id/services/assembla
      updates assembla settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/assembla
      deletes assembla
    GET /projects/:id/services/assembla
      returns authentication error when unauthenticated
      returns all properties of active integration assembla, except password fields
      returns all properties of inactive integration assembla, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "bamboo"
    PUT /projects/:id/services/bamboo
      updates bamboo settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/bamboo
      deletes bamboo
    GET /projects/:id/services/bamboo
      returns authentication error when unauthenticated
      returns all properties of active integration bamboo, except password fields
      returns all properties of inactive integration bamboo, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "bugzilla"
    PUT /projects/:id/services/bugzilla
      updates bugzilla settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/bugzilla
      deletes bugzilla
    GET /projects/:id/services/bugzilla
      returns authentication error when unauthenticated
      returns all properties of active integration bugzilla, except password fields
      returns all properties of inactive integration bugzilla, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "buildkite"
    PUT /projects/:id/services/buildkite
      updates buildkite settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/buildkite
      deletes buildkite
    GET /projects/:id/services/buildkite
      returns authentication error when unauthenticated
      returns all properties of active integration buildkite, except password fields
      returns all properties of inactive integration buildkite, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "campfire"
    PUT /projects/:id/services/campfire
      updates campfire settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/campfire
      deletes campfire
    GET /projects/:id/services/campfire
      returns authentication error when unauthenticated
      returns all properties of active integration campfire, except password fields
      returns all properties of inactive integration campfire, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "confluence"
    PUT /projects/:id/services/confluence
      updates confluence settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/confluence
      deletes confluence
    GET /projects/:id/services/confluence
      returns authentication error when unauthenticated
      returns all properties of active integration confluence, except password fields
      returns all properties of inactive integration confluence, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "custom_issue_tracker"
    PUT /projects/:id/services/custom-issue-tracker
      updates custom_issue_tracker settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/custom-issue-tracker
      deletes custom_issue_tracker
    GET /projects/:id/services/custom-issue-tracker
      returns authentication error when unauthenticated
      returns all properties of active integration custom_issue_tracker, except password fields
      returns all properties of inactive integration custom_issue_tracker, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "datadog"
    PUT /projects/:id/services/datadog
      updates datadog settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/datadog
      deletes datadog
    GET /projects/:id/services/datadog
      returns authentication error when unauthenticated
      returns all properties of active integration datadog, except password fields
      returns all properties of inactive integration datadog, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "discord"
    PUT /projects/:id/services/discord
      updates discord settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/discord
      deletes discord
    GET /projects/:id/services/discord
      returns authentication error when unauthenticated
      returns all properties of active integration discord, except password fields
      returns all properties of inactive integration discord, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "drone_ci"
    PUT /projects/:id/services/drone-ci
      updates drone_ci settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/drone-ci
      deletes drone_ci
    GET /projects/:id/services/drone-ci
      returns authentication error when unauthenticated
      returns all properties of active integration drone_ci, except password fields
      returns all properties of inactive integration drone_ci, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "emails_on_push"
    PUT /projects/:id/services/emails-on-push
      updates emails_on_push settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/emails-on-push
      deletes emails_on_push
    GET /projects/:id/services/emails-on-push
      returns authentication error when unauthenticated
      returns all properties of active integration emails_on_push, except password fields
      returns all properties of inactive integration emails_on_push, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "ewm"
    PUT /projects/:id/services/ewm
      updates ewm settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/ewm
      deletes ewm
    GET /projects/:id/services/ewm
      returns authentication error when unauthenticated
      returns all properties of active integration ewm, except password fields
      returns all properties of inactive integration ewm, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "external_wiki"
    PUT /projects/:id/services/external-wiki
      updates external_wiki settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/external-wiki
      deletes external_wiki
    GET /projects/:id/services/external-wiki
      returns authentication error when unauthenticated
      returns all properties of active integration external_wiki, except password fields
      returns all properties of inactive integration external_wiki, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "github"
    PUT /projects/:id/services/github
      updates github settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/github
      deletes github
    GET /projects/:id/services/github
      returns authentication error when unauthenticated
      returns all properties of active integration github, except password fields
      returns all properties of inactive integration github, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "google_play"
    PUT /projects/:id/services/google-play
      updates google_play settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/google-play
      deletes google_play
    GET /projects/:id/services/google-play
      returns authentication error when unauthenticated
      returns all properties of active integration google_play, except password fields
      returns all properties of inactive integration google_play, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "hangouts_chat"
    PUT /projects/:id/services/hangouts-chat
      updates hangouts_chat settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/hangouts-chat
      deletes hangouts_chat
    GET /projects/:id/services/hangouts-chat
      returns authentication error when unauthenticated
      returns all properties of active integration hangouts_chat, except password fields
      returns all properties of inactive integration hangouts_chat, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "harbor"
    PUT /projects/:id/services/harbor
      updates harbor settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/harbor
      deletes harbor
    GET /projects/:id/services/harbor
      returns authentication error when unauthenticated
      returns all properties of active integration harbor, except password fields
      returns all properties of inactive integration harbor, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "irker"
    PUT /projects/:id/services/irker
      updates irker settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/irker
      deletes irker
    GET /projects/:id/services/irker
      returns authentication error when unauthenticated
      returns all properties of active integration irker, except password fields
      returns all properties of inactive integration irker, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "jenkins"
    PUT /projects/:id/services/jenkins
      updates jenkins settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/jenkins
      deletes jenkins
    GET /projects/:id/services/jenkins
      returns authentication error when unauthenticated
      returns all properties of active integration jenkins, except password fields
      returns all properties of inactive integration jenkins, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "jira"
    PUT /projects/:id/services/jira
      updates jira settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/jira
      deletes jira
    GET /projects/:id/services/jira
      returns authentication error when unauthenticated
      returns all properties of active integration jira, except password fields
      returns all properties of inactive integration jira, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "mattermost"
    PUT /projects/:id/services/mattermost
      updates mattermost settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/mattermost
      deletes mattermost
    GET /projects/:id/services/mattermost
      returns authentication error when unauthenticated
      returns all properties of active integration mattermost, except password fields
      returns all properties of inactive integration mattermost, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "mattermost_slash_commands"
    PUT /projects/:id/services/mattermost-slash-commands
      updates mattermost_slash_commands settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/mattermost-slash-commands
      deletes mattermost_slash_commands
    GET /projects/:id/services/mattermost-slash-commands
      returns authentication error when unauthenticated
      returns all properties of active integration mattermost_slash_commands, except password fields
      returns all properties of inactive integration mattermost_slash_commands, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "microsoft_teams"
    PUT /projects/:id/services/microsoft-teams
      updates microsoft_teams settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/microsoft-teams
      deletes microsoft_teams
    GET /projects/:id/services/microsoft-teams
      returns authentication error when unauthenticated
      returns all properties of active integration microsoft_teams, except password fields
      returns all properties of inactive integration microsoft_teams, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "mock_ci"
    PUT /projects/:id/services/mock-ci
      updates mock_ci settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/mock-ci
      deletes mock_ci
    GET /projects/:id/services/mock-ci
      returns authentication error when unauthenticated
      returns all properties of active integration mock_ci, except password fields
      returns all properties of inactive integration mock_ci, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "mock_monitoring"
    PUT /projects/:id/services/mock-monitoring
      updates mock_monitoring settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/mock-monitoring
      deletes mock_monitoring
    GET /projects/:id/services/mock-monitoring
      returns authentication error when unauthenticated
      returns all properties of active integration mock_monitoring, except password fields
      returns all properties of inactive integration mock_monitoring, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "packagist"
    PUT /projects/:id/services/packagist
      updates packagist settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/packagist
      deletes packagist
    GET /projects/:id/services/packagist
      returns authentication error when unauthenticated
      returns all properties of active integration packagist, except password fields
      returns all properties of inactive integration packagist, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "pipelines_email"
    PUT /projects/:id/services/pipelines-email
      updates pipelines_email settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/pipelines-email
      deletes pipelines_email
    GET /projects/:id/services/pipelines-email
      returns authentication error when unauthenticated
      returns all properties of active integration pipelines_email, except password fields
      returns all properties of inactive integration pipelines_email, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "pivotaltracker"
    PUT /projects/:id/services/pivotaltracker
      updates pivotaltracker settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/pivotaltracker
      deletes pivotaltracker
    GET /projects/:id/services/pivotaltracker
      returns authentication error when unauthenticated
      returns all properties of active integration pivotaltracker, except password fields
      returns all properties of inactive integration pivotaltracker, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "prometheus"
    PUT /projects/:id/services/prometheus
      updates prometheus settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/prometheus
      deletes prometheus
    GET /projects/:id/services/prometheus
      returns authentication error when unauthenticated
      returns all properties of active integration prometheus, except password fields
      returns all properties of inactive integration prometheus, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "pumble"
    PUT /projects/:id/services/pumble
      updates pumble settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/pumble
      deletes pumble
    GET /projects/:id/services/pumble
      returns authentication error when unauthenticated
      returns all properties of active integration pumble, except password fields
      returns all properties of inactive integration pumble, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "pushover"
    PUT /projects/:id/services/pushover
      updates pushover settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/pushover
      deletes pushover
    GET /projects/:id/services/pushover
      returns authentication error when unauthenticated
      returns all properties of active integration pushover, except password fields
      returns all properties of inactive integration pushover, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "redmine"
    PUT /projects/:id/services/redmine
      updates redmine settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/redmine
      deletes redmine
    GET /projects/:id/services/redmine
      returns authentication error when unauthenticated
      returns all properties of active integration redmine, except password fields
      returns all properties of inactive integration redmine, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "shimo"
    PUT /projects/:id/services/shimo
      updates shimo settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/shimo
      deletes shimo
    GET /projects/:id/services/shimo
      returns authentication error when unauthenticated
      returns all properties of active integration shimo, except password fields
      returns all properties of inactive integration shimo, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "slack"
    PUT /projects/:id/services/slack
      updates slack settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/slack
      deletes slack
    GET /projects/:id/services/slack
      returns authentication error when unauthenticated
      returns all properties of active integration slack, except password fields
      returns all properties of inactive integration slack, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "slack_slash_commands"
    PUT /projects/:id/services/slack-slash-commands
      updates slack_slash_commands settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/slack-slash-commands
      deletes slack_slash_commands
    GET /projects/:id/services/slack-slash-commands
      returns authentication error when unauthenticated
      returns all properties of active integration slack_slash_commands, except password fields
      returns all properties of inactive integration slack_slash_commands, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "squash_tm"
    PUT /projects/:id/services/squash-tm
      updates squash_tm settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/squash-tm
      deletes squash_tm
    GET /projects/:id/services/squash-tm
      returns authentication error when unauthenticated
      returns all properties of active integration squash_tm, except password fields
      returns all properties of inactive integration squash_tm, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "teamcity"
    PUT /projects/:id/services/teamcity
      updates teamcity settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/teamcity
      deletes teamcity
    GET /projects/:id/services/teamcity
      returns authentication error when unauthenticated
      returns all properties of active integration teamcity, except password fields
      returns all properties of inactive integration teamcity, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "unify_circuit"
    PUT /projects/:id/services/unify-circuit
      updates unify_circuit settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/unify-circuit
      deletes unify_circuit
    GET /projects/:id/services/unify-circuit
      returns authentication error when unauthenticated
      returns all properties of active integration unify_circuit, except password fields
      returns all properties of inactive integration unify_circuit, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "webex_teams"
    PUT /projects/:id/services/webex-teams
      updates webex_teams settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/webex-teams
      deletes webex_teams
    GET /projects/:id/services/webex-teams
      returns authentication error when unauthenticated
      returns all properties of active integration webex_teams, except password fields
      returns all properties of inactive integration webex_teams, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "youtrack"
    PUT /projects/:id/services/youtrack
      updates youtrack settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/youtrack
      deletes youtrack
    GET /projects/:id/services/youtrack
      returns authentication error when unauthenticated
      returns all properties of active integration youtrack, except password fields
      returns all properties of inactive integration youtrack, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  integration: "zentao"
    PUT /projects/:id/services/zentao
      updates zentao settings and returns the correct fields
      returns if required fields missing
    DELETE /projects/:id/services/zentao
      deletes zentao
    GET /projects/:id/services/zentao
      returns authentication error when unauthenticated
      returns all properties of active integration zentao, except password fields
      returns all properties of inactive integration zentao, except password fields
      returns not found if integration does not exist
      returns not found if integration exists but is in `Project#disabled_integrations`
      returns error when authenticated but not a project owner
  POST /projects/:id/services/:slug/trigger
    Mattermost integration
      when no integration is available
        returns a not found message
      when the integration exists
        when the integration is not active
          when the integration is inactive
        when the integration is active
          returns status 200
        when the project can not be found
          returns a generic 404
    Slack Integration
      returns status 200
  Mattermost integration
    accepts a username for update
  Microsoft Teams integration
    accepts branches_to_be_notified for update
    accepts notify_only_broken_pipelines for update
  Hangouts Chat integration
    accepts branches_to_be_notified for update
    only requires the webhook param
  Jira integration
    returns the jira_issue_transition_id for get request
    returns the jira_issue_transition_id for put request
  Pipelines Email Integration
    notify_only_broken_pipelines property was saved as a string
      returns boolean values for notify_only_broken_pipelines

Finished in 3 minutes 56.8 seconds (files took 11.12 seconds to load)
806 examples, 0 failures

[TEST PROF INFO] Time spent in factories: 00:23.884 (9.96% of total time)

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Peter Leitzen

Merge request reports