Ctrl K
ComunidadGuías…

pkg/runtimeevidence/nats_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package runtimeevidence

import (
	"encoding/json"
	"os"
	"strings"
	"testing"
)

func TestNATSCapturedProgress(t *testing.T) {
	for _, tc := range []struct {
		file, delivered, ackFloor    string
		deliveryActive, ackActive    bool
		pending, ackPending, waiting uint64
	}{
		{"nats-backlog.json", "0", "0", false, false, 5, 0, 0},
		{"nats-recovered.json", "5", "5", true, true, 0, 0, 0},
		{"nats-delivered.json", "5", "0", true, false, 0, 5, 0},
		{"nats-pull-waiting.json", "5", "5", true, true, 0, 0, 1},
	} {
		t.Run(tc.file, func(t *testing.T) {
			body, err := os.ReadFile("testdata/" + tc.file)
			if err != nil {
				t.Fatal(err)
			}
			facts, err := Parse(NATS, 200, body)
			if err != nil {
				t.Fatal(err)
			}
			c := facts.NATS.Consumers[0]
			if c.Delivered == nil || c.Delivered.ConsumerSequence != tc.delivered || c.Delivered.StreamSequence != tc.delivered || (c.Delivered.LastActive != "") != tc.deliveryActive {
				t.Fatalf("unexpected delivered: %+v", c.Delivered)
			}
			if c.AckFloor == nil || c.AckFloor.ConsumerSequence != tc.ackFloor || c.AckFloor.StreamSequence != tc.ackFloor || (c.AckFloor.LastActive != "") != tc.ackActive {
				t.Fatalf("unexpected ack floor: %+v", c.AckFloor)
			}
			if c.WaitingPullRequests == nil || *c.WaitingPullRequests != tc.waiting || c.Pending != tc.pending || c.AckPending != tc.ackPending {
				t.Fatalf("unexpected counts: %+v", c)
			}
		})
	}
}

func TestNATSOptionalProgressPreservesBaseFacts(t *testing.T) {
	for _, optional := range []string{
		``,
		`,"delivered":null,"ack_floor":null,"num_waiting":null`,
		`,"delivered":false,"ack_floor":[],"num_waiting":"1"`,
		`,"delivered":{"consumer_seq":-1,"stream_seq":18446744073709551616,"last_active":"never"},"num_waiting":-1`,
		`,"delivered":{"consumer_seq":1.5,"stream_seq":true,"last_active":42},"num_waiting":1.5`,
		`,"num_waiting":9007199254740992`,
		`,"delivered":{"last_active":"2026-11-03T01:44:18.` + strings.Repeat("1", 100) + `Z"}`,
	} {
		t.Run(optional, func(t *testing.T) {
			body := strings.Replace(natsBody(1, 1, 1, 1, 5), `"num_pending":5`, `"num_pending":5`+optional, 1)
			facts, err := Parse(NATS, 200, []byte(body))
			if err != nil {
				t.Fatal(err)
			}
			c := facts.NATS.Consumers[0]
			if c.Pending != 5 || facts.NATS.Coverage != "node_reported" || c.Delivered != nil || c.AckFloor != nil || c.WaitingPullRequests != nil {
				t.Fatalf("invalid optional detail affected facts: %+v", c)
			}
		})
	}
}

func TestNATSProgressExactPositionsAndIndependentFields(t *testing.T) {
	body := strings.Replace(natsBody(1, 1, 1, 1, 5), `"num_pending":5`, `"num_pending":5,"delivered":{"consumer_seq":18446744073709551615,"stream_seq":9007199254740993,"last_active":"bad"},"ack_floor":{"consumer_seq":null,"stream_seq":0,"last_active":"2026-11-03T01:44:18.902568436Z"},"num_waiting":1,"config":{"password":"secret-sentinel"}`, 1)
	facts, err := Parse(NATS, 200, []byte(body))
	if err != nil {
		t.Fatal(err)
	}
	c := facts.NATS.Consumers[0]
	if c.Delivered == nil || c.Delivered.ConsumerSequence != "18446744073709551615" || c.Delivered.StreamSequence != "9007199254740993" || c.Delivered.LastActive != "" {
		t.Fatalf("inexact delivered position: %+v", c.Delivered)
	}
	if c.AckFloor == nil || c.AckFloor.ConsumerSequence != "" || c.AckFloor.StreamSequence != "0" || c.AckFloor.LastActive != "2026-11-03T01:44:18.902568436Z" {
		t.Fatalf("valid independent fields lost: %+v", c.AckFloor)
	}
	if c.WaitingPullRequests == nil || *c.WaitingPullRequests != 1 {
		t.Fatalf("pull request count lost: %+v", c)
	}
	output, err := json.Marshal(facts)
	if err != nil {
		t.Fatal(err)
	}
	if !strings.Contains(string(output), `"consumerSequence":"18446744073709551615"`) || strings.Contains(string(output), "secret-sentinel") {
		t.Fatalf("unsafe serialized evidence: %s", output)
	}
}

func TestNATSDuplicateProgressKeysRemainUnavailable(t *testing.T) {
	body := strings.Replace(natsBody(1, 1, 1, 1, 5), `"num_pending":5`, `"num_pending":5,"delivered":{"consumer_seq":1,"consumer_seq":2}`, 1)
	facts, err := Parse(NATS, 200, []byte(body))
	if err != UnexpectedShape || facts != (Facts{}) {
		t.Fatalf("ambiguous progress leaked facts: %+v, %v", facts, err)
	}
}

func TestNATSActivityUsesBrowserCompatibleUTC(t *testing.T) {
	for _, input := range []string{"2026-11-03T01:44:18,902568436Z", "2026-11-03T03:44:18.902568436+02:00"} {
		body := strings.Replace(natsBody(1, 1, 1, 1, 5), `"num_pending":5`, `"num_pending":5,"delivered":{"last_active":"`+input+`"}`, 1)
		facts, err := Parse(NATS, 200, []byte(body))
		if err != nil {
			t.Fatal(err)
		}
		seq := facts.NATS.Consumers[0].Delivered
		if seq == nil || seq.LastActive != "2026-11-03T01:44:18.902568436Z" {
			t.Fatalf("noncanonical activity: %+v", seq)
		}
	}
}