refactor(code-executor): migrate user scripts to single context argument

- replace (page, context, helpers) signature with async (context) => {}
- add ScriptContext interface exposing page, browser, env, getEnv,
  getCredential, getStepOutput, runSnippet, dumpDom, log/warn/error
- rename getEnvUrl to getEnv throughout service and docs
- fix step ordering: normalizeStepOrder and run step rows are now 1-based
- migrate existing DB rows (scenario_steps, scenario_run_steps) +1
- update all tests and stored snippet/step code in DB to new API
This commit is contained in:
2026-04-14 17:44:59 +03:00
parent 1a2e786ca8
commit 90be5a5490
10 changed files with 166 additions and 91 deletions
+10 -10
View File
@@ -136,35 +136,35 @@ describe("BrowserController", () => {
expect(res.body).toEqual({ result: 42 });
});
it("exposes environment via helpers.env in a named session", async () => {
it("exposes environment via context.env in a named session", async () => {
const res = await request(app.getHttpServer())
.post("/exec")
.send({
sessionName: "no-such-session",
code: "return helpers.env.BASE_URL;",
code: "return context.env.BASE_URL;",
environment: { BASE_URL: "https://env.example.com" },
})
.expect(201);
expect(res.body).toEqual({ result: "https://env.example.com" });
});
it("exposes environment via helpers.env in a sessionless exec", async () => {
it("exposes environment via context.env in a sessionless exec", async () => {
const res = await request(app.getHttpServer())
.post("/exec")
.send({
code: "return helpers.env.KEY;",
code: "return context.env.KEY;",
environment: { KEY: "value123" },
})
.expect(201);
expect(res.body).toEqual({ result: "value123" });
});
it("exposes credentials via helpers.getCredential in a named session", async () => {
it("exposes credentials via context.getCredential in a named session", async () => {
const res = await request(app.getHttpServer())
.post("/exec")
.send({
sessionName: "no-such-session",
code: "return helpers.getCredential('admin');",
code: "return context.getCredential('admin');",
credentials: { admin: { username: "user1", password: "pass1" } },
})
.expect(201);
@@ -173,11 +173,11 @@ describe("BrowserController", () => {
});
});
it("exposes credentials via helpers.getCredential in a sessionless exec", async () => {
it("exposes credentials via context.getCredential in a sessionless exec", async () => {
const res = await request(app.getHttpServer())
.post("/exec")
.send({
code: "return helpers.getCredential('svc');",
code: "return context.getCredential('svc');",
credentials: { svc: { token: "abc" } },
})
.expect(201);
@@ -188,7 +188,7 @@ describe("BrowserController", () => {
const res = await request(app.getHttpServer())
.post("/exec")
.send({
code: "return helpers.getCredential('missing');",
code: "return context.getCredential('missing');",
credentials: {},
})
.expect(500);
@@ -199,7 +199,7 @@ describe("BrowserController", () => {
const res = await request(app.getHttpServer())
.post("/exec")
.send({
code: "return Object.keys(helpers.env).length === 0 ? 'empty' : 'not-empty';",
code: "return Object.keys(context.env).length === 0 ? 'empty' : 'not-empty';",
})
.expect(201);
expect(res.body).toEqual({ result: "empty" });