123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- require 'rails_helper'
- RSpec.describe Gql::Mutations::System::Import::Configuration, type: :graphql do
- context 'when validation system import configuration' do
- let(:mutation) do
- <<~MUTATION
- mutation systemImportConfiguration($configuration: SystemImportConfigurationInput!) {
- systemImportConfiguration(configuration: $configuration) {
- success
- errors {
- message
- field
- }
- }
- }
- MUTATION
- end
- context 'with valid configuration' do
- let(:variables) do
- {
- configuration: {
- url: 'https://ticket.freshdesk.com',
- secret: 'freshdesk_api_token',
- source: 'freshdesk',
- }
- }
- end
- it 'succeeds' do
- mock = Service::System::Import::ApplyFreshdeskConfiguration
- allow_any_instance_of(mock).to receive(:execute).and_return(true)
- gql.execute(mutation, variables: variables)
- expect(gql.result.data).to include({ 'success' => true })
- end
- end
- shared_examples 'missing required configuration parameter' do
- it 'raises an error' do
- gql.execute(mutation, variables: variables)
- expect { gql.result.data }.to raise_error(RuntimeError, %r{#{parameter}})
- end
- end
- %w[url source].each do |p|
- context "when no #{p} is provided" do
- let(:variables) do
- config = {
- configuration: {
- url: 'https://ticket.otrs.com',
- source: 'otrs'
- }
- }
- config[:configuration].delete(p.to_sym)
- config
- end
- let(:parameter) { p }
- it_behaves_like 'missing required configuration parameter'
- end
- end
- context 'when invalid url is provided' do
- let(:variables) do
- {
- configuration: {
- url: 'gopher://ticket.otrs.com',
- source: 'otrs'
- }
- }
- end
- it 'raises an error' do
- gql.execute(mutation, variables: variables)
- expect { gql.result.data }.to raise_error(RuntimeError, %r{URI scheme must be HTTP or HTTPS})
- end
- end
- context 'when url is not reachable' do
- let(:variables) do
- {
- configuration: {
- url: 'https://ticket.freshdesk.com',
- secret: 'freshdesk_api_token',
- source: 'freshdesk'
- }
- }
- end
- it 'returns an error' do
- mock = Service::System::Import::ApplyFreshdeskConfiguration
- error = Service::System::Import::ApplyFreshdeskConfiguration::UnreachableError
- allow_any_instance_of(mock).to receive(:reachable!).and_raise(error, 'The hostname could not be found.')
- gql.execute(mutation, variables: variables)
- expect(gql.result.data).to include({ 'errors' => [{ 'message' => 'The hostname could not be found.', 'field' => 'url' }] })
- end
- end
- context 'when url is inaccessible' do
- let(:variables) do
- {
- configuration: {
- url: 'https://ticket.zendesk.com',
- username: 'zendesk',
- secret: 'zendesk_api_token',
- source: 'zendesk'
- }
- }
- end
- it 'returns an error' do
- mock = Service::System::Import::ApplyZendeskConfiguration
- error = Service::System::Import::ApplyZendeskConfiguration::InaccessibleError
- allow_any_instance_of(mock).to receive(:reachable!).and_return(nil)
- allow_any_instance_of(mock).to receive(:accessible!).and_raise(error, 'The provided credentials are invalid.')
- gql.execute(mutation, variables: variables)
- expect(gql.result.data).to include({
- 'errors' => [
- { 'message' => 'The provided credentials are invalid.', 'field' => 'secret' },
- { 'message' => 'The provided credentials are invalid.', 'field' => 'username' }
- ]
- })
- end
- end
- end
- end
|