228 lines
7.0 KiB
Ruby
228 lines
7.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe Gitlab::JiraImport::IssueSerializer do
|
|
describe '#execute' do
|
|
let_it_be(:group) { create(:group) }
|
|
let_it_be(:project) { create(:project, group: group) }
|
|
let_it_be(:project_label) { create(:label, project: project, title: 'bug') }
|
|
let_it_be(:other_project_label) { create(:label, project: project, title: 'feature') }
|
|
let_it_be(:group_label) { create(:group_label, group: group, title: 'dev') }
|
|
let_it_be(:current_user) { create(:user) }
|
|
let_it_be(:user) { create(:user) }
|
|
|
|
let(:iid) { 5 }
|
|
let(:key) { 'PROJECT-5' }
|
|
let(:summary) { 'some title' }
|
|
let(:description) { 'basic description' }
|
|
let(:created_at) { '2020-01-01 20:00:00' }
|
|
let(:updated_at) { '2020-01-10 20:00:00' }
|
|
let(:assignee) { nil }
|
|
let(:reporter) { nil }
|
|
let(:jira_status) { 'new' }
|
|
|
|
let(:parent_field) do
|
|
{ 'key' => 'FOO-2', 'id' => '1050', 'fields' => { 'summary' => 'parent issue FOO' } }
|
|
end
|
|
|
|
let(:priority_field) { { 'name' => 'Medium' } }
|
|
let(:labels_field) { %w(bug dev backend frontend) }
|
|
|
|
let(:fields) do
|
|
{
|
|
'parent' => parent_field,
|
|
'priority' => priority_field,
|
|
'labels' => labels_field
|
|
}
|
|
end
|
|
|
|
let(:jira_issue) do
|
|
double(
|
|
id: '1234',
|
|
key: key,
|
|
summary: summary,
|
|
description: description,
|
|
created: created_at,
|
|
updated: updated_at,
|
|
assignee: assignee,
|
|
reporter: reporter,
|
|
status: double(statusCategory: { 'key' => jira_status }),
|
|
fields: fields
|
|
)
|
|
end
|
|
|
|
let(:params) { { iid: iid } }
|
|
|
|
subject { described_class.new(project, jira_issue, current_user.id, params).execute }
|
|
|
|
let(:expected_description) do
|
|
<<~MD
|
|
basic description
|
|
|
|
---
|
|
|
|
**Issue metadata**
|
|
|
|
- Priority: Medium
|
|
- Parent issue: [FOO-2] parent issue FOO
|
|
MD
|
|
end
|
|
|
|
context 'attributes setting' do
|
|
it 'sets the basic attributes' do
|
|
expect(subject).to eq(
|
|
iid: iid,
|
|
project_id: project.id,
|
|
description: expected_description.strip,
|
|
title: "[#{key}] #{summary}",
|
|
state_id: 1,
|
|
updated_at: updated_at,
|
|
created_at: created_at,
|
|
author_id: current_user.id,
|
|
assignee_ids: nil,
|
|
label_ids: [project_label.id, group_label.id] + Label.reorder(id: :asc).last(2).pluck(:id)
|
|
)
|
|
end
|
|
|
|
it 'creates a hash for valid issue' do
|
|
expect(Issue.new(subject)).to be_valid
|
|
end
|
|
|
|
context 'labels' do
|
|
it 'creates all missing labels (on project level)' do
|
|
expect { subject }.to change { Label.count }.from(3).to(5)
|
|
|
|
expect(Label.find_by(title: 'frontend').project).to eq(project)
|
|
expect(Label.find_by(title: 'backend').project).to eq(project)
|
|
end
|
|
|
|
context 'when there are no new labels' do
|
|
let(:labels_field) { %w(bug dev) }
|
|
|
|
it 'assigns the labels to the Issue hash' do
|
|
expect(subject[:label_ids]).to match_array([project_label.id, group_label.id])
|
|
end
|
|
|
|
it 'does not create new labels' do
|
|
expect { subject }.not_to change { Label.count }.from(3)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'author' do
|
|
let(:reporter) { double(attrs: { 'displayName' => 'Solver', 'accountId' => 'abcd' }) }
|
|
|
|
context 'when reporter maps to a valid GitLab user' do
|
|
it 'sets the issue author to the mapped user' do
|
|
expect(Gitlab::JiraImport).to receive(:get_user_mapping).with(project.id, 'abcd')
|
|
.and_return(user.id)
|
|
|
|
expect(subject[:author_id]).to eq(user.id)
|
|
end
|
|
end
|
|
|
|
context 'when reporter does not map to a valid Gitlab user' do
|
|
it 'defaults the issue author to project creator' do
|
|
expect(Gitlab::JiraImport).to receive(:get_user_mapping).with(project.id, 'abcd')
|
|
.and_return(nil)
|
|
|
|
expect(subject[:author_id]).to eq(current_user.id)
|
|
end
|
|
end
|
|
|
|
context 'when reporter field is empty' do
|
|
let(:reporter) { nil }
|
|
|
|
it 'defaults the issue author to project creator' do
|
|
expect(Gitlab::JiraImport).not_to receive(:get_user_mapping)
|
|
|
|
expect(subject[:author_id]).to eq(current_user.id)
|
|
end
|
|
end
|
|
|
|
context 'when reporter field is missing accountId' do
|
|
let(:reporter) { double(attrs: { 'displayName' => 'Reporter' }) }
|
|
|
|
it 'defaults the issue author to project creator' do
|
|
expect(Gitlab::JiraImport).not_to receive(:get_user_mapping)
|
|
|
|
expect(subject[:author_id]).to eq(current_user.id)
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'assignee' do
|
|
let(:assignee) { double(attrs: { 'displayName' => 'Solver', 'accountId' => '1234' }) }
|
|
|
|
context 'when assignee maps to a valid GitLab user' do
|
|
it 'sets the issue assignees to the mapped user' do
|
|
expect(Gitlab::JiraImport).to receive(:get_user_mapping).with(project.id, '1234')
|
|
.and_return(user.id)
|
|
|
|
expect(subject[:assignee_ids]).to eq([user.id])
|
|
end
|
|
end
|
|
|
|
context 'when assignee does not map to a valid GitLab user' do
|
|
it 'leaves the assignee empty' do
|
|
expect(Gitlab::JiraImport).to receive(:get_user_mapping).with(project.id, '1234')
|
|
.and_return(nil)
|
|
|
|
expect(subject[:assignee_ids]).to be_nil
|
|
end
|
|
end
|
|
|
|
context 'when assginee field is empty' do
|
|
let(:assignee) { nil }
|
|
|
|
it 'leaves the assignee empty' do
|
|
expect(Gitlab::JiraImport).not_to receive(:get_user_mapping)
|
|
|
|
expect(subject[:assignee_ids]).to be_nil
|
|
end
|
|
end
|
|
|
|
context 'when assginee field is missing accountId' do
|
|
let(:assignee) { double(attrs: { 'displayName' => 'Solver' }) }
|
|
|
|
it 'leaves the assignee empty' do
|
|
expect(Gitlab::JiraImport).not_to receive(:get_user_mapping)
|
|
|
|
expect(subject[:assignee_ids]).to be_nil
|
|
end
|
|
end
|
|
|
|
context 'with jira server response' do
|
|
let(:assignee) { double(attrs: { 'displayName' => 'Solver', 'key' => '1234' }) }
|
|
|
|
context 'when assignee maps to a valid GitLab user' do
|
|
it 'sets the issue assignees to the mapped user' do
|
|
expect(Gitlab::JiraImport).to receive(:get_user_mapping).with(project.id, '1234')
|
|
.and_return(user.id)
|
|
|
|
expect(subject[:assignee_ids]).to eq([user.id])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'with done status' do
|
|
let(:jira_status) { 'done' }
|
|
|
|
it 'maps the status to closed' do
|
|
expect(subject[:state_id]).to eq(2)
|
|
end
|
|
end
|
|
|
|
context 'without the iid' do
|
|
let(:params) { {} }
|
|
|
|
it 'does not set the iid' do
|
|
expect(subject[:iid]).to be_nil
|
|
end
|
|
end
|
|
end
|
|
end
|