From 2d31b6ced4126bd96400d1a248c64ccb07de44c6 Mon Sep 17 00:00:00 2001 From: Dominik Klein Date: Wed, 15 Sep 2021 16:51:23 +0200 Subject: [PATCH] Fixes #3741 - Removal of Microsoft365-Channel not possible via UI when having no email address relation. --- .../channels_microsoft365_controller.rb | 2 +- spec/requests/channels_microsoft365_spec.rb | 50 +++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 spec/requests/channels_microsoft365_spec.rb diff --git a/app/controllers/channels_microsoft365_controller.rb b/app/controllers/channels_microsoft365_controller.rb index de0e3544d..da15c9bb2 100644 --- a/app/controllers/channels_microsoft365_controller.rb +++ b/app/controllers/channels_microsoft365_controller.rb @@ -55,7 +55,7 @@ class ChannelsMicrosoft365Controller < ApplicationController def destroy channel = Channel.find_by(id: params[:id], area: 'Microsoft365::Account') email = EmailAddress.find_by(channel_id: channel.id) - email.destroy! + email&.destroy! channel.destroy! render json: {} end diff --git a/spec/requests/channels_microsoft365_spec.rb b/spec/requests/channels_microsoft365_spec.rb new file mode 100644 index 000000000..bd93b9ef9 --- /dev/null +++ b/spec/requests/channels_microsoft365_spec.rb @@ -0,0 +1,50 @@ +# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/ + +require 'rails_helper' + +RSpec.describe 'Microsoft365 channel API endpoints', type: :request do + let(:admin) { create(:admin) } + let!(:microsoft365_channel) { create(:microsoft365_channel) } + + describe 'DELETE /api/v1/channels_microsoft365', authenticated_as: :admin do + context 'without a email address relation' do + let(:params) do + { + id: microsoft365_channel.id + } + end + + it 'responds 200 OK' do + delete '/api/v1/channels_microsoft365', params: params, as: :json + + expect(response).to have_http_status(:ok) + end + + it 'microsoft365 channel deleted' do + expect { delete '/api/v1/channels_microsoft365', params: params, as: :json }.to change(Channel, :count).by(-1) + end + end + + context 'with a email address relation' do + let(:params) do + { + id: microsoft365_channel.id + } + end + + before do + create(:email_address, channel: microsoft365_channel) + end + + it 'responds 200 OK' do + delete '/api/v1/channels_microsoft365', params: params, as: :json + + expect(response).to have_http_status(:ok) + end + + it 'microsoft365 channel and related email address deleted' do + expect { delete '/api/v1/channels_microsoft365', params: params, as: :json }.to change(Channel, :count).by(-1).and change(EmailAddress, :count).by(-1) + end + end + end +end