Merge pull request #14979 from Budibase/BUDI-8683/correct-automation-cron-server-timestamp
Correct automation cron server timestamp
This commit is contained in:
commit
888820a0de
|
@ -141,7 +141,7 @@ class InMemoryQueue implements Partial<Queue> {
|
||||||
} else {
|
} else {
|
||||||
pushMessage()
|
pushMessage()
|
||||||
}
|
}
|
||||||
return {} as any
|
return { id: jobId } as any
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
import tk from "timekeeper"
|
||||||
|
import "../../environment"
|
||||||
|
import * as automations from "../index"
|
||||||
|
import * as setup from "./utilities"
|
||||||
|
import { basicCronAutomation } from "../../tests/utilities/structures"
|
||||||
|
|
||||||
|
const initialTime = Date.now()
|
||||||
|
tk.freeze(initialTime)
|
||||||
|
|
||||||
|
const oneMinuteInMs = 60 * 1000
|
||||||
|
|
||||||
|
describe("cron automations", () => {
|
||||||
|
let config = setup.getConfig()
|
||||||
|
|
||||||
|
beforeAll(async () => {
|
||||||
|
await automations.init()
|
||||||
|
await config.init()
|
||||||
|
})
|
||||||
|
|
||||||
|
afterAll(async () => {
|
||||||
|
await automations.shutdown()
|
||||||
|
setup.afterAll()
|
||||||
|
})
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
tk.freeze(initialTime)
|
||||||
|
})
|
||||||
|
|
||||||
|
async function travel(ms: number) {
|
||||||
|
tk.travel(Date.now() + ms)
|
||||||
|
}
|
||||||
|
|
||||||
|
it("should initialise the automation timestamp", async () => {
|
||||||
|
const automation = basicCronAutomation(config.appId!, "* * * * *")
|
||||||
|
await config.api.automation.post(automation)
|
||||||
|
await travel(oneMinuteInMs)
|
||||||
|
await config.publish()
|
||||||
|
|
||||||
|
const automationLogs = await config.getAutomationLogs()
|
||||||
|
expect(automationLogs.data).toHaveLength(1)
|
||||||
|
expect(automationLogs.data).toEqual([
|
||||||
|
expect.objectContaining({
|
||||||
|
trigger: expect.objectContaining({
|
||||||
|
outputs: { timestamp: initialTime + oneMinuteInMs },
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
])
|
||||||
|
})
|
||||||
|
})
|
|
@ -70,6 +70,10 @@ export async function processEvent(job: AutomationJob) {
|
||||||
|
|
||||||
const task = async () => {
|
const task = async () => {
|
||||||
try {
|
try {
|
||||||
|
if (isCronTrigger(job.data.automation)) {
|
||||||
|
// Requires the timestamp at run time
|
||||||
|
job.data.event.timestamp = Date.now()
|
||||||
|
}
|
||||||
// need to actually await these so that an error can be captured properly
|
// need to actually await these so that an error can be captured properly
|
||||||
console.log("automation running", ...loggingArgs(job))
|
console.log("automation running", ...loggingArgs(job))
|
||||||
|
|
||||||
|
@ -210,15 +214,15 @@ export async function enableCronTrigger(appId: any, automation: Automation) {
|
||||||
}
|
}
|
||||||
// make a job id rather than letting Bull decide, makes it easier to handle on way out
|
// make a job id rather than letting Bull decide, makes it easier to handle on way out
|
||||||
const jobId = `${appId}_cron_${utils.newid()}`
|
const jobId = `${appId}_cron_${utils.newid()}`
|
||||||
const job: any = await automationQueue.add(
|
const job = await automationQueue.add(
|
||||||
{
|
{
|
||||||
automation,
|
automation,
|
||||||
event: { appId, timestamp: Date.now() },
|
event: { appId },
|
||||||
},
|
},
|
||||||
{ repeat: { cron: cronExp }, jobId }
|
{ repeat: { cron: cronExp }, jobId }
|
||||||
)
|
)
|
||||||
// Assign cron job ID from bull so we can remove it later if the cron trigger is removed
|
// Assign cron job ID from bull so we can remove it later if the cron trigger is removed
|
||||||
trigger.cronJobId = job.id
|
trigger.cronJobId = job.id.toString()
|
||||||
// can't use getAppDB here as this is likely to be called from dev app,
|
// can't use getAppDB here as this is likely to be called from dev app,
|
||||||
// but this call could be for dev app or prod app, need to just use what
|
// but this call could be for dev app or prod app, need to just use what
|
||||||
// was passed in
|
// was passed in
|
||||||
|
|
|
@ -245,6 +245,38 @@ export function basicAutomation(appId?: string): Automation {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function basicCronAutomation(appId: string, cron: string): Automation {
|
||||||
|
const automation: Automation = {
|
||||||
|
name: `Automation ${generator.guid()}`,
|
||||||
|
definition: {
|
||||||
|
trigger: {
|
||||||
|
stepId: AutomationTriggerStepId.CRON,
|
||||||
|
name: "test",
|
||||||
|
tagline: "test",
|
||||||
|
icon: "test",
|
||||||
|
description: "test",
|
||||||
|
type: AutomationStepType.TRIGGER,
|
||||||
|
id: "test",
|
||||||
|
inputs: {
|
||||||
|
cron,
|
||||||
|
},
|
||||||
|
schema: {
|
||||||
|
inputs: {
|
||||||
|
properties: {},
|
||||||
|
},
|
||||||
|
outputs: {
|
||||||
|
properties: {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
steps: [],
|
||||||
|
},
|
||||||
|
type: "automation",
|
||||||
|
appId,
|
||||||
|
}
|
||||||
|
return automation
|
||||||
|
}
|
||||||
|
|
||||||
export function serverLogAutomation(appId?: string): Automation {
|
export function serverLogAutomation(appId?: string): Automation {
|
||||||
return {
|
return {
|
||||||
name: "My Automation",
|
name: "My Automation",
|
||||||
|
|
|
@ -14,6 +14,7 @@ export interface AutomationDataEvent {
|
||||||
row?: Row
|
row?: Row
|
||||||
oldRow?: Row
|
oldRow?: Row
|
||||||
user?: UserBindings
|
user?: UserBindings
|
||||||
|
timestamp?: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface AutomationData {
|
export interface AutomationData {
|
||||||
|
|
Loading…
Reference in New Issue