package githubclient_test import ( "context" "encoding/json" "errors" "io" "net/http" "net/http/httptest" "testing" "github.com/mathiasbq/supervisor/internal/githubclient" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestCreateRepo_Success(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { assert.Equal(t, http.MethodPost, r.Method) assert.Equal(t, "/user/repos", r.URL.Path) assert.Equal(t, "token ghp_test", r.Header.Get("Authorization")) var args map[string]any b, _ := io.ReadAll(r.Body) _ = json.Unmarshal(b, &args) assert.Equal(t, "test-repo", args["name"]) assert.Equal(t, true, args["private"]) assert.Equal(t, false, args["auto_init"]) w.WriteHeader(http.StatusCreated) _, _ = w.Write([]byte(`{"full_name":"mathiasb/test-repo","html_url":"https://github.com/mathiasb/test-repo","clone_url":"https://github.com/mathiasb/test-repo.git","private":true}`)) })) defer srv.Close() c := githubclient.New("ghp_test").WithBaseURL(srv.URL) r, err := c.CreateRepo(context.Background(), "test-repo", "desc", true) require.NoError(t, err) assert.Equal(t, "mathiasb/test-repo", r.FullName) assert.True(t, r.Private) } func TestCreateRepo_AlreadyExists(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusUnprocessableEntity) _, _ = w.Write([]byte(`{"message":"Validation Failed","errors":[{"resource":"Repository","code":"custom","field":"name","message":"name already exists on this account"}]}`)) })) defer srv.Close() c := githubclient.New("ghp_test").WithBaseURL(srv.URL) _, err := c.CreateRepo(context.Background(), "x", "", false) require.Error(t, err) assert.True(t, errors.Is(err, githubclient.ErrAlreadyExists)) } func TestCreateRepo_Unauthorized(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusUnauthorized) _, _ = w.Write([]byte(`{"message":"Bad credentials"}`)) })) defer srv.Close() c := githubclient.New("ghp_test").WithBaseURL(srv.URL) _, err := c.CreateRepo(context.Background(), "x", "", false) require.Error(t, err) assert.Contains(t, err.Error(), "PAT missing repo scope") } func TestCreateRepo_NoToken(t *testing.T) { c := githubclient.New("") _, err := c.CreateRepo(context.Background(), "x", "", false) require.Error(t, err) assert.Contains(t, err.Error(), "github pat not configured") }