@@ -13,7 +13,6 @@ import arrow.core.flatMap
1313import arrow.core.merge
1414import com.salesforce.revoman.input.bufferFileInResources
1515import com.salesforce.revoman.input.config.Kick
16- import com.salesforce.revoman.input.initJSContext
1716import com.salesforce.revoman.internal.exe.deepFlattenItems
1817import com.salesforce.revoman.internal.exe.executePreReqJS
1918import com.salesforce.revoman.internal.exe.executeTestsJS
@@ -30,12 +29,10 @@ import com.salesforce.revoman.internal.postman.PostmanSDK
3029import com.salesforce.revoman.internal.postman.RegexReplacer
3130import com.salesforce.revoman.internal.postman.dynamicVariableGenerator
3231import com.salesforce.revoman.internal.postman.mergeEnvs
33- import com.salesforce.revoman.internal.postman.pm
3432import com.salesforce.revoman.internal.postman.template.Template
3533import com.salesforce.revoman.output.Rundown
3634import com.salesforce.revoman.output.report.Step
3735import com.salesforce.revoman.output.report.StepReport
38- import com.salesforce.revoman.output.report.StepReport.Companion.toArrow
3936import com.salesforce.revoman.output.report.StepReport.Companion.toVavr
4037import com.salesforce.revoman.output.report.TxnInfo
4138import com.squareup.moshi.Moshi
@@ -49,7 +46,6 @@ object ReVoman {
4946 @JvmStatic
5047 @OptIn(ExperimentalStdlibApi ::class )
5148 fun revUp (kick : Kick ): Rundown {
52- val environment = mergeEnvs(kick.environmentPaths(), kick.dynamicEnvironmentsFlattened())
5349 val pmTemplateAdapter = Moshi .Builder ().build().adapter<Template >()
5450 val pmStepsDeepFlattened =
5551 kick
@@ -62,33 +58,34 @@ object ReVoman {
6258 val templateCount = kick.templatePaths().size
6359 " Total Steps from ${if (templateCount > 1 ) " $templateCount Collections" else " the Collection" } provided: ${pmStepsDeepFlattened.size} "
6460 }
65- val stepNameToReport =
66- executeStepsSerially(
67- pmStepsDeepFlattened,
68- environment,
69- kick,
70- initMoshi(
71- kick.customAdapters(),
72- kick.customAdaptersFromRequestConfig() + kick.customAdaptersFromResponseConfig(),
73- kick.skipTypes()
74- )
61+ val regexReplacer =
62+ RegexReplacer (kick.customDynamicVariableGenerators(), ::dynamicVariableGenerator)
63+ val moshiReVoman =
64+ initMoshi(
65+ kick.customAdapters(),
66+ kick.customAdaptersFromRequestConfig() + kick.customAdaptersFromResponseConfig(),
67+ kick.skipTypes()
7568 )
76- return Rundown (stepNameToReport, kick.haltOnFailureOfTypeExcept())
69+ val environment = mergeEnvs(kick.environmentPaths(), kick.dynamicEnvironmentsFlattened())
70+ val pm =
71+ PostmanSDK (
72+ moshiReVoman,
73+ kick.nodeModulesRelativePath(),
74+ regexReplacer,
75+ environment.toMutableMap(),
76+ )
77+ val stepNameToReport =
78+ executeStepsSerially(pmStepsDeepFlattened, kick, moshiReVoman, regexReplacer, pm)
79+ return Rundown (stepNameToReport, kick.haltOnFailureOfTypeExcept(), pm.environment)
7780 }
7881
7982 private fun executeStepsSerially (
8083 pmStepsFlattened : List <Step >,
81- environment : Map <String , String ?>,
8284 kick : Kick ,
8385 moshiReVoman : ConfigurableMoshi ,
86+ regexReplacer : RegexReplacer ,
87+ pm : PostmanSDK
8488 ): List <StepReport > {
85- val regexReplacer =
86- RegexReplacer (kick.customDynamicVariableGenerators(), ::dynamicVariableGenerator)
87- // ! TODO 17 Mar 2024 gopala.akshintala: Streamline global mutable state `pm`
88- pm = PostmanSDK (regexReplacer)
89- pm.environment.clear()
90- pm.environment.putAll(environment)
91- initJSContext(kick.nodeModulesRelativePath())
9289 var haltExecution = false
9390 return pmStepsFlattened
9491 .asSequence()
@@ -97,72 +94,69 @@ object ReVoman {
9794 .fold(listOf ()) { stepReports, step ->
9895 logger.info { " ***** Executing Step: $step *****" }
9996 val itemWithRegex = step.rawPMStep
100- pm.info = Info (step.name)
101- val stepReport =
97+ val preStepReport =
10298 StepReport (step, Right (TxnInfo (httpMsg = itemWithRegex.request.toHttpRequest())))
103- val rundown = Rundown (stepReports + stepReport, kick.haltOnFailureOfTypeExcept() )
104- pm.currentStepReport = stepReport
105- pm.rundown = rundown
106- pm.environment.putAll(regexReplacer.replaceVariablesInEnv(stepReport, rundown) )
107- regexReplacer.replaceVariablesInRequest(itemWithRegex.request, stepReport, rundown )
99+ pm.info = Info (step.name )
100+ pm.currentStepReport = preStepReport
101+ pm.rundown =
102+ Rundown (stepReports + preStepReport, kick.haltOnFailureOfTypeExcept(), pm.environment )
103+ pm.environment.putAll(regexReplacer.replaceVariablesInEnv(pm) )
108104 val currentStepReport: StepReport = // --------### PRE-REQUEST-JS ###--------
109- executePreReqJS(step, itemWithRegex, stepReport )
110- .mapLeft { stepReport .copy(requestInfo = left(it)) }
105+ executePreReqJS(step, itemWithRegex, pm )
106+ .mapLeft { preStepReport .copy(requestInfo = left(it)) }
111107 .flatMap { // --------### UNMARSHALL-REQUEST ###--------
112- val pmRequest: com.salesforce.revoman.internal.postman.template. Request =
113- regexReplacer.replaceVariablesInRequest (itemWithRegex.request, stepReport, rundown )
114- unmarshallRequest(step, pmRequest, kick, moshiReVoman, stepReports ).mapLeft {
115- StepReport (step, Left (it))
108+ val pmRequest =
109+ regexReplacer.replaceVariablesInRequestRecursively (itemWithRegex.request, pm )
110+ unmarshallRequest(step, pmRequest, kick, moshiReVoman, pm ).mapLeft {
111+ preStepReport.copy(requestInfo = left (it))
116112 }
117113 }
118114 .flatMap { requestInfo: TxnInfo <Request > -> // --------### PRE-HOOKS ###--------
119- preHookExe(step, kick, requestInfo, stepReports)?.let {
120- Left (StepReport (step, Right (requestInfo), it))
121- } ? : Right (StepReport (step, Right (requestInfo)))
115+ preHookExe(step, kick, requestInfo, pm)?.let {
116+ Left (
117+ preStepReport.copy(requestInfo = Right (requestInfo).toVavr(), preHookFailure = it)
118+ )
119+ } ? : Right (preStepReport.copy(requestInfo = Right (requestInfo).toVavr()))
122120 }
123121 .flatMap { sr: StepReport -> // --------### HTTP-REQUEST ###--------
124- val item =
125- regexReplacer.replaceVariablesInPmItem(
126- itemWithRegex,
127- sr,
128- Rundown (stepReports + sr, kick.haltOnFailureOfTypeExcept())
129- )
122+ pm.currentStepReport = sr
123+ pm.rundown = pm.rundown.copy(stepReports = pm.rundown.stepReports + sr)
124+ val item = regexReplacer.replaceVariablesInPmItem(itemWithRegex, pm)
130125 val httpRequest = item.request.toHttpRequest()
131126 fireHttpRequest(step, item.auth, httpRequest, kick.insecureHttp())
132- .mapLeft { StepReport (step, Left (it)) }
127+ .mapLeft { sr.copy(requestInfo = Left (it).toVavr( )) }
133128 .map {
134- StepReport (
135- step,
136- sr.requestInfo?.toArrow()?.map { txnInfo ->
137- txnInfo.copy(httpMsg = httpRequest)
138- },
139- null ,
140- Right (it)
129+ sr.copy(
130+ requestInfo =
131+ sr.requestInfo?.map { txnInfo -> txnInfo.copy(httpMsg = httpRequest) },
132+ responseInfo = Right (it).toVavr(),
141133 )
142134 }
143135 }
144136 .flatMap { sr: StepReport -> // --------### TESTS-JS ###--------
145137 pm.currentStepReport = sr
146- pm.rundown = Rundown (stepReports + sr, kick.haltOnFailureOfTypeExcept() )
147- executeTestsJS(step, itemWithRegex, sr )
138+ pm.rundown = pm.rundown.copy (stepReports = pm.rundown.stepReports + sr)
139+ executeTestsJS(step, itemWithRegex, pm )
148140 .mapLeft { sr.copy(responseInfo = left(it)) }
149141 .map { sr }
150142 }
151143 .flatMap { sr: StepReport -> // ---### UNMARSHALL RESPONSE ###---
152- unmarshallResponse(sr, kick, moshiReVoman, stepReports )
144+ unmarshallResponse(kick, moshiReVoman, pm )
153145 .mapLeft { sr.copy(responseInfo = Left (it).toVavr()) }
154146 .map { sr.copy(responseInfo = Right (it).toVavr()) }
155147 }
156148 .map { sr: StepReport -> // --------### POST-HOOKS ###--------
157- sr.copy(postHookFailure = postHookExe(sr, kick, stepReports + sr))
149+ pm.currentStepReport = sr
150+ pm.rundown = pm.rundown.copy(stepReports = pm.rundown.stepReports + sr)
151+ sr.copy(postHookFailure = postHookExe(kick, pm))
158152 }
159153 .merge()
160154 .copy(
161155 envSnapshot =
162156 pm.environment.copy(mutableEnv = pm.environment.mutableEnv.toMutableMap())
163157 )
164158 // * NOTE 15/10/23 gopala.akshintala: http status code can be non-success
165- haltExecution = shouldHaltExecution(currentStepReport, kick, stepReports )
159+ haltExecution = shouldHaltExecution(currentStepReport, kick, pm )
166160 stepReports + currentStepReport
167161 }
168162 }
0 commit comments