rspec-junklet 2.0.1 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.md +17 -1
- data/lib/rspec/junklet/junk.rb +24 -4
- data/lib/rspec/junklet/version.rb +1 -1
- data/lib/rspec/junklet.rb +5 -6
- data/spec/lib/rspec/examples_spec.rb +48 -18
- data/spec/lib/rspec/junklet/junk_spec.rb +5 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NTBkNmE5YzhiNjBkZTE5MTE4OWM5YzAxMzI1NzIwMmUxMjEzNTljOA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZWIxZjZkNTg2NmVhMmVlYjYzYTdkMWJhMDdhYTc4YTIwZmY5MzhkNg==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NmEzM2E4OWJiMWUyOGY4MDM0YWNjN2ZhODlhN2ZkOWM4NjEyOThhMjFkMjM3
|
10
|
+
MmYyOWVkMzU4ZDc2ODIzYTZhYzVmZTdhZTM3YjkyNzE0MmRkNjhmYzAxOTBh
|
11
|
+
OTg1ZjI0ZTk5ODE4NWRmOTA1ZmY1NDA3ODE1Zjg5ZDc2YWEyNWU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YjVhMjU5ODEwNzYzZTg3MTk5YzZhODA4MWU1NTA3NjY5NjRmMGM0ZDdjMjc5
|
14
|
+
NzhiMzJjYjgwYTEyMTcxNzlhYTEyMTA4ODRlOTg0YWE5MWZhOTVlZDBjYWE2
|
15
|
+
OTg3MzdkMmUxZGY2OGE0NjEwZGNlYjg0Y2Y1YWE0ZTllMTBlZmU=
|
data/README.md
CHANGED
@@ -7,7 +7,8 @@ or `junk 4`.
|
|
7
7
|
Junklet data is fixture data that:
|
8
8
|
|
9
9
|
* We essentially don't care about,
|
10
|
-
* But we might
|
10
|
+
* But we might need it to conform to a certain format,
|
11
|
+
* And we might want to test for equality somewhere later,
|
11
12
|
* And we might need to be unique between runs in case a spec crashes and
|
12
13
|
SQLServer fails to clean up the test database
|
13
14
|
|
@@ -230,6 +231,21 @@ let(:otherside) { junk :bool, exclude: coinflip } # Look I never said
|
|
230
231
|
*VERY IMPORTANT CAVEAT* If you exclude all of the possibilities from the random
|
231
232
|
key space, junk will cheerfully go into an infinite loop.
|
232
233
|
|
234
|
+
### Size
|
235
|
+
|
236
|
+
Size constrains the size of the output. It works differently depending on the
|
237
|
+
type of junk:
|
238
|
+
|
239
|
+
* Number of Digits: as documented above, `junk :int, size: 4` will return a
|
240
|
+
4-digit number beginning with 1-9.
|
241
|
+
* Number of Repetitions: For Enumerable and Array junk, where the value of the
|
242
|
+
junk is obtained by picking an element at random, size will make junk return an
|
243
|
+
array containing that many random selections. The same goes for proc, only it
|
244
|
+
will be called that number of times. Note that excluders and formatters will be
|
245
|
+
applied to each element of the array as well.
|
246
|
+
|
247
|
+
|
248
|
+
|
233
249
|
### Format
|
234
250
|
|
235
251
|
A format can be applied to junk data after generation. This lets you change the
|
data/lib/rspec/junklet/junk.rb
CHANGED
@@ -52,11 +52,16 @@ module RSpec
|
|
52
52
|
# FIXME: Raise Argument error unless *args.size is 0-2
|
53
53
|
# FIXME: If arg 1 is a hash, it's the options hash, raise
|
54
54
|
# ArgumentError unless args.size == 1
|
55
|
+
|
56
|
+
# TODO: Nice-to-have feature: if args.second is an :int, assume size.
|
57
|
+
|
55
58
|
# FIXME: If arg 2 present, Raise Argument error unless it's a
|
56
59
|
# hash.
|
60
|
+
|
57
61
|
# FIXME: Figure out what our valid options are and parse them;
|
58
62
|
# raise errors if present.
|
59
63
|
|
64
|
+
repeat = 0
|
60
65
|
junk_types = [Symbol, Array, Enumerable, Proc]
|
61
66
|
if args.size > 0 && junk_types.any? {|klass| args.first.is_a?(klass) }
|
62
67
|
type = args.shift
|
@@ -118,27 +123,42 @@ module RSpec
|
|
118
123
|
when :bool
|
119
124
|
generator = -> { [true, false].sample }
|
120
125
|
when Array, Enumerable
|
126
|
+
repeat = opts[:size] if opts[:size]
|
121
127
|
generator = -> { type.to_a.sample }
|
122
128
|
when Proc
|
129
|
+
repeat = opts[:size] if opts[:size]
|
123
130
|
generator = type
|
124
131
|
else
|
125
132
|
raise "Unrecognized junk type: '#{type}'"
|
126
133
|
end
|
127
134
|
|
128
|
-
|
129
|
-
|
130
|
-
|
135
|
+
val = if repeat.zero?
|
136
|
+
value(generator, formatter, excluder)
|
137
|
+
else
|
138
|
+
repeat.times.map {
|
139
|
+
value(generator, formatter, excluder)
|
140
|
+
}
|
141
|
+
end
|
131
142
|
val
|
132
143
|
else
|
133
144
|
size = args.first.is_a?(Numeric) ? args.first : 32
|
134
145
|
# hex returns size*2 digits, because it returns a 0..255 byte
|
135
|
-
# as a hex pair. But when we want
|
146
|
+
# as a hex pair. But when we want junk, we want *bytes* of
|
136
147
|
# junk. Get (size+1)/2 chars, which will be correct for even
|
137
148
|
# sizes and 1 char too many for odds, so trim off with
|
138
149
|
# [0...size] (note three .'s to trim off final char)
|
139
150
|
SecureRandom.hex((size+1)/2)[0...size]
|
140
151
|
end
|
141
152
|
end
|
153
|
+
|
154
|
+
private
|
155
|
+
|
156
|
+
def value(generator, formatter, excluder)
|
157
|
+
begin
|
158
|
+
v = formatter.call(generator.call)
|
159
|
+
end while excluder.call(v)
|
160
|
+
v
|
161
|
+
end
|
142
162
|
end
|
143
163
|
end
|
144
164
|
end
|
data/lib/rspec/junklet.rb
CHANGED
@@ -2,10 +2,9 @@ require_relative "./junklet/version"
|
|
2
2
|
require_relative "./junklet/junk"
|
3
3
|
require_relative "./junklet/junklet"
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
end
|
5
|
+
# Automatically hook into RSpec when you `include "rspec-junklet"`
|
6
|
+
RSpec.configure do |config|
|
7
|
+
config.extend(RSpec::Junklet::Junklet) # This lets us say junklet() in describes and contexts
|
8
|
+
config.extend(RSpec::Junklet::Junk) # This lets us say junk() in describes and contexts
|
9
|
+
config.include(RSpec::Junklet::Junk) # This lets us say junk() in lets
|
11
10
|
end
|
@@ -1,13 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
# collection of examples so here you go.
|
3
|
+
# Because rspec-junklet extends RSpec, this spec file actually EXERCISES
|
4
|
+
# rspec-junklet instead of testing it directly. You can treat it like a list of
|
5
|
+
# examples or a cheatsheet for how to try things.
|
7
6
|
|
8
7
|
describe RSpec::Junklet do
|
9
|
-
specify { expect(subject).to be }
|
10
|
-
|
11
8
|
let(:hex_regex) { /[\da-f]{32}/ }
|
12
9
|
|
13
10
|
describe '.junklet' do
|
@@ -26,6 +23,10 @@ describe RSpec::Junklet do
|
|
26
23
|
context "with multiple args" do
|
27
24
|
junklet :trash, :toss, :crud, :crap
|
28
25
|
|
26
|
+
# FIXME: if we were to stub out junk here, these examples
|
27
|
+
# could be changed to read
|
28
|
+
# expect(trash).to eq("trash_1234567809etc")
|
29
|
+
# which would document the output MUCH more clearly
|
29
30
|
specify { expect(trash).to match /^trash_/ }
|
30
31
|
specify { expect(trash).to match hex_regex }
|
31
32
|
specify { expect(toss).to match /^toss_/ }
|
@@ -77,32 +78,61 @@ describe RSpec::Junklet do
|
|
77
78
|
end
|
78
79
|
end
|
79
80
|
|
81
|
+
shared_examples_for "repeatable junk" do
|
82
|
+
it "returns an array" do
|
83
|
+
expect(subject).to be_a(Array)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "returns an array of that size" do
|
87
|
+
expect(subject.size).to eq(3)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "each element of the array is junk" do
|
91
|
+
expect(subject.all? {|i| [0,1,2].include? i}).to be_truthy
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
80
95
|
context "with type: array" do
|
81
|
-
|
96
|
+
subject { junk [:a, :b, :c] }
|
82
97
|
it "returns a random element of the array" do
|
83
|
-
expect([:a, :b, :c]).to include(
|
98
|
+
expect([:a, :b, :c]).to include(subject)
|
84
99
|
end
|
85
100
|
|
86
101
|
context "with excludes" do
|
87
|
-
let(:
|
88
|
-
|
102
|
+
let(:subject) { junk [:a, :b, :c], exclude: [:a, :b] }
|
103
|
+
it "does not return excluded values" do
|
104
|
+
expect(subject).to eq(:c)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context "with size" do
|
109
|
+
subject { junk [0, 1, 2], size: 3 }
|
110
|
+
it_behaves_like "repeatable junk"
|
89
111
|
end
|
90
112
|
end
|
91
113
|
|
92
114
|
context "with type: Proc" do
|
93
|
-
|
94
|
-
|
115
|
+
subject { junk(->{ rand(3) }) }
|
116
|
+
it "calls the proc" do
|
117
|
+
expect([0, 1, 2]).to include(subject)
|
118
|
+
end
|
95
119
|
|
96
|
-
context "with
|
97
|
-
|
98
|
-
|
120
|
+
context "with size" do
|
121
|
+
subject { junk(->{ rand(3) }, size: 3 ) }
|
122
|
+
it_behaves_like "repeatable junk"
|
99
123
|
end
|
100
124
|
end
|
101
125
|
|
102
126
|
context "with type: enumerable" do
|
103
|
-
|
104
|
-
|
105
|
-
|
127
|
+
subject { junk 0..2 }
|
128
|
+
|
129
|
+
it "takes a sample from the enumerable" do
|
130
|
+
expect([0,1,2]).to include(subject)
|
131
|
+
end
|
132
|
+
|
133
|
+
context "with size" do
|
134
|
+
subject { junk 0..2, size: 3 }
|
135
|
+
it_behaves_like "repeatable junk"
|
106
136
|
end
|
107
137
|
end
|
108
138
|
|
@@ -170,6 +170,11 @@ describe JunkSpy do
|
|
170
170
|
end
|
171
171
|
|
172
172
|
|
173
|
+
# BUG: this special case of format does not work:
|
174
|
+
# doubled_string = junk 6, format: ->(x) { x * 2 })
|
175
|
+
# expect(doubled_string.size).to eq(12) # nope, it's 6
|
176
|
+
# junk 6, format: ->(x) { x.upcase } # also returns x unmodified
|
177
|
+
|
173
178
|
context "when format is a Proc" do
|
174
179
|
let(:junk) { subject.junk [3], format: ->(x) { x * 3 } }
|
175
180
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-junklet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Brady
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|