rspice 0.6.3 → 0.6.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Maintainability](https://api.codeclimate.com/v1/badges/7e089c2617c530a85b17/maintainability)](https://codeclimate.com/github/Freshly/spicerack/maintainability)
|
6
6
|
[![Test Coverage](https://api.codeclimate.com/v1/badges/7e089c2617c530a85b17/test_coverage)](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:
|