Skip to content

Commit 4db935b

Browse files
committed
feat: add pact-ruby v2 generators
1 parent 88f432b commit 4db935b

File tree

6 files changed

+600
-1
lines changed

6 files changed

+600
-1
lines changed

documentation/README_V2.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,50 @@ For details of the implementation, see [matchers.rb](../lib/pact/v2/matchers.rb)
157157

158158
See the different uses of the matchers in [matchers_spec.rb](../spec/pact/v2/matchers_spec.rb)
159159

160+
### Generators
161+
162+
Generators are helper methods that allow you to specify dynamic values in your contract tests. These values are generated at runtime, making your contracts more flexible and robust. Below are the available generator methods:
163+
164+
For details of the implementation, see [matchers.rb](../lib/pact/v2/generators.rb)
165+
166+
- `generate_random_int(min:, max:)` - Generates a random integer between the specified `min` and `max`.
167+
- `generate_random_decimal(digits:)` - Generates a random decimal number with the specified number of `digits`.
168+
- `generate_random_hexadecimal(digits:)` - Generates a random hexadecimal string with the specified number of `digits`.
169+
- `generate_random_string(size:)` - Generates a random string of the specified `size`.
170+
- `generate_uuid(example: nil)` - Generates a random UUID. Optionally, provide an `example` value.
171+
- `generate_date(format: nil, example: nil)` - Generates a date string in the specified `format`. Optionally, provide an `example`.
172+
- `generate_time(format: nil)` - Generates a time string in the specified `format`.
173+
- `generate_datetime(format: nil)` - Generates a datetime string in the specified `format`.
174+
- `generate_random_boolean` - Generates a random boolean value (`true` or `false`).
175+
- `generate_from_provider_state(expression:)` - Generates a value from the provider state using the given `expression`.
176+
- `generate_mock_server_url(regex: nil, example: nil)` - Generates a mock server URL. Optionally, specify a `regex` matches and/or an `example` value.
177+
178+
These generators can be used in your DSL definitions to provide dynamic values for requests, responses, or messages in your contract tests.
179+
180+
#### Generator Examples
181+
182+
```rb
183+
body: {
184+
_links: {
185+
:'pf:publish-provider-contract' => {
186+
href: generate_mock_server_url(
187+
regex: ".*(\\/provider-contracts\\/provider\\/.*\\/publish)$",
188+
example: "/provider-contracts/provider/{provider}/publish"
189+
),
190+
boolean: generate_random_boolean,
191+
integer: generate_random_int(min: 1, max: 100),
192+
decimal: generate_random_decimal(digits: 2),
193+
hexidecimal: generate_random_hexadecimal(digits: 8),
194+
string: generate_random_string(size: 10),
195+
uuid: generate_uuid,
196+
date: generate_date(format: "yyyyy.MMMMM.dd GGG"),
197+
time: generate_time(),
198+
datetime: generate_datetime(format: "%Y-%m-%dT%H:%M:%S%z")
199+
}
200+
}
201+
}
202+
```
203+
160204
## Provider verification
161205

162206
Place your provider verification file under

lib/pact/v2/consumer/interaction_contents.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,21 @@ def serialize(hash, format)
3333
return hash.as_basic if format == :basic
3434
return hash.as_plugin if format == :plugin
3535
end
36+
if hash.is_a?(Pact::V2::Generators::Base)
37+
return hash.as_basic if format == :basic
38+
return hash.as_plugin if format == :plugin
39+
end
3640
hash.each_pair do |key, value|
3741
next serialize(value, format) if value.is_a?(Hash)
3842
next hash[key] = value.map { |v| serialize(v, format) } if value.is_a?(Array)
3943
if value.is_a?(Pact::V2::Matchers::Base)
4044
hash[key] = value.as_basic if format == :basic
4145
hash[key] = value.as_plugin if format == :plugin
4246
end
47+
if value.is_a?(Pact::V2::Generators::Base)
48+
hash[key] = value.as_basic if format == :basic
49+
hash[key] = value.as_plugin if format == :plugin
50+
end
4351
end
4452

4553
hash

lib/pact/v2/generators.rb

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# frozen_string_literal: true
2+
3+
module Pact
4+
module V2
5+
module Generators
6+
7+
def generate_random_int(min:, max:)
8+
Pact::V2::Generators::RandomIntGenerator.new(min: min, max: max)
9+
end
10+
def generate_random_decimal(digits:)
11+
Pact::V2::Generators::RandomDecimalGenerator.new(digits: digits)
12+
end
13+
def generate_random_hexadecimal(digits:)
14+
Pact::V2::Generators::RandomHexadecimalGenerator.new(digits: digits)
15+
end
16+
def generate_random_string(size:)
17+
Pact::V2::Generators::RandomStringGenerator.new(size: size)
18+
end
19+
20+
def generate_uuid(example: nil)
21+
Pact::V2::Generators::UuidGenerator.new(example: example)
22+
end
23+
24+
def generate_date(format: nil, example: nil)
25+
Pact::V2::Generators::DateGenerator.new(format: format, example: example)
26+
end
27+
28+
def generate_time(format: nil)
29+
Pact::V2::Generators::TimeGenerator.new(format: format)
30+
end
31+
32+
def generate_datetime(format: nil)
33+
Pact::V2::Generators::DateTimeGenerator.new(format: format)
34+
end
35+
36+
def generate_random_boolean
37+
Pact::V2::Generators::RandomBooleanGenerator.new
38+
end
39+
40+
def generate_from_provider_state(expression:)
41+
Pact::V2::Generators::ProviderStateGenerator.new(expression: expression)
42+
end
43+
44+
def generate_mock_server_url(regex: nil, example: nil)
45+
Pact::V2::Generators::MockServerURLGenerator.new(regex: regex, example: example)
46+
end
47+
end
48+
end
49+
end

0 commit comments

Comments
 (0)