//go:build integration package buildrun import ( "context" "encoding/json" "testing" "time" "github.com/nats-io/nats.go" "github.com/nats-io/nats.go/jetstream" "git.novox.be/novox/mesh-sdk/go/delivery" "git.novox.be/novox/mesh-sdk/go/testbus" ) // 1887/A4a, 1887/AC3 on the real bus: an ask put twice under one id is one message, and the asker reads the step a node // wrote under `.`. func TestAnAskIsPutOnceAndItsStepIsRead(t *testing.T) { nc, err := nats.Connect(testbus.URL(t)) if err != nil { t.Fatal(err) } defer nc.Close() js, _ := jetstream.New(nc) ctx := context.Background() if _, err := js.CreateStream(ctx, jetstream.StreamConfig{Name: "SEAT_NODE_BUILD_GO", Subjects: []string{"mesh.seat.node-build-go.accept.>"}, Retention: jetstream.WorkQueuePolicy}); err != nil { t.Fatal(err) } kv, err := js.CreateKeyValue(ctx, jetstream.KeyValueConfig{Bucket: delivery.StepsBucket("mesh-build-go")}) if err != nil { t.Fatal(err) } bus := JetStreamAsks{JS: js} k := Asker{Publisher: bus, Waiter: bus, Bound: 5 * time.Second} a := goAsk("mvl0frv18d1960") for i := 0; i < 2; i++ { if err := k.Put(ctx, a); err != nil { t.Fatal(err) } } s, _ := js.Stream(ctx, "SEAT_NODE_BUILD_GO") if info, _ := s.Info(ctx); info.State.Msgs != 1 { t.Fatalf("%d messages for one ask put twice", info.State.Msgs) } go func() { time.Sleep(100 * time.Millisecond) key, _ := delivery.AskStepKey("ace", a.ID) running, _ := delivery.EncodeStep(delivery.Step{ID: a.ID, Tool: "delivery ask", Node: "ace", State: delivery.StepRunning, Started: time.Now()}) _, _ = kv.Put(ctx, key, running) passed, _ := delivery.EncodeStep(delivery.Step{ID: a.ID, Tool: "delivery ask", Node: "ace", State: delivery.StepPassed, Started: time.Now(), Result: json.RawMessage(`{"artifacts":[]}`)}) _, _ = kv.Put(ctx, key, passed) }() step, err := k.Passed(k.Wait(ctx, a)) if err != nil || step.Node != "ace" { t.Fatalf("step %+v, %v", step, err) } }