4d4ddb6004
This method can be called with an array, or a relation: 1. Arrays always have a limited amount of values, so that's fine. 2. If the relation does not have a limit value applied, then we will load every single object in that collection, and prevent N+1 queries for the metadata for that. But that's wrong, because we should never call this without an explicit limit set. So we raise in that case, and this commit will see which specs fail. The only failing specs here were the issues API specs, and the specs for IssuableMetadata itself, and both have been addressed.
63 lines
3 KiB
Ruby
63 lines
3 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe Gitlab::IssuableMetadata do
|
|
let(:user) { create(:user) }
|
|
let!(:project) { create(:project, :public, :repository, creator: user, namespace: user.namespace) }
|
|
|
|
subject { Class.new { include Gitlab::IssuableMetadata }.new }
|
|
|
|
it 'returns an empty Hash if an empty collection is provided' do
|
|
expect(subject.issuable_meta_data(Issue.none, 'Issue')).to eq({})
|
|
end
|
|
|
|
it 'raises an error when given a collection with no limit' do
|
|
expect { subject.issuable_meta_data(Issue.all, 'Issue') }.to raise_error(/must have a limit/)
|
|
end
|
|
|
|
context 'issues' do
|
|
let!(:issue) { create(:issue, author: user, project: project) }
|
|
let!(:closed_issue) { create(:issue, state: :closed, author: user, project: project) }
|
|
let!(:downvote) { create(:award_emoji, :downvote, awardable: closed_issue) }
|
|
let!(:upvote) { create(:award_emoji, :upvote, awardable: issue) }
|
|
let!(:merge_request) { create(:merge_request, :simple, author: user, assignee: user, source_project: project, target_project: project, title: "Test") }
|
|
let!(:closing_issues) { create(:merge_requests_closing_issues, issue: issue, merge_request: merge_request) }
|
|
|
|
it 'aggregates stats on issues' do
|
|
data = subject.issuable_meta_data(Issue.all.limit(10), 'Issue')
|
|
|
|
expect(data.count).to eq(2)
|
|
expect(data[issue.id].upvotes).to eq(1)
|
|
expect(data[issue.id].downvotes).to eq(0)
|
|
expect(data[issue.id].notes_count).to eq(0)
|
|
expect(data[issue.id].merge_requests_count).to eq(1)
|
|
|
|
expect(data[closed_issue.id].upvotes).to eq(0)
|
|
expect(data[closed_issue.id].downvotes).to eq(1)
|
|
expect(data[closed_issue.id].notes_count).to eq(0)
|
|
expect(data[closed_issue.id].merge_requests_count).to eq(0)
|
|
end
|
|
end
|
|
|
|
context 'merge requests' do
|
|
let!(:merge_request) { create(:merge_request, :simple, author: user, assignee: user, source_project: project, target_project: project, title: "Test") }
|
|
let!(:merge_request_closed) { create(:merge_request, state: "closed", source_project: project, target_project: project, title: "Closed Test") }
|
|
let!(:downvote) { create(:award_emoji, :downvote, awardable: merge_request) }
|
|
let!(:upvote) { create(:award_emoji, :upvote, awardable: merge_request) }
|
|
let!(:note) { create(:note_on_merge_request, author: user, project: project, noteable: merge_request, note: "a comment on a MR") }
|
|
|
|
it 'aggregates stats on merge requests' do
|
|
data = subject.issuable_meta_data(MergeRequest.all.limit(10), 'MergeRequest')
|
|
|
|
expect(data.count).to eq(2)
|
|
expect(data[merge_request.id].upvotes).to eq(1)
|
|
expect(data[merge_request.id].downvotes).to eq(1)
|
|
expect(data[merge_request.id].notes_count).to eq(1)
|
|
expect(data[merge_request.id].merge_requests_count).to eq(0)
|
|
|
|
expect(data[merge_request_closed.id].upvotes).to eq(0)
|
|
expect(data[merge_request_closed.id].downvotes).to eq(0)
|
|
expect(data[merge_request_closed.id].notes_count).to eq(0)
|
|
expect(data[merge_request_closed.id].merge_requests_count).to eq(0)
|
|
end
|
|
end
|
|
end
|