diff --git a/README.md b/README.md index 524d83f..04f3eb6 100644 --- a/README.md +++ b/README.md @@ -138,6 +138,46 @@ func main() { See `test/main.go` for a working example. +# Testing + +`faktory_worker_go` provides helpers that allow you to configure tests to execute jobs inline if you prefer. In this example, the application has defined its own wrapper function for `client.Push`. + +```go +import ( + faktory "github.com/contribsys/faktory/client" + worker "github.com/contribsys/faktory_worker_go" +) + +func Push(mgr worker.Manager, job *faktory.Job) error { + if viper.GetBool("faktory_inline") { + return syntheticPush(mgr worker.Manager, job) + } + return realPush(job) +} + +func syntheticPush(mgr worker.Manager, job *faktory.Job) error { + if mgr.IsRegistered(job.Type) { + return mgr.Dispatch(job) + } + + return fmt.Errorf("inline job execution failed, unregistered job type %s", job.Type) +} + +func realPush(job *faktory.Job) error { + client, err := faktory.Open() + if err != nil { + return errors.Wrap(err, "failed to open Faktory client connection") + } + + err = client.Push(job) + if err != nil { + return errors.Wrap(err, "failed to enqueue Faktory job") + } + + return nil +} +``` + # FAQ * How do I specify the Faktory server location? diff --git a/manager.go b/manager.go index 7ba1a20..ff74b66 100644 --- a/manager.go +++ b/manager.go @@ -48,6 +48,20 @@ func (mgr *Manager) Register(name string, fn Perform) { } } +// IsRegistered checks if a given job name is registered with the manager. +func (mgr *Manager) IsRegistered(name string) bool { + _, ok := mgr.jobHandlers[name] + + return ok +} + +// Dispatch immediately executes a job, including all middleware on the manager. +func (mgr *Manager) Dispatch(job *faktory.Job) error { + perform := mgr.jobHandlers[job.Type] + + return dispatch(mgr.middleware, jobContext(mgr.Pool, job), job, perform) +} + // Register a callback to be fired when a process lifecycle event occurs. // These are useful for hooking into process startup or shutdown. func (mgr *Manager) On(event lifecycleEventType, fn LifecycleEventHandler) { diff --git a/runner.go b/runner.go index 458c9de..73eea1d 100644 --- a/runner.go +++ b/runner.go @@ -157,7 +157,7 @@ func processOne(mgr *Manager) error { return je } - joberr := dispatch(mgr.middleware, jobContext(mgr.Pool, job), job, perform) + joberr := mgr.Dispatch(job) if joberr != nil { // job errors are normal and expected, we don't return early from them mgr.Logger.Errorf("Error running %s job %s: %v", job.Type, job.Jid, joberr)