package inventory import ( "context" "os" "testing" ) // A pin made before it named the module (migration 0051, novox/hq #258): completed where the node it // names answers once, left for a person where it answers twice. func legacyPin(t *testing.T, inv *Inventory, node, provision, provider string) { t.Helper() _, err := inv.store.Pool().Exec(context.Background(), `insert into provision_pin (node, name, provider) select u.id, $2, p.id from node u, node p where u.name = $1 and p.name = $3`, node, provision, provider) if err != nil { t.Fatal(err) } } func completeEarlierPins(t *testing.T, inv *Inventory) { t.Helper() sql, err := os.ReadFile("migrations/0051-a-pin-made-before-is-completed.sql") if err != nil { t.Fatal(err) } if _, err := inv.store.Pool().Exec(context.Background(), string(sql)); err != nil { t.Fatal(err) } } func TestAPinMadeBeforeIsCompletedWhenTheNodeAnswersOnce(t *testing.T) { inv := fresh(t) ctx := context.Background() for _, n := range []string{"user", "provider"} { if _, err := inv.AddNode(ctx, n); err != nil { t.Fatal(err) } } for _, m := range []string{"postgres", "redis"} { if err := inv.RegisterModule(ctx, manifest(m, []string{m + "-database"}, nil), Source{}); err != nil { t.Fatal(err) } if _, err := inv.Assign(ctx, "provider", m); err != nil { t.Fatal(err) } } legacyPin(t, inv, "user", "postgres-database", "provider") completeEarlierPins(t, inv) pins, err := inv.PinsFor(ctx, "user") if err != nil { t.Fatal(err) } if got := pins["postgres-database"]; got.Node != "provider" || got.Module != "postgres" { t.Fatalf("the record was not completed with the one module that answers: %+v", got) } } func TestAPinMadeBeforeIsLeftOpenWhenTheNodeAnswersTwice(t *testing.T) { inv := fresh(t) ctx := context.Background() for _, n := range []string{"user", "provider"} { if _, err := inv.AddNode(ctx, n); err != nil { t.Fatal(err) } } for _, m := range []string{"public-acme", "step-ca"} { if err := inv.RegisterModule(ctx, manifest(m, []string{"acme-ca"}, nil), Source{}); err != nil { t.Fatal(err) } if _, err := inv.Assign(ctx, "provider", m); err != nil { t.Fatal(err) } } legacyPin(t, inv, "user", "acme-ca", "provider") completeEarlierPins(t, inv) pins, err := inv.PinsFor(ctx, "user") if err != nil { t.Fatal(err) } if got := pins["acme-ca"]; got.Node != "provider" || got.Module != "" { t.Fatalf("a node that answers twice was guessed for: %+v", got) } }