package api import ( "github.com/Fuwn/plutia/internal/config" "github.com/Fuwn/plutia/internal/storage" "github.com/Fuwn/plutia/internal/types" "net/http/httptest" "path/filepath" "strings" "testing" ) func TestSelectCheckpointForProofDetectsLatestAdvance(t *testing.T) { dataDir := t.TempDir() store, err := storage.OpenPebble(dataDir) if err != nil { t.Fatalf("open pebble: %v", err) } defer store.Close() if err := store.PutCheckpoint(types.CheckpointV1{ Version: 1, Sequence: 10, DIDMerkleRoot: "root-10", CheckpointHash: "cp-10", Signature: "sig-10", }); err != nil { t.Fatalf("put checkpoint 10: %v", err) } srv := NewServer(config.Default(), store, nil, nil) req := httptest.NewRequest("GET", "/did/did:plc:alice/proof", nil) cp, verifyUnchanged, err := srv.selectCheckpointForProof(req) if err != nil { t.Fatalf("select checkpoint: %v", err) } if cp.Sequence != 10 { t.Fatalf("selected unexpected checkpoint sequence: got %d want 10", cp.Sequence) } if err := store.PutCheckpoint(types.CheckpointV1{ Version: 1, Sequence: 11, DIDMerkleRoot: "root-11", CheckpointHash: "cp-11", Signature: "sig-11", }); err != nil { t.Fatalf("put checkpoint 11: %v", err) } if err := verifyUnchanged(); err == nil || !strings.Contains(err.Error(), "advanced") { t.Fatalf("expected latest-checkpoint advance error, got: %v", err) } } func TestSelectCheckpointForProofDetectsHistoricalMutation(t *testing.T) { dataDir := t.TempDir() store, err := storage.OpenPebble(filepath.Clean(dataDir)) if err != nil { t.Fatalf("open pebble: %v", err) } defer store.Close() if err := store.PutCheckpoint(types.CheckpointV1{ Version: 1, Sequence: 20, DIDMerkleRoot: "root-20-a", CheckpointHash: "cp-20-a", Signature: "sig-20-a", }); err != nil { t.Fatalf("put checkpoint 20(a): %v", err) } srv := NewServer(config.Default(), store, nil, nil) req := httptest.NewRequest("GET", "/did/did:plc:alice/proof?checkpoint=20", nil) cp, verifyUnchanged, err := srv.selectCheckpointForProof(req) if err != nil { t.Fatalf("select historical checkpoint: %v", err) } if cp.CheckpointHash != "cp-20-a" { t.Fatalf("selected unexpected checkpoint hash: got %s", cp.CheckpointHash) } if err := store.PutCheckpoint(types.CheckpointV1{ Version: 1, Sequence: 20, DIDMerkleRoot: "root-20-b", CheckpointHash: "cp-20-b", Signature: "sig-20-b", }); err != nil { t.Fatalf("put checkpoint 20(b): %v", err) } if err := verifyUnchanged(); err == nil || !strings.Contains(err.Error(), "changed") { t.Fatalf("expected historical-checkpoint changed error, got: %v", err) } }