Aligns module path with canonical Gitea source (infra ADR-0004) and repo name. Binary only, no downstream consumers. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Roq1ajWKR5f1hG5Df9wC6A
72 lines
2.5 KiB
Go
72 lines
2.5 KiB
Go
package githubclient_test
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"io"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"git.d-ma.be/mathias/hyperguild/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")
|
|
}
|