2020-04-22 19:07:51 +05:30
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
require 'spec_helper'
|
|
|
|
|
2023-05-27 22:25:52 +05:30
|
|
|
RSpec.describe Metrics::Dashboard::Annotations::CreateService, feature_category: :metrics do
|
2020-04-22 19:07:51 +05:30
|
|
|
let_it_be(:user) { create(:user) }
|
2021-09-30 23:02:18 +05:30
|
|
|
|
2020-04-22 19:07:51 +05:30
|
|
|
let(:description) { 'test annotation' }
|
|
|
|
let(:dashboard_path) { 'config/prometheus/common_metrics.yml' }
|
|
|
|
let(:starting_at) { 15.minutes.ago }
|
|
|
|
let(:ending_at) { nil }
|
|
|
|
let(:service_instance) { described_class.new(user, annotation_params) }
|
|
|
|
let(:annotation_params) do
|
|
|
|
{
|
|
|
|
environment: environment,
|
|
|
|
cluster: cluster,
|
|
|
|
description: description,
|
|
|
|
dashboard_path: dashboard_path,
|
|
|
|
starting_at: starting_at,
|
|
|
|
ending_at: ending_at
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
shared_examples 'executed annotation creation' do
|
|
|
|
it 'returns success response', :aggregate_failures do
|
|
|
|
annotation = instance_double(::Metrics::Dashboard::Annotation)
|
|
|
|
allow(::Metrics::Dashboard::Annotation).to receive(:new).and_return(annotation)
|
|
|
|
allow(annotation).to receive(:save).and_return(true)
|
|
|
|
|
|
|
|
response = service_instance.execute
|
|
|
|
|
|
|
|
expect(response[:status]).to be :success
|
|
|
|
expect(response[:annotation]).to be annotation
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'creates annotation', :aggregate_failures do
|
|
|
|
annotation = instance_double(::Metrics::Dashboard::Annotation)
|
|
|
|
|
|
|
|
expect(::Metrics::Dashboard::Annotation)
|
|
|
|
.to receive(:new).with(annotation_params).and_return(annotation)
|
|
|
|
expect(annotation).to receive(:save).and_return(true)
|
|
|
|
|
|
|
|
service_instance.execute
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
shared_examples 'prevented annotation creation' do |message|
|
|
|
|
it 'returns error response', :aggregate_failures do
|
|
|
|
response = service_instance.execute
|
|
|
|
|
|
|
|
expect(response[:status]).to be :error
|
|
|
|
expect(response[:message]).to eql message
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'does not change db state' do
|
|
|
|
expect(::Metrics::Dashboard::Annotation).not_to receive(:new)
|
|
|
|
|
|
|
|
service_instance.execute
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
shared_examples 'annotation creation failure' do
|
|
|
|
it 'returns error response', :aggregate_failures do
|
|
|
|
annotation = instance_double(::Metrics::Dashboard::Annotation)
|
|
|
|
|
|
|
|
expect(annotation).to receive(:errors).and_return('Model validation error')
|
|
|
|
expect(::Metrics::Dashboard::Annotation)
|
|
|
|
.to receive(:new).with(annotation_params).and_return(annotation)
|
|
|
|
expect(annotation).to receive(:save).and_return(false)
|
|
|
|
|
|
|
|
response = service_instance.execute
|
|
|
|
|
|
|
|
expect(response[:status]).to be :error
|
|
|
|
expect(response[:message]).to eql 'Model validation error'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe '.execute' do
|
|
|
|
context 'with environment' do
|
|
|
|
let(:environment) { create(:environment) }
|
|
|
|
let(:cluster) { nil }
|
|
|
|
|
|
|
|
context 'with anonymous user' do
|
|
|
|
it_behaves_like 'prevented annotation creation', 'You are not authorized to create annotation for selected environment'
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with maintainer user' do
|
|
|
|
before do
|
|
|
|
environment.project.add_maintainer(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'executed annotation creation'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with cluster' do
|
|
|
|
let(:environment) { nil }
|
|
|
|
|
|
|
|
context 'with anonymous user' do
|
|
|
|
let(:cluster) { create(:cluster, :project) }
|
|
|
|
|
|
|
|
it_behaves_like 'prevented annotation creation', 'You are not authorized to create annotation for selected cluster'
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with maintainer user' do
|
|
|
|
let(:cluster) { create(:cluster, :project) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
cluster.project.add_maintainer(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'executed annotation creation'
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with owner user' do
|
|
|
|
let(:cluster) { create(:cluster, :group) }
|
|
|
|
|
|
|
|
before do
|
|
|
|
cluster.group.add_owner(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'executed annotation creation'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'non cluster nor environment is supplied' do
|
|
|
|
let(:environment) { nil }
|
|
|
|
let(:cluster) { nil }
|
|
|
|
|
|
|
|
it_behaves_like 'annotation creation failure'
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'missing dashboard_path' do
|
|
|
|
let(:cluster) { create(:cluster, :project) }
|
|
|
|
let(:environment) { nil }
|
|
|
|
let(:dashboard_path) { nil }
|
|
|
|
|
|
|
|
context 'with maintainer user' do
|
|
|
|
before do
|
|
|
|
cluster.project.add_maintainer(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'annotation creation failure'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'incorrect dashboard_path' do
|
|
|
|
let(:cluster) { create(:cluster, :project) }
|
|
|
|
let(:environment) { nil }
|
|
|
|
let(:dashboard_path) { 'something_incorrect.yml' }
|
|
|
|
|
|
|
|
context 'with maintainer user' do
|
|
|
|
before do
|
|
|
|
cluster.project.add_maintainer(user)
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'prevented annotation creation', 'Dashboard with requested path can not be found'
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|