rspec-sql 0.0.2 → 0.0.3
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 +4 -4
- data/lib/rspec/sql/query_matcher.rb +60 -0
- data/lib/rspec/sql.rb +19 -24
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9cfbb9dfa6686fc934767248d98c65a3ffa0647f9674df74792ab344109b2899
|
4
|
+
data.tar.gz: 576dce207bae8bdb03585dc0234a898bf12d4b8e9e27f22f55817ce03babb4d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d50829389362c678403a0ddaf982e44232aa2b884159f8928f07943b351ca00b015d48854e953f977ac6f5f3eefd6e47b168e2c732311e7187f677e97753ed5
|
7
|
+
data.tar.gz: aff99ef38190a45774eb0ada50daaba8f9182d2f89f3ebcdfb35ed3781210b4e19941b3bedcc5ef736c186474c6ccec41bd0c9149918e38c1c773087a3b9673d
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "query_summary"
|
4
|
+
|
5
|
+
module RSpec
|
6
|
+
module Sql
|
7
|
+
# Compares expectations with actual queries.
|
8
|
+
class QueryMatcher
|
9
|
+
attr_reader :expected
|
10
|
+
|
11
|
+
def initialize(queries, expected)
|
12
|
+
@queries = queries
|
13
|
+
@expected = sanitize_number(expected)
|
14
|
+
end
|
15
|
+
|
16
|
+
def matches?
|
17
|
+
# Simple presence validation.
|
18
|
+
return !@queries.empty? if expected.nil?
|
19
|
+
|
20
|
+
actual == expected
|
21
|
+
end
|
22
|
+
|
23
|
+
def actual
|
24
|
+
@actual ||= actual_compared_to_expected
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# Support writing: `is_expected.to query_database 5.times`
|
30
|
+
def sanitize_number(expected)
|
31
|
+
if expected.is_a?(Enumerator) && expected.inspect.match?(/:times>$/)
|
32
|
+
expected.size
|
33
|
+
else
|
34
|
+
expected
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def actual_compared_to_expected
|
39
|
+
case expected
|
40
|
+
when Integer
|
41
|
+
@queries.size
|
42
|
+
when Array
|
43
|
+
query_names
|
44
|
+
when Hash
|
45
|
+
query_summary
|
46
|
+
else
|
47
|
+
raise "What are you expecting?"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def query_names
|
52
|
+
@queries.map { |q| q[:name] || q[:sql].split.take(2).join(" ") }
|
53
|
+
end
|
54
|
+
|
55
|
+
def query_summary
|
56
|
+
QuerySummary.new(@queries).summary
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/rspec/sql.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
require "active_support"
|
4
4
|
require "rspec"
|
5
5
|
|
6
|
-
require_relative "sql/
|
6
|
+
require_relative "sql/query_matcher"
|
7
7
|
|
8
8
|
# We are building within the RSpec namespace for consistency and convenience.
|
9
9
|
# We are not part of the RSpec team though.
|
@@ -14,32 +14,22 @@ module RSpec
|
|
14
14
|
Matchers.define :query_database do |expected = nil|
|
15
15
|
match do |block|
|
16
16
|
@queries = scribe_queries(&block)
|
17
|
+
@matcher = Sql::QueryMatcher.new(@queries, expected)
|
18
|
+
expected = matcher.expected
|
17
19
|
|
18
|
-
|
19
|
-
!@queries.empty?
|
20
|
-
elsif expected.is_a?(Integer)
|
21
|
-
@queries.size == expected
|
22
|
-
elsif expected.is_a?(Enumerator) && expected.inspect.match?(/:times>$/)
|
23
|
-
@queries.size == expected.size
|
24
|
-
elsif expected.is_a?(Array)
|
25
|
-
query_names == expected
|
26
|
-
elsif expected.is_a?(Hash)
|
27
|
-
query_summary == expected
|
28
|
-
else
|
29
|
-
raise "What are you expecting?"
|
30
|
-
end
|
20
|
+
matcher.matches?
|
31
21
|
end
|
32
22
|
|
33
23
|
failure_message do |_block|
|
34
|
-
if expected.
|
35
|
-
|
24
|
+
if expected.nil?
|
25
|
+
return "Expected at least one database query but observed none."
|
36
26
|
end
|
37
27
|
|
38
28
|
<<~MESSAGE
|
39
29
|
Expected database queries: #{expected}
|
40
|
-
Actual database queries: #{
|
30
|
+
Actual database queries: #{matcher.actual}
|
41
31
|
|
42
|
-
Diff: #{
|
32
|
+
Diff: #{diff(matcher.actual, expected)}
|
43
33
|
|
44
34
|
Full query log:
|
45
35
|
|
@@ -59,16 +49,21 @@ module RSpec
|
|
59
49
|
true
|
60
50
|
end
|
61
51
|
|
62
|
-
def query_names
|
63
|
-
@queries.map { |q| q[:name] || q[:sql].split.take(2).join(" ") }
|
64
|
-
end
|
65
|
-
|
66
52
|
def query_descriptions
|
67
53
|
@queries.map { |q| "#{q[:name]} #{q[:sql]}" }
|
68
54
|
end
|
69
55
|
|
70
|
-
def
|
71
|
-
|
56
|
+
def matcher
|
57
|
+
@matcher
|
58
|
+
end
|
59
|
+
|
60
|
+
def diff(actual, expected)
|
61
|
+
if expected.is_a?(Numeric)
|
62
|
+
change = actual - expected
|
63
|
+
format("%+d", change)
|
64
|
+
else
|
65
|
+
Expectations.differ.diff_as_object(actual, expected)
|
66
|
+
end
|
72
67
|
end
|
73
68
|
|
74
69
|
def scribe_queries(&)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-sql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maikel Linke
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2024-04-
|
12
|
+
date: 2024-04-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -46,13 +46,14 @@ extensions: []
|
|
46
46
|
extra_rdoc_files: []
|
47
47
|
files:
|
48
48
|
- lib/rspec/sql.rb
|
49
|
+
- lib/rspec/sql/query_matcher.rb
|
49
50
|
- lib/rspec/sql/query_summary.rb
|
50
51
|
homepage: https://github.com/openfoodfoundation/rspec-sql
|
51
52
|
licenses:
|
52
53
|
- AGPL-3.0-or-later
|
53
54
|
metadata:
|
54
|
-
changelog_uri: https://github.com/
|
55
|
-
source_code_uri: https://github.com/
|
55
|
+
changelog_uri: https://github.com/openfoodfoundation/rspec-sql/releases
|
56
|
+
source_code_uri: https://github.com/openfoodfoundation/rspec-sql/
|
56
57
|
rubygems_mfa_required: 'true'
|
57
58
|
post_install_message:
|
58
59
|
rdoc_options: []
|