diff options
Diffstat (limited to 'spec/services/work_items/create_service_spec.rb')
-rw-r--r-- | spec/services/work_items/create_service_spec.rb | 123 |
1 files changed, 122 insertions, 1 deletions
diff --git a/spec/services/work_items/create_service_spec.rb b/spec/services/work_items/create_service_spec.rb index f495e967b26..4009c85bacd 100644 --- a/spec/services/work_items/create_service_spec.rb +++ b/spec/services/work_items/create_service_spec.rb @@ -6,9 +6,12 @@ RSpec.describe WorkItems::CreateService do include AfterNextHelpers let_it_be_with_reload(:project) { create(:project) } + let_it_be(:parent) { create(:work_item, project: project) } let_it_be(:guest) { create(:user) } + let_it_be(:reporter) { create(:user) } let_it_be(:user_with_no_access) { create(:user) } + let(:widget_params) { {} } let(:spam_params) { double } let(:current_user) { guest } let(:opts) do @@ -20,10 +23,21 @@ RSpec.describe WorkItems::CreateService do before_all do project.add_guest(guest) + project.add_reporter(reporter) end describe '#execute' do - subject(:service_result) { described_class.new(project: project, current_user: current_user, params: opts, spam_params: spam_params).execute } + let(:service) do + described_class.new( + project: project, + current_user: current_user, + params: opts, + spam_params: spam_params, + widget_params: widget_params + ) + end + + subject(:service_result) { service.execute } before do stub_spam_services @@ -61,6 +75,14 @@ RSpec.describe WorkItems::CreateService do it 'returns validation errors' do expect(service_result.errors).to contain_exactly("Title can't be blank") end + + it 'does not execute after-create transaction widgets' do + expect(service).to receive(:create).and_call_original + expect(service).not_to receive(:execute_widgets) + .with(callback: :after_create_in_transaction, widget_params: widget_params) + + service_result + end end context 'checking spam' do @@ -80,5 +102,104 @@ RSpec.describe WorkItems::CreateService do service_result end end + + it_behaves_like 'work item widgetable service' do + let(:widget_params) do + { + hierarchy_widget: { parent: parent } + } + end + + let(:service) do + described_class.new( + project: project, + current_user: current_user, + params: opts, + spam_params: spam_params, + widget_params: widget_params + ) + end + + let(:service_execute) { service.execute } + + let(:supported_widgets) do + [ + { + klass: WorkItems::Widgets::HierarchyService::CreateService, + callback: :after_create_in_transaction, + params: { parent: parent } + } + ] + end + end + + describe 'hierarchy widget' do + let(:widget_params) { { hierarchy_widget: { parent: parent } } } + + shared_examples 'fails creating work item and returns errors' do + it 'does not create new work item if parent can not be set' do + expect { service_result }.not_to change(WorkItem, :count) + + expect(service_result[:status]).to be(:error) + expect(service_result[:message]).to match(error_message) + end + end + + context 'when user can admin parent link' do + let(:current_user) { reporter } + + context 'when parent is valid work item' do + let(:opts) do + { + title: 'Awesome work_item', + description: 'please fix', + work_item_type: create(:work_item_type, :task) + } + end + + it 'creates new work item and sets parent reference' do + expect { service_result }.to change( + WorkItem, :count).by(1).and(change( + WorkItems::ParentLink, :count).by(1)) + + expect(service_result[:status]).to be(:success) + end + end + + context 'when parent type is invalid' do + let_it_be(:parent) { create(:work_item, :task, project: project) } + + it_behaves_like 'fails creating work item and returns errors' do + let(:error_message) { 'only Issue and Incident can be parent of Task.'} + end + end + + context 'when hierarchy feature flag is disabled' do + before do + stub_feature_flags(work_items_hierarchy: false) + end + + it_behaves_like 'fails creating work item and returns errors' do + let(:error_message) { '`work_items_hierarchy` feature flag disabled for this project' } + end + end + end + + context 'when user cannot admin parent link' do + let(:current_user) { guest } + + let(:opts) do + { + title: 'Awesome work_item', + description: 'please fix', + work_item_type: create(:work_item_type, :task) + } + end + + it_behaves_like 'fails creating work item and returns errors' do + let(:error_message) { 'No matching task found. Make sure that you are adding a valid task ID.'} + end + end + end end end |