feat: add precise task business key and creation time queries
This commit is contained in:
64
sdk/go/task_query_integration_test.go
Normal file
64
sdk/go/task_query_integration_test.go
Normal file
@@ -0,0 +1,64 @@
|
||||
package orbit
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestIntegrationTaskQuerySDK(t *testing.T) {
|
||||
api, queue, _ := integrationWorkerClient(t)
|
||||
ctx, stop := context.WithTimeout(context.Background(), 20*time.Second)
|
||||
defer stop()
|
||||
op := workerTestID(t)
|
||||
key := "query /+% é " + op + " "
|
||||
var tasks []Task
|
||||
for _, k := range []string{key, key, key[:len(key)-1]} {
|
||||
v, err := api.SubmitTask(ctx, workerTestID(t), SubmitTaskRequest{QueueID: queue, Handler: "query." + op, HandlerVersion: "v1", PayloadVersion: "v1", Payload: json.RawMessage(`{"sequence":9007199254740993}`), BusinessKey: k, TaskTimeoutMS: 60000})
|
||||
if err != nil || v.Task.BusinessKey != k {
|
||||
t.Fatal(v, err)
|
||||
}
|
||||
tasks = append(tasks, v.Task)
|
||||
}
|
||||
from := tasks[0].CreatedAt
|
||||
before := tasks[2].CreatedAt.Add(time.Microsecond)
|
||||
query := ListTasksRequest{QueueID: queue, State: TaskWaiting, BusinessKey: key, CreatedFrom: &from, CreatedBefore: &before, Limit: 1}
|
||||
page, err := api.ListTasks(ctx, query)
|
||||
if err != nil || len(page.Items) != 1 || page.Items[0].ID != tasks[1].ID || page.NextCursor == "" {
|
||||
t.Fatal(page, err)
|
||||
}
|
||||
query.Cursor = page.NextCursor
|
||||
last, err := api.ListTasks(ctx, query)
|
||||
if err != nil || len(last.Items) != 1 || last.Items[0].ID != tasks[0].ID || last.NextCursor != "" {
|
||||
t.Fatal(last, err)
|
||||
}
|
||||
changed := query
|
||||
changed.BusinessKey = key[:len(key)-1]
|
||||
_, err = api.ListTasks(ctx, changed)
|
||||
var apiErr *APIError
|
||||
if !errors.As(err, &apiErr) || apiErr.Code != "INVALID_ARGUMENT" {
|
||||
t.Fatal("cursor accepted changed filter", err)
|
||||
}
|
||||
query.Cursor = ""
|
||||
end := tasks[1].CreatedAt
|
||||
query.CreatedBefore = &end
|
||||
bounded, err := api.ListTasks(ctx, query)
|
||||
if err != nil || len(bounded.Items) != 1 || bounded.Items[0].ID != tasks[0].ID || bounded.NextCursor != "" {
|
||||
t.Fatal("exclusive upper boundary", bounded, err)
|
||||
}
|
||||
for _, task := range tasks {
|
||||
if _, err := api.CancelTask(ctx, task.ID, workerTestID(t), CancelTaskRequest{ExpectedRevision: task.Revision, Reason: "complete task query regression"}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
query.State = TaskCancelled
|
||||
query.CreatedBefore = &before
|
||||
query.Limit = 20
|
||||
cancelled, err := api.ListTasks(ctx, query)
|
||||
if err != nil || len(cancelled.Items) != 2 {
|
||||
t.Fatal("created time changed after cancellation", cancelled, err)
|
||||
}
|
||||
t.Log("exact Unicode/trailing-space filter, inclusive lower/exclusive upper time, cursor binding and stable creation order verified over real HTTP")
|
||||
}
|
||||
Reference in New Issue
Block a user