Ctrl K
ComunidadGuías…

tests/e2e/flows-pane-theme-triggers.spec.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { expect, test } from "@playwright/test";
import { selectAppOption } from "./helpers/app-select";
import {
  setupWorkflowsPage,
  fulfillJson,
} from "./helpers/flows-pane-theme-fixtures";

test("trigger presets configure GitHub, schedules, signed webhooks, and Dependabot reviews", async ({
  page,
}) => {
  await setupWorkflowsPage(page, "dark");
  await page.route("**/api/flows/flow-1/webhook-secret", (route) =>
    fulfillJson(route, { secret: "whsec_test_generated_once" })
  );
  await page.setViewportSize({ width: 1600, height: 900 });
  await page.goto("/alex/workflows");
  await page.waitForLoadState("networkidle");

  await page.getByTestId("flow-trigger-preset-github").click();
  await expect(page.getByTestId("flow-trigger-event")).toHaveAttribute(
    "data-value",
    "pr_opened"
  );
  await expect(page.getByTestId("flow-trigger-repository-scope")).toContainText(
    "All repositories"
  );
  await expect(page.locator(".react-flow__node-start")).toContainText("GitHub");

  await page.getByTestId("flow-trigger-preset-schedule").click();
  await expect(page.getByTestId("flow-trigger-event")).toHaveAttribute(
    "data-value",
    "schedule"
  );
  await expect(page.getByTestId("flow-trigger-schedule-cron")).toHaveValue(
    "0 9 * * 1-5"
  );
  await expect(page.getByTestId("flow-trigger-schedule-timezone")).toHaveValue(
    "UTC"
  );
  await expect(page.getByTestId("flow-trigger-test-payload")).toContainText(
    '"timezone": "UTC"'
  );
  await expect(page.getByTestId("flow-trigger-test")).toBeDisabled();

  await selectAppOption(page.getByTestId("flow-trigger-event"), "webhook");
  await expect(page.getByTestId("flow-trigger-event")).toHaveAttribute(
    "data-value",
    "webhook"
  );
  await expect(page.getByTestId("flow-trigger-repository")).toHaveAttribute(
    "data-value",
    ""
  );
  await selectAppOption(
    page.getByTestId("flow-trigger-repository"),
    "webrenew/blackbox"
  );
  await expect(page.getByTestId("flow-trigger-repository")).toHaveAttribute(
    "data-value",
    "webrenew/blackbox"
  );
  await expect(page.getByTestId("flow-trigger-test-payload")).toHaveValue(
    /"prompt":/
  );
  await page.getByTestId("flow-trigger-test-payload").fill("{");
  await expect(
    page.getByTestId("flow-trigger-test-payload-error")
  ).toContainText("valid JSON");
  await page
    .getByTestId("flow-trigger-test-payload")
    .fill('{\n  "prompt": "Summarize release risk",\n  "release": "1.2.3"\n}');
  await expect(
    page.getByTestId("flow-trigger-test-payload-error")
  ).not.toBeVisible();
  await expect(page.getByTestId("flow-trigger-test-payload")).toHaveValue(
    /Summarize release risk/
  );
  await page.getByTestId("flow-webhook-generate-secret").click();
  await expect(page.getByTestId("flow-webhook-secret-value")).toHaveValue(
    "whsec_test_generated_once"
  );
  await expect(page.locator(".flows-inspector")).toContainText(
    "x-mogplex-signature"
  );
  await page.locator(".react-flow__node-agent").first().click();
  await expect(page.getByTestId("flow-agent-instructions")).toBeVisible();
  await expect(page.locator(".flows-inspector")).toContainText(
    "Instructions / prompt"
  );

  await page.locator(".react-flow__node-start").click();
  await page.getByTestId("flow-trigger-preset-dependabot").click();
  await expect(page.getByTestId("flow-trigger-event")).toHaveAttribute(
    "data-value",
    "pr_opened"
  );
  await expect(page.getByTestId("flow-trigger-author-filter")).toHaveAttribute(
    "data-value",
    "dependabot_only"
  );
});

test("API trigger test payload follows the declared inputs", async ({
  page,
}) => {
  await setupWorkflowsPage(page, "dark");
  await page.setViewportSize({ width: 1600, height: 900 });
  await page.goto("/alex/workflows");
  await page.waitForLoadState("networkidle");

  await page.locator(".react-flow__node-start").click();
  await selectAppOption(page.getByTestId("flow-trigger-event"), "api");
  await page.getByTestId("flow-trigger-api-inputs").fill(
    JSON.stringify([
      { key: "slug", type: "string", required: true, pattern: "[a-z0-9-]+" },
      { key: "tone", type: "string", enum: ["plain", "bold"] },
      { key: "sha", type: "string", pattern: "[a-f0-9]{40}" },
    ])
  );
  await page.getByTestId("flow-trigger-api-inputs").press("Tab");

  const payload = page.getByTestId("flow-trigger-test-payload");
  await expect(payload).toHaveValue(/"slug": "example"/);
  await expect(payload).toHaveValue(/"tone": "plain"/);
  await expect(payload).not.toHaveValue(/"sha"/);
});

test("Slack mention trigger selects a connected workspace and channel", async ({
  page,
}) => {
  await setupWorkflowsPage(page, "dark");
  await page.unroute("**/api/integrations/slack/installations");
  await page.route("**/api/integrations/slack/installations", (route) =>
    fulfillJson(route, {
      installations: [{ teamId: "T1", teamName: "Mogplex" }],
    })
  );
  await page.route(
    /\/api\/integrations\/slack\/installations\/T1\/channels(?:\?.*)?$/,
    (route) =>
      fulfillJson(route, {
        channels: [{ id: "C1", name: "release-ops", isPrivate: false }],
        nextCursor: null,
      })
  );

  await page.setViewportSize({ width: 1600, height: 900 });
  await page.goto("/alex/workflows");
  await page.waitForLoadState("networkidle");
  await page.getByTestId("flow-trigger-preset-slack-mention").click();
  await selectAppOption(page.getByTestId("flow-trigger-slack-workspace"), "T1");
  await selectAppOption(page.getByTestId("flow-trigger-slack-channel"), "C1");
  await expect(page.locator(".flows-inspector")).toContainText(
    "starts the workflow instead of the conversational assistant"
  );
});