Skip to content
Snippets Groups Projects
Commit 212cf8f9 authored by Rémy Coutable's avatar Rémy Coutable
Browse files

Merge branch 'rs-optimize-award_user_list-spec' into 'master'

Optimize the `award_user_list` helper spec

According to
https://gitlab.com/gitlab-org/gitlab-ce/issues/23034#note_16586657, each
test for this helper generated 1,833 queries.

Now we only generate stubbed records, and only as many as we need for
each test.

This also corrects a slight logic bug in the helper itself. When the
number of awards was greater than the limit (9 by default), _and_ the
current user was one of them, we actually included 10 names, including
"You", plus the remaining count. Now we return the correct number
regardless.

See merge request !6722
parents 2a37e684 328ca8c4
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -113,14 +113,13 @@ module IssuesHelper
end
end
 
def award_user_list(awards, current_user)
def award_user_list(awards, current_user, limit: 10)
names = awards.map do |award|
award.user == current_user ? 'You' : award.user.name
end
 
# Take first 9 OR current user + first 9
current_user_name = names.delete('You')
names = names.first(9).insert(0, current_user_name).compact
names = names.insert(0, current_user_name).compact.first(limit)
 
names << "#{awards.size - names.size} more." if awards.size > names.size
 
Loading
Loading
Loading
Loading
@@ -63,28 +63,38 @@ describe IssuesHelper do
end
 
describe '#award_user_list' do
let!(:awards) { build_list(:award_emoji, 15) }
it "returns a comma-separated list of the first X users" do
user = build_stubbed(:user, name: 'Joe')
awards = Array.new(3, build_stubbed(:award_emoji, user: user))
 
it "returns a comma seperated list of 1-9 users" do
expect(award_user_list(awards.first(9), nil)).to eq(awards.first(9).map { |a| a.user.name }.to_sentence)
expect(award_user_list(awards, nil, limit: 3))
.to eq('Joe, Joe, and Joe')
end
 
it "displays the current user's name as 'You'" do
expect(award_user_list(awards.first(1), awards[0].user)).to eq('You')
end
user = build_stubbed(:user, name: 'Joe')
award = build_stubbed(:award_emoji, user: user)
 
it "truncates lists of larger than 9 users" do
expect(award_user_list(awards, nil)).to eq(awards.first(9).map { |a| a.user.name }.join(', ') + ", and 6 more.")
expect(award_user_list([award], user)).to eq('You')
expect(award_user_list([award], nil)).to eq 'Joe'
end
 
it "displays the current user in front of 0-9 other users" do
expect(award_user_list(awards, awards[0].user)).
to eq("You, " + awards[1..9].map { |a| a.user.name }.join(', ') + ", and 5 more.")
it "truncates lists" do
user = build_stubbed(:user, name: 'Jane')
awards = Array.new(5, build_stubbed(:award_emoji, user: user))
expect(award_user_list(awards, nil, limit: 3))
.to eq('Jane, Jane, Jane, and 2 more.')
end
 
it "displays the current user in front regardless of position in the list" do
expect(award_user_list(awards, awards[12].user)).
to eq("You, " + awards[0..8].map { |a| a.user.name }.join(', ') + ", and 5 more.")
it "displays the current user in front of other users" do
current_user = build_stubbed(:user)
my_award = build_stubbed(:award_emoji, user: current_user)
award = build_stubbed(:award_emoji, user: build_stubbed(:user, name: 'Jane'))
awards = Array.new(5, award).push(my_award)
expect(award_user_list(awards, current_user, limit: 2)).
to eq("You, Jane, and 4 more.")
end
end
 
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment