Files
bknd/app/__test__/flows/trigger.test.ts
2024-11-16 12:01:47 +01:00

176 lines
4.5 KiB
TypeScript

import { describe, expect, test } from "bun:test";
import { Hono } from "hono";
import { Event, EventManager } from "../../src/core/events";
import { EventTrigger, Flow, HttpTrigger, Task } from "../../src/flows";
const ALL_TESTS = !!process.env.ALL_TESTS;
class ExecTask extends Task {
type = "exec";
constructor(
name: string,
params: any,
private fn: () => any
) {
super(name, params);
}
static create(name: string, fn: () => any) {
return new ExecTask(name, undefined, fn);
}
override clone(name: string, params: any) {
return new ExecTask(name, params, this.fn);
}
async execute() {
//console.log("executing", this.name);
return await this.fn();
}
}
describe("Flow trigger", async () => {
test("manual trigger", async () => {
let called = false;
const task = ExecTask.create("manual", () => {
called = true;
});
const flow = new Flow("", [task]);
expect(flow.trigger.type).toBe("manual");
await flow.trigger.register(flow);
expect(called).toBe(true);
});
test("event trigger", async () => {
class EventTriggerClass extends Event {
static override slug = "test-event";
}
const emgr = new EventManager({ EventTriggerClass });
let called = false;
const task = ExecTask.create("event", () => {
called = true;
});
const flow = new Flow(
"test",
[task],
[],
new EventTrigger({ event: "test-event", mode: "sync" })
);
flow.trigger.register(flow, emgr);
await emgr.emit(new EventTriggerClass({ test: 1 }));
expect(called).toBe(true);
});
/*test("event trigger with match", async () => {
class EventTriggerClass extends Event<{ number: number }> {
static slug = "test-event";
}
const emgr = new EventManager({ EventTriggerClass });
let called: number = 0;
const task = ExecTask.create("event", () => {
called++;
});
const flow = new Flow(
"test",
[task],
[],
new EventTrigger(EventTriggerClass, "sync", (e) => e.params.number === 2)
);
flow.trigger.register(flow, emgr);
await emgr.emit(new EventTriggerClass({ number: 1 }));
await emgr.emit(new EventTriggerClass({ number: 2 }));
expect(called).toBe(1);
});*/
test("http trigger", async () => {
let called = false;
const task = ExecTask.create("http", () => {
called = true;
});
const flow = new Flow(
"test",
[task],
[],
new HttpTrigger({
path: "/test",
method: "GET",
mode: "sync"
})
);
const hono = new Hono();
flow.trigger.register(flow, hono);
const res = await hono.request("/test");
//const data = await res.json();
//console.log("response", data);
expect(called).toBe(true);
});
test("http trigger with response", async () => {
const task = ExecTask.create("http", () => ({
called: true
}));
const flow = new Flow(
"test",
[task],
[],
new HttpTrigger({
path: "/test",
method: "GET",
mode: "sync"
})
);
flow.setRespondingTask(task);
const hono = new Hono();
flow.trigger.register(flow, hono);
const res = await hono.request("/test");
const data = await res.json();
//console.log("response", data);
expect(data).toEqual({ called: true });
});
/*test.skipIf(ALL_TESTS)("template with email", async () => {
console.log("apikey", process.env.RESEND_API_KEY);
const task = new FetchTask("fetch", {
url: "https://api.resend.com/emails",
method: "POST",
headers: [
{ key: "Content-Type", value: "application/json" },
{ key: "Authorization", value: "Bearer {{ flow.output.apiKey }}" }
],
body: JSON.stringify({
from: "onboarding@resend.dev",
to: "dennis.senn@gmail.com",
subject:
"test from {% if flow.output.someFancyParam > 100 %}flow{% else %}task{% endif %}!",
html: "Hello"
})
});
const flow = new Flow("test", [task]);
const exec = await flow.start({ someFancyParam: 80, apiKey: process.env.RESEND_API_KEY });
//console.log("exec", exec.logs, exec.finished());
expect(exec.finished()).toBe(true);
expect(exec.hasErrors()).toBe(false);
});*/
});