rspice 0.6.3 → 0.6.4
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/README.md +39 -7
- data/lib/rspice/custom_matchers/alias_method.rb +8 -7
- data/lib/rspice/custom_matchers/extend_module.rb +12 -22
- data/lib/rspice/custom_matchers/{have_error_with_detail_key.rb → have_error_on_attribute.rb} +14 -7
- data/lib/rspice/custom_matchers/include_module.rb +12 -22
- data/lib/rspice/custom_matchers/inherit_from.rb +11 -20
- data/lib/rspice/custom_matchers.rb +1 -1
- data/lib/rspice/rspec_configuration.rb +5 -0
- data/lib/rspice/shared_context/with_an_example_descendant_class.rb +15 -0
- data/lib/rspice/shared_context/with_callbacks.rb +34 -0
- data/lib/rspice/shared_context/with_example_class_having_callback.rb +46 -0
- data/lib/rspice/shared_context.rb +2 -0
- data/lib/rspice/shared_examples/a_class_pass_method.rb +31 -4
- data/lib/rspice/shared_examples/a_class_with_callback.rb +32 -0
- data/lib/rspice/shared_examples/a_versioned_spicerack_gem.rb +6 -0
- data/lib/rspice/shared_examples/an_example_class_with_callbacks.rb +24 -0
- data/lib/rspice/shared_examples/an_inherited_property.rb +110 -0
- data/lib/rspice/shared_examples/an_instrumented_event.rb +38 -0
- data/lib/rspice/shared_examples.rb +4 -0
- data/lib/rspice/version.rb +1 -1
- data/lib/rspice.rb +3 -0
- metadata +10 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65bc79afbd70cd3fed4389b2ed03f5bcd67e4a7e85fd54e858da133fc36aee7a
|
4
|
+
data.tar.gz: 2c43f5a8fdabbc0c7b70373edd5869bdcac6ea686051c070d45a963ad0145acc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a09f94cde9c825211b1c17ca2cc77cf85770ba98b7b46749408377ef8cf29ec047b0d596c3cd527868571cbc150b4a8ec463a2964be023934a0d32b45b8e4b49
|
7
|
+
data.tar.gz: 1229542d436fd7be6994c17f8d78f63737011a94d030544b036cf87f4f791d6dc026201fdfb0883ede36886b0318bf418160b94cdfad9a269beacdc8de05bcaa
|
data/README.md
CHANGED
@@ -5,9 +5,14 @@
|
|
5
5
|
[](https://codeclimate.com/github/Freshly/spicerack/maintainability)
|
6
6
|
[](https://codeclimate.com/github/Freshly/spicerack/test_coverage)
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
* [Installation](#installation)
|
9
|
+
* [Usage](#usage)
|
10
|
+
* [Custom Matchers](#custom-matchers)
|
11
|
+
* [Shared Context](#shared-context)
|
12
|
+
* [Shared Examples](#shared-examples)
|
13
|
+
* [Development](#development)
|
14
|
+
* [Contributing](#contributing)
|
15
|
+
* [License](#license)
|
11
16
|
|
12
17
|
## Installation
|
13
18
|
|
@@ -27,17 +32,44 @@ Or install it yourself as:
|
|
27
32
|
|
28
33
|
## Usage
|
29
34
|
|
30
|
-
|
35
|
+
To include the RSpice tools add the following to your `rails_helper.rb`:
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
require 'rspice'
|
39
|
+
```
|
40
|
+
|
41
|
+
## Custom Matchers
|
42
|
+
|
43
|
+
* [alias_method](lib/rspice/custom_matchers/alias_method.rb) tests usages of [Module#alias_method](https://apidock.com/ruby/Module/alias_method)
|
44
|
+
* [extend_module](lib/rspice/custom_matchers/extend_module.rb) tests usages of [Object#extend](https://www.apidock.com/ruby/Object/extend)
|
45
|
+
* [have_error_on_attribute](lib/rspice/custom_matchers/have_error_on_attribute.rb) tests usages of [ActiveModel::Errors](https://api.rubyonrails.org/classes/ActiveModel/Errors.html)
|
46
|
+
* [include_module](lib/rspice/custom_matchers/include_module.rb) tests usages of [Module#include](https://apidock.com/ruby/Module/include)
|
47
|
+
* [inherit_from](lib/rspice/custom_matchers/inherit_from.rb) tests inheritance of [Classes](https://apidock.com/ruby/Class)
|
48
|
+
|
49
|
+
## Shared Context
|
50
|
+
|
51
|
+
* [with_an_example_descendant_class](lib/rspice/shared_context/with_an_example_descendant_class.rb) creates a named descendant of `described_class`
|
52
|
+
* [with_callbacks](lib/rspice/shared_context/with_callbacks.rb) defines callbacks for [ActiveSupport::Callbacks](https://apidock.com/rails/ActiveSupport/Callbacks)
|
53
|
+
* [with_example_class_having_callback](lib/rspice/shared_context/with_example_class_having_callback.rb) creates a class with
|
54
|
+
|
55
|
+
## Shared Examples
|
56
|
+
|
57
|
+
* [a_class_pass_method](lib/rspice/shared_examples/a_class_pass_method.rb) tests class methods which take arguments that instantiate and call instance method of the same name
|
58
|
+
* [a_class_with_callback](lib/rspice/shared_examples/a_class_with_callback.rb) tests usage of [ActiveSupport::Callbacks](https://apidock.com/rails/ActiveSupport/Callbacks)
|
59
|
+
* [a_versioned_spicerack_gem](lib/rspice/shared_examples/a_versioned_spicerack_gem.rb) ensures gem compliance with internal standard of [Spicerack](https://github.com/Freshly/spicerack/)
|
60
|
+
* [an_example_class_with_callbacks](lib/rspice/shared_examples/an_example_class_with_callbacks.rb) tests for defined [ActiveSupport::Callbacks](https://apidock.com/rails/ActiveSupport/Callbacks)
|
61
|
+
* [an_inherited_property](lib/rspice/shared_examples/an_inherited_property.rb) tests usages of inherited [Class.class_attributes](https://apidock.com/rails/Class/class_attribute)
|
62
|
+
* [an_instrumented_event](lib/rspice/shared_examples/an_instrumented_event.rb) tests usage of [ActiveSupport::Notification](https://apidock.com/rails/ActiveSupport/Notifications)
|
31
63
|
|
32
64
|
## Development
|
33
65
|
|
34
|
-
|
66
|
+
See Spicerack development instructions [here](https://github.com/Freshly/spicerack/blob/develop/README.md#development).
|
35
67
|
|
36
|
-
To
|
68
|
+
To add a new example, context or matcher, add a new file to the appropriate directory in lib/rspice. Next, require the added file in its respective include file (such as `lib/rspice/custom_matchers.rb`).
|
37
69
|
|
38
70
|
## Contributing
|
39
71
|
|
40
|
-
|
72
|
+
See Spicerack contribution instructions [here](https://github.com/Freshly/spicerack/blob/develop/README.md#contributing).
|
41
73
|
|
42
74
|
## License
|
43
75
|
|
@@ -1,14 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# RSpec matcher
|
3
|
+
# RSpec matcher that tests usages of [Module#alias_method](https://apidock.com/ruby/Module/alias_method)
|
4
4
|
#
|
5
|
-
#
|
5
|
+
# class Klass
|
6
|
+
# def old_name; end
|
7
|
+
# alias_method :alias_name, :old_name
|
8
|
+
# end
|
6
9
|
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# it { is_expected.to alias_method :alias_name, :target_name }
|
11
|
-
# end
|
10
|
+
# RSpec.describe Klass do
|
11
|
+
# it { is_expected.to alias_method :alias_name, :old_name }
|
12
|
+
# end
|
12
13
|
|
13
14
|
RSpec::Matchers.define :alias_method do |alias_name, target_name|
|
14
15
|
match do |instance|
|
@@ -1,31 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# RSpec matcher
|
3
|
+
# RSpec matcher that tests usages of [Object#extend](https://www.apidock.com/ruby/Object/extend)
|
4
4
|
#
|
5
|
-
#
|
5
|
+
# module Nodule; end
|
6
|
+
# class Klass
|
7
|
+
# extend Nodule
|
8
|
+
# end
|
6
9
|
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# it { is_expected.to extend_module Authenticatable }
|
11
|
-
# end
|
10
|
+
# RSpec.describe Klass do
|
11
|
+
# it { is_expected.to extend_module Nodule }
|
12
|
+
# end
|
12
13
|
|
13
14
|
RSpec::Matchers.define :extend_module do |module_class|
|
14
|
-
match
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
description do
|
19
|
-
"extended the module #{module_class}"
|
20
|
-
end
|
21
|
-
|
22
|
-
failure_message do |described_class|
|
23
|
-
"expected #{described_class} to extend module #{module_class}"
|
24
|
-
end
|
25
|
-
|
26
|
-
failure_message_when_negated do |described_class|
|
27
|
-
"expected #{described_class} not to extend module #{module_class}"
|
28
|
-
end
|
15
|
+
match { test_subject.singleton_class.included_modules.include? module_class }
|
16
|
+
description { "extended the module #{module_class}" }
|
17
|
+
failure_message { |described_class| "expected #{described_class} to extend module #{module_class}" }
|
18
|
+
failure_message_when_negated { |described_class| "expected #{described_class} not to extend module #{module_class}" }
|
29
19
|
|
30
20
|
def test_subject
|
31
21
|
subject.is_a?(Class) ? subject : subject.class
|
data/lib/rspice/custom_matchers/{have_error_with_detail_key.rb → have_error_on_attribute.rb}
RENAMED
@@ -1,16 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# RSpec matcher
|
3
|
+
# RSpec matcher that tests usages of [ActiveModel::Errors](https://api.rubyonrails.org/classes/ActiveModel/Errors.html)
|
4
4
|
#
|
5
|
-
#
|
5
|
+
# class Klass < ApplicationRecord
|
6
|
+
# validate_uniqueness_of :attribute
|
7
|
+
# end
|
6
8
|
#
|
7
|
-
#
|
8
|
-
#
|
9
|
+
# RSpec.describe Klass, type: :model do
|
10
|
+
# subject(:klass) { model.new(attribute: attribute) }
|
9
11
|
#
|
10
|
-
#
|
12
|
+
# let(:attribute) { "attribute" }
|
11
13
|
#
|
12
|
-
#
|
13
|
-
#
|
14
|
+
# before do
|
15
|
+
# model.create(attribute: attribute)
|
16
|
+
# klass.validate
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# it { is_expected.to have_error_on_attribute(:attribute).with_detail_key(:taken) }
|
20
|
+
# end
|
14
21
|
|
15
22
|
RSpec::Matchers.define :have_error_on_attribute do |attribute|
|
16
23
|
match do |record|
|
@@ -1,31 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# RSpec matcher
|
3
|
+
# RSpec matcher that tests usages of [Module#include](https://apidock.com/ruby/Module/include)
|
4
4
|
#
|
5
|
-
#
|
5
|
+
# module Nodule; end
|
6
|
+
# class Klass
|
7
|
+
# include Nodule
|
8
|
+
# end
|
6
9
|
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# it { is_expected.to include_module ApplicationRecord }
|
11
|
-
# end
|
10
|
+
# RSpec.describe Klass do
|
11
|
+
# it { is_expected.to include_module Nodule }
|
12
|
+
# end
|
12
13
|
|
13
14
|
RSpec::Matchers.define :include_module do |module_class|
|
14
|
-
match
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
description do
|
19
|
-
"included the module #{module_class}"
|
20
|
-
end
|
21
|
-
|
22
|
-
failure_message do |described_class|
|
23
|
-
"expected #{described_class} to include module #{module_class}"
|
24
|
-
end
|
25
|
-
|
26
|
-
failure_message_when_negated do |described_class|
|
27
|
-
"expected #{described_class} not to include module #{module_class}"
|
28
|
-
end
|
15
|
+
match { test_subject.included_modules.include? module_class }
|
16
|
+
description { "included the module #{module_class}" }
|
17
|
+
failure_message { |described_class| "expected #{described_class} to include module #{module_class}" }
|
18
|
+
failure_message_when_negated { |described_class| "expected #{described_class} not to include module #{module_class}" }
|
29
19
|
|
30
20
|
def test_subject
|
31
21
|
subject.is_a?(Class) ? subject : subject.class
|
@@ -1,29 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# RSpec matcher
|
3
|
+
# RSpec matcher that tests tests inheritance of [Classes](https://apidock.com/ruby/Class)
|
4
4
|
#
|
5
|
-
#
|
5
|
+
# class Klass < ApplicationRecord; end
|
6
6
|
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# it { is_expected.to inherit_from ApplicationRecord }
|
11
|
-
# end
|
7
|
+
# RSpec.describe Klass do
|
8
|
+
# it { is_expected.to inherit_from ApplicationRecord }
|
9
|
+
# end
|
12
10
|
|
13
11
|
RSpec::Matchers.define :inherit_from do |superclass|
|
14
|
-
match
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
description do
|
19
|
-
"inherit from #{superclass}"
|
20
|
-
end
|
21
|
-
|
22
|
-
failure_message do
|
23
|
-
"expected #{described_class.name} to inherit from #{superclass}"
|
24
|
-
end
|
12
|
+
match { test_subject.ancestors.include? superclass }
|
13
|
+
description { "inherit from #{superclass}" }
|
14
|
+
failure_message { "expected #{described_class.name} to inherit from #{superclass}" }
|
15
|
+
failure_message_when_negated { "expected #{described_class.name} not to inherit from #{superclass}" }
|
25
16
|
|
26
|
-
|
27
|
-
|
17
|
+
def test_subject
|
18
|
+
subject.is_a?(Class) ? subject : subject.class
|
28
19
|
end
|
29
20
|
end
|
@@ -2,6 +2,6 @@
|
|
2
2
|
|
3
3
|
require "rspice/custom_matchers/alias_method"
|
4
4
|
require "rspice/custom_matchers/extend_module"
|
5
|
-
require "rspice/custom_matchers/
|
5
|
+
require "rspice/custom_matchers/have_error_on_attribute"
|
6
6
|
require "rspice/custom_matchers/include_module"
|
7
7
|
require "rspice/custom_matchers/inherit_from"
|
@@ -1,5 +1,20 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# RSpec context that creates a named descendant of `described_class`
|
4
|
+
#
|
5
|
+
# class Klass; end
|
6
|
+
#
|
7
|
+
# RSpec.describe Klass do
|
8
|
+
# include_context "with an example descendant class"
|
9
|
+
#
|
10
|
+
# let(:example_class_name) { "ChildClass" }
|
11
|
+
#
|
12
|
+
# it "has a descendant class" do
|
13
|
+
# expect(example_class.name).to eq example_class_name
|
14
|
+
# expect(ChildClass).to inherit_from described_class
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
|
3
18
|
RSpec.shared_context "with an example descendant class" do
|
4
19
|
let(:example_class) { Class.new(described_class) }
|
5
20
|
let(:example_class_name) { Faker::Internet.domain_word.capitalize }
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# RSpec context that defines callbacks for [ActiveSupport::Callbacks](https://apidock.com/rails/ActiveSupport/Callbacks)
|
4
|
+
#
|
5
|
+
# class Klass
|
6
|
+
# include ActiveSupport::Callbacks
|
7
|
+
# define_callbacks :kallback
|
8
|
+
#
|
9
|
+
# def call
|
10
|
+
# run_callbacks(:kallback)
|
11
|
+
# end
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# RSpec.describe Klass do
|
15
|
+
# it_behaves_like "a class with callback" do
|
16
|
+
# include_context "with callbacks", :kallback
|
17
|
+
#
|
18
|
+
# subject(:callback_runner) { described_class.new.call }
|
19
|
+
#
|
20
|
+
# let(:example_class) { described_class }
|
21
|
+
# end
|
22
|
+
# end
|
23
|
+
|
24
|
+
RSpec.shared_context "with callbacks" do |callback|
|
25
|
+
before do
|
26
|
+
example_class.attr_accessor :before_hook_run, :around_hook_run, :after_hook_run
|
27
|
+
example_class.set_callback(callback, :before) { |obj| obj.before_hook_run = true }
|
28
|
+
example_class.set_callback(callback, :after) { |obj| obj.after_hook_run = true }
|
29
|
+
example_class.set_callback callback, :around do |obj, block|
|
30
|
+
obj.around_hook_run = true
|
31
|
+
block.call
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# RSpec context that creates a class with [ActiveSupport::Callbacks](https://apidock.com/rails/ActiveSupport/Callbacks)
|
4
|
+
#
|
5
|
+
# module Nodule
|
6
|
+
# def call
|
7
|
+
# run_callbacks(:kallback)
|
8
|
+
# end
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# RSpec.describe Nodule do
|
12
|
+
# describe "#initialize" do
|
13
|
+
# include_context "with example class having callback", :kallback
|
14
|
+
#
|
15
|
+
# subject(:callback_runner) { example_class.new.call }
|
16
|
+
#
|
17
|
+
# let(:example_class) { example_class_having_callback.include(Nodule) }
|
18
|
+
#
|
19
|
+
# it "runs the callbacks" do
|
20
|
+
# expect { callback_runner }.
|
21
|
+
# to change { example.before_hook_run }.from(nil).to(true).
|
22
|
+
# and change { example.around_hook_run }.from(nil).to(true).
|
23
|
+
# and change { example.after_hook_run }.from(nil).to(true)
|
24
|
+
# end
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
|
28
|
+
RSpec.shared_context "with example class having callback" do |callback|
|
29
|
+
let(:example_class_having_callback) do
|
30
|
+
Class.new do
|
31
|
+
include ActiveSupport::Callbacks
|
32
|
+
define_callbacks callback
|
33
|
+
|
34
|
+
class << self
|
35
|
+
attr_accessor :before_hook_run, :around_hook_run, :after_hook_run
|
36
|
+
end
|
37
|
+
|
38
|
+
set_callback(callback, :before) { |obj| obj.class.before_hook_run = true }
|
39
|
+
set_callback(callback, :after) { |obj| obj.class.after_hook_run = true }
|
40
|
+
set_callback callback, :around do |obj, block|
|
41
|
+
obj.class.around_hook_run = true
|
42
|
+
block.call
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -1,5 +1,36 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# RSpec example that tests class methods which take arguments that instantiate and call instance method of the same name
|
4
|
+
#
|
5
|
+
# class Klass
|
6
|
+
# # You can just call `Klass.do_something_extraordinary!(...)`! So convenient!!
|
7
|
+
# def self.do_something_extraordinary!(named_argument, *arguments, **options)
|
8
|
+
# new(named_argument, *arguments, **options).do_something_extraordinary!
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# attr_reader :some, :instance, :params
|
12
|
+
#
|
13
|
+
# def initialize(named_argument, *arguments, **options)
|
14
|
+
# @some = named_argument
|
15
|
+
# @instance = arguments
|
16
|
+
# @params = options
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# def do_something_extraordinary!
|
20
|
+
# # Important things happen here
|
21
|
+
# end
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# RSpec.describe Klass do
|
25
|
+
# describe ".do_something_extraordinary!" do
|
26
|
+
# it_behaves_like "a class pass method", :do_something_extraordinary!
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# describe "#do_something_extraordinary!" do
|
30
|
+
# it "does something important"
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
|
3
34
|
RSpec.shared_examples_for "a class pass method" do |method|
|
4
35
|
subject do
|
5
36
|
if accepts_block?
|
@@ -39,8 +70,4 @@ RSpec.shared_examples_for "a class pass method" do |method|
|
|
39
70
|
end
|
40
71
|
|
41
72
|
it { is_expected.to eq output }
|
42
|
-
|
43
|
-
it "has matching parameters with initialize" do
|
44
|
-
expect(test_class.method(method).parameters).to eq test_class.instance_method(:initialize).parameters
|
45
|
-
end
|
46
73
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# RSpec example that tests usage of [ActiveSupport::Callbacks](https://apidock.com/rails/ActiveSupport/Callbacks)
|
4
|
+
#
|
5
|
+
# module Nodule
|
6
|
+
# def call
|
7
|
+
# run_callbacks(:kallback)
|
8
|
+
# end
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# RSpec.describe Nodule do
|
12
|
+
# include_context "with example class having callback", :kallback
|
13
|
+
#
|
14
|
+
# subject(:instance) { example_class.new }
|
15
|
+
#
|
16
|
+
# let(:example_class) { example_class_having_callback.include(Nodule) }
|
17
|
+
#
|
18
|
+
# it_behaves_like "a class with callback" do
|
19
|
+
# subject(:callback_runner) { instance.call }
|
20
|
+
#
|
21
|
+
# let(:example) { example_class }
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
|
25
|
+
RSpec.shared_examples_for "a class with callback" do
|
26
|
+
it "runs the callbacks" do
|
27
|
+
expect { callback_runner }.
|
28
|
+
to change { example.before_hook_run }.from(nil).to(true).
|
29
|
+
and change { example.around_hook_run }.from(nil).to(true).
|
30
|
+
and change { example.after_hook_run }.from(nil).to(true)
|
31
|
+
end
|
32
|
+
end
|
@@ -1,5 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# RSpec example that ensures gem compliance with internal standard of [Spicerack](https://github.com/Freshly/spicerack/)
|
4
|
+
#
|
5
|
+
# RSpice.describe MyAwesomeGem do
|
6
|
+
# it_behaves_like "a versioned spicerack gem"
|
7
|
+
# end
|
8
|
+
|
3
9
|
RSpec.shared_examples_for "a versioned spicerack gem" do
|
4
10
|
it "has a version number" do
|
5
11
|
expect(described_class::VERSION).to be_a String
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# RSpec example that tests for defined [ActiveSupport::Callbacks](https://apidock.com/rails/ActiveSupport/Callbacks)
|
4
|
+
#
|
5
|
+
# class Klass
|
6
|
+
# include ActiveSupport::Callbacks
|
7
|
+
# define_callbacks :kallback, :on_error
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# RSpec.describe Klass do
|
11
|
+
# it_behaves_like "an example class with callbacks", described_class, %i[kallback on_error]
|
12
|
+
# end
|
13
|
+
|
14
|
+
RSpec.shared_examples_for "an example class with callbacks" do |callback_module, callbacks|
|
15
|
+
subject(:example_class) { Class.new.include callback_module }
|
16
|
+
|
17
|
+
it { is_expected.to include_module ActiveSupport::Callbacks }
|
18
|
+
|
19
|
+
describe "__callbacks" do
|
20
|
+
subject { example_class.__callbacks.keys }
|
21
|
+
|
22
|
+
it { is_expected.to match_array Array.wrap(callbacks) }
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# RSpec example that tests usages of inherited [Class.class_attributes](https://apidock.com/rails/Class/class_attribute)
|
4
|
+
#
|
5
|
+
# class Klass
|
6
|
+
# class_attribute :_attributes, instance_writer: false, default: []
|
7
|
+
#
|
8
|
+
# class << self
|
9
|
+
# def inherited(base)
|
10
|
+
# base._attributes = _attributes.dup
|
11
|
+
# super
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# def define_attribute(attribute)
|
15
|
+
# _attributes << attribute
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
# RSpec.describe Klass do
|
21
|
+
# describe ".inherited" do
|
22
|
+
# it_behaves_like "an inherited property", :define_attribute, :_attributes do
|
23
|
+
# let(:root_class) { example_class }
|
24
|
+
# end
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
|
28
|
+
# rubocop:disable Metrics/BlockLength
|
29
|
+
RSpec.shared_examples_for "an inherited property" do |property, attribute = "_#{property.to_s.pluralize}".to_sym|
|
30
|
+
let(:base_class) do
|
31
|
+
Class.new(root_class).tap { |klass| klass.__send__(property, :base) }
|
32
|
+
end
|
33
|
+
|
34
|
+
let(:parentA_class) do
|
35
|
+
Class.new(base_class).tap { |klass| klass.__send__(property, :parentA) }
|
36
|
+
end
|
37
|
+
|
38
|
+
let(:parentB_class) do
|
39
|
+
Class.new(base_class).tap { |klass| klass.__send__(property, :parentB) }
|
40
|
+
end
|
41
|
+
|
42
|
+
let!(:childA1_class) do
|
43
|
+
Class.new(parentA_class).tap { |klass| klass.__send__(property, :childA1) }
|
44
|
+
end
|
45
|
+
|
46
|
+
let!(:childA2_class) do
|
47
|
+
Class.new(parentA_class).tap { |klass| klass.__send__(property, :childA2) }
|
48
|
+
end
|
49
|
+
|
50
|
+
let!(:childB_class) do
|
51
|
+
Class.new(parentB_class).tap { |klass| klass.__send__(property, :childB) }
|
52
|
+
end
|
53
|
+
|
54
|
+
let(:expected_attribute_value) { expected_property_value }
|
55
|
+
|
56
|
+
shared_examples_for "an object with inherited property" do
|
57
|
+
it "has expected property" do
|
58
|
+
expect(example_class.public_send(attribute)).to match_array expected_attribute_value
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#base_class" do
|
63
|
+
subject(:example_class) { base_class }
|
64
|
+
|
65
|
+
let(:expected_property_value) { %i[base] }
|
66
|
+
|
67
|
+
include_examples "an object with inherited property"
|
68
|
+
end
|
69
|
+
|
70
|
+
describe "#parentA" do
|
71
|
+
subject(:example_class) { parentA_class }
|
72
|
+
|
73
|
+
let(:expected_property_value) { %i[base parentA] }
|
74
|
+
|
75
|
+
include_examples "an object with inherited property"
|
76
|
+
end
|
77
|
+
|
78
|
+
describe "#parentB" do
|
79
|
+
subject(:example_class) { parentB_class }
|
80
|
+
|
81
|
+
let(:expected_property_value) { %i[base parentB] }
|
82
|
+
|
83
|
+
include_examples "an object with inherited property"
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#childA1" do
|
87
|
+
subject(:example_class) { childA1_class }
|
88
|
+
|
89
|
+
let(:expected_property_value) { %i[base parentA childA1] }
|
90
|
+
|
91
|
+
include_examples "an object with inherited property"
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#childA2" do
|
95
|
+
subject(:example_class) { childA2_class }
|
96
|
+
|
97
|
+
let(:expected_property_value) { %i[base parentA childA2] }
|
98
|
+
|
99
|
+
include_examples "an object with inherited property"
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "#childB" do
|
103
|
+
subject(:example_class) { childB_class }
|
104
|
+
|
105
|
+
let(:expected_property_value) { %i[base parentB childB] }
|
106
|
+
|
107
|
+
include_examples "an object with inherited property"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
# rubocop:enable Metrics/BlockLength
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# RSpec example that tests usage of [ActiveSupport::Notification](https://apidock.com/rails/ActiveSupport/Notifications)
|
4
|
+
#
|
5
|
+
# class Klass
|
6
|
+
# def initialize(user)
|
7
|
+
# @user = user
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# def call
|
11
|
+
# ActiveSupport::Notifications.instrument("a_thing_was_done.namespace", user: @user)
|
12
|
+
# end
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# RSpec.describe Klass do
|
16
|
+
# let(:instance) { test_class.new(user) }
|
17
|
+
# let(:user) { double }
|
18
|
+
#
|
19
|
+
# before { instance.call }
|
20
|
+
#
|
21
|
+
# it_behaves_like "an instrumented event", "a_thing_was_done.namespace" do
|
22
|
+
# let(:expected_data) do
|
23
|
+
# { user: user }
|
24
|
+
# end
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
|
28
|
+
RSpec.shared_examples_for "an instrumented event" do |event_name|
|
29
|
+
subject { ActiveSupport::Notifications }
|
30
|
+
|
31
|
+
let(:expected_event) { event_name }
|
32
|
+
let(:expected_args) { [ expected_event ].push(expected_data).compact }
|
33
|
+
let(:expected_data) do
|
34
|
+
{}
|
35
|
+
end
|
36
|
+
|
37
|
+
it { is_expected.to have_received(:instrument).with(*expected_args) }
|
38
|
+
end
|
@@ -1,4 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "rspice/shared_examples/a_class_pass_method"
|
4
|
+
require "rspice/shared_examples/a_class_with_callback"
|
4
5
|
require "rspice/shared_examples/a_versioned_spicerack_gem"
|
6
|
+
require "rspice/shared_examples/an_example_class_with_callbacks"
|
7
|
+
require "rspice/shared_examples/an_inherited_property"
|
8
|
+
require "rspice/shared_examples/an_instrumented_event"
|
data/lib/rspice/version.rb
CHANGED
data/lib/rspice.rb
CHANGED
@@ -3,8 +3,11 @@
|
|
3
3
|
require "rspec"
|
4
4
|
require "faker"
|
5
5
|
|
6
|
+
require "active_support/core_ext/object/inclusion"
|
7
|
+
|
6
8
|
require "rspice/version"
|
7
9
|
|
10
|
+
require "rspice/rspec_configuration"
|
8
11
|
require "rspice/custom_matchers"
|
9
12
|
require "rspice/shared_context"
|
10
13
|
require "rspice/shared_examples"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspice
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Garside
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-04-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -51,14 +51,21 @@ files:
|
|
51
51
|
- lib/rspice/custom_matchers.rb
|
52
52
|
- lib/rspice/custom_matchers/alias_method.rb
|
53
53
|
- lib/rspice/custom_matchers/extend_module.rb
|
54
|
-
- lib/rspice/custom_matchers/
|
54
|
+
- lib/rspice/custom_matchers/have_error_on_attribute.rb
|
55
55
|
- lib/rspice/custom_matchers/include_module.rb
|
56
56
|
- lib/rspice/custom_matchers/inherit_from.rb
|
57
|
+
- lib/rspice/rspec_configuration.rb
|
57
58
|
- lib/rspice/shared_context.rb
|
58
59
|
- lib/rspice/shared_context/with_an_example_descendant_class.rb
|
60
|
+
- lib/rspice/shared_context/with_callbacks.rb
|
61
|
+
- lib/rspice/shared_context/with_example_class_having_callback.rb
|
59
62
|
- lib/rspice/shared_examples.rb
|
60
63
|
- lib/rspice/shared_examples/a_class_pass_method.rb
|
64
|
+
- lib/rspice/shared_examples/a_class_with_callback.rb
|
61
65
|
- lib/rspice/shared_examples/a_versioned_spicerack_gem.rb
|
66
|
+
- lib/rspice/shared_examples/an_example_class_with_callbacks.rb
|
67
|
+
- lib/rspice/shared_examples/an_inherited_property.rb
|
68
|
+
- lib/rspice/shared_examples/an_instrumented_event.rb
|
62
69
|
- lib/rspice/version.rb
|
63
70
|
homepage: https://www.freshly.com
|
64
71
|
licenses:
|