github.com/google/go-github/v66@v66.0.0/github/repos_hooks_deliveries_test.go (about)

     1  // Copyright 2021 The go-github AUTHORS. All rights reserved.
     2  //
     3  // Use of this source code is governed by a BSD-style
     4  // license that can be found in the LICENSE file.
     5  
     6  package github
     7  
     8  import (
     9  	"context"
    10  	"encoding/json"
    11  	"fmt"
    12  	"net/http"
    13  	"reflect"
    14  	"testing"
    15  
    16  	"github.com/google/go-cmp/cmp"
    17  )
    18  
    19  func TestRepositoriesService_ListHookDeliveries(t *testing.T) {
    20  	t.Parallel()
    21  	client, mux, _ := setup(t)
    22  
    23  	mux.HandleFunc("/repos/o/r/hooks/1/deliveries", func(w http.ResponseWriter, r *http.Request) {
    24  		testMethod(t, r, "GET")
    25  		testFormValues(t, r, values{"cursor": "v1_12077215967"})
    26  		fmt.Fprint(w, `[{"id":1}, {"id":2}]`)
    27  	})
    28  
    29  	opt := &ListCursorOptions{Cursor: "v1_12077215967"}
    30  
    31  	ctx := context.Background()
    32  	hooks, _, err := client.Repositories.ListHookDeliveries(ctx, "o", "r", 1, opt)
    33  	if err != nil {
    34  		t.Errorf("Repositories.ListHookDeliveries returned error: %v", err)
    35  	}
    36  
    37  	want := []*HookDelivery{{ID: Int64(1)}, {ID: Int64(2)}}
    38  	if d := cmp.Diff(hooks, want); d != "" {
    39  		t.Errorf("Repositories.ListHooks want (-), got (+):\n%s", d)
    40  	}
    41  
    42  	const methodName = "ListHookDeliveries"
    43  	testBadOptions(t, methodName, func() (err error) {
    44  		_, _, err = client.Repositories.ListHookDeliveries(ctx, "\n", "\n", -1, opt)
    45  		return err
    46  	})
    47  
    48  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    49  		got, resp, err := client.Repositories.ListHookDeliveries(ctx, "o", "r", 1, opt)
    50  		if got != nil {
    51  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
    52  		}
    53  		return resp, err
    54  	})
    55  }
    56  
    57  func TestRepositoriesService_ListHookDeliveries_invalidOwner(t *testing.T) {
    58  	t.Parallel()
    59  	client, _, _ := setup(t)
    60  
    61  	ctx := context.Background()
    62  	_, _, err := client.Repositories.ListHookDeliveries(ctx, "%", "%", 1, nil)
    63  	testURLParseError(t, err)
    64  }
    65  
    66  func TestRepositoriesService_GetHookDelivery(t *testing.T) {
    67  	t.Parallel()
    68  	client, mux, _ := setup(t)
    69  
    70  	mux.HandleFunc("/repos/o/r/hooks/1/deliveries/1", func(w http.ResponseWriter, r *http.Request) {
    71  		testMethod(t, r, "GET")
    72  		fmt.Fprint(w, `{"id":1}`)
    73  	})
    74  
    75  	ctx := context.Background()
    76  	hook, _, err := client.Repositories.GetHookDelivery(ctx, "o", "r", 1, 1)
    77  	if err != nil {
    78  		t.Errorf("Repositories.GetHookDelivery returned error: %v", err)
    79  	}
    80  
    81  	want := &HookDelivery{ID: Int64(1)}
    82  	if !cmp.Equal(hook, want) {
    83  		t.Errorf("Repositories.GetHookDelivery returned %+v, want %+v", hook, want)
    84  	}
    85  
    86  	const methodName = "GetHookDelivery"
    87  	testBadOptions(t, methodName, func() (err error) {
    88  		_, _, err = client.Repositories.GetHookDelivery(ctx, "\n", "\n", -1, -1)
    89  		return err
    90  	})
    91  
    92  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    93  		got, resp, err := client.Repositories.GetHookDelivery(ctx, "o", "r", 1, 1)
    94  		if got != nil {
    95  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
    96  		}
    97  		return resp, err
    98  	})
    99  }
   100  
   101  func TestRepositoriesService_GetHookDelivery_invalidOwner(t *testing.T) {
   102  	t.Parallel()
   103  	client, _, _ := setup(t)
   104  
   105  	ctx := context.Background()
   106  	_, _, err := client.Repositories.GetHookDelivery(ctx, "%", "%", 1, 1)
   107  	testURLParseError(t, err)
   108  }
   109  
   110  func TestRepositoriesService_RedeliverHookDelivery(t *testing.T) {
   111  	t.Parallel()
   112  	client, mux, _ := setup(t)
   113  
   114  	mux.HandleFunc("/repos/o/r/hooks/1/deliveries/1/attempts", func(w http.ResponseWriter, r *http.Request) {
   115  		testMethod(t, r, "POST")
   116  		fmt.Fprint(w, `{"id":1}`)
   117  	})
   118  
   119  	ctx := context.Background()
   120  	hook, _, err := client.Repositories.RedeliverHookDelivery(ctx, "o", "r", 1, 1)
   121  	if err != nil {
   122  		t.Errorf("Repositories.RedeliverHookDelivery returned error: %v", err)
   123  	}
   124  
   125  	want := &HookDelivery{ID: Int64(1)}
   126  	if !cmp.Equal(hook, want) {
   127  		t.Errorf("Repositories.RedeliverHookDelivery returned %+v, want %+v", hook, want)
   128  	}
   129  
   130  	const methodName = "RedeliverHookDelivery"
   131  	testBadOptions(t, methodName, func() (err error) {
   132  		_, _, err = client.Repositories.RedeliverHookDelivery(ctx, "\n", "\n", -1, -1)
   133  		return err
   134  	})
   135  
   136  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   137  		got, resp, err := client.Repositories.RedeliverHookDelivery(ctx, "o", "r", 1, 1)
   138  		if got != nil {
   139  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   140  		}
   141  		return resp, err
   142  	})
   143  }
   144  
   145  var hookDeliveryPayloadTypeToStruct = map[string]interface{}{
   146  	"check_run":                      &CheckRunEvent{},
   147  	"check_suite":                    &CheckSuiteEvent{},
   148  	"code_scanning_alert":            &CodeScanningAlertEvent{},
   149  	"commit_comment":                 &CommitCommentEvent{},
   150  	"content_reference":              &ContentReferenceEvent{},
   151  	"create":                         &CreateEvent{},
   152  	"delete":                         &DeleteEvent{},
   153  	"dependabot_alert":               &DependabotAlertEvent{},
   154  	"deploy_key":                     &DeployKeyEvent{},
   155  	"deployment":                     &DeploymentEvent{},
   156  	"deployment_status":              &DeploymentStatusEvent{},
   157  	"discussion_comment":             &DiscussionCommentEvent{},
   158  	"discussion":                     &DiscussionEvent{},
   159  	"fork":                           &ForkEvent{},
   160  	"github_app_authorization":       &GitHubAppAuthorizationEvent{},
   161  	"gollum":                         &GollumEvent{},
   162  	"installation":                   &InstallationEvent{},
   163  	"installation_repositories":      &InstallationRepositoriesEvent{},
   164  	"issue_comment":                  &IssueCommentEvent{},
   165  	"issues":                         &IssuesEvent{},
   166  	"label":                          &LabelEvent{},
   167  	"marketplace_purchase":           &MarketplacePurchaseEvent{},
   168  	"member":                         &MemberEvent{},
   169  	"membership":                     &MembershipEvent{},
   170  	"meta":                           &MetaEvent{},
   171  	"milestone":                      &MilestoneEvent{},
   172  	"organization":                   &OrganizationEvent{},
   173  	"org_block":                      &OrgBlockEvent{},
   174  	"package":                        &PackageEvent{},
   175  	"page_build":                     &PageBuildEvent{},
   176  	"ping":                           &PingEvent{},
   177  	"project":                        &ProjectEvent{},
   178  	"project_card":                   &ProjectCardEvent{},
   179  	"project_column":                 &ProjectColumnEvent{},
   180  	"projects_v2":                    &ProjectV2Event{},
   181  	"projects_v2_item":               &ProjectV2ItemEvent{},
   182  	"public":                         &PublicEvent{},
   183  	"pull_request":                   &PullRequestEvent{},
   184  	"pull_request_review":            &PullRequestReviewEvent{},
   185  	"pull_request_review_comment":    &PullRequestReviewCommentEvent{},
   186  	"pull_request_review_thread":     &PullRequestReviewThreadEvent{},
   187  	"pull_request_target":            &PullRequestTargetEvent{},
   188  	"push":                           &PushEvent{},
   189  	"release":                        &ReleaseEvent{},
   190  	"repository":                     &RepositoryEvent{},
   191  	"repository_dispatch":            &RepositoryDispatchEvent{},
   192  	"repository_import":              &RepositoryImportEvent{},
   193  	"repository_vulnerability_alert": &RepositoryVulnerabilityAlertEvent{},
   194  	"secret_scanning_alert":          &SecretScanningAlertEvent{},
   195  	"security_advisory":              &SecurityAdvisoryEvent{},
   196  	"security_and_analysis":          &SecurityAndAnalysisEvent{},
   197  	"star":                           &StarEvent{},
   198  	"status":                         &StatusEvent{},
   199  	"team":                           &TeamEvent{},
   200  	"team_add":                       &TeamAddEvent{},
   201  	"user":                           &UserEvent{},
   202  	"watch":                          &WatchEvent{},
   203  	"workflow_dispatch":              &WorkflowDispatchEvent{},
   204  	"workflow_job":                   &WorkflowJobEvent{},
   205  	"workflow_run":                   &WorkflowRunEvent{},
   206  }
   207  
   208  func TestHookDelivery_ParsePayload(t *testing.T) {
   209  	t.Parallel()
   210  	for evt, obj := range hookDeliveryPayloadTypeToStruct {
   211  		evt, obj := evt, obj
   212  		t.Run(evt, func(t *testing.T) {
   213  			t.Parallel()
   214  			bs, err := json.Marshal(obj)
   215  			if err != nil {
   216  				t.Fatal(err)
   217  			}
   218  
   219  			p := json.RawMessage(bs)
   220  
   221  			d := &HookDelivery{
   222  				Event: String(evt),
   223  				Request: &HookRequest{
   224  					RawPayload: &p,
   225  				},
   226  			}
   227  
   228  			got, err := d.ParseRequestPayload()
   229  			if err != nil {
   230  				t.Error(err)
   231  			}
   232  
   233  			if !reflect.DeepEqual(obj, got) {
   234  				t.Errorf("want %T %v, got %T %v", obj, obj, got, got)
   235  			}
   236  		})
   237  	}
   238  }
   239  
   240  func TestHookDelivery_ParsePayload_invalidEvent(t *testing.T) {
   241  	t.Parallel()
   242  	p := json.RawMessage(nil)
   243  
   244  	d := &HookDelivery{
   245  		Event: String("some_invalid_event"),
   246  		Request: &HookRequest{
   247  			RawPayload: &p,
   248  		},
   249  	}
   250  
   251  	_, err := d.ParseRequestPayload()
   252  	if err == nil || err.Error() != `unsupported event type "some_invalid_event"` {
   253  		t.Errorf("unexpected error: %v", err)
   254  	}
   255  }
   256  
   257  func TestHookDelivery_ParsePayload_invalidPayload(t *testing.T) {
   258  	t.Parallel()
   259  	p := json.RawMessage([]byte(`{"check_run":{"id":"invalid"}}`))
   260  
   261  	d := &HookDelivery{
   262  		Event: String("check_run"),
   263  		Request: &HookRequest{
   264  			RawPayload: &p,
   265  		},
   266  	}
   267  
   268  	_, err := d.ParseRequestPayload()
   269  	if err == nil || err.Error() != "json: cannot unmarshal string into Go struct field CheckRun.check_run.id of type int64" {
   270  		t.Errorf("unexpected error: %v", err)
   271  	}
   272  }
   273  
   274  func TestHookRequest_Marshal(t *testing.T) {
   275  	t.Parallel()
   276  	testJSONMarshal(t, &HookRequest{}, "{}")
   277  
   278  	header := make(map[string]string)
   279  	header["key"] = "value"
   280  
   281  	jsonMsg, _ := json.Marshal(&header)
   282  
   283  	r := &HookRequest{
   284  		Headers:    header,
   285  		RawPayload: (*json.RawMessage)(&jsonMsg),
   286  	}
   287  
   288  	want := `{
   289  		"headers": {
   290  			"key": "value"
   291  		},
   292  		"payload": {
   293  			"key": "value"
   294  		}
   295  	}`
   296  
   297  	testJSONMarshal(t, r, want)
   298  }
   299  
   300  func TestHookResponse_Marshal(t *testing.T) {
   301  	t.Parallel()
   302  	testJSONMarshal(t, &HookResponse{}, "{}")
   303  
   304  	header := make(map[string]string)
   305  	header["key"] = "value"
   306  
   307  	jsonMsg, _ := json.Marshal(&header)
   308  
   309  	r := &HookResponse{
   310  		Headers:    header,
   311  		RawPayload: (*json.RawMessage)(&jsonMsg),
   312  	}
   313  
   314  	want := `{
   315  		"headers": {
   316  			"key": "value"
   317  		},
   318  		"payload": {
   319  			"key": "value"
   320  		}
   321  	}`
   322  
   323  	testJSONMarshal(t, r, want)
   324  }
   325  
   326  func TestHookDelivery_Marshal(t *testing.T) {
   327  	t.Parallel()
   328  	testJSONMarshal(t, &HookDelivery{}, "{}")
   329  
   330  	header := make(map[string]string)
   331  	header["key"] = "value"
   332  
   333  	jsonMsg, _ := json.Marshal(&header)
   334  
   335  	r := &HookDelivery{
   336  		ID:             Int64(1),
   337  		GUID:           String("guid"),
   338  		DeliveredAt:    &Timestamp{referenceTime},
   339  		Redelivery:     Bool(true),
   340  		Duration:       Float64(1),
   341  		Status:         String("guid"),
   342  		StatusCode:     Int(1),
   343  		Event:          String("guid"),
   344  		Action:         String("guid"),
   345  		InstallationID: Int64(1),
   346  		RepositoryID:   Int64(1),
   347  		Request: &HookRequest{
   348  			Headers:    header,
   349  			RawPayload: (*json.RawMessage)(&jsonMsg),
   350  		},
   351  		Response: &HookResponse{
   352  			Headers:    header,
   353  			RawPayload: (*json.RawMessage)(&jsonMsg),
   354  		},
   355  	}
   356  
   357  	want := `{
   358  		"id": 1,
   359  		"guid": "guid",
   360  		"delivered_at": ` + referenceTimeStr + `,
   361  		"redelivery": true,
   362  		"duration": 1,
   363  		"status": "guid",
   364  		"status_code": 1,
   365  		"event": "guid",
   366  		"action": "guid",
   367  		"installation_id": 1,
   368  		"repository_id": 1,
   369  		"request": {
   370  			"headers": {
   371  				"key": "value"
   372  			},
   373  			"payload": {
   374  				"key": "value"
   375  			}
   376  		},
   377  		"response": {
   378  			"headers": {
   379  				"key": "value"
   380  			},
   381  			"payload": {
   382  				"key": "value"
   383  			}
   384  		}
   385  	}`
   386  
   387  	testJSONMarshal(t, r, want)
   388  }