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") }