pseudo 1.0.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0389190263380a876dc7386958f563a0af0ac44c
4
+ data.tar.gz: 91d00d54c1862f6e58bf4f3469147250cf4aae7e
5
+ SHA512:
6
+ metadata.gz: c10ee7146baee4b6b58d1ec784c9a27184008438bc3da01e765e34e5c7e05306c5f4b3c63ded737ca179fd5bc4f6e2030bc91363178e3d4ae97b9975214ea60f
7
+ data.tar.gz: 45b0ba775e68578c766d54284060f90fcc18d4db8fd88d5c6c868353dbb3a56ee57cff97bd07bd141d340250bd284c86a2e6ed266cc2cdb575d50c6ccdcf16f1
data/lib/pseudo.rb ADDED
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Pseudo a very simple test double that supports stubbing and spies
4
+ class Pseudo
5
+ overridden_methods = %i(
6
+ object_id
7
+ respond_to_missing?
8
+ ===
9
+ inspect
10
+ to_s
11
+ public_send
12
+ send
13
+ to_s
14
+ )
15
+
16
+ UNSTUBBED_ERROR_MESSAGE = 'unstubbed method %p, expected one of %p'.freeze
17
+ VERY_PRIVATE_METHOD_PREFIX = '__'.freeze
18
+
19
+ overridden_methods.each do |overridden_method|
20
+ define_method overridden_method do |*arguments, &block|
21
+ if @stubs.key? overridden_method
22
+ method_missing(overridden_method, *arguments, &block)
23
+ else
24
+ super(*arguments, &block)
25
+ end
26
+ end
27
+ end
28
+
29
+ instance_methods.each do |instance_method|
30
+ unless overridden_methods.include?(instance_method) ||
31
+ instance_method.to_s.start_with?(VERY_PRIVATE_METHOD_PREFIX)
32
+ undef_method instance_method
33
+ end
34
+ end
35
+
36
+ def initialize
37
+ @stubs = {}
38
+ @received = {}
39
+ end
40
+
41
+ def stub(name)
42
+ @stubs[name] = Stub.new
43
+ end
44
+
45
+ def method_missing(symbol, *arguments, &block)
46
+ if @stubs.key?(symbol)
47
+ @received[symbol] = arguments
48
+ @stubs[symbol].act(&block)
49
+ else
50
+ fail NoMethodError, Kernel.format(
51
+ UNSTUBBED_ERROR_MESSAGE, symbol, @stubs.keys)
52
+ end
53
+ end
54
+
55
+ def received?(message)
56
+ @received.include?(message)
57
+ end
58
+
59
+ def received_with?(message, *arguments)
60
+ @received.fetch(message) { return false } == arguments
61
+ end
62
+
63
+ def respond_to?(symbol, include_private = false)
64
+ return true if @stubs.key?(symbol)
65
+ super
66
+ end
67
+
68
+ # A method stub
69
+ class Stub
70
+ def return(value)
71
+ @returns = value
72
+ end
73
+
74
+ def raise(*arguments)
75
+ @raises = arguments
76
+ end
77
+
78
+ def yield(value)
79
+ @yields = value
80
+ end
81
+
82
+ def act
83
+ return @returns if defined? @returns
84
+ Kernel.fail(*@raises) if defined? @raises
85
+ yield(@yields) if defined?(@yields) && block_given?
86
+ nil
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Pseudo
4
+ VERSION = '1.0.0'.freeze
5
+ end
@@ -0,0 +1,139 @@
1
+ require 'test_helper'
2
+
3
+ class PseudoTest < Minitest::Test
4
+ parallelize_me!
5
+
6
+ def setup
7
+ @double = Pseudo.new
8
+ end
9
+
10
+ def test_that_it_has_a_version_number
11
+ refute_nil Pseudo::VERSION
12
+ end
13
+
14
+ def test_stubs_respond_to_stubbed_methods
15
+ @double.stub(:stubbed_method)
16
+
17
+ assert_respond_to @double, :stubbed_method
18
+ end
19
+
20
+ def test_stubs_return_nil_by_default
21
+ @double.stub(:default_stub)
22
+
23
+ assert_nil @double.default_stub
24
+ end
25
+
26
+ def test_stubs_are_local_to_double
27
+ @double.stub(:old_stub)
28
+ new_double = Pseudo.new
29
+
30
+ refute_respond_to new_double, :old_stub
31
+ end
32
+
33
+ def test_stubs_return_values
34
+ @double.stub(:stub_with_return).return(123)
35
+
36
+ assert_equal 123, @double.stub_with_return
37
+ end
38
+
39
+ def test_stubs_raise_exceptions
40
+ @double.stub(:stub_with_raise).raise(ArgumentError, 'bad argument')
41
+
42
+ exception = assert_raises(ArgumentError) { @double.stub_with_raise }
43
+ assert_equal 'bad argument', exception.message
44
+ end
45
+
46
+ def test_stubs_yield
47
+ @double.stub(:stub_with_yield).yield(456)
48
+
49
+ yielded = nil
50
+ @double.stub_with_yield { |value| yielded = value }
51
+
52
+ assert_equal 456, yielded
53
+ end
54
+
55
+ def test_mocks_record_received
56
+ @double.stub(:record_it)
57
+ @double.stub(:never_called)
58
+
59
+ @double.record_it
60
+
61
+ assert_equal true, @double.received?(:record_it)
62
+ assert_equal false, @double.received?(:never_called)
63
+ end
64
+
65
+ def test_doubles_record_received_with_arguments
66
+ @double.stub(:record_it)
67
+
68
+ @double.record_it(:argument)
69
+
70
+ assert_equal true, @double.received_with?(:record_it, :argument)
71
+ assert_equal false, @double.received_with?(:record_it, :joke)
72
+ end
73
+
74
+ def test_keeps_double_underscored_method_definitions
75
+ assert_respond_to @double, :__send__
76
+ end
77
+
78
+ def test_stubbing_object_id
79
+ @double.stub(:object_id).return('received object_id')
80
+
81
+ assert_equal 'received object_id', @double.object_id
82
+ end
83
+
84
+ def test_stubbing_respond_to_missing
85
+ @double.stub(:respond_to_missing?).return('received respond_to_missing?')
86
+
87
+ assert_equal 'received respond_to_missing?', @double.respond_to_missing?
88
+ end
89
+
90
+ def test_stubbing_case_equality
91
+ @double.stub(:===).return('received ===')
92
+
93
+ assert_equal 'received ===', @double.===
94
+ end
95
+
96
+ def test_stubbing_inspect
97
+ @double.stub(:inspect).return('received inspect')
98
+
99
+ assert_equal 'received inspect', @double.inspect
100
+ end
101
+
102
+ def test_stubbing_to_s
103
+ @double.stub(:to_s).return('received to_s')
104
+
105
+ assert_equal 'received to_s', @double.to_s
106
+ end
107
+
108
+ def test_stubbing_public_send
109
+ @double.stub(:public_send).return('received public_send')
110
+
111
+ assert_equal 'received public_send', @double.public_send
112
+ end
113
+
114
+ def test_stubbing_send
115
+ @double.stub(:send).return('received send')
116
+
117
+ assert_equal 'received send', @double.send
118
+ end
119
+
120
+ def test_send_returns_stubbed_return_value
121
+ @double.stub(:sendable).return(123)
122
+
123
+ assert_equal 123, @double.send(:sendable)
124
+ end
125
+
126
+ def test_public_send_returns_stubbed_return_value
127
+ @double.stub(:sendable).return(123)
128
+
129
+ assert_equal 123, @double.send(:sendable)
130
+ end
131
+
132
+ def test_raises_no_method_error_on_unstubbed_methods
133
+ @double.stub(:stubbed)
134
+
135
+ exception = assert_raises(NoMethodError) { @double.unstubbed }
136
+ assert_equal 'unstubbed method :unstubbed, expected one of [:stubbed]',
137
+ exception.message
138
+ end
139
+ end
@@ -0,0 +1,5 @@
1
+ require 'codeclimate-test-reporter'
2
+ CodeClimate::TestReporter.start
3
+
4
+ require 'pseudo'
5
+ require 'minitest/autorun'
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pseudo
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Nate Smith
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-07-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: codeclimate-test-reporter
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.6.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.6.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 5.9.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 5.9.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 11.2.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
68
+ version: 11.2.2
69
+ description: Pseudo supports stubs and spy-style message expectations.
70
+ email:
71
+ - nwjsmith@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - lib/pseudo.rb
77
+ - lib/pseudo/version.rb
78
+ - test/pseudo_test.rb
79
+ - test/test_helper.rb
80
+ homepage: https://github.com/nwjsmith/pseudo
81
+ licenses:
82
+ - MIT
83
+ metadata: {}
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 2.0.0
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ requirements: []
99
+ rubyforge_project:
100
+ rubygems_version: 2.6.4
101
+ signing_key:
102
+ specification_version: 4
103
+ summary: A mocking library that doesn't support bad tests.
104
+ test_files:
105
+ - test/pseudo_test.rb
106
+ - test/test_helper.rb
107
+ has_rdoc: