Skip to content

Commit dfb2275

Browse files
committed
Release 0.7.1
Add uriPathEndsWith feature for PickUtils Signed-off-by: Gopal S Akshintala <[email protected]>
1 parent 8775c30 commit dfb2275

File tree

8 files changed

+120
-36
lines changed

8 files changed

+120
-36
lines changed

README.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ endif::[]
1818
:pmtemplates: src/integrationTest/resources/pm-templates
1919
:imagesdir: docs/images
2020
:prewrap!:
21-
:revoman-version: 0.7.0.1
21+
:revoman-version: 0.7.1
2222

2323
'''
2424

buildSrc/src/main/kotlin/Config.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
* ************************************************************************************************
77
*/
88
const val GROUP_ID = "com.salesforce.revoman"
9-
const val VERSION = "0.7.0.1"
9+
const val VERSION = "0.7.1"
1010
const val ARTIFACT_ID = "revoman"
1111
const val STAGING_PROFILE_ID = "1ea0a23e61ba7d"

src/main/kotlin/com/salesforce/revoman/input/config/StepPick.kt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ import com.salesforce.revoman.output.report.Step
1212
import com.salesforce.revoman.output.report.StepReport
1313
import com.salesforce.revoman.output.report.StepReport.Companion.containsHeader
1414
import com.salesforce.revoman.output.report.StepReport.Companion.uriPathContains
15+
import com.salesforce.revoman.output.report.StepReport.Companion.uriPathEndsWith
1516
import com.salesforce.revoman.output.report.TxnInfo
1617
import com.salesforce.revoman.output.report.TxnInfo.Companion.uriPathContains
18+
import com.salesforce.revoman.output.report.TxnInfo.Companion.uriPathEndsWith
1719
import org.http4k.core.Request
1820

1921
sealed interface StepPick {
@@ -65,6 +67,12 @@ sealed interface StepPick {
6567
PreTxnStepPick { _, requestInfo, _ ->
6668
paths.any { requestInfo.uriPathContains(it) }
6769
}
70+
71+
@JvmStatic
72+
fun beforeStepEndingWithURIPathOfAny(vararg paths: String) =
73+
PreTxnStepPick { _, requestInfo, _ ->
74+
paths.any { requestInfo.uriPathEndsWith(it) }
75+
}
6876
}
6977
}
7078

@@ -101,6 +109,11 @@ sealed interface StepPick {
101109
fun afterStepContainingURIPathOfAny(vararg paths: String) = PostTxnStepPick { stepReport, _ ->
102110
paths.any { stepReport.requestInfo.uriPathContains(it) }
103111
}
112+
113+
@JvmStatic
114+
fun afterStepEndingWithURIPathOfAny(vararg paths: String) = PostTxnStepPick { stepReport, _ ->
115+
paths.any { stepReport.requestInfo.uriPathEndsWith(it) }
116+
}
104117
}
105118
}
106119
}
Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.salesforce.revoman.input.json.adapters.salesforce
22

3-
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeQueryResponse.QueryResponse.ErrorQueryResponse
4-
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeQueryResponse.QueryResponse.ErrorQueryResponse.ErrorBody
5-
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeQueryResponse.QueryResponse.SuccessQueryResponse
6-
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeQueryResponse.QueryResponse.SuccessQueryResponse.Body.Record
7-
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeQueryResponse.QueryResponse.SuccessQueryResponse.Body.Record.Attributes
3+
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeResponse.Response.ErrorResponse
4+
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeResponse.Response.ErrorResponse.ErrorBody
5+
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeResponse.Response.SuccessResponse
6+
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeResponse.Response.SuccessResponse.Body.Record
7+
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeResponse.Response.SuccessResponse.Body.Record.Attributes
88
import com.salesforce.revoman.input.json.factories.DiMorphicAdapter
99
import com.salesforce.revoman.input.json.mapW
1010
import com.salesforce.revoman.input.json.objW
@@ -21,20 +21,20 @@ import dev.zacsweers.moshix.adapters.AdaptedBy
2121
import java.lang.reflect.Type
2222

2323
@JsonClass(generateAdapter = true)
24-
data class CompositeQueryResponse(val compositeResponse: List<QueryResponse>) {
24+
data class CompositeResponse(val compositeResponse: List<Response>) {
2525

26-
sealed interface QueryResponse {
26+
sealed interface Response {
2727
val httpStatusCode: Int
2828
val referenceId: String
2929
val httpHeaders: HttpHeaders
3030

3131
@JsonClass(generateAdapter = true)
32-
data class SuccessQueryResponse(
32+
data class SuccessResponse(
3333
val body: Body,
3434
override val httpHeaders: HttpHeaders,
3535
override val httpStatusCode: Int,
3636
override val referenceId: String,
37-
) : QueryResponse {
37+
) : Response {
3838
@JsonClass(generateAdapter = true)
3939
data class Body(val done: Boolean, val records: List<Record>, val totalSize: Int) {
4040
@JsonClass(generateAdapter = true)
@@ -97,12 +97,12 @@ data class CompositeQueryResponse(val compositeResponse: List<QueryResponse>) {
9797
}
9898

9999
@JsonClass(generateAdapter = true)
100-
data class ErrorQueryResponse(
100+
data class ErrorResponse(
101101
val body: List<ErrorBody>,
102102
override val httpHeaders: HttpHeaders,
103103
override val httpStatusCode: Int,
104104
override val referenceId: String,
105-
) : QueryResponse {
105+
) : Response {
106106
@JsonClass(generateAdapter = true)
107107
data class ErrorBody(val errorCode: String, val message: String)
108108
}
@@ -112,9 +112,9 @@ data class CompositeQueryResponse(val compositeResponse: List<QueryResponse>) {
112112

113113
@Json(ignore = true)
114114
@get:JvmName("errorResponses")
115-
val errorResponses: List<ErrorQueryResponse> by lazy {
115+
val errorResponses: List<ErrorResponse> by lazy {
116116
compositeResponse
117-
.mapNotNull { it as? ErrorQueryResponse }
117+
.mapNotNull { it as? ErrorResponse }
118118
.filter {
119119
it.httpStatusCode !in SUCCESSFUL_HTTP_STATUSES &&
120120
it.body.firstOrNull()?.let { error ->
@@ -144,7 +144,7 @@ data class CompositeQueryResponse(val compositeResponse: List<QueryResponse>) {
144144

145145
@Json(ignore = true)
146146
@get:JvmName("firstErrorResponse")
147-
val firstErrorResponse: ErrorQueryResponse? by lazy { errorResponses.firstOrNull() }
147+
val firstErrorResponse: ErrorResponse? by lazy { errorResponses.firstOrNull() }
148148

149149
@Json(ignore = true)
150150
@get:JvmName("firstErrorResponseBody")
@@ -156,11 +156,11 @@ data class CompositeQueryResponse(val compositeResponse: List<QueryResponse>) {
156156
@JvmField
157157
val ADAPTER =
158158
DiMorphicAdapter.of(
159-
QueryResponse::class.java,
159+
Response::class.java,
160160
"httpStatusCode",
161161
{ it.nextInt() in SUCCESSFUL_HTTP_STATUSES },
162-
SuccessQueryResponse::class.java,
163-
ErrorQueryResponse::class.java,
162+
SuccessResponse::class.java,
163+
ErrorResponse::class.java,
164164
)
165165
}
166166
}

src/main/kotlin/com/salesforce/revoman/output/report/StepReport.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import arrow.core.Either.Right
1212
import com.salesforce.revoman.output.ExeType
1313
import com.salesforce.revoman.output.postman.PostmanEnvironment
1414
import com.salesforce.revoman.output.report.TxnInfo.Companion.uriPathContains
15+
import com.salesforce.revoman.output.report.TxnInfo.Companion.uriPathEndsWith
1516
import com.salesforce.revoman.output.report.failure.ExeFailure
1617
import com.salesforce.revoman.output.report.failure.HookFailure.PostStepHookFailure
1718
import com.salesforce.revoman.output.report.failure.HookFailure.PreStepHookFailure
@@ -106,6 +107,10 @@ internal constructor(
106107
fun Either<out RequestFailure, TxnInfo<Request>>?.uriPathContains(path: String): Boolean =
107108
this?.fold({ false }, { it.uriPathContains(path) }) ?: false
108109

110+
@JvmStatic
111+
fun Either<out RequestFailure, TxnInfo<Request>>?.uriPathEndsWith(path: String): Boolean =
112+
this?.fold({ false }, { it.uriPathEndsWith(path) }) ?: false
113+
109114
@JvmStatic
110115
fun Either<out RequestFailure, TxnInfo<Request>>?.containsHeader(key: String): Boolean =
111116
this?.fold({ false }, { it.containsHeader(key) }) ?: false

src/main/kotlin/com/salesforce/revoman/output/report/TxnInfo.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,5 +87,13 @@ constructor(
8787
@JvmStatic
8888
fun TxnInfo<Request>.uriPathContains(path: String): Boolean =
8989
indexOfSubList(httpMsg.uri.path.trim('/').split("/"), path.trim('/').split("/")) != -1
90+
91+
@JvmStatic
92+
fun TxnInfo<Request>.uriPathEndsWith(path: String): Boolean {
93+
val sourcePath = httpMsg.uri.path.trim('/').split("/")
94+
val targetPath = path.trim('/').split("/")
95+
return indexOfSubList(sourcePath, targetPath) != -1 &&
96+
indexOfSubList(sourcePath, targetPath) + targetPath.lastIndex == sourcePath.lastIndex
97+
}
9098
}
9199
}

src/test/java/com/salesforce/revoman/input/json/JsonPojoUtilsTest.java

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeGraphResponse;
1515
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeGraphResponse.Graph.ErrorGraph;
1616
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeGraphResponse.Graph.SuccessGraph;
17-
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeQueryResponse;
18-
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeQueryResponse.QueryResponse.ErrorQueryResponse;
19-
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeQueryResponse.QueryResponse.SuccessQueryResponse;
17+
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeResponse;
18+
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeResponse.Response.ErrorResponse;
19+
import com.salesforce.revoman.input.json.adapters.salesforce.CompositeResponse.Response.SuccessResponse;
2020
import com.salesforce.revoman.input.json.pojo.SObjectGraphRequest;
2121
import com.salesforce.revoman.input.json.pojo.SObjectGraphRequest.Entity;
2222
import com.salesforce.revoman.input.json.pojo.SObjectGraphRequest.SObjectWithReferenceRequest;
@@ -82,9 +82,9 @@ void compositeGraphResponseDiMorphicMarshallUnmarshall() throws JSONException {
8282
void compositeQueryResponseDiMorphicMarshallUnmarshall() throws JSONException {
8383
// JSON --> POJO
8484
final var jsonFileConfig =
85-
JsonFile.<CompositeQueryResponse>unmarshall()
86-
.pojoType(CompositeQueryResponse.class)
87-
.customAdapter(CompositeQueryResponse.ADAPTER);
85+
JsonFile.<CompositeResponse>unmarshall()
86+
.pojoType(CompositeResponse.class)
87+
.customAdapter(CompositeResponse.ADAPTER);
8888

8989
final var successCompositeQueryResponse =
9090
JsonPojoUtils.jsonFileToPojo(
@@ -95,8 +95,7 @@ void compositeQueryResponseDiMorphicMarshallUnmarshall() throws JSONException {
9595
successCompositeQueryResponse
9696
.getCompositeResponse()
9797
.forEach(
98-
successQueryResponse ->
99-
assertThat(successQueryResponse).isInstanceOf(SuccessQueryResponse.class));
98+
successResponse -> assertThat(successResponse).isInstanceOf(SuccessResponse.class));
10099

101100
final var errorCompositeQueryResponse =
102101
JsonPojoUtils.jsonFileToPojo(
@@ -106,9 +105,7 @@ void compositeQueryResponseDiMorphicMarshallUnmarshall() throws JSONException {
106105
assertThat(errorCompositeQueryResponse.isSuccessful()).isFalse();
107106
errorCompositeQueryResponse
108107
.getCompositeResponse()
109-
.forEach(
110-
errorQueryResponse ->
111-
assertThat(errorQueryResponse).isInstanceOf(ErrorQueryResponse.class));
108+
.forEach(errorResponse -> assertThat(errorResponse).isInstanceOf(ErrorResponse.class));
112109
assertThat(errorCompositeQueryResponse.firstErrorResponseBody().getMessage())
113110
.contains("Invalid reference specified");
114111

@@ -119,19 +116,19 @@ void compositeQueryResponseDiMorphicMarshallUnmarshall() throws JSONException {
119116
.done());
120117
assertThat(partialSuccessCompositeQueryResponse.isSuccessful()).isFalse();
121118
assertThat(partialSuccessCompositeQueryResponse.getCompositeResponse().getFirst())
122-
.isInstanceOf(SuccessQueryResponse.class);
119+
.isInstanceOf(SuccessResponse.class);
123120
assertThat(partialSuccessCompositeQueryResponse.getCompositeResponse().get(1))
124-
.isInstanceOf(ErrorQueryResponse.class);
121+
.isInstanceOf(ErrorResponse.class);
125122
assertThat(partialSuccessCompositeQueryResponse.getCompositeResponse().get(2))
126-
.isInstanceOf(ErrorQueryResponse.class);
123+
.isInstanceOf(ErrorResponse.class);
127124
assertThat(partialSuccessCompositeQueryResponse.firstErrorResponseBody().getMessage())
128125
.contains("Invalid reference specified");
129126

130127
// POJO --> JSON
131128
final var pojoToJsonConfig =
132-
Pojo.<CompositeQueryResponse>marshall()
133-
.pojoType(CompositeQueryResponse.class)
134-
.customAdapter(CompositeQueryResponse.ADAPTER);
129+
Pojo.<CompositeResponse>marshall()
130+
.pojoType(CompositeResponse.class)
131+
.customAdapter(CompositeResponse.ADAPTER);
135132

136133
final var successCompositeQueryResponseUnmarshalled =
137134
JsonPojoUtils.pojoToJson(pojoToJsonConfig.pojo(successCompositeQueryResponse).done());
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/**
2+
* ************************************************************************************************
3+
* Copyright (c) 2023, Salesforce, Inc. All rights reserved. SPDX-License-Identifier: Apache License
4+
* Version 2.0 For full license text, see the LICENSE file in the repo root or
5+
* http://www.apache.org/licenses/LICENSE-2.0
6+
* ************************************************************************************************
7+
*/
8+
package com.salesforce.revoman.output.report
9+
10+
import com.google.common.truth.Truth.assertThat
11+
import com.salesforce.revoman.internal.json.MoshiReVoman.Companion.initMoshi
12+
import com.salesforce.revoman.internal.postman.template.Request
13+
import com.salesforce.revoman.internal.postman.template.Url
14+
import com.salesforce.revoman.output.report.TxnInfo.Companion.uriPathContains
15+
import com.salesforce.revoman.output.report.TxnInfo.Companion.uriPathEndsWith
16+
import org.http4k.core.Method.POST
17+
import org.junit.jupiter.api.Test
18+
19+
class TxnInfoTest {
20+
private val moshiReVoman = initMoshi()
21+
22+
@Test
23+
fun uriPathContains() {
24+
val rawRequest =
25+
Request(
26+
method = POST.toString(),
27+
url = Url("https://overfullstack.github.io/posts/huh-to-aha/"),
28+
)
29+
val requestInfo =
30+
TxnInfo(
31+
txnObjType = String::class.java,
32+
txnObj = "fakeRequest",
33+
httpMsg = rawRequest.toHttpRequest(moshiReVoman),
34+
moshiReVoman = moshiReVoman,
35+
)
36+
assertThat(requestInfo.uriPathContains("huh-to-aha")).isTrue()
37+
assertThat(requestInfo.uriPathContains("posts")).isTrue()
38+
assertThat(requestInfo.uriPathContains("posts/huh-to-aha/")).isTrue()
39+
assertThat(requestInfo.uriPathContains("posts/huh-to-aha/something")).isFalse()
40+
}
41+
42+
@Test
43+
fun uriPathEndsWith() {
44+
val rawRequest =
45+
Request(
46+
method = POST.toString(),
47+
url = Url("https://overfullstack.github.io/posts/huh-to-aha/"),
48+
)
49+
val requestInfo =
50+
TxnInfo(
51+
txnObjType = String::class.java,
52+
txnObj = "fakeRequest",
53+
httpMsg = rawRequest.toHttpRequest(moshiReVoman),
54+
moshiReVoman = moshiReVoman,
55+
)
56+
assertThat(requestInfo.uriPathEndsWith("huh-to-aha")).isTrue()
57+
assertThat(requestInfo.uriPathEndsWith("posts")).isFalse()
58+
assertThat(requestInfo.uriPathEndsWith("posts/huh-to-aha/")).isTrue()
59+
assertThat(requestInfo.uriPathEndsWith("posts/huh-to-aha/something")).isFalse()
60+
}
61+
}

0 commit comments

Comments
 (0)