Merge branch 'fix-labels-in-hooks' into 'master'
Fix label serialisation in issue and note hooks Closes #63473 See merge request gitlab-org/gitlab-ce!29850
This commit is contained in:
commit
88c8d177f8
7 changed files with 35 additions and 10 deletions
|
@ -254,6 +254,10 @@ class Issue < ApplicationRecord
|
||||||
merge_requests_closing_issues.count
|
merge_requests_closing_issues.count
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def labels_hook_attrs
|
||||||
|
labels.map(&:hook_attrs)
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def ensure_metrics
|
def ensure_metrics
|
||||||
|
|
5
changelogs/unreleased/fix-labels-in-hooks.yml
Normal file
5
changelogs/unreleased/fix-labels-in-hooks.yml
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
title: Fix label serialization in issue and note hooks
|
||||||
|
merge_request: 29850
|
||||||
|
author:
|
||||||
|
type: fixed
|
|
@ -44,7 +44,7 @@ module Gitlab
|
||||||
data[:commit] = build_data_for_commit(project, user, note)
|
data[:commit] = build_data_for_commit(project, user, note)
|
||||||
elsif note.for_issue?
|
elsif note.for_issue?
|
||||||
data[:issue] = note.noteable.hook_attrs
|
data[:issue] = note.noteable.hook_attrs
|
||||||
data[:issue][:labels] = note.noteable.labels(&:hook_attrs)
|
data[:issue][:labels] = note.noteable.labels_hook_attrs
|
||||||
elsif note.for_merge_request?
|
elsif note.for_merge_request?
|
||||||
data[:merge_request] = note.noteable.hook_attrs
|
data[:merge_request] = note.noteable.hook_attrs
|
||||||
elsif note.for_snippet?
|
elsif note.for_snippet?
|
||||||
|
|
|
@ -45,7 +45,7 @@ module Gitlab
|
||||||
human_time_estimate: issue.human_time_estimate,
|
human_time_estimate: issue.human_time_estimate,
|
||||||
assignee_ids: issue.assignee_ids,
|
assignee_ids: issue.assignee_ids,
|
||||||
assignee_id: issue.assignee_ids.first, # This key is deprecated
|
assignee_id: issue.assignee_ids.first, # This key is deprecated
|
||||||
labels: issue.labels
|
labels: issue.labels_hook_attrs
|
||||||
}
|
}
|
||||||
|
|
||||||
issue.attributes.with_indifferent_access.slice(*self.class.safe_hook_attributes)
|
issue.attributes.with_indifferent_access.slice(*self.class.safe_hook_attributes)
|
||||||
|
|
|
@ -38,9 +38,11 @@ describe Gitlab::DataBuilder::Note do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'When asking for a note on issue' do
|
describe 'When asking for a note on issue' do
|
||||||
|
let(:label) { create(:label, project: project) }
|
||||||
|
|
||||||
let(:issue) do
|
let(:issue) do
|
||||||
create(:issue, created_at: fixed_time, updated_at: fixed_time,
|
create(:labeled_issue, created_at: fixed_time, updated_at: fixed_time,
|
||||||
project: project)
|
project: project, labels: [label])
|
||||||
end
|
end
|
||||||
|
|
||||||
let(:note) do
|
let(:note) do
|
||||||
|
@ -48,13 +50,16 @@ describe Gitlab::DataBuilder::Note do
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'returns the note and issue-specific data' do
|
it 'returns the note and issue-specific data' do
|
||||||
|
without_timestamps = lambda { |label| label.except('created_at', 'updated_at') }
|
||||||
|
hook_attrs = issue.reload.hook_attrs
|
||||||
|
|
||||||
expect(data).to have_key(:issue)
|
expect(data).to have_key(:issue)
|
||||||
expect(data[:issue].except('updated_at'))
|
expect(data[:issue].except('updated_at', 'labels'))
|
||||||
.to eq(issue.reload.hook_attrs.except('updated_at'))
|
.to eq(hook_attrs.except('updated_at', 'labels'))
|
||||||
expect(data[:issue]['updated_at'])
|
expect(data[:issue]['updated_at'])
|
||||||
.to be >= issue.hook_attrs['updated_at']
|
.to be >= hook_attrs['updated_at']
|
||||||
expect(data[:issue]['labels'])
|
expect(data[:issue]['labels'].map(&without_timestamps))
|
||||||
.to eq(issue.hook_attrs['labels'])
|
.to eq(hook_attrs['labels'].map(&without_timestamps))
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'with confidential issue' do
|
context 'with confidential issue' do
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
require 'spec_helper'
|
require 'spec_helper'
|
||||||
|
|
||||||
describe Gitlab::HookData::IssueBuilder do
|
describe Gitlab::HookData::IssueBuilder do
|
||||||
set(:issue) { create(:issue) }
|
set(:label) { create(:label) }
|
||||||
|
set(:issue) { create(:labeled_issue, labels: [label], project: label.project) }
|
||||||
let(:builder) { described_class.new(issue) }
|
let(:builder) { described_class.new(issue) }
|
||||||
|
|
||||||
describe '#build' do
|
describe '#build' do
|
||||||
|
@ -39,6 +40,7 @@ describe Gitlab::HookData::IssueBuilder do
|
||||||
expect(data).to include(:human_time_estimate)
|
expect(data).to include(:human_time_estimate)
|
||||||
expect(data).to include(:human_total_time_spent)
|
expect(data).to include(:human_total_time_spent)
|
||||||
expect(data).to include(:assignee_ids)
|
expect(data).to include(:assignee_ids)
|
||||||
|
expect(data).to include('labels' => [label.hook_attrs])
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'when the issue has an image in the description' do
|
context 'when the issue has an image in the description' do
|
||||||
|
|
|
@ -862,4 +862,13 @@ describe Issue do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#labels_hook_attrs" do
|
||||||
|
let(:label) { create(:label) }
|
||||||
|
let(:issue) { create(:labeled_issue, labels: [label]) }
|
||||||
|
|
||||||
|
it "returns a list of label hook attributes" do
|
||||||
|
expect(issue.labels_hook_attrs).to eq([label.hook_attrs])
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue