Skip to content

Commit 8a3efd7

Browse files
author
Ronald Holshausen
committedApr 4, 2020
feat: allow provider state expressions to have a basic type #1061
1 parent 1d60338 commit 8a3efd7

File tree

15 files changed

+210
-107
lines changed

15 files changed

+210
-107
lines changed
 

‎consumer/pact-jvm-consumer-groovy/src/main/groovy/au/com/dius/pact/consumer/groovy/PactBodyBuilder.groovy

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import au.com.dius.pact.core.model.generators.ProviderStateGenerator
77
import au.com.dius.pact.core.model.matchingrules.Category
88
import au.com.dius.pact.core.model.matchingrules.MatchingRuleGroup
99
import au.com.dius.pact.core.model.matchingrules.RuleLogic
10+
import au.com.dius.pact.core.support.expressions.DataType
1011
import groovy.json.JsonBuilder
1112
import org.apache.commons.lang3.StringUtils
1213

@@ -128,7 +129,7 @@ class PactBodyBuilder extends BaseBuilder {
128129
} else if (value instanceof GeneratedValue) {
129130
bodyRepresentation[name] = value.exampleValue
130131
this.generators.addGenerator(au.com.dius.pact.core.model.generators.Category.BODY, path + buildPath(name),
131-
new ProviderStateGenerator(value.expression))
132+
new ProviderStateGenerator(value.expression, DataType.from(value.exampleValue)))
132133
setMatcherAttribute(new TypeMatcher(), path + buildPath(matcherName))
133134
} else {
134135
bodyRepresentation[name] = value

‎consumer/pact-jvm-consumer-groovy/src/main/groovy/au/com/dius/pact/consumer/groovy/PactBuilder.groovy

+4-3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import au.com.dius.pact.core.model.matchingrules.Category
2121
import au.com.dius.pact.core.model.matchingrules.MatchingRules
2222
import au.com.dius.pact.core.model.matchingrules.MatchingRulesImpl
2323
import au.com.dius.pact.core.model.matchingrules.RegexMatcher
24+
import au.com.dius.pact.core.support.expressions.DataType
2425
import groovy.json.JsonBuilder
2526
import groovy.transform.CompileStatic
2627
import org.apache.http.entity.ContentType
@@ -160,7 +161,7 @@ class PactBuilder extends BaseBuilder {
160161
[key, [matcher.value]]
161162
} else if (value instanceof GeneratedValue) {
162163
generators.addGenerator(au.com.dius.pact.core.model.generators.Category.HEADER, key,
163-
new ProviderStateGenerator(value.expression))
164+
new ProviderStateGenerator(value.expression, DataType.STRING))
164165
[key, [value.exampleValue]]
165166
} else {
166167
[key, value instanceof List ? value : [value]]
@@ -179,7 +180,7 @@ class PactBuilder extends BaseBuilder {
179180
matcher.value
180181
} else if (path instanceof GeneratedValue) {
181182
generators.addGenerator(au.com.dius.pact.core.model.generators.Category.PATH,
182-
new ProviderStateGenerator(path.expression))
183+
new ProviderStateGenerator(path.expression, DataType.STRING))
183184
path.exampleValue
184185
} else {
185186
path as String
@@ -198,7 +199,7 @@ class PactBuilder extends BaseBuilder {
198199
[key, [matcher.value]]
199200
} else if (value[0] instanceof GeneratedValue) {
200201
generators.addGenerator(au.com.dius.pact.core.model.generators.Category.QUERY, key,
201-
new ProviderStateGenerator(value[0].expression))
202+
new ProviderStateGenerator(value[0].expression, DataType.STRING))
202203
[key, [value[0].exampleValue]]
203204
} else {
204205
[key, value]

‎consumer/pact-jvm-consumer-groovy/src/test/groovy/au/com/dius/pact/consumer/groovy/ProviderStateInjectedPactTest.groovy

+4-3
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,13 @@ class ProviderStateInjectedPactTest {
6464
'/shoppingCart/v2.0/shoppingCart/ShoppingCart_05540051-1155-4557-8080-008a802200aa'
6565
def generators = interaction.request.generators
6666
assert generators == [
67-
path: [type: 'ProviderState', expression: '/shoppingCart/v2.0/shoppingCart/${shoppingcartId}']
67+
path: [type: 'ProviderState', expression: '/shoppingCart/v2.0/shoppingCart/${shoppingcartId}',
68+
'dataType': 'STRING']
6869
]
6970
generators = interaction.response.generators
7071
assert generators == [
71-
body: ['$.userId': [type: 'ProviderState', expression: 'userId']],
72-
header: [LOCATION: [type: 'ProviderState', expression: 'http://server/users/${userId}']]
72+
body: ['$.userId': [type: 'ProviderState', expression: 'userId', 'dataType': 'INTEGER']],
73+
header: [LOCATION: [type: 'ProviderState', expression: 'http://server/users/${userId}', 'dataType': 'STRING']]
7374
]
7475
}
7576
}

‎consumer/pact-jvm-consumer-junit5/src/test/groovy/au/com/dius/pact/consumer/junit5/ProviderStateInjectedPactTest.groovy

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ class ProviderStateInjectedPactTest {
5353
assert json.metadata.pactSpecification.version == '3.0.0'
5454
def generators = json.interactions.first().response.generators
5555
assert generators == [
56-
body: ['$.userId': [type: 'ProviderState', expression: 'userId']],
57-
header: [LOCATION: [type: 'ProviderState', expression: 'http://server/users/${userId}']]
56+
body: ['$.userId': [type: 'ProviderState', expression: 'userId', dataType: 'INTEGER']],
57+
header: [LOCATION: [type: 'ProviderState', expression: 'http://server/users/${userId}', dataType: 'STRING']]
5858
]
5959
}
6060
}

‎consumer/pact-jvm-consumer/src/main/java/au/com/dius/pact/consumer/dsl/PactDslJsonArray.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import au.com.dius.pact.core.model.matchingrules.NumberTypeMatcher;
2020
import au.com.dius.pact.core.model.matchingrules.RuleLogic;
2121
import au.com.dius.pact.core.model.matchingrules.TypeMatcher;
22+
import au.com.dius.pact.core.support.expressions.DataType;
2223
import com.mifmif.common.regex.Generex;
2324
import org.apache.commons.lang3.time.DateFormatUtils;
2425
import org.apache.commons.lang3.time.FastDateFormat;
@@ -1233,7 +1234,8 @@ public PactDslJsonArray eachArrayWithMinMaxLike(int numberExamples, Integer minS
12331234
*/
12341235
public PactDslJsonArray valueFromProviderState(String expression, Object example) {
12351236
body.put(example);
1236-
generators.addGenerator(Category.BODY, rootPath + appendArrayIndex(0), new ProviderStateGenerator(expression));
1237+
generators.addGenerator(Category.BODY, rootPath + appendArrayIndex(0),
1238+
new ProviderStateGenerator(expression, DataType.from(example)));
12371239
matchers.addRule(rootPath + appendArrayIndex(0), TypeMatcher.INSTANCE);
12381240
return this;
12391241
}

‎consumer/pact-jvm-consumer/src/main/java/au/com/dius/pact/consumer/dsl/PactDslJsonBody.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import au.com.dius.pact.core.model.matchingrules.RuleLogic;
2323
import au.com.dius.pact.core.model.matchingrules.TypeMatcher;
2424
import au.com.dius.pact.core.model.matchingrules.ValuesMatcher;
25+
import au.com.dius.pact.core.support.expressions.DataType;
2526
import com.mifmif.common.regex.Generex;
2627

2728
import java.time.Instant;
@@ -1296,7 +1297,7 @@ public PactDslJsonBody minMaxArrayLike(String name, Integer minSize, Integer max
12961297
* @param example Example value to be used in the consumer test
12971298
*/
12981299
public PactDslJsonBody valueFromProviderState(String name, String expression, Object example) {
1299-
generators.addGenerator(Category.BODY, matcherKey(name), new ProviderStateGenerator(expression));
1300+
generators.addGenerator(Category.BODY, matcherKey(name), new ProviderStateGenerator(expression, DataType.from(example)));
13001301
body.put(name, example);
13011302
matchers.addRule(matcherKey(name), TypeMatcher.INSTANCE);
13021303
return this;

‎consumer/pact-jvm-consumer/src/main/java/au/com/dius/pact/consumer/dsl/PactDslJsonRootValue.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import au.com.dius.pact.core.model.matchingrules.RuleLogic;
2121
import au.com.dius.pact.core.model.matchingrules.TypeMatcher;
2222
import au.com.dius.pact.core.support.Json;
23+
import au.com.dius.pact.core.support.expressions.DataType;
2324
import com.mifmif.common.regex.Generex;
2425
import org.apache.commons.lang3.time.DateFormatUtils;
2526
import org.apache.commons.lang3.time.FastDateFormat;
@@ -844,7 +845,7 @@ public PactDslJsonRootValue matchUrl(String basePath, Object... pathFragments) {
844845
*/
845846
public static PactDslJsonRootValue valueFromProviderState(String expression, Object example) {
846847
PactDslJsonRootValue value = new PactDslJsonRootValue();
847-
value.generators.addGenerator(Category.BODY, "", new ProviderStateGenerator(expression));
848+
value.generators.addGenerator(Category.BODY, "", new ProviderStateGenerator(expression, DataType.from(example)));
848849
value.setValue(example);
849850
value.setMatcher(TypeMatcher.INSTANCE);
850851
return value;

‎consumer/pact-jvm-consumer/src/main/java/au/com/dius/pact/consumer/dsl/PactDslRequestWithPath.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import au.com.dius.pact.core.model.generators.ProviderStateGenerator;
1212
import au.com.dius.pact.core.model.matchingrules.MatchingRules;
1313
import au.com.dius.pact.core.model.matchingrules.RegexMatcher;
14+
import au.com.dius.pact.core.support.expressions.DataType;
1415
import com.mifmif.common.regex.Generex;
1516
import org.apache.commons.lang3.time.DateFormatUtils;
1617
import org.apache.http.entity.ContentType;
@@ -451,7 +452,7 @@ public PactDslRequestWithPath withFileUpload(String partName, String fileName, S
451452
* @param example Example value to use in the consumer test
452453
*/
453454
public PactDslRequestWithPath headerFromProviderState(String name, String expression, String example) {
454-
requestGenerators.addGenerator(Category.HEADER, name, new ProviderStateGenerator(expression));
455+
requestGenerators.addGenerator(Category.HEADER, name, new ProviderStateGenerator(expression, DataType.STRING));
455456
requestHeaders.put(name, Collections.singletonList(example));
456457
return this;
457458
}
@@ -463,7 +464,7 @@ public PactDslRequestWithPath headerFromProviderState(String name, String expres
463464
* @param example Example value to use in the consumer test
464465
*/
465466
public PactDslRequestWithPath queryParameterFromProviderState(String name, String expression, String example) {
466-
requestGenerators.addGenerator(Category.QUERY, name, new ProviderStateGenerator(expression));
467+
requestGenerators.addGenerator(Category.QUERY, name, new ProviderStateGenerator(expression, DataType.STRING));
467468
query.put(name, Collections.singletonList(example));
468469
return this;
469470
}
@@ -474,7 +475,7 @@ public PactDslRequestWithPath queryParameterFromProviderState(String name, Strin
474475
* @param example Example value to use in the consumer test
475476
*/
476477
public PactDslRequestWithPath pathFromProviderState(String expression, String example) {
477-
requestGenerators.addGenerator(Category.PATH, new ProviderStateGenerator(expression));
478+
requestGenerators.addGenerator(Category.PATH, new ProviderStateGenerator(expression, DataType.STRING));
478479
this.path = example;
479480
return this;
480481
}

‎consumer/pact-jvm-consumer/src/main/java/au/com/dius/pact/consumer/dsl/PactDslRequestWithoutPath.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import au.com.dius.pact.core.model.generators.Category;
77
import au.com.dius.pact.core.model.generators.ProviderStateGenerator;
88
import au.com.dius.pact.core.model.matchingrules.RegexMatcher;
9+
import au.com.dius.pact.core.support.expressions.DataType;
910
import com.mifmif.common.regex.Generex;
1011
import org.apache.commons.lang3.time.DateFormatUtils;
1112
import org.apache.http.entity.ContentType;
@@ -316,7 +317,7 @@ public PactDslRequestWithoutPath withFileUpload(String partName, String fileName
316317
* @param example Example value to use in the consumer test
317318
*/
318319
public PactDslRequestWithoutPath headerFromProviderState(String name, String expression, String example) {
319-
requestGenerators.addGenerator(Category.HEADER, name, new ProviderStateGenerator(expression));
320+
requestGenerators.addGenerator(Category.HEADER, name, new ProviderStateGenerator(expression, DataType.STRING));
320321
requestHeaders.put(name, Collections.singletonList(example));
321322
return this;
322323
}
@@ -328,7 +329,7 @@ public PactDslRequestWithoutPath headerFromProviderState(String name, String exp
328329
* @param example Example value to use in the consumer test
329330
*/
330331
public PactDslRequestWithoutPath queryParameterFromProviderState(String name, String expression, String example) {
331-
requestGenerators.addGenerator(Category.QUERY, name, new ProviderStateGenerator(expression));
332+
requestGenerators.addGenerator(Category.QUERY, name, new ProviderStateGenerator(expression, DataType.STRING));
332333
query.put(name, Collections.singletonList(example));
333334
return this;
334335
}
@@ -339,7 +340,7 @@ public PactDslRequestWithoutPath queryParameterFromProviderState(String name, St
339340
* @param example Example value to use in the consumer test
340341
*/
341342
public PactDslRequestWithPath pathFromProviderState(String expression, String example) {
342-
requestGenerators.addGenerator(Category.PATH, new ProviderStateGenerator(expression));
343+
requestGenerators.addGenerator(Category.PATH, new ProviderStateGenerator(expression, DataType.STRING));
343344
return new PactDslRequestWithPath(consumerPactBuilder, consumerName, providerName, pactDslWithState.state,
344345
description, example, requestMethod, requestHeaders, query, requestBody, requestMatchers, requestGenerators,
345346
defaultRequestValues, defaultResponseValues);

‎consumer/pact-jvm-consumer/src/main/java/au/com/dius/pact/consumer/dsl/PactDslResponse.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import au.com.dius.pact.core.model.matchingrules.MatchingRulesImpl;
1515
import au.com.dius.pact.core.model.matchingrules.RegexMatcher;
1616
import au.com.dius.pact.core.model.matchingrules.RuleLogic;
17+
import au.com.dius.pact.core.support.expressions.DataType;
1718
import com.mifmif.common.regex.Generex;
1819
import org.apache.http.entity.ContentType;
1920
import org.json.JSONObject;
@@ -353,7 +354,7 @@ public PactDslWithState given(String state, Map<String, Object> params) {
353354
* @param example Example value to use in the consumer test
354355
*/
355356
public PactDslResponse headerFromProviderState(String name, String expression, String example) {
356-
responseGenerators.addGenerator(Category.HEADER, name, new ProviderStateGenerator(expression));
357+
responseGenerators.addGenerator(Category.HEADER, name, new ProviderStateGenerator(expression, DataType.STRING));
357358
responseHeaders.put(name, Collections.singletonList(example));
358359
return this;
359360
}

‎consumer/pact-jvm-consumer/src/main/java/au/com/dius/pact/consumer/dsl/PactDslRootValue.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import au.com.dius.pact.core.model.matchingrules.NumberTypeMatcher;
1818
import au.com.dius.pact.core.model.matchingrules.RuleLogic;
1919
import au.com.dius.pact.core.model.matchingrules.TypeMatcher;
20+
import au.com.dius.pact.core.support.expressions.DataType;
2021
import com.mifmif.common.regex.Generex;
2122
import org.apache.commons.lang3.time.DateFormatUtils;
2223
import org.apache.commons.lang3.time.FastDateFormat;
@@ -774,7 +775,7 @@ public static PactDslRootValue or(Object example, MatchingRule... rules) {
774775
*/
775776
public static PactDslRootValue valueFromProviderState(String expression, Object example) {
776777
PactDslRootValue value = new PactDslRootValue();
777-
value.generators.addGenerator(Category.BODY, "", new ProviderStateGenerator(expression));
778+
value.generators.addGenerator(Category.BODY, "", new ProviderStateGenerator(expression, DataType.from(example)));
778779
value.setValue(example);
779780
return value;
780781
}

‎core/model/src/main/kotlin/au/com/dius/pact/core/model/generators/Generator.kt

+11-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package au.com.dius.pact.core.model.generators
33
import au.com.dius.pact.com.github.michaelbull.result.getOr
44
import au.com.dius.pact.core.model.PactSpecVersion
55
import au.com.dius.pact.core.support.Json
6+
import au.com.dius.pact.core.support.expressions.DataType
67
import au.com.dius.pact.core.support.expressions.ExpressionParser.containsExpressions
78
import au.com.dius.pact.core.support.expressions.ExpressionParser.parseExpression
89
import au.com.dius.pact.core.support.expressions.MapValueResolver
@@ -352,17 +353,20 @@ object RandomBooleanGenerator : Generator {
352353
/**
353354
* Generates a value that is looked up from the provider state context
354355
*/
355-
data class ProviderStateGenerator(val expression: String) : Generator {
356+
data class ProviderStateGenerator @JvmOverloads constructor (
357+
val expression: String,
358+
val type: DataType = DataType.RAW
359+
) : Generator {
356360
override fun toMap(pactSpecVersion: PactSpecVersion): Map<String, Any> {
357-
return mapOf("type" to "ProviderState", "expression" to expression)
361+
return mapOf("type" to "ProviderState", "expression" to expression, "dataType" to type.name)
358362
}
359363

360364
override fun generate(context: Map<String, Any?>): Any? {
361365
return when (val providerState = context["providerState"]) {
362366
is Map<*, *> -> {
363367
val map = providerState as Map<String, Any>
364368
if (containsExpressions(expression)) {
365-
parseExpression(expression, MapValueResolver(map))
369+
parseExpression(expression, type, MapValueResolver(map))
366370
} else {
367371
map[expression]
368372
}
@@ -374,6 +378,9 @@ data class ProviderStateGenerator(val expression: String) : Generator {
374378
override fun correspondsToMode(mode: GeneratorTestMode) = mode == GeneratorTestMode.Provider
375379

376380
companion object {
377-
fun fromJson(json: JsonObject) = ProviderStateGenerator(Json.toString(json["expression"]))
381+
fun fromJson(json: JsonObject) = ProviderStateGenerator(
382+
Json.toString(json["expression"]),
383+
if (json.has("dataType")) DataType.valueOf(Json.toString(json["dataType"])) else DataType.RAW
384+
)
378385
}
379386
}

‎core/support/src/main/kotlin/au/com/dius/pact/core/support/expressions/ExpressionParser.kt

+43
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,41 @@
11
package au.com.dius.pact.core.support.expressions
22

3+
import java.lang.Double.parseDouble
4+
import java.lang.Long.parseLong
5+
import java.math.BigDecimal
6+
import java.math.BigInteger
37
import java.util.StringJoiner
48

9+
enum class DataType {
10+
STRING,
11+
INTEGER,
12+
DECIMAL,
13+
FLOAT,
14+
RAW;
15+
16+
fun convert(value: Any) = when (this) {
17+
INTEGER -> if (value is Number) value.toLong() else parseLong(value.toString())
18+
DECIMAL -> BigDecimal(value.toString())
19+
FLOAT -> if (value is Number) value.toDouble() else parseDouble(value.toString())
20+
STRING -> value.toString()
21+
else -> value
22+
}
23+
24+
companion object {
25+
@JvmStatic
26+
fun from(example: Any) = when (example) {
27+
is Int -> INTEGER
28+
is Long -> INTEGER
29+
is BigInteger -> INTEGER
30+
is Float -> FLOAT
31+
is Double -> FLOAT
32+
is BigDecimal -> DECIMAL
33+
is String -> STRING
34+
else -> RAW
35+
}
36+
}
37+
}
38+
539
object ExpressionParser {
640

741
const val VALUES_SEPARATOR = ","
@@ -16,12 +50,21 @@ object ExpressionParser {
1650

1751
@JvmOverloads
1852
@JvmStatic
53+
@Deprecated(message = "Use version that takes a data type parameter")
1954
fun parseExpression(value: String?, valueResolver: ValueResolver = SystemPropertyResolver()): String? {
2055
return if (containsExpressions(value)) {
2156
replaceExpressions(value!!, valueResolver)
2257
} else value
2358
}
2459

60+
@JvmOverloads
61+
@JvmStatic
62+
fun parseExpression(value: String?, type: DataType, valueResolver: ValueResolver = SystemPropertyResolver()): Any? {
63+
return if (containsExpressions(value)) {
64+
type.convert(replaceExpressions(value!!, valueResolver))
65+
} else value
66+
}
67+
2568
fun containsExpressions(value: String?) = value != null && value.contains(START_EXPRESSION)
2669

2770
private fun replaceExpressions(value: String, valueResolver: ValueResolver): String {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package au.com.dius.pact.core.support.expressions
2+
3+
import spock.lang.Specification
4+
import spock.lang.Unroll
5+
6+
import static ExpressionParser.VALUES_SEPARATOR
7+
8+
@SuppressWarnings('GStringExpressionWithinString')
9+
class ExpressionParserSpec extends Specification {
10+
11+
private ValueResolver valueResolver
12+
13+
def setup() {
14+
valueResolver = [
15+
resolveValue: { expression -> "[$expression]".toString() }
16+
] as ValueResolver
17+
}
18+
19+
def 'Does Not Modify Strings With No Expressions'() {
20+
expect:
21+
ExpressionParser.parseExpression(null) == null
22+
ExpressionParser.parseExpression('') == ''
23+
ExpressionParser.parseExpression('hello world') == 'hello world'
24+
ExpressionParser.parseExpression('looks like a $') == 'looks like a $'
25+
}
26+
27+
def 'Throws An Exception On Unterminated Expressions'() {
28+
when:
29+
ExpressionParser.parseExpression('${value')
30+
31+
then:
32+
thrown(RuntimeException)
33+
}
34+
35+
@Unroll
36+
@SuppressWarnings('UnnecessaryBooleanExpression')
37+
def 'Replaces The Expression With System Properties'() {
38+
expect:
39+
ExpressionParser.parseExpression(expression, valueResolver) == result
40+
41+
where:
42+
43+
expression || result
44+
'${value}' || '[value]'
45+
' ${value}' || ' [value]'
46+
'${value} ' || '[value] '
47+
' ${value} ' || ' [value] '
48+
' ${value} ${value2} ' || ' [value] [value2] '
49+
'$${value}}' || '$[value]}'
50+
}
51+
52+
def 'Handles Empty Expression'() {
53+
expect:
54+
ExpressionParser.parseExpression('${}') == ''
55+
ExpressionParser.parseExpression('${} ${} ${}') == ' '
56+
}
57+
58+
def 'Handles single value as list'() {
59+
when:
60+
def values = ExpressionParser.parseListExpression('${value}', valueResolver)
61+
62+
then:
63+
values.size() == 1
64+
values.first() == '[value]'
65+
}
66+
67+
def 'parseListExpression - Splits a compound expression value'() {
68+
given:
69+
List<String> expectedValues = ['one', 'two']
70+
ValueResolver valueResolver = [ resolveValue: { expectedValues.join(VALUES_SEPARATOR) } ] as ValueResolver
71+
72+
when:
73+
def values = ExpressionParser.parseListExpression('${value}', valueResolver)
74+
75+
then:
76+
values == expectedValues
77+
}
78+
79+
def 'parseListExpression - Splits several singular expression values'() {
80+
given:
81+
ValueResolver valueResolver = [ resolveValue: { it } ] as ValueResolver
82+
List<String> expectedValues = ['one', 'two']
83+
84+
when:
85+
def values = ExpressionParser.parseListExpression("\${one}$VALUES_SEPARATOR\${two}", valueResolver)
86+
87+
then:
88+
values == expectedValues
89+
}
90+
91+
def 'parseListExpression - Ignores empty values during compound expression processing'() {
92+
given:
93+
ValueResolver valueResolver = [ resolveValue: { it } ] as ValueResolver
94+
String expectedValue = 'one'
95+
96+
when:
97+
def values = ExpressionParser.parseListExpression("\${one}$VALUES_SEPARATOR", valueResolver)
98+
99+
then:
100+
values == [expectedValue]
101+
}
102+
103+
@Unroll
104+
@SuppressWarnings('UnnecessaryBooleanExpression')
105+
def 'with a defined type, converts the expression into the correct type'() {
106+
expect:
107+
ExpressionParser.parseExpression('${expression}', type, [ resolveValue: { value } ] as ValueResolver) == result
108+
109+
where:
110+
111+
value | type || result
112+
'string' | DataType.RAW || 'string'
113+
'string' | DataType.STRING || 'string'
114+
'100' | DataType.RAW || '100'
115+
'100' | DataType.STRING || '100'
116+
'100' | DataType.INTEGER || 100L
117+
'100' | DataType.FLOAT || 100.0f
118+
'100' | DataType.DECIMAL || 100.0
119+
100 | DataType.RAW || 100
120+
100 | DataType.STRING || '100'
121+
100 | DataType.INTEGER || 100L
122+
100 | DataType.FLOAT || 100.0f
123+
100 | DataType.DECIMAL || 100.0
124+
}
125+
}

‎core/support/src/test/groovy/au/com/dius/pact/core/support/expressions/ExpressionParserTest.groovy

-83
This file was deleted.

0 commit comments

Comments
 (0)
Please sign in to comment.