in lib/apiScenario/gen/restlerApiScenarioGenerator.ts [229:312]
private getVariables(scenario: RawScenario) {
const variables: { [name: string]: string | Variable } = {};
if (!this.parameters) {
const map = new Map();
for (const swagger of this.swaggers) {
traverseSwagger(swagger, {
onOperation: (operation) => {
for (let parameter of operation.parameters ?? []) {
parameter = this.jsonLoader.resolveRefObj(parameter);
if (
!parameter.required ||
envVariables.includes(parameter.name) ||
(parameter.in === "path" && parameter[xmsSkipUrlEncoding])
) {
continue;
}
let key: any = parameter.name;
if (parameter.in === "body") {
key = this.jsonLoader.resolveRefObj(parameter.schema!);
}
const value = map.get(key);
if (value) {
value.count++;
value.operationIds.add(operation.operationId);
} else {
map.set(key, {
operationIds: new Set<string>([operation.operationId!]),
name: parameter.name,
count: 1,
value: this.generateVariable(parameter),
});
}
}
},
});
}
this.parameters = map;
}
[...this.parameters.values()]
.sort((a, b) => b.count - a.count)
.forEach((v) => {
const operation = this.operations.get([...v.operationIds.values()][0]);
if (this.opts.useExample) {
let p = operation?.parameters?.find((p) => {
p = this.jsonLoader.resolveRefObj(p);
return p.name === v.name;
});
if (p) {
p = this.jsonLoader.resolveRefObj(p);
}
// for body,query parameter
if (
p?.in !== "path" &&
operation?.[xmsExamples] &&
Object.keys(operation?.[xmsExamples] ?? {}).length
) {
return;
}
}
const step = scenario.steps.find(
(s) =>
(s as RawStepOperation).operationId &&
v.operationIds.has((s as RawStepOperation).operationId)
);
if (!step) {
return;
}
if (!variables[v.name] && v.count > 1) {
variables[v.name] = v.value;
return;
}
if (!step?.variables) {
step.variables = {};
}
step.variables[v.name] = v.value;
});
return variables;
}