rspec-sql 0.0.0 → 0.0.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 +4 -4
- data/lib/rspec/sql/query_summary.rb +48 -0
- data/lib/rspec/sql.rb +23 -4
- metadata +11 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz: '
|
3
|
+
metadata.gz: 5bcabc5d90f3ad9fbdecc557c3604203ae859cf4725664a18819d1290ced63e2
|
4
|
+
data.tar.gz: '09e1ba8a94a2e92355414104384bc7de76e7aa42bdf1c2f0bc5311c29ecc66a8'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff5a4cdf9a0c27921a32ca65da0c682b6412652cf78b6d155309e6e97b7cb13702086f183d1d6ed88f2083e57fc99e6b5e4c799867b5e5a1f659363ecbda1df5
|
7
|
+
data.tar.gz: 3af870e827e52cfc8e1a548d9ff456c26521291de6bd4fb093172537f4f46ca551b84bdd2dc3306b0b665eecb1f838ff9687b2f699d9acf12b9fbe42352cfa63
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Sql
|
5
|
+
# Converts a list of queries into a summary hash.
|
6
|
+
class QuerySummary
|
7
|
+
QUERY_TYPES = %i[delete insert select update].freeze
|
8
|
+
|
9
|
+
attr_reader :summary
|
10
|
+
|
11
|
+
def initialize(queries)
|
12
|
+
@summary = {}
|
13
|
+
queries.each do |payload|
|
14
|
+
type = get_type(payload[:sql])
|
15
|
+
next if QUERY_TYPES.exclude?(type) || pg_query?(payload[:sql])
|
16
|
+
|
17
|
+
table = get_table(payload[:sql])
|
18
|
+
@summary[type] ||= {}
|
19
|
+
@summary[type][table] ||= 0
|
20
|
+
@summary[type][table] += 1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def get_table(sql)
|
27
|
+
sql_parts = sql.split
|
28
|
+
case get_type(sql)
|
29
|
+
when :insert
|
30
|
+
sql_parts[2]
|
31
|
+
when :update
|
32
|
+
sql_parts[1]
|
33
|
+
else
|
34
|
+
table_index = sql_parts.index("FROM")
|
35
|
+
sql_parts[table_index + 1]
|
36
|
+
end.gsub(/(\\|")/, "").to_sym
|
37
|
+
end
|
38
|
+
|
39
|
+
def get_type(sql)
|
40
|
+
sql.split[0].downcase.to_sym
|
41
|
+
end
|
42
|
+
|
43
|
+
def pg_query?(sql)
|
44
|
+
sql.include?("SELECT a.attname") || sql.include?("pg_attribute")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/rspec/sql.rb
CHANGED
@@ -3,10 +3,15 @@
|
|
3
3
|
require "active_support"
|
4
4
|
require "rspec"
|
5
5
|
|
6
|
+
require_relative "sql/query_summary"
|
7
|
+
|
8
|
+
# We are building within the RSpec namespace for consistency and convenience.
|
9
|
+
# We are not part of the RSpec team though.
|
6
10
|
module RSpec
|
11
|
+
# RSpec::Sql contains our code.
|
7
12
|
module Sql; end
|
8
13
|
|
9
|
-
|
14
|
+
Matchers.define :query_database do |expected = nil|
|
10
15
|
match do |block|
|
11
16
|
@queries = scribe_queries(&block)
|
12
17
|
|
@@ -18,12 +23,18 @@ module RSpec
|
|
18
23
|
@queries.size == expected.size
|
19
24
|
elsif expected.is_a?(Array)
|
20
25
|
query_names == expected
|
26
|
+
elsif expected.is_a?(Hash)
|
27
|
+
query_summary == expected
|
21
28
|
else
|
22
29
|
raise "What are you expecting?"
|
23
30
|
end
|
24
31
|
end
|
25
32
|
|
26
33
|
failure_message do |_block|
|
34
|
+
if expected.is_a?(Enumerator) && expected.inspect.match?(/:times>$/)
|
35
|
+
expected = expected.size
|
36
|
+
end
|
37
|
+
|
27
38
|
<<~MESSAGE
|
28
39
|
Expected database queries: #{expected}
|
29
40
|
Actual database queries: #{query_names}
|
@@ -37,7 +48,11 @@ module RSpec
|
|
37
48
|
end
|
38
49
|
|
39
50
|
failure_message_when_negated do |_block|
|
40
|
-
|
51
|
+
<<~TXT
|
52
|
+
Expected no database queries but observed:
|
53
|
+
|
54
|
+
#{query_descriptions.join("\n")}
|
55
|
+
TXT
|
41
56
|
end
|
42
57
|
|
43
58
|
def supports_block_expectations?
|
@@ -52,12 +67,16 @@ module RSpec
|
|
52
67
|
@queries.map { |q| "#{q[:name]} #{q[:sql]}" }
|
53
68
|
end
|
54
69
|
|
70
|
+
def query_summary
|
71
|
+
Sql::QuerySummary.new(@queries).summary
|
72
|
+
end
|
73
|
+
|
55
74
|
def scribe_queries(&)
|
56
75
|
queries = []
|
57
76
|
|
58
|
-
logger =
|
77
|
+
logger = lambda do |_name, _started, _finished, _unique_id, payload|
|
59
78
|
queries << payload unless %w[CACHE SCHEMA].include?(payload[:name])
|
60
|
-
|
79
|
+
end
|
61
80
|
|
62
81
|
ActiveSupport::Notifications.subscribed(logger, "sql.active_record", &)
|
63
82
|
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
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.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maikel Linke
|
8
|
-
|
8
|
+
- Open Food Network contributors
|
9
|
+
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2024-
|
12
|
+
date: 2024-04-16 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: activesupport
|
@@ -45,11 +46,15 @@ extensions: []
|
|
45
46
|
extra_rdoc_files: []
|
46
47
|
files:
|
47
48
|
- lib/rspec/sql.rb
|
49
|
+
- lib/rspec/sql/query_summary.rb
|
48
50
|
homepage: https://github.com/openfoodfoundation/rspec-sql
|
49
51
|
licenses:
|
50
52
|
- AGPL-3.0-or-later
|
51
|
-
metadata:
|
52
|
-
|
53
|
+
metadata:
|
54
|
+
changelog_uri: https://github.com/datafoodconsortium/connector-ruby/blob/main/CHANGELOG.md
|
55
|
+
source_code_uri: https://github.com/datafoodconsortium/connector-ruby/
|
56
|
+
rubygems_mfa_required: 'true'
|
57
|
+
post_install_message:
|
53
58
|
rdoc_options: []
|
54
59
|
require_paths:
|
55
60
|
- lib
|
@@ -68,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
68
73
|
version: '0'
|
69
74
|
requirements: []
|
70
75
|
rubygems_version: 3.3.26
|
71
|
-
signing_key:
|
76
|
+
signing_key:
|
72
77
|
specification_version: 4
|
73
78
|
summary: RSpec::Sql matcher
|
74
79
|
test_files: []
|