package gitrpc import ( "context" "encoding/json" "testing" "connectrpc.com/connect" "simplegit/common" v1 "simplegit/gitrpc/v1" "simplegit/state" statectrl "simplegit/state/ctrl" ) func TestCtrlListsReposAndRejectsInvalidCalls(t *testing.T) { cfg := &common.Config{Root: t.TempDir(), DBUri: "sqlite://state.db"} if err := cfg.Prepare(); err != nil { t.Fatal(err) } store, err := state.Open(cfg) if err != nil { t.Fatal(err) } t.Cleanup(func() { _ = store.Engine().Close() }) if err := store.UpsertRepo("acme", "demo", true); err != nil { t.Fatal(err) } server := NewServer(cfg, store) resp, err := server.Ctrl(context.Background(), connect.NewRequest(&v1.CtrlRequest{Op: statectrl.OpListRepos})) if err != nil { t.Fatal(err) } var repos []statectrl.RepoRow if err := json.Unmarshal(resp.Msg.Result, &repos); err != nil { t.Fatal(err) } if len(repos) != 1 || repos[0].Ns != "acme" || repos[0].Name != "demo" || !repos[0].IsPrivate { t.Fatalf("unexpected repos: %+v", repos) } for _, req := range []*v1.CtrlRequest{ {Op: "sql", Args: []string{"DROP TABLE repo"}}, {Op: statectrl.OpGrantsForRepo, Args: []string{"missing-name"}}, } { _, err := server.Ctrl(context.Background(), connect.NewRequest(req)) if connect.CodeOf(err) != connect.CodeInvalidArgument { t.Fatalf("Ctrl(%q) code = %s, want invalid_argument: %v", req.Op, connect.CodeOf(err), err) } } }