mirror of
https://github.com/shishantbiswas/bknd.git
synced 2026-03-15 20:17:22 +00:00
176 lines
4.5 KiB
TypeScript
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);
|
|
});*/
|
|
});
|