rspec_power 0.1.0 → 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
  SHA256:
3
- metadata.gz: 15e38ae448c0c4dfeb0251c6186f5fff49aeb9fc36b68ee2c307e5bb9956a0e3
4
- data.tar.gz: 29e94be5c241dcf1f839e5494c41d1327b289c8a6763a1cab3cda2ef4d601e81
3
+ metadata.gz: 853c7325b3b8ce0d7c2743803dcbc3e7c6fc1b83fa65b31e0f72878cc80f9670
4
+ data.tar.gz: bf33c0a8d5755e69e5338789c5523f3671a36f5332b638fb6e714fbb4257f683
5
5
  SHA512:
6
- metadata.gz: 5966690eb7da430b3e2ddd99acee303efb0c46909b6dca64d4d116fe12264d4e6fb40b215128850e4392f74fb152515e2dc2c667de2c8be52695467eaafe697f
7
- data.tar.gz: 2b1c5ce8f74d29bbb54715aa8d4f9255a685f4e624073508e2fc2209d99a65bfcae6339d306a6bcc482641dc1325507781838a5c1dce7ed3b7d37b61128e8dac
6
+ metadata.gz: 111a7db1748adc1388bdaab9359f96c915c0d0c439bb6890d520d4cd8623be67e342f5ed2a58eb22e99b2738f138e992471a5ae3dd8588ee82b40316729eb78b
7
+ data.tar.gz: 88afb25896a8f983c78b602b552bc8ed41098276e9eb27d4dae0ece8edc0b3f6f986ed4e721ae608178d218e4eec87acb1d9d6e3ae2f610b1cc9db48567dd047
data/README.md CHANGED
@@ -28,7 +28,7 @@ Add this line to your application's Gemfile:
28
28
 
29
29
  ```ruby
30
30
  group :test do
31
- gem "rspec_power", require: false
31
+ gem "rspec_power"
32
32
  end
33
33
  ```
34
34
 
@@ -38,6 +38,11 @@ And then execute:
38
38
  bundle install
39
39
  ```
40
40
 
41
+ If you are using the "timecop" gem, you need to
42
+
43
+ - add to Gemfile as `gem "rspec_power", require: false`
44
+ - add `require "rspec_power"` before `require "timecop"` in `rails_helper.rb`.
45
+
41
46
  ## 🚀 Quick Start
42
47
 
43
48
  The gem automatically configures itself when required. Just add it to your Gemfile.
@@ -46,7 +51,7 @@ The gem automatically configures itself when required. Just add it to your Gemfi
46
51
 
47
52
  ### 🔍 Enhanced Logging
48
53
 
49
- Capture all Rails logs during specific tests:
54
+ Capture all Rails logs during specific tests, copied from [test-prof](https://github.com/test-prof/test-prof) gem with a small enhancement:
50
55
 
51
56
  ```ruby
52
57
  RSpec.describe User, :with_log do
@@ -25,6 +25,10 @@ end
25
25
  RSpec.shared_context "rspec_power::env:override" do
26
26
  around(:each) do |example|
27
27
  overrides = example.metadata[:with_env] || {}
28
- with_test_env(overrides) { example.run }
28
+ if overrides.any?
29
+ with_test_env(overrides) { example.run }
30
+ else
31
+ example.run
32
+ end
29
33
  end
30
34
  end
@@ -75,17 +75,19 @@ module RSpecPower
75
75
  end
76
76
 
77
77
  def with_logging
78
- old = LoggingHelpers.swap_logger(LoggingHelpers.all_loggables)
78
+ targets = LoggingHelpers.all_loggables
79
+ old_loggers = LoggingHelpers.swap_logger(targets)
79
80
  yield
80
81
  ensure
81
- LoggingHelpers.restore_logger(old, LoggingHelpers.all_loggables)
82
+ LoggingHelpers.restore_logger(old_loggers, targets)
82
83
  end
83
84
 
84
85
  def with_ar_logging
85
- old = LoggingHelpers.swap_logger(LoggingHelpers.ar_loggables)
86
+ targets = LoggingHelpers.ar_loggables
87
+ old_loggers = LoggingHelpers.swap_logger(targets)
86
88
  yield
87
89
  ensure
88
- LoggingHelpers.restore_logger(old, LoggingHelpers.ar_loggables)
90
+ LoggingHelpers.restore_logger(old_loggers, targets)
89
91
  end
90
92
  end
91
93
  end
@@ -10,7 +10,8 @@ module RSpecPower
10
10
  yield
11
11
  ensure
12
12
  elapsed_ms = (Process.clock_gettime(Process::CLOCK_MONOTONIC) - start_time) * 1000.0
13
- if elapsed_ms > max_ms
13
+ # Do not override an existing exception
14
+ if $!.nil? && elapsed_ms > max_ms
14
15
  formatted_elapsed = format("%.3f", elapsed_ms)
15
16
  formatted_limit = format("%.3f", max_ms)
16
17
  raise RSpec::Expectations::ExpectationNotMetError,
@@ -58,48 +58,56 @@ end
58
58
 
59
59
  RSpec.shared_context "rspec_power::sql:none" do
60
60
  around(:each) do |example|
61
- executed_sql = []
61
+ if example.metadata[:with_no_sql_queries] || example.metadata[:with_no_sql]
62
+ executed_sql = []
62
63
 
63
- callback = lambda do |_name, _started, _finished, _unique_id, payload|
64
- event_name = payload[:name].to_s
65
- cached = payload[:cached]
66
- next if cached
67
- next if event_name == "SCHEMA" || event_name == "TRANSACTION"
64
+ callback = lambda do |_name, _started, _finished, _unique_id, payload|
65
+ event_name = payload[:name].to_s
66
+ cached = payload[:cached]
67
+ next if cached
68
+ next if event_name == "SCHEMA" || event_name == "TRANSACTION"
68
69
 
69
- executed_sql << payload[:sql]
70
- end
70
+ executed_sql << payload[:sql]
71
+ end
71
72
 
72
- ActiveSupport::Notifications.subscribed(callback, "sql.active_record") do
73
- example.run
74
- end
73
+ ActiveSupport::Notifications.subscribed(callback, "sql.active_record") do
74
+ example.run
75
+ end
75
76
 
76
- if executed_sql.any?
77
- message = "Expected no SQL to be executed, but #{executed_sql.length} statement(s) were run.\n" \
78
- + executed_sql.map { |sql| " - #{sql}" }.join("\n")
79
- raise RSpec::Expectations::ExpectationNotMetError, message
77
+ if executed_sql.any?
78
+ message = "Expected no SQL to be executed, but #{executed_sql.length} statement(s) were run.\n" \
79
+ + executed_sql.map { |sql| " - #{sql}" }.join("\n")
80
+ raise RSpec::Expectations::ExpectationNotMetError, message
81
+ end
82
+ else
83
+ example.run
80
84
  end
81
85
  end
82
86
  end
83
87
 
84
88
  RSpec.shared_context "rspec_power::sql:must" do
85
89
  around(:each) do |example|
86
- executed_sql = []
90
+ if example.metadata[:with_sql_queries] || example.metadata[:with_sql]
91
+ executed_sql = []
87
92
 
88
- callback = lambda do |_name, _started, _finished, _unique_id, payload|
89
- event_name = payload[:name].to_s
90
- cached = payload[:cached]
91
- next if cached
92
- next if event_name == "SCHEMA" || event_name == "TRANSACTION"
93
+ callback = lambda do |_name, _started, _finished, _unique_id, payload|
94
+ event_name = payload[:name].to_s
95
+ cached = payload[:cached]
96
+ next if cached
97
+ next if event_name == "SCHEMA" || event_name == "TRANSACTION"
93
98
 
94
- executed_sql << payload[:sql]
95
- end
99
+ executed_sql << payload[:sql]
100
+ end
96
101
 
97
- ActiveSupport::Notifications.subscribed(callback, "sql.active_record") do
98
- example.run
99
- end
102
+ ActiveSupport::Notifications.subscribed(callback, "sql.active_record") do
103
+ example.run
104
+ end
100
105
 
101
- if executed_sql.empty?
102
- raise RSpec::Expectations::ExpectationNotMetError, "Expected some SQL to be executed, but none was run"
106
+ if executed_sql.empty?
107
+ raise RSpec::Expectations::ExpectationNotMetError, "Expected some SQL to be executed, but none was run"
108
+ end
109
+ else
110
+ example.run
103
111
  end
104
112
  end
105
113
  end
@@ -1,10 +1,7 @@
1
- require "active_support/testing/time_helpers"
2
1
  require "time"
3
2
 
4
3
  module RSpecPower
5
4
  module TimeHelpers
6
- include ActiveSupport::Testing::TimeHelpers
7
-
8
5
  def with_time_zone(zone)
9
6
  if defined?(ActiveSupport::TimeZone)
10
7
  ::Time.use_zone(zone) { yield }
@@ -18,6 +15,13 @@ end
18
15
  RSpec.shared_context "rspec_power::time:freeze" do
19
16
  around(:each) do |example|
20
17
  if ts = example.metadata[:with_time_freeze]
18
+ # include ActiveSupport::Testing::TimeHelpers if not already included
19
+ if !@_rspec_power_time_helpers_included && !respond_to?(:travel_to)
20
+ RSpec.configure do |config|
21
+ config.include ActiveSupport::Testing::TimeHelpers
22
+ end
23
+ @_rspec_power_time_helpers_included = true
24
+ end
21
25
  ts = Time.parse(ts) if ts.is_a?(String)
22
26
  travel_to(ts) { example.run }
23
27
  else
@@ -1,3 +1,3 @@
1
1
  module RSpecPower
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.2"
3
3
  end
data/lib/rspec_power.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  require "rspec_power/version"
2
2
  require "rspec_power/engine"
3
+
4
+ # because some commands loads gem, before we need, for example RAILS_ENV=test bundle exec rails db:schema:load
5
+ return unless defined?(RSpec) && RSpec.respond_to?(:shared_context)
6
+
3
7
  require "rspec_power/logging"
4
8
  require "rspec_power/env"
5
9
  require "rspec_power/i18n"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec_power
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Kasyanchuk
@@ -79,7 +79,9 @@ dependencies:
79
79
  - - ">="
80
80
  - !ruby/object:Gem::Version
81
81
  version: '0'
82
- description: RSpec power tools
82
+ description: 'A collection of helpers and contexts to enhance Rails specs: logging,
83
+ env/I18n/time helpers, SQL guards, request/DB dumps, benchmarking, CI guards, and
84
+ performance limits.'
83
85
  email:
84
86
  - igorkasyanchuk@gmail.com
85
87
  executables: []
@@ -107,6 +109,9 @@ licenses:
107
109
  - MIT
108
110
  metadata:
109
111
  homepage_uri: https://github.com/igorkasyanchuk/rspec_power
112
+ source_code_uri: https://github.com/igorkasyanchuk/rspec_power
113
+ bug_tracker_uri: https://github.com/igorkasyanchuk/rspec_power/issues
114
+ documentation_uri: https://github.com/igorkasyanchuk/rspec_power#readme
110
115
  rdoc_options: []
111
116
  require_paths:
112
117
  - lib
@@ -123,5 +128,5 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
128
  requirements: []
124
129
  rubygems_version: 3.6.9
125
130
  specification_version: 4
126
- summary: RSpec power tools
131
+ summary: Powerful RSpec helpers for Rails testing
127
132
  test_files: []