From 57201fd197b473447363ee72bbc089697bf83094 Mon Sep 17 00:00:00 2001 From: Will Norris Date: Fri, 11 Apr 2014 15:34:41 -0700 Subject: [PATCH] add issue event methods --- github/issues_events.go | 127 +++++++++++++++++++++++++++++++ github/issues_events_test.go | 86 +++++++++++++++++++++ tests/integration/issues_test.go | 37 +++++++++ 3 files changed, 250 insertions(+) create mode 100644 github/issues_events.go create mode 100644 github/issues_events_test.go create mode 100644 tests/integration/issues_test.go diff --git a/github/issues_events.go b/github/issues_events.go new file mode 100644 index 0000000..0c720aa --- /dev/null +++ b/github/issues_events.go @@ -0,0 +1,127 @@ +// Copyright 2014 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "fmt" + "time" +) + +// IssueEvent represents an event that occurred around an Issue or Pull Request. +type IssueEvent struct { + ID *int `json:"id,omitempty"` + URL *string `json:"url,omitempty"` + + // The User that generated this event. + Actor *User `json:"actor,omitempty"` + + // Event identifies the actual type of Event that occurred. Possible + // values are: + // + // closed + // The issue was closed by the actor. When the commit_id is + // present, it identifies the commit that closed the issue using + // “closes / fixes #NN” syntax. + // + // reopened + // The issue was reopened by the actor. + // + // subscribed + // The actor subscribed to receive notifications for an issue. + // + // merged + // The issue was merged by the actor. The commit_id attribute is the SHA1 of the HEAD commit that was merged. + // + // referenced + // The issue was referenced from a commit message. The commit_id attribute is the commit SHA1 of where that happened. + // + // mentioned + // The actor was @mentioned in an issue body. + // + // assigned + // The issue was assigned to the actor. + // + // head_ref_deleted + // The pull request’s branch was deleted. + // + // head_ref_restored + // The pull request’s branch was restored. + Event *string `json:"event,omitempty"` + + // The SHA of the commit that referenced this commit, if applicable. + CommitID *string `json:"commit_id,omitempty"` + + CreatedAt *time.Time `json:"created_at,omitempty"` + Issue *Issue `json:"issue,omitempty"` +} + +// ListIssueEvents lists events for the specified issue. +// +// GitHub API docs: https://developer.github.com/v3/issues/events/#list-events-for-an-issue +func (s *IssuesService) ListIssueEvents(owner, repo string, number int, opt *ListOptions) ([]IssueEvent, *Response, error) { + u := fmt.Sprintf("repos/%v/%v/issues/%v/events", owner, repo, number) + u, err := addOptions(u, opt) + if err != nil { + return nil, nil, err + } + + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + var events []IssueEvent + resp, err := s.client.Do(req, &events) + if err != nil { + return nil, resp, err + } + + return events, resp, err +} + +// ListRepositoryEvents lists events for the specified repository. +// +// GitHub API docs: https://developer.github.com/v3/issues/events/#list-events-for-a-repository +func (s *IssuesService) ListRepositoryEvents(owner, repo string, opt *ListOptions) ([]IssueEvent, *Response, error) { + u := fmt.Sprintf("repos/%v/%v/issues/events", owner, repo) + u, err := addOptions(u, opt) + if err != nil { + return nil, nil, err + } + + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + var events []IssueEvent + resp, err := s.client.Do(req, &events) + if err != nil { + return nil, resp, err + } + + return events, resp, err +} + +// GetEvent returns the specified issue event. +// +// GitHub API docs: https://developer.github.com/v3/issues/events/#get-a-single-event +func (s *IssuesService) GetEvent(owner, repo string, id int) (*IssueEvent, *Response, error) { + u := fmt.Sprintf("repos/%v/%v/issues/events/%v", owner, repo, id) + + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + event := new(IssueEvent) + resp, err := s.client.Do(req, event) + if err != nil { + return nil, resp, err + } + + return event, resp, err +} diff --git a/github/issues_events_test.go b/github/issues_events_test.go new file mode 100644 index 0000000..f90b64a --- /dev/null +++ b/github/issues_events_test.go @@ -0,0 +1,86 @@ +// Copyright 2014 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "fmt" + "net/http" + "reflect" + "testing" +) + +func TestIssuesService_ListIssueEvents(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/repos/o/r/issues/1/events", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + testFormValues(t, r, values{ + "page": "1", + "per_page": "2", + }) + fmt.Fprint(w, `[{"id":1}]`) + }) + + opt := &ListOptions{Page: 1, PerPage: 2} + events, _, err := client.Issues.ListIssueEvents("o", "r", 1, opt) + + if err != nil { + t.Errorf("Issues.ListIssueEvents returned error: %v", err) + } + + want := []IssueEvent{{ID: Int(1)}} + if !reflect.DeepEqual(events, want) { + t.Errorf("Issues.ListIssueEvents returned %+v, want %+v", events, want) + } +} + +func TestIssuesService_ListRepositoryEvents(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/repos/o/r/issues/events", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + testFormValues(t, r, values{ + "page": "1", + "per_page": "2", + }) + fmt.Fprint(w, `[{"id":1}]`) + }) + + opt := &ListOptions{Page: 1, PerPage: 2} + events, _, err := client.Issues.ListRepositoryEvents("o", "r", opt) + + if err != nil { + t.Errorf("Issues.ListRepositoryEvents returned error: %v", err) + } + + want := []IssueEvent{{ID: Int(1)}} + if !reflect.DeepEqual(events, want) { + t.Errorf("Issues.ListRepositoryEvents returned %+v, want %+v", events, want) + } +} + +func TestIssuesService_GetEvent(t *testing.T) { + setup() + defer teardown() + + mux.HandleFunc("/repos/o/r/issues/events/1", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `{"id":1}`) + }) + + event, _, err := client.Issues.GetEvent("o", "r", 1) + + if err != nil { + t.Errorf("Issues.GetEvent returned error: %v", err) + } + + want := &IssueEvent{ID: Int(1)} + if !reflect.DeepEqual(event, want) { + t.Errorf("Issues.GetEvent returned %+v, want %+v", event, want) + } +} diff --git a/tests/integration/issues_test.go b/tests/integration/issues_test.go new file mode 100644 index 0000000..416c126 --- /dev/null +++ b/tests/integration/issues_test.go @@ -0,0 +1,37 @@ +// Copyright 2014 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package tests + +import "testing" + +func TestIssueEvents(t *testing.T) { + events, _, err := client.Issues.ListRepositoryEvents("google", "go-github", nil) + if err != nil { + t.Fatalf("Issues.ListRepositoryEvents returned error: %v", err) + } + + if len(events) == 0 { + t.Errorf("ListRepositoryEvents returned no events") + } + + events, _, err = client.Issues.ListIssueEvents("google", "go-github", 1, nil) + if err != nil { + t.Fatalf("Issues.ListIssueEvents returned error: %v", err) + } + + if len(events) == 0 { + t.Errorf("ListIssueEvents returned no events") + } + + event, _, err := client.Issues.GetEvent("google", "go-github", *events[0].ID) + if err != nil { + t.Fatalf("Issues.GetEvent returned error: %v", err) + } + + if *event.URL != *events[0].URL { + t.Fatalf("Issues.GetEvent returned event URL: %v, want %v", *event.URL, *events[0].URL) + } +}