package main
import (
"path/filepath"
"strings"
"testing"
"tangled.org/core/spindle/config"
"tangled.org/core/spindle/db"
)
// xrpc refuses a banned owner, which leaves the cli as the only way back in
func TestCLIUnbansABannedOwnerStraightOnTheDB(t *testing.T) {
owner := "did:plc:theowner"
t.Setenv("SPINDLE_SERVER_OWNER", owner)
dbPath := filepath.Join(t.TempDir(), "spindle.db")
if out, code := runCLI(t, dbPath, "ban", owner); code != 0 {
t.Fatalf("ban = %d: %s", code, out)
}
if out, code := runCLI(t, dbPath, "bans"); code != 0 || !strings.Contains(out, owner) {
t.Fatalf("bans = %d: %q, want the owner listed", code, out)
}
d, err := db.Make(t.Context(), dbPath)
if err != nil {
t.Fatal(err)
}
srv := &config.Server{Owner: owner}
enrolled, err := db.Enrolls(d, srv, "did:plc:theowner")
d.Close()
if err != nil || enrolled {
t.Fatalf("banned owner enrolls = %v, %v, want a ban to beat being the owner", enrolled, err)
}
if out, code := runCLI(t, dbPath, "unban", owner); code != 0 {
t.Fatalf("unban = %d: %s", code, out)
}
if out, code := runCLI(t, dbPath, "bans"); code != 0 || strings.Contains(out, owner) {
t.Fatalf("bans after unban = %d: %q, want the owner gone", code, out)
}
d, err = db.Make(t.Context(), dbPath)
if err != nil {
t.Fatal(err)
}
defer d.Close()
enrolled, err = db.Enrolls(d, srv, "did:plc:theowner")
if err != nil || !enrolled {
t.Fatalf("unbanned owner enrolls = %v, %v, want the owner served again", enrolled, err)
}
if out, code := runCLI(t, dbPath, "unban", owner); code == 0 || !strings.Contains(out, "is not banned") {
t.Fatalf("unbanning someone not banned = %d: %s, want an error", code, out)
}
}