2026-02-21 16:03:46 +00:00
|
|
|
package forge
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"net/http"
|
|
|
|
|
"net/http/httptest"
|
|
|
|
|
"testing"
|
|
|
|
|
|
2026-03-22 01:51:29 +00:00
|
|
|
"dappco.re/go/core/forge/types"
|
2026-02-21 16:03:46 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestWebhookService_Good_List(t *testing.T) {
|
|
|
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
if r.Method != http.MethodGet {
|
|
|
|
|
t.Errorf("expected GET, got %s", r.Method)
|
|
|
|
|
}
|
|
|
|
|
w.Header().Set("X-Total-Count", "2")
|
|
|
|
|
json.NewEncoder(w).Encode([]types.Hook{
|
|
|
|
|
{ID: 1, Type: "forgejo", Active: true, URL: "https://example.com/hook1"},
|
|
|
|
|
{ID: 2, Type: "forgejo", Active: false, URL: "https://example.com/hook2"},
|
|
|
|
|
})
|
|
|
|
|
}))
|
|
|
|
|
defer srv.Close()
|
|
|
|
|
|
|
|
|
|
f := NewForge(srv.URL, "tok")
|
|
|
|
|
result, err := f.Webhooks.List(context.Background(), Params{"owner": "core", "repo": "go-forge"}, DefaultList)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if len(result.Items) != 2 {
|
|
|
|
|
t.Errorf("got %d items, want 2", len(result.Items))
|
|
|
|
|
}
|
|
|
|
|
if result.Items[0].URL != "https://example.com/hook1" {
|
|
|
|
|
t.Errorf("got url=%q, want %q", result.Items[0].URL, "https://example.com/hook1")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestWebhookService_Good_Get(t *testing.T) {
|
|
|
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
if r.Method != http.MethodGet {
|
|
|
|
|
t.Errorf("expected GET, got %s", r.Method)
|
|
|
|
|
}
|
|
|
|
|
if r.URL.Path != "/api/v1/repos/core/go-forge/hooks/1" {
|
|
|
|
|
t.Errorf("wrong path: %s", r.URL.Path)
|
|
|
|
|
}
|
|
|
|
|
json.NewEncoder(w).Encode(types.Hook{
|
|
|
|
|
ID: 1,
|
|
|
|
|
Type: "forgejo",
|
|
|
|
|
Active: true,
|
|
|
|
|
URL: "https://example.com/hook1",
|
|
|
|
|
Events: []string{"push", "pull_request"},
|
|
|
|
|
})
|
|
|
|
|
}))
|
|
|
|
|
defer srv.Close()
|
|
|
|
|
|
|
|
|
|
f := NewForge(srv.URL, "tok")
|
|
|
|
|
hook, err := f.Webhooks.Get(context.Background(), Params{"owner": "core", "repo": "go-forge", "id": "1"})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if hook.ID != 1 {
|
|
|
|
|
t.Errorf("got id=%d, want 1", hook.ID)
|
|
|
|
|
}
|
|
|
|
|
if hook.URL != "https://example.com/hook1" {
|
|
|
|
|
t.Errorf("got url=%q, want %q", hook.URL, "https://example.com/hook1")
|
|
|
|
|
}
|
|
|
|
|
if len(hook.Events) != 2 {
|
|
|
|
|
t.Errorf("got %d events, want 2", len(hook.Events))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestWebhookService_Good_Create(t *testing.T) {
|
|
|
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
if r.Method != http.MethodPost {
|
|
|
|
|
t.Errorf("expected POST, got %s", r.Method)
|
|
|
|
|
}
|
|
|
|
|
var opts types.CreateHookOption
|
|
|
|
|
if err := json.NewDecoder(r.Body).Decode(&opts); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if opts.Type != "forgejo" {
|
|
|
|
|
t.Errorf("got type=%q, want %q", opts.Type, "forgejo")
|
|
|
|
|
}
|
|
|
|
|
json.NewEncoder(w).Encode(types.Hook{
|
|
|
|
|
ID: 3,
|
|
|
|
|
Type: opts.Type,
|
|
|
|
|
Active: opts.Active,
|
|
|
|
|
Events: opts.Events,
|
|
|
|
|
})
|
|
|
|
|
}))
|
|
|
|
|
defer srv.Close()
|
|
|
|
|
|
|
|
|
|
f := NewForge(srv.URL, "tok")
|
|
|
|
|
hook, err := f.Webhooks.Create(context.Background(), Params{"owner": "core", "repo": "go-forge"}, &types.CreateHookOption{
|
|
|
|
|
Type: "forgejo",
|
|
|
|
|
Active: true,
|
|
|
|
|
Events: []string{"push"},
|
|
|
|
|
})
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if hook.ID != 3 {
|
|
|
|
|
t.Errorf("got id=%d, want 3", hook.ID)
|
|
|
|
|
}
|
|
|
|
|
if hook.Type != "forgejo" {
|
|
|
|
|
t.Errorf("got type=%q, want %q", hook.Type, "forgejo")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestWebhookService_Good_TestHook(t *testing.T) {
|
|
|
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
if r.Method != http.MethodPost {
|
|
|
|
|
t.Errorf("expected POST, got %s", r.Method)
|
|
|
|
|
}
|
|
|
|
|
if r.URL.Path != "/api/v1/repos/core/go-forge/hooks/1/tests" {
|
|
|
|
|
t.Errorf("wrong path: %s", r.URL.Path)
|
|
|
|
|
}
|
|
|
|
|
w.WriteHeader(http.StatusNoContent)
|
|
|
|
|
}))
|
|
|
|
|
defer srv.Close()
|
|
|
|
|
|
|
|
|
|
f := NewForge(srv.URL, "tok")
|
|
|
|
|
err := f.Webhooks.TestHook(context.Background(), "core", "go-forge", 1)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestWebhookService_Good_ListOrgHooks(t *testing.T) {
|
|
|
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
if r.Method != http.MethodGet {
|
|
|
|
|
t.Errorf("expected GET, got %s", r.Method)
|
|
|
|
|
}
|
|
|
|
|
if r.URL.Path != "/api/v1/orgs/myorg/hooks" {
|
|
|
|
|
t.Errorf("wrong path: %s", r.URL.Path)
|
|
|
|
|
}
|
|
|
|
|
w.Header().Set("X-Total-Count", "1")
|
|
|
|
|
json.NewEncoder(w).Encode([]types.Hook{
|
|
|
|
|
{ID: 10, Type: "forgejo", Active: true},
|
|
|
|
|
})
|
|
|
|
|
}))
|
|
|
|
|
defer srv.Close()
|
|
|
|
|
|
|
|
|
|
f := NewForge(srv.URL, "tok")
|
|
|
|
|
hooks, err := f.Webhooks.ListOrgHooks(context.Background(), "myorg")
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if len(hooks) != 1 {
|
|
|
|
|
t.Errorf("got %d hooks, want 1", len(hooks))
|
|
|
|
|
}
|
|
|
|
|
if hooks[0].ID != 10 {
|
|
|
|
|
t.Errorf("got id=%d, want 10", hooks[0].ID)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestWebhookService_Bad_NotFound(t *testing.T) {
|
|
|
|
|
srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
w.WriteHeader(http.StatusNotFound)
|
|
|
|
|
json.NewEncoder(w).Encode(map[string]string{"message": "hook not found"})
|
|
|
|
|
}))
|
|
|
|
|
defer srv.Close()
|
|
|
|
|
|
|
|
|
|
f := NewForge(srv.URL, "tok")
|
|
|
|
|
_, err := f.Webhooks.Get(context.Background(), Params{"owner": "core", "repo": "go-forge", "id": "999"})
|
|
|
|
|
if err == nil {
|
|
|
|
|
t.Fatal("expected error, got nil")
|
|
|
|
|
}
|
|
|
|
|
if !IsNotFound(err) {
|
|
|
|
|
t.Errorf("expected not-found error, got %v", err)
|
|
|
|
|
}
|
|
|
|
|
}
|