Skip to content

Commit

Permalink
Add tasks
Browse files Browse the repository at this point in the history
  • Loading branch information
tysoncadenhead committed Aug 7, 2024
1 parent 23c8998 commit 47649c1
Show file tree
Hide file tree
Showing 6 changed files with 111 additions and 1 deletion.
34 changes: 34 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,40 @@ describe("My tests", () => {
});
```

### Events and Tasks

We also include mocks to override Ampt events and tasks. They can be used with a testing library in a similar fashion:

```js
import { task, events } from "ampt-data-mock";

jest.mock("@ampt/sdk", () => ({
task,
events,
}));
```

Events are triggered immediately upon publishing so that you can syncronously validate your end to end tests.

Tasks can be tested by exporting them and calling `.run()` inside your tests suite.

```js
// Your code
import { task } from "@ampt/sdk";

const myTask = task("my task", (event) => {
return true;
});

// Your test
describe("My Task", () => {
it("Should run my task", async () => {
const result = await myTask.run();
expect(result).toEqual(true);
});
});
```

## Resetting

Since this package persists data in memory, it is best practice to reset the data before each unit test using the `reset()` function
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ampt-data-mock",
"version": "1.1.2",
"version": "1.1.3",
"description": "",
"main": "lib/index.js",
"scripts": {
Expand Down
13 changes: 13 additions & 0 deletions src/__tests__/task.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { task } from "../task";

describe("Task", () => {
it("Should create and run a task", async () => {
const myTask = task("myTask", async (event, context) => {
return event.body;
});

const result = await myTask.run({ message: "Hello, World!" });

expect(result).toEqual({ message: "Hello, World!" });
});
});
2 changes: 2 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
export * from "./data";
export * from "./events";
export * from "./helpers";
export * from "./task";
export * from "./storage";
4 changes: 4 additions & 0 deletions src/storage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export const storage = () => ({
read: async () => {},
write: async () => {},
});
57 changes: 57 additions & 0 deletions src/task.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
interface EventHandlerEvent<BodyType = any> {
target: string;
id: string;
name: string;
body: BodyType;
time: number;
delay: number;
attempt?: number;
}

declare interface TaskContext {
setTimeout(ms: number): void;
progress(message: string, percent: number): void;
}

declare interface TaskEvent<T> extends EventHandlerEvent<T> {}

declare interface TaskHandler<BodyType = any> {
(event: TaskEvent<BodyType>, context: TaskContext): Promise<any>;
}

interface ITaskOptions {
timeout?: number;
attempts?: number;
}

export const task = (
taskName: string,
handlerOrOptions: ITaskOptions | TaskHandler,
handler?: TaskHandler
) => {
return {
run: async (expressionOrInput: string | any, input?: any) => {
const fn = handler || (handlerOrOptions as TaskHandler);
return await fn(
{
delay: 0,
id: new Date().getTime().toString(),
name: taskName,
target: taskName,
time: new Date().getTime(),
body: input || expressionOrInput,
},
{
setTimeout: (ms: number) => {},
progress: (message: string, percent: number) => {},
}
);
},
every: (interval: string, input?: any) => {},
cron: (expression: string, input?: any) => {},
};
};

task.status = (executionId: string) => {
return {};
};

0 comments on commit 47649c1

Please sign in to comment.