2020-04-22 19:07:51 +05:30
# frozen_string_literal: true
require 'spec_helper'
2020-07-28 23:09:34 +05:30
RSpec . describe Clusters :: Management :: CreateProjectService do
2020-04-22 19:07:51 +05:30
let ( :cluster ) { create ( :cluster , :project ) }
let ( :current_user ) { create ( :user ) }
subject { described_class . new ( cluster , current_user : current_user ) . execute }
shared_examples 'management project is not required' do
it 'does not create a project' do
expect { subject } . not_to change ( cluster , :management_project )
end
end
context ':auto_create_cluster_management_project feature flag is disabled' do
before do
stub_feature_flags ( auto_create_cluster_management_project : false )
end
include_examples 'management project is not required'
end
context 'cluster already has a management project' do
let ( :cluster ) { create ( :cluster , :management_project ) }
include_examples 'management project is not required'
end
shared_examples 'creates a management project' do
let ( :project_params ) do
{
name : " #{ cluster . name } Cluster Management " ,
description : 'This project is automatically generated and will be used to manage your Kubernetes cluster. [More information](/help/user/clusters/management_project)' ,
namespace_id : namespace & . id ,
visibility_level : Gitlab :: VisibilityLevel :: PRIVATE
}
end
it 'creates a management project' do
expect ( Projects :: CreateService ) . to receive ( :new )
. with ( current_user , project_params )
. and_call_original
subject
management_project = cluster . management_project
expect ( management_project ) . to be_present
expect ( management_project ) . to be_private
expect ( management_project . name ) . to eq " #{ cluster . name } Cluster Management "
expect ( management_project . namespace ) . to eq namespace
end
end
context 'project cluster' do
let ( :cluster ) { create ( :cluster , projects : [ project ] ) }
let ( :project ) { create ( :project , namespace : current_user . namespace ) }
let ( :namespace ) { project . namespace }
include_examples 'creates a management project'
end
context 'group cluster' do
let ( :cluster ) { create ( :cluster , :group , user : current_user ) }
let ( :namespace ) { cluster . group }
before do
namespace . add_user ( current_user , Gitlab :: Access :: MAINTAINER )
end
include_examples 'creates a management project'
end
context 'instance cluster' do
let ( :cluster ) { create ( :cluster , :instance , user : current_user ) }
let ( :namespace ) { create ( :group ) }
before do
stub_application_setting ( instance_administrators_group : namespace )
namespace . add_user ( current_user , Gitlab :: Access :: MAINTAINER )
end
include_examples 'creates a management project'
end
describe 'error handling' do
let ( :project ) { cluster . project }
before do
allow ( Projects :: CreateService ) . to receive ( :new )
. and_return ( double ( execute : project ) )
end
context 'project is invalid' do
let ( :errors ) { double ( full_messages : [ " Error message " ] ) }
let ( :project ) { instance_double ( Project , errors : errors ) }
it { expect { subject } . to raise_error ( described_class :: CreateError , / Failed to create project / ) }
end
context 'instance administrators group is missing' do
let ( :cluster ) { create ( :cluster , :instance ) }
it { expect { subject } . to raise_error ( described_class :: CreateError , / Instance administrators group not found / ) }
end
context 'cluster is invalid' do
before do
allow ( cluster ) . to receive ( :update ) . and_return ( false )
end
it { expect { subject } . to raise_error ( described_class :: CreateError , / Failed to update cluster / ) }
end
context 'unknown cluster type' do
before do
allow ( cluster ) . to receive ( :cluster_type ) . and_return ( " unknown_type " )
end
it { expect { subject } . to raise_error ( NotImplementedError ) }
end
end
end