Skip to content
GitLab
Next
About GitLab
GitLab: the DevOps platform
Explore GitLab
Install GitLab
How GitLab compares
Get started
GitLab docs
GitLab Learn
Pricing
Talk to an expert
Help
What's new
4
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Menu
Projects
Groups
Snippets
Get a free trial
Sign up
Login
Sign in / Register
Toggle navigation
Menu
Open sidebar
GitLab.org
GitLab FOSS
Commits
9c623e3e
Commit
9c623e3e
authored
Dec 20, 2016
by
James Edwards-Jones
Browse files
Added QueryRecorder to test N+1 fix on Milestone#show
parent
a2f57f23
Changes
2
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
spec/features/milestones/show_spec.rb
0 → 100644
View file @
9c623e3e
require
'rails_helper'
describe
'Milestone show'
,
feature:
true
do
let
(
:user
)
{
create
(
:user
)
}
let
(
:project
)
{
create
(
:empty_project
)
}
let
(
:milestone
)
{
create
(
:milestone
,
project:
project
)
}
let
(
:labels
)
{
create_list
(
:label
,
2
,
project:
project
)
}
let
(
:issue_params
)
{
{
project:
project
,
assignee:
user
,
author:
user
,
milestone:
milestone
,
labels:
labels
}
}
before
do
project
.
add_user
(
user
,
:developer
)
login_as
(
user
)
end
def
visit_milestone
visit
namespace_project_milestone_path
(
project
.
namespace
,
project
,
milestone
)
end
it
'avoids N+1 database queries'
do
create
(
:labeled_issue
,
issue_params
)
control_count
=
ActiveRecord
::
QueryRecorder
.
new
{
visit_milestone
}.
count
create_list
(
:labeled_issue
,
10
,
issue_params
)
expect
{
visit_milestone
}.
not_to
exceed_query_limit
(
control_count
)
end
end
spec/support/query_recorder.rb
0 → 100644
View file @
9c623e3e
module
ActiveRecord
class
QueryRecorder
attr_reader
:log
def
initialize
(
&
block
)
@log
=
[]
ActiveSupport
::
Notifications
.
subscribed
(
method
(
:callback
),
'sql.active_record'
,
&
block
)
end
def
callback
(
name
,
start
,
finish
,
message_id
,
values
)
return
if
%w(CACHE SCHEMA)
.
include?
(
values
[
:name
])
@log
<<
values
[
:sql
]
end
def
count
@log
.
count
end
def
log_message
@log
.
join
(
"
\n\n
"
)
end
end
end
RSpec
::
Matchers
.
define
:exceed_query_limit
do
|
expected
|
supports_block_expectations
match
do
|
block
|
query_count
(
&
block
)
>
expected
end
failure_message_when_negated
do
|
actual
|
"Expected a maximum of
#{
expected
}
queries, got
#{
@recorder
.
count
}
:
\n\n
#{
@recorder
.
log_message
}
"
end
def
query_count
(
&
block
)
@recorder
=
ActiveRecord
::
QueryRecorder
.
new
(
&
block
)
@recorder
.
count
end
end
James Edwards-Jones
@jamedjo
mentioned in issue
#25900 (closed)
·
Dec 21, 2016
mentioned in issue
#25900 (closed)
mentioned in issue #25900
Toggle commit list
James Edwards-Jones
@jamedjo
mentioned in issue
#28492 (closed)
·
Feb 21, 2017
mentioned in issue
#28492 (closed)
mentioned in issue #28492
Toggle commit list
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment