pseudo 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: