- ninja login forces account selection (interactive when >1); creds now carry ActiveAccountID/Slug. New `ninja account` group. - ninja plugin list / delete / delete-version split public vs active-account @private sections; `publish --private` is sticky in plugin.mod. - GetPluginRequest gains active_account_id so @private resolution works alongside the public (scope, name) path. - publish auto-commits a dirty plugin.mod (path-scoped, leaves other staged paths alone) so the bump→publish loop never trips the dirty check. --allow-dirty is replaced with --strict (default now ships dirty trees via stash-create). - bump auto-commits its plugin.mod write with `bump to X.Y.Z`; --no-commit opts out. - Design doc updated to match the new defaults.
46 lines
1.3 KiB
Go
46 lines
1.3 KiB
Go
package creds
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
)
|
|
|
|
func TestHostCreds_ActiveAccountRoundTrip(t *testing.T) {
|
|
src := HostCreds{
|
|
Token: "tok",
|
|
ActiveAccountID: "acct-uuid",
|
|
ActiveAccountSlug: "acme",
|
|
}
|
|
b, err := json.Marshal(src)
|
|
if err != nil {
|
|
t.Fatalf("Marshal: %v", err)
|
|
}
|
|
var got HostCreds
|
|
if err := json.Unmarshal(b, &got); err != nil {
|
|
t.Fatalf("Unmarshal: %v", err)
|
|
}
|
|
if got.ActiveAccountID != "acct-uuid" {
|
|
t.Errorf("ActiveAccountID = %q, want acct-uuid", got.ActiveAccountID)
|
|
}
|
|
if got.ActiveAccountSlug != "acme" {
|
|
t.Errorf("ActiveAccountSlug = %q, want acme", got.ActiveAccountSlug)
|
|
}
|
|
}
|
|
|
|
func TestHostCreds_LegacyFileLoadsWithoutAccount(t *testing.T) {
|
|
// A creds.json from before the active-account fields existed must still
|
|
// unmarshal cleanly; the new fields should be zero-valued.
|
|
legacy := `{"token":"tok","user":"alice","default_scope":"@themes"}`
|
|
var got HostCreds
|
|
if err := json.Unmarshal([]byte(legacy), &got); err != nil {
|
|
t.Fatalf("Unmarshal legacy: %v", err)
|
|
}
|
|
if got.Token != "tok" {
|
|
t.Errorf("Token = %q", got.Token)
|
|
}
|
|
if got.ActiveAccountID != "" || got.ActiveAccountSlug != "" {
|
|
t.Errorf("ActiveAccount* should be empty for legacy file, got id=%q slug=%q",
|
|
got.ActiveAccountID, got.ActiveAccountSlug)
|
|
}
|
|
}
|