multiclient_test.go

  1package server
  2
  3import (
  4	"bytes"
  5	"context"
  6	"encoding/json"
  7	"net/http"
  8	"net/http/httptest"
  9	"testing"
 10
 11	"github.com/charmbracelet/crush/internal/backend"
 12	"github.com/charmbracelet/crush/internal/proto"
 13	"github.com/stretchr/testify/require"
 14)
 15
 16// newTestController builds a controllerV1 around a backend without a
 17// real config store, suitable for handler-level 400 tests.
 18func newTestController() *controllerV1 {
 19	s := &Server{}
 20	s.backend = backend.New(context.Background(), nil, nil)
 21	return &controllerV1{backend: s.backend, server: s}
 22}
 23
 24func TestPostWorkspaces_RejectsMissingClientID(t *testing.T) {
 25	t.Parallel()
 26	c := newTestController()
 27
 28	body, err := json.Marshal(proto.Workspace{Path: t.TempDir()})
 29	require.NoError(t, err)
 30	req := httptest.NewRequestWithContext(t.Context(), http.MethodPost, "/v1/workspaces", bytes.NewReader(body))
 31	req.Header.Set("Content-Type", "application/json")
 32	rec := httptest.NewRecorder()
 33
 34	c.handlePostWorkspaces(rec, req)
 35
 36	require.Equal(t, http.StatusBadRequest, rec.Code)
 37	var perr proto.Error
 38	require.NoError(t, json.Unmarshal(rec.Body.Bytes(), &perr))
 39	require.Contains(t, perr.Message, "client_id")
 40}
 41
 42func TestPostWorkspaces_RejectsMalformedClientID(t *testing.T) {
 43	t.Parallel()
 44	c := newTestController()
 45
 46	body, err := json.Marshal(proto.Workspace{Path: t.TempDir(), ClientID: "not-a-uuid"})
 47	require.NoError(t, err)
 48	req := httptest.NewRequestWithContext(t.Context(), http.MethodPost, "/v1/workspaces", bytes.NewReader(body))
 49	req.Header.Set("Content-Type", "application/json")
 50	rec := httptest.NewRecorder()
 51
 52	c.handlePostWorkspaces(rec, req)
 53
 54	require.Equal(t, http.StatusBadRequest, rec.Code)
 55}
 56
 57func TestDeleteWorkspace_RejectsMissingClientID(t *testing.T) {
 58	t.Parallel()
 59	c := newTestController()
 60
 61	req := httptest.NewRequestWithContext(t.Context(), http.MethodDelete, "/v1/workspaces/abc", nil)
 62	req.SetPathValue("id", "abc")
 63	rec := httptest.NewRecorder()
 64
 65	c.handleDeleteWorkspaces(rec, req)
 66
 67	require.Equal(t, http.StatusBadRequest, rec.Code)
 68}
 69
 70func TestDeleteWorkspace_RejectsMalformedClientID(t *testing.T) {
 71	t.Parallel()
 72	c := newTestController()
 73
 74	req := httptest.NewRequestWithContext(t.Context(), http.MethodDelete, "/v1/workspaces/abc?client_id=nope", nil)
 75	req.SetPathValue("id", "abc")
 76	rec := httptest.NewRecorder()
 77
 78	c.handleDeleteWorkspaces(rec, req)
 79
 80	require.Equal(t, http.StatusBadRequest, rec.Code)
 81}
 82
 83func TestSubscribeEvents_RejectsMissingClientID(t *testing.T) {
 84	t.Parallel()
 85	c := newTestController()
 86
 87	req := httptest.NewRequestWithContext(t.Context(), http.MethodGet, "/v1/workspaces/abc/events", nil)
 88	req.SetPathValue("id", "abc")
 89	rec := httptest.NewRecorder()
 90
 91	c.handleGetWorkspaceEvents(rec, req)
 92
 93	require.Equal(t, http.StatusBadRequest, rec.Code)
 94}
 95
 96func TestSubscribeEvents_RejectsMalformedClientID(t *testing.T) {
 97	t.Parallel()
 98	c := newTestController()
 99
100	req := httptest.NewRequestWithContext(t.Context(), http.MethodGet, "/v1/workspaces/abc/events?client_id=nope", nil)
101	req.SetPathValue("id", "abc")
102	rec := httptest.NewRecorder()
103
104	c.handleGetWorkspaceEvents(rec, req)
105
106	require.Equal(t, http.StatusBadRequest, rec.Code)
107}