2019-10-28 20:06:10 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2016-08-25 19:34:01 -04:00
|
|
|
require 'spec_helper'
|
|
|
|
|
2020-06-24 02:09:01 -04:00
|
|
|
RSpec.describe API::BroadcastMessages do
|
2020-02-17 10:09:01 -05:00
|
|
|
let_it_be(:user) { create(:user) }
|
|
|
|
let_it_be(:admin) { create(:admin) }
|
|
|
|
let_it_be(:message) { create(:broadcast_message) }
|
2016-08-25 19:34:01 -04:00
|
|
|
|
|
|
|
describe 'GET /broadcast_messages' do
|
2020-01-24 13:09:00 -05:00
|
|
|
it 'returns an Array of BroadcastMessages' do
|
2016-08-25 19:34:01 -04:00
|
|
|
create(:broadcast_message)
|
|
|
|
|
2020-01-24 13:09:00 -05:00
|
|
|
get api('/broadcast_messages')
|
2016-08-25 19:34:01 -04:00
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2017-01-24 15:49:10 -05:00
|
|
|
expect(response).to include_pagination_headers
|
2016-08-25 19:34:01 -04:00
|
|
|
expect(json_response).to be_kind_of(Array)
|
|
|
|
expect(json_response.first.keys)
|
2022-03-10 07:07:07 -05:00
|
|
|
.to match_array(%w(id message starts_at ends_at color font active target_access_levels target_path broadcast_type dismissable))
|
2016-08-25 19:34:01 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'GET /broadcast_messages/:id' do
|
2020-01-24 13:09:00 -05:00
|
|
|
it 'returns the specified message' do
|
2016-08-25 19:34:01 -04:00
|
|
|
get api("/broadcast_messages/#{message.id}")
|
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2016-08-25 19:34:01 -04:00
|
|
|
expect(json_response['id']).to eq message.id
|
|
|
|
expect(json_response.keys)
|
2022-03-10 07:07:07 -05:00
|
|
|
.to match_array(%w(id message starts_at ends_at color font active target_access_levels target_path broadcast_type dismissable))
|
2016-08-25 19:34:01 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'POST /broadcast_messages' do
|
|
|
|
it 'returns a 401 for anonymous users' do
|
2018-12-17 17:52:17 -05:00
|
|
|
post api('/broadcast_messages'), params: attributes_for(:broadcast_message)
|
2016-08-25 19:34:01 -04:00
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:unauthorized)
|
2016-08-25 19:34:01 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns a 403 for users' do
|
2018-12-17 17:52:17 -05:00
|
|
|
post api('/broadcast_messages', user), params: attributes_for(:broadcast_message)
|
2016-08-25 19:34:01 -04:00
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:forbidden)
|
2016-08-25 19:34:01 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'as an admin' do
|
|
|
|
it 'requires the `message` parameter' do
|
|
|
|
attrs = attributes_for(:broadcast_message)
|
|
|
|
attrs.delete(:message)
|
|
|
|
|
2018-12-17 17:52:17 -05:00
|
|
|
post api('/broadcast_messages', admin), params: attrs
|
2016-08-25 19:34:01 -04:00
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:bad_request)
|
2016-08-25 19:34:01 -04:00
|
|
|
expect(json_response['error']).to eq 'message is missing'
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'defines sane default start and end times' do
|
|
|
|
time = Time.zone.parse('2016-07-02 10:11:12')
|
|
|
|
travel_to(time) do
|
2018-12-17 17:52:17 -05:00
|
|
|
post api('/broadcast_messages', admin), params: { message: 'Test message' }
|
2016-08-25 19:34:01 -04:00
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:created)
|
2016-08-25 19:34:01 -04:00
|
|
|
expect(json_response['starts_at']).to eq '2016-07-02T10:11:12.000Z'
|
|
|
|
expect(json_response['ends_at']).to eq '2016-07-02T11:11:12.000Z'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'accepts a custom background and foreground color' do
|
|
|
|
attrs = attributes_for(:broadcast_message, color: '#000000', font: '#cecece')
|
|
|
|
|
2018-12-17 17:52:17 -05:00
|
|
|
post api('/broadcast_messages', admin), params: attrs
|
2016-08-25 19:34:01 -04:00
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:created)
|
2016-08-25 19:34:01 -04:00
|
|
|
expect(json_response['color']).to eq attrs[:color]
|
|
|
|
expect(json_response['font']).to eq attrs[:font]
|
|
|
|
end
|
2019-12-11 22:07:34 -05:00
|
|
|
|
2022-03-10 07:07:07 -05:00
|
|
|
it 'accepts target access levels' do
|
|
|
|
target_access_levels = [Gitlab::Access::GUEST, Gitlab::Access::DEVELOPER]
|
|
|
|
attrs = attributes_for(:broadcast_message, target_access_levels: target_access_levels)
|
|
|
|
|
|
|
|
post api('/broadcast_messages', admin), params: attrs
|
|
|
|
|
|
|
|
expect(response).to have_gitlab_http_status(:created)
|
|
|
|
expect(json_response['target_access_levels']).to eq attrs[:target_access_levels]
|
|
|
|
end
|
|
|
|
|
2019-12-11 22:07:34 -05:00
|
|
|
it 'accepts a target path' do
|
|
|
|
attrs = attributes_for(:broadcast_message, target_path: "*/welcome")
|
|
|
|
|
|
|
|
post api('/broadcast_messages', admin), params: attrs
|
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:created)
|
2019-12-11 22:07:34 -05:00
|
|
|
expect(json_response['target_path']).to eq attrs[:target_path]
|
|
|
|
end
|
2020-01-30 16:08:47 -05:00
|
|
|
|
|
|
|
it 'accepts a broadcast type' do
|
|
|
|
attrs = attributes_for(:broadcast_message, broadcast_type: 'notification')
|
|
|
|
|
|
|
|
post api('/broadcast_messages', admin), params: attrs
|
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:created)
|
2020-01-30 16:08:47 -05:00
|
|
|
expect(json_response['broadcast_type']).to eq attrs[:broadcast_type]
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'uses default broadcast type' do
|
|
|
|
attrs = attributes_for(:broadcast_message)
|
|
|
|
|
|
|
|
post api('/broadcast_messages', admin), params: attrs
|
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:created)
|
2020-01-30 16:08:47 -05:00
|
|
|
expect(json_response['broadcast_type']).to eq 'banner'
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'errors for invalid broadcast type' do
|
|
|
|
attrs = attributes_for(:broadcast_message, broadcast_type: 'invalid-type')
|
|
|
|
|
|
|
|
post api('/broadcast_messages', admin), params: attrs
|
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:bad_request)
|
2020-01-30 16:08:47 -05:00
|
|
|
end
|
2020-03-04 19:07:49 -05:00
|
|
|
|
2020-12-09 13:09:48 -05:00
|
|
|
it 'accepts an active dismissable value' do
|
2020-03-04 19:07:49 -05:00
|
|
|
attrs = { message: 'new message', dismissable: true }
|
|
|
|
|
|
|
|
post api('/broadcast_messages', admin), params: attrs
|
|
|
|
|
|
|
|
expect(response).to have_gitlab_http_status(:created)
|
|
|
|
expect(json_response['dismissable']).to eq true
|
|
|
|
end
|
2016-08-25 19:34:01 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'PUT /broadcast_messages/:id' do
|
|
|
|
it 'returns a 401 for anonymous users' do
|
|
|
|
put api("/broadcast_messages/#{message.id}"),
|
2018-12-17 17:52:17 -05:00
|
|
|
params: attributes_for(:broadcast_message)
|
2016-08-25 19:34:01 -04:00
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:unauthorized)
|
2016-08-25 19:34:01 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns a 403 for users' do
|
|
|
|
put api("/broadcast_messages/#{message.id}", user),
|
2018-12-17 17:52:17 -05:00
|
|
|
params: attributes_for(:broadcast_message)
|
2016-08-25 19:34:01 -04:00
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:forbidden)
|
2016-08-25 19:34:01 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'as an admin' do
|
|
|
|
it 'accepts new background and foreground colors' do
|
|
|
|
attrs = { color: '#000000', font: '#cecece' }
|
|
|
|
|
2018-12-17 17:52:17 -05:00
|
|
|
put api("/broadcast_messages/#{message.id}", admin), params: attrs
|
2016-08-25 19:34:01 -04:00
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2016-08-25 19:34:01 -04:00
|
|
|
expect(json_response['color']).to eq attrs[:color]
|
|
|
|
expect(json_response['font']).to eq attrs[:font]
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'accepts new start and end times' do
|
|
|
|
time = Time.zone.parse('2016-07-02 10:11:12')
|
|
|
|
travel_to(time) do
|
|
|
|
attrs = { starts_at: Time.zone.now, ends_at: 3.hours.from_now }
|
|
|
|
|
2018-12-17 17:52:17 -05:00
|
|
|
put api("/broadcast_messages/#{message.id}", admin), params: attrs
|
2016-08-25 19:34:01 -04:00
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2016-08-25 19:34:01 -04:00
|
|
|
expect(json_response['starts_at']).to eq '2016-07-02T10:11:12.000Z'
|
|
|
|
expect(json_response['ends_at']).to eq '2016-07-02T13:11:12.000Z'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'accepts a new message' do
|
|
|
|
attrs = { message: 'new message' }
|
|
|
|
|
2018-12-17 17:52:17 -05:00
|
|
|
put api("/broadcast_messages/#{message.id}", admin), params: attrs
|
2016-08-25 19:34:01 -04:00
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2016-08-25 19:34:01 -04:00
|
|
|
expect { message.reload }.to change { message.message }.to('new message')
|
|
|
|
end
|
2019-12-11 22:07:34 -05:00
|
|
|
|
2022-03-10 07:07:07 -05:00
|
|
|
it 'accepts a new target_access_levels' do
|
|
|
|
attrs = { target_access_levels: [Gitlab::Access::MAINTAINER] }
|
|
|
|
|
|
|
|
put api("/broadcast_messages/#{message.id}", admin), params: attrs
|
|
|
|
|
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
|
|
|
expect(json_response['target_access_levels']).to eq attrs[:target_access_levels]
|
|
|
|
end
|
|
|
|
|
2019-12-11 22:07:34 -05:00
|
|
|
it 'accepts a new target_path' do
|
|
|
|
attrs = { target_path: '*/welcome' }
|
|
|
|
|
|
|
|
put api("/broadcast_messages/#{message.id}", admin), params: attrs
|
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2019-12-11 22:07:34 -05:00
|
|
|
expect(json_response['target_path']).to eq attrs[:target_path]
|
|
|
|
end
|
2020-01-30 16:08:47 -05:00
|
|
|
|
|
|
|
it 'accepts a new broadcast_type' do
|
|
|
|
attrs = { broadcast_type: 'notification' }
|
|
|
|
|
|
|
|
put api("/broadcast_messages/#{message.id}", admin), params: attrs
|
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2020-01-30 16:08:47 -05:00
|
|
|
expect(json_response['broadcast_type']).to eq attrs[:broadcast_type]
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'errors for invalid broadcast type' do
|
|
|
|
attrs = { broadcast_type: 'invalid-type' }
|
|
|
|
|
|
|
|
put api("/broadcast_messages/#{message.id}", admin), params: attrs
|
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:bad_request)
|
2020-01-30 16:08:47 -05:00
|
|
|
end
|
2020-03-04 19:07:49 -05:00
|
|
|
|
2020-12-09 13:09:48 -05:00
|
|
|
it 'accepts a new dismissable value' do
|
2020-03-04 19:07:49 -05:00
|
|
|
attrs = { message: 'new message', dismissable: true }
|
|
|
|
|
|
|
|
put api("/broadcast_messages/#{message.id}", admin), params: attrs
|
|
|
|
|
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
|
|
|
expect(json_response['dismissable']).to eq true
|
|
|
|
end
|
2016-08-25 19:34:01 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe 'DELETE /broadcast_messages/:id' do
|
|
|
|
it 'returns a 401 for anonymous users' do
|
|
|
|
delete api("/broadcast_messages/#{message.id}"),
|
2018-12-17 17:52:17 -05:00
|
|
|
params: attributes_for(:broadcast_message)
|
2016-08-25 19:34:01 -04:00
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:unauthorized)
|
2016-08-25 19:34:01 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns a 403 for users' do
|
|
|
|
delete api("/broadcast_messages/#{message.id}", user),
|
2018-12-17 17:52:17 -05:00
|
|
|
params: attributes_for(:broadcast_message)
|
2016-08-25 19:34:01 -04:00
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:forbidden)
|
2016-08-25 19:34:01 -04:00
|
|
|
end
|
|
|
|
|
2017-08-24 12:03:39 -04:00
|
|
|
it_behaves_like '412 response' do
|
|
|
|
let(:request) { api("/broadcast_messages/#{message.id}", admin) }
|
|
|
|
end
|
|
|
|
|
2016-08-25 19:34:01 -04:00
|
|
|
it 'deletes the broadcast message for admins' do
|
2017-02-20 13:18:12 -05:00
|
|
|
expect do
|
|
|
|
delete api("/broadcast_messages/#{message.id}", admin)
|
|
|
|
|
2020-02-21 07:09:07 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:no_content)
|
2017-02-20 13:18:12 -05:00
|
|
|
end.to change { BroadcastMessage.count }.by(-1)
|
2016-08-25 19:34:01 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|