db-query-matchers 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fc48c9f7dac8104c00663ade64d3dba62487e682
|
4
|
+
data.tar.gz: d6813610637b71bfa53435f8fc3f45e58470a6b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0b836ebccfaeb3b302cf75768c25dadefcd7e6988435cd81e7c510536e1909aed2a55fb0d6b49005fc81cdd4e8e3990f34931d9c7a8465b990faedae865c2583
|
7
|
+
data.tar.gz: aae4118888524878f5793fe2d760a7a8d9c025e8b7859235a0c8349e866250b2d2810cbf8acda815e982c7c523822086d2b504b65c678d236671438da1629e98
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
|
3
|
+
# Custom matcher to check for database queries performed by a block of code.
|
4
|
+
#
|
5
|
+
# @example
|
6
|
+
# expect { subject }.to_not make_database_queries
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# expect { subject }.to make_database_queries(count: 1)
|
10
|
+
#
|
11
|
+
# @see QueryCounter
|
12
|
+
RSpec::Matchers.define :make_database_queries do |options = {}|
|
13
|
+
|
14
|
+
# Taken from ActionView::Helpers::TextHelper
|
15
|
+
def pluralize(count, singular, plural = nil)
|
16
|
+
word = if count == 1 || count =~ /^1(\.0+)?$/
|
17
|
+
singular
|
18
|
+
else
|
19
|
+
plural || singular.pluralize
|
20
|
+
end
|
21
|
+
|
22
|
+
"#{count || 0} #{word}"
|
23
|
+
end
|
24
|
+
|
25
|
+
match do |block|
|
26
|
+
@counter = QueryCounter.new
|
27
|
+
ActiveSupport::Notifications.subscribed(@counter.to_proc,
|
28
|
+
'sql.active_record',
|
29
|
+
&block)
|
30
|
+
if absolute_count = options[:count]
|
31
|
+
@counter.count == absolute_count
|
32
|
+
else
|
33
|
+
@counter.count > 0
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
failure_message_for_should_not do |_|
|
38
|
+
<<-EOS
|
39
|
+
expected no queries, but #{@counter.count} were made:
|
40
|
+
#{@counter.log.join("\n")}
|
41
|
+
EOS
|
42
|
+
end
|
43
|
+
|
44
|
+
failure_message_for_should do |_|
|
45
|
+
if options[:count]
|
46
|
+
expected = pluralize(options[:count], 'query')
|
47
|
+
actual = pluralize(@counter.count, 'was', 'were')
|
48
|
+
|
49
|
+
output = "expected #{expected}, but #{actual} made"
|
50
|
+
if @counter.count > 0
|
51
|
+
output += ":\n#{@counter.log.join("\n")}"
|
52
|
+
end
|
53
|
+
output
|
54
|
+
else
|
55
|
+
'expected queries, but none were made'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# Counter to keep track of the number of queries caused by running a piece of
|
2
|
+
# code. Closely tied to the `:make_database_queries` matcher, this class is
|
3
|
+
# designed to be a consumer of `sql.active_record` events.
|
4
|
+
#
|
5
|
+
# @example
|
6
|
+
# counter = QueryCounter.new
|
7
|
+
# ActiveSupport::Notifications.subscribed(counter.to_proc,
|
8
|
+
# 'sql.active_record') do
|
9
|
+
# # run code here
|
10
|
+
# end
|
11
|
+
# puts counter.count # prints the number of queries made
|
12
|
+
# puts counter.log.join(', ') # prints all queries made
|
13
|
+
#
|
14
|
+
# @see http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html#module-ActiveSupport::Notifications-label-Temporary+Subscriptions
|
15
|
+
class QueryCounter
|
16
|
+
attr_reader :count, :log
|
17
|
+
|
18
|
+
def initialize
|
19
|
+
@count = 0
|
20
|
+
@log = []
|
21
|
+
end
|
22
|
+
|
23
|
+
# Turns a QueryCounter instance into a lambda. Designed to be used when
|
24
|
+
# subscribing to events through the ActiveSupport::Notifications module.
|
25
|
+
#
|
26
|
+
# @return [Proc]
|
27
|
+
def to_proc
|
28
|
+
lambda(&method(:callback))
|
29
|
+
end
|
30
|
+
|
31
|
+
# Method called from the ActiveSupport::Notifications module (through the
|
32
|
+
# lambda created by `to_proc`) when an SQL query is made.
|
33
|
+
#
|
34
|
+
# @param name [String] name of the event
|
35
|
+
# @param start [Time] when the instrumented block started execution
|
36
|
+
# @param finish [Time] when the instrumented block ended execution
|
37
|
+
# @param message_id [String] unique ID for this notification
|
38
|
+
# @param payload [Hash] the payload
|
39
|
+
def callback(name, start, finish, message_id, payload)
|
40
|
+
@count += 1
|
41
|
+
@log << payload[:sql]
|
42
|
+
end
|
43
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: db-query-matchers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Causes Engineering
|
@@ -78,6 +78,9 @@ extensions: []
|
|
78
78
|
extra_rdoc_files: []
|
79
79
|
files:
|
80
80
|
- lib/db_query_matchers.rb
|
81
|
+
- lib/db_query_matchers/version.rb
|
82
|
+
- lib/db_query_matchers/make_database_queries.rb
|
83
|
+
- lib/db_query_matchers/query_counter.rb
|
81
84
|
homepage: https://github.com/causes/db-query-matchers
|
82
85
|
licenses:
|
83
86
|
- MIT
|