pax_global_header00006660000000000000000000000064141047570310014514gustar00rootroot0000000000000052 comment=fee04e8d84e09e4404f740aef498cead5a9e56fc go-github-38.1.0/000077500000000000000000000000001410475703100134725ustar00rootroot00000000000000go-github-38.1.0/.codecov.yml000066400000000000000000000001741410475703100157170ustar00rootroot00000000000000ignore: # ignore auto-generated code - "github/github-accessors.go" # ignore experimental scrape package - "scrape" go-github-38.1.0/.github/000077500000000000000000000000001410475703100150325ustar00rootroot00000000000000go-github-38.1.0/.github/workflows/000077500000000000000000000000001410475703100170675ustar00rootroot00000000000000go-github-38.1.0/.github/workflows/tests.yml000066400000000000000000000037051410475703100207610ustar00rootroot00000000000000on: push: branches: - master pull_request: branches: - master name: tests env: GO111MODULE: on jobs: test: strategy: matrix: go-version: [1.x, 1.15.x] platform: [ubuntu-latest] include: # include windows, but only with the latest Go version, since there # is very little in the library that is platform specific - go-version: 1.x platform: windows-latest # only update test coverage stats with the most recent go version on linux - go-version: 1.x platform: ubuntu-latest update-coverage: true runs-on: ${{ matrix.platform }} steps: - name: Cancel previous uses: styfle/cancel-workflow-action@89f242ee29e10c53a841bfe71cc0ce7b2f065abc #0.9.0 with: access_token: ${{ github.token }} - uses: actions/setup-go@v2 with: go-version: ${{ matrix.go-version }} - uses: actions/checkout@v2 - name: Cache go modules uses: actions/cache@v2 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: ${{ runner.os }}-go- - name: Run go fmt if: runner.os != 'Windows' run: diff -u <(echo -n) <(gofmt -d -s .) - name: Ensure go generate produces a zero diff shell: bash run: go generate -x ./... && git diff --exit-code; code=$?; git checkout -- .; (exit $code) - name: Run go vet run: go vet ./... - name: Run go test run: go test -v -race -coverprofile coverage.txt -covermode atomic ./... - name: Ensure integration tests build # don't actually run tests since they hit live GitHub API run: go test -v -tags=integration -run=^$ ./test/integration - name: Run scrape tests run: | cd scrape go test ./... - name: Upload coverage to Codecov if: ${{ matrix.update-coverage }} uses: codecov/codecov-action@v1 go-github-38.1.0/.gitignore000066400000000000000000000001021410475703100154530ustar00rootroot00000000000000*.sh *.test coverage.out # intellij files .idea/ vendor/ .DS_Storego-github-38.1.0/AUTHORS000066400000000000000000000321461410475703100145500ustar00rootroot00000000000000# This is the official list of go-github authors for copyright purposes. # # This does not necessarily list everyone who has contributed code, since in # some cases, their employer may be the copyright holder. To see the full list # of contributors, see the revision history in source control or # https://github.com/google/go-github/graphs/contributors. # # Authors who wish to be recognized in this file should add themselves (or # their employer, as appropriate). 178inaba 2BFL 413x Abhinav Gupta adrienzieba afdesk Ahmed Hagy Aidan Steele Ainsley Chong ajz01 Akeda Bagus Akhil Mohan Alec Thomas Aleks Clark Alex Bramley Alex Orr Alex Unger Alexander Harkness Alexis Gauthiez Ali Farooq Allen Sun Amey Sakhadeo Anders Janmyr Andreas Garnæs Andrew Ryabchun Andy Grunwald Andy Hume Andy Lindeman angie pinilla anjanashenoy Anshuman Bhartiya Antoine Antoine Pelisse Anton Nguyen Anubha Kushwaha appilon aprp Aravind Arda Kuyumcu Arıl Bozoluk Asier Marruedo Austin Burdine Austin Dizzy Azuka Okuleye Ben Batha Benjamen Keroack Beshr Kayali Beyang Liu Billy Keyes Billy Lynch Björn Häuser boljen Brad Harris Brad Moylan Bradley Falzon Bradley McAllister Brandon Cook Brett Logan Brian Egizi Bryan Boreham Cami Diez Carl Johnson Carlos Alexandro Becker Carlos Tadeu Panato Junior chandresh-pancholi Charles Fenwick Elliott Charlie Yan Chmouel Boudjnah Chris King Chris Mc Chris Raborg Chris Roche Chris Schaefer chrisforrette Christian Muehlhaeuser Christoph Sassenberg Colin Misare Craig Peterson Cristian Maglie Daehyeok Mun Daniel Lanner Daniel Leavitt Daniel Nilsson Daoq Dave Du Cros Dave Henderson Dave Perrett Dave Protasowski David Deng David J. M. Karlsen David Jannotta David Ji David Lopez Reyes Davide Zipeto Dennis Webb Derek Jobst Dhi Aurrahman Diego Lapiduz Dmitri Shuralyov dmnlk Don Petersen Doug Turner Drew Fradette Dustin Deus Eivind Eli Uriegas Elliott Beach Emerson Wood eperm Erick Fejta Erik Nobel erwinvaneyk Evan Elias Fabian Holler Fabrice Felix Geisendörfer Filippo Valsorda Florian Forster Francesc Gil Francis Francisco Guimarães Fredrik Jönsson Garrett Squire George Kontridze Georgy Buranov Glen Mailer Gnahz Google Inc. Grachev Mikhail griffin_stewie Guillaume Jacquet Guz Alexander Guðmundur Bjarni Ólafsson Hanno Hecker Hari haran haya14busa haya14busa Huy Tr huydx i2bskn Ikko Ashimine Ioannis Georgoulas Isao Jonas ishan upadhyay isqua Jacob Valdemar Jake Krammer Jameel Haffejee James Cockbain James Loh Jan Kosecki Jan Švábík Javier Campanini Jef LeCompte Jens Rantil Jeremy Morris Jesse Haka Jesse Newland Jihoon Chung Jimmi Dyson Joan Saum Joe Tsai John Barton John Engelman John Liu Jordan Brockopp Jordan Sussman Joshua Bezaleel Abednego JP Phillips jpbelanger-mtl Juan Juan Basso Julien Garcia Gonzalez Julien Rostand Junya Kono Justin Abrahms Jusung Lee jzhoucliqr kadern0 Katrina Owen Kautilya Tripathi Keita Urashima Kevin Burke Kirill Konrad Malawski Kookheon Kwon Krzysztof Kowalczyk Kshitij Saraogi Kumar Saurabh kyokomi Laurent Verdoïa Liam Galvin Lovro Mažgon Luca Campese Lucas Alcantara Luke Evers Luke Kysow Luke Roberts Luke Young lynn [they] Maksim Zhylinski Marc Binder Marcelo Carlos Mark Tareshawty Martin Holman Martin-Louis Bright Martins Sipenko Marwan Sulaiman Masayuki Izumi Mat Geist Matin Rahmanian Matt Matt Brender Matt Gaunt Matt Landis Matt Moore Maxime Bury Michael Spiegel Michael Tiller Michał Glapa Michelangelo Morrillo Mukundan Senthil Munia Balayil Nadav Kaner Nathan VanBenschoten Navaneeth Suresh Neil O'Toole Nick Miyake Nick Platt Nick Spragg Nikhita Raghunath Nilesh Singh Noah Zoschke ns-cweber Ole Orhagen Oleg Kovalov Ondřej Kupka Ori Talmor Pablo Pérez Schröder Palash Nigam Panagiotis Moustafellos Parham Alvani Parker Moore parkhyukjun89 Patrick DeVivo Patrick Marabeas Pavel Shtanko Pete Wagner Petr Shevtsov Pierre Carrier Piotr Zurek Piyush Chugh Pratik Mallya Qais Patankar Quang Le Hong Quentin Leffray Quinn Slack Rackspace US, Inc. Radek Simko Radliński Ignacy Rajat Jindal Rajendra arora Ranbir Singh Ravi Shekhar Jethani RaviTeja Pothana rc1140 Red Hat, Inc. Reetuparna Mukherjee Reinier Timmer Renjith R Ricco Førgaard Rob Figueiredo Rohit Upadhyay Ronak Jain Ross Gustafson Ruben Vereecken Russell Boley Ryan Leung Ryan Lower Ryo Nakao Saaarah Safwan Olaimat Sahil Dua saisi Sam Minnée Sandeep Sukhani Sander Knape Sander van Harmelen Sanket Payghan Sarasa Kisaragi Sean Wang Sebastian Mandrean Sebastian Mæland Pedersen Sergey Romanov Sergio Garcia Seth Vargo Sevki Shagun Khemka shakeelrao Shawn Catanzarite Shawn Smith Shibasis Patel Shrikrishna Singh Simon Davis sona-tar SoundCloud, Ltd. Sridhar Mocherla SriVignessh Pss Stefan Sedich Steve Teuber Stian Eikeland Suhaib Mujahid Szymon Kodrebski Søren Hansen Takayuki Watanabe Taketoshi Fujiwara Taketoshi Fujiwara Tasya Aditya Rukmana Theo Henson Thomas Aidan Curran Thomas Bruyelle Timothée Peignier tkhandel Trey Tacon ttacon Vaibhav Singh Varadarajan Aravamudhan Victor Castell Victor Vrantchan vikkyomkar Vlad Ungureanu Wasim Thabraze Weslei Juan Moser Pereira Will Maier Willem D'Haeseleer William Bailey William Cooke xibz Yann Malet Yannick Utard Yicheng Qin Yosuke Akatsuka Yumikiyo Osanai Yusuke Kuoka Zach Latta zhouhaibing089 go-github-38.1.0/CONTRIBUTING.md000066400000000000000000000145551410475703100157350ustar00rootroot00000000000000# How to contribute # We'd love to accept your patches and contributions to this project. There are a just a few small guidelines you need to follow. ## Contributor License Agreement ## Contributions to any Google project must be accompanied by a Contributor License Agreement. This is not a copyright **assignment**, it simply gives Google permission to use and redistribute your contributions as part of the project. Head over to to see your current agreements on file or to sign a new one. You generally only need to submit a CLA once, so if you've already submitted one (even if it was for a different project), you probably don't need to do it again. ## Reporting issues ## Bugs, feature requests, and development-related questions should be directed to our [GitHub issue tracker](https://github.com/google/go-github/issues). If reporting a bug, please try and provide as much context as possible such as your operating system, Go version, and anything else that might be relevant to the bug. For feature requests, please explain what you're trying to do, and how the requested feature would help you do that. Security related bugs can either be reported in the issue tracker, or if they are more sensitive, emailed to . ## Submitting a patch ## 1. It's generally best to start by opening a new issue describing the bug or feature you're intending to fix. Even if you think it's relatively minor, it's helpful to know what people are working on. Mention in the initial issue that you are planning to work on that bug or feature so that it can be assigned to you. 1. Follow the normal process of [forking][] the project, and setup a new branch to work in. It's important that each group of changes be done in separate branches in order to ensure that a pull request only includes the commits related to that bug or feature. 1. Go makes it very simple to ensure properly formatted code, so always run `go fmt` on your code before committing it. You should also run [golint][] over your code. As noted in the [golint readme][], it's not strictly necessary that your code be completely "lint-free", but this will help you find common style issues. 1. Any significant changes should almost always be accompanied by tests. The project already has good test coverage, so look at some of the existing tests if you're unsure how to go about it. [gocov][] and [gocov-html][] are invaluable tools for seeing which parts of your code aren't being exercised by your tests. 1. Please run: * `go generate github.com/google/go-github/...` * `go test github.com/google/go-github/...` * `go vet github.com/google/go-github/...` 1. Do your best to have [well-formed commit messages][] for each change. This provides consistency throughout the project, and ensures that commit messages are able to be formatted properly by various git tools. 1. Finally, push the commits to your fork and submit a [pull request][]. **NOTE:** Please do not use force-push on PRs in this repo, as it makes it more difficult for reviewers to see what has changed since the last code review. [forking]: https://help.github.com/articles/fork-a-repo [golint]: https://github.com/golang/lint [golint readme]: https://github.com/golang/lint/blob/master/README.md [gocov]: https://github.com/axw/gocov [gocov-html]: https://github.com/matm/gocov-html [well-formed commit messages]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html [squash]: http://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits [pull request]: https://help.github.com/articles/creating-a-pull-request ## Other notes on code organization ## Currently, everything is defined in the main `github` package, with API methods broken into separate service objects. These services map directly to how the [GitHub API documentation][] is organized, so use that as your guide for where to put new methods. Code is organized in files also based pretty closely on the GitHub API documentation, following the format `{service}_{api}.go`. For example, methods defined at live in [repos_hooks.go][]. [GitHub API documentation]: https://docs.github.com/en/free-pro-team@latest/rest/reference/ [repos_hooks.go]: https://github.com/google/go-github/blob/master/github/repos_hooks.go ## Maintainer's Guide ## (These notes are mostly only for people merging in pull requests.) **Verify CLAs.** CLAs must be on file for the pull request submitter and commit author(s). Google's CLA verification system should handle this automatically and will set commit statuses as appropriate. If there's ever any question about a pull request, ask [willnorris](https://github.com/willnorris). **Always try to maintain a clean, linear git history.** With very few exceptions, running `git log` should not show a bunch of branching and merging. Never use the GitHub "merge" button, since it always creates a merge commit. Instead, check out the pull request locally ([these git aliases help][git-aliases]), then cherry-pick or rebase them onto master. If there are small cleanup commits, especially as a result of addressing code review comments, these should almost always be squashed down to a single commit. Don't bother squashing commits that really deserve to be separate though. If needed, feel free to amend additional small changes to the code or commit message that aren't worth going through code review for. If you made any changes like squashing commits, rebasing onto master, etc, then GitHub won't recognize that this is the same commit in order to mark the pull request as "merged". So instead, amend the commit message to include a line "Fixes #0", referencing the pull request number. This would be in addition to any other "Fixes" lines for closing related issues. If you forget to do this, you can also leave a comment on the pull request [like this][rebase-comment]. If you made any other changes, it's worth noting that as well, [like this][modified-comment]. [git-aliases]: https://github.com/willnorris/dotfiles/blob/d640d010c23b1116bdb3d4dc12088ed26120d87d/git/.gitconfig#L13-L15 [rebase-comment]: https://github.com/google/go-github/pull/277#issuecomment-183035491 [modified-comment]: https://github.com/google/go-github/pull/280#issuecomment-184859046 go-github-38.1.0/LICENSE000066400000000000000000000027161410475703100145050ustar00rootroot00000000000000Copyright (c) 2013 The go-github AUTHORS. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. go-github-38.1.0/README.md000066400000000000000000000257421410475703100147630ustar00rootroot00000000000000# go-github # [![go-github release (latest SemVer)](https://img.shields.io/github/v/release/google/go-github?sort=semver)](https://github.com/google/go-github/releases) [![GoDoc](https://img.shields.io/static/v1?label=godoc&message=reference&color=blue)](https://pkg.go.dev/github.com/google/go-github/v38/github) [![Test Status](https://github.com/google/go-github/workflows/tests/badge.svg)](https://github.com/google/go-github/actions?query=workflow%3Atests) [![Test Coverage](https://codecov.io/gh/google/go-github/branch/master/graph/badge.svg)](https://codecov.io/gh/google/go-github) [![Discuss at go-github@googlegroups.com](https://img.shields.io/badge/discuss-go--github%40googlegroups.com-blue.svg)](https://groups.google.com/group/go-github) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/796/badge)](https://bestpractices.coreinfrastructure.org/projects/796) go-github is a Go client library for accessing the [GitHub API v3][]. Currently, **go-github requires Go version 1.13 or greater**. go-github tracks [Go's version support policy][support-policy]. We do our best not to break older versions of Go if we don't have to, but due to tooling constraints, we don't always test older versions. [support-policy]: https://golang.org/doc/devel/release.html#policy If you're interested in using the [GraphQL API v4][], the recommended library is [shurcooL/githubv4][]. ## Installation ## go-github is compatible with modern Go releases in module mode, with Go installed: ```bash go get github.com/google/go-github/v38 ``` will resolve and add the package to the current development module, along with its dependencies. Alternatively the same can be achieved if you use import in a package: ```go import "github.com/google/go-github/v38/github" ``` and run `go get` without parameters. Finally, to use the top-of-trunk version of this repo, use the following command: ```bash go get github.com/google/go-github/v38@master ``` ## Usage ## ```go import "github.com/google/go-github/v38/github" // with go modules enabled (GO111MODULE=on or outside GOPATH) import "github.com/google/go-github/github" // with go modules disabled ``` Construct a new GitHub client, then use the various services on the client to access different parts of the GitHub API. For example: ```go client := github.NewClient(nil) // list all organizations for user "willnorris" orgs, _, err := client.Organizations.List(context.Background(), "willnorris", nil) ``` Some API methods have optional parameters that can be passed. For example: ```go client := github.NewClient(nil) // list public repositories for org "github" opt := &github.RepositoryListByOrgOptions{Type: "public"} repos, _, err := client.Repositories.ListByOrg(context.Background(), "github", opt) ``` The services of a client divide the API into logical chunks and correspond to the structure of the GitHub API documentation at https://docs.github.com/en/free-pro-team@latest/rest/reference/. NOTE: Using the [context](https://godoc.org/context) package, one can easily pass cancelation signals and deadlines to various services of the client for handling a request. In case there is no context available, then `context.Background()` can be used as a starting point. For more sample code snippets, head over to the [example](https://github.com/google/go-github/tree/master/example) directory. ### Authentication ### The go-github library does not directly handle authentication. Instead, when creating a new client, pass an `http.Client` that can handle authentication for you. The easiest and recommended way to do this is using the [oauth2][] library, but you can always use any other library that provides an `http.Client`. If you have an OAuth2 access token (for example, a [personal API token][]), you can use it with the oauth2 library using: ```go import "golang.org/x/oauth2" func main() { ctx := context.Background() ts := oauth2.StaticTokenSource( &oauth2.Token{AccessToken: "... your access token ..."}, ) tc := oauth2.NewClient(ctx, ts) client := github.NewClient(tc) // list all repositories for the authenticated user repos, _, err := client.Repositories.List(ctx, "", nil) } ``` Note that when using an authenticated Client, all calls made by the client will include the specified OAuth token. Therefore, authenticated clients should almost never be shared between different users. See the [oauth2 docs][] for complete instructions on using that library. For API methods that require HTTP Basic Authentication, use the [`BasicAuthTransport`](https://godoc.org/github.com/google/go-github/github#BasicAuthTransport). GitHub Apps authentication can be provided by the [ghinstallation](https://github.com/bradleyfalzon/ghinstallation) package. ```go import "github.com/bradleyfalzon/ghinstallation" func main() { // Wrap the shared transport for use with the integration ID 1 authenticating with installation ID 99. itr, err := ghinstallation.NewKeyFromFile(http.DefaultTransport, 1, 99, "2016-10-19.private-key.pem") if err != nil { // Handle error. } // Use installation transport with client. client := github.NewClient(&http.Client{Transport: itr}) // Use client... } ``` ### Rate Limiting ### GitHub imposes a rate limit on all API clients. Unauthenticated clients are limited to 60 requests per hour, while authenticated clients can make up to 5,000 requests per hour. The Search API has a custom rate limit. Unauthenticated clients are limited to 10 requests per minute, while authenticated clients can make up to 30 requests per minute. To receive the higher rate limit when making calls that are not issued on behalf of a user, use `UnauthenticatedRateLimitedTransport`. The returned `Response.Rate` value contains the rate limit information from the most recent API call. If a recent enough response isn't available, you can use `RateLimits` to fetch the most up-to-date rate limit data for the client. To detect an API rate limit error, you can check if its type is `*github.RateLimitError`: ```go repos, _, err := client.Repositories.List(ctx, "", nil) if _, ok := err.(*github.RateLimitError); ok { log.Println("hit rate limit") } ``` Learn more about GitHub rate limiting at https://docs.github.com/en/free-pro-team@latest/rest/reference/rate-limit. ### Accepted Status ### Some endpoints may return a 202 Accepted status code, meaning that the information required is not yet ready and was scheduled to be gathered on the GitHub side. Methods known to behave like this are documented specifying this behavior. To detect this condition of error, you can check if its type is `*github.AcceptedError`: ```go stats, _, err := client.Repositories.ListContributorsStats(ctx, org, repo) if _, ok := err.(*github.AcceptedError); ok { log.Println("scheduled on GitHub side") } ``` ### Conditional Requests ### The GitHub API has good support for conditional requests which will help prevent you from burning through your rate limit, as well as help speed up your application. `go-github` does not handle conditional requests directly, but is instead designed to work with a caching `http.Transport`. We recommend using https://github.com/gregjones/httpcache for that. Learn more about GitHub conditional requests at https://docs.github.com/en/free-pro-team@latest/rest/overview/resources-in-the-rest-api#conditional-requests. ### Creating and Updating Resources ### All structs for GitHub resources use pointer values for all non-repeated fields. This allows distinguishing between unset fields and those set to a zero-value. Helper functions have been provided to easily create these pointers for string, bool, and int values. For example: ```go // create a new private repository named "foo" repo := &github.Repository{ Name: github.String("foo"), Private: github.Bool(true), } client.Repositories.Create(ctx, "", repo) ``` Users who have worked with protocol buffers should find this pattern familiar. ### Pagination ### All requests for resource collections (repos, pull requests, issues, etc.) support pagination. Pagination options are described in the `github.ListOptions` struct and passed to the list methods directly or as an embedded type of a more specific list options struct (for example `github.PullRequestListOptions`). Pages information is available via the `github.Response` struct. ```go client := github.NewClient(nil) opt := &github.RepositoryListByOrgOptions{ ListOptions: github.ListOptions{PerPage: 10}, } // get all pages of results var allRepos []*github.Repository for { repos, resp, err := client.Repositories.ListByOrg(ctx, "github", opt) if err != nil { return err } allRepos = append(allRepos, repos...) if resp.NextPage == 0 { break } opt.Page = resp.NextPage } ``` For complete usage of go-github, see the full [package docs][]. [GitHub API v3]: https://docs.github.com/en/rest [oauth2]: https://github.com/golang/oauth2 [oauth2 docs]: https://godoc.org/golang.org/x/oauth2 [personal API token]: https://github.com/blog/1509-personal-api-tokens [package docs]: https://pkg.go.dev/github.com/google/go-github/v38/github [GraphQL API v4]: https://developer.github.com/v4/ [shurcooL/githubv4]: https://github.com/shurcooL/githubv4 ### Testing code that uses `go-github` The repo [migueleliasweb/go-github-mock](https://github.com/migueleliasweb/go-github-mock) provides a way to mock responses. Check the repo for more details. ### Integration Tests ### You can run integration tests from the `test` directory. See the integration tests [README](test/README.md). ## Contributing ## I would like to cover the entire GitHub API and contributions are of course always welcome. The calling pattern is pretty well established, so adding new methods is relatively straightforward. See [`CONTRIBUTING.md`](CONTRIBUTING.md) for details. ## Versioning ## In general, go-github follows [semver](https://semver.org/) as closely as we can for tagging releases of the package. For self-contained libraries, the application of semantic versioning is relatively straightforward and generally understood. But because go-github is a client library for the GitHub API, which itself changes behavior, and because we are typically pretty aggressive about implementing preview features of the GitHub API, we've adopted the following versioning policy: * We increment the **major version** with any incompatible change to non-preview functionality, including changes to the exported Go API surface or behavior of the API. * We increment the **minor version** with any backwards-compatible changes to functionality, as well as any changes to preview functionality in the GitHub API. GitHub makes no guarantee about the stability of preview functionality, so neither do we consider it a stable part of the go-github API. * We increment the **patch version** with any backwards-compatible bug fixes. Preview functionality may take the form of entire methods or simply additional data returned from an otherwise non-preview method. Refer to the GitHub API documentation for details on preview functionality. ## License ## This library is distributed under the BSD-style license found in the [LICENSE](./LICENSE) file. go-github-38.1.0/example/000077500000000000000000000000001410475703100151255ustar00rootroot00000000000000go-github-38.1.0/example/appengine/000077500000000000000000000000001410475703100170735ustar00rootroot00000000000000go-github-38.1.0/example/appengine/app.go000066400000000000000000000022161410475703100202030ustar00rootroot00000000000000// Copyright 2017 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 demo provides an app that shows how to use the github package on // Google App Engine. package demo import ( "fmt" "net/http" "os" "github.com/google/go-github/v38/github" "golang.org/x/oauth2" "google.golang.org/appengine" "google.golang.org/appengine/log" ) func init() { http.HandleFunc("/", handler) } func handler(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/" { http.NotFound(w, r) return } ctx := appengine.NewContext(r) ts := oauth2.StaticTokenSource( &oauth2.Token{AccessToken: os.Getenv("GITHUB_AUTH_TOKEN")}, ) tc := oauth2.NewClient(ctx, ts) client := github.NewClient(tc) commits, _, err := client.Repositories.ListCommits(ctx, "google", "go-github", nil) if err != nil { log.Errorf(ctx, "ListCommits: %v", err) http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "text/plain; charset=utf-8") for _, commit := range commits { fmt.Fprintln(w, commit.GetHTMLURL()) } } go-github-38.1.0/example/appengine/app.yaml000066400000000000000000000004511410475703100205370ustar00rootroot00000000000000# Copyright 2017 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. runtime: go api_version: go1 handlers: - url: /.* script: _go_app env_variables: GITHUB_AUTH_TOKEN: "-your-auth-token-here-" go-github-38.1.0/example/basicauth/000077500000000000000000000000001410475703100170705ustar00rootroot00000000000000go-github-38.1.0/example/basicauth/main.go000066400000000000000000000034271410475703100203510ustar00rootroot00000000000000// Copyright 2015 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. // The basicauth command demonstrates using the github.BasicAuthTransport, // including handling two-factor authentication. This won't currently work for // accounts that use SMS to receive one-time passwords. // // Deprecation Notice: GitHub will discontinue password authentication to the API. // You must now authenticate to the GitHub API with an API token, such as an OAuth access token, // GitHub App installation access token, or personal access token, depending on what you need to do with the token. // Password authentication to the API will be removed on November 13, 2020. // See the tokenauth example for details. package main import ( "bufio" "context" "fmt" "os" "strings" "syscall" "github.com/google/go-github/v38/github" "golang.org/x/crypto/ssh/terminal" ) func main() { r := bufio.NewReader(os.Stdin) fmt.Print("GitHub Username: ") username, _ := r.ReadString('\n') fmt.Print("GitHub Password: ") bytePassword, _ := terminal.ReadPassword(int(syscall.Stdin)) password := string(bytePassword) tp := github.BasicAuthTransport{ Username: strings.TrimSpace(username), Password: strings.TrimSpace(password), } client := github.NewClient(tp.Client()) ctx := context.Background() user, _, err := client.Users.Get(ctx, "") // Is this a two-factor auth error? If so, prompt for OTP and try again. if _, ok := err.(*github.TwoFactorAuthError); ok { fmt.Print("\nGitHub OTP: ") otp, _ := r.ReadString('\n') tp.OTP = strings.TrimSpace(otp) user, _, err = client.Users.Get(ctx, "") } if err != nil { fmt.Printf("\nerror: %v\n", err) return } fmt.Printf("\n%v\n", github.Stringify(user)) } go-github-38.1.0/example/commitpr/000077500000000000000000000000001410475703100167575ustar00rootroot00000000000000go-github-38.1.0/example/commitpr/main.go000066400000000000000000000202751410475703100202400ustar00rootroot00000000000000// Copyright 2018 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. // The commitpr command utilizes go-github as a CLI tool for // pushing files to a branch and creating a pull request from it. // It takes an auth token as an environment variable and creates // the commit and the PR under the account affiliated with that token. // // The purpose of this example is to show how to use refs, trees and commits to // create commits and pull requests. // // Note, if you want to push a single file, you probably prefer to use the // content API. An example is available here: // https://godoc.org/github.com/google/go-github/github#example-RepositoriesService-CreateFile // // Note, for this to work at least 1 commit is needed, so you if you use this // after creating a repository you might want to make sure you set `AutoInit` to // `true`. package main import ( "context" "errors" "flag" "fmt" "io/ioutil" "log" "os" "strings" "time" "github.com/google/go-github/v38/github" "golang.org/x/oauth2" ) var ( sourceOwner = flag.String("source-owner", "", "Name of the owner (user or org) of the repo to create the commit in.") sourceRepo = flag.String("source-repo", "", "Name of repo to create the commit in.") commitMessage = flag.String("commit-message", "", "Content of the commit message.") commitBranch = flag.String("commit-branch", "", "Name of branch to create the commit in. If it does not already exists, it will be created using the `base-branch` parameter") baseBranch = flag.String("base-branch", "master", "Name of branch to create the `commit-branch` from.") prRepoOwner = flag.String("merge-repo-owner", "", "Name of the owner (user or org) of the repo to create the PR against. If not specified, the value of the `-source-owner` flag will be used.") prRepo = flag.String("merge-repo", "", "Name of repo to create the PR against. If not specified, the value of the `-source-repo` flag will be used.") prBranch = flag.String("merge-branch", "master", "Name of branch to create the PR against (the one you want to merge your branch in via the PR).") prSubject = flag.String("pr-title", "", "Title of the pull request. If not specified, no pull request will be created.") prDescription = flag.String("pr-text", "", "Text to put in the description of the pull request.") sourceFiles = flag.String("files", "", `Comma-separated list of files to commit and their location. The local file is separated by its target location by a semi-colon. If the file should be in the same location with the same name, you can just put the file name and omit the repetition. Example: README.md,main.go:github/examples/commitpr/main.go`) authorName = flag.String("author-name", "", "Name of the author of the commit.") authorEmail = flag.String("author-email", "", "Email of the author of the commit.") ) var client *github.Client var ctx = context.Background() // getRef returns the commit branch reference object if it exists or creates it // from the base branch before returning it. func getRef() (ref *github.Reference, err error) { if ref, _, err = client.Git.GetRef(ctx, *sourceOwner, *sourceRepo, "refs/heads/"+*commitBranch); err == nil { return ref, nil } // We consider that an error means the branch has not been found and needs to // be created. if *commitBranch == *baseBranch { return nil, errors.New("The commit branch does not exist but `-base-branch` is the same as `-commit-branch`") } if *baseBranch == "" { return nil, errors.New("The `-base-branch` should not be set to an empty string when the branch specified by `-commit-branch` does not exists") } var baseRef *github.Reference if baseRef, _, err = client.Git.GetRef(ctx, *sourceOwner, *sourceRepo, "refs/heads/"+*baseBranch); err != nil { return nil, err } newRef := &github.Reference{Ref: github.String("refs/heads/" + *commitBranch), Object: &github.GitObject{SHA: baseRef.Object.SHA}} ref, _, err = client.Git.CreateRef(ctx, *sourceOwner, *sourceRepo, newRef) return ref, err } // getTree generates the tree to commit based on the given files and the commit // of the ref you got in getRef. func getTree(ref *github.Reference) (tree *github.Tree, err error) { // Create a tree with what to commit. entries := []*github.TreeEntry{} // Load each file into the tree. for _, fileArg := range strings.Split(*sourceFiles, ",") { file, content, err := getFileContent(fileArg) if err != nil { return nil, err } entries = append(entries, &github.TreeEntry{Path: github.String(file), Type: github.String("blob"), Content: github.String(string(content)), Mode: github.String("100644")}) } tree, _, err = client.Git.CreateTree(ctx, *sourceOwner, *sourceRepo, *ref.Object.SHA, entries) return tree, err } // getFileContent loads the local content of a file and return the target name // of the file in the target repository and its contents. func getFileContent(fileArg string) (targetName string, b []byte, err error) { var localFile string files := strings.Split(fileArg, ":") switch { case len(files) < 1: return "", nil, errors.New("empty `-files` parameter") case len(files) == 1: localFile = files[0] targetName = files[0] default: localFile = files[0] targetName = files[1] } b, err = ioutil.ReadFile(localFile) return targetName, b, err } // pushCommit creates the commit in the given reference using the given tree. func pushCommit(ref *github.Reference, tree *github.Tree) (err error) { // Get the parent commit to attach the commit to. parent, _, err := client.Repositories.GetCommit(ctx, *sourceOwner, *sourceRepo, *ref.Object.SHA, nil) if err != nil { return err } // This is not always populated, but is needed. parent.Commit.SHA = parent.SHA // Create the commit using the tree. date := time.Now() author := &github.CommitAuthor{Date: &date, Name: authorName, Email: authorEmail} commit := &github.Commit{Author: author, Message: commitMessage, Tree: tree, Parents: []*github.Commit{parent.Commit}} newCommit, _, err := client.Git.CreateCommit(ctx, *sourceOwner, *sourceRepo, commit) if err != nil { return err } // Attach the commit to the master branch. ref.Object.SHA = newCommit.SHA _, _, err = client.Git.UpdateRef(ctx, *sourceOwner, *sourceRepo, ref, false) return err } // createPR creates a pull request. Based on: https://godoc.org/github.com/google/go-github/github#example-PullRequestsService-Create func createPR() (err error) { if *prSubject == "" { return errors.New("missing `-pr-title` flag; skipping PR creation") } if *prRepoOwner != "" && *prRepoOwner != *sourceOwner { *commitBranch = fmt.Sprintf("%s:%s", *sourceOwner, *commitBranch) } else { prRepoOwner = sourceOwner } if *prRepo == "" { prRepo = sourceRepo } newPR := &github.NewPullRequest{ Title: prSubject, Head: commitBranch, Base: prBranch, Body: prDescription, MaintainerCanModify: github.Bool(true), } pr, _, err := client.PullRequests.Create(ctx, *prRepoOwner, *prRepo, newPR) if err != nil { return err } fmt.Printf("PR created: %s\n", pr.GetHTMLURL()) return nil } func main() { flag.Parse() token := os.Getenv("GITHUB_AUTH_TOKEN") if token == "" { log.Fatal("Unauthorized: No token present") } if *sourceOwner == "" || *sourceRepo == "" || *commitBranch == "" || *sourceFiles == "" || *authorName == "" || *authorEmail == "" { log.Fatal("You need to specify a non-empty value for the flags `-source-owner`, `-source-repo`, `-commit-branch`, `-files`, `-author-name` and `-author-email`") } ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token}) tc := oauth2.NewClient(ctx, ts) client = github.NewClient(tc) ref, err := getRef() if err != nil { log.Fatalf("Unable to get/create the commit reference: %s\n", err) } if ref == nil { log.Fatalf("No error where returned but the reference is nil") } tree, err := getTree(ref) if err != nil { log.Fatalf("Unable to create the tree based on the provided files: %s\n", err) } if err := pushCommit(ref, tree); err != nil { log.Fatalf("Unable to create the commit: %s\n", err) } if err := createPR(); err != nil { log.Fatalf("Error while creating the pull request: %s", err) } } go-github-38.1.0/example/migrations/000077500000000000000000000000001410475703100173015ustar00rootroot00000000000000go-github-38.1.0/example/migrations/main.go000066400000000000000000000017111410475703100205540ustar00rootroot00000000000000// Copyright 2018 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. // migrations demonstrates the functionality of // the user data migration API for the authenticated GitHub // user and lists all the user migrations. package main import ( "context" "fmt" "github.com/google/go-github/v38/github" "golang.org/x/oauth2" ) func fetchAllUserMigrations() ([]*github.UserMigration, error) { ctx := context.Background() ts := oauth2.StaticTokenSource( &oauth2.Token{AccessToken: ""}, ) tc := oauth2.NewClient(ctx, ts) client := github.NewClient(tc) migrations, _, err := client.Migrations.ListUserMigrations(ctx) return migrations, err } func main() { migrations, err := fetchAllUserMigrations() if err != nil { fmt.Printf("Error %v\n", err) return } for i, m := range migrations { fmt.Printf("%v. %v", i+1, m.GetID()) } } go-github-38.1.0/example/newrepo/000077500000000000000000000000001410475703100166045ustar00rootroot00000000000000go-github-38.1.0/example/newrepo/main.go000066400000000000000000000025731410475703100200660ustar00rootroot00000000000000// Copyright 2018 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. // The newrepo command utilizes go-github as a cli tool for // creating new repositories. It takes an auth token as // an environment variable and creates the new repo under // the account affiliated with that token. package main import ( "context" "flag" "fmt" "log" "os" "github.com/google/go-github/v38/github" "golang.org/x/oauth2" ) var ( name = flag.String("name", "", "Name of repo to create in authenticated user's GitHub account.") description = flag.String("description", "", "Description of created repo.") private = flag.Bool("private", false, "Will created repo be private.") ) func main() { flag.Parse() token := os.Getenv("GITHUB_AUTH_TOKEN") if token == "" { log.Fatal("Unauthorized: No token present") } if *name == "" { log.Fatal("No name: New repos must be given a name") } ctx := context.Background() ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token}) tc := oauth2.NewClient(ctx, ts) client := github.NewClient(tc) r := &github.Repository{Name: name, Private: private, Description: description} repo, _, err := client.Repositories.Create(ctx, "", r) if err != nil { log.Fatal(err) } fmt.Printf("Successfully created new repo: %v\n", repo.GetName()) } go-github-38.1.0/example/newreposecretwithlibsodium/000077500000000000000000000000001410475703100226165ustar00rootroot00000000000000go-github-38.1.0/example/newreposecretwithlibsodium/go.mod000066400000000000000000000004041410475703100237220ustar00rootroot00000000000000module newreposecretwithlibsodium go 1.15 require ( github.com/GoKillers/libsodium-go v0.0.0-20171022220152-dd733721c3cb github.com/google/go-github/v38 v38.0.0 golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 gopkg.in/yaml.v2 v2.3.0 // indirect ) go-github-38.1.0/example/newreposecretwithlibsodium/go.sum000066400000000000000000001105561410475703100237610ustar00rootroot00000000000000cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoKillers/libsodium-go v0.0.0-20171022220152-dd733721c3cb h1:ilqSFSbR1fq6x88heeHrvAqlg+ES+tZk2ZcaCmiH1gI= github.com/GoKillers/libsodium-go v0.0.0-20171022220152-dd733721c3cb/go.mod h1:72TQeEkiDH9QMXZa5nJJvZre0UjqqO67X2QEIoOwCRU= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github/v33 v33.0.0 h1:qAf9yP0qc54ufQxzwv+u9H0tiVOnPJxo0lI/JXqw3ZM= github.com/google/go-github/v33 v33.0.0/go.mod h1:GMdDnVZY/2TsWgp/lkYnpSAh6TrzhANBBwm6k6TTEXg= github.com/google/go-github/v38 v38.0.0 h1:rCspN8/6kB1BAJWZfuafvHhyfIo5fkAulaP/3bOQ/tM= github.com/google/go-github/v38 v38.0.0/go.mod h1:LM7in3NmXDrX58GbEHy7FtNLbI2JijX93RnMKvWG3m4= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 h1:ld7aEMNHoBnnDAX15v1T6z31v8HwR2A9FYOuAhWqkwc= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= go-github-38.1.0/example/newreposecretwithlibsodium/main.go000066400000000000000000000134061410475703100240750ustar00rootroot00000000000000// Copyright 2020 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. // newreposecretwithlibsodium creates a new secret in GitHub for a given owner/repo. // newreposecretwithlibsodium depends on sodium being installed. Installation instructions for Sodium can be found at this url: // https://github.com/jedisct1/libsodium // // nnewreposecretwithlibsodium has two required flags for owner and repo, and takes in one argument for the name of the secret to add. // The secret value is pulled from an environment variable based on the secret name. // To authenticate with GitHub, provide your token via an environment variable GITHUB_AUTH_TOKEN. // // To verify the new secret, navigate to GitHub Repository > Settings > left side options bar > Secrets. // // Usage: // export GITHUB_AUTH_TOKEN= // export SECRET_VARIABLE= // go run main.go -owner -repo SECRET_VARIABLE // // Example: // export GITHUB_AUTH_TOKEN=0000000000000000 // export SECRET_VARIABLE="my-secret" // go run main.go -owner google -repo go-github SECRET_VARIABLE package main import ( "context" "encoding/base64" "errors" "flag" "fmt" "log" "os" sodium "github.com/GoKillers/libsodium-go/cryptobox" "github.com/google/go-github/v38/github" "golang.org/x/oauth2" ) var ( repo = flag.String("repo", "", "The repo that the secret should be added to, ex. go-github") owner = flag.String("owner", "", "The owner of there repo this should be added to, ex. google") ) func main() { flag.Parse() token := os.Getenv("GITHUB_AUTH_TOKEN") if token == "" { log.Fatal("please provide a GitHub API token via env variable GITHUB_AUTH_TOKEN") } if *repo == "" { log.Fatal("please provide required flag --repo to specify GitHub repository ") } if *owner == "" { log.Fatal("please provide required flag --owner to specify GitHub user/org owner") } secretName, err := getSecretName() if err != nil { log.Fatal(err) } secretValue, err := getSecretValue(secretName) if err != nil { log.Fatal(err) } ctx, client, err := githubAuth(token) if err != nil { log.Fatalf("unable to authorize using env GITHUB_AUTH_TOKEN: %v", err) } if err := addRepoSecret(ctx, client, *owner, *repo, secretName, secretValue); err != nil { log.Fatal(err) } fmt.Printf("Added secret %q to the repo %v/%v\n", secretName, *owner, *repo) } func getSecretName() (string, error) { secretName := flag.Arg(0) if secretName == "" { return "", fmt.Errorf("missing argument secret name") } return secretName, nil } func getSecretValue(secretName string) (string, error) { secretValue := os.Getenv(secretName) if secretValue == "" { return "", fmt.Errorf("secret value not found under env variable %q", secretName) } return secretValue, nil } // githubAuth returns a GitHub client and context. func githubAuth(token string) (context.Context, *github.Client, error) { ctx := context.Background() ts := oauth2.StaticTokenSource( &oauth2.Token{AccessToken: token}, ) tc := oauth2.NewClient(ctx, ts) client := github.NewClient(tc) return ctx, client, nil } // addRepoSecret will add a secret to a GitHub repo for use in GitHub Actions. // // Finally, the secretName and secretValue will determine the name of the secret added and it's corresponding value. // // The actual transmission of the secret value to GitHub using the api requires that the secret value is encrypted // using the public key of the target repo. This encryption is done using sodium. // // First, the public key of the repo is retrieved. The public key comes base64 // encoded, so it must be decoded prior to use in sodiumlib. // // Second, the secret value is converted into a slice of bytes. // // Third, the secret is encrypted with sodium.CryptoBoxSeal using the repo's decoded public key. // // Fourth, the encrypted secret is encoded as a base64 string to be used in a github.EncodedSecret type. // // Fifth, The other two properties of the github.EncodedSecret type are determined. The name of the secret to be added // (string not base64), and the KeyID of the public key used to encrypt the secret. // This can be retrieved via the public key's GetKeyID method. // // Finally, the github.EncodedSecret is passed into the GitHub client.Actions.CreateOrUpdateRepoSecret method to // populate the secret in the GitHub repo. func addRepoSecret(ctx context.Context, client *github.Client, owner string, repo, secretName string, secretValue string) error { publicKey, _, err := client.Actions.GetRepoPublicKey(ctx, owner, repo) if err != nil { return err } encryptedSecret, err := encryptSecretWithPublicKey(publicKey, secretName, secretValue) if err != nil { return err } if _, err := client.Actions.CreateOrUpdateRepoSecret(ctx, owner, repo, encryptedSecret); err != nil { return fmt.Errorf("Actions.CreateOrUpdateRepoSecret returned error: %v", err) } return nil } func encryptSecretWithPublicKey(publicKey *github.PublicKey, secretName string, secretValue string) (*github.EncryptedSecret, error) { decodedPublicKey, err := base64.StdEncoding.DecodeString(publicKey.GetKey()) if err != nil { return nil, fmt.Errorf("base64.StdEncoding.DecodeString was unable to decode public key: %v", err) } secretBytes := []byte(secretValue) encryptedBytes, exit := sodium.CryptoBoxSeal(secretBytes, decodedPublicKey) if exit != 0 { return nil, errors.New("sodium.CryptoBoxSeal exited with non zero exit code") } encryptedString := base64.StdEncoding.EncodeToString(encryptedBytes) keyID := publicKey.GetKeyID() encryptedSecret := &github.EncryptedSecret{ Name: secretName, KeyID: keyID, EncryptedValue: encryptedString, } return encryptedSecret, nil } go-github-38.1.0/example/newreposecretwithxcrypto/000077500000000000000000000000001410475703100223375ustar00rootroot00000000000000go-github-38.1.0/example/newreposecretwithxcrypto/go.mod000066400000000000000000000005211410475703100234430ustar00rootroot00000000000000module newreposecretwithxcrypto go 1.15 require ( github.com/google/go-github/v38 v38.0.0 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d // indirect golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 // indirect ) go-github-38.1.0/example/newreposecretwithxcrypto/go.sum000066400000000000000000001124671410475703100235050ustar00rootroot00000000000000cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github/v38 v38.0.0 h1:rCspN8/6kB1BAJWZfuafvHhyfIo5fkAulaP/3bOQ/tM= github.com/google/go-github/v38 v38.0.0/go.mod h1:LM7in3NmXDrX58GbEHy7FtNLbI2JijX93RnMKvWG3m4= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d h1:20cMwl2fHAzkJMEA+8J4JgqBQcQGzbisXo31MIeenXI= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 h1:ld7aEMNHoBnnDAX15v1T6z31v8HwR2A9FYOuAhWqkwc= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 h1:siQdpVirKtzPhKl3lZWozZraCFObP8S1v6PRp0bLrtU= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= go-github-38.1.0/example/newreposecretwithxcrypto/main.go000066400000000000000000000137011410475703100236140ustar00rootroot00000000000000// Copyright 2021 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. // newreposecretwithxcrypto creates a new secret in GitHub for a given owner/repo. // newreposecretwithxcrypto uses x/crypto/nacl/box instead of sodium. // It does not depend on any native libraries and is easier to cross-compile for different platforms. // Quite possibly there is a performance penalty due to this. // // newreposecretwithxcrypto has two required flags for owner and repo, and takes in one argument for the name of the secret to add. // The secret value is pulled from an environment variable based on the secret name. // To authenticate with GitHub, provide your token via an environment variable GITHUB_AUTH_TOKEN. // // To verify the new secret, navigate to GitHub Repository > Settings > left side options bar > Secrets. // // Usage: // export GITHUB_AUTH_TOKEN= // export SECRET_VARIABLE= // go run main.go -owner -repo SECRET_VARIABLE // // Example: // export GITHUB_AUTH_TOKEN=0000000000000000 // export SECRET_VARIABLE="my-secret" // go run main.go -owner google -repo go-github SECRET_VARIABLE package main import ( "context" crypto_rand "crypto/rand" "encoding/base64" "flag" "fmt" "log" "os" "github.com/google/go-github/v38/github" "golang.org/x/crypto/nacl/box" "golang.org/x/oauth2" ) var ( repo = flag.String("repo", "", "The repo that the secret should be added to, ex. go-github") owner = flag.String("owner", "", "The owner of there repo this should be added to, ex. google") ) func main() { flag.Parse() token := os.Getenv("GITHUB_AUTH_TOKEN") if token == "" { log.Fatal("please provide a GitHub API token via env variable GITHUB_AUTH_TOKEN") } if *repo == "" { log.Fatal("please provide required flag --repo to specify GitHub repository ") } if *owner == "" { log.Fatal("please provide required flag --owner to specify GitHub user/org owner") } secretName, err := getSecretName() if err != nil { log.Fatal(err) } secretValue, err := getSecretValue(secretName) if err != nil { log.Fatal(err) } ctx, client, err := githubAuth(token) if err != nil { log.Fatalf("unable to authorize using env GITHUB_AUTH_TOKEN: %v", err) } if err := addRepoSecret(ctx, client, *owner, *repo, secretName, secretValue); err != nil { log.Fatal(err) } fmt.Printf("Added secret %q to the repo %v/%v\n", secretName, *owner, *repo) } func getSecretName() (string, error) { secretName := flag.Arg(0) if secretName == "" { return "", fmt.Errorf("missing argument secret name") } return secretName, nil } func getSecretValue(secretName string) (string, error) { secretValue := os.Getenv(secretName) if secretValue == "" { return "", fmt.Errorf("secret value not found under env variable %q", secretName) } return secretValue, nil } // githubAuth returns a GitHub client and context. func githubAuth(token string) (context.Context, *github.Client, error) { ctx := context.Background() ts := oauth2.StaticTokenSource( &oauth2.Token{AccessToken: token}, ) tc := oauth2.NewClient(ctx, ts) client := github.NewClient(tc) return ctx, client, nil } // addRepoSecret will add a secret to a GitHub repo for use in GitHub Actions. // // Finally, the secretName and secretValue will determine the name of the secret added and it's corresponding value. // // The actual transmission of the secret value to GitHub using the api requires that the secret value is encrypted // using the public key of the target repo. This encryption is done using x/crypto/nacl/box. // // First, the public key of the repo is retrieved. The public key comes base64 // encoded, so it must be decoded prior to use. // // Second, the decode key is converted into a fixed size byte array. // // Third, the secret value is converted into a slice of bytes. // // Fourth, the secret is encrypted with box.SealAnonymous using the repo's decoded public key. // // Fifth, the encrypted secret is encoded as a base64 string to be used in a github.EncodedSecret type. // // Sixt, The other two properties of the github.EncodedSecret type are determined. The name of the secret to be added // (string not base64), and the KeyID of the public key used to encrypt the secret. // This can be retrieved via the public key's GetKeyID method. // // Finally, the github.EncodedSecret is passed into the GitHub client.Actions.CreateOrUpdateRepoSecret method to // populate the secret in the GitHub repo. func addRepoSecret(ctx context.Context, client *github.Client, owner string, repo, secretName string, secretValue string) error { publicKey, _, err := client.Actions.GetRepoPublicKey(ctx, owner, repo) if err != nil { return err } encryptedSecret, err := encryptSecretWithPublicKey(publicKey, secretName, secretValue) if err != nil { return err } if _, err := client.Actions.CreateOrUpdateRepoSecret(ctx, owner, repo, encryptedSecret); err != nil { return fmt.Errorf("Actions.CreateOrUpdateRepoSecret returned error: %v", err) } return nil } func encryptSecretWithPublicKey(publicKey *github.PublicKey, secretName string, secretValue string) (*github.EncryptedSecret, error) { decodedPublicKey, err := base64.StdEncoding.DecodeString(publicKey.GetKey()) if err != nil { return nil, fmt.Errorf("base64.StdEncoding.DecodeString was unable to decode public key: %v", err) } var boxKey [32]byte copy(boxKey[:], decodedPublicKey) secretBytes := []byte(secretValue) encryptedBytes, err := box.SealAnonymous([]byte{}, secretBytes, &boxKey, crypto_rand.Reader) if err != nil { return nil, fmt.Errorf("box.SealAnonymous failed with error %w", err) } encryptedString := base64.StdEncoding.EncodeToString(encryptedBytes) keyID := publicKey.GetKeyID() encryptedSecret := &github.EncryptedSecret{ Name: secretName, KeyID: keyID, EncryptedValue: encryptedString, } return encryptedSecret, nil } go-github-38.1.0/example/simple/000077500000000000000000000000001410475703100164165ustar00rootroot00000000000000go-github-38.1.0/example/simple/main.go000066400000000000000000000020171410475703100176710ustar00rootroot00000000000000// Copyright 2017 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. // The simple command demonstrates a simple functionality which // prompts the user for a GitHub username and lists all the public // organization memberships of the specified username. package main import ( "context" "fmt" "github.com/google/go-github/v38/github" ) // Fetch all the public organizations' membership of a user. // func fetchOrganizations(username string) ([]*github.Organization, error) { client := github.NewClient(nil) orgs, _, err := client.Organizations.List(context.Background(), username, nil) return orgs, err } func main() { var username string fmt.Print("Enter GitHub username: ") fmt.Scanf("%s", &username) organizations, err := fetchOrganizations(username) if err != nil { fmt.Printf("Error: %v\n", err) return } for i, organization := range organizations { fmt.Printf("%v. %v\n", i+1, organization.GetLogin()) } } go-github-38.1.0/example/tokenauth/000077500000000000000000000000001410475703100171275ustar00rootroot00000000000000go-github-38.1.0/example/tokenauth/main.go000066400000000000000000000024041410475703100204020ustar00rootroot00000000000000// Copyright 2020 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. // The tokenauth command demonstrates using the oauth2.StaticTokenSource. // You can test out a GitHub Personal Access Token using this simple example. // You can generate them here: https://github.com/settings/tokens package main import ( "context" "fmt" "log" "syscall" "github.com/google/go-github/v38/github" "golang.org/x/crypto/ssh/terminal" "golang.org/x/oauth2" ) func main() { fmt.Print("GitHub Token: ") byteToken, _ := terminal.ReadPassword(int(syscall.Stdin)) println() token := string(byteToken) ctx := context.Background() ts := oauth2.StaticTokenSource( &oauth2.Token{AccessToken: token}, ) tc := oauth2.NewClient(ctx, ts) client := github.NewClient(tc) user, resp, err := client.Users.Get(ctx, "") if err != nil { fmt.Printf("\nerror: %v\n", err) return } // Rate.Limit should most likely be 5000 when authorized. log.Printf("Rate: %#v\n", resp.Rate) // If a Token Expiration has been set, it will be displayed. if !resp.TokenExpiration.IsZero() { log.Printf("Token Expiration: %v\n", resp.TokenExpiration) } fmt.Printf("\n%v\n", github.Stringify(user)) } go-github-38.1.0/example/topics/000077500000000000000000000000001410475703100164265ustar00rootroot00000000000000go-github-38.1.0/example/topics/main.go000066400000000000000000000017251410475703100177060ustar00rootroot00000000000000// Copyright 2019 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. // The simple command demonstrates the functionality that // prompts the user for a GitHub topic and lists all the entities // that are related to the specified topic or subject. package main import ( "context" "fmt" "github.com/google/go-github/v38/github" ) // Fetch and lists all the public topics associated with the specified GitHub topic func fetchTopics(topic string) (*github.TopicsSearchResult, error) { client := github.NewClient(nil) topics, _, err := client.Search.Topics(context.Background(), topic, nil) return topics, err } func main() { var topic string fmt.Print("Enter GitHub topic: ") fmt.Scanf("%s", &topic) topics, err := fetchTopics(topic) if err != nil { fmt.Printf("Error: %v\n", err) return } for _, topic := range topics.Topics { fmt.Println(*topic.Name) } } go-github-38.1.0/github/000077500000000000000000000000001410475703100147545ustar00rootroot00000000000000go-github-38.1.0/github/actions.go000066400000000000000000000006241410475703100167450ustar00rootroot00000000000000// Copyright 2020 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 // ActionsService handles communication with the actions related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/ type ActionsService service go-github-38.1.0/github/actions_artifacts.go000066400000000000000000000125751410475703100210150ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "fmt" "net/http" "net/url" ) // Artifact reprents a GitHub artifact. Artifacts allow sharing // data between jobs in a workflow and provide storage for data // once a workflow is complete. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/artifacts/ type Artifact struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Name *string `json:"name,omitempty"` SizeInBytes *int64 `json:"size_in_bytes,omitempty"` ArchiveDownloadURL *string `json:"archive_download_url,omitempty"` Expired *bool `json:"expired,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` ExpiresAt *Timestamp `json:"expires_at,omitempty"` } // ArtifactList represents a list of GitHub artifacts. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/artifacts/ type ArtifactList struct { TotalCount *int64 `json:"total_count,omitempty"` Artifacts []*Artifact `json:"artifacts,omitempty"` } // ListArtifacts lists all artifacts that belong to a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-artifacts-for-a-repository func (s *ActionsService) ListArtifacts(ctx context.Context, owner, repo string, opts *ListOptions) (*ArtifactList, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/artifacts", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } artifactList := new(ArtifactList) resp, err := s.client.Do(ctx, req, artifactList) if err != nil { return nil, resp, err } return artifactList, resp, nil } // ListWorkflowRunArtifacts lists all artifacts that belong to a workflow run. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-workflow-run-artifacts func (s *ActionsService) ListWorkflowRunArtifacts(ctx context.Context, owner, repo string, runID int64, opts *ListOptions) (*ArtifactList, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/artifacts", owner, repo, runID) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } artifactList := new(ArtifactList) resp, err := s.client.Do(ctx, req, artifactList) if err != nil { return nil, resp, err } return artifactList, resp, nil } // GetArtifact gets a specific artifact for a workflow run. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-artifact func (s *ActionsService) GetArtifact(ctx context.Context, owner, repo string, artifactID int64) (*Artifact, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/artifacts/%v", owner, repo, artifactID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } artifact := new(Artifact) resp, err := s.client.Do(ctx, req, artifact) if err != nil { return nil, resp, err } return artifact, resp, nil } // DownloadArtifact gets a redirect URL to download an archive for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/artifacts/#download-an-artifact func (s *ActionsService) DownloadArtifact(ctx context.Context, owner, repo string, artifactID int64, followRedirects bool) (*url.URL, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/artifacts/%v/zip", owner, repo, artifactID) resp, err := s.getDownloadArtifactFromURL(ctx, u, followRedirects) if err != nil { return nil, nil, err } if resp.StatusCode != http.StatusFound { return nil, newResponse(resp), fmt.Errorf("unexpected status code: %s", resp.Status) } parsedURL, err := url.Parse(resp.Header.Get("Location")) return parsedURL, newResponse(resp), nil } func (s *ActionsService) getDownloadArtifactFromURL(ctx context.Context, u string, followRedirects bool) (*http.Response, error) { req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, err } var resp *http.Response // Use http.DefaultTransport if no custom Transport is configured req = withContext(ctx, req) if s.client.client.Transport == nil { resp, err = http.DefaultTransport.RoundTrip(req) } else { resp, err = s.client.client.Transport.RoundTrip(req) } if err != nil { return nil, err } resp.Body.Close() // If redirect response is returned, follow it if followRedirects && resp.StatusCode == http.StatusMovedPermanently { u = resp.Header.Get("Location") resp, err = s.getDownloadArtifactFromURL(ctx, u, false) } return resp, err } // DeleteArtifact deletes a workflow run artifact. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-an-artifact func (s *ActionsService) DeleteArtifact(ctx context.Context, owner, repo string, artifactID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/artifacts/%v", owner, repo, artifactID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/actions_artifacts_test.go000066400000000000000000000343111410475703100220440ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "errors" "fmt" "net/http" "net/url" "testing" "github.com/google/go-cmp/cmp" ) func TestActionsService_ListArtifacts(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/artifacts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `{ "total_count":1, "artifacts":[{"id":1}] }`, ) }) opts := &ListOptions{Page: 2} ctx := context.Background() artifacts, _, err := client.Actions.ListArtifacts(ctx, "o", "r", opts) if err != nil { t.Errorf("Actions.ListArtifacts returned error: %v", err) } want := &ArtifactList{TotalCount: Int64(1), Artifacts: []*Artifact{{ID: Int64(1)}}} if !cmp.Equal(artifacts, want) { t.Errorf("Actions.ListArtifacts returned %+v, want %+v", artifacts, want) } const methodName = "ListArtifacts" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListArtifacts(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListArtifacts(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_ListArtifacts_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.ListArtifacts(ctx, "%", "r", nil) testURLParseError(t, err) } func TestActionsService_ListArtifacts_invalidRepo(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.ListArtifacts(ctx, "o", "%", nil) testURLParseError(t, err) } func TestActionsService_ListArtifacts_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/artifacts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() artifacts, resp, err := client.Actions.ListArtifacts(ctx, "o", "r", nil) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Actions.ListArtifacts return status %d, want %d", got, want) } if artifacts != nil { t.Errorf("Actions.ListArtifacts return %+v, want nil", artifacts) } } func TestActionsService_ListWorkflowRunArtifacts(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/1/artifacts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `{ "total_count":1, "artifacts":[{"id":1}] }`, ) }) opts := &ListOptions{Page: 2} ctx := context.Background() artifacts, _, err := client.Actions.ListWorkflowRunArtifacts(ctx, "o", "r", 1, opts) if err != nil { t.Errorf("Actions.ListWorkflowRunArtifacts returned error: %v", err) } want := &ArtifactList{TotalCount: Int64(1), Artifacts: []*Artifact{{ID: Int64(1)}}} if !cmp.Equal(artifacts, want) { t.Errorf("Actions.ListWorkflowRunArtifacts returned %+v, want %+v", artifacts, want) } const methodName = "ListWorkflowRunArtifacts" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListWorkflowRunArtifacts(ctx, "\n", "\n", -1, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListWorkflowRunArtifacts(ctx, "o", "r", 1, opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_ListWorkflowRunArtifacts_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.ListWorkflowRunArtifacts(ctx, "%", "r", 1, nil) testURLParseError(t, err) } func TestActionsService_ListWorkflowRunArtifacts_invalidRepo(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.ListWorkflowRunArtifacts(ctx, "o", "%", 1, nil) testURLParseError(t, err) } func TestActionsService_ListWorkflowRunArtifacts_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/1/artifacts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() artifacts, resp, err := client.Actions.ListWorkflowRunArtifacts(ctx, "o", "r", 1, nil) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Actions.ListWorkflowRunArtifacts return status %d, want %d", got, want) } if artifacts != nil { t.Errorf("Actions.ListWorkflowRunArtifacts return %+v, want nil", artifacts) } } func TestActionsService_GetArtifact(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/artifacts/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "id":1, "node_id":"xyz", "name":"a", "size_in_bytes":5, "archive_download_url":"u" }`) }) ctx := context.Background() artifact, _, err := client.Actions.GetArtifact(ctx, "o", "r", 1) if err != nil { t.Errorf("Actions.GetArtifact returned error: %v", err) } want := &Artifact{ ID: Int64(1), NodeID: String("xyz"), Name: String("a"), SizeInBytes: Int64(5), ArchiveDownloadURL: String("u"), } if !cmp.Equal(artifact, want) { t.Errorf("Actions.GetArtifact returned %+v, want %+v", artifact, want) } const methodName = "GetArtifact" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetArtifact(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetArtifact(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetArtifact_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.GetArtifact(ctx, "%", "r", 1) testURLParseError(t, err) } func TestActionsService_GetArtifact_invalidRepo(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.GetArtifact(ctx, "o", "%", 1) testURLParseError(t, err) } func TestActionsService_GetArtifact_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/artifacts/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() artifact, resp, err := client.Actions.GetArtifact(ctx, "o", "r", 1) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Actions.GetArtifact return status %d, want %d", got, want) } if artifact != nil { t.Errorf("Actions.GetArtifact return %+v, want nil", artifact) } } func TestActionsSerivice_DownloadArtifact(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/artifacts/1/zip", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Redirect(w, r, "https://github.com/artifact", http.StatusFound) }) ctx := context.Background() url, resp, err := client.Actions.DownloadArtifact(ctx, "o", "r", 1, true) if err != nil { t.Errorf("Actions.DownloadArtifact returned error: %v", err) } if resp.StatusCode != http.StatusFound { t.Errorf("Actions.DownloadArtifact returned status: %d, want %d", resp.StatusCode, http.StatusFound) } want := "https://github.com/artifact" if url.String() != want { t.Errorf("Actions.DownloadArtifact returned %+v, want %+v", url.String(), want) } const methodName = "DownloadArtifact" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.DownloadArtifact(ctx, "\n", "\n", -1, true) return err }) // Add custom round tripper client.client.Transport = roundTripperFunc(func(r *http.Request) (*http.Response, error) { return nil, errors.New("failed to download artifact") }) testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.DownloadArtifact(ctx, "o", "r", 1, true) return err }) } func TestActionsService_DownloadArtifact_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.DownloadArtifact(ctx, "%", "r", 1, true) testURLParseError(t, err) } func TestActionsService_DownloadArtifact_invalidRepo(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.DownloadArtifact(ctx, "o", "%", 1, true) testURLParseError(t, err) } func TestActionsService_DownloadArtifact_StatusMovedPermanently_dontFollowRedirects(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/artifacts/1/zip", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Redirect(w, r, "https://github.com/artifact", http.StatusMovedPermanently) }) ctx := context.Background() _, resp, _ := client.Actions.DownloadArtifact(ctx, "o", "r", 1, false) if resp.StatusCode != http.StatusMovedPermanently { t.Errorf("Actions.DownloadArtifact return status %d, want %d", resp.StatusCode, http.StatusMovedPermanently) } } func TestActionsService_DownloadArtifact_StatusMovedPermanently_followRedirects(t *testing.T) { client, mux, serverURL, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/artifacts/1/zip", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") redirectURL, _ := url.Parse(serverURL + baseURLPath + "/redirect") http.Redirect(w, r, redirectURL.String(), http.StatusMovedPermanently) }) mux.HandleFunc("/redirect", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Redirect(w, r, "http://github.com/artifact", http.StatusFound) }) ctx := context.Background() url, resp, err := client.Actions.DownloadArtifact(ctx, "o", "r", 1, true) if err != nil { t.Errorf("Actions.DownloadArtifact return error: %v", err) } if resp.StatusCode != http.StatusFound { t.Errorf("Actions.DownloadArtifact return status %d, want %d", resp.StatusCode, http.StatusFound) } want := "http://github.com/artifact" if url.String() != want { t.Errorf("Actions.DownloadArtifact returned %+v, want %+v", url.String(), want) } } func TestActionsService_DeleteArtifact(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/artifacts/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Actions.DeleteArtifact(ctx, "o", "r", 1) if err != nil { t.Errorf("Actions.DeleteArtifact return error: %v", err) } const methodName = "DeleteArtifact" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.DeleteArtifact(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.DeleteArtifact(ctx, "o", "r", 1) }) } func TestActionsService_DeleteArtifact_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Actions.DeleteArtifact(ctx, "%", "r", 1) testURLParseError(t, err) } func TestActionsService_DeleteArtifact_invalidRepo(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Actions.DeleteArtifact(ctx, "o", "%", 1) testURLParseError(t, err) } func TestActionsService_DeleteArtifact_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/artifacts/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() resp, err := client.Actions.DeleteArtifact(ctx, "o", "r", 1) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Actions.DeleteArtifact return status %d, want %d", got, want) } } func TestArtifact_Marshal(t *testing.T) { testJSONMarshal(t, &Artifact{}, "{}") u := &Artifact{ ID: Int64(1), NodeID: String("nid"), Name: String("n"), SizeInBytes: Int64(1), ArchiveDownloadURL: String("a"), Expired: Bool(false), CreatedAt: &Timestamp{referenceTime}, ExpiresAt: &Timestamp{referenceTime}, } want := `{ "id": 1, "node_id": "nid", "name": "n", "size_in_bytes": 1, "archive_download_url": "a", "expired": false, "created_at": ` + referenceTimeStr + `, "expires_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } func TestArtifactList_Marshal(t *testing.T) { testJSONMarshal(t, &ArtifactList{}, "{}") u := &ArtifactList{ TotalCount: Int64(1), Artifacts: []*Artifact{ { ID: Int64(1), NodeID: String("nid"), Name: String("n"), SizeInBytes: Int64(1), ArchiveDownloadURL: String("a"), Expired: Bool(false), CreatedAt: &Timestamp{referenceTime}, ExpiresAt: &Timestamp{referenceTime}, }, }, } want := `{ "total_count": 1, "artifacts": [{ "id": 1, "node_id": "nid", "name": "n", "size_in_bytes": 1, "archive_download_url": "a", "expired": false, "created_at": ` + referenceTimeStr + `, "expires_at": ` + referenceTimeStr + ` }] }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/actions_runner_groups.go000066400000000000000000000263721410475703100217450ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "fmt" ) // RunnerGroup represents a self-hosted runner group configured in an organization. type RunnerGroup struct { ID *int64 `json:"id,omitempty"` Name *string `json:"name,omitempty"` Visibility *string `json:"visibility,omitempty"` Default *bool `json:"default,omitempty"` SelectedRepositoriesURL *string `json:"selected_repositories_url,omitempty"` RunnersURL *string `json:"runners_url,omitempty"` Inherited *bool `json:"inherited,omitempty"` AllowsPublicRepositories *bool `json:"allows_public_repositories,omitempty"` } // RunnerGroups represents a collection of self-hosted runner groups configured for an organization. type RunnerGroups struct { TotalCount int `json:"total_count"` RunnerGroups []*RunnerGroup `json:"runner_groups"` } // CreateRunnerGroupRequest represents a request to create a Runner group for an organization. type CreateRunnerGroupRequest struct { Name *string `json:"name,omitempty"` Visibility *string `json:"visibility,omitempty"` // List of repository IDs that can access the runner group. SelectedRepositoryIDs []int64 `json:"selected_repository_ids,omitempty"` // Runners represent a list of runner IDs to add to the runner group. Runners []int64 `json:"runners,omitempty"` // If set to True, public repos can use this runner group AllowsPublicRepositories *bool `json:"allows_public_repositories,omitempty"` } // UpdateRunnerGroupRequest represents a request to update a Runner group for an organization. type UpdateRunnerGroupRequest struct { Name *string `json:"name,omitempty"` Visibility *string `json:"visibility,omitempty"` AllowsPublicRepositories *bool `json:"allows_public_repositories,omitempty"` } // SetRepoAccessRunnerGroupRequest represents a request to replace the list of repositories // that can access a self-hosted runner group configured in an organization. type SetRepoAccessRunnerGroupRequest struct { // Updated list of repository IDs that should be given access to the runner group. SelectedRepositoryIDs []int64 `json:"selected_repository_ids"` } // SetRunnerGroupRunnersRequest represents a request to replace the list of // self-hosted runners that are part of an organization runner group. type SetRunnerGroupRunnersRequest struct { // Updated list of runner IDs that should be given access to the runner group. Runners []int64 `json:"runners"` } // ListOrganizationRunnerGroups lists all self-hosted runner groups configured in an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-self-hosted-runner-groups-for-an-organization func (s *ActionsService) ListOrganizationRunnerGroups(ctx context.Context, org string, opts *ListOptions) (*RunnerGroups, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runner-groups", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } groups := &RunnerGroups{} resp, err := s.client.Do(ctx, req, &groups) if err != nil { return nil, resp, err } return groups, resp, nil } // GetOrganizationRunnerGroup gets a specific self-hosted runner group for an organization using its RunnerGroup ID. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#get-a-self-hosted-runner-group-for-an-organization func (s *ActionsService) GetOrganizationRunnerGroup(ctx context.Context, org string, groupID int64) (*RunnerGroup, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runner-groups/%v", org, groupID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } runnerGroup := new(RunnerGroup) resp, err := s.client.Do(ctx, req, runnerGroup) if err != nil { return nil, resp, err } return runnerGroup, resp, nil } // DeleteOrganizationRunnerGroup deletes a self-hosted runner group from an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#delete-a-self-hosted-runner-group-from-an-organization func (s *ActionsService) DeleteOrganizationRunnerGroup(ctx context.Context, org string, groupID int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/runner-groups/%v", org, groupID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // CreateOrganizationRunnerGroup creates a new self-hosted runner group for an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#create-a-self-hosted-runner-group-for-an-organization func (s *ActionsService) CreateOrganizationRunnerGroup(ctx context.Context, org string, createReq CreateRunnerGroupRequest) (*RunnerGroup, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runner-groups", org) req, err := s.client.NewRequest("POST", u, createReq) if err != nil { return nil, nil, err } runnerGroup := new(RunnerGroup) resp, err := s.client.Do(ctx, req, runnerGroup) if err != nil { return nil, resp, err } return runnerGroup, resp, nil } // UpdateOrganizationRunnerGroup updates a self-hosted runner group for an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#update-a-self-hosted-runner-group-for-an-organization func (s *ActionsService) UpdateOrganizationRunnerGroup(ctx context.Context, org string, groupID int64, updateReq UpdateRunnerGroupRequest) (*RunnerGroup, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runner-groups/%v", org, groupID) req, err := s.client.NewRequest("PATCH", u, updateReq) if err != nil { return nil, nil, err } runnerGroup := new(RunnerGroup) resp, err := s.client.Do(ctx, req, runnerGroup) if err != nil { return nil, resp, err } return runnerGroup, resp, nil } // ListRepositoryAccessRunnerGroup lists the repositories with access to a self-hosted runner group configured in an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-repository-access-to-a-self-hosted-runner-group-in-an-organization func (s *ActionsService) ListRepositoryAccessRunnerGroup(ctx context.Context, org string, groupID int64) (*ListRepositories, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runner-groups/%v/repositories", org, groupID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } repos := &ListRepositories{} resp, err := s.client.Do(ctx, req, &repos) if err != nil { return nil, resp, err } return repos, resp, nil } // SetRepositoryAccessRunnerGroup replaces the list of repositories that have access to a self-hosted runner group configured in an organization // with a new List of repositories. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#set-repository-access-for-a-self-hosted-runner-group-in-an-organization func (s *ActionsService) SetRepositoryAccessRunnerGroup(ctx context.Context, org string, groupID int64, ids SetRepoAccessRunnerGroupRequest) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/runner-groups/%v/repositories", org, groupID) req, err := s.client.NewRequest("PUT", u, ids) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // AddRepositoryAccessRunnerGroup adds a repository to the list of selected repositories that can access a self-hosted runner group. // The runner group must have visibility set to 'selected'. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#add-repository-access-to-a-self-hosted-runner-group-in-an-organization func (s *ActionsService) AddRepositoryAccessRunnerGroup(ctx context.Context, org string, groupID, repoID int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/runner-groups/%v/repositories/%v", org, groupID, repoID) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // RemoveRepositoryAccessRunnerGroup removes a repository from the list of selected repositories that can access a self-hosted runner group. // The runner group must have visibility set to 'selected'. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#remove-repository-access-to-a-self-hosted-runner-group-in-an-organization func (s *ActionsService) RemoveRepositoryAccessRunnerGroup(ctx context.Context, org string, groupID, repoID int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/runner-groups/%v/repositories/%v", org, groupID, repoID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListRunnerGroupRunners lists self-hosted runners that are in a specific organization group. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-self-hosted-runners-in-a-group-for-an-organization func (s *ActionsService) ListRunnerGroupRunners(ctx context.Context, org string, groupID int64, opts *ListOptions) (*Runners, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runner-groups/%v/runners", org, groupID) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } runners := &Runners{} resp, err := s.client.Do(ctx, req, &runners) if err != nil { return nil, resp, err } return runners, resp, nil } // SetRunnerGroupRunners replaces the list of self-hosted runners that are part of an organization runner group // with a new list of runners. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#set-self-hosted-runners-in-a-group-for-an-organization func (s *ActionsService) SetRunnerGroupRunners(ctx context.Context, org string, groupID int64, ids SetRunnerGroupRunnersRequest) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/runner-groups/%v/runners", org, groupID) req, err := s.client.NewRequest("PUT", u, ids) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // AddRunnerGroupRunners adds a self-hosted runner to a runner group configured in an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#add-a-self-hosted-runner-to-a-group-for-an-organization func (s *ActionsService) AddRunnerGroupRunners(ctx context.Context, org string, groupID, runnerID int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/runner-groups/%v/runners/%v", org, groupID, runnerID) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // RemoveRunnerGroupRunners removes a self-hosted runner from a group configured in an organization. // The runner is then returned to the default group. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#remove-a-self-hosted-runner-from-a-group-for-an-organization func (s *ActionsService) RemoveRunnerGroupRunners(ctx context.Context, org string, groupID, runnerID int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/runner-groups/%v/runners/%v", org, groupID, runnerID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/actions_runner_groups_test.go000066400000000000000000000510651410475703100230010ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestActionsService_ListOrganizationRunnerGroups(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runner-groups", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprint(w, `{"total_count":3,"runner_groups":[{"id":1,"name":"Default","visibility":"all","default":true,"runners_url":"https://api.github.com/orgs/octo-org/actions/runner_groups/1/runners","inherited":false,"allows_public_repositories":true},{"id":2,"name":"octo-runner-group","visibility":"selected","default":false,"selected_repositories_url":"https://api.github.com/orgs/octo-org/actions/runner_groups/2/repositories","runners_url":"https://api.github.com/orgs/octo-org/actions/runner_groups/2/runners","inherited":true,"allows_public_repositories":true},{"id":3,"name":"expensive-hardware","visibility":"private","default":false,"runners_url":"https://api.github.com/orgs/octo-org/actions/runner_groups/3/runners","inherited":false,"allows_public_repositories":true}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() groups, _, err := client.Actions.ListOrganizationRunnerGroups(ctx, "o", opts) if err != nil { t.Errorf("Actions.ListOrganizationRunnerGroups returned error: %v", err) } want := &RunnerGroups{ TotalCount: 3, RunnerGroups: []*RunnerGroup{ {ID: Int64(1), Name: String("Default"), Visibility: String("all"), Default: Bool(true), RunnersURL: String("https://api.github.com/orgs/octo-org/actions/runner_groups/1/runners"), Inherited: Bool(false), AllowsPublicRepositories: Bool(true)}, {ID: Int64(2), Name: String("octo-runner-group"), Visibility: String("selected"), Default: Bool(false), SelectedRepositoriesURL: String("https://api.github.com/orgs/octo-org/actions/runner_groups/2/repositories"), RunnersURL: String("https://api.github.com/orgs/octo-org/actions/runner_groups/2/runners"), Inherited: Bool(true), AllowsPublicRepositories: Bool(true)}, {ID: Int64(3), Name: String("expensive-hardware"), Visibility: String("private"), Default: Bool(false), RunnersURL: String("https://api.github.com/orgs/octo-org/actions/runner_groups/3/runners"), Inherited: Bool(false), AllowsPublicRepositories: Bool(true)}, }, } if !cmp.Equal(groups, want) { t.Errorf("Actions.ListOrganizationRunnerGroups returned %+v, want %+v", groups, want) } const methodName = "ListOrganizationRunnerGroups" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListOrganizationRunnerGroups(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListOrganizationRunnerGroups(ctx, "o", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetOrganizationRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runner-groups/2", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":2,"name":"octo-runner-group","visibility":"selected","default":false,"selected_repositories_url":"https://api.github.com/orgs/octo-org/actions/runner_groups/2/repositories","runners_url":"https://api.github.com/orgs/octo-org/actions/runner_groups/2/runners","inherited":false,"allows_public_repositories":true}`) }) ctx := context.Background() group, _, err := client.Actions.GetOrganizationRunnerGroup(ctx, "o", 2) if err != nil { t.Errorf("Actions.ListOrganizationRunnerGroups returned error: %v", err) } want := &RunnerGroup{ ID: Int64(2), Name: String("octo-runner-group"), Visibility: String("selected"), Default: Bool(false), SelectedRepositoriesURL: String("https://api.github.com/orgs/octo-org/actions/runner_groups/2/repositories"), RunnersURL: String("https://api.github.com/orgs/octo-org/actions/runner_groups/2/runners"), Inherited: Bool(false), AllowsPublicRepositories: Bool(true), } if !cmp.Equal(group, want) { t.Errorf("Actions.GetOrganizationRunnerGroup returned %+v, want %+v", group, want) } const methodName = "GetOrganizationRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetOrganizationRunnerGroup(ctx, "\n", 2) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetOrganizationRunnerGroup(ctx, "o", 2) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_DeleteOrganizationRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runner-groups/2", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Actions.DeleteOrganizationRunnerGroup(ctx, "o", 2) if err != nil { t.Errorf("Actions.DeleteOrganizationRunnerGroup returned error: %v", err) } const methodName = "DeleteOrganizationRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.DeleteOrganizationRunnerGroup(ctx, "\n", 2) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.DeleteOrganizationRunnerGroup(ctx, "o", 2) }) } func TestActionsService_CreateOrganizationRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runner-groups", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"id":2,"name":"octo-runner-group","visibility":"selected","default":false,"selected_repositories_url":"https://api.github.com/orgs/octo-org/actions/runner_groups/2/repositories","runners_url":"https://api.github.com/orgs/octo-org/actions/runner_groups/2/runners","inherited":false,"allows_public_repositories":true}`) }) ctx := context.Background() req := CreateRunnerGroupRequest{ Name: String("octo-runner-group"), Visibility: String("selected"), AllowsPublicRepositories: Bool(true), } group, _, err := client.Actions.CreateOrganizationRunnerGroup(ctx, "o", req) if err != nil { t.Errorf("Actions.CreateOrganizationRunnerGroup returned error: %v", err) } want := &RunnerGroup{ ID: Int64(2), Name: String("octo-runner-group"), Visibility: String("selected"), Default: Bool(false), SelectedRepositoriesURL: String("https://api.github.com/orgs/octo-org/actions/runner_groups/2/repositories"), RunnersURL: String("https://api.github.com/orgs/octo-org/actions/runner_groups/2/runners"), Inherited: Bool(false), AllowsPublicRepositories: Bool(true), } if !cmp.Equal(group, want) { t.Errorf("Actions.CreateOrganizationRunnerGroup returned %+v, want %+v", group, want) } const methodName = "CreateOrganizationRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.CreateOrganizationRunnerGroup(ctx, "\n", req) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.CreateOrganizationRunnerGroup(ctx, "o", req) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_UpdateOrganizationRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runner-groups/2", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") fmt.Fprint(w, `{"id":2,"name":"octo-runner-group","visibility":"selected","default":false,"selected_repositories_url":"https://api.github.com/orgs/octo-org/actions/runner_groups/2/repositories","runners_url":"https://api.github.com/orgs/octo-org/actions/runner_groups/2/runners","inherited":false,"allows_public_repositories":true}`) }) ctx := context.Background() req := UpdateRunnerGroupRequest{ Name: String("octo-runner-group"), Visibility: String("selected"), AllowsPublicRepositories: Bool(true), } group, _, err := client.Actions.UpdateOrganizationRunnerGroup(ctx, "o", 2, req) if err != nil { t.Errorf("Actions.UpdateOrganizationRunnerGroup returned error: %v", err) } want := &RunnerGroup{ ID: Int64(2), Name: String("octo-runner-group"), Visibility: String("selected"), Default: Bool(false), SelectedRepositoriesURL: String("https://api.github.com/orgs/octo-org/actions/runner_groups/2/repositories"), RunnersURL: String("https://api.github.com/orgs/octo-org/actions/runner_groups/2/runners"), Inherited: Bool(false), AllowsPublicRepositories: Bool(true), } if !cmp.Equal(group, want) { t.Errorf("Actions.UpdateOrganizationRunnerGroup returned %+v, want %+v", group, want) } const methodName = "UpdateOrganizationRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.UpdateOrganizationRunnerGroup(ctx, "\n", 2, req) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.UpdateOrganizationRunnerGroup(ctx, "o", 2, req) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_ListRepositoryAccessRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runner-groups/2/repositories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"total_count": 1, "repositories": [{"id": 43, "node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5", "name": "Hello-World", "full_name": "octocat/Hello-World"}]}`) }) ctx := context.Background() groups, _, err := client.Actions.ListRepositoryAccessRunnerGroup(ctx, "o", 2) if err != nil { t.Errorf("Actions.ListRepositoryAccessRunnerGroup returned error: %v", err) } want := &ListRepositories{ TotalCount: Int(1), Repositories: []*Repository{ {ID: Int64(43), NodeID: String("MDEwOlJlcG9zaXRvcnkxMjk2MjY5"), Name: String("Hello-World"), FullName: String("octocat/Hello-World")}, }, } if !cmp.Equal(groups, want) { t.Errorf("Actions.ListRepositoryAccessRunnerGroup returned %+v, want %+v", groups, want) } const methodName = "ListRepositoryAccessRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListRepositoryAccessRunnerGroup(ctx, "\n", 2) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListRepositoryAccessRunnerGroup(ctx, "o", 2) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_SetRepositoryAccessRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runner-groups/2/repositories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") }) req := SetRepoAccessRunnerGroupRequest{ SelectedRepositoryIDs: []int64{ 1, 2, }, } ctx := context.Background() _, err := client.Actions.SetRepositoryAccessRunnerGroup(ctx, "o", 2, req) if err != nil { t.Errorf("Actions.SetRepositoryAccessRunnerGroup returned error: %v", err) } const methodName = "SetRepositoryAccessRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.SetRepositoryAccessRunnerGroup(ctx, "\n", 2, req) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.SetRepositoryAccessRunnerGroup(ctx, "o", 2, req) }) } func TestActionsService_AddRepositoryAccessRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runner-groups/2/repositories/42", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") }) ctx := context.Background() _, err := client.Actions.AddRepositoryAccessRunnerGroup(ctx, "o", 2, 42) if err != nil { t.Errorf("Actions.AddRepositoryAccessRunnerGroup returned error: %v", err) } const methodName = "AddRepositoryAccessRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.AddRepositoryAccessRunnerGroup(ctx, "\n", 2, 42) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.AddRepositoryAccessRunnerGroup(ctx, "o", 2, 42) }) } func TestActionsService_RemoveRepositoryAccessRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runner-groups/2/repositories/42", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Actions.RemoveRepositoryAccessRunnerGroup(ctx, "o", 2, 42) if err != nil { t.Errorf("Actions.RemoveRepositoryAccessRunnerGroup returned error: %v", err) } const methodName = "RemoveRepositoryAccessRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.RemoveRepositoryAccessRunnerGroup(ctx, "\n", 2, 42) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.RemoveRepositoryAccessRunnerGroup(ctx, "o", 2, 42) }) } func TestActionsService_ListRunnerGroupRunners(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runner-groups/2/runners", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprint(w, `{"total_count":2,"runners":[{"id":23,"name":"MBP","os":"macos","status":"online"},{"id":24,"name":"iMac","os":"macos","status":"offline"}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() runners, _, err := client.Actions.ListRunnerGroupRunners(ctx, "o", 2, opts) if err != nil { t.Errorf("Actions.ListRunnerGroupRunners returned error: %v", err) } want := &Runners{ TotalCount: 2, Runners: []*Runner{ {ID: Int64(23), Name: String("MBP"), OS: String("macos"), Status: String("online")}, {ID: Int64(24), Name: String("iMac"), OS: String("macos"), Status: String("offline")}, }, } if !cmp.Equal(runners, want) { t.Errorf("Actions.ListRunnerGroupRunners returned %+v, want %+v", runners, want) } const methodName = "ListRunnerGroupRunners" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListRunnerGroupRunners(ctx, "\n", 2, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListRunnerGroupRunners(ctx, "o", 2, opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_SetRunnerGroupRunners(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runner-groups/2/runners", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") }) req := SetRunnerGroupRunnersRequest{ Runners: []int64{ 1, 2, }, } ctx := context.Background() _, err := client.Actions.SetRunnerGroupRunners(ctx, "o", 2, req) if err != nil { t.Errorf("Actions.SetRunnerGroupRunners returned error: %v", err) } const methodName = "SetRunnerGroupRunners" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.SetRunnerGroupRunners(ctx, "\n", 2, req) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.SetRunnerGroupRunners(ctx, "o", 2, req) }) } func TestActionsService_AddRunnerGroupRunners(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runner-groups/2/runners/42", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") }) ctx := context.Background() _, err := client.Actions.AddRunnerGroupRunners(ctx, "o", 2, 42) if err != nil { t.Errorf("Actions.AddRunnerGroupRunners returned error: %v", err) } const methodName = "AddRunnerGroupRunners" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.AddRunnerGroupRunners(ctx, "\n", 2, 42) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.AddRunnerGroupRunners(ctx, "o", 2, 42) }) } func TestActionsService_RemoveRunnerGroupRunners(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runner-groups/2/runners/42", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Actions.RemoveRunnerGroupRunners(ctx, "o", 2, 42) if err != nil { t.Errorf("Actions.RemoveRunnerGroupRunners returned error: %v", err) } const methodName = "RemoveRunnerGroupRunners" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.RemoveRunnerGroupRunners(ctx, "\n", 2, 42) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.RemoveRunnerGroupRunners(ctx, "o", 2, 42) }) } func TestRunnerGroup_Marshal(t *testing.T) { testJSONMarshal(t, &RunnerGroup{}, "{}") u := &RunnerGroup{ ID: Int64(1), Name: String("n"), Visibility: String("v"), Default: Bool(true), SelectedRepositoriesURL: String("s"), RunnersURL: String("r"), Inherited: Bool(true), AllowsPublicRepositories: Bool(true), } want := `{ "id": 1, "name": "n", "visibility": "v", "default": true, "selected_repositories_url": "s", "runners_url": "r", "inherited": true, "allows_public_repositories": true }` testJSONMarshal(t, u, want) } func TestRunnerGroups_Marshal(t *testing.T) { testJSONMarshal(t, &RunnerGroups{}, "{}") u := &RunnerGroups{ TotalCount: int(1), RunnerGroups: []*RunnerGroup{ { ID: Int64(1), Name: String("n"), Visibility: String("v"), Default: Bool(true), SelectedRepositoriesURL: String("s"), RunnersURL: String("r"), Inherited: Bool(true), AllowsPublicRepositories: Bool(true), }, }, } want := `{ "total_count": 1, "runner_groups": [{ "id": 1, "name": "n", "visibility": "v", "default": true, "selected_repositories_url": "s", "runners_url": "r", "inherited": true, "allows_public_repositories": true }] }` testJSONMarshal(t, u, want) } func TestCreateRunnerGroupRequest_Marshal(t *testing.T) { testJSONMarshal(t, &CreateRunnerGroupRequest{}, "{}") u := &CreateRunnerGroupRequest{ Name: String("n"), Visibility: String("v"), SelectedRepositoryIDs: []int64{1}, Runners: []int64{1}, AllowsPublicRepositories: Bool(true), } want := `{ "name": "n", "visibility": "v", "selected_repository_ids": [1], "runners": [1], "allows_public_repositories": true }` testJSONMarshal(t, u, want) } func TestUpdateRunnerGroupRequest_Marshal(t *testing.T) { testJSONMarshal(t, &UpdateRunnerGroupRequest{}, "{}") u := &UpdateRunnerGroupRequest{ Name: String("n"), Visibility: String("v"), AllowsPublicRepositories: Bool(true), } want := `{ "name": "n", "visibility": "v", "allows_public_repositories": true }` testJSONMarshal(t, u, want) } func TestSetRepoAccessRunnerGroupRequest_Marshal(t *testing.T) { testJSONMarshal(t, &SetRepoAccessRunnerGroupRequest{}, "{}") u := &SetRepoAccessRunnerGroupRequest{ SelectedRepositoryIDs: []int64{1}, } want := `{ "selected_repository_ids": [1] }` testJSONMarshal(t, u, want) } func TestSetRunnerGroupRunnersRequest_Marshal(t *testing.T) { testJSONMarshal(t, &SetRunnerGroupRunnersRequest{}, "{}") u := &SetRunnerGroupRunnersRequest{ Runners: []int64{1}, } want := `{ "runners": [1] }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/actions_runners.go000066400000000000000000000317411410475703100205250ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "fmt" ) // RunnerApplicationDownload represents a binary for the self-hosted runner application that can be downloaded. type RunnerApplicationDownload struct { OS *string `json:"os,omitempty"` Architecture *string `json:"architecture,omitempty"` DownloadURL *string `json:"download_url,omitempty"` Filename *string `json:"filename,omitempty"` TempDownloadToken *string `json:"temp_download_token,omitempty"` SHA256Checksum *string `json:"sha256_checksum,omitempty"` } // ActionsEnabledOnOrgRepos represents all the repositories in an organization for which Actions is enabled. type ActionsEnabledOnOrgRepos struct { TotalCount int `json:"total_count"` Repositories []*Repository `json:"repositories"` } // ListRunnerApplicationDownloads lists self-hosted runner application binaries that can be downloaded and run. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-runner-applications-for-a-repository func (s *ActionsService) ListRunnerApplicationDownloads(ctx context.Context, owner, repo string) ([]*RunnerApplicationDownload, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runners/downloads", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var rads []*RunnerApplicationDownload resp, err := s.client.Do(ctx, req, &rads) if err != nil { return nil, resp, err } return rads, resp, nil } // RegistrationToken represents a token that can be used to add a self-hosted runner to a repository. type RegistrationToken struct { Token *string `json:"token,omitempty"` ExpiresAt *Timestamp `json:"expires_at,omitempty"` } // CreateRegistrationToken creates a token that can be used to add a self-hosted runner. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-a-registration-token-for-a-repository func (s *ActionsService) CreateRegistrationToken(ctx context.Context, owner, repo string) (*RegistrationToken, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runners/registration-token", owner, repo) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, nil, err } registrationToken := new(RegistrationToken) resp, err := s.client.Do(ctx, req, registrationToken) if err != nil { return nil, resp, err } return registrationToken, resp, nil } // Runner represents a self-hosted runner registered with a repository. type Runner struct { ID *int64 `json:"id,omitempty"` Name *string `json:"name,omitempty"` OS *string `json:"os,omitempty"` Status *string `json:"status,omitempty"` Busy *bool `json:"busy,omitempty"` Labels []*RunnerLabels `json:"labels,omitempty"` } // RunnerLabels represents a collection of labels attached to each runner. type RunnerLabels struct { ID *int64 `json:"id,omitempty"` Name *string `json:"name,omitempty"` Type *string `json:"type,omitempty"` } // Runners represents a collection of self-hosted runners for a repository. type Runners struct { TotalCount int `json:"total_count"` Runners []*Runner `json:"runners"` } // ListRunners lists all the self-hosted runners for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-self-hosted-runners-for-a-repository func (s *ActionsService) ListRunners(ctx context.Context, owner, repo string, opts *ListOptions) (*Runners, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runners", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } runners := &Runners{} resp, err := s.client.Do(ctx, req, &runners) if err != nil { return nil, resp, err } return runners, resp, nil } // GetRunner gets a specific self-hosted runner for a repository using its runner ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-self-hosted-runner-for-a-repository func (s *ActionsService) GetRunner(ctx context.Context, owner, repo string, runnerID int64) (*Runner, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runners/%v", owner, repo, runnerID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } runner := new(Runner) resp, err := s.client.Do(ctx, req, runner) if err != nil { return nil, resp, err } return runner, resp, nil } // RemoveToken represents a token that can be used to remove a self-hosted runner from a repository. type RemoveToken struct { Token *string `json:"token,omitempty"` ExpiresAt *Timestamp `json:"expires_at,omitempty"` } // CreateRemoveToken creates a token that can be used to remove a self-hosted runner from a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-a-remove-token-for-a-repository func (s *ActionsService) CreateRemoveToken(ctx context.Context, owner, repo string) (*RemoveToken, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runners/remove-token", owner, repo) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, nil, err } removeToken := new(RemoveToken) resp, err := s.client.Do(ctx, req, removeToken) if err != nil { return nil, resp, err } return removeToken, resp, nil } // RemoveRunner forces the removal of a self-hosted runner in a repository using the runner id. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-a-self-hosted-runner-from-a-repository func (s *ActionsService) RemoveRunner(ctx context.Context, owner, repo string, runnerID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runners/%v", owner, repo, runnerID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListOrganizationRunnerApplicationDownloads lists self-hosted runner application binaries that can be downloaded and run. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-runner-applications-for-an-organization func (s *ActionsService) ListOrganizationRunnerApplicationDownloads(ctx context.Context, owner string) ([]*RunnerApplicationDownload, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runners/downloads", owner) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var rads []*RunnerApplicationDownload resp, err := s.client.Do(ctx, req, &rads) if err != nil { return nil, resp, err } return rads, resp, nil } // CreateOrganizationRegistrationToken creates a token that can be used to add a self-hosted runner to an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-a-registration-token-for-an-organization func (s *ActionsService) CreateOrganizationRegistrationToken(ctx context.Context, owner string) (*RegistrationToken, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runners/registration-token", owner) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, nil, err } registrationToken := new(RegistrationToken) resp, err := s.client.Do(ctx, req, registrationToken) if err != nil { return nil, resp, err } return registrationToken, resp, nil } // ListOrganizationRunners lists all the self-hosted runners for an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-self-hosted-runners-for-an-organization func (s *ActionsService) ListOrganizationRunners(ctx context.Context, owner string, opts *ListOptions) (*Runners, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runners", owner) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } runners := &Runners{} resp, err := s.client.Do(ctx, req, &runners) if err != nil { return nil, resp, err } return runners, resp, nil } // ListEnabledReposInOrg lists the selected repositories that are enabled for GitHub Actions in an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-selected-repositories-enabled-for-github-actions-in-an-organization func (s *ActionsService) ListEnabledReposInOrg(ctx context.Context, owner string, opts *ListOptions) (*ActionsEnabledOnOrgRepos, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/permissions/repositories", owner) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } repos := &ActionsEnabledOnOrgRepos{} resp, err := s.client.Do(ctx, req, repos) if err != nil { return nil, resp, err } return repos, resp, nil } // SetEnabledReposInOrg replaces the list of selected repositories that are enabled for GitHub Actions in an organization.. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#set-selected-repositories-enabled-for-github-actions-in-an-organization func (s *ActionsService) SetEnabledReposInOrg(ctx context.Context, owner string, repositoryIDs []int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/permissions/repositories", owner) req, err := s.client.NewRequest("PUT", u, struct { IDs []int64 `json:"selected_repository_ids"` }{IDs: repositoryIDs}) if err != nil { return nil, err } resp, err := s.client.Do(ctx, req, nil) if err != nil { return resp, err } return resp, nil } // AddEnabledReposInOrg adds a repository to the list of selected repositories that are enabled for GitHub Actions in an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#enable-a-selected-repository-for-github-actions-in-an-organization func (s *ActionsService) AddEnabledReposInOrg(ctx context.Context, owner string, repositoryID int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/permissions/repositories/%v", owner, repositoryID) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } resp, err := s.client.Do(ctx, req, nil) if err != nil { return resp, err } return resp, nil } // RemoveEnabledRepoInOrg removes a single repository from the list of enabled repos for GitHub Actions in an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#disable-a-selected-repository-for-github-actions-in-an-organization func (s *ActionsService) RemoveEnabledRepoInOrg(ctx context.Context, owner string, repositoryID int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/permissions/repositories/%v", owner, repositoryID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } resp, err := s.client.Do(ctx, req, nil) if err != nil { return resp, err } return resp, nil } // GetOrganizationRunner gets a specific self-hosted runner for an organization using its runner ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-self-hosted-runner-for-an-organization func (s *ActionsService) GetOrganizationRunner(ctx context.Context, owner string, runnerID int64) (*Runner, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runners/%v", owner, runnerID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } runner := new(Runner) resp, err := s.client.Do(ctx, req, runner) if err != nil { return nil, resp, err } return runner, resp, nil } // CreateOrganizationRemoveToken creates a token that can be used to remove a self-hosted runner from an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-a-remove-token-for-an-organization func (s *ActionsService) CreateOrganizationRemoveToken(ctx context.Context, owner string) (*RemoveToken, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runners/remove-token", owner) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, nil, err } removeToken := new(RemoveToken) resp, err := s.client.Do(ctx, req, removeToken) if err != nil { return nil, resp, err } return removeToken, resp, nil } // RemoveOrganizationRunner forces the removal of a self-hosted runner from an organization using the runner id. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-a-self-hosted-runner-from-an-organization func (s *ActionsService) RemoveOrganizationRunner(ctx context.Context, owner string, runnerID int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/runners/%v", owner, runnerID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/actions_runners_test.go000066400000000000000000000624061410475703100215660ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestActionsService_ListRunnerApplicationDownloads(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runners/downloads", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"os":"osx","architecture":"x64","download_url":"https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-osx-x64-2.164.0.tar.gz","filename":"actions-runner-osx-x64-2.164.0.tar.gz"},{"os":"linux","architecture":"x64","download_url":"https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-linux-x64-2.164.0.tar.gz","filename":"actions-runner-linux-x64-2.164.0.tar.gz"},{"os": "linux","architecture":"arm","download_url":"https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-linux-arm-2.164.0.tar.gz","filename":"actions-runner-linux-arm-2.164.0.tar.gz"},{"os":"win","architecture":"x64","download_url":"https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-win-x64-2.164.0.zip","filename":"actions-runner-win-x64-2.164.0.zip"},{"os":"linux","architecture":"arm64","download_url":"https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-linux-arm64-2.164.0.tar.gz","filename":"actions-runner-linux-arm64-2.164.0.tar.gz"}]`) }) ctx := context.Background() downloads, _, err := client.Actions.ListRunnerApplicationDownloads(ctx, "o", "r") if err != nil { t.Errorf("Actions.ListRunnerApplicationDownloads returned error: %v", err) } want := []*RunnerApplicationDownload{ {OS: String("osx"), Architecture: String("x64"), DownloadURL: String("https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-osx-x64-2.164.0.tar.gz"), Filename: String("actions-runner-osx-x64-2.164.0.tar.gz")}, {OS: String("linux"), Architecture: String("x64"), DownloadURL: String("https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-linux-x64-2.164.0.tar.gz"), Filename: String("actions-runner-linux-x64-2.164.0.tar.gz")}, {OS: String("linux"), Architecture: String("arm"), DownloadURL: String("https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-linux-arm-2.164.0.tar.gz"), Filename: String("actions-runner-linux-arm-2.164.0.tar.gz")}, {OS: String("win"), Architecture: String("x64"), DownloadURL: String("https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-win-x64-2.164.0.zip"), Filename: String("actions-runner-win-x64-2.164.0.zip")}, {OS: String("linux"), Architecture: String("arm64"), DownloadURL: String("https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-linux-arm64-2.164.0.tar.gz"), Filename: String("actions-runner-linux-arm64-2.164.0.tar.gz")}, } if !cmp.Equal(downloads, want) { t.Errorf("Actions.ListRunnerApplicationDownloads returned %+v, want %+v", downloads, want) } const methodName = "ListRunnerApplicationDownloads" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListRunnerApplicationDownloads(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListRunnerApplicationDownloads(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_CreateRegistrationToken(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runners/registration-token", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"token":"LLBF3JGZDX3P5PMEXLND6TS6FCWO6","expires_at":"2020-01-22T12:13:35.123Z"}`) }) ctx := context.Background() token, _, err := client.Actions.CreateRegistrationToken(ctx, "o", "r") if err != nil { t.Errorf("Actions.CreateRegistrationToken returned error: %v", err) } want := &RegistrationToken{Token: String("LLBF3JGZDX3P5PMEXLND6TS6FCWO6"), ExpiresAt: &Timestamp{time.Date(2020, time.January, 22, 12, 13, 35, 123000000, time.UTC)}} if !cmp.Equal(token, want) { t.Errorf("Actions.CreateRegistrationToken returned %+v, want %+v", token, want) } const methodName = "CreateRegistrationToken" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.CreateRegistrationToken(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.CreateRegistrationToken(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_ListRunners(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runners", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprint(w, `{"total_count":2,"runners":[{"id":23,"name":"MBP","os":"macos","status":"online"},{"id":24,"name":"iMac","os":"macos","status":"offline"}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() runners, _, err := client.Actions.ListRunners(ctx, "o", "r", opts) if err != nil { t.Errorf("Actions.ListRunners returned error: %v", err) } want := &Runners{ TotalCount: 2, Runners: []*Runner{ {ID: Int64(23), Name: String("MBP"), OS: String("macos"), Status: String("online")}, {ID: Int64(24), Name: String("iMac"), OS: String("macos"), Status: String("offline")}, }, } if !cmp.Equal(runners, want) { t.Errorf("Actions.ListRunners returned %+v, want %+v", runners, want) } const methodName = "ListRunners" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListRunners(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListRunners(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetRunner(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runners/23", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":23,"name":"MBP","os":"macos","status":"online"}`) }) ctx := context.Background() runner, _, err := client.Actions.GetRunner(ctx, "o", "r", 23) if err != nil { t.Errorf("Actions.GetRunner returned error: %v", err) } want := &Runner{ ID: Int64(23), Name: String("MBP"), OS: String("macos"), Status: String("online"), } if !cmp.Equal(runner, want) { t.Errorf("Actions.GetRunner returned %+v, want %+v", runner, want) } const methodName = "GetRunner" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetRunner(ctx, "\n", "\n", 23) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetRunner(ctx, "o", "r", 23) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_CreateRemoveToken(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runners/remove-token", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"token":"AABF3JGZDX3P5PMEXLND6TS6FCWO6","expires_at":"2020-01-29T12:13:35.123Z"}`) }) ctx := context.Background() token, _, err := client.Actions.CreateRemoveToken(ctx, "o", "r") if err != nil { t.Errorf("Actions.CreateRemoveToken returned error: %v", err) } want := &RemoveToken{Token: String("AABF3JGZDX3P5PMEXLND6TS6FCWO6"), ExpiresAt: &Timestamp{time.Date(2020, time.January, 29, 12, 13, 35, 123000000, time.UTC)}} if !cmp.Equal(token, want) { t.Errorf("Actions.CreateRemoveToken returned %+v, want %+v", token, want) } const methodName = "CreateRemoveToken" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.CreateRemoveToken(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.CreateRemoveToken(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_RemoveRunner(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runners/21", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Actions.RemoveRunner(ctx, "o", "r", 21) if err != nil { t.Errorf("Actions.RemoveRunner returned error: %v", err) } const methodName = "RemoveRunner" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.RemoveRunner(ctx, "\n", "\n", 21) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.RemoveRunner(ctx, "o", "r", 21) }) } func TestActionsService_ListOrganizationRunnerApplicationDownloads(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runners/downloads", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"os":"osx","architecture":"x64","download_url":"https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-osx-x64-2.164.0.tar.gz","filename":"actions-runner-osx-x64-2.164.0.tar.gz"},{"os":"linux","architecture":"x64","download_url":"https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-linux-x64-2.164.0.tar.gz","filename":"actions-runner-linux-x64-2.164.0.tar.gz"},{"os": "linux","architecture":"arm","download_url":"https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-linux-arm-2.164.0.tar.gz","filename":"actions-runner-linux-arm-2.164.0.tar.gz"},{"os":"win","architecture":"x64","download_url":"https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-win-x64-2.164.0.zip","filename":"actions-runner-win-x64-2.164.0.zip"},{"os":"linux","architecture":"arm64","download_url":"https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-linux-arm64-2.164.0.tar.gz","filename":"actions-runner-linux-arm64-2.164.0.tar.gz"}]`) }) ctx := context.Background() downloads, _, err := client.Actions.ListOrganizationRunnerApplicationDownloads(ctx, "o") if err != nil { t.Errorf("Actions.ListRunnerApplicationDownloads returned error: %v", err) } want := []*RunnerApplicationDownload{ {OS: String("osx"), Architecture: String("x64"), DownloadURL: String("https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-osx-x64-2.164.0.tar.gz"), Filename: String("actions-runner-osx-x64-2.164.0.tar.gz")}, {OS: String("linux"), Architecture: String("x64"), DownloadURL: String("https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-linux-x64-2.164.0.tar.gz"), Filename: String("actions-runner-linux-x64-2.164.0.tar.gz")}, {OS: String("linux"), Architecture: String("arm"), DownloadURL: String("https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-linux-arm-2.164.0.tar.gz"), Filename: String("actions-runner-linux-arm-2.164.0.tar.gz")}, {OS: String("win"), Architecture: String("x64"), DownloadURL: String("https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-win-x64-2.164.0.zip"), Filename: String("actions-runner-win-x64-2.164.0.zip")}, {OS: String("linux"), Architecture: String("arm64"), DownloadURL: String("https://github.com/actions/runner/releases/download/v2.164.0/actions-runner-linux-arm64-2.164.0.tar.gz"), Filename: String("actions-runner-linux-arm64-2.164.0.tar.gz")}, } if !cmp.Equal(downloads, want) { t.Errorf("Actions.ListOrganizationRunnerApplicationDownloads returned %+v, want %+v", downloads, want) } const methodName = "ListOrganizationRunnerApplicationDownloads" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListOrganizationRunnerApplicationDownloads(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListOrganizationRunnerApplicationDownloads(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_CreateOrganizationRegistrationToken(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runners/registration-token", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"token":"LLBF3JGZDX3P5PMEXLND6TS6FCWO6","expires_at":"2020-01-22T12:13:35.123Z"}`) }) ctx := context.Background() token, _, err := client.Actions.CreateOrganizationRegistrationToken(ctx, "o") if err != nil { t.Errorf("Actions.CreateRegistrationToken returned error: %v", err) } want := &RegistrationToken{Token: String("LLBF3JGZDX3P5PMEXLND6TS6FCWO6"), ExpiresAt: &Timestamp{time.Date(2020, time.January, 22, 12, 13, 35, 123000000, time.UTC)}} if !cmp.Equal(token, want) { t.Errorf("Actions.CreateRegistrationToken returned %+v, want %+v", token, want) } const methodName = "CreateOrganizationRegistrationToken" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.CreateOrganizationRegistrationToken(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.CreateOrganizationRegistrationToken(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_ListOrganizationRunners(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runners", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprint(w, `{"total_count":2,"runners":[{"id":23,"name":"MBP","os":"macos","status":"online"},{"id":24,"name":"iMac","os":"macos","status":"offline"}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() runners, _, err := client.Actions.ListOrganizationRunners(ctx, "o", opts) if err != nil { t.Errorf("Actions.ListRunners returned error: %v", err) } want := &Runners{ TotalCount: 2, Runners: []*Runner{ {ID: Int64(23), Name: String("MBP"), OS: String("macos"), Status: String("online")}, {ID: Int64(24), Name: String("iMac"), OS: String("macos"), Status: String("offline")}, }, } if !cmp.Equal(runners, want) { t.Errorf("Actions.ListRunners returned %+v, want %+v", runners, want) } const methodName = "ListOrganizationRunners" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListOrganizationRunners(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListOrganizationRunners(ctx, "o", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_ListEnabledReposInOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/permissions/repositories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "1", }) fmt.Fprint(w, `{"total_count":2,"repositories":[{"id":2}, {"id": 3}]}`) }) ctx := context.Background() opt := &ListOptions{ Page: 1, } got, _, err := client.Actions.ListEnabledReposInOrg(ctx, "o", opt) if err != nil { t.Errorf("Actions.ListEnabledReposInOrg returned error: %v", err) } want := &ActionsEnabledOnOrgRepos{TotalCount: int(2), Repositories: []*Repository{ {ID: Int64(2)}, {ID: Int64(3)}, }} if !cmp.Equal(got, want) { t.Errorf("Actions.ListEnabledReposInOrg returned %+v, want %+v", got, want) } const methodName = "ListEnabledReposInOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListEnabledReposInOrg(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListEnabledReposInOrg(ctx, "o", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_SetEnabledReposInOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/permissions/repositories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"selected_repository_ids":[123,1234]}`+"\n") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Actions.SetEnabledReposInOrg(ctx, "o", []int64{123, 1234}) if err != nil { t.Errorf("Actions.SetEnabledReposInOrg returned error: %v", err) } const methodName = "SetEnabledReposInOrg" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.SetEnabledReposInOrg(ctx, "\n", []int64{123, 1234}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.SetEnabledReposInOrg(ctx, "o", []int64{123, 1234}) }) } func TestActionsService_AddEnabledReposInOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/permissions/repositories/123", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Actions.AddEnabledReposInOrg(ctx, "o", 123) if err != nil { t.Errorf("Actions.AddEnabledReposInOrg returned error: %v", err) } const methodName = "AddEnabledReposInOrg" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.AddEnabledReposInOrg(ctx, "\n", 123) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.AddEnabledReposInOrg(ctx, "o", 123) }) } func TestActionsService_RemoveEnabledRepoInOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/permissions/repositories/123", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Actions.RemoveEnabledRepoInOrg(ctx, "o", 123) if err != nil { t.Errorf("Actions.RemoveEnabledRepoInOrg returned error: %v", err) } const methodName = "RemoveEnabledRepoInOrg" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.RemoveEnabledRepoInOrg(ctx, "\n", 123) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.RemoveEnabledRepoInOrg(ctx, "o", 123) }) } func TestActionsService_GetOrganizationRunner(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runners/23", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":23,"name":"MBP","os":"macos","status":"online"}`) }) ctx := context.Background() runner, _, err := client.Actions.GetOrganizationRunner(ctx, "o", 23) if err != nil { t.Errorf("Actions.GetRunner returned error: %v", err) } want := &Runner{ ID: Int64(23), Name: String("MBP"), OS: String("macos"), Status: String("online"), } if !cmp.Equal(runner, want) { t.Errorf("Actions.GetRunner returned %+v, want %+v", runner, want) } const methodName = "GetOrganizationRunner" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetOrganizationRunner(ctx, "\n", 23) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetOrganizationRunner(ctx, "o", 23) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_CreateOrganizationRemoveToken(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runners/remove-token", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"token":"AABF3JGZDX3P5PMEXLND6TS6FCWO6","expires_at":"2020-01-29T12:13:35.123Z"}`) }) ctx := context.Background() token, _, err := client.Actions.CreateOrganizationRemoveToken(ctx, "o") if err != nil { t.Errorf("Actions.CreateRemoveToken returned error: %v", err) } want := &RemoveToken{Token: String("AABF3JGZDX3P5PMEXLND6TS6FCWO6"), ExpiresAt: &Timestamp{time.Date(2020, time.January, 29, 12, 13, 35, 123000000, time.UTC)}} if !cmp.Equal(token, want) { t.Errorf("Actions.CreateRemoveToken returned %+v, want %+v", token, want) } const methodName = "CreateOrganizationRemoveToken" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.CreateOrganizationRemoveToken(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.CreateOrganizationRemoveToken(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_RemoveOrganizationRunner(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/runners/21", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Actions.RemoveOrganizationRunner(ctx, "o", 21) if err != nil { t.Errorf("Actions.RemoveOganizationRunner returned error: %v", err) } const methodName = "RemoveOrganizationRunner" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.RemoveOrganizationRunner(ctx, "\n", 21) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.RemoveOrganizationRunner(ctx, "o", 21) }) } func TestRunnerApplicationDownload_Marshal(t *testing.T) { testJSONMarshal(t, &RunnerApplicationDownload{}, "{}") u := &RunnerApplicationDownload{ OS: String("o"), Architecture: String("a"), DownloadURL: String("d"), Filename: String("f"), TempDownloadToken: String("t"), SHA256Checksum: String("s"), } want := `{ "os": "o", "architecture": "a", "download_url": "d", "filename": "f", "temp_download_token": "t", "sha256_checksum": "s" }` testJSONMarshal(t, u, want) } func TestActionsEnabledOnOrgRepos_Marshal(t *testing.T) { testJSONMarshal(t, &ActionsEnabledOnOrgRepos{}, "{}") u := &ActionsEnabledOnOrgRepos{ TotalCount: 1, Repositories: []*Repository{ { ID: Int64(1), URL: String("u"), Name: String("n"), }, }, } want := `{ "total_count": 1, "repositories": [ { "id": 1, "url": "u", "name": "n" } ] }` testJSONMarshal(t, u, want) } func TestRegistrationToken_Marshal(t *testing.T) { testJSONMarshal(t, &RegistrationToken{}, "{}") u := &RegistrationToken{ Token: String("t"), ExpiresAt: &Timestamp{referenceTime}, } want := `{ "token": "t", "expires_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } func TestRunnerLabels_Marshal(t *testing.T) { testJSONMarshal(t, &RunnerLabels{}, "{}") u := &RunnerLabels{ ID: Int64(1), Name: String("n"), Type: String("t"), } want := `{ "id": 1, "name": "n", "type": "t" }` testJSONMarshal(t, u, want) } func TestRunner_Marshal(t *testing.T) { testJSONMarshal(t, &Runner{}, "{}") u := &Runner{ ID: Int64(1), Name: String("n"), OS: String("o"), Status: String("s"), Busy: Bool(false), Labels: []*RunnerLabels{ { ID: Int64(1), Name: String("n"), Type: String("t"), }, }, } want := `{ "id": 1, "name": "n", "os": "o", "status": "s", "busy": false, "labels": [ { "id": 1, "name": "n", "type": "t" } ] }` testJSONMarshal(t, u, want) } func TestRunners_Marshal(t *testing.T) { testJSONMarshal(t, &Runners{}, "{}") u := &Runners{ TotalCount: 1, Runners: []*Runner{ { ID: Int64(1), Name: String("n"), OS: String("o"), Status: String("s"), Busy: Bool(false), Labels: []*RunnerLabels{ { ID: Int64(1), Name: String("n"), Type: String("t"), }, }, }, }, } want := `{ "total_count": 1, "runners": [ { "id": 1, "name": "n", "os": "o", "status": "s", "busy": false, "labels": [ { "id": 1, "name": "n", "type": "t" } ] } ] }` testJSONMarshal(t, u, want) } func TestRemoveToken_Marshal(t *testing.T) { testJSONMarshal(t, &RemoveToken{}, "{}") u := &RemoveToken{ Token: String("t"), ExpiresAt: &Timestamp{referenceTime}, } want := `{ "token": "t", "expires_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/actions_secrets.go000066400000000000000000000337351410475703100205060ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "encoding/json" "fmt" "strconv" ) // PublicKey represents the public key that should be used to encrypt secrets. type PublicKey struct { KeyID *string `json:"key_id"` Key *string `json:"key"` } // UnmarshalJSON implements the json.Unmarshaler interface. // This ensures GitHub Enterprise versions which return a numeric key id // do not error out when unmarshaling. func (p *PublicKey) UnmarshalJSON(data []byte) error { var pk struct { KeyID interface{} `json:"key_id,string"` Key *string `json:"key"` } if err := json.Unmarshal(data, &pk); err != nil { return err } p.Key = pk.Key switch v := pk.KeyID.(type) { case nil: return nil case string: p.KeyID = &v case float64: p.KeyID = String(strconv.FormatFloat(v, 'f', -1, 64)) default: return fmt.Errorf("unable to unmarshal %T as a string", v) } return nil } // GetRepoPublicKey gets a public key that should be used for secret encryption. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-public-key func (s *ActionsService) GetRepoPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/secrets/public-key", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } pubKey := new(PublicKey) resp, err := s.client.Do(ctx, req, pubKey) if err != nil { return nil, resp, err } return pubKey, resp, nil } // GetOrgPublicKey gets a public key that should be used for secret encryption. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-public-key func (s *ActionsService) GetOrgPublicKey(ctx context.Context, org string) (*PublicKey, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/secrets/public-key", org) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } pubKey := new(PublicKey) resp, err := s.client.Do(ctx, req, pubKey) if err != nil { return nil, resp, err } return pubKey, resp, nil } // GetEnvPublicKey gets a public key that should be used for secret encryption. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#get-an-environment-public-key func (s *ActionsService) GetEnvPublicKey(ctx context.Context, repoID int, env string) (*PublicKey, *Response, error) { u := fmt.Sprintf("repositories/%v/environments/%v/secrets/public-key", repoID, env) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } pubKey := new(PublicKey) resp, err := s.client.Do(ctx, req, pubKey) if err != nil { return nil, resp, err } return pubKey, resp, nil } // Secret represents a repository action secret. type Secret struct { Name string `json:"name"` CreatedAt Timestamp `json:"created_at"` UpdatedAt Timestamp `json:"updated_at"` Visibility string `json:"visibility,omitempty"` SelectedRepositoriesURL string `json:"selected_repositories_url,omitempty"` } // Secrets represents one item from the ListSecrets response. type Secrets struct { TotalCount int `json:"total_count"` Secrets []*Secret `json:"secrets"` } // ListRepoSecrets lists all secrets available in a repository // without revealing their encrypted values. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-repository-secrets func (s *ActionsService) ListRepoSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/secrets", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } secrets := new(Secrets) resp, err := s.client.Do(ctx, req, &secrets) if err != nil { return nil, resp, err } return secrets, resp, nil } // GetRepoSecret gets a single repository secret without revealing its encrypted value. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-repository-secret func (s *ActionsService) GetRepoSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } secret := new(Secret) resp, err := s.client.Do(ctx, req, secret) if err != nil { return nil, resp, err } return secret, resp, nil } // SelectedRepoIDs are the repository IDs that have access to the secret. type SelectedRepoIDs []int64 // EncryptedSecret represents a secret that is encrypted using a public key. // // The value of EncryptedValue must be your secret, encrypted with // LibSodium (see documentation here: https://libsodium.gitbook.io/doc/bindings_for_other_languages) // using the public key retrieved using the GetPublicKey method. type EncryptedSecret struct { Name string `json:"-"` KeyID string `json:"key_id"` EncryptedValue string `json:"encrypted_value"` Visibility string `json:"visibility,omitempty"` SelectedRepositoryIDs SelectedRepoIDs `json:"selected_repository_ids,omitempty"` } // CreateOrUpdateRepoSecret creates or updates a repository secret with an encrypted value. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-a-repository-secret func (s *ActionsService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, eSecret.Name) req, err := s.client.NewRequest("PUT", u, eSecret) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DeleteRepoSecret deletes a secret in a repository using the secret name. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-a-repository-secret func (s *ActionsService) DeleteRepoSecret(ctx context.Context, owner, repo, name string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListOrgSecrets lists all secrets available in an organization // without revealing their encrypted values. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-organization-secrets func (s *ActionsService) ListOrgSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/secrets", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } secrets := new(Secrets) resp, err := s.client.Do(ctx, req, &secrets) if err != nil { return nil, resp, err } return secrets, resp, nil } // GetOrgSecret gets a single organization secret without revealing its encrypted value. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-an-organization-secret func (s *ActionsService) GetOrgSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } secret := new(Secret) resp, err := s.client.Do(ctx, req, secret) if err != nil { return nil, resp, err } return secret, resp, nil } // CreateOrUpdateOrgSecret creates or updates an organization secret with an encrypted value. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-or-update-an-organization-secret func (s *ActionsService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, eSecret.Name) req, err := s.client.NewRequest("PUT", u, eSecret) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // SelectedReposList represents the list of repositories selected for an organization secret. type SelectedReposList struct { TotalCount *int `json:"total_count,omitempty"` Repositories []*Repository `json:"repositories,omitempty"` } // ListSelectedReposForOrgSecret lists all repositories that have access to a secret. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-selected-repositories-for-an-organization-secret func (s *ActionsService) ListSelectedReposForOrgSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } result := new(SelectedReposList) resp, err := s.client.Do(ctx, req, result) if err != nil { return nil, resp, err } return result, resp, nil } // SetSelectedReposForOrgSecret sets the repositories that have access to a secret. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#set-selected-repositories-for-an-organization-secret func (s *ActionsService) SetSelectedReposForOrgSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) type repoIDs struct { SelectedIDs SelectedRepoIDs `json:"selected_repository_ids"` } req, err := s.client.NewRequest("PUT", u, repoIDs{SelectedIDs: ids}) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // AddSelectedRepoToOrgSecret adds a repository to an organization secret. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#add-selected-repository-to-an-organization-secret func (s *ActionsService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // RemoveSelectedRepoFromOrgSecret removes a repository from an organization secret. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#remove-selected-repository-from-an-organization-secret func (s *ActionsService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DeleteOrgSecret deletes a secret in an organization using the secret name. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-an-organization-secret func (s *ActionsService) DeleteOrgSecret(ctx context.Context, org, name string) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListEnvSecrets lists all secrets available in an environment. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets func (s *ActionsService) ListEnvSecrets(ctx context.Context, repoID int, env string, opts *ListOptions) (*Secrets, *Response, error) { u := fmt.Sprintf("repositories/%v/environments/%v/secrets", repoID, env) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } secrets := new(Secrets) resp, err := s.client.Do(ctx, req, &secrets) if err != nil { return nil, resp, err } return secrets, resp, nil } // GetEnvSecret gets a single environment secret without revealing its encrypted value. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#list-environment-secrets func (s *ActionsService) GetEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Secret, *Response, error) { u := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } secret := new(Secret) resp, err := s.client.Do(ctx, req, secret) if err != nil { return nil, resp, err } return secret, resp, nil } // CreateOrUpdateEnvSecret creates or updates a repository secret with an encrypted value. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#create-or-update-an-environment-secret func (s *ActionsService) CreateOrUpdateEnvSecret(ctx context.Context, repoID int, env string, eSecret *EncryptedSecret) (*Response, error) { u := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, eSecret.Name) req, err := s.client.NewRequest("PUT", u, eSecret) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DeleteEnvSecret deletes a secret in an environment using the secret name. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#delete-an-environment-secret func (s *ActionsService) DeleteEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Response, error) { u := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/actions_secrets_test.go000066400000000000000000000733621410475703100215450ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestPublicKey_UnmarshalJSON(t *testing.T) { var testCases = map[string]struct { data []byte wantPublicKey PublicKey wantErr bool }{ "Empty": { data: []byte("{}"), wantPublicKey: PublicKey{}, wantErr: false, }, "Invalid JSON": { data: []byte("{"), wantPublicKey: PublicKey{}, wantErr: true, }, "Numeric KeyID": { data: []byte(`{"key_id":1234,"key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`), wantPublicKey: PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")}, wantErr: false, }, "String KeyID": { data: []byte(`{"key_id":"1234","key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`), wantPublicKey: PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")}, wantErr: false, }, "Invalid KeyID": { data: []byte(`{"key_id":["1234"],"key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`), wantPublicKey: PublicKey{KeyID: nil, Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")}, wantErr: true, }, "Invalid Key": { data: []byte(`{"key":123}`), wantPublicKey: PublicKey{KeyID: nil, Key: nil}, wantErr: true, }, "Nil": { data: nil, wantPublicKey: PublicKey{KeyID: nil, Key: nil}, wantErr: true, }, "Empty String": { data: []byte(""), wantPublicKey: PublicKey{KeyID: nil, Key: nil}, wantErr: true, }, "Missing Key": { data: []byte(`{"key_id":"1234"}`), wantPublicKey: PublicKey{KeyID: String("1234")}, wantErr: false, }, "Missing KeyID": { data: []byte(`{"key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`), wantPublicKey: PublicKey{Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")}, wantErr: false, }, } for name, tt := range testCases { tt := tt t.Run(name, func(t *testing.T) { pk := PublicKey{} err := json.Unmarshal(tt.data, &pk) if err == nil && tt.wantErr { t.Errorf("PublicKey.UnmarshalJSON returned nil instead of an error") } if err != nil && !tt.wantErr { t.Errorf("PublicKey.UnmarshalJSON returned an unexpected error: %+v", err) } if !cmp.Equal(tt.wantPublicKey, pk) { t.Errorf("PublicKey.UnmarshalJSON expected public key %+v, got %+v", tt.wantPublicKey, pk) } }) } } func TestActionsService_GetRepoPublicKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"key_id":"1234","key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) }) ctx := context.Background() key, _, err := client.Actions.GetRepoPublicKey(ctx, "o", "r") if err != nil { t.Errorf("Actions.GetRepoPublicKey returned error: %v", err) } want := &PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} if !cmp.Equal(key, want) { t.Errorf("Actions.GetRepoPublicKey returned %+v, want %+v", key, want) } const methodName = "GetRepoPublicKey" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetRepoPublicKey(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetRepoPublicKey(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetRepoPublicKeyNumeric(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"key_id":1234,"key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) }) ctx := context.Background() key, _, err := client.Actions.GetRepoPublicKey(ctx, "o", "r") if err != nil { t.Errorf("Actions.GetRepoPublicKey returned error: %v", err) } want := &PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} if !cmp.Equal(key, want) { t.Errorf("Actions.GetRepoPublicKey returned %+v, want %+v", key, want) } const methodName = "GetRepoPublicKey" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetRepoPublicKey(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetRepoPublicKey(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_ListRepoSecrets(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/secrets", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprint(w, `{"total_count":4,"secrets":[{"name":"A","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"name":"B","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() secrets, _, err := client.Actions.ListRepoSecrets(ctx, "o", "r", opts) if err != nil { t.Errorf("Actions.ListRepoSecrets returned error: %v", err) } want := &Secrets{ TotalCount: 4, Secrets: []*Secret{ {Name: "A", CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, {Name: "B", CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, }, } if !cmp.Equal(secrets, want) { t.Errorf("Actions.ListRepoSecrets returned %+v, want %+v", secrets, want) } const methodName = "ListRepoSecrets" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListRepoSecrets(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListRepoSecrets(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetRepoSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"name":"NAME","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}`) }) ctx := context.Background() secret, _, err := client.Actions.GetRepoSecret(ctx, "o", "r", "NAME") if err != nil { t.Errorf("Actions.GetRepoSecret returned error: %v", err) } want := &Secret{ Name: "NAME", CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}, } if !cmp.Equal(secret, want) { t.Errorf("Actions.GetRepoSecret returned %+v, want %+v", secret, want) } const methodName = "GetRepoSecret" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetRepoSecret(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetRepoSecret(ctx, "o", "r", "NAME") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_CreateOrUpdateRepoSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"key_id":"1234","encrypted_value":"QIv="}`+"\n") w.WriteHeader(http.StatusCreated) }) input := &EncryptedSecret{ Name: "NAME", EncryptedValue: "QIv=", KeyID: "1234", } ctx := context.Background() _, err := client.Actions.CreateOrUpdateRepoSecret(ctx, "o", "r", input) if err != nil { t.Errorf("Actions.CreateOrUpdateRepoSecret returned error: %v", err) } const methodName = "CreateOrUpdateRepoSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.CreateOrUpdateRepoSecret(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.CreateOrUpdateRepoSecret(ctx, "o", "r", input) }) } func TestActionsService_DeleteRepoSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Actions.DeleteRepoSecret(ctx, "o", "r", "NAME") if err != nil { t.Errorf("Actions.DeleteRepoSecret returned error: %v", err) } const methodName = "DeleteRepoSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.DeleteRepoSecret(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.DeleteRepoSecret(ctx, "o", "r", "NAME") }) } func TestActionsService_GetOrgPublicKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"key_id":"012345678","key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) }) ctx := context.Background() key, _, err := client.Actions.GetOrgPublicKey(ctx, "o") if err != nil { t.Errorf("Actions.GetOrgPublicKey returned error: %v", err) } want := &PublicKey{KeyID: String("012345678"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} if !cmp.Equal(key, want) { t.Errorf("Actions.GetOrgPublicKey returned %+v, want %+v", key, want) } const methodName = "GetOrgPublicKey" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetOrgPublicKey(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetOrgPublicKey(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_ListOrgSecrets(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/secrets", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprint(w, `{"total_count":3,"secrets":[{"name":"GIST_ID","created_at":"2019-08-10T14:59:22Z","updated_at":"2020-01-10T14:59:22Z","visibility":"private"},{"name":"DEPLOY_TOKEN","created_at":"2019-08-10T14:59:22Z","updated_at":"2020-01-10T14:59:22Z","visibility":"all"},{"name":"GH_TOKEN","created_at":"2019-08-10T14:59:22Z","updated_at":"2020-01-10T14:59:22Z","visibility":"selected","selected_repositories_url":"https://api.github.com/orgs/octo-org/actions/secrets/SUPER_SECRET/repositories"}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() secrets, _, err := client.Actions.ListOrgSecrets(ctx, "o", opts) if err != nil { t.Errorf("Actions.ListOrgSecrets returned error: %v", err) } want := &Secrets{ TotalCount: 3, Secrets: []*Secret{ {Name: "GIST_ID", CreatedAt: Timestamp{time.Date(2019, time.August, 10, 14, 59, 22, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 10, 14, 59, 22, 0, time.UTC)}, Visibility: "private"}, {Name: "DEPLOY_TOKEN", CreatedAt: Timestamp{time.Date(2019, time.August, 10, 14, 59, 22, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 10, 14, 59, 22, 0, time.UTC)}, Visibility: "all"}, {Name: "GH_TOKEN", CreatedAt: Timestamp{time.Date(2019, time.August, 10, 14, 59, 22, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 10, 14, 59, 22, 0, time.UTC)}, Visibility: "selected", SelectedRepositoriesURL: "https://api.github.com/orgs/octo-org/actions/secrets/SUPER_SECRET/repositories"}, }, } if !cmp.Equal(secrets, want) { t.Errorf("Actions.ListOrgSecrets returned %+v, want %+v", secrets, want) } const methodName = "ListOrgSecrets" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListOrgSecrets(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListOrgSecrets(ctx, "o", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"name":"NAME","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z","visibility":"selected","selected_repositories_url":"https://api.github.com/orgs/octo-org/actions/secrets/SUPER_SECRET/repositories"}`) }) ctx := context.Background() secret, _, err := client.Actions.GetOrgSecret(ctx, "o", "NAME") if err != nil { t.Errorf("Actions.GetOrgSecret returned error: %v", err) } want := &Secret{ Name: "NAME", CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}, Visibility: "selected", SelectedRepositoriesURL: "https://api.github.com/orgs/octo-org/actions/secrets/SUPER_SECRET/repositories", } if !cmp.Equal(secret, want) { t.Errorf("Actions.GetOrgSecret returned %+v, want %+v", secret, want) } const methodName = "GetOrgSecret" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetOrgSecret(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetOrgSecret(ctx, "o", "NAME") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_CreateOrUpdateOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"key_id":"1234","encrypted_value":"QIv=","visibility":"selected","selected_repository_ids":[1296269,1269280]}`+"\n") w.WriteHeader(http.StatusCreated) }) input := &EncryptedSecret{ Name: "NAME", EncryptedValue: "QIv=", KeyID: "1234", Visibility: "selected", SelectedRepositoryIDs: SelectedRepoIDs{1296269, 1269280}, } ctx := context.Background() _, err := client.Actions.CreateOrUpdateOrgSecret(ctx, "o", input) if err != nil { t.Errorf("Actions.CreateOrUpdateOrgSecret returned error: %v", err) } const methodName = "CreateOrUpdateOrgSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.CreateOrUpdateOrgSecret(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.CreateOrUpdateOrgSecret(ctx, "o", input) }) } func TestActionsService_ListSelectedReposForOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/secrets/NAME/repositories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprintf(w, `{"total_count":1,"repositories":[{"id":1}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() repos, _, err := client.Actions.ListSelectedReposForOrgSecret(ctx, "o", "NAME", opts) if err != nil { t.Errorf("Actions.ListSelectedReposForOrgSecret returned error: %v", err) } want := &SelectedReposList{ TotalCount: Int(1), Repositories: []*Repository{ {ID: Int64(1)}, }, } if !cmp.Equal(repos, want) { t.Errorf("Actions.ListSelectedReposForOrgSecret returned %+v, want %+v", repos, want) } const methodName = "ListSelectedReposForOrgSecret" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListSelectedReposForOrgSecret(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListSelectedReposForOrgSecret(ctx, "o", "NAME", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_SetSelectedReposForOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/secrets/NAME/repositories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"selected_repository_ids":[64780797]}`+"\n") }) ctx := context.Background() _, err := client.Actions.SetSelectedReposForOrgSecret(ctx, "o", "NAME", SelectedRepoIDs{64780797}) if err != nil { t.Errorf("Actions.SetSelectedReposForOrgSecret returned error: %v", err) } const methodName = "SetSelectedReposForOrgSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.SetSelectedReposForOrgSecret(ctx, "\n", "\n", SelectedRepoIDs{64780797}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.SetSelectedReposForOrgSecret(ctx, "o", "NAME", SelectedRepoIDs{64780797}) }) } func TestActionsService_AddSelectedRepoToOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/secrets/NAME/repositories/1234", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") }) repo := &Repository{ID: Int64(1234)} ctx := context.Background() _, err := client.Actions.AddSelectedRepoToOrgSecret(ctx, "o", "NAME", repo) if err != nil { t.Errorf("Actions.AddSelectedRepoToOrgSecret returned error: %v", err) } const methodName = "AddSelectedRepoToOrgSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.AddSelectedRepoToOrgSecret(ctx, "\n", "\n", repo) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.AddSelectedRepoToOrgSecret(ctx, "o", "NAME", repo) }) } func TestActionsService_RemoveSelectedRepoFromOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/secrets/NAME/repositories/1234", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) repo := &Repository{ID: Int64(1234)} ctx := context.Background() _, err := client.Actions.RemoveSelectedRepoFromOrgSecret(ctx, "o", "NAME", repo) if err != nil { t.Errorf("Actions.RemoveSelectedRepoFromOrgSecret returned error: %v", err) } const methodName = "RemoveSelectedRepoFromOrgSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.RemoveSelectedRepoFromOrgSecret(ctx, "\n", "\n", repo) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.RemoveSelectedRepoFromOrgSecret(ctx, "o", "NAME", repo) }) } func TestActionsService_DeleteOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Actions.DeleteOrgSecret(ctx, "o", "NAME") if err != nil { t.Errorf("Actions.DeleteOrgSecret returned error: %v", err) } const methodName = "DeleteOrgSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.DeleteOrgSecret(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.DeleteOrgSecret(ctx, "o", "NAME") }) } func TestActionsService_GetEnvPublicKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/environments/e/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"key_id":"1234","key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) }) ctx := context.Background() key, _, err := client.Actions.GetEnvPublicKey(ctx, 1, "e") if err != nil { t.Errorf("Actions.GetEnvPublicKey returned error: %v", err) } want := &PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} if !cmp.Equal(key, want) { t.Errorf("Actions.GetEnvPublicKey returned %+v, want %+v", key, want) } const methodName = "GetEnvPublicKey" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetEnvPublicKey(ctx, 0.0, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetEnvPublicKey(ctx, 1, "e") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetEnvPublicKeyNumeric(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/environments/e/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"key_id":1234,"key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) }) ctx := context.Background() key, _, err := client.Actions.GetEnvPublicKey(ctx, 1, "e") if err != nil { t.Errorf("Actions.GetEnvPublicKey returned error: %v", err) } want := &PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} if !cmp.Equal(key, want) { t.Errorf("Actions.GetEnvPublicKey returned %+v, want %+v", key, want) } const methodName = "GetEnvPublicKey" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetEnvPublicKey(ctx, 0.0, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetEnvPublicKey(ctx, 1, "e") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_ListEnvSecrets(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/environments/e/secrets", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprint(w, `{"total_count":4,"secrets":[{"name":"A","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"name":"B","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() secrets, _, err := client.Actions.ListEnvSecrets(ctx, 1, "e", opts) if err != nil { t.Errorf("Actions.ListEnvSecrets returned error: %v", err) } want := &Secrets{ TotalCount: 4, Secrets: []*Secret{ {Name: "A", CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, {Name: "B", CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, }, } if !cmp.Equal(secrets, want) { t.Errorf("Actions.ListEnvSecrets returned %+v, want %+v", secrets, want) } const methodName = "ListEnvSecrets" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListEnvSecrets(ctx, 0.0, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListEnvSecrets(ctx, 1, "e", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetEnvSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/environments/e/secrets/secret", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"name":"secret","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}`) }) ctx := context.Background() secret, _, err := client.Actions.GetEnvSecret(ctx, 1, "e", "secret") if err != nil { t.Errorf("Actions.GetEnvSecret returned error: %v", err) } want := &Secret{ Name: "secret", CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}, } if !cmp.Equal(secret, want) { t.Errorf("Actions.GetEnvSecret returned %+v, want %+v", secret, want) } const methodName = "GetEnvSecret" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetEnvSecret(ctx, 0.0, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetEnvSecret(ctx, 1, "e", "secret") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_CreateOrUpdateEnvSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/environments/e/secrets/secret", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"key_id":"1234","encrypted_value":"QIv="}`+"\n") w.WriteHeader(http.StatusCreated) }) input := &EncryptedSecret{ Name: "secret", EncryptedValue: "QIv=", KeyID: "1234", } ctx := context.Background() _, err := client.Actions.CreateOrUpdateEnvSecret(ctx, 1, "e", input) if err != nil { t.Errorf("Actions.CreateOrUpdateEnvSecret returned error: %v", err) } const methodName = "CreateOrUpdateEnvSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.CreateOrUpdateEnvSecret(ctx, 0.0, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.CreateOrUpdateEnvSecret(ctx, 1, "e", input) }) } func TestActionsService_DeleteEnvSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/environments/e/secrets/secret", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Actions.DeleteEnvSecret(ctx, 1, "e", "secret") if err != nil { t.Errorf("Actions.DeleteEnvSecret returned error: %v", err) } const methodName = "DeleteEnvSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.DeleteEnvSecret(ctx, 0.0, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.DeleteEnvSecret(ctx, 1, "r", "secret") }) } func TestPublicKey_Marshal(t *testing.T) { testJSONMarshal(t, &PublicKey{}, "{}") u := &PublicKey{ KeyID: String("kid"), Key: String("k"), } want := `{ "key_id": "kid", "key": "k" }` testJSONMarshal(t, u, want) } func TestSecret_Marshal(t *testing.T) { testJSONMarshal(t, &Secret{}, "{}") u := &Secret{ Name: "n", CreatedAt: Timestamp{referenceTime}, UpdatedAt: Timestamp{referenceTime}, Visibility: "v", SelectedRepositoriesURL: "s", } want := `{ "name": "n", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "visibility": "v", "selected_repositories_url": "s" }` testJSONMarshal(t, u, want) } func TestSecrets_Marshal(t *testing.T) { testJSONMarshal(t, &Secrets{}, "{}") u := &Secrets{ TotalCount: 1, Secrets: []*Secret{ { Name: "n", CreatedAt: Timestamp{referenceTime}, UpdatedAt: Timestamp{referenceTime}, Visibility: "v", SelectedRepositoriesURL: "s"}, }, } want := `{ "total_count": 1, "secrets": [ { "name": "n", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "visibility": "v", "selected_repositories_url": "s" } ] }` testJSONMarshal(t, u, want) } func TestEncryptedSecret_Marshal(t *testing.T) { testJSONMarshal(t, &EncryptedSecret{}, "{}") u := &EncryptedSecret{ Name: "n", KeyID: "kid", EncryptedValue: "e", Visibility: "v", SelectedRepositoryIDs: []int64{1}, } want := `{ "key_id": "kid", "encrypted_value": "e", "visibility": "v", "selected_repository_ids": [1] }` testJSONMarshal(t, u, want) } func TestSelectedReposList_Marshal(t *testing.T) { testJSONMarshal(t, &SelectedReposList{}, "{}") u := &SelectedReposList{ TotalCount: Int(1), Repositories: []*Repository{ { ID: Int64(1), URL: String("u"), Name: String("n"), }, }, } want := `{ "total_count": 1, "repositories": [ { "id": 1, "url": "u", "name": "n" } ] }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/actions_workflow_jobs.go000066400000000000000000000117271410475703100217220ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "fmt" "net/http" "net/url" ) // TaskStep represents a single task step from a sequence of tasks of a job. type TaskStep struct { Name *string `json:"name,omitempty"` Status *string `json:"status,omitempty"` Conclusion *string `json:"conclusion,omitempty"` Number *int64 `json:"number,omitempty"` StartedAt *Timestamp `json:"started_at,omitempty"` CompletedAt *Timestamp `json:"completed_at,omitempty"` } // WorkflowJob represents a repository action workflow job. type WorkflowJob struct { ID *int64 `json:"id,omitempty"` RunID *int64 `json:"run_id,omitempty"` RunURL *string `json:"run_url,omitempty"` NodeID *string `json:"node_id,omitempty"` HeadSHA *string `json:"head_sha,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` Status *string `json:"status,omitempty"` Conclusion *string `json:"conclusion,omitempty"` StartedAt *Timestamp `json:"started_at,omitempty"` CompletedAt *Timestamp `json:"completed_at,omitempty"` Name *string `json:"name,omitempty"` Steps []*TaskStep `json:"steps,omitempty"` CheckRunURL *string `json:"check_run_url,omitempty"` } // Jobs represents a slice of repository action workflow job. type Jobs struct { TotalCount *int `json:"total_count,omitempty"` Jobs []*WorkflowJob `json:"jobs,omitempty"` } // ListWorkflowJobsOptions specifies optional parameters to ListWorkflowJobs. type ListWorkflowJobsOptions struct { // Filter specifies how jobs should be filtered by their completed_at timestamp. // Possible values are: // latest - Returns jobs from the most recent execution of the workflow run // all - Returns all jobs for a workflow run, including from old executions of the workflow run // // Default value is "latest". Filter string `url:"filter,omitempty"` ListOptions } // ListWorkflowJobs lists all jobs for a workflow run. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-jobs-for-a-workflow-run func (s *ActionsService) ListWorkflowJobs(ctx context.Context, owner, repo string, runID int64, opts *ListWorkflowJobsOptions) (*Jobs, *Response, error) { u := fmt.Sprintf("repos/%s/%s/actions/runs/%v/jobs", owner, repo, runID) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } jobs := new(Jobs) resp, err := s.client.Do(ctx, req, &jobs) if err != nil { return nil, resp, err } return jobs, resp, nil } // GetWorkflowJobByID gets a specific job in a workflow run by ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-job-for-a-workflow-run func (s *ActionsService) GetWorkflowJobByID(ctx context.Context, owner, repo string, jobID int64) (*WorkflowJob, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/jobs/%v", owner, repo, jobID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } job := new(WorkflowJob) resp, err := s.client.Do(ctx, req, job) if err != nil { return nil, resp, err } return job, resp, nil } // GetWorkflowJobLogs gets a redirect URL to download a plain text file of logs for a workflow job. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#download-job-logs-for-a-workflow-run func (s *ActionsService) GetWorkflowJobLogs(ctx context.Context, owner, repo string, jobID int64, followRedirects bool) (*url.URL, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/jobs/%v/logs", owner, repo, jobID) resp, err := s.getWorkflowLogsFromURL(ctx, u, followRedirects) if err != nil { return nil, nil, err } if resp.StatusCode != http.StatusFound { return nil, newResponse(resp), fmt.Errorf("unexpected status code: %s", resp.Status) } parsedURL, err := url.Parse(resp.Header.Get("Location")) return parsedURL, newResponse(resp), err } func (s *ActionsService) getWorkflowLogsFromURL(ctx context.Context, u string, followRedirects bool) (*http.Response, error) { req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, err } var resp *http.Response // Use http.DefaultTransport if no custom Transport is configured req = withContext(ctx, req) if s.client.client.Transport == nil { resp, err = http.DefaultTransport.RoundTrip(req) } else { resp, err = s.client.client.Transport.RoundTrip(req) } if err != nil { return nil, err } resp.Body.Close() // If redirect response is returned, follow it if followRedirects && resp.StatusCode == http.StatusMovedPermanently { u = resp.Header.Get("Location") resp, err = s.getWorkflowLogsFromURL(ctx, u, false) } return resp, err } go-github-38.1.0/github/actions_workflow_jobs_test.go000066400000000000000000000261751410475703100227640ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "errors" "fmt" "net/http" "net/url" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestActionsService_ListWorkflowJobs(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/29679449/jobs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprint(w, `{"total_count":4,"jobs":[{"id":399444496,"run_id":29679449,"started_at":"2019-01-02T15:04:05Z","completed_at":"2020-01-02T15:04:05Z"},{"id":399444497,"run_id":29679449,"started_at":"2019-01-02T15:04:05Z","completed_at":"2020-01-02T15:04:05Z"}]}`) }) opts := &ListWorkflowJobsOptions{ListOptions: ListOptions{Page: 2, PerPage: 2}} ctx := context.Background() jobs, _, err := client.Actions.ListWorkflowJobs(ctx, "o", "r", 29679449, opts) if err != nil { t.Errorf("Actions.ListWorkflowJobs returned error: %v", err) } want := &Jobs{ TotalCount: Int(4), Jobs: []*WorkflowJob{ {ID: Int64(399444496), RunID: Int64(29679449), StartedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, CompletedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, {ID: Int64(399444497), RunID: Int64(29679449), StartedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, CompletedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, }, } if !cmp.Equal(jobs, want) { t.Errorf("Actions.ListWorkflowJobs returned %+v, want %+v", jobs, want) } const methodName = "ListWorkflowJobs" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListWorkflowJobs(ctx, "\n", "\n", 29679449, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListWorkflowJobs(ctx, "o", "r", 29679449, opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_ListWorkflowJobs_Filter(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/29679449/jobs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"filter": "all", "per_page": "2", "page": "2"}) fmt.Fprint(w, `{"total_count":4,"jobs":[{"id":399444496,"run_id":29679449,"started_at":"2019-01-02T15:04:05Z","completed_at":"2020-01-02T15:04:05Z"},{"id":399444497,"run_id":29679449,"started_at":"2019-01-02T15:04:05Z","completed_at":"2020-01-02T15:04:05Z"}]}`) }) opts := &ListWorkflowJobsOptions{Filter: "all", ListOptions: ListOptions{Page: 2, PerPage: 2}} ctx := context.Background() jobs, _, err := client.Actions.ListWorkflowJobs(ctx, "o", "r", 29679449, opts) if err != nil { t.Errorf("Actions.ListWorkflowJobs returned error: %v", err) } want := &Jobs{ TotalCount: Int(4), Jobs: []*WorkflowJob{ {ID: Int64(399444496), RunID: Int64(29679449), StartedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, CompletedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, {ID: Int64(399444497), RunID: Int64(29679449), StartedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, CompletedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, }, } if !cmp.Equal(jobs, want) { t.Errorf("Actions.ListWorkflowJobs returned %+v, want %+v", jobs, want) } } func TestActionsService_GetWorkflowJobByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/jobs/399444496", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":399444496,"started_at":"2019-01-02T15:04:05Z","completed_at":"2020-01-02T15:04:05Z"}`) }) ctx := context.Background() job, _, err := client.Actions.GetWorkflowJobByID(ctx, "o", "r", 399444496) if err != nil { t.Errorf("Actions.GetWorkflowJobByID returned error: %v", err) } want := &WorkflowJob{ ID: Int64(399444496), StartedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, CompletedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}, } if !cmp.Equal(job, want) { t.Errorf("Actions.GetWorkflowJobByID returned %+v, want %+v", job, want) } const methodName = "GetWorkflowJobByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetWorkflowJobByID(ctx, "\n", "\n", 399444496) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetWorkflowJobByID(ctx, "o", "r", 399444496) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetWorkflowJobLogs(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/jobs/399444496/logs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Redirect(w, r, "http://github.com/a", http.StatusFound) }) ctx := context.Background() url, resp, err := client.Actions.GetWorkflowJobLogs(ctx, "o", "r", 399444496, true) if err != nil { t.Errorf("Actions.GetWorkflowJobLogs returned error: %v", err) } if resp.StatusCode != http.StatusFound { t.Errorf("Actions.GetWorkflowJobLogs returned status: %d, want %d", resp.StatusCode, http.StatusFound) } want := "http://github.com/a" if url.String() != want { t.Errorf("Actions.GetWorkflowJobLogs returned %+v, want %+v", url.String(), want) } const methodName = "GetWorkflowJobLogs" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetWorkflowJobLogs(ctx, "\n", "\n", 399444496, true) return err }) // Add custom round tripper client.client.Transport = roundTripperFunc(func(r *http.Request) (*http.Response, error) { return nil, errors.New("failed to get workflow logs") }) testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetWorkflowJobLogs(ctx, "o", "r", 399444496, true) return err }) } func TestActionsService_GetWorkflowJobLogs_StatusMovedPermanently_dontFollowRedirects(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/jobs/399444496/logs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Redirect(w, r, "http://github.com/a", http.StatusMovedPermanently) }) ctx := context.Background() _, resp, _ := client.Actions.GetWorkflowJobLogs(ctx, "o", "r", 399444496, false) if resp.StatusCode != http.StatusMovedPermanently { t.Errorf("Actions.GetWorkflowJobLogs returned status: %d, want %d", resp.StatusCode, http.StatusMovedPermanently) } } func TestActionsService_GetWorkflowJobLogs_StatusMovedPermanently_followRedirects(t *testing.T) { client, mux, serverURL, teardown := setup() defer teardown() // Mock a redirect link, which leads to an archive link mux.HandleFunc("/repos/o/r/actions/jobs/399444496/logs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") redirectURL, _ := url.Parse(serverURL + baseURLPath + "/redirect") http.Redirect(w, r, redirectURL.String(), http.StatusMovedPermanently) }) mux.HandleFunc("/redirect", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Redirect(w, r, "http://github.com/a", http.StatusFound) }) ctx := context.Background() url, resp, err := client.Actions.GetWorkflowJobLogs(ctx, "o", "r", 399444496, true) if err != nil { t.Errorf("Actions.GetWorkflowJobLogs returned error: %v", err) } if resp.StatusCode != http.StatusFound { t.Errorf("Actions.GetWorkflowJobLogs returned status: %d, want %d", resp.StatusCode, http.StatusFound) } want := "http://github.com/a" if url.String() != want { t.Errorf("Actions.GetWorkflowJobLogs returned %+v, want %+v", url.String(), want) } } func TestTaskStep_Marshal(t *testing.T) { testJSONMarshal(t, &TaskStep{}, "{}") u := &TaskStep{ Name: String("n"), Status: String("s"), Conclusion: String("c"), Number: Int64(1), StartedAt: &Timestamp{referenceTime}, CompletedAt: &Timestamp{referenceTime}, } want := `{ "name": "n", "status": "s", "conclusion": "c", "number": 1, "started_at": ` + referenceTimeStr + `, "completed_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } func TestWorkflowJob_Marshal(t *testing.T) { testJSONMarshal(t, &WorkflowJob{}, "{}") u := &WorkflowJob{ ID: Int64(1), RunID: Int64(1), RunURL: String("r"), NodeID: String("n"), HeadSHA: String("h"), URL: String("u"), HTMLURL: String("h"), Status: String("s"), Conclusion: String("c"), StartedAt: &Timestamp{referenceTime}, CompletedAt: &Timestamp{referenceTime}, Name: String("n"), Steps: []*TaskStep{ { Name: String("n"), Status: String("s"), Conclusion: String("c"), Number: Int64(1), StartedAt: &Timestamp{referenceTime}, CompletedAt: &Timestamp{referenceTime}, }, }, CheckRunURL: String("c"), } want := `{ "id": 1, "run_id": 1, "run_url": "r", "node_id": "n", "head_sha": "h", "url": "u", "html_url": "h", "status": "s", "conclusion": "c", "started_at": ` + referenceTimeStr + `, "completed_at": ` + referenceTimeStr + `, "name": "n", "steps": [{ "name": "n", "status": "s", "conclusion": "c", "number": 1, "started_at": ` + referenceTimeStr + `, "completed_at": ` + referenceTimeStr + ` }], "check_run_url": "c" }` testJSONMarshal(t, u, want) } func TestJobs_Marshal(t *testing.T) { testJSONMarshal(t, &Jobs{}, "{}") u := &Jobs{ TotalCount: Int(1), Jobs: []*WorkflowJob{ { ID: Int64(1), RunID: Int64(1), RunURL: String("r"), NodeID: String("n"), HeadSHA: String("h"), URL: String("u"), HTMLURL: String("h"), Status: String("s"), Conclusion: String("c"), StartedAt: &Timestamp{referenceTime}, CompletedAt: &Timestamp{referenceTime}, Name: String("n"), Steps: []*TaskStep{ { Name: String("n"), Status: String("s"), Conclusion: String("c"), Number: Int64(1), StartedAt: &Timestamp{referenceTime}, CompletedAt: &Timestamp{referenceTime}, }, }, CheckRunURL: String("c"), }, }, } want := `{ "total_count": 1, "jobs": [{ "id": 1, "run_id": 1, "run_url": "r", "node_id": "n", "head_sha": "h", "url": "u", "html_url": "h", "status": "s", "conclusion": "c", "started_at": ` + referenceTimeStr + `, "completed_at": ` + referenceTimeStr + `, "name": "n", "steps": [{ "name": "n", "status": "s", "conclusion": "c", "number": 1, "started_at": ` + referenceTimeStr + `, "completed_at": ` + referenceTimeStr + ` }], "check_run_url": "c" }] }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/actions_workflow_runs.go000066400000000000000000000212331410475703100217450ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "fmt" "net/http" "net/url" ) // WorkflowRun represents a repository action workflow run. type WorkflowRun struct { ID *int64 `json:"id,omitempty"` Name *string `json:"name,omitempty"` NodeID *string `json:"node_id,omitempty"` HeadBranch *string `json:"head_branch,omitempty"` HeadSHA *string `json:"head_sha,omitempty"` RunNumber *int `json:"run_number,omitempty"` Event *string `json:"event,omitempty"` Status *string `json:"status,omitempty"` Conclusion *string `json:"conclusion,omitempty"` WorkflowID *int64 `json:"workflow_id,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` PullRequests []*PullRequest `json:"pull_requests,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` JobsURL *string `json:"jobs_url,omitempty"` LogsURL *string `json:"logs_url,omitempty"` CheckSuiteURL *string `json:"check_suite_url,omitempty"` ArtifactsURL *string `json:"artifacts_url,omitempty"` CancelURL *string `json:"cancel_url,omitempty"` RerunURL *string `json:"rerun_url,omitempty"` HeadCommit *HeadCommit `json:"head_commit,omitempty"` WorkflowURL *string `json:"workflow_url,omitempty"` Repository *Repository `json:"repository,omitempty"` HeadRepository *Repository `json:"head_repository,omitempty"` } // WorkflowRuns represents a slice of repository action workflow run. type WorkflowRuns struct { TotalCount *int `json:"total_count,omitempty"` WorkflowRuns []*WorkflowRun `json:"workflow_runs,omitempty"` } // ListWorkflowRunsOptions specifies optional parameters to ListWorkflowRuns. type ListWorkflowRunsOptions struct { Actor string `url:"actor,omitempty"` Branch string `url:"branch,omitempty"` Event string `url:"event,omitempty"` Status string `url:"status,omitempty"` ListOptions } // WorkflowRunUsage represents a usage of a specific workflow run. type WorkflowRunUsage struct { Billable *WorkflowRunEnvironment `json:"billable,omitempty"` RunDurationMS *int64 `json:"run_duration_ms,omitempty"` } // WorkflowRunEnvironment represents different runner environments available for a workflow run. type WorkflowRunEnvironment struct { Ubuntu *WorkflowRunBill `json:"UBUNTU,omitempty"` MacOS *WorkflowRunBill `json:"MACOS,omitempty"` Windows *WorkflowRunBill `json:"WINDOWS,omitempty"` } // WorkflowRunBill specifies billable time for a specific environment in a workflow run. type WorkflowRunBill struct { TotalMS *int64 `json:"total_ms,omitempty"` Jobs *int `json:"jobs,omitempty"` } func (s *ActionsService) listWorkflowRuns(ctx context.Context, endpoint string, opts *ListWorkflowRunsOptions) (*WorkflowRuns, *Response, error) { u, err := addOptions(endpoint, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } runs := new(WorkflowRuns) resp, err := s.client.Do(ctx, req, &runs) if err != nil { return nil, resp, err } return runs, resp, nil } // ListWorkflowRunsByID lists all workflow runs by workflow ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-workflow-runs func (s *ActionsService) ListWorkflowRunsByID(ctx context.Context, owner, repo string, workflowID int64, opts *ListWorkflowRunsOptions) (*WorkflowRuns, *Response, error) { u := fmt.Sprintf("repos/%s/%s/actions/workflows/%v/runs", owner, repo, workflowID) return s.listWorkflowRuns(ctx, u, opts) } // ListWorkflowRunsByFileName lists all workflow runs by workflow file name. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-workflow-runs func (s *ActionsService) ListWorkflowRunsByFileName(ctx context.Context, owner, repo, workflowFileName string, opts *ListWorkflowRunsOptions) (*WorkflowRuns, *Response, error) { u := fmt.Sprintf("repos/%s/%s/actions/workflows/%v/runs", owner, repo, workflowFileName) return s.listWorkflowRuns(ctx, u, opts) } // ListRepositoryWorkflowRuns lists all workflow runs for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-workflow-runs-for-a-repository func (s *ActionsService) ListRepositoryWorkflowRuns(ctx context.Context, owner, repo string, opts *ListWorkflowRunsOptions) (*WorkflowRuns, *Response, error) { u := fmt.Sprintf("repos/%s/%s/actions/runs", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } runs := new(WorkflowRuns) resp, err := s.client.Do(ctx, req, &runs) if err != nil { return nil, resp, err } return runs, resp, nil } // GetWorkflowRunByID gets a specific workflow run by ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-workflow-run func (s *ActionsService) GetWorkflowRunByID(ctx context.Context, owner, repo string, runID int64) (*WorkflowRun, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runs/%v", owner, repo, runID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } run := new(WorkflowRun) resp, err := s.client.Do(ctx, req, run) if err != nil { return nil, resp, err } return run, resp, nil } // RerunWorkflowByID re-runs a workflow by ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#re-run-a-workflow func (s *ActionsService) RerunWorkflowByID(ctx context.Context, owner, repo string, runID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/rerun", owner, repo, runID) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // CancelWorkflowRunByID cancels a workflow run by ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#cancel-a-workflow-run func (s *ActionsService) CancelWorkflowRunByID(ctx context.Context, owner, repo string, runID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/cancel", owner, repo, runID) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // GetWorkflowRunLogs gets a redirect URL to download a plain text file of logs for a workflow run. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#download-workflow-run-logs func (s *ActionsService) GetWorkflowRunLogs(ctx context.Context, owner, repo string, runID int64, followRedirects bool) (*url.URL, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/logs", owner, repo, runID) resp, err := s.getWorkflowLogsFromURL(ctx, u, followRedirects) if err != nil { return nil, nil, err } if resp.StatusCode != http.StatusFound { return nil, newResponse(resp), fmt.Errorf("unexpected status code: %s", resp.Status) } parsedURL, err := url.Parse(resp.Header.Get("Location")) return parsedURL, newResponse(resp), err } // DeleteWorkflowRunLogs deletes all logs for a workflow run. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#delete-workflow-run-logs func (s *ActionsService) DeleteWorkflowRunLogs(ctx context.Context, owner, repo string, runID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/logs", owner, repo, runID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // GetWorkflowRunUsageByID gets a specific workflow usage run by run ID in the unit of billable milliseconds. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-workflow-run-usage func (s *ActionsService) GetWorkflowRunUsageByID(ctx context.Context, owner, repo string, runID int64) (*WorkflowRunUsage, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/timing", owner, repo, runID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } workflowRunUsage := new(WorkflowRunUsage) resp, err := s.client.Do(ctx, req, workflowRunUsage) if err != nil { return nil, resp, err } return workflowRunUsage, resp, nil } go-github-38.1.0/github/actions_workflow_runs_test.go000066400000000000000000000554541410475703100230200ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "fmt" "net/http" "net/url" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestActionsService_ListWorkflowRunsByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/workflows/29679449/runs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprint(w, `{"total_count":4,"workflow_runs":[{"id":399444496,"run_number":296,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"id":399444497,"run_number":296,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`) }) opts := &ListWorkflowRunsOptions{ListOptions: ListOptions{Page: 2, PerPage: 2}} ctx := context.Background() runs, _, err := client.Actions.ListWorkflowRunsByID(ctx, "o", "r", 29679449, opts) if err != nil { t.Errorf("Actions.ListWorkFlowRunsByID returned error: %v", err) } want := &WorkflowRuns{ TotalCount: Int(4), WorkflowRuns: []*WorkflowRun{ {ID: Int64(399444496), RunNumber: Int(296), CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, {ID: Int64(399444497), RunNumber: Int(296), CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, }, } if !cmp.Equal(runs, want) { t.Errorf("Actions.ListWorkflowRunsByID returned %+v, want %+v", runs, want) } const methodName = "ListWorkflowRunsByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListWorkflowRunsByID(ctx, "\n", "\n", 29679449, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListWorkflowRunsByID(ctx, "o", "r", 29679449, opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_ListWorkflowRunsFileName(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/workflows/29679449/runs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprint(w, `{"total_count":4,"workflow_runs":[{"id":399444496,"run_number":296,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"id":399444497,"run_number":296,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`) }) opts := &ListWorkflowRunsOptions{ListOptions: ListOptions{Page: 2, PerPage: 2}} ctx := context.Background() runs, _, err := client.Actions.ListWorkflowRunsByFileName(ctx, "o", "r", "29679449", opts) if err != nil { t.Errorf("Actions.ListWorkFlowRunsByFileName returned error: %v", err) } want := &WorkflowRuns{ TotalCount: Int(4), WorkflowRuns: []*WorkflowRun{ {ID: Int64(399444496), RunNumber: Int(296), CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, {ID: Int64(399444497), RunNumber: Int(296), CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, }, } if !cmp.Equal(runs, want) { t.Errorf("Actions.ListWorkflowRunsByFileName returned %+v, want %+v", runs, want) } const methodName = "ListWorkflowRunsByFileName" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListWorkflowRunsByFileName(ctx, "\n", "\n", "29679449", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListWorkflowRunsByFileName(ctx, "o", "r", "29679449", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetWorkflowRunByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/29679449", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":399444496,"run_number":296,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}}`) }) ctx := context.Background() runs, _, err := client.Actions.GetWorkflowRunByID(ctx, "o", "r", 29679449) if err != nil { t.Errorf("Actions.GetWorkflowRunByID returned error: %v", err) } want := &WorkflowRun{ ID: Int64(399444496), RunNumber: Int(296), CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}, } if !cmp.Equal(runs, want) { t.Errorf("Actions.GetWorkflowRunByID returned %+v, want %+v", runs, want) } const methodName = "GetWorkflowRunByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetWorkflowRunByID(ctx, "\n", "\n", 29679449) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetWorkflowRunByID(ctx, "o", "r", 29679449) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_RerunWorkflowRunByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/3434/rerun", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") w.WriteHeader(http.StatusCreated) }) ctx := context.Background() resp, err := client.Actions.RerunWorkflowByID(ctx, "o", "r", 3434) if err != nil { t.Errorf("Actions.RerunWorkflowByID returned error: %v", err) } if resp.StatusCode != http.StatusCreated { t.Errorf("Actions.RerunWorkflowRunByID returned status: %d, want %d", resp.StatusCode, http.StatusCreated) } const methodName = "RerunWorkflowByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.RerunWorkflowByID(ctx, "\n", "\n", 3434) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.RerunWorkflowByID(ctx, "o", "r", 3434) }) } func TestActionsService_CancelWorkflowRunByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/3434/cancel", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") w.WriteHeader(http.StatusAccepted) }) ctx := context.Background() resp, err := client.Actions.CancelWorkflowRunByID(ctx, "o", "r", 3434) if _, ok := err.(*AcceptedError); !ok { t.Errorf("Actions.CancelWorkflowRunByID returned error: %v (want AcceptedError)", err) } if resp.StatusCode != http.StatusAccepted { t.Errorf("Actions.CancelWorkflowRunByID returned status: %d, want %d", resp.StatusCode, http.StatusAccepted) } const methodName = "CancelWorkflowRunByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.CancelWorkflowRunByID(ctx, "\n", "\n", 3434) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.CancelWorkflowRunByID(ctx, "o", "r", 3434) }) } func TestActionsService_GetWorkflowRunLogs(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/399444496/logs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Redirect(w, r, "http://github.com/a", http.StatusFound) }) ctx := context.Background() url, resp, err := client.Actions.GetWorkflowRunLogs(ctx, "o", "r", 399444496, true) if err != nil { t.Errorf("Actions.GetWorkflowRunLogs returned error: %v", err) } if resp.StatusCode != http.StatusFound { t.Errorf("Actions.GetWorkflowRunLogs returned status: %d, want %d", resp.StatusCode, http.StatusFound) } want := "http://github.com/a" if url.String() != want { t.Errorf("Actions.GetWorkflowRunLogs returned %+v, want %+v", url.String(), want) } const methodName = "GetWorkflowRunLogs" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetWorkflowRunLogs(ctx, "\n", "\n", 399444496, true) return err }) } func TestActionsService_GetWorkflowRunLogs_StatusMovedPermanently_dontFollowRedirects(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/399444496/logs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Redirect(w, r, "http://github.com/a", http.StatusMovedPermanently) }) ctx := context.Background() _, resp, _ := client.Actions.GetWorkflowRunLogs(ctx, "o", "r", 399444496, false) if resp.StatusCode != http.StatusMovedPermanently { t.Errorf("Actions.GetWorkflowJobLogs returned status: %d, want %d", resp.StatusCode, http.StatusMovedPermanently) } } func TestActionsService_GetWorkflowRunLogs_StatusMovedPermanently_followRedirects(t *testing.T) { client, mux, serverURL, teardown := setup() defer teardown() // Mock a redirect link, which leads to an archive link mux.HandleFunc("/repos/o/r/actions/runs/399444496/logs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") redirectURL, _ := url.Parse(serverURL + baseURLPath + "/redirect") http.Redirect(w, r, redirectURL.String(), http.StatusMovedPermanently) }) mux.HandleFunc("/redirect", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Redirect(w, r, "http://github.com/a", http.StatusFound) }) ctx := context.Background() url, resp, err := client.Actions.GetWorkflowRunLogs(ctx, "o", "r", 399444496, true) if err != nil { t.Errorf("Actions.GetWorkflowJobLogs returned error: %v", err) } if resp.StatusCode != http.StatusFound { t.Errorf("Actions.GetWorkflowJobLogs returned status: %d, want %d", resp.StatusCode, http.StatusFound) } want := "http://github.com/a" if url.String() != want { t.Errorf("Actions.GetWorkflowJobLogs returned %+v, want %+v", url.String(), want) } const methodName = "GetWorkflowRunLogs" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetWorkflowRunLogs(ctx, "\n", "\n", 399444496, true) return err }) } func TestActionService_ListRepositoryWorkflowRuns(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprint(w, `{"total_count":2, "workflow_runs":[ {"id":298499444,"run_number":301,"created_at":"2020-04-11T11:14:54Z","updated_at":"2020-04-11T11:14:54Z"}, {"id":298499445,"run_number":302,"created_at":"2020-04-11T11:14:54Z","updated_at":"2020-04-11T11:14:54Z"}]}`) }) opts := &ListWorkflowRunsOptions{ListOptions: ListOptions{Page: 2, PerPage: 2}} ctx := context.Background() runs, _, err := client.Actions.ListRepositoryWorkflowRuns(ctx, "o", "r", opts) if err != nil { t.Errorf("Actions.ListRepositoryWorkflowRuns returned error: %v", err) } expected := &WorkflowRuns{ TotalCount: Int(2), WorkflowRuns: []*WorkflowRun{ {ID: Int64(298499444), RunNumber: Int(301), CreatedAt: &Timestamp{time.Date(2020, time.April, 11, 11, 14, 54, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.April, 11, 11, 14, 54, 0, time.UTC)}}, {ID: Int64(298499445), RunNumber: Int(302), CreatedAt: &Timestamp{time.Date(2020, time.April, 11, 11, 14, 54, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.April, 11, 11, 14, 54, 0, time.UTC)}}, }, } if !cmp.Equal(runs, expected) { t.Errorf("Actions.ListRepositoryWorkflowRuns returned %+v, want %+v", runs, expected) } const methodName = "ListRepositoryWorkflowRuns" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListRepositoryWorkflowRuns(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListRepositoryWorkflowRuns(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionService_DeleteWorkflowRunLogs(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/399444496/logs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Actions.DeleteWorkflowRunLogs(ctx, "o", "r", 399444496); err != nil { t.Errorf("DeleteWorkflowRunLogs returned error: %v", err) } const methodName = "DeleteWorkflowRunLogs" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.DeleteWorkflowRunLogs(ctx, "\n", "\n", 399444496) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.DeleteWorkflowRunLogs(ctx, "o", "r", 399444496) }) } func TestActionsService_GetWorkflowRunUsageByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/29679449/timing", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"billable":{"UBUNTU":{"total_ms":180000,"jobs":1},"MACOS":{"total_ms":240000,"jobs":4},"WINDOWS":{"total_ms":300000,"jobs":2}},"run_duration_ms":500000}`) }) ctx := context.Background() workflowRunUsage, _, err := client.Actions.GetWorkflowRunUsageByID(ctx, "o", "r", 29679449) if err != nil { t.Errorf("Actions.GetWorkflowRunUsageByID returned error: %v", err) } want := &WorkflowRunUsage{ Billable: &WorkflowRunEnvironment{ Ubuntu: &WorkflowRunBill{ TotalMS: Int64(180000), Jobs: Int(1), }, MacOS: &WorkflowRunBill{ TotalMS: Int64(240000), Jobs: Int(4), }, Windows: &WorkflowRunBill{ TotalMS: Int64(300000), Jobs: Int(2), }, }, RunDurationMS: Int64(500000), } if !cmp.Equal(workflowRunUsage, want) { t.Errorf("Actions.GetWorkflowRunUsageByID returned %+v, want %+v", workflowRunUsage, want) } const methodName = "GetWorkflowRunUsageByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetWorkflowRunUsageByID(ctx, "\n", "\n", 29679449) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetWorkflowRunUsageByID(ctx, "o", "r", 29679449) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestWorkflowRun_Marshal(t *testing.T) { testJSONMarshal(t, &WorkflowRun{}, "{}") u := &WorkflowRun{ ID: Int64(1), Name: String("n"), NodeID: String("nid"), HeadBranch: String("hb"), HeadSHA: String("hs"), RunNumber: Int(1), Event: String("e"), Status: String("s"), Conclusion: String("c"), WorkflowID: Int64(1), URL: String("u"), HTMLURL: String("h"), PullRequests: []*PullRequest{ { URL: String("u"), ID: Int64(1), Number: Int(1), Head: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, }, Base: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, }, }, }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, JobsURL: String("j"), LogsURL: String("l"), CheckSuiteURL: String("c"), ArtifactsURL: String("a"), CancelURL: String("c"), RerunURL: String("r"), HeadCommit: &HeadCommit{ Message: String("m"), Author: &CommitAuthor{ Name: String("n"), Email: String("e"), Login: String("l"), }, URL: String("u"), Distinct: Bool(false), SHA: String("s"), ID: String("i"), TreeID: String("tid"), Timestamp: &Timestamp{referenceTime}, Committer: &CommitAuthor{ Name: String("n"), Email: String("e"), Login: String("l"), }, }, WorkflowURL: String("w"), Repository: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, HeadRepository: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, } want := `{ "id": 1, "name": "n", "node_id": "nid", "head_branch": "hb", "head_sha": "hs", "run_number": 1, "event": "e", "status": "s", "conclusion": "c", "workflow_id": 1, "url": "u", "html_url": "h", "pull_requests": [ { "id":1, "number":1, "url":"u", "head":{ "ref":"r", "sha":"s", "repo": { "id":1, "name":"n", "url":"s" } }, "base": { "ref":"r", "sha":"s", "repo": { "id":1, "name":"n", "url":"u" } } } ], "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "jobs_url": "j", "logs_url": "l", "check_suite_url": "c", "artifacts_url": "a", "cancel_url": "c", "rerun_url": "r", "head_commit": { "message": "m", "author": { "name": "n", "email": "e", "username": "l" }, "url": "u", "distinct": false, "sha": "s", "id": "i", "tree_id": "tid", "timestamp": ` + referenceTimeStr + `, "committer": { "name": "n", "email": "e", "username": "l" } }, "workflow_url": "w", "repository": { "id": 1, "url": "u", "name": "n" }, "head_repository": { "id": 1, "url": "u", "name": "n" } }` testJSONMarshal(t, u, want) } func TestWorkflowRuns_Marshal(t *testing.T) { testJSONMarshal(t, &WorkflowRuns{}, "{}") u := &WorkflowRuns{ TotalCount: Int(1), WorkflowRuns: []*WorkflowRun{ { ID: Int64(1), Name: String("n"), NodeID: String("nid"), HeadBranch: String("hb"), HeadSHA: String("hs"), RunNumber: Int(1), Event: String("e"), Status: String("s"), Conclusion: String("c"), WorkflowID: Int64(1), URL: String("u"), HTMLURL: String("h"), PullRequests: []*PullRequest{ { URL: String("u"), ID: Int64(1), Number: Int(1), Head: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, }, Base: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, }, }, }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, JobsURL: String("j"), LogsURL: String("l"), CheckSuiteURL: String("c"), ArtifactsURL: String("a"), CancelURL: String("c"), RerunURL: String("r"), HeadCommit: &HeadCommit{ Message: String("m"), Author: &CommitAuthor{ Name: String("n"), Email: String("e"), Login: String("l"), }, URL: String("u"), Distinct: Bool(false), SHA: String("s"), ID: String("i"), TreeID: String("tid"), Timestamp: &Timestamp{referenceTime}, Committer: &CommitAuthor{ Name: String("n"), Email: String("e"), Login: String("l"), }, }, WorkflowURL: String("w"), Repository: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, HeadRepository: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, }, }, } want := `{ "total_count": 1, "workflow_runs": [ { "id": 1, "name": "n", "node_id": "nid", "head_branch": "hb", "head_sha": "hs", "run_number": 1, "event": "e", "status": "s", "conclusion": "c", "workflow_id": 1, "url": "u", "html_url": "h", "pull_requests": [ { "id":1, "number":1, "url":"u", "head":{ "ref":"r", "sha":"s", "repo": { "id":1, "name":"n", "url":"s" } }, "base": { "ref":"r", "sha":"s", "repo": { "id":1, "name":"n", "url":"u" } } } ], "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "jobs_url": "j", "logs_url": "l", "check_suite_url": "c", "artifacts_url": "a", "cancel_url": "c", "rerun_url": "r", "head_commit": { "message": "m", "author": { "name": "n", "email": "e", "username": "l" }, "url": "u", "distinct": false, "sha": "s", "id": "i", "tree_id": "tid", "timestamp": ` + referenceTimeStr + `, "committer": { "name": "n", "email": "e", "username": "l" } }, "workflow_url": "w", "repository": { "id": 1, "url": "u", "name": "n" }, "head_repository": { "id": 1, "url": "u", "name": "n" } } ] }` testJSONMarshal(t, u, want) } func TestWorkflowRunBill_Marshal(t *testing.T) { testJSONMarshal(t, &WorkflowRunBill{}, "{}") u := &WorkflowRunBill{ TotalMS: Int64(1), Jobs: Int(1), } want := `{ "total_ms": 1, "jobs": 1 }` testJSONMarshal(t, u, want) } func TestWorkflowRunEnvironment_Marshal(t *testing.T) { testJSONMarshal(t, &WorkflowRunEnvironment{}, "{}") u := &WorkflowRunEnvironment{ Ubuntu: &WorkflowRunBill{ TotalMS: Int64(1), Jobs: Int(1), }, MacOS: &WorkflowRunBill{ TotalMS: Int64(1), Jobs: Int(1), }, Windows: &WorkflowRunBill{ TotalMS: Int64(1), Jobs: Int(1), }, } want := `{ "UBUNTU": { "total_ms": 1, "jobs": 1 }, "MACOS": { "total_ms": 1, "jobs": 1 }, "WINDOWS": { "total_ms": 1, "jobs": 1 } }` testJSONMarshal(t, u, want) } func TestWorkflowRunUsage_Marshal(t *testing.T) { testJSONMarshal(t, &WorkflowRunUsage{}, "{}") u := &WorkflowRunUsage{ Billable: &WorkflowRunEnvironment{ Ubuntu: &WorkflowRunBill{ TotalMS: Int64(1), Jobs: Int(1), }, MacOS: &WorkflowRunBill{ TotalMS: Int64(1), Jobs: Int(1), }, Windows: &WorkflowRunBill{ TotalMS: Int64(1), Jobs: Int(1), }, }, RunDurationMS: Int64(1), } want := `{ "billable": { "UBUNTU": { "total_ms": 1, "jobs": 1 }, "MACOS": { "total_ms": 1, "jobs": 1 }, "WINDOWS": { "total_ms": 1, "jobs": 1 } }, "run_duration_ms": 1 }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/actions_workflows.go000066400000000000000000000212621410475703100210630ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "fmt" ) // Workflow represents a repository action workflow. type Workflow struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Name *string `json:"name,omitempty"` Path *string `json:"path,omitempty"` State *string `json:"state,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` BadgeURL *string `json:"badge_url,omitempty"` } // Workflows represents a slice of repository action workflows. type Workflows struct { TotalCount *int `json:"total_count,omitempty"` Workflows []*Workflow `json:"workflows,omitempty"` } // WorkflowUsage represents a usage of a specific workflow. type WorkflowUsage struct { Billable *WorkflowEnvironment `json:"billable,omitempty"` } // WorkflowEnvironment represents different runner environments available for a workflow. type WorkflowEnvironment struct { Ubuntu *WorkflowBill `json:"UBUNTU,omitempty"` MacOS *WorkflowBill `json:"MACOS,omitempty"` Windows *WorkflowBill `json:"WINDOWS,omitempty"` } // WorkflowBill specifies billable time for a specific environment in a workflow. type WorkflowBill struct { TotalMS *int64 `json:"total_ms,omitempty"` } // CreateWorkflowDispatchEventRequest represents a request to create a workflow dispatch event. type CreateWorkflowDispatchEventRequest struct { // Ref represents the reference of the workflow run. // The reference can be a branch, tag, or a commit SHA. // Ref is required when creating a workflow dispatch event. Ref string `json:"ref"` // Inputs represents input keys and values configured in the workflow file. // The maximum number of properties is 10. // Default: Any default properties configured in the workflow file will be used when `inputs` are omitted. Inputs map[string]interface{} `json:"inputs,omitempty"` } // ListWorkflows lists all workflows in a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#list-repository-workflows func (s *ActionsService) ListWorkflows(ctx context.Context, owner, repo string, opts *ListOptions) (*Workflows, *Response, error) { u := fmt.Sprintf("repos/%s/%s/actions/workflows", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } workflows := new(Workflows) resp, err := s.client.Do(ctx, req, &workflows) if err != nil { return nil, resp, err } return workflows, resp, nil } // GetWorkflowByID gets a specific workflow by ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-workflow func (s *ActionsService) GetWorkflowByID(ctx context.Context, owner, repo string, workflowID int64) (*Workflow, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v", owner, repo, workflowID) return s.getWorkflow(ctx, u) } // GetWorkflowByFileName gets a specific workflow by file name. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-a-workflow func (s *ActionsService) GetWorkflowByFileName(ctx context.Context, owner, repo, workflowFileName string) (*Workflow, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v", owner, repo, workflowFileName) return s.getWorkflow(ctx, u) } func (s *ActionsService) getWorkflow(ctx context.Context, url string) (*Workflow, *Response, error) { req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } workflow := new(Workflow) resp, err := s.client.Do(ctx, req, workflow) if err != nil { return nil, resp, err } return workflow, resp, nil } // GetWorkflowUsageByID gets a specific workflow usage by ID in the unit of billable milliseconds. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-workflow-usage func (s *ActionsService) GetWorkflowUsageByID(ctx context.Context, owner, repo string, workflowID int64) (*WorkflowUsage, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v/timing", owner, repo, workflowID) return s.getWorkflowUsage(ctx, u) } // GetWorkflowUsageByFileName gets a specific workflow usage by file name in the unit of billable milliseconds. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#get-workflow-usage func (s *ActionsService) GetWorkflowUsageByFileName(ctx context.Context, owner, repo, workflowFileName string) (*WorkflowUsage, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v/timing", owner, repo, workflowFileName) return s.getWorkflowUsage(ctx, u) } func (s *ActionsService) getWorkflowUsage(ctx context.Context, url string) (*WorkflowUsage, *Response, error) { req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } workflowUsage := new(WorkflowUsage) resp, err := s.client.Do(ctx, req, workflowUsage) if err != nil { return nil, resp, err } return workflowUsage, resp, nil } // CreateWorkflowDispatchEventByID manually triggers a GitHub Actions workflow run. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-a-workflow-dispatch-event func (s *ActionsService) CreateWorkflowDispatchEventByID(ctx context.Context, owner, repo string, workflowID int64, event CreateWorkflowDispatchEventRequest) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v/dispatches", owner, repo, workflowID) return s.createWorkflowDispatchEvent(ctx, u, &event) } // CreateWorkflowDispatchEventByFileName manually triggers a GitHub Actions workflow run. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#create-a-workflow-dispatch-event func (s *ActionsService) CreateWorkflowDispatchEventByFileName(ctx context.Context, owner, repo, workflowFileName string, event CreateWorkflowDispatchEventRequest) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v/dispatches", owner, repo, workflowFileName) return s.createWorkflowDispatchEvent(ctx, u, &event) } func (s *ActionsService) createWorkflowDispatchEvent(ctx context.Context, url string, event *CreateWorkflowDispatchEventRequest) (*Response, error) { req, err := s.client.NewRequest("POST", url, event) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // EnableWorkflowByID enables a workflow and sets the state of the workflow to "active". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#enable-a-workflow func (s *ActionsService) EnableWorkflowByID(ctx context.Context, owner, repo string, workflowID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v/enable", owner, repo, workflowID) return s.doNewPutRequest(ctx, u) } // EnableWorkflowByFileName enables a workflow and sets the state of the workflow to "active". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#enable-a-workflow func (s *ActionsService) EnableWorkflowByFileName(ctx context.Context, owner, repo, workflowFileName string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v/enable", owner, repo, workflowFileName) return s.doNewPutRequest(ctx, u) } // DisableWorkflowByID disables a workflow and sets the state of the workflow to "disabled_manually". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#disable-a-workflow func (s *ActionsService) DisableWorkflowByID(ctx context.Context, owner, repo string, workflowID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v/disable", owner, repo, workflowID) return s.doNewPutRequest(ctx, u) } // DisableWorkflowByFileName disables a workflow and sets the state of the workflow to "disabled_manually". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/actions/#disable-a-workflow func (s *ActionsService) DisableWorkflowByFileName(ctx context.Context, owner, repo, workflowFileName string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v/disable", owner, repo, workflowFileName) return s.doNewPutRequest(ctx, u) } func (s *ActionsService) doNewPutRequest(ctx context.Context, url string) (*Response, error) { req, err := s.client.NewRequest("PUT", url, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/actions_workflows_test.go000066400000000000000000000432341410475703100221250ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestActionsService_ListWorkflows(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/workflows", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprint(w, `{"total_count":4,"workflows":[{"id":72844,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"id":72845,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() workflows, _, err := client.Actions.ListWorkflows(ctx, "o", "r", opts) if err != nil { t.Errorf("Actions.ListWorkflows returned error: %v", err) } want := &Workflows{ TotalCount: Int(4), Workflows: []*Workflow{ {ID: Int64(72844), CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, {ID: Int64(72845), CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, }, } if !cmp.Equal(workflows, want) { t.Errorf("Actions.ListWorkflows returned %+v, want %+v", workflows, want) } const methodName = "ListWorkflows" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListWorkflows(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListWorkflows(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetWorkflowByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/workflows/72844", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":72844,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}`) }) ctx := context.Background() workflow, _, err := client.Actions.GetWorkflowByID(ctx, "o", "r", 72844) if err != nil { t.Errorf("Actions.GetWorkflowByID returned error: %v", err) } want := &Workflow{ ID: Int64(72844), CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}, } if !cmp.Equal(workflow, want) { t.Errorf("Actions.GetWorkflowByID returned %+v, want %+v", workflow, want) } const methodName = "GetWorkflowByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetWorkflowByID(ctx, "\n", "\n", -72844) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetWorkflowByID(ctx, "o", "r", 72844) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetWorkflowByFileName(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/workflows/main.yml", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":72844,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}`) }) ctx := context.Background() workflow, _, err := client.Actions.GetWorkflowByFileName(ctx, "o", "r", "main.yml") if err != nil { t.Errorf("Actions.GetWorkflowByFileName returned error: %v", err) } want := &Workflow{ ID: Int64(72844), CreatedAt: &Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}, } if !cmp.Equal(workflow, want) { t.Errorf("Actions.GetWorkflowByFileName returned %+v, want %+v", workflow, want) } const methodName = "GetWorkflowByFileName" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetWorkflowByFileName(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetWorkflowByFileName(ctx, "o", "r", "main.yml") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetWorkflowUsageByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/workflows/72844/timing", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"billable":{"UBUNTU":{"total_ms":180000},"MACOS":{"total_ms":240000},"WINDOWS":{"total_ms":300000}}}`) }) ctx := context.Background() workflowUsage, _, err := client.Actions.GetWorkflowUsageByID(ctx, "o", "r", 72844) if err != nil { t.Errorf("Actions.GetWorkflowUsageByID returned error: %v", err) } want := &WorkflowUsage{ Billable: &WorkflowEnvironment{ Ubuntu: &WorkflowBill{ TotalMS: Int64(180000), }, MacOS: &WorkflowBill{ TotalMS: Int64(240000), }, Windows: &WorkflowBill{ TotalMS: Int64(300000), }, }, } if !cmp.Equal(workflowUsage, want) { t.Errorf("Actions.GetWorkflowUsageByID returned %+v, want %+v", workflowUsage, want) } const methodName = "GetWorkflowUsageByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetWorkflowUsageByID(ctx, "\n", "\n", -72844) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetWorkflowUsageByID(ctx, "o", "r", 72844) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetWorkflowUsageByFileName(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/workflows/main.yml/timing", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"billable":{"UBUNTU":{"total_ms":180000},"MACOS":{"total_ms":240000},"WINDOWS":{"total_ms":300000}}}`) }) ctx := context.Background() workflowUsage, _, err := client.Actions.GetWorkflowUsageByFileName(ctx, "o", "r", "main.yml") if err != nil { t.Errorf("Actions.GetWorkflowUsageByFileName returned error: %v", err) } want := &WorkflowUsage{ Billable: &WorkflowEnvironment{ Ubuntu: &WorkflowBill{ TotalMS: Int64(180000), }, MacOS: &WorkflowBill{ TotalMS: Int64(240000), }, Windows: &WorkflowBill{ TotalMS: Int64(300000), }, }, } if !cmp.Equal(workflowUsage, want) { t.Errorf("Actions.GetWorkflowUsageByFileName returned %+v, want %+v", workflowUsage, want) } const methodName = "GetWorkflowUsageByFileName" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetWorkflowUsageByFileName(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetWorkflowUsageByFileName(ctx, "o", "r", "main.yml") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_CreateWorkflowDispatchEventByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() event := CreateWorkflowDispatchEventRequest{ Ref: "d4cfb6e7", Inputs: map[string]interface{}{ "key": "value", }, } mux.HandleFunc("/repos/o/r/actions/workflows/72844/dispatches", func(w http.ResponseWriter, r *http.Request) { var v CreateWorkflowDispatchEventRequest json.NewDecoder(r.Body).Decode(&v) testMethod(t, r, "POST") if !cmp.Equal(v, event) { t.Errorf("Request body = %+v, want %+v", v, event) } }) ctx := context.Background() _, err := client.Actions.CreateWorkflowDispatchEventByID(ctx, "o", "r", 72844, event) if err != nil { t.Errorf("Actions.CreateWorkflowDispatchEventByID returned error: %v", err) } // Test s.client.NewRequest failure client.BaseURL.Path = "" _, err = client.Actions.CreateWorkflowDispatchEventByID(ctx, "o", "r", 72844, event) if err == nil { t.Error("client.BaseURL.Path='' CreateWorkflowDispatchEventByID err = nil, want error") } const methodName = "CreateWorkflowDispatchEventByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.CreateWorkflowDispatchEventByID(ctx, "o", "r", 72844, event) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.CreateWorkflowDispatchEventByID(ctx, "o", "r", 72844, event) }) } func TestActionsService_CreateWorkflowDispatchEventByFileName(t *testing.T) { client, mux, _, teardown := setup() defer teardown() event := CreateWorkflowDispatchEventRequest{ Ref: "d4cfb6e7", Inputs: map[string]interface{}{ "key": "value", }, } mux.HandleFunc("/repos/o/r/actions/workflows/main.yml/dispatches", func(w http.ResponseWriter, r *http.Request) { var v CreateWorkflowDispatchEventRequest json.NewDecoder(r.Body).Decode(&v) testMethod(t, r, "POST") if !cmp.Equal(v, event) { t.Errorf("Request body = %+v, want %+v", v, event) } }) ctx := context.Background() _, err := client.Actions.CreateWorkflowDispatchEventByFileName(ctx, "o", "r", "main.yml", event) if err != nil { t.Errorf("Actions.CreateWorkflowDispatchEventByFileName returned error: %v", err) } // Test s.client.NewRequest failure client.BaseURL.Path = "" _, err = client.Actions.CreateWorkflowDispatchEventByFileName(ctx, "o", "r", "main.yml", event) if err == nil { t.Error("client.BaseURL.Path='' CreateWorkflowDispatchEventByFileName err = nil, want error") } const methodName = "CreateWorkflowDispatchEventByFileName" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.CreateWorkflowDispatchEventByFileName(ctx, "o", "r", "main.yml", event) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.CreateWorkflowDispatchEventByFileName(ctx, "o", "r", "main.yml", event) }) } func TestActionsService_EnableWorkflowByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/workflows/72844/enable", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") if r.Body != http.NoBody { t.Errorf("Request body = %+v, want %+v", r.Body, http.NoBody) } }) ctx := context.Background() _, err := client.Actions.EnableWorkflowByID(ctx, "o", "r", 72844) if err != nil { t.Errorf("Actions.EnableWorkflowByID returned error: %v", err) } // Test s.client.NewRequest failure client.BaseURL.Path = "" _, err = client.Actions.EnableWorkflowByID(ctx, "o", "r", 72844) if err == nil { t.Error("client.BaseURL.Path='' EnableWorkflowByID err = nil, want error") } const methodName = "EnableWorkflowByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.EnableWorkflowByID(ctx, "o", "r", 72844) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.EnableWorkflowByID(ctx, "o", "r", 72844) }) } func TestActionsService_EnableWorkflowByFilename(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/workflows/main.yml/enable", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") if r.Body != http.NoBody { t.Errorf("Request body = %+v, want %+v", r.Body, http.NoBody) } }) ctx := context.Background() _, err := client.Actions.EnableWorkflowByFileName(ctx, "o", "r", "main.yml") if err != nil { t.Errorf("Actions.EnableWorkflowByFilename returned error: %v", err) } // Test s.client.NewRequest failure client.BaseURL.Path = "" _, err = client.Actions.EnableWorkflowByFileName(ctx, "o", "r", "main.yml") if err == nil { t.Error("client.BaseURL.Path='' EnableWorkflowByFilename err = nil, want error") } const methodName = "EnableWorkflowByFileName" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.EnableWorkflowByFileName(ctx, "o", "r", "main.yml") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.EnableWorkflowByFileName(ctx, "o", "r", "main.yml") }) } func TestActionsService_DisableWorkflowByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/workflows/72844/disable", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") if r.Body != http.NoBody { t.Errorf("Request body = %+v, want %+v", r.Body, http.NoBody) } }) ctx := context.Background() _, err := client.Actions.DisableWorkflowByID(ctx, "o", "r", 72844) if err != nil { t.Errorf("Actions.DisableWorkflowByID returned error: %v", err) } // Test s.client.NewRequest failure client.BaseURL.Path = "" _, err = client.Actions.DisableWorkflowByID(ctx, "o", "r", 72844) if err == nil { t.Error("client.BaseURL.Path='' DisableWorkflowByID err = nil, want error") } const methodName = "DisableWorkflowByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.DisableWorkflowByID(ctx, "o", "r", 72844) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.DisableWorkflowByID(ctx, "o", "r", 72844) }) } func TestActionsService_DisableWorkflowByFileName(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/workflows/main.yml/disable", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") if r.Body != http.NoBody { t.Errorf("Request body = %+v, want %+v", r.Body, http.NoBody) } }) ctx := context.Background() _, err := client.Actions.DisableWorkflowByFileName(ctx, "o", "r", "main.yml") if err != nil { t.Errorf("Actions.DisableWorkflowByFileName returned error: %v", err) } // Test s.client.NewRequest failure client.BaseURL.Path = "" _, err = client.Actions.DisableWorkflowByFileName(ctx, "o", "r", "main.yml") if err == nil { t.Error("client.BaseURL.Path='' DisableWorkflowByFileName err = nil, want error") } const methodName = "DisableWorkflowByFileName" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.DisableWorkflowByFileName(ctx, "o", "r", "main.yml") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.DisableWorkflowByFileName(ctx, "o", "r", "main.yml") }) } func TestWorkflow_Marshal(t *testing.T) { testJSONMarshal(t, &Workflow{}, "{}") u := &Workflow{ ID: Int64(1), NodeID: String("nid"), Name: String("n"), Path: String("p"), State: String("s"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, URL: String("u"), HTMLURL: String("h"), BadgeURL: String("b"), } want := `{ "id": 1, "node_id": "nid", "name": "n", "path": "p", "state": "s", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "url": "u", "html_url": "h", "badge_url": "b" }` testJSONMarshal(t, u, want) } func TestWorkflows_Marshal(t *testing.T) { testJSONMarshal(t, &Workflows{}, "{}") u := &Workflows{ TotalCount: Int(1), Workflows: []*Workflow{ { ID: Int64(1), NodeID: String("nid"), Name: String("n"), Path: String("p"), State: String("s"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, URL: String("u"), HTMLURL: String("h"), BadgeURL: String("b"), }, }, } want := `{ "total_count": 1, "workflows": [{ "id": 1, "node_id": "nid", "name": "n", "path": "p", "state": "s", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "url": "u", "html_url": "h", "badge_url": "b" }] }` testJSONMarshal(t, u, want) } func TestWorkflowBill_Marshal(t *testing.T) { testJSONMarshal(t, &WorkflowBill{}, "{}") u := &WorkflowBill{ TotalMS: Int64(1), } want := `{ "total_ms": 1 }` testJSONMarshal(t, u, want) } func TestWorkflowEnvironment_Marshal(t *testing.T) { testJSONMarshal(t, &WorkflowEnvironment{}, "{}") u := &WorkflowEnvironment{ Ubuntu: &WorkflowBill{ TotalMS: Int64(1), }, MacOS: &WorkflowBill{ TotalMS: Int64(1), }, Windows: &WorkflowBill{ TotalMS: Int64(1), }, } want := `{ "UBUNTU": { "total_ms": 1 }, "MACOS": { "total_ms": 1 }, "WINDOWS": { "total_ms": 1 } }` testJSONMarshal(t, u, want) } func TestWorkflowUsage_Marshal(t *testing.T) { testJSONMarshal(t, &WorkflowUsage{}, "{}") u := &WorkflowUsage{ Billable: &WorkflowEnvironment{ Ubuntu: &WorkflowBill{ TotalMS: Int64(1), }, MacOS: &WorkflowBill{ TotalMS: Int64(1), }, Windows: &WorkflowBill{ TotalMS: Int64(1), }, }, } want := `{ "billable": { "UBUNTU": { "total_ms": 1 }, "MACOS": { "total_ms": 1 }, "WINDOWS": { "total_ms": 1 } } }` testJSONMarshal(t, u, want) } func TestCreateWorkflowDispatchEventRequest_Marshal(t *testing.T) { testJSONMarshal(t, &CreateWorkflowDispatchEventRequest{}, "{}") inputs := make(map[string]interface{}, 0) inputs["key"] = "value" u := &CreateWorkflowDispatchEventRequest{ Ref: "r", Inputs: inputs, } want := `{ "ref": "r", "inputs": { "key": "value" } }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/activity.go000066400000000000000000000056201410475703100171420ustar00rootroot00000000000000// Copyright 2013 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 "context" // ActivityService handles communication with the activity related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/ type ActivityService service // FeedLink represents a link to a related resource. type FeedLink struct { HRef *string `json:"href,omitempty"` Type *string `json:"type,omitempty"` } // Feeds represents timeline resources in Atom format. type Feeds struct { TimelineURL *string `json:"timeline_url,omitempty"` UserURL *string `json:"user_url,omitempty"` CurrentUserPublicURL *string `json:"current_user_public_url,omitempty"` CurrentUserURL *string `json:"current_user_url,omitempty"` CurrentUserActorURL *string `json:"current_user_actor_url,omitempty"` CurrentUserOrganizationURL *string `json:"current_user_organization_url,omitempty"` CurrentUserOrganizationURLs []string `json:"current_user_organization_urls,omitempty"` Links *FeedLinks `json:"_links,omitempty"` } // FeedLinks represents the links in a Feed. type FeedLinks struct { Timeline *FeedLink `json:"timeline,omitempty"` User *FeedLink `json:"user,omitempty"` CurrentUserPublic *FeedLink `json:"current_user_public,omitempty"` CurrentUser *FeedLink `json:"current_user,omitempty"` CurrentUserActor *FeedLink `json:"current_user_actor,omitempty"` CurrentUserOrganization *FeedLink `json:"current_user_organization,omitempty"` CurrentUserOrganizations []*FeedLink `json:"current_user_organizations,omitempty"` } // ListFeeds lists all the feeds available to the authenticated user. // // GitHub provides several timeline resources in Atom format: // Timeline: The GitHub global public timeline // User: The public timeline for any user, using URI template // Current user public: The public timeline for the authenticated user // Current user: The private timeline for the authenticated user // Current user actor: The private timeline for activity created by the // authenticated user // Current user organizations: The private timeline for the organizations // the authenticated user is a member of. // // Note: Private feeds are only returned when authenticating via Basic Auth // since current feed URIs use the older, non revocable auth tokens. func (s *ActivityService) ListFeeds(ctx context.Context) (*Feeds, *Response, error) { req, err := s.client.NewRequest("GET", "feeds", nil) if err != nil { return nil, nil, err } f := &Feeds{} resp, err := s.client.Do(ctx, req, f) if err != nil { return nil, resp, err } return f, resp, nil } go-github-38.1.0/github/activity_events.go000066400000000000000000000144251410475703100205310ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" ) // ListEvents drinks from the firehose of all public events across GitHub. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-public-events func (s *ActivityService) ListEvents(ctx context.Context, opts *ListOptions) ([]*Event, *Response, error) { u, err := addOptions("events", opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListRepositoryEvents lists events for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-repository-events func (s *ActivityService) ListRepositoryEvents(ctx context.Context, owner, repo string, opts *ListOptions) ([]*Event, *Response, error) { u := fmt.Sprintf("repos/%v/%v/events", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListIssueEventsForRepository lists issue events for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#list-issue-events-for-a-repository func (s *ActivityService) ListIssueEventsForRepository(ctx context.Context, owner, repo string, opts *ListOptions) ([]*IssueEvent, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/events", owner, repo) u, err := addOptions(u, opts) 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(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListEventsForRepoNetwork lists public events for a network of repositories. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-public-events-for-a-network-of-repositories func (s *ActivityService) ListEventsForRepoNetwork(ctx context.Context, owner, repo string, opts *ListOptions) ([]*Event, *Response, error) { u := fmt.Sprintf("networks/%v/%v/events", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListEventsForOrganization lists public events for an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-public-organization-events func (s *ActivityService) ListEventsForOrganization(ctx context.Context, org string, opts *ListOptions) ([]*Event, *Response, error) { u := fmt.Sprintf("orgs/%v/events", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListEventsPerformedByUser lists the events performed by a user. If publicOnly is // true, only public events will be returned. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-events-for-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-public-events-for-a-user func (s *ActivityService) ListEventsPerformedByUser(ctx context.Context, user string, publicOnly bool, opts *ListOptions) ([]*Event, *Response, error) { var u string if publicOnly { u = fmt.Sprintf("users/%v/events/public", user) } else { u = fmt.Sprintf("users/%v/events", user) } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListEventsReceivedByUser lists the events received by a user. If publicOnly is // true, only public events will be returned. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-events-received-by-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-public-events-received-by-a-user func (s *ActivityService) ListEventsReceivedByUser(ctx context.Context, user string, publicOnly bool, opts *ListOptions) ([]*Event, *Response, error) { var u string if publicOnly { u = fmt.Sprintf("users/%v/received_events/public", user) } else { u = fmt.Sprintf("users/%v/received_events", user) } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListUserEventsForOrganization provides the user’s organization dashboard. You // must be authenticated as the user to view this. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-organization-events-for-the-authenticated-user func (s *ActivityService) ListUserEventsForOrganization(ctx context.Context, org, user string, opts *ListOptions) ([]*Event, *Response, error) { u := fmt.Sprintf("users/%v/events/orgs/%v", user, org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } go-github-38.1.0/github/activity_events_test.go000066400000000000000000000344061410475703100215710ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestActivityService_ListEvents(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/events", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[{"id":"1"},{"id":"2"}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() events, _, err := client.Activity.ListEvents(ctx, opt) if err != nil { t.Errorf("Activities.ListEvents returned error: %v", err) } want := []*Event{{ID: String("1")}, {ID: String("2")}} if !cmp.Equal(events, want) { t.Errorf("Activities.ListEvents returned %+v, want %+v", events, want) } const methodName = "ListEvents" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListEvents(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_ListRepositoryEvents(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/events", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[{"id":"1"},{"id":"2"}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() events, _, err := client.Activity.ListRepositoryEvents(ctx, "o", "r", opt) if err != nil { t.Errorf("Activities.ListRepositoryEvents returned error: %v", err) } want := []*Event{{ID: String("1")}, {ID: String("2")}} if !cmp.Equal(events, want) { t.Errorf("Activities.ListRepositoryEvents returned %+v, want %+v", events, want) } const methodName = "ListRepositoryEvents" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.ListRepositoryEvents(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListRepositoryEvents(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_ListRepositoryEvents_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Activity.ListRepositoryEvents(ctx, "%", "%", nil) testURLParseError(t, err) } func TestActivityService_ListIssueEventsForRepository(t *testing.T) { client, mux, _, teardown := 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": "2", }) fmt.Fprint(w, `[{"id":1},{"id":2}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() events, _, err := client.Activity.ListIssueEventsForRepository(ctx, "o", "r", opt) if err != nil { t.Errorf("Activities.ListIssueEventsForRepository returned error: %v", err) } want := []*IssueEvent{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(events, want) { t.Errorf("Activities.ListIssueEventsForRepository returned %+v, want %+v", events, want) } const methodName = "ListIssueEventsForRepository" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.ListIssueEventsForRepository(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListIssueEventsForRepository(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_ListIssueEventsForRepository_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Activity.ListIssueEventsForRepository(ctx, "%", "%", nil) testURLParseError(t, err) } func TestActivityService_ListEventsForRepoNetwork(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/networks/o/r/events", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[{"id":"1"},{"id":"2"}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() events, _, err := client.Activity.ListEventsForRepoNetwork(ctx, "o", "r", opt) if err != nil { t.Errorf("Activities.ListEventsForRepoNetwork returned error: %v", err) } want := []*Event{{ID: String("1")}, {ID: String("2")}} if !cmp.Equal(events, want) { t.Errorf("Activities.ListEventsForRepoNetwork returned %+v, want %+v", events, want) } const methodName = "ListEventsForRepoNetwork" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.ListEventsForRepoNetwork(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListEventsForRepoNetwork(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_ListEventsForRepoNetwork_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Activity.ListEventsForRepoNetwork(ctx, "%", "%", nil) testURLParseError(t, err) } func TestActivityService_ListEventsForOrganization(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/events", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[{"id":"1"},{"id":"2"}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() events, _, err := client.Activity.ListEventsForOrganization(ctx, "o", opt) if err != nil { t.Errorf("Activities.ListEventsForOrganization returned error: %v", err) } want := []*Event{{ID: String("1")}, {ID: String("2")}} if !cmp.Equal(events, want) { t.Errorf("Activities.ListEventsForOrganization returned %+v, want %+v", events, want) } const methodName = "ListEventsForOrganization" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.ListEventsForOrganization(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListEventsForOrganization(ctx, "o", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_ListEventsForOrganization_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Activity.ListEventsForOrganization(ctx, "%", nil) testURLParseError(t, err) } func TestActivityService_ListEventsPerformedByUser_all(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/events", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[{"id":"1"},{"id":"2"}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() events, _, err := client.Activity.ListEventsPerformedByUser(ctx, "u", false, opt) if err != nil { t.Errorf("Events.ListPerformedByUser returned error: %v", err) } want := []*Event{{ID: String("1")}, {ID: String("2")}} if !cmp.Equal(events, want) { t.Errorf("Events.ListPerformedByUser returned %+v, want %+v", events, want) } const methodName = "ListEventsPerformedByUser" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.ListEventsPerformedByUser(ctx, "\n", false, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListEventsPerformedByUser(ctx, "u", false, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_ListEventsPerformedByUser_publicOnly(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/events/public", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":"1"},{"id":"2"}]`) }) ctx := context.Background() events, _, err := client.Activity.ListEventsPerformedByUser(ctx, "u", true, nil) if err != nil { t.Errorf("Events.ListPerformedByUser returned error: %v", err) } want := []*Event{{ID: String("1")}, {ID: String("2")}} if !cmp.Equal(events, want) { t.Errorf("Events.ListPerformedByUser returned %+v, want %+v", events, want) } } func TestActivityService_ListEventsPerformedByUser_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Activity.ListEventsPerformedByUser(ctx, "%", false, nil) testURLParseError(t, err) } func TestActivityService_ListEventsReceivedByUser_all(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/received_events", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[{"id":"1"},{"id":"2"}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() events, _, err := client.Activity.ListEventsReceivedByUser(ctx, "u", false, opt) if err != nil { t.Errorf("Events.ListReceivedByUser returned error: %v", err) } want := []*Event{{ID: String("1")}, {ID: String("2")}} if !cmp.Equal(events, want) { t.Errorf("Events.ListReceivedUser returned %+v, want %+v", events, want) } const methodName = "ListEventsReceivedByUser" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.ListEventsReceivedByUser(ctx, "\n", false, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListEventsReceivedByUser(ctx, "u", false, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_ListEventsReceivedByUser_publicOnly(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/received_events/public", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":"1"},{"id":"2"}]`) }) ctx := context.Background() events, _, err := client.Activity.ListEventsReceivedByUser(ctx, "u", true, nil) if err != nil { t.Errorf("Events.ListReceivedByUser returned error: %v", err) } want := []*Event{{ID: String("1")}, {ID: String("2")}} if !cmp.Equal(events, want) { t.Errorf("Events.ListReceivedByUser returned %+v, want %+v", events, want) } } func TestActivityService_ListEventsReceivedByUser_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Activity.ListEventsReceivedByUser(ctx, "%", false, nil) testURLParseError(t, err) } func TestActivityService_ListUserEventsForOrganization(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/events/orgs/o", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[{"id":"1"},{"id":"2"}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() events, _, err := client.Activity.ListUserEventsForOrganization(ctx, "o", "u", opt) if err != nil { t.Errorf("Activities.ListUserEventsForOrganization returned error: %v", err) } want := []*Event{{ID: String("1")}, {ID: String("2")}} if !cmp.Equal(events, want) { t.Errorf("Activities.ListUserEventsForOrganization returned %+v, want %+v", events, want) } const methodName = "ListUserEventsForOrganization" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.ListUserEventsForOrganization(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListUserEventsForOrganization(ctx, "o", "u", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_EventParsePayload_typed(t *testing.T) { raw := []byte(`{"type": "PushEvent","payload":{"push_id": 1}}`) var event *Event if err := json.Unmarshal(raw, &event); err != nil { t.Fatalf("Unmarshal Event returned error: %v", err) } want := &PushEvent{PushID: Int64(1)} got, err := event.ParsePayload() if err != nil { t.Fatalf("ParsePayload returned unexpected error: %v", err) } if !cmp.Equal(got, want) { t.Errorf("Event.ParsePayload returned %+v, want %+v", got, want) } } // TestEvent_Payload_untyped checks that unrecognized events are parsed to an // interface{} value (instead of being discarded or throwing an error), for // forward compatibility with new event types. func TestActivityService_EventParsePayload_untyped(t *testing.T) { raw := []byte(`{"type": "UnrecognizedEvent","payload":{"field": "val"}}`) var event *Event if err := json.Unmarshal(raw, &event); err != nil { t.Fatalf("Unmarshal Event returned error: %v", err) } want := map[string]interface{}{"field": "val"} got, err := event.ParsePayload() if err != nil { t.Fatalf("ParsePayload returned unexpected error: %v", err) } if !cmp.Equal(got, want) { t.Errorf("Event.ParsePayload returned %+v, want %+v", got, want) } } func TestActivityService_EventParsePayload_installation(t *testing.T) { raw := []byte(`{"type": "PullRequestEvent","payload":{"installation":{"id":1}}}`) var event *Event if err := json.Unmarshal(raw, &event); err != nil { t.Fatalf("Unmarshal Event returned error: %v", err) } want := &PullRequestEvent{Installation: &Installation{ID: Int64(1)}} got, err := event.ParsePayload() if err != nil { t.Fatalf("ParsePayload returned unexpected error: %v", err) } if !cmp.Equal(got, want) { t.Errorf("Event.ParsePayload returned %+v, want %+v", got, want) } } go-github-38.1.0/github/activity_notifications.go000066400000000000000000000160651410475703100221000ustar00rootroot00000000000000// 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 ( "context" "fmt" "time" ) // Notification identifies a GitHub notification for a user. type Notification struct { ID *string `json:"id,omitempty"` Repository *Repository `json:"repository,omitempty"` Subject *NotificationSubject `json:"subject,omitempty"` // Reason identifies the event that triggered the notification. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity#notification-reasons Reason *string `json:"reason,omitempty"` Unread *bool `json:"unread,omitempty"` UpdatedAt *time.Time `json:"updated_at,omitempty"` LastReadAt *time.Time `json:"last_read_at,omitempty"` URL *string `json:"url,omitempty"` } // NotificationSubject identifies the subject of a notification. type NotificationSubject struct { Title *string `json:"title,omitempty"` URL *string `json:"url,omitempty"` LatestCommentURL *string `json:"latest_comment_url,omitempty"` Type *string `json:"type,omitempty"` } // NotificationListOptions specifies the optional parameters to the // ActivityService.ListNotifications method. type NotificationListOptions struct { All bool `url:"all,omitempty"` Participating bool `url:"participating,omitempty"` Since time.Time `url:"since,omitempty"` Before time.Time `url:"before,omitempty"` ListOptions } // ListNotifications lists all notifications for the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-notifications-for-the-authenticated-user func (s *ActivityService) ListNotifications(ctx context.Context, opts *NotificationListOptions) ([]*Notification, *Response, error) { u := fmt.Sprintf("notifications") u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var notifications []*Notification resp, err := s.client.Do(ctx, req, ¬ifications) if err != nil { return nil, resp, err } return notifications, resp, nil } // ListRepositoryNotifications lists all notifications in a given repository // for the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-repository-notifications-for-the-authenticated-user func (s *ActivityService) ListRepositoryNotifications(ctx context.Context, owner, repo string, opts *NotificationListOptions) ([]*Notification, *Response, error) { u := fmt.Sprintf("repos/%v/%v/notifications", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var notifications []*Notification resp, err := s.client.Do(ctx, req, ¬ifications) if err != nil { return nil, resp, err } return notifications, resp, nil } type markReadOptions struct { LastReadAt time.Time `json:"last_read_at,omitempty"` } // MarkNotificationsRead marks all notifications up to lastRead as read. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity#mark-as-read func (s *ActivityService) MarkNotificationsRead(ctx context.Context, lastRead time.Time) (*Response, error) { opts := &markReadOptions{ LastReadAt: lastRead, } req, err := s.client.NewRequest("PUT", "notifications", opts) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // MarkRepositoryNotificationsRead marks all notifications up to lastRead in // the specified repository as read. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#mark-repository-notifications-as-read func (s *ActivityService) MarkRepositoryNotificationsRead(ctx context.Context, owner, repo string, lastRead time.Time) (*Response, error) { opts := &markReadOptions{ LastReadAt: lastRead, } u := fmt.Sprintf("repos/%v/%v/notifications", owner, repo) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // GetThread gets the specified notification thread. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#get-a-thread func (s *ActivityService) GetThread(ctx context.Context, id string) (*Notification, *Response, error) { u := fmt.Sprintf("notifications/threads/%v", id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } notification := new(Notification) resp, err := s.client.Do(ctx, req, notification) if err != nil { return nil, resp, err } return notification, resp, nil } // MarkThreadRead marks the specified thread as read. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#mark-a-thread-as-read func (s *ActivityService) MarkThreadRead(ctx context.Context, id string) (*Response, error) { u := fmt.Sprintf("notifications/threads/%v", id) req, err := s.client.NewRequest("PATCH", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // GetThreadSubscription checks to see if the authenticated user is subscribed // to a thread. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#get-a-thread-subscription-for-the-authenticated-user func (s *ActivityService) GetThreadSubscription(ctx context.Context, id string) (*Subscription, *Response, error) { u := fmt.Sprintf("notifications/threads/%v/subscription", id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } sub := new(Subscription) resp, err := s.client.Do(ctx, req, sub) if err != nil { return nil, resp, err } return sub, resp, nil } // SetThreadSubscription sets the subscription for the specified thread for the // authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#set-a-thread-subscription func (s *ActivityService) SetThreadSubscription(ctx context.Context, id string, subscription *Subscription) (*Subscription, *Response, error) { u := fmt.Sprintf("notifications/threads/%v/subscription", id) req, err := s.client.NewRequest("PUT", u, subscription) if err != nil { return nil, nil, err } sub := new(Subscription) resp, err := s.client.Do(ctx, req, sub) if err != nil { return nil, resp, err } return sub, resp, nil } // DeleteThreadSubscription deletes the subscription for the specified thread // for the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#delete-a-thread-subscription func (s *ActivityService) DeleteThreadSubscription(ctx context.Context, id string) (*Response, error) { u := fmt.Sprintf("notifications/threads/%v/subscription", id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/activity_notifications_test.go000066400000000000000000000261361410475703100231370ustar00rootroot00000000000000// 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestActivityService_ListNotification(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/notifications", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "all": "true", "participating": "true", "since": "2006-01-02T15:04:05Z", "before": "2007-03-04T15:04:05Z", }) fmt.Fprint(w, `[{"id":"1", "subject":{"title":"t"}}]`) }) opt := &NotificationListOptions{ All: true, Participating: true, Since: time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC), Before: time.Date(2007, time.March, 04, 15, 04, 05, 0, time.UTC), } ctx := context.Background() notifications, _, err := client.Activity.ListNotifications(ctx, opt) if err != nil { t.Errorf("Activity.ListNotifications returned error: %v", err) } want := []*Notification{{ID: String("1"), Subject: &NotificationSubject{Title: String("t")}}} if !cmp.Equal(notifications, want) { t.Errorf("Activity.ListNotifications returned %+v, want %+v", notifications, want) } const methodName = "ListNotifications" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListNotifications(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_ListRepositoryNotification(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/notifications", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":"1"}]`) }) ctx := context.Background() notifications, _, err := client.Activity.ListRepositoryNotifications(ctx, "o", "r", nil) if err != nil { t.Errorf("Activity.ListRepositoryNotifications returned error: %v", err) } want := []*Notification{{ID: String("1")}} if !cmp.Equal(notifications, want) { t.Errorf("Activity.ListRepositoryNotifications returned %+v, want %+v", notifications, want) } const methodName = "ListRepositoryNotifications" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.ListRepositoryNotifications(ctx, "\n", "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListRepositoryNotifications(ctx, "o", "r", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_MarkNotificationsRead(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/notifications", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"last_read_at":"2006-01-02T15:04:05Z"}`+"\n") w.WriteHeader(http.StatusResetContent) }) ctx := context.Background() _, err := client.Activity.MarkNotificationsRead(ctx, time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)) if err != nil { t.Errorf("Activity.MarkNotificationsRead returned error: %v", err) } const methodName = "MarkNotificationsRead" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Activity.MarkNotificationsRead(ctx, time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)) }) } func TestActivityService_MarkRepositoryNotificationsRead(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/notifications", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"last_read_at":"2006-01-02T15:04:05Z"}`+"\n") w.WriteHeader(http.StatusResetContent) }) ctx := context.Background() _, err := client.Activity.MarkRepositoryNotificationsRead(ctx, "o", "r", time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)) if err != nil { t.Errorf("Activity.MarkRepositoryNotificationsRead returned error: %v", err) } const methodName = "MarkRepositoryNotificationsRead" testBadOptions(t, methodName, func() (err error) { _, err = client.Activity.MarkRepositoryNotificationsRead(ctx, "\n", "\n", time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Activity.MarkRepositoryNotificationsRead(ctx, "o", "r", time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)) }) } func TestActivityService_GetThread(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/notifications/threads/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":"1"}`) }) ctx := context.Background() notification, _, err := client.Activity.GetThread(ctx, "1") if err != nil { t.Errorf("Activity.GetThread returned error: %v", err) } want := &Notification{ID: String("1")} if !cmp.Equal(notification, want) { t.Errorf("Activity.GetThread returned %+v, want %+v", notification, want) } const methodName = "GetThread" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.GetThread(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.GetThread(ctx, "1") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_MarkThreadRead(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/notifications/threads/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") w.WriteHeader(http.StatusResetContent) }) ctx := context.Background() _, err := client.Activity.MarkThreadRead(ctx, "1") if err != nil { t.Errorf("Activity.MarkThreadRead returned error: %v", err) } const methodName = "MarkThreadRead" testBadOptions(t, methodName, func() (err error) { _, err = client.Activity.MarkThreadRead(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Activity.MarkThreadRead(ctx, "1") }) } func TestActivityService_GetThreadSubscription(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/notifications/threads/1/subscription", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"subscribed":true}`) }) ctx := context.Background() sub, _, err := client.Activity.GetThreadSubscription(ctx, "1") if err != nil { t.Errorf("Activity.GetThreadSubscription returned error: %v", err) } want := &Subscription{Subscribed: Bool(true)} if !cmp.Equal(sub, want) { t.Errorf("Activity.GetThreadSubscription returned %+v, want %+v", sub, want) } const methodName = "GetThreadSubscription" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.GetThreadSubscription(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.GetThreadSubscription(ctx, "1") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_SetThreadSubscription(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Subscription{Subscribed: Bool(true)} mux.HandleFunc("/notifications/threads/1/subscription", func(w http.ResponseWriter, r *http.Request) { v := new(Subscription) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"ignored":true}`) }) ctx := context.Background() sub, _, err := client.Activity.SetThreadSubscription(ctx, "1", input) if err != nil { t.Errorf("Activity.SetThreadSubscription returned error: %v", err) } want := &Subscription{Ignored: Bool(true)} if !cmp.Equal(sub, want) { t.Errorf("Activity.SetThreadSubscription returned %+v, want %+v", sub, want) } const methodName = "SetThreadSubscription" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.SetThreadSubscription(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.SetThreadSubscription(ctx, "1", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_DeleteThreadSubscription(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/notifications/threads/1/subscription", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Activity.DeleteThreadSubscription(ctx, "1") if err != nil { t.Errorf("Activity.DeleteThreadSubscription returned error: %v", err) } const methodName = "DeleteThreadSubscription" testBadOptions(t, methodName, func() (err error) { _, err = client.Activity.DeleteThreadSubscription(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Activity.DeleteThreadSubscription(ctx, "1") }) } func TestNotification_Marshal(t *testing.T) { testJSONMarshal(t, &Notification{}, "{}") u := &Notification{ ID: String("id"), Repository: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, Subject: &NotificationSubject{ Title: String("t"), URL: String("u"), LatestCommentURL: String("l"), Type: String("t"), }, Reason: String("r"), Unread: Bool(true), UpdatedAt: &referenceTime, LastReadAt: &referenceTime, URL: String("u"), } want := `{ "id": "id", "repository": { "id": 1, "url": "u", "name": "n" }, "subject": { "title": "t", "url": "u", "latest_comment_url": "l", "type": "t" }, "reason": "r", "unread": true, "updated_at": ` + referenceTimeStr + `, "last_read_at": ` + referenceTimeStr + `, "url": "u" }` testJSONMarshal(t, u, want) } func TestNotificationSubject_Marshal(t *testing.T) { testJSONMarshal(t, &NotificationSubject{}, "{}") u := &NotificationSubject{ Title: String("t"), URL: String("u"), LatestCommentURL: String("l"), Type: String("t"), } want := `{ "title": "t", "url": "u", "latest_comment_url": "l", "type": "t" }` testJSONMarshal(t, u, want) } func TestMarkReadOptions_Marshal(t *testing.T) { testJSONMarshal(t, &markReadOptions{}, "{}") u := &markReadOptions{ LastReadAt: referenceTime, } want := `{ "last_read_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/activity_star.go000066400000000000000000000110531410475703100201700ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "strings" ) // StarredRepository is returned by ListStarred. type StarredRepository struct { StarredAt *Timestamp `json:"starred_at,omitempty"` Repository *Repository `json:"repo,omitempty"` } // Stargazer represents a user that has starred a repository. type Stargazer struct { StarredAt *Timestamp `json:"starred_at,omitempty"` User *User `json:"user,omitempty"` } // ListStargazers lists people who have starred the specified repo. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-stargazers func (s *ActivityService) ListStargazers(ctx context.Context, owner, repo string, opts *ListOptions) ([]*Stargazer, *Response, error) { u := fmt.Sprintf("repos/%s/%s/stargazers", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches req.Header.Set("Accept", mediaTypeStarringPreview) var stargazers []*Stargazer resp, err := s.client.Do(ctx, req, &stargazers) if err != nil { return nil, resp, err } return stargazers, resp, nil } // ActivityListStarredOptions specifies the optional parameters to the // ActivityService.ListStarred method. type ActivityListStarredOptions struct { // How to sort the repository list. Possible values are: created, updated, // pushed, full_name. Default is "full_name". Sort string `url:"sort,omitempty"` // Direction in which to sort repositories. Possible values are: asc, desc. // Default is "asc" when sort is "full_name", otherwise default is "desc". Direction string `url:"direction,omitempty"` ListOptions } // ListStarred lists all the repos starred by a user. Passing the empty string // will list the starred repositories for the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-repositories-starred-by-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-repositories-starred-by-a-user func (s *ActivityService) ListStarred(ctx context.Context, user string, opts *ActivityListStarredOptions) ([]*StarredRepository, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/starred", user) } else { u = "user/starred" } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when APIs fully launch acceptHeaders := []string{mediaTypeStarringPreview, mediaTypeTopicsPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) var repos []*StarredRepository resp, err := s.client.Do(ctx, req, &repos) if err != nil { return nil, resp, err } return repos, resp, nil } // IsStarred checks if a repository is starred by authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#check-if-a-repository-is-starred-by-the-authenticated-user func (s *ActivityService) IsStarred(ctx context.Context, owner, repo string) (bool, *Response, error) { u := fmt.Sprintf("user/starred/%v/%v", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return false, nil, err } resp, err := s.client.Do(ctx, req, nil) starred, err := parseBoolResponse(err) return starred, resp, err } // Star a repository as the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#star-a-repository-for-the-authenticated-user func (s *ActivityService) Star(ctx context.Context, owner, repo string) (*Response, error) { u := fmt.Sprintf("user/starred/%v/%v", owner, repo) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // Unstar a repository as the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#unstar-a-repository-for-the-authenticated-user func (s *ActivityService) Unstar(ctx context.Context, owner, repo string) (*Response, error) { u := fmt.Sprintf("user/starred/%v/%v", owner, repo) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/activity_star_test.go000066400000000000000000000237041410475703100212350ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "net/http" "strings" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestActivityService_ListStargazers(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/stargazers", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeStarringPreview) testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[{"starred_at":"2002-02-10T15:30:00Z","user":{"id":1}}]`) }) ctx := context.Background() stargazers, _, err := client.Activity.ListStargazers(ctx, "o", "r", &ListOptions{Page: 2}) if err != nil { t.Errorf("Activity.ListStargazers returned error: %v", err) } want := []*Stargazer{{StarredAt: &Timestamp{time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC)}, User: &User{ID: Int64(1)}}} if !cmp.Equal(stargazers, want) { t.Errorf("Activity.ListStargazers returned %+v, want %+v", stargazers, want) } const methodName = "ListStargazers" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.ListStargazers(ctx, "\n", "\n", &ListOptions{Page: 2}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListStargazers(ctx, "o", "r", &ListOptions{Page: 2}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_ListStarred_authenticatedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/starred", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join([]string{mediaTypeStarringPreview, mediaTypeTopicsPreview}, ", ")) fmt.Fprint(w, `[{"starred_at":"2002-02-10T15:30:00Z","repo":{"id":1}}]`) }) ctx := context.Background() repos, _, err := client.Activity.ListStarred(ctx, "", nil) if err != nil { t.Errorf("Activity.ListStarred returned error: %v", err) } want := []*StarredRepository{{StarredAt: &Timestamp{time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC)}, Repository: &Repository{ID: Int64(1)}}} if !cmp.Equal(repos, want) { t.Errorf("Activity.ListStarred returned %+v, want %+v", repos, want) } const methodName = "ListStarred" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.ListStarred(ctx, "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListStarred(ctx, "", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_ListStarred_specifiedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/starred", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join([]string{mediaTypeStarringPreview, mediaTypeTopicsPreview}, ", ")) testFormValues(t, r, values{ "sort": "created", "direction": "asc", "page": "2", }) fmt.Fprint(w, `[{"starred_at":"2002-02-10T15:30:00Z","repo":{"id":2}}]`) }) opt := &ActivityListStarredOptions{"created", "asc", ListOptions{Page: 2}} ctx := context.Background() repos, _, err := client.Activity.ListStarred(ctx, "u", opt) if err != nil { t.Errorf("Activity.ListStarred returned error: %v", err) } want := []*StarredRepository{{StarredAt: &Timestamp{time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC)}, Repository: &Repository{ID: Int64(2)}}} if !cmp.Equal(repos, want) { t.Errorf("Activity.ListStarred returned %+v, want %+v", repos, want) } const methodName = "ListStarred" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.ListStarred(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListStarred(ctx, "u", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_ListStarred_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Activity.ListStarred(ctx, "%", nil) testURLParseError(t, err) } func TestActivityService_IsStarred_hasStar(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/starred/o/r", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() star, _, err := client.Activity.IsStarred(ctx, "o", "r") if err != nil { t.Errorf("Activity.IsStarred returned error: %v", err) } if want := true; star != want { t.Errorf("Activity.IsStarred returned %+v, want %+v", star, want) } const methodName = "IsStarred" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.IsStarred(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.IsStarred(ctx, "o", "r") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) } return resp, err }) } func TestActivityService_IsStarred_noStar(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/starred/o/r", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() star, _, err := client.Activity.IsStarred(ctx, "o", "r") if err != nil { t.Errorf("Activity.IsStarred returned error: %v", err) } if want := false; star != want { t.Errorf("Activity.IsStarred returned %+v, want %+v", star, want) } const methodName = "IsStarred" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.IsStarred(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.IsStarred(ctx, "o", "r") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) } return resp, err }) } func TestActivityService_IsStarred_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Activity.IsStarred(ctx, "%", "%") testURLParseError(t, err) } func TestActivityService_Star(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/starred/o/r", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") }) ctx := context.Background() _, err := client.Activity.Star(ctx, "o", "r") if err != nil { t.Errorf("Activity.Star returned error: %v", err) } const methodName = "Star" testBadOptions(t, methodName, func() (err error) { _, err = client.Activity.Star(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Activity.Star(ctx, "o", "r") }) } func TestActivityService_Star_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Activity.Star(ctx, "%", "%") testURLParseError(t, err) } func TestActivityService_Unstar(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/starred/o/r", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Activity.Unstar(ctx, "o", "r") if err != nil { t.Errorf("Activity.Unstar returned error: %v", err) } const methodName = "Unstar" testBadOptions(t, methodName, func() (err error) { _, err = client.Activity.Unstar(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Activity.Unstar(ctx, "o", "r") }) } func TestActivityService_Unstar_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Activity.Unstar(ctx, "%", "%") testURLParseError(t, err) } func TestStarredRepository_Marshal(t *testing.T) { testJSONMarshal(t, &StarredRepository{}, "{}") u := &StarredRepository{ StarredAt: &Timestamp{referenceTime}, Repository: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, } want := `{ "starred_at": ` + referenceTimeStr + `, "repo": { "id": 1, "url": "u", "name": "n" } }` testJSONMarshal(t, u, want) } func TestStargazer_Marshal(t *testing.T) { testJSONMarshal(t, &Stargazer{}, "{}") u := &Stargazer{ StarredAt: &Timestamp{referenceTime}, User: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "starred_at": ` + referenceTimeStr + `, "user": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" } }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/activity_test.go000066400000000000000000000157611410475703100202100ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestActivityService_List(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/feeds", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusOK) w.Write(feedsJSON) }) ctx := context.Background() got, _, err := client.Activity.ListFeeds(ctx) if err != nil { t.Errorf("Activity.ListFeeds returned error: %v", err) } if want := wantFeeds; !cmp.Equal(got, want) { t.Errorf("Activity.ListFeeds = %+v, want %+v", got, want) } const methodName = "ListFeeds" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListFeeds(ctx) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } var feedsJSON = []byte(`{ "timeline_url": "https://github.com/timeline", "user_url": "https://github.com/{user}", "current_user_public_url": "https://github.com/defunkt", "current_user_url": "https://github.com/defunkt.private?token=abc123", "current_user_actor_url": "https://github.com/defunkt.private.actor?token=abc123", "current_user_organization_url": "", "current_user_organization_urls": [ "https://github.com/organizations/github/defunkt.private.atom?token=abc123" ], "_links": { "timeline": { "href": "https://github.com/timeline", "type": "application/atom+xml" }, "user": { "href": "https://github.com/{user}", "type": "application/atom+xml" }, "current_user_public": { "href": "https://github.com/defunkt", "type": "application/atom+xml" }, "current_user": { "href": "https://github.com/defunkt.private?token=abc123", "type": "application/atom+xml" }, "current_user_actor": { "href": "https://github.com/defunkt.private.actor?token=abc123", "type": "application/atom+xml" }, "current_user_organization": { "href": "", "type": "" }, "current_user_organizations": [ { "href": "https://github.com/organizations/github/defunkt.private.atom?token=abc123", "type": "application/atom+xml" } ] } }`) var wantFeeds = &Feeds{ TimelineURL: String("https://github.com/timeline"), UserURL: String("https://github.com/{user}"), CurrentUserPublicURL: String("https://github.com/defunkt"), CurrentUserURL: String("https://github.com/defunkt.private?token=abc123"), CurrentUserActorURL: String("https://github.com/defunkt.private.actor?token=abc123"), CurrentUserOrganizationURL: String(""), CurrentUserOrganizationURLs: []string{ "https://github.com/organizations/github/defunkt.private.atom?token=abc123", }, Links: &FeedLinks{ Timeline: &FeedLink{ HRef: String("https://github.com/timeline"), Type: String("application/atom+xml"), }, User: &FeedLink{ HRef: String("https://github.com/{user}"), Type: String("application/atom+xml"), }, CurrentUserPublic: &FeedLink{ HRef: String("https://github.com/defunkt"), Type: String("application/atom+xml"), }, CurrentUser: &FeedLink{ HRef: String("https://github.com/defunkt.private?token=abc123"), Type: String("application/atom+xml"), }, CurrentUserActor: &FeedLink{ HRef: String("https://github.com/defunkt.private.actor?token=abc123"), Type: String("application/atom+xml"), }, CurrentUserOrganization: &FeedLink{ HRef: String(""), Type: String(""), }, CurrentUserOrganizations: []*FeedLink{ { HRef: String("https://github.com/organizations/github/defunkt.private.atom?token=abc123"), Type: String("application/atom+xml"), }, }, }, } func TestFeedLink_Marshal(t *testing.T) { testJSONMarshal(t, &FeedLink{}, "{}") u := &FeedLink{ HRef: String("h"), Type: String("t"), } want := `{ "href": "h", "type": "t" }` testJSONMarshal(t, u, want) } func TestFeeds_Marshal(t *testing.T) { testJSONMarshal(t, &Feeds{}, "{}") u := &Feeds{ TimelineURL: String("t"), UserURL: String("u"), CurrentUserPublicURL: String("cupu"), CurrentUserURL: String("cuu"), CurrentUserActorURL: String("cuau"), CurrentUserOrganizationURL: String("cuou"), CurrentUserOrganizationURLs: []string{"a"}, Links: &FeedLinks{ Timeline: &FeedLink{ HRef: String("h"), Type: String("t"), }, User: &FeedLink{ HRef: String("h"), Type: String("t"), }, CurrentUserPublic: &FeedLink{ HRef: String("h"), Type: String("t"), }, CurrentUser: &FeedLink{ HRef: String("h"), Type: String("t"), }, CurrentUserActor: &FeedLink{ HRef: String("h"), Type: String("t"), }, CurrentUserOrganization: &FeedLink{ HRef: String("h"), Type: String("t"), }, CurrentUserOrganizations: []*FeedLink{ { HRef: String("h"), Type: String("t"), }, }, }, } want := `{ "timeline_url": "t", "user_url": "u", "current_user_public_url": "cupu", "current_user_url": "cuu", "current_user_actor_url": "cuau", "current_user_organization_url": "cuou", "current_user_organization_urls": ["a"], "_links": { "timeline": { "href": "h", "type": "t" }, "user": { "href": "h", "type": "t" }, "current_user_public": { "href": "h", "type": "t" }, "current_user": { "href": "h", "type": "t" }, "current_user_actor": { "href": "h", "type": "t" }, "current_user_organization": { "href": "h", "type": "t" }, "current_user_organizations": [ { "href": "h", "type": "t" } ] } }` testJSONMarshal(t, u, want) } func TestFeedLinks_Marshal(t *testing.T) { testJSONMarshal(t, &FeedLinks{}, "{}") u := &FeedLinks{ Timeline: &FeedLink{ HRef: String("h"), Type: String("t"), }, User: &FeedLink{ HRef: String("h"), Type: String("t"), }, CurrentUserPublic: &FeedLink{ HRef: String("h"), Type: String("t"), }, CurrentUser: &FeedLink{ HRef: String("h"), Type: String("t"), }, CurrentUserActor: &FeedLink{ HRef: String("h"), Type: String("t"), }, CurrentUserOrganization: &FeedLink{ HRef: String("h"), Type: String("t"), }, CurrentUserOrganizations: []*FeedLink{ { HRef: String("h"), Type: String("t"), }, }, } want := `{ "timeline": { "href": "h", "type": "t" }, "user": { "href": "h", "type": "t" }, "current_user_public": { "href": "h", "type": "t" }, "current_user": { "href": "h", "type": "t" }, "current_user_actor": { "href": "h", "type": "t" }, "current_user_organization": { "href": "h", "type": "t" }, "current_user_organizations": [ { "href": "h", "type": "t" } ] }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/activity_watching.go000066400000000000000000000114101410475703100210200ustar00rootroot00000000000000// 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 ( "context" "fmt" ) // Subscription identifies a repository or thread subscription. type Subscription struct { Subscribed *bool `json:"subscribed,omitempty"` Ignored *bool `json:"ignored,omitempty"` Reason *string `json:"reason,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` URL *string `json:"url,omitempty"` // only populated for repository subscriptions RepositoryURL *string `json:"repository_url,omitempty"` // only populated for thread subscriptions ThreadURL *string `json:"thread_url,omitempty"` } // ListWatchers lists watchers of a particular repo. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-watchers func (s *ActivityService) ListWatchers(ctx context.Context, owner, repo string, opts *ListOptions) ([]*User, *Response, error) { u := fmt.Sprintf("repos/%s/%s/subscribers", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var watchers []*User resp, err := s.client.Do(ctx, req, &watchers) if err != nil { return nil, resp, err } return watchers, resp, nil } // ListWatched lists the repositories the specified user is watching. Passing // the empty string will fetch watched repos for the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-repositories-watched-by-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#list-repositories-watched-by-a-user func (s *ActivityService) ListWatched(ctx context.Context, user string, opts *ListOptions) ([]*Repository, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/subscriptions", user) } else { u = "user/subscriptions" } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var watched []*Repository resp, err := s.client.Do(ctx, req, &watched) if err != nil { return nil, resp, err } return watched, resp, nil } // GetRepositorySubscription returns the subscription for the specified // repository for the authenticated user. If the authenticated user is not // watching the repository, a nil Subscription is returned. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#get-a-repository-subscription func (s *ActivityService) GetRepositorySubscription(ctx context.Context, owner, repo string) (*Subscription, *Response, error) { u := fmt.Sprintf("repos/%s/%s/subscription", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } sub := new(Subscription) resp, err := s.client.Do(ctx, req, sub) if err != nil { // if it's just a 404, don't return that as an error _, err = parseBoolResponse(err) return nil, resp, err } return sub, resp, nil } // SetRepositorySubscription sets the subscription for the specified repository // for the authenticated user. // // To watch a repository, set subscription.Subscribed to true. // To ignore notifications made within a repository, set subscription.Ignored to true. // To stop watching a repository, use DeleteRepositorySubscription. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#set-a-repository-subscription func (s *ActivityService) SetRepositorySubscription(ctx context.Context, owner, repo string, subscription *Subscription) (*Subscription, *Response, error) { u := fmt.Sprintf("repos/%s/%s/subscription", owner, repo) req, err := s.client.NewRequest("PUT", u, subscription) if err != nil { return nil, nil, err } sub := new(Subscription) resp, err := s.client.Do(ctx, req, sub) if err != nil { return nil, resp, err } return sub, resp, nil } // DeleteRepositorySubscription deletes the subscription for the specified // repository for the authenticated user. // // This is used to stop watching a repository. To control whether or not to // receive notifications from a repository, use SetRepositorySubscription. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/#delete-a-repository-subscription func (s *ActivityService) DeleteRepositorySubscription(ctx context.Context, owner, repo string) (*Response, error) { u := fmt.Sprintf("repos/%s/%s/subscription", owner, repo) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/activity_watching_test.go000066400000000000000000000176751410475703100221020ustar00rootroot00000000000000// 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestActivityService_ListWatchers(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/subscribers", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[{"id":1}]`) }) ctx := context.Background() watchers, _, err := client.Activity.ListWatchers(ctx, "o", "r", &ListOptions{Page: 2}) if err != nil { t.Errorf("Activity.ListWatchers returned error: %v", err) } want := []*User{{ID: Int64(1)}} if !cmp.Equal(watchers, want) { t.Errorf("Activity.ListWatchers returned %+v, want %+v", watchers, want) } const methodName = "ListWatchers" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.ListWatchers(ctx, "\n", "\n", &ListOptions{Page: 2}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListWatchers(ctx, "o", "r", &ListOptions{Page: 2}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_ListWatched_authenticatedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/subscriptions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[{"id":1}]`) }) ctx := context.Background() watched, _, err := client.Activity.ListWatched(ctx, "", &ListOptions{Page: 2}) if err != nil { t.Errorf("Activity.ListWatched returned error: %v", err) } want := []*Repository{{ID: Int64(1)}} if !cmp.Equal(watched, want) { t.Errorf("Activity.ListWatched returned %+v, want %+v", watched, want) } const methodName = "ListWatched" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.ListWatched(ctx, "\n", &ListOptions{Page: 2}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.ListWatched(ctx, "", &ListOptions{Page: 2}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_ListWatched_specifiedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/subscriptions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[{"id":1}]`) }) ctx := context.Background() watched, _, err := client.Activity.ListWatched(ctx, "u", &ListOptions{Page: 2}) if err != nil { t.Errorf("Activity.ListWatched returned error: %v", err) } want := []*Repository{{ID: Int64(1)}} if !cmp.Equal(watched, want) { t.Errorf("Activity.ListWatched returned %+v, want %+v", watched, want) } } func TestActivityService_GetRepositorySubscription_true(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/subscription", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"subscribed":true}`) }) ctx := context.Background() sub, _, err := client.Activity.GetRepositorySubscription(ctx, "o", "r") if err != nil { t.Errorf("Activity.GetRepositorySubscription returned error: %v", err) } want := &Subscription{Subscribed: Bool(true)} if !cmp.Equal(sub, want) { t.Errorf("Activity.GetRepositorySubscription returned %+v, want %+v", sub, want) } const methodName = "GetRepositorySubscription" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.GetRepositorySubscription(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.GetRepositorySubscription(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_GetRepositorySubscription_false(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/subscription", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() sub, _, err := client.Activity.GetRepositorySubscription(ctx, "o", "r") if err != nil { t.Errorf("Activity.GetRepositorySubscription returned error: %v", err) } var want *Subscription if !cmp.Equal(sub, want) { t.Errorf("Activity.GetRepositorySubscription returned %+v, want %+v", sub, want) } } func TestActivityService_GetRepositorySubscription_error(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/subscription", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusBadRequest) }) ctx := context.Background() _, _, err := client.Activity.GetRepositorySubscription(ctx, "o", "r") if err == nil { t.Errorf("Expected HTTP 400 response") } } func TestActivityService_SetRepositorySubscription(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Subscription{Subscribed: Bool(true)} mux.HandleFunc("/repos/o/r/subscription", func(w http.ResponseWriter, r *http.Request) { v := new(Subscription) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"ignored":true}`) }) ctx := context.Background() sub, _, err := client.Activity.SetRepositorySubscription(ctx, "o", "r", input) if err != nil { t.Errorf("Activity.SetRepositorySubscription returned error: %v", err) } want := &Subscription{Ignored: Bool(true)} if !cmp.Equal(sub, want) { t.Errorf("Activity.SetRepositorySubscription returned %+v, want %+v", sub, want) } const methodName = "SetRepositorySubscription" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Activity.SetRepositorySubscription(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Activity.SetRepositorySubscription(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActivityService_DeleteRepositorySubscription(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/subscription", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Activity.DeleteRepositorySubscription(ctx, "o", "r") if err != nil { t.Errorf("Activity.DeleteRepositorySubscription returned error: %v", err) } const methodName = "DeleteRepositorySubscription" testBadOptions(t, methodName, func() (err error) { _, err = client.Activity.DeleteRepositorySubscription(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Activity.DeleteRepositorySubscription(ctx, "o", "r") }) } func TestSubscription_Marshal(t *testing.T) { testJSONMarshal(t, &Subscription{}, "{}") u := &Subscription{ Subscribed: Bool(true), Ignored: Bool(false), Reason: String("r"), CreatedAt: &Timestamp{referenceTime}, URL: String("u"), RepositoryURL: String("ru"), ThreadURL: String("tu"), } want := `{ "subscribed": true, "ignored": false, "reason": "r", "created_at": ` + referenceTimeStr + `, "url": "u", "repository_url": "ru", "thread_url": "tu" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/admin.go000066400000000000000000000102461410475703100163760ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" ) // AdminService handles communication with the admin related methods of the // GitHub API. These API routes are normally only accessible for GitHub // Enterprise installations. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/enterprise/ type AdminService service // TeamLDAPMapping represents the mapping between a GitHub team and an LDAP group. type TeamLDAPMapping struct { ID *int64 `json:"id,omitempty"` LDAPDN *string `json:"ldap_dn,omitempty"` URL *string `json:"url,omitempty"` Name *string `json:"name,omitempty"` Slug *string `json:"slug,omitempty"` Description *string `json:"description,omitempty"` Privacy *string `json:"privacy,omitempty"` Permission *string `json:"permission,omitempty"` MembersURL *string `json:"members_url,omitempty"` RepositoriesURL *string `json:"repositories_url,omitempty"` } func (m TeamLDAPMapping) String() string { return Stringify(m) } // UserLDAPMapping represents the mapping between a GitHub user and an LDAP user. type UserLDAPMapping struct { ID *int64 `json:"id,omitempty"` LDAPDN *string `json:"ldap_dn,omitempty"` Login *string `json:"login,omitempty"` AvatarURL *string `json:"avatar_url,omitempty"` GravatarID *string `json:"gravatar_id,omitempty"` Type *string `json:"type,omitempty"` SiteAdmin *bool `json:"site_admin,omitempty"` URL *string `json:"url,omitempty"` EventsURL *string `json:"events_url,omitempty"` FollowingURL *string `json:"following_url,omitempty"` FollowersURL *string `json:"followers_url,omitempty"` GistsURL *string `json:"gists_url,omitempty"` OrganizationsURL *string `json:"organizations_url,omitempty"` ReceivedEventsURL *string `json:"received_events_url,omitempty"` ReposURL *string `json:"repos_url,omitempty"` StarredURL *string `json:"starred_url,omitempty"` SubscriptionsURL *string `json:"subscriptions_url,omitempty"` } func (m UserLDAPMapping) String() string { return Stringify(m) } // Enterprise represents the GitHub enterprise profile. type Enterprise struct { ID *int `json:"id,omitempty"` Slug *string `json:"slug,omitempty"` Name *string `json:"name,omitempty"` NodeID *string `json:"node_id,omitempty"` AvatarURL *string `json:"avatar_url,omitempty"` Description *string `json:"description,omitempty"` WebsiteURL *string `json:"website_url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` } func (m Enterprise) String() string { return Stringify(m) } // UpdateUserLDAPMapping updates the mapping between a GitHub user and an LDAP user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/enterprise/ldap/#update-ldap-mapping-for-a-user func (s *AdminService) UpdateUserLDAPMapping(ctx context.Context, user string, mapping *UserLDAPMapping) (*UserLDAPMapping, *Response, error) { u := fmt.Sprintf("admin/ldap/users/%v/mapping", user) req, err := s.client.NewRequest("PATCH", u, mapping) if err != nil { return nil, nil, err } m := new(UserLDAPMapping) resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // UpdateTeamLDAPMapping updates the mapping between a GitHub team and an LDAP group. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/enterprise/ldap/#update-ldap-mapping-for-a-team func (s *AdminService) UpdateTeamLDAPMapping(ctx context.Context, team int64, mapping *TeamLDAPMapping) (*TeamLDAPMapping, *Response, error) { u := fmt.Sprintf("admin/ldap/teams/%v/mapping", team) req, err := s.client.NewRequest("PATCH", u, mapping) if err != nil { return nil, nil, err } m := new(TeamLDAPMapping) resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } go-github-38.1.0/github/admin_orgs.go000066400000000000000000000051241410475703100174270ustar00rootroot00000000000000// Copyright 2019 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 ( "context" "fmt" ) // createOrgRequest is a subset of Organization and is used internally // by CreateOrg to pass only the known fields for the endpoint. type createOrgRequest struct { Login *string `json:"login,omitempty"` Admin *string `json:"admin,omitempty"` } // CreateOrg creates a new organization in GitHub Enterprise. // // Note that only a subset of the org fields are used and org must // not be nil. // // GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/orgs/#create-an-organization func (s *AdminService) CreateOrg(ctx context.Context, org *Organization, admin string) (*Organization, *Response, error) { u := "admin/organizations" orgReq := &createOrgRequest{ Login: org.Login, Admin: &admin, } req, err := s.client.NewRequest("POST", u, orgReq) if err != nil { return nil, nil, err } o := new(Organization) resp, err := s.client.Do(ctx, req, o) if err != nil { return nil, resp, err } return o, resp, nil } // renameOrgRequest is a subset of Organization and is used internally // by RenameOrg and RenameOrgByName to pass only the known fields for the endpoint. type renameOrgRequest struct { Login *string `json:"login,omitempty"` } // RenameOrgResponse is the response given when renaming an Organization. type RenameOrgResponse struct { Message *string `json:"message,omitempty"` URL *string `json:"url,omitempty"` } // RenameOrg renames an organization in GitHub Enterprise. // // GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/orgs/#rename-an-organization func (s *AdminService) RenameOrg(ctx context.Context, org *Organization, newName string) (*RenameOrgResponse, *Response, error) { return s.RenameOrgByName(ctx, *org.Login, newName) } // RenameOrgByName renames an organization in GitHub Enterprise using its current name. // // GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/orgs/#rename-an-organization func (s *AdminService) RenameOrgByName(ctx context.Context, org, newName string) (*RenameOrgResponse, *Response, error) { u := fmt.Sprintf("admin/organizations/%v", org) orgReq := &renameOrgRequest{ Login: &newName, } req, err := s.client.NewRequest("PATCH", u, orgReq) if err != nil { return nil, nil, err } o := new(RenameOrgResponse) resp, err := s.client.Do(ctx, req, o) if err != nil { return nil, resp, err } return o, resp, nil } go-github-38.1.0/github/admin_orgs_test.go000066400000000000000000000117531410475703100204730ustar00rootroot00000000000000// Copyright 2019 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestAdminOrgs_Create(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Organization{ Login: String("github"), } mux.HandleFunc("/admin/organizations", func(w http.ResponseWriter, r *http.Request) { v := new(createOrgRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") want := &createOrgRequest{Login: String("github"), Admin: String("ghAdmin")} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"login":"github","id":1}`) }) ctx := context.Background() org, _, err := client.Admin.CreateOrg(ctx, input, "ghAdmin") if err != nil { t.Errorf("Admin.CreateOrg returned error: %v", err) } want := &Organization{ID: Int64(1), Login: String("github")} if !cmp.Equal(org, want) { t.Errorf("Admin.CreateOrg returned %+v, want %+v", org, want) } const methodName = "CreateOrg" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Admin.CreateOrg(ctx, input, "ghAdmin") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAdminOrgs_Rename(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Organization{ Login: String("o"), } mux.HandleFunc("/admin/organizations/o", func(w http.ResponseWriter, r *http.Request) { v := new(renameOrgRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") want := &renameOrgRequest{Login: String("the-new-octocats")} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"message":"Job queued to rename organization. It may take a few minutes to complete.","url":"https:///api/v3/organizations/1"}`) }) ctx := context.Background() resp, _, err := client.Admin.RenameOrg(ctx, input, "the-new-octocats") if err != nil { t.Errorf("Admin.RenameOrg returned error: %v", err) } want := &RenameOrgResponse{Message: String("Job queued to rename organization. It may take a few minutes to complete."), URL: String("https:///api/v3/organizations/1")} if !cmp.Equal(resp, want) { t.Errorf("Admin.RenameOrg returned %+v, want %+v", resp, want) } const methodName = "RenameOrg" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Admin.RenameOrg(ctx, input, "the-new-octocats") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAdminOrgs_RenameByName(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/admin/organizations/o", func(w http.ResponseWriter, r *http.Request) { v := new(renameOrgRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") want := &renameOrgRequest{Login: String("the-new-octocats")} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"message":"Job queued to rename organization. It may take a few minutes to complete.","url":"https:///api/v3/organizations/1"}`) }) ctx := context.Background() resp, _, err := client.Admin.RenameOrgByName(ctx, "o", "the-new-octocats") if err != nil { t.Errorf("Admin.RenameOrg returned error: %v", err) } want := &RenameOrgResponse{Message: String("Job queued to rename organization. It may take a few minutes to complete."), URL: String("https:///api/v3/organizations/1")} if !cmp.Equal(resp, want) { t.Errorf("Admin.RenameOrg returned %+v, want %+v", resp, want) } const methodName = "RenameOrgByName" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Admin.RenameOrgByName(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Admin.RenameOrgByName(ctx, "o", "the-new-octocats") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCreateOrgRequest_Marshal(t *testing.T) { testJSONMarshal(t, &createOrgRequest{}, "{}") u := &createOrgRequest{ Login: String("l"), Admin: String("a"), } want := `{ "login": "l", "admin": "a" }` testJSONMarshal(t, u, want) } func TestRenameOrgRequest_Marshal(t *testing.T) { testJSONMarshal(t, &renameOrgRequest{}, "{}") u := &renameOrgRequest{ Login: String("l"), } want := `{ "login": "l" }` testJSONMarshal(t, u, want) } func TestRenameOrgResponse_Marshal(t *testing.T) { testJSONMarshal(t, &renameOrgRequest{}, "{}") u := &RenameOrgResponse{ Message: String("m"), URL: String("u"), } want := `{ "message": "m", "url": "u" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/admin_stats.go000066400000000000000000000122241410475703100176120ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "fmt" ) // AdminStats represents a variety of stats of a GitHub Enterprise // installation. type AdminStats struct { Issues *IssueStats `json:"issues,omitempty"` Hooks *HookStats `json:"hooks,omitempty"` Milestones *MilestoneStats `json:"milestones,omitempty"` Orgs *OrgStats `json:"orgs,omitempty"` Comments *CommentStats `json:"comments,omitempty"` Pages *PageStats `json:"pages,omitempty"` Users *UserStats `json:"users,omitempty"` Gists *GistStats `json:"gists,omitempty"` Pulls *PullStats `json:"pulls,omitempty"` Repos *RepoStats `json:"repos,omitempty"` } func (s AdminStats) String() string { return Stringify(s) } // IssueStats represents the number of total, open and closed issues. type IssueStats struct { TotalIssues *int `json:"total_issues,omitempty"` OpenIssues *int `json:"open_issues,omitempty"` ClosedIssues *int `json:"closed_issues,omitempty"` } func (s IssueStats) String() string { return Stringify(s) } // HookStats represents the number of total, active and inactive hooks. type HookStats struct { TotalHooks *int `json:"total_hooks,omitempty"` ActiveHooks *int `json:"active_hooks,omitempty"` InactiveHooks *int `json:"inactive_hooks,omitempty"` } func (s HookStats) String() string { return Stringify(s) } // MilestoneStats represents the number of total, open and close milestones. type MilestoneStats struct { TotalMilestones *int `json:"total_milestones,omitempty"` OpenMilestones *int `json:"open_milestones,omitempty"` ClosedMilestones *int `json:"closed_milestones,omitempty"` } func (s MilestoneStats) String() string { return Stringify(s) } // OrgStats represents the number of total, disabled organizations and the team // and team member count. type OrgStats struct { TotalOrgs *int `json:"total_orgs,omitempty"` DisabledOrgs *int `json:"disabled_orgs,omitempty"` TotalTeams *int `json:"total_teams,omitempty"` TotalTeamMembers *int `json:"total_team_members,omitempty"` } func (s OrgStats) String() string { return Stringify(s) } // CommentStats represents the number of total comments on commits, gists, issues // and pull requests. type CommentStats struct { TotalCommitComments *int `json:"total_commit_comments,omitempty"` TotalGistComments *int `json:"total_gist_comments,omitempty"` TotalIssueComments *int `json:"total_issue_comments,omitempty"` TotalPullRequestComments *int `json:"total_pull_request_comments,omitempty"` } func (s CommentStats) String() string { return Stringify(s) } // PageStats represents the total number of github pages. type PageStats struct { TotalPages *int `json:"total_pages,omitempty"` } func (s PageStats) String() string { return Stringify(s) } // UserStats represents the number of total, admin and suspended users. type UserStats struct { TotalUsers *int `json:"total_users,omitempty"` AdminUsers *int `json:"admin_users,omitempty"` SuspendedUsers *int `json:"suspended_users,omitempty"` } func (s UserStats) String() string { return Stringify(s) } // GistStats represents the number of total, private and public gists. type GistStats struct { TotalGists *int `json:"total_gists,omitempty"` PrivateGists *int `json:"private_gists,omitempty"` PublicGists *int `json:"public_gists,omitempty"` } func (s GistStats) String() string { return Stringify(s) } // PullStats represents the number of total, merged, mergable and unmergeable // pull-requests. type PullStats struct { TotalPulls *int `json:"total_pulls,omitempty"` MergedPulls *int `json:"merged_pulls,omitempty"` MergablePulls *int `json:"mergeable_pulls,omitempty"` UnmergablePulls *int `json:"unmergeable_pulls,omitempty"` } func (s PullStats) String() string { return Stringify(s) } // RepoStats represents the number of total, root, fork, organization repositories // together with the total number of pushes and wikis. type RepoStats struct { TotalRepos *int `json:"total_repos,omitempty"` RootRepos *int `json:"root_repos,omitempty"` ForkRepos *int `json:"fork_repos,omitempty"` OrgRepos *int `json:"org_repos,omitempty"` TotalPushes *int `json:"total_pushes,omitempty"` TotalWikis *int `json:"total_wikis,omitempty"` } func (s RepoStats) String() string { return Stringify(s) } // GetAdminStats returns a variety of metrics about a GitHub Enterprise // installation. // // Please note that this is only available to site administrators, // otherwise it will error with a 404 not found (instead of 401 or 403). // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/enterprise-admin/admin_stats/ func (s *AdminService) GetAdminStats(ctx context.Context) (*AdminStats, *Response, error) { u := fmt.Sprintf("enterprise/stats/all") req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } m := new(AdminStats) resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } go-github-38.1.0/github/admin_stats_test.go000066400000000000000000000274771410475703100206710ustar00rootroot00000000000000package github import ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestAdminService_GetAdminStats(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprise/stats/all", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, ` { "repos": { "total_repos": 212, "root_repos": 194, "fork_repos": 18, "org_repos": 51, "total_pushes": 3082, "total_wikis": 15 }, "hooks": { "total_hooks": 27, "active_hooks": 23, "inactive_hooks": 4 }, "pages": { "total_pages": 36 }, "orgs": { "total_orgs": 33, "disabled_orgs": 0, "total_teams": 60, "total_team_members": 314 }, "users": { "total_users": 254, "admin_users": 45, "suspended_users": 21 }, "pulls": { "total_pulls": 86, "merged_pulls": 60, "mergeable_pulls": 21, "unmergeable_pulls": 3 }, "issues": { "total_issues": 179, "open_issues": 83, "closed_issues": 96 }, "milestones": { "total_milestones": 7, "open_milestones": 6, "closed_milestones": 1 }, "gists": { "total_gists": 178, "private_gists": 151, "public_gists": 25 }, "comments": { "total_commit_comments": 6, "total_gist_comments": 28, "total_issue_comments": 366, "total_pull_request_comments": 30 } } `) }) ctx := context.Background() stats, _, err := client.Admin.GetAdminStats(ctx) if err != nil { t.Errorf("AdminService.GetAdminStats returned error: %v", err) } if want := testAdminStats; !cmp.Equal(stats, want) { t.Errorf("AdminService.GetAdminStats returned %+v, want %+v", stats, want) } const methodName = "GetAdminStats" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Admin.GetAdminStats(ctx) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAdminService_Stringify(t *testing.T) { want := "github.AdminStats{Issues:github.IssueStats{TotalIssues:179, OpenIssues:83, ClosedIssues:96}, Hooks:github.HookStats{TotalHooks:27, ActiveHooks:23, InactiveHooks:4}, Milestones:github.MilestoneStats{TotalMilestones:7, OpenMilestones:6, ClosedMilestones:1}, Orgs:github.OrgStats{TotalOrgs:33, DisabledOrgs:0, TotalTeams:60, TotalTeamMembers:314}, Comments:github.CommentStats{TotalCommitComments:6, TotalGistComments:28, TotalIssueComments:366, TotalPullRequestComments:30}, Pages:github.PageStats{TotalPages:36}, Users:github.UserStats{TotalUsers:254, AdminUsers:45, SuspendedUsers:21}, Gists:github.GistStats{TotalGists:178, PrivateGists:151, PublicGists:25}, Pulls:github.PullStats{TotalPulls:86, MergedPulls:60, MergablePulls:21, UnmergablePulls:3}, Repos:github.RepoStats{TotalRepos:212, RootRepos:194, ForkRepos:18, OrgRepos:51, TotalPushes:3082, TotalWikis:15}}" if got := testAdminStats.String(); got != want { t.Errorf("testAdminStats.String = %q, want %q", got, want) } want = "github.IssueStats{TotalIssues:179, OpenIssues:83, ClosedIssues:96}" if got := testAdminStats.Issues.String(); got != want { t.Errorf("testAdminStats.Issues.String = %q, want %q", got, want) } want = "github.HookStats{TotalHooks:27, ActiveHooks:23, InactiveHooks:4}" if got := testAdminStats.Hooks.String(); got != want { t.Errorf("testAdminStats.Hooks.String = %q, want %q", got, want) } want = "github.MilestoneStats{TotalMilestones:7, OpenMilestones:6, ClosedMilestones:1}" if got := testAdminStats.Milestones.String(); got != want { t.Errorf("testAdminStats.Milestones.String = %q, want %q", got, want) } want = "github.OrgStats{TotalOrgs:33, DisabledOrgs:0, TotalTeams:60, TotalTeamMembers:314}" if got := testAdminStats.Orgs.String(); got != want { t.Errorf("testAdminStats.Orgs.String = %q, want %q", got, want) } want = "github.CommentStats{TotalCommitComments:6, TotalGistComments:28, TotalIssueComments:366, TotalPullRequestComments:30}" if got := testAdminStats.Comments.String(); got != want { t.Errorf("testAdminStats.Comments.String = %q, want %q", got, want) } want = "github.PageStats{TotalPages:36}" if got := testAdminStats.Pages.String(); got != want { t.Errorf("testAdminStats.Pages.String = %q, want %q", got, want) } want = "github.UserStats{TotalUsers:254, AdminUsers:45, SuspendedUsers:21}" if got := testAdminStats.Users.String(); got != want { t.Errorf("testAdminStats.Users.String = %q, want %q", got, want) } want = "github.GistStats{TotalGists:178, PrivateGists:151, PublicGists:25}" if got := testAdminStats.Gists.String(); got != want { t.Errorf("testAdminStats.Gists.String = %q, want %q", got, want) } want = "github.PullStats{TotalPulls:86, MergedPulls:60, MergablePulls:21, UnmergablePulls:3}" if got := testAdminStats.Pulls.String(); got != want { t.Errorf("testAdminStats.Pulls.String = %q, want %q", got, want) } want = "github.RepoStats{TotalRepos:212, RootRepos:194, ForkRepos:18, OrgRepos:51, TotalPushes:3082, TotalWikis:15}" if got := testAdminStats.Repos.String(); got != want { t.Errorf("testAdminStats.Repos.String = %q, want %q", got, want) } } var testAdminStats = &AdminStats{ Repos: &RepoStats{ TotalRepos: Int(212), RootRepos: Int(194), ForkRepos: Int(18), OrgRepos: Int(51), TotalPushes: Int(3082), TotalWikis: Int(15), }, Hooks: &HookStats{ TotalHooks: Int(27), ActiveHooks: Int(23), InactiveHooks: Int(4), }, Pages: &PageStats{ TotalPages: Int(36), }, Orgs: &OrgStats{ TotalOrgs: Int(33), DisabledOrgs: Int(0), TotalTeams: Int(60), TotalTeamMembers: Int(314), }, Users: &UserStats{ TotalUsers: Int(254), AdminUsers: Int(45), SuspendedUsers: Int(21), }, Pulls: &PullStats{ TotalPulls: Int(86), MergedPulls: Int(60), MergablePulls: Int(21), UnmergablePulls: Int(3), }, Issues: &IssueStats{ TotalIssues: Int(179), OpenIssues: Int(83), ClosedIssues: Int(96), }, Milestones: &MilestoneStats{ TotalMilestones: Int(7), OpenMilestones: Int(6), ClosedMilestones: Int(1), }, Gists: &GistStats{ TotalGists: Int(178), PrivateGists: Int(151), PublicGists: Int(25), }, Comments: &CommentStats{ TotalCommitComments: Int(6), TotalGistComments: Int(28), TotalIssueComments: Int(366), TotalPullRequestComments: Int(30), }, } func TestIssueStats_Marshal(t *testing.T) { testJSONMarshal(t, &IssueStats{}, "{}") u := &IssueStats{ TotalIssues: Int(1), OpenIssues: Int(1), ClosedIssues: Int(1), } want := `{ "total_issues": 1, "open_issues": 1, "closed_issues": 1 }` testJSONMarshal(t, u, want) } func TestHookStats_Marshal(t *testing.T) { testJSONMarshal(t, &HookStats{}, "{}") u := &HookStats{ TotalHooks: Int(1), ActiveHooks: Int(1), InactiveHooks: Int(1), } want := `{ "total_hooks": 1, "active_hooks": 1, "inactive_hooks": 1 }` testJSONMarshal(t, u, want) } func TestMilestoneStats_Marshal(t *testing.T) { testJSONMarshal(t, &MilestoneStats{}, "{}") u := &MilestoneStats{ TotalMilestones: Int(1), OpenMilestones: Int(1), ClosedMilestones: Int(1), } want := `{ "total_milestones": 1, "open_milestones": 1, "closed_milestones": 1 }` testJSONMarshal(t, u, want) } func TestOrgStats_Marshal(t *testing.T) { testJSONMarshal(t, &OrgStats{}, "{}") u := &OrgStats{ TotalOrgs: Int(1), DisabledOrgs: Int(1), TotalTeams: Int(1), TotalTeamMembers: Int(1), } want := `{ "total_orgs": 1, "disabled_orgs": 1, "total_teams": 1, "total_team_members": 1 }` testJSONMarshal(t, u, want) } func TestCommentStats_Marshal(t *testing.T) { testJSONMarshal(t, &CommentStats{}, "{}") u := &CommentStats{ TotalCommitComments: Int(1), TotalGistComments: Int(1), TotalIssueComments: Int(1), TotalPullRequestComments: Int(1), } want := `{ "total_commit_comments": 1, "total_gist_comments": 1, "total_issue_comments": 1, "total_pull_request_comments": 1 }` testJSONMarshal(t, u, want) } func TestPageStats_Marshal(t *testing.T) { testJSONMarshal(t, &PageStats{}, "{}") u := &PageStats{ TotalPages: Int(1), } want := `{ "total_pages": 1 }` testJSONMarshal(t, u, want) } func TestUserStats_Marshal(t *testing.T) { testJSONMarshal(t, &UserStats{}, "{}") u := &UserStats{ TotalUsers: Int(1), AdminUsers: Int(1), SuspendedUsers: Int(1), } want := `{ "total_users": 1, "admin_users": 1, "suspended_users": 1 }` testJSONMarshal(t, u, want) } func TestGistStats_Marshal(t *testing.T) { testJSONMarshal(t, &GistStats{}, "{}") u := &GistStats{ TotalGists: Int(1), PrivateGists: Int(1), PublicGists: Int(1), } want := `{ "total_gists": 1, "private_gists": 1, "public_gists": 1 }` testJSONMarshal(t, u, want) } func TestPullStats_Marshal(t *testing.T) { testJSONMarshal(t, &PullStats{}, "{}") u := &PullStats{ TotalPulls: Int(1), MergedPulls: Int(1), MergablePulls: Int(1), UnmergablePulls: Int(1), } want := `{ "total_pulls": 1, "merged_pulls": 1, "mergeable_pulls": 1, "unmergeable_pulls": 1 }` testJSONMarshal(t, u, want) } func TestRepoStats_Marshal(t *testing.T) { testJSONMarshal(t, &RepoStats{}, "{}") u := &RepoStats{ TotalRepos: Int(1), RootRepos: Int(1), ForkRepos: Int(1), OrgRepos: Int(1), TotalPushes: Int(1), TotalWikis: Int(1), } want := `{ "total_repos": 1, "root_repos": 1, "fork_repos": 1, "org_repos": 1, "total_pushes": 1, "total_wikis": 1 }` testJSONMarshal(t, u, want) } func TestAdminStats_Marshal(t *testing.T) { testJSONMarshal(t, &AdminStats{}, "{}") u := &AdminStats{ Repos: &RepoStats{ TotalRepos: Int(212), RootRepos: Int(194), ForkRepos: Int(18), OrgRepos: Int(51), TotalPushes: Int(3082), TotalWikis: Int(15), }, Hooks: &HookStats{ TotalHooks: Int(27), ActiveHooks: Int(23), InactiveHooks: Int(4), }, Pages: &PageStats{ TotalPages: Int(36), }, Orgs: &OrgStats{ TotalOrgs: Int(33), DisabledOrgs: Int(0), TotalTeams: Int(60), TotalTeamMembers: Int(314), }, Users: &UserStats{ TotalUsers: Int(254), AdminUsers: Int(45), SuspendedUsers: Int(21), }, Pulls: &PullStats{ TotalPulls: Int(86), MergedPulls: Int(60), MergablePulls: Int(21), UnmergablePulls: Int(3), }, Issues: &IssueStats{ TotalIssues: Int(179), OpenIssues: Int(83), ClosedIssues: Int(96), }, Milestones: &MilestoneStats{ TotalMilestones: Int(7), OpenMilestones: Int(6), ClosedMilestones: Int(1), }, Gists: &GistStats{ TotalGists: Int(178), PrivateGists: Int(151), PublicGists: Int(25), }, Comments: &CommentStats{ TotalCommitComments: Int(6), TotalGistComments: Int(28), TotalIssueComments: Int(366), TotalPullRequestComments: Int(30), }, } want := `{ "repos": { "total_repos": 212, "root_repos": 194, "fork_repos": 18, "org_repos": 51, "total_pushes": 3082, "total_wikis": 15 }, "hooks": { "total_hooks": 27, "active_hooks": 23, "inactive_hooks": 4 }, "pages": { "total_pages": 36 }, "orgs": { "total_orgs": 33, "disabled_orgs": 0, "total_teams": 60, "total_team_members": 314 }, "users": { "total_users": 254, "admin_users": 45, "suspended_users": 21 }, "pulls": { "total_pulls": 86, "merged_pulls": 60, "mergeable_pulls": 21, "unmergeable_pulls": 3 }, "issues": { "total_issues": 179, "open_issues": 83, "closed_issues": 96 }, "milestones": { "total_milestones": 7, "open_milestones": 6, "closed_milestones": 1 }, "gists": { "total_gists": 178, "private_gists": 151, "public_gists": 25 }, "comments": { "total_commit_comments": 6, "total_gist_comments": 28, "total_issue_comments": 366, "total_pull_request_comments": 30 } }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/admin_test.go000066400000000000000000000164041410475703100174370ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestAdminService_UpdateUserLDAPMapping(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &UserLDAPMapping{ LDAPDN: String("uid=asdf,ou=users,dc=github,dc=com"), } mux.HandleFunc("/admin/ldap/users/u/mapping", func(w http.ResponseWriter, r *http.Request) { v := new(UserLDAPMapping) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1,"ldap_dn":"uid=asdf,ou=users,dc=github,dc=com"}`) }) ctx := context.Background() mapping, _, err := client.Admin.UpdateUserLDAPMapping(ctx, "u", input) if err != nil { t.Errorf("Admin.UpdateUserLDAPMapping returned error: %v", err) } want := &UserLDAPMapping{ ID: Int64(1), LDAPDN: String("uid=asdf,ou=users,dc=github,dc=com"), } if !cmp.Equal(mapping, want) { t.Errorf("Admin.UpdateUserLDAPMapping returned %+v, want %+v", mapping, want) } const methodName = "UpdateUserLDAPMapping" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Admin.UpdateUserLDAPMapping(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Admin.UpdateUserLDAPMapping(ctx, "u", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAdminService_UpdateTeamLDAPMapping(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &TeamLDAPMapping{ LDAPDN: String("cn=Enterprise Ops,ou=teams,dc=github,dc=com"), } mux.HandleFunc("/admin/ldap/teams/1/mapping", func(w http.ResponseWriter, r *http.Request) { v := new(TeamLDAPMapping) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1,"ldap_dn":"cn=Enterprise Ops,ou=teams,dc=github,dc=com"}`) }) ctx := context.Background() mapping, _, err := client.Admin.UpdateTeamLDAPMapping(ctx, 1, input) if err != nil { t.Errorf("Admin.UpdateTeamLDAPMapping returned error: %v", err) } want := &TeamLDAPMapping{ ID: Int64(1), LDAPDN: String("cn=Enterprise Ops,ou=teams,dc=github,dc=com"), } if !cmp.Equal(mapping, want) { t.Errorf("Admin.UpdateTeamLDAPMapping returned %+v, want %+v", mapping, want) } const methodName = "UpdateTeamLDAPMapping" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Admin.UpdateTeamLDAPMapping(ctx, -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Admin.UpdateTeamLDAPMapping(ctx, 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAdminService_TeamLDAPMapping_String(t *testing.T) { v := &TeamLDAPMapping{ ID: Int64(1), LDAPDN: String("a"), URL: String("b"), Name: String("c"), Slug: String("d"), Description: String("e"), Privacy: String("f"), Permission: String("g"), MembersURL: String("h"), RepositoriesURL: String("i"), } want := `github.TeamLDAPMapping{ID:1, LDAPDN:"a", URL:"b", Name:"c", Slug:"d", Description:"e", Privacy:"f", Permission:"g", MembersURL:"h", RepositoriesURL:"i"}` if got := v.String(); got != want { t.Errorf("TeamLDAPMapping.String = `%v`, want `%v`", got, want) } } func TestAdminService_UserLDAPMapping_String(t *testing.T) { v := &UserLDAPMapping{ ID: Int64(1), LDAPDN: String("a"), Login: String("b"), AvatarURL: String("c"), GravatarID: String("d"), Type: String("e"), SiteAdmin: Bool(true), URL: String("f"), EventsURL: String("g"), FollowingURL: String("h"), FollowersURL: String("i"), GistsURL: String("j"), OrganizationsURL: String("k"), ReceivedEventsURL: String("l"), ReposURL: String("m"), StarredURL: String("n"), SubscriptionsURL: String("o"), } want := `github.UserLDAPMapping{ID:1, LDAPDN:"a", Login:"b", AvatarURL:"c", GravatarID:"d", Type:"e", SiteAdmin:true, URL:"f", EventsURL:"g", FollowingURL:"h", FollowersURL:"i", GistsURL:"j", OrganizationsURL:"k", ReceivedEventsURL:"l", ReposURL:"m", StarredURL:"n", SubscriptionsURL:"o"}` if got := v.String(); got != want { t.Errorf("UserLDAPMapping.String = `%v`, want `%v`", got, want) } } func TestTeamLDAPMapping_Marshal(t *testing.T) { testJSONMarshal(t, &TeamLDAPMapping{}, "{}") u := &TeamLDAPMapping{ ID: Int64(1), LDAPDN: String("ldapdn"), URL: String("u"), Name: String("n"), Slug: String("s"), Description: String("d"), Privacy: String("p"), Permission: String("per"), MembersURL: String("mu"), RepositoriesURL: String("ru"), } want := `{ "id": 1, "ldap_dn": "ldapdn", "url": "u", "name": "n", "slug": "s", "description": "d", "privacy": "p", "permission": "per", "members_url": "mu", "repositories_url": "ru" }` testJSONMarshal(t, u, want) } func TestUserLDAPMapping_Marshal(t *testing.T) { testJSONMarshal(t, &UserLDAPMapping{}, "{}") u := &UserLDAPMapping{ ID: Int64(1), LDAPDN: String("ldapdn"), Login: String("l"), AvatarURL: String("au"), GravatarID: String("gi"), Type: String("t"), SiteAdmin: Bool(true), URL: String("u"), EventsURL: String("eu"), FollowingURL: String("fu"), FollowersURL: String("fu"), GistsURL: String("gu"), OrganizationsURL: String("ou"), ReceivedEventsURL: String("reu"), ReposURL: String("ru"), StarredURL: String("su"), SubscriptionsURL: String("subu"), } want := `{ "id": 1, "ldap_dn": "ldapdn", "login": "l", "avatar_url": "au", "gravatar_id": "gi", "type": "t", "site_admin": true, "url": "u", "events_url": "eu", "following_url": "fu", "followers_url": "fu", "gists_url": "gu", "organizations_url": "ou", "received_events_url": "reu", "repos_url": "ru", "starred_url": "su", "subscriptions_url": "subu" }` testJSONMarshal(t, u, want) } func TestEnterprise_Marshal(t *testing.T) { testJSONMarshal(t, &Enterprise{}, "{}") u := &Enterprise{ ID: Int(1), Slug: String("s"), Name: String("n"), NodeID: String("nid"), AvatarURL: String("au"), Description: String("d"), WebsiteURL: String("wu"), HTMLURL: String("hu"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, } want := `{ "id": 1, "slug": "s", "name": "n", "node_id": "nid", "avatar_url": "au", "description": "d", "website_url": "wu", "html_url": "hu", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/admin_users.go000066400000000000000000000075371410475703100176300ustar00rootroot00000000000000// Copyright 2019 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 ( "context" "fmt" ) // createUserRequest is a subset of User and is used internally // by CreateUser to pass only the known fields for the endpoint. type createUserRequest struct { Login *string `json:"login,omitempty"` Email *string `json:"email,omitempty"` } // CreateUser creates a new user in GitHub Enterprise. // // GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#create-a-new-user func (s *AdminService) CreateUser(ctx context.Context, login, email string) (*User, *Response, error) { u := "admin/users" userReq := &createUserRequest{ Login: &login, Email: &email, } req, err := s.client.NewRequest("POST", u, userReq) if err != nil { return nil, nil, err } var user User resp, err := s.client.Do(ctx, req, &user) if err != nil { return nil, resp, err } return &user, resp, nil } // DeleteUser deletes a user in GitHub Enterprise. // // GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#delete-a-user func (s *AdminService) DeleteUser(ctx context.Context, username string) (*Response, error) { u := "admin/users/" + username req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } resp, err := s.client.Do(ctx, req, nil) if err != nil { return resp, err } return resp, nil } // ImpersonateUserOptions represents the scoping for the OAuth token. type ImpersonateUserOptions struct { Scopes []string `json:"scopes,omitempty"` } // OAuthAPP represents the GitHub Site Administrator OAuth app. type OAuthAPP struct { URL *string `json:"url,omitempty"` Name *string `json:"name,omitempty"` ClientID *string `json:"client_id,omitempty"` } func (s OAuthAPP) String() string { return Stringify(s) } // UserAuthorization represents the impersonation response. type UserAuthorization struct { ID *int64 `json:"id,omitempty"` URL *string `json:"url,omitempty"` Scopes []string `json:"scopes,omitempty"` Token *string `json:"token,omitempty"` TokenLastEight *string `json:"token_last_eight,omitempty"` HashedToken *string `json:"hashed_token,omitempty"` App *OAuthAPP `json:"app,omitempty"` Note *string `json:"note,omitempty"` NoteURL *string `json:"note_url,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` Fingerprint *string `json:"fingerprint,omitempty"` } // CreateUserImpersonation creates an impersonation OAuth token. // // GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#create-an-impersonation-oauth-token func (s *AdminService) CreateUserImpersonation(ctx context.Context, username string, opts *ImpersonateUserOptions) (*UserAuthorization, *Response, error) { u := fmt.Sprintf("admin/users/%s/authorizations", username) req, err := s.client.NewRequest("POST", u, opts) if err != nil { return nil, nil, err } a := new(UserAuthorization) resp, err := s.client.Do(ctx, req, a) if err != nil { return nil, resp, err } return a, resp, nil } // DeleteUserImpersonation deletes an impersonation OAuth token. // // GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#delete-an-impersonation-oauth-token func (s *AdminService) DeleteUserImpersonation(ctx context.Context, username string) (*Response, error) { u := fmt.Sprintf("admin/users/%s/authorizations", username) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } resp, err := s.client.Do(ctx, req, nil) if err != nil { return resp, err } return resp, nil } go-github-38.1.0/github/admin_users_test.go000066400000000000000000000153021410475703100206540ustar00rootroot00000000000000// Copyright 2019 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestAdminUsers_Create(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/admin/users", func(w http.ResponseWriter, r *http.Request) { v := new(createUserRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") want := &createUserRequest{Login: String("github"), Email: String("email@domain.com")} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"login":"github","id":1}`) }) ctx := context.Background() org, _, err := client.Admin.CreateUser(ctx, "github", "email@domain.com") if err != nil { t.Errorf("Admin.CreateUser returned error: %v", err) } want := &User{ID: Int64(1), Login: String("github")} if !cmp.Equal(org, want) { t.Errorf("Admin.CreateUser returned %+v, want %+v", org, want) } const methodName = "CreateUser" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Admin.CreateUser(ctx, "github", "email@domain.com") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAdminUsers_Delete(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/admin/users/github", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Admin.DeleteUser(ctx, "github") if err != nil { t.Errorf("Admin.DeleteUser returned error: %v", err) } const methodName = "DeleteUser" testBadOptions(t, methodName, func() (err error) { _, err = client.Admin.DeleteUser(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Admin.DeleteUser(ctx, "github") }) } func TestUserImpersonation_Create(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/admin/users/github/authorizations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testBody(t, r, `{"scopes":["repo"]}`+"\n") fmt.Fprint(w, `{"id": 1234, "url": "https://git.company.com/api/v3/authorizations/1234", "app": { "name": "GitHub Site Administrator", "url": "https://docs.github.com/en/free-pro-team@latest/rest/reference/enterprise/users/", "client_id": "1234" }, "token": "1234", "hashed_token": "1234", "token_last_eight": "1234", "note": null, "note_url": null, "created_at": "2018-01-01T00:00:00Z", "updated_at": "2018-01-01T00:00:00Z", "scopes": [ "repo" ], "fingerprint": null}`) }) opt := &ImpersonateUserOptions{Scopes: []string{"repo"}} ctx := context.Background() auth, _, err := client.Admin.CreateUserImpersonation(ctx, "github", opt) if err != nil { t.Errorf("Admin.CreateUserImpersonation returned error: %v", err) } date := Timestamp{Time: time.Date(2018, time.January, 1, 0, 0, 0, 0, time.UTC)} want := &UserAuthorization{ ID: Int64(1234), URL: String("https://git.company.com/api/v3/authorizations/1234"), App: &OAuthAPP{ Name: String("GitHub Site Administrator"), URL: String("https://docs.github.com/en/free-pro-team@latest/rest/reference/enterprise/users/"), ClientID: String("1234"), }, Token: String("1234"), HashedToken: String("1234"), TokenLastEight: String("1234"), Note: nil, NoteURL: nil, CreatedAt: &date, UpdatedAt: &date, Scopes: []string{"repo"}, Fingerprint: nil, } if !cmp.Equal(auth, want) { t.Errorf("Admin.CreateUserImpersonation returned %+v, want %+v", auth, want) } const methodName = "CreateUserImpersonation" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Admin.CreateUserImpersonation(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Admin.CreateUserImpersonation(ctx, "github", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUserImpersonation_Delete(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/admin/users/github/authorizations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Admin.DeleteUserImpersonation(ctx, "github") if err != nil { t.Errorf("Admin.DeleteUserImpersonation returned error: %v", err) } const methodName = "DeleteUserImpersonation" testBadOptions(t, methodName, func() (err error) { _, err = client.Admin.DeleteUserImpersonation(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Admin.DeleteUserImpersonation(ctx, "github") }) } func TestCreateUserRequest_Marshal(t *testing.T) { testJSONMarshal(t, &createUserRequest{}, "{}") u := &createUserRequest{ Login: String("l"), Email: String("e"), } want := `{ "login": "l", "email": "e" }` testJSONMarshal(t, u, want) } func TestImpersonateUserOptions_Marshal(t *testing.T) { testJSONMarshal(t, &ImpersonateUserOptions{}, "{}") u := &ImpersonateUserOptions{ Scopes: []string{ "s", }, } want := `{ "scopes": ["s"] }` testJSONMarshal(t, u, want) } func TestOAuthAPP_Marshal(t *testing.T) { testJSONMarshal(t, &OAuthAPP{}, "{}") u := &OAuthAPP{ URL: String("u"), Name: String("n"), ClientID: String("cid"), } want := `{ "url": "u", "name": "n", "client_id": "cid" }` testJSONMarshal(t, u, want) } func TestUserAuthorization_Marshal(t *testing.T) { testJSONMarshal(t, &UserAuthorization{}, "{}") u := &UserAuthorization{ ID: Int64(1), URL: String("u"), Scopes: []string{ "s", }, Token: String("t"), TokenLastEight: String("tle"), HashedToken: String("ht"), App: &OAuthAPP{ URL: String("u"), Name: String("n"), ClientID: String("cid"), }, Note: String("n"), NoteURL: String("nu"), UpdatedAt: &Timestamp{referenceTime}, CreatedAt: &Timestamp{referenceTime}, Fingerprint: String("f"), } want := `{ "id": 1, "url": "u", "scopes": ["s"], "token": "t", "token_last_eight": "tle", "hashed_token": "ht", "app": { "url": "u", "name": "n", "client_id": "cid" }, "note": "n", "note_url": "nu", "updated_at": ` + referenceTimeStr + `, "created_at": ` + referenceTimeStr + `, "fingerprint": "f" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/apps.go000066400000000000000000000351041410475703100162510ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" "time" ) // AppsService provides access to the installation related functions // in the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/ type AppsService service // App represents a GitHub App. type App struct { ID *int64 `json:"id,omitempty"` Slug *string `json:"slug,omitempty"` NodeID *string `json:"node_id,omitempty"` Owner *User `json:"owner,omitempty"` Name *string `json:"name,omitempty"` Description *string `json:"description,omitempty"` ExternalURL *string `json:"external_url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` Permissions *InstallationPermissions `json:"permissions,omitempty"` Events []string `json:"events,omitempty"` } // InstallationToken represents an installation token. type InstallationToken struct { Token *string `json:"token,omitempty"` ExpiresAt *time.Time `json:"expires_at,omitempty"` Permissions *InstallationPermissions `json:"permissions,omitempty"` Repositories []*Repository `json:"repositories,omitempty"` } // InstallationTokenOptions allow restricting a token's access to specific repositories. type InstallationTokenOptions struct { // The IDs of the repositories that the installation token can access. // Providing repository IDs restricts the access of an installation token to specific repositories. RepositoryIDs []int64 `json:"repository_ids,omitempty"` // The permissions granted to the access token. // The permissions object includes the permission names and their access type. Permissions *InstallationPermissions `json:"permissions,omitempty"` } // InstallationPermissions lists the repository and organization permissions for an installation. // // Permission names taken from: // https://docs.github.com/en/enterprise-server@3.0/rest/reference/apps#create-an-installation-access-token-for-an-app // https://docs.github.com/en/rest/reference/apps#create-an-installation-access-token-for-an-app type InstallationPermissions struct { Actions *string `json:"actions,omitempty"` Administration *string `json:"administration,omitempty"` Blocking *string `json:"blocking,omitempty"` Checks *string `json:"checks,omitempty"` Contents *string `json:"contents,omitempty"` ContentReferences *string `json:"content_references,omitempty"` Deployments *string `json:"deployments,omitempty"` Emails *string `json:"emails,omitempty"` Environments *string `json:"environments,omitempty"` Followers *string `json:"followers,omitempty"` Issues *string `json:"issues,omitempty"` Metadata *string `json:"metadata,omitempty"` Members *string `json:"members,omitempty"` OrganizationAdministration *string `json:"organization_administration,omitempty"` OrganizationHooks *string `json:"organization_hooks,omitempty"` OrganizationPlan *string `json:"organization_plan,omitempty"` OrganizationPreReceiveHooks *string `json:"organization_pre_receive_hooks,omitempty"` OrganizationProjects *string `json:"organization_projects,omitempty"` OrganizationSecrets *string `json:"organization_secrets,omitempty"` OrganizationSelfHostedRunners *string `json:"organization_self_hosted_runners,omitempty"` OrganizationUserBlocking *string `json:"organization_user_blocking,omitempty"` Packages *string `json:"packages,omitempty"` Pages *string `json:"pages,omitempty"` PullRequests *string `json:"pull_requests,omitempty"` RepositoryHooks *string `json:"repository_hooks,omitempty"` RepositoryProjects *string `json:"repository_projects,omitempty"` RepositoryPreReceiveHooks *string `json:"repository_pre_receive_hooks,omitempty"` Secrets *string `json:"secrets,omitempty"` SecretScanningAlerts *string `json:"secret_scanning_alerts,omitempty"` SecurityEvents *string `json:"security_events,omitempty"` SingleFile *string `json:"single_file,omitempty"` Statuses *string `json:"statuses,omitempty"` TeamDiscussions *string `json:"team_discussions,omitempty"` VulnerabilityAlerts *string `json:"vulnerability_alerts,omitempty"` Workflows *string `json:"workflows,omitempty"` } // Installation represents a GitHub Apps installation. type Installation struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` AppID *int64 `json:"app_id,omitempty"` AppSlug *string `json:"app_slug,omitempty"` TargetID *int64 `json:"target_id,omitempty"` Account *User `json:"account,omitempty"` AccessTokensURL *string `json:"access_tokens_url,omitempty"` RepositoriesURL *string `json:"repositories_url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` TargetType *string `json:"target_type,omitempty"` SingleFileName *string `json:"single_file_name,omitempty"` RepositorySelection *string `json:"repository_selection,omitempty"` Events []string `json:"events,omitempty"` SingleFilePaths []string `json:"single_file_paths,omitempty"` Permissions *InstallationPermissions `json:"permissions,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` HasMultipleSingleFiles *bool `json:"has_multiple_single_files,omitempty"` SuspendedBy *User `json:"suspended_by,omitempty"` SuspendedAt *Timestamp `json:"suspended_at,omitempty"` } // Attachment represents a GitHub Apps attachment. type Attachment struct { ID *int64 `json:"id,omitempty"` Title *string `json:"title,omitempty"` Body *string `json:"body,omitempty"` } // ContentReference represents a reference to a URL in an issue or pull request. type ContentReference struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Reference *string `json:"reference,omitempty"` } func (i Installation) String() string { return Stringify(i) } // Get a single GitHub App. Passing the empty string will get // the authenticated GitHub App. // // Note: appSlug is just the URL-friendly name of your GitHub App. // You can find this on the settings page for your GitHub App // (e.g., https://github.com/settings/apps/:app_slug). // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#get-the-authenticated-app // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#get-an-app func (s *AppsService) Get(ctx context.Context, appSlug string) (*App, *Response, error) { var u string if appSlug != "" { u = fmt.Sprintf("apps/%v", appSlug) } else { u = "app" } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } app := new(App) resp, err := s.client.Do(ctx, req, app) if err != nil { return nil, resp, err } return app, resp, nil } // ListInstallations lists the installations that the current GitHub App has. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#list-installations-for-the-authenticated-app func (s *AppsService) ListInstallations(ctx context.Context, opts *ListOptions) ([]*Installation, *Response, error) { u, err := addOptions("app/installations", opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var i []*Installation resp, err := s.client.Do(ctx, req, &i) if err != nil { return nil, resp, err } return i, resp, nil } // GetInstallation returns the specified installation. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#get-an-installation-for-the-authenticated-app func (s *AppsService) GetInstallation(ctx context.Context, id int64) (*Installation, *Response, error) { return s.getInstallation(ctx, fmt.Sprintf("app/installations/%v", id)) } // ListUserInstallations lists installations that are accessible to the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#list-app-installations-accessible-to-the-user-access-token func (s *AppsService) ListUserInstallations(ctx context.Context, opts *ListOptions) ([]*Installation, *Response, error) { u, err := addOptions("user/installations", opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var i struct { Installations []*Installation `json:"installations"` } resp, err := s.client.Do(ctx, req, &i) if err != nil { return nil, resp, err } return i.Installations, resp, nil } // SuspendInstallation suspends the specified installation. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#suspend-an-app-installation func (s *AppsService) SuspendInstallation(ctx context.Context, id int64) (*Response, error) { u := fmt.Sprintf("app/installations/%v/suspended", id) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // UnsuspendInstallation unsuspends the specified installation. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#unsuspend-an-app-installation func (s *AppsService) UnsuspendInstallation(ctx context.Context, id int64) (*Response, error) { u := fmt.Sprintf("app/installations/%v/suspended", id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DeleteInstallation deletes the specified installation. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#delete-an-installation-for-the-authenticated-app func (s *AppsService) DeleteInstallation(ctx context.Context, id int64) (*Response, error) { u := fmt.Sprintf("app/installations/%v", id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // CreateInstallationToken creates a new installation token. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#create-an-installation-access-token-for-an-app func (s *AppsService) CreateInstallationToken(ctx context.Context, id int64, opts *InstallationTokenOptions) (*InstallationToken, *Response, error) { u := fmt.Sprintf("app/installations/%v/access_tokens", id) req, err := s.client.NewRequest("POST", u, opts) if err != nil { return nil, nil, err } t := new(InstallationToken) resp, err := s.client.Do(ctx, req, t) if err != nil { return nil, resp, err } return t, resp, nil } // CreateAttachment creates a new attachment on user comment containing a url. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#create-a-content-attachment func (s *AppsService) CreateAttachment(ctx context.Context, contentReferenceID int64, title, body string) (*Attachment, *Response, error) { u := fmt.Sprintf("content_references/%v/attachments", contentReferenceID) payload := &Attachment{Title: String(title), Body: String(body)} req, err := s.client.NewRequest("POST", u, payload) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeContentAttachmentsPreview) m := &Attachment{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // FindOrganizationInstallation finds the organization's installation information. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#get-an-organization-installation-for-the-authenticated-app func (s *AppsService) FindOrganizationInstallation(ctx context.Context, org string) (*Installation, *Response, error) { return s.getInstallation(ctx, fmt.Sprintf("orgs/%v/installation", org)) } // FindRepositoryInstallation finds the repository's installation information. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#get-a-repository-installation-for-the-authenticated-app func (s *AppsService) FindRepositoryInstallation(ctx context.Context, owner, repo string) (*Installation, *Response, error) { return s.getInstallation(ctx, fmt.Sprintf("repos/%v/%v/installation", owner, repo)) } // FindRepositoryInstallationByID finds the repository's installation information. // // Note: FindRepositoryInstallationByID uses the undocumented GitHub API endpoint /repositories/:id/installation. func (s *AppsService) FindRepositoryInstallationByID(ctx context.Context, id int64) (*Installation, *Response, error) { return s.getInstallation(ctx, fmt.Sprintf("repositories/%d/installation", id)) } // FindUserInstallation finds the user's installation information. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#get-a-user-installation-for-the-authenticated-app func (s *AppsService) FindUserInstallation(ctx context.Context, user string) (*Installation, *Response, error) { return s.getInstallation(ctx, fmt.Sprintf("users/%v/installation", user)) } func (s *AppsService) getInstallation(ctx context.Context, url string) (*Installation, *Response, error) { req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } i := new(Installation) resp, err := s.client.Do(ctx, req, i) if err != nil { return nil, resp, err } return i, resp, nil } go-github-38.1.0/github/apps_installation.go000066400000000000000000000075251410475703100210400ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" "strings" ) // ListRepositories represents the response from the list repos endpoints. type ListRepositories struct { TotalCount *int `json:"total_count,omitempty"` Repositories []*Repository `json:"repositories"` } // ListRepos lists the repositories that are accessible to the authenticated installation. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#list-repositories-accessible-to-the-app-installation func (s *AppsService) ListRepos(ctx context.Context, opts *ListOptions) (*ListRepositories, *Response, error) { u, err := addOptions("installation/repositories", opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. acceptHeaders := []string{ mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview, mediaTypeRepositoryTemplatePreview, } req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) var r *ListRepositories resp, err := s.client.Do(ctx, req, &r) if err != nil { return nil, resp, err } return r, resp, nil } // ListUserRepos lists repositories that are accessible // to the authenticated user for an installation. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#list-repositories-accessible-to-the-user-access-token func (s *AppsService) ListUserRepos(ctx context.Context, id int64, opts *ListOptions) (*ListRepositories, *Response, error) { u := fmt.Sprintf("user/installations/%v/repositories", id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. acceptHeaders := []string{ mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview, mediaTypeRepositoryTemplatePreview, } req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) var r *ListRepositories resp, err := s.client.Do(ctx, req, &r) if err != nil { return nil, resp, err } return r, resp, nil } // AddRepository adds a single repository to an installation. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#add-a-repository-to-an-app-installation func (s *AppsService) AddRepository(ctx context.Context, instID, repoID int64) (*Repository, *Response, error) { u := fmt.Sprintf("user/installations/%v/repositories/%v", instID, repoID) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, nil, err } r := new(Repository) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // RemoveRepository removes a single repository from an installation. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#remove-a-repository-from-an-app-installation func (s *AppsService) RemoveRepository(ctx context.Context, instID, repoID int64) (*Response, error) { u := fmt.Sprintf("user/installations/%v/repositories/%v", instID, repoID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // RevokeInstallationToken revokes an installation token. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#revoke-an-installation-access-token func (s *AppsService) RevokeInstallationToken(ctx context.Context) (*Response, error) { u := "installation/token" req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/apps_installation_test.go000066400000000000000000000130741410475703100220730ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" "net/http" "strings" "testing" "github.com/google/go-cmp/cmp" ) func TestAppsService_ListRepos(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{ mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview, mediaTypeRepositoryTemplatePreview, } mux.HandleFunc("/installation/repositories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) testFormValues(t, r, values{ "page": "1", "per_page": "2", }) fmt.Fprint(w, `{"total_count": 1,"repositories": [{"id": 1}]}`) }) opt := &ListOptions{Page: 1, PerPage: 2} ctx := context.Background() repositories, _, err := client.Apps.ListRepos(ctx, opt) if err != nil { t.Errorf("Apps.ListRepos returned error: %v", err) } want := &ListRepositories{TotalCount: Int(1), Repositories: []*Repository{{ID: Int64(1)}}} if !cmp.Equal(repositories, want) { t.Errorf("Apps.ListRepos returned %+v, want %+v", repositories, want) } const methodName = "ListRepos" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.ListRepos(ctx, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_ListUserRepos(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{ mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview, mediaTypeRepositoryTemplatePreview, } mux.HandleFunc("/user/installations/1/repositories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) testFormValues(t, r, values{ "page": "1", "per_page": "2", }) fmt.Fprint(w, `{"total_count":1,"repositories": [{"id":1}]}`) }) opt := &ListOptions{Page: 1, PerPage: 2} ctx := context.Background() repositories, _, err := client.Apps.ListUserRepos(ctx, 1, opt) if err != nil { t.Errorf("Apps.ListUserRepos returned error: %v", err) } want := &ListRepositories{TotalCount: Int(1), Repositories: []*Repository{{ID: Int64(1)}}} if !cmp.Equal(repositories, want) { t.Errorf("Apps.ListUserRepos returned %+v, want %+v", repositories, want) } const methodName = "ListUserRepos" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.ListUserRepos(ctx, -1, &ListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.ListUserRepos(ctx, 1, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_AddRepository(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/installations/1/repositories/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") fmt.Fprint(w, `{"id":1,"name":"n","description":"d","owner":{"login":"l"},"license":{"key":"mit"}}`) }) ctx := context.Background() repo, _, err := client.Apps.AddRepository(ctx, 1, 1) if err != nil { t.Errorf("Apps.AddRepository returned error: %v", err) } want := &Repository{ID: Int64(1), Name: String("n"), Description: String("d"), Owner: &User{Login: String("l")}, License: &License{Key: String("mit")}} if !cmp.Equal(repo, want) { t.Errorf("AddRepository returned %+v, want %+v", repo, want) } const methodName = "AddRepository" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.AddRepository(ctx, 1, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_RemoveRepository(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/installations/1/repositories/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Apps.RemoveRepository(ctx, 1, 1) if err != nil { t.Errorf("Apps.RemoveRepository returned error: %v", err) } const methodName = "RemoveRepository" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Apps.RemoveRepository(ctx, 1, 1) }) } func TestAppsService_RevokeInstallationToken(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/installation/token", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Apps.RevokeInstallationToken(ctx) if err != nil { t.Errorf("Apps.RevokeInstallationToken returned error: %v", err) } const methodName = "RevokeInstallationToken" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Apps.RevokeInstallationToken(ctx) }) } func TestListRepositories_Marshal(t *testing.T) { testJSONMarshal(t, &ListRepositories{}, "{}") u := &ListRepositories{ TotalCount: Int(1), Repositories: []*Repository{ { ID: Int64(1), URL: String("u"), Name: String("n"), }, }, } want := `{ "total_count": 1, "repositories": [{ "id":1, "name":"n", "url":"u" }] }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/apps_manifest.go000066400000000000000000000032011410475703100201300ustar00rootroot00000000000000// Copyright 2019 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 ( "context" "fmt" ) // AppConfig describes the configuration of a GitHub App. type AppConfig struct { ID *int64 `json:"id,omitempty"` Slug *string `json:"slug,omitempty"` NodeID *string `json:"node_id,omitempty"` Owner *User `json:"owner,omitempty"` Name *string `json:"name,omitempty"` Description *string `json:"description,omitempty"` ExternalURL *string `json:"external_url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` ClientID *string `json:"client_id,omitempty"` ClientSecret *string `json:"client_secret,omitempty"` WebhookSecret *string `json:"webhook_secret,omitempty"` PEM *string `json:"pem,omitempty"` } // CompleteAppManifest completes the App manifest handshake flow for the given // code. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#create-a-github-app-from-a-manifest func (s *AppsService) CompleteAppManifest(ctx context.Context, code string) (*AppConfig, *Response, error) { u := fmt.Sprintf("app-manifests/%s/conversions", code) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, nil, err } cfg := new(AppConfig) resp, err := s.client.Do(ctx, req, cfg) if err != nil { return nil, resp, err } return cfg, resp, nil } go-github-38.1.0/github/apps_manifest_test.go000066400000000000000000000065231410475703100212010ustar00rootroot00000000000000// Copyright 2019 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) const ( manifestJSON = `{ "id": 1, "client_id": "a" , "client_secret": "b", "webhook_secret": "c", "pem": "key" } ` ) func TestGetConfig(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/app-manifests/code/conversions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, manifestJSON) }) ctx := context.Background() cfg, _, err := client.Apps.CompleteAppManifest(ctx, "code") if err != nil { t.Errorf("AppManifest.GetConfig returned error: %v", err) } want := &AppConfig{ ID: Int64(1), ClientID: String("a"), ClientSecret: String("b"), WebhookSecret: String("c"), PEM: String("key"), } if !cmp.Equal(cfg, want) { t.Errorf("GetConfig returned %+v, want %+v", cfg, want) } const methodName = "CompleteAppManifest" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.CompleteAppManifest(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.CompleteAppManifest(ctx, "code") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppConfig_Marshal(t *testing.T) { testJSONMarshal(t, &AppConfig{}, "{}") u := &AppConfig{ ID: Int64(1), Slug: String("s"), NodeID: String("nid"), Owner: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Name: String("n"), Description: String("d"), ExternalURL: String("eu"), HTMLURL: String("hu"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, ClientID: String("ci"), ClientSecret: String("cs"), WebhookSecret: String("ws"), PEM: String("pem"), } want := `{ "id": 1, "slug": "s", "node_id": "nid", "owner": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "name": "n", "description": "d", "external_url": "eu", "html_url": "hu", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "client_id": "ci", "client_secret": "cs", "webhook_secret": "ws", "pem": "pem" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/apps_marketplace.go000066400000000000000000000151661410475703100206270ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "fmt" ) // MarketplaceService handles communication with the marketplace related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps#marketplace type MarketplaceService struct { client *Client // Stubbed controls whether endpoints that return stubbed data are used // instead of production endpoints. Stubbed data is fake data that's useful // for testing your GitHub Apps. Stubbed data is hard-coded and will not // change based on actual subscriptions. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps#testing-with-stubbed-endpoints Stubbed bool } // MarketplacePlan represents a GitHub Apps Marketplace Listing Plan. type MarketplacePlan struct { URL *string `json:"url,omitempty"` AccountsURL *string `json:"accounts_url,omitempty"` ID *int64 `json:"id,omitempty"` Number *int `json:"number,omitempty"` Name *string `json:"name,omitempty"` Description *string `json:"description,omitempty"` MonthlyPriceInCents *int `json:"monthly_price_in_cents,omitempty"` YearlyPriceInCents *int `json:"yearly_price_in_cents,omitempty"` // The pricing model for this listing. Can be one of "flat-rate", "per-unit", or "free". PriceModel *string `json:"price_model,omitempty"` UnitName *string `json:"unit_name,omitempty"` Bullets *[]string `json:"bullets,omitempty"` // State can be one of the values "draft" or "published". State *string `json:"state,omitempty"` HasFreeTrial *bool `json:"has_free_trial,omitempty"` } // MarketplacePurchase represents a GitHub Apps Marketplace Purchase. type MarketplacePurchase struct { // BillingCycle can be one of the values "yearly", "monthly" or nil. BillingCycle *string `json:"billing_cycle,omitempty"` NextBillingDate *Timestamp `json:"next_billing_date,omitempty"` UnitCount *int `json:"unit_count,omitempty"` Plan *MarketplacePlan `json:"plan,omitempty"` OnFreeTrial *bool `json:"on_free_trial,omitempty"` FreeTrialEndsOn *Timestamp `json:"free_trial_ends_on,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` } // MarketplacePendingChange represents a pending change to a GitHub Apps Marketplace Plan. type MarketplacePendingChange struct { EffectiveDate *Timestamp `json:"effective_date,omitempty"` UnitCount *int `json:"unit_count,omitempty"` ID *int64 `json:"id,omitempty"` Plan *MarketplacePlan `json:"plan,omitempty"` } // MarketplacePlanAccount represents a GitHub Account (user or organization) on a specific plan. type MarketplacePlanAccount struct { URL *string `json:"url,omitempty"` Type *string `json:"type,omitempty"` ID *int64 `json:"id,omitempty"` Login *string `json:"login,omitempty"` OrganizationBillingEmail *string `json:"organization_billing_email,omitempty"` MarketplacePurchase *MarketplacePurchase `json:"marketplace_purchase,omitempty"` MarketplacePendingChange *MarketplacePendingChange `json:"marketplace_pending_change,omitempty"` } // ListPlans lists all plans for your Marketplace listing. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps#list-plans func (s *MarketplaceService) ListPlans(ctx context.Context, opts *ListOptions) ([]*MarketplacePlan, *Response, error) { uri := s.marketplaceURI("plans") u, err := addOptions(uri, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var plans []*MarketplacePlan resp, err := s.client.Do(ctx, req, &plans) if err != nil { return nil, resp, err } return plans, resp, nil } // ListPlanAccountsForPlan lists all GitHub accounts (user or organization) on a specific plan. // // GitHub API docs: https://docs.github.com/en/rest/reference/apps#list-accounts-for-a-plan func (s *MarketplaceService) ListPlanAccountsForPlan(ctx context.Context, planID int64, opts *ListOptions) ([]*MarketplacePlanAccount, *Response, error) { uri := s.marketplaceURI(fmt.Sprintf("plans/%v/accounts", planID)) u, err := addOptions(uri, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var accounts []*MarketplacePlanAccount resp, err := s.client.Do(ctx, req, &accounts) if err != nil { return nil, resp, err } return accounts, resp, nil } // GetPlanAccountForAccount get GitHub account (user or organization) associated with an account. // // GitHub API docs: https://docs.github.com/en/rest/reference/apps#get-a-subscription-plan-for-an-account func (s *MarketplaceService) GetPlanAccountForAccount(ctx context.Context, accountID int64) (*MarketplacePlanAccount, *Response, error) { uri := s.marketplaceURI(fmt.Sprintf("accounts/%v", accountID)) req, err := s.client.NewRequest("GET", uri, nil) if err != nil { return nil, nil, err } var account *MarketplacePlanAccount resp, err := s.client.Do(ctx, req, &account) if err != nil { return nil, resp, err } return account, resp, nil } // ListMarketplacePurchasesForUser lists all GitHub marketplace purchases made by a user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#list-subscriptions-for-the-authenticated-user-stubbed // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#list-subscriptions-for-the-authenticated-user func (s *MarketplaceService) ListMarketplacePurchasesForUser(ctx context.Context, opts *ListOptions) ([]*MarketplacePurchase, *Response, error) { uri := "user/marketplace_purchases" if s.Stubbed { uri = "user/marketplace_purchases/stubbed" } u, err := addOptions(uri, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var purchases []*MarketplacePurchase resp, err := s.client.Do(ctx, req, &purchases) if err != nil { return nil, resp, err } return purchases, resp, nil } func (s *MarketplaceService) marketplaceURI(endpoint string) string { url := "marketplace_listing" if s.Stubbed { url = "marketplace_listing/stubbed" } return url + "/" + endpoint } go-github-38.1.0/github/apps_marketplace_test.go000066400000000000000000000334351410475703100216650ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestMarketplaceService_ListPlans(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/marketplace_listing/plans", 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} client.Marketplace.Stubbed = false ctx := context.Background() plans, _, err := client.Marketplace.ListPlans(ctx, opt) if err != nil { t.Errorf("Marketplace.ListPlans returned error: %v", err) } want := []*MarketplacePlan{{ID: Int64(1)}} if !cmp.Equal(plans, want) { t.Errorf("Marketplace.ListPlans returned %+v, want %+v", plans, want) } const methodName = "ListPlans" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Marketplace.ListPlans(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMarketplaceService_Stubbed_ListPlans(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/marketplace_listing/stubbed/plans", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 1, PerPage: 2} client.Marketplace.Stubbed = true ctx := context.Background() plans, _, err := client.Marketplace.ListPlans(ctx, opt) if err != nil { t.Errorf("Marketplace.ListPlans (Stubbed) returned error: %v", err) } want := []*MarketplacePlan{{ID: Int64(1)}} if !cmp.Equal(plans, want) { t.Errorf("Marketplace.ListPlans (Stubbed) returned %+v, want %+v", plans, want) } } func TestMarketplaceService_ListPlanAccountsForPlan(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/marketplace_listing/plans/1/accounts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 1, PerPage: 2} client.Marketplace.Stubbed = false ctx := context.Background() accounts, _, err := client.Marketplace.ListPlanAccountsForPlan(ctx, 1, opt) if err != nil { t.Errorf("Marketplace.ListPlanAccountsForPlan returned error: %v", err) } want := []*MarketplacePlanAccount{{ID: Int64(1)}} if !cmp.Equal(accounts, want) { t.Errorf("Marketplace.ListPlanAccountsForPlan returned %+v, want %+v", accounts, want) } const methodName = "ListPlanAccountsForPlan" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Marketplace.ListPlanAccountsForPlan(ctx, 1, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMarketplaceService_Stubbed_ListPlanAccountsForPlan(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/marketplace_listing/stubbed/plans/1/accounts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 1, PerPage: 2} client.Marketplace.Stubbed = true ctx := context.Background() accounts, _, err := client.Marketplace.ListPlanAccountsForPlan(ctx, 1, opt) if err != nil { t.Errorf("Marketplace.ListPlanAccountsForPlan (Stubbed) returned error: %v", err) } want := []*MarketplacePlanAccount{{ID: Int64(1)}} if !cmp.Equal(accounts, want) { t.Errorf("Marketplace.ListPlanAccountsForPlan (Stubbed) returned %+v, want %+v", accounts, want) } } func TestMarketplaceService_GetPlanAccountForAccount(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/marketplace_listing/accounts/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "marketplace_pending_change": {"id": 77}}`) }) client.Marketplace.Stubbed = false ctx := context.Background() account, _, err := client.Marketplace.GetPlanAccountForAccount(ctx, 1) if err != nil { t.Errorf("Marketplace.GetPlanAccountForAccount returned error: %v", err) } want := &MarketplacePlanAccount{ID: Int64(1), MarketplacePendingChange: &MarketplacePendingChange{ID: Int64(77)}} if !cmp.Equal(account, want) { t.Errorf("Marketplace.GetPlanAccountForAccount returned %+v, want %+v", account, want) } const methodName = "GetPlanAccountForAccount" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Marketplace.GetPlanAccountForAccount(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMarketplaceService_Stubbed_GetPlanAccountForAccount(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/marketplace_listing/stubbed/accounts/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) client.Marketplace.Stubbed = true ctx := context.Background() account, _, err := client.Marketplace.GetPlanAccountForAccount(ctx, 1) if err != nil { t.Errorf("Marketplace.GetPlanAccountForAccount (Stubbed) returned error: %v", err) } want := &MarketplacePlanAccount{ID: Int64(1)} if !cmp.Equal(account, want) { t.Errorf("Marketplace.GetPlanAccountForAccount (Stubbed) returned %+v, want %+v", account, want) } } func TestMarketplaceService_ListMarketplacePurchasesForUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/marketplace_purchases", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"billing_cycle":"monthly"}]`) }) opt := &ListOptions{Page: 1, PerPage: 2} client.Marketplace.Stubbed = false ctx := context.Background() purchases, _, err := client.Marketplace.ListMarketplacePurchasesForUser(ctx, opt) if err != nil { t.Errorf("Marketplace.ListMarketplacePurchasesForUser returned error: %v", err) } want := []*MarketplacePurchase{{BillingCycle: String("monthly")}} if !cmp.Equal(purchases, want) { t.Errorf("Marketplace.ListMarketplacePurchasesForUser returned %+v, want %+v", purchases, want) } const methodName = "ListMarketplacePurchasesForUser" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Marketplace.ListMarketplacePurchasesForUser(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMarketplaceService_Stubbed_ListMarketplacePurchasesForUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/marketplace_purchases/stubbed", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"billing_cycle":"monthly"}]`) }) opt := &ListOptions{Page: 1, PerPage: 2} client.Marketplace.Stubbed = true ctx := context.Background() purchases, _, err := client.Marketplace.ListMarketplacePurchasesForUser(ctx, opt) if err != nil { t.Errorf("Marketplace.ListMarketplacePurchasesForUser returned error: %v", err) } want := []*MarketplacePurchase{{BillingCycle: String("monthly")}} if !cmp.Equal(purchases, want) { t.Errorf("Marketplace.ListMarketplacePurchasesForUser returned %+v, want %+v", purchases, want) } } func TestMarketplacePlan_Marshal(t *testing.T) { testJSONMarshal(t, &MarketplacePlan{}, "{}") u := &MarketplacePlan{ URL: String("u"), AccountsURL: String("au"), ID: Int64(1), Number: Int(1), Name: String("n"), Description: String("d"), MonthlyPriceInCents: Int(1), YearlyPriceInCents: Int(1), PriceModel: String("pm"), UnitName: String("un"), Bullets: &[]string{"b"}, State: String("s"), HasFreeTrial: Bool(false), } want := `{ "url": "u", "accounts_url": "au", "id": 1, "number": 1, "name": "n", "description": "d", "monthly_price_in_cents": 1, "yearly_price_in_cents": 1, "price_model": "pm", "unit_name": "un", "bullets": ["b"], "state": "s", "has_free_trial": false }` testJSONMarshal(t, u, want) } func TestMarketplacePurchase_Marshal(t *testing.T) { testJSONMarshal(t, &MarketplacePurchase{}, "{}") u := &MarketplacePurchase{ BillingCycle: String("bc"), NextBillingDate: &Timestamp{referenceTime}, UnitCount: Int(1), Plan: &MarketplacePlan{ URL: String("u"), AccountsURL: String("au"), ID: Int64(1), Number: Int(1), Name: String("n"), Description: String("d"), MonthlyPriceInCents: Int(1), YearlyPriceInCents: Int(1), PriceModel: String("pm"), UnitName: String("un"), Bullets: &[]string{"b"}, State: String("s"), HasFreeTrial: Bool(false), }, OnFreeTrial: Bool(false), FreeTrialEndsOn: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, } want := `{ "billing_cycle": "bc", "next_billing_date": ` + referenceTimeStr + `, "unit_count": 1, "plan": { "url": "u", "accounts_url": "au", "id": 1, "number": 1, "name": "n", "description": "d", "monthly_price_in_cents": 1, "yearly_price_in_cents": 1, "price_model": "pm", "unit_name": "un", "bullets": ["b"], "state": "s", "has_free_trial": false }, "on_free_trial": false, "free_trial_ends_on": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } func TestMarketplacePendingChange_Marshal(t *testing.T) { testJSONMarshal(t, &MarketplacePendingChange{}, "{}") u := &MarketplacePendingChange{ EffectiveDate: &Timestamp{referenceTime}, UnitCount: Int(1), ID: Int64(1), Plan: &MarketplacePlan{ URL: String("u"), AccountsURL: String("au"), ID: Int64(1), Number: Int(1), Name: String("n"), Description: String("d"), MonthlyPriceInCents: Int(1), YearlyPriceInCents: Int(1), PriceModel: String("pm"), UnitName: String("un"), Bullets: &[]string{"b"}, State: String("s"), HasFreeTrial: Bool(false), }, } want := `{ "effective_date": ` + referenceTimeStr + `, "unit_count": 1, "id": 1, "plan": { "url": "u", "accounts_url": "au", "id": 1, "number": 1, "name": "n", "description": "d", "monthly_price_in_cents": 1, "yearly_price_in_cents": 1, "price_model": "pm", "unit_name": "un", "bullets": ["b"], "state": "s", "has_free_trial": false } }` testJSONMarshal(t, u, want) } func TestMarketplacePlanAccount_Marshal(t *testing.T) { testJSONMarshal(t, &MarketplacePlanAccount{}, "{}") u := &MarketplacePlanAccount{ URL: String("u"), Type: String("t"), ID: Int64(1), Login: String("l"), OrganizationBillingEmail: String("obe"), MarketplacePurchase: &MarketplacePurchase{ BillingCycle: String("bc"), NextBillingDate: &Timestamp{referenceTime}, UnitCount: Int(1), Plan: &MarketplacePlan{ URL: String("u"), AccountsURL: String("au"), ID: Int64(1), Number: Int(1), Name: String("n"), Description: String("d"), MonthlyPriceInCents: Int(1), YearlyPriceInCents: Int(1), PriceModel: String("pm"), UnitName: String("un"), Bullets: &[]string{"b"}, State: String("s"), HasFreeTrial: Bool(false), }, OnFreeTrial: Bool(false), FreeTrialEndsOn: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, }, MarketplacePendingChange: &MarketplacePendingChange{ EffectiveDate: &Timestamp{referenceTime}, UnitCount: Int(1), ID: Int64(1), Plan: &MarketplacePlan{ URL: String("u"), AccountsURL: String("au"), ID: Int64(1), Number: Int(1), Name: String("n"), Description: String("d"), MonthlyPriceInCents: Int(1), YearlyPriceInCents: Int(1), PriceModel: String("pm"), UnitName: String("un"), Bullets: &[]string{"b"}, State: String("s"), HasFreeTrial: Bool(false), }, }, } want := `{ "url": "u", "type": "t", "id": 1, "login": "l", "organization_billing_email": "obe", "marketplace_purchase": { "billing_cycle": "bc", "next_billing_date": ` + referenceTimeStr + `, "unit_count": 1, "plan": { "url": "u", "accounts_url": "au", "id": 1, "number": 1, "name": "n", "description": "d", "monthly_price_in_cents": 1, "yearly_price_in_cents": 1, "price_model": "pm", "unit_name": "un", "bullets": ["b"], "state": "s", "has_free_trial": false }, "on_free_trial": false, "free_trial_ends_on": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` }, "marketplace_pending_change": { "effective_date": ` + referenceTimeStr + `, "unit_count": 1, "id": 1, "plan": { "url": "u", "accounts_url": "au", "id": 1, "number": 1, "name": "n", "description": "d", "monthly_price_in_cents": 1, "yearly_price_in_cents": 1, "price_model": "pm", "unit_name": "un", "bullets": ["b"], "state": "s", "has_free_trial": false } } }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/apps_test.go000066400000000000000000001147021410475703100173120ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestAppsService_Get_authenticatedApp(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/app", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() app, _, err := client.Apps.Get(ctx, "") if err != nil { t.Errorf("Apps.Get returned error: %v", err) } want := &App{ID: Int64(1)} if !cmp.Equal(app, want) { t.Errorf("Apps.Get returned %+v, want %+v", app, want) } const methodName = "Get" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.Get(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.Get(ctx, "") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_Get_specifiedApp(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/apps/a", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"html_url":"https://github.com/apps/a"}`) }) ctx := context.Background() app, _, err := client.Apps.Get(ctx, "a") if err != nil { t.Errorf("Apps.Get returned error: %v", err) } want := &App{HTMLURL: String("https://github.com/apps/a")} if !cmp.Equal(app, want) { t.Errorf("Apps.Get returned %+v, want %+v", *app.HTMLURL, *want.HTMLURL) } } func TestAppsService_ListInstallations(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/app/installations", 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, "app_id":1, "target_id":1, "target_type": "Organization", "permissions": { "actions": "read", "administration": "read", "checks": "read", "contents": "read", "content_references": "read", "deployments": "read", "environments": "read", "issues": "write", "metadata": "read", "members": "read", "organization_administration": "write", "organization_hooks": "write", "organization_plan": "read", "organization_pre_receive_hooks": "write", "organization_projects": "read", "organization_secrets": "read", "organization_self_hosted_runners": "read", "organization_user_blocking": "write", "packages": "read", "pages": "read", "pull_requests": "write", "repository_hooks": "write", "repository_projects": "read", "repository_pre_receive_hooks": "read", "secrets": "read", "secret_scanning_alerts": "read", "security_events": "read", "single_file": "write", "statuses": "write", "team_discussions": "read", "vulnerability_alerts": "read", "workflows": "write" }, "events": [ "push", "pull_request" ], "single_file_name": "config.yml", "repository_selection": "selected", "created_at": "2018-01-01T00:00:00Z", "updated_at": "2018-01-01T00:00:00Z"}]`, ) }) opt := &ListOptions{Page: 1, PerPage: 2} ctx := context.Background() installations, _, err := client.Apps.ListInstallations(ctx, opt) if err != nil { t.Errorf("Apps.ListInstallations returned error: %v", err) } date := Timestamp{Time: time.Date(2018, time.January, 1, 0, 0, 0, 0, time.UTC)} want := []*Installation{{ ID: Int64(1), AppID: Int64(1), TargetID: Int64(1), TargetType: String("Organization"), SingleFileName: String("config.yml"), RepositorySelection: String("selected"), Permissions: &InstallationPermissions{ Actions: String("read"), Administration: String("read"), Checks: String("read"), Contents: String("read"), ContentReferences: String("read"), Deployments: String("read"), Environments: String("read"), Issues: String("write"), Metadata: String("read"), Members: String("read"), OrganizationAdministration: String("write"), OrganizationHooks: String("write"), OrganizationPlan: String("read"), OrganizationPreReceiveHooks: String("write"), OrganizationProjects: String("read"), OrganizationSecrets: String("read"), OrganizationSelfHostedRunners: String("read"), OrganizationUserBlocking: String("write"), Packages: String("read"), Pages: String("read"), PullRequests: String("write"), RepositoryHooks: String("write"), RepositoryProjects: String("read"), RepositoryPreReceiveHooks: String("read"), Secrets: String("read"), SecretScanningAlerts: String("read"), SecurityEvents: String("read"), SingleFile: String("write"), Statuses: String("write"), TeamDiscussions: String("read"), VulnerabilityAlerts: String("read"), Workflows: String("write")}, Events: []string{"push", "pull_request"}, CreatedAt: &date, UpdatedAt: &date, }} if !cmp.Equal(installations, want) { t.Errorf("Apps.ListInstallations returned %+v, want %+v", installations, want) } const methodName = "ListInstallations" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.ListInstallations(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_GetInstallation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/app/installations/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "Organization"}`) }) ctx := context.Background() installation, _, err := client.Apps.GetInstallation(ctx, 1) if err != nil { t.Errorf("Apps.GetInstallation returned error: %v", err) } want := &Installation{ID: Int64(1), AppID: Int64(1), TargetID: Int64(1), TargetType: String("Organization")} if !cmp.Equal(installation, want) { t.Errorf("Apps.GetInstallation returned %+v, want %+v", installation, want) } const methodName = "GetInstallation" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.GetInstallation(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.GetInstallation(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_ListUserInstallations(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/installations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "1", "per_page": "2", }) fmt.Fprint(w, `{"installations":[{"id":1, "app_id":1, "target_id":1, "target_type": "Organization"}]}`) }) opt := &ListOptions{Page: 1, PerPage: 2} ctx := context.Background() installations, _, err := client.Apps.ListUserInstallations(ctx, opt) if err != nil { t.Errorf("Apps.ListUserInstallations returned error: %v", err) } want := []*Installation{{ID: Int64(1), AppID: Int64(1), TargetID: Int64(1), TargetType: String("Organization")}} if !cmp.Equal(installations, want) { t.Errorf("Apps.ListUserInstallations returned %+v, want %+v", installations, want) } const methodName = "ListUserInstallations" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.ListUserInstallations(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_SuspendInstallation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/app/installations/1/suspended", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Apps.SuspendInstallation(ctx, 1); err != nil { t.Errorf("Apps.SuspendInstallation returned error: %v", err) } const methodName = "SuspendInstallation" testBadOptions(t, methodName, func() (err error) { _, err = client.Apps.SuspendInstallation(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Apps.SuspendInstallation(ctx, 1) }) } func TestAppsService_UnsuspendInstallation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/app/installations/1/suspended", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Apps.UnsuspendInstallation(ctx, 1); err != nil { t.Errorf("Apps.UnsuspendInstallation returned error: %v", err) } const methodName = "UnsuspendInstallation" testBadOptions(t, methodName, func() (err error) { _, err = client.Apps.UnsuspendInstallation(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Apps.UnsuspendInstallation(ctx, 1) }) } func TestAppsService_DeleteInstallation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/app/installations/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Apps.DeleteInstallation(ctx, 1) if err != nil { t.Errorf("Apps.DeleteInstallation returned error: %v", err) } const methodName = "DeleteInstallation" testBadOptions(t, methodName, func() (err error) { _, err = client.Apps.DeleteInstallation(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Apps.DeleteInstallation(ctx, 1) }) } func TestAppsService_CreateInstallationToken(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/app/installations/1/access_tokens", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"token":"t"}`) }) ctx := context.Background() token, _, err := client.Apps.CreateInstallationToken(ctx, 1, nil) if err != nil { t.Errorf("Apps.CreateInstallationToken returned error: %v", err) } want := &InstallationToken{Token: String("t")} if !cmp.Equal(token, want) { t.Errorf("Apps.CreateInstallationToken returned %+v, want %+v", token, want) } const methodName = "CreateInstallationToken" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.CreateInstallationToken(ctx, -1, nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.CreateInstallationToken(ctx, 1, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_CreateInstallationTokenWithOptions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() installationTokenOptions := &InstallationTokenOptions{ RepositoryIDs: []int64{1234}, Permissions: &InstallationPermissions{ Contents: String("write"), Issues: String("read"), }, } mux.HandleFunc("/app/installations/1/access_tokens", func(w http.ResponseWriter, r *http.Request) { v := new(InstallationTokenOptions) json.NewDecoder(r.Body).Decode(v) if !cmp.Equal(v, installationTokenOptions) { t.Errorf("request sent %+v, want %+v", v, installationTokenOptions) } testMethod(t, r, "POST") fmt.Fprint(w, `{"token":"t"}`) }) ctx := context.Background() token, _, err := client.Apps.CreateInstallationToken(ctx, 1, installationTokenOptions) if err != nil { t.Errorf("Apps.CreateInstallationToken returned error: %v", err) } want := &InstallationToken{Token: String("t")} if !cmp.Equal(token, want) { t.Errorf("Apps.CreateInstallationToken returned %+v, want %+v", token, want) } } func TestAppsService_CreateAttachement(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/content_references/11/attachments", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeContentAttachmentsPreview) w.WriteHeader(http.StatusOK) w.Write([]byte(`{"id":1,"title":"title1","body":"body1"}`)) }) ctx := context.Background() got, _, err := client.Apps.CreateAttachment(ctx, 11, "title1", "body1") if err != nil { t.Errorf("CreateAttachment returned error: %v", err) } want := &Attachment{ID: Int64(1), Title: String("title1"), Body: String("body1")} if !cmp.Equal(got, want) { t.Errorf("CreateAttachment = %+v, want %+v", got, want) } const methodName = "CreateAttachment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.CreateAttachment(ctx, -11, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.CreateAttachment(ctx, 11, "title1", "body1") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_FindOrganizationInstallation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/installation", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "Organization"}`) }) ctx := context.Background() installation, _, err := client.Apps.FindOrganizationInstallation(ctx, "o") if err != nil { t.Errorf("Apps.FindOrganizationInstallation returned error: %v", err) } want := &Installation{ID: Int64(1), AppID: Int64(1), TargetID: Int64(1), TargetType: String("Organization")} if !cmp.Equal(installation, want) { t.Errorf("Apps.FindOrganizationInstallation returned %+v, want %+v", installation, want) } const methodName = "FindOrganizationInstallation" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.FindOrganizationInstallation(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.FindOrganizationInstallation(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_FindRepositoryInstallation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/installation", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "Organization"}`) }) ctx := context.Background() installation, _, err := client.Apps.FindRepositoryInstallation(ctx, "o", "r") if err != nil { t.Errorf("Apps.FindRepositoryInstallation returned error: %v", err) } want := &Installation{ID: Int64(1), AppID: Int64(1), TargetID: Int64(1), TargetType: String("Organization")} if !cmp.Equal(installation, want) { t.Errorf("Apps.FindRepositoryInstallation returned %+v, want %+v", installation, want) } const methodName = "FindRepositoryInstallation" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.FindRepositoryInstallation(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.FindRepositoryInstallation(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_FindRepositoryInstallationByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/installation", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "Organization"}`) }) ctx := context.Background() installation, _, err := client.Apps.FindRepositoryInstallationByID(ctx, 1) if err != nil { t.Errorf("Apps.FindRepositoryInstallationByID returned error: %v", err) } want := &Installation{ID: Int64(1), AppID: Int64(1), TargetID: Int64(1), TargetType: String("Organization")} if !cmp.Equal(installation, want) { t.Errorf("Apps.FindRepositoryInstallationByID returned %+v, want %+v", installation, want) } const methodName = "FindRepositoryInstallationByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.FindRepositoryInstallationByID(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.FindRepositoryInstallationByID(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_FindUserInstallation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/installation", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "app_id":1, "target_id":1, "target_type": "User"}`) }) ctx := context.Background() installation, _, err := client.Apps.FindUserInstallation(ctx, "u") if err != nil { t.Errorf("Apps.FindUserInstallation returned error: %v", err) } want := &Installation{ID: Int64(1), AppID: Int64(1), TargetID: Int64(1), TargetType: String("User")} if !cmp.Equal(installation, want) { t.Errorf("Apps.FindUserInstallation returned %+v, want %+v", installation, want) } const methodName = "FindUserInstallation" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.FindUserInstallation(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.FindUserInstallation(ctx, "u") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestContentReference_Marshal(t *testing.T) { testJSONMarshal(t, &ContentReference{}, "{}") u := &ContentReference{ ID: Int64(1), NodeID: String("nid"), Reference: String("r"), } want := `{ "id": 1, "node_id": "nid", "reference": "r" }` testJSONMarshal(t, u, want) } func TestAttachment_Marshal(t *testing.T) { testJSONMarshal(t, &Attachment{}, "{}") u := &Attachment{ ID: Int64(1), Title: String("t"), Body: String("b"), } want := `{ "id": 1, "title": "t", "body": "b" }` testJSONMarshal(t, u, want) } func TestInstallationPermissions_Marshal(t *testing.T) { testJSONMarshal(t, &InstallationPermissions{}, "{}") u := &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), } want := `{ "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts":"va", "workflows": "w" }` testJSONMarshal(t, u, want) } func TestInstallation_Marshal(t *testing.T) { testJSONMarshal(t, &Installation{}, "{}") u := &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, } want := `{ "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } func TestInstallationTokenOptions_Marshal(t *testing.T) { testJSONMarshal(t, &InstallationTokenOptions{}, "{}") u := &InstallationTokenOptions{ RepositoryIDs: []int64{1}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, } want := `{ "repository_ids": [1], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" } }` testJSONMarshal(t, u, want) } func TestInstallationToken_Marshal(t *testing.T) { testJSONMarshal(t, &InstallationToken{}, "{}") u := &InstallationToken{ Token: String("t"), ExpiresAt: &referenceTime, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, Repositories: []*Repository{ { ID: Int64(1), URL: String("u"), Name: String("n"), }, }, } want := `{ "token": "t", "expires_at": ` + referenceTimeStr + `, "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "repositories": [ { "id": 1, "url": "u", "name": "n" } ] }` testJSONMarshal(t, u, want) } func TestApp_Marshal(t *testing.T) { testJSONMarshal(t, &App{}, "{}") u := &App{ ID: Int64(1), Slug: String("s"), NodeID: String("nid"), Owner: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Name: String("n"), Description: String("d"), ExternalURL: String("eu"), HTMLURL: String("hu"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, Events: []string{"s"}, } want := `{ "id": 1, "slug": "s", "node_id": "nid", "owner": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "name": "n", "description": "d", "external_url": "eu", "html_url": "hu", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "events": ["s"] }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/authorizations.go000066400000000000000000000235701410475703100203750ustar00rootroot00000000000000// Copyright 2015 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 ( "context" "fmt" ) // Scope models a GitHub authorization scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/oauth/#scopes type Scope string // This is the set of scopes for GitHub API V3 const ( ScopeNone Scope = "(no scope)" // REVISIT: is this actually returned, or just a documentation artifact? ScopeUser Scope = "user" ScopeUserEmail Scope = "user:email" ScopeUserFollow Scope = "user:follow" ScopePublicRepo Scope = "public_repo" ScopeRepo Scope = "repo" ScopeRepoDeployment Scope = "repo_deployment" ScopeRepoStatus Scope = "repo:status" ScopeDeleteRepo Scope = "delete_repo" ScopeNotifications Scope = "notifications" ScopeGist Scope = "gist" ScopeReadRepoHook Scope = "read:repo_hook" ScopeWriteRepoHook Scope = "write:repo_hook" ScopeAdminRepoHook Scope = "admin:repo_hook" ScopeAdminOrgHook Scope = "admin:org_hook" ScopeReadOrg Scope = "read:org" ScopeWriteOrg Scope = "write:org" ScopeAdminOrg Scope = "admin:org" ScopeReadPublicKey Scope = "read:public_key" ScopeWritePublicKey Scope = "write:public_key" ScopeAdminPublicKey Scope = "admin:public_key" ScopeReadGPGKey Scope = "read:gpg_key" ScopeWriteGPGKey Scope = "write:gpg_key" ScopeAdminGPGKey Scope = "admin:gpg_key" ScopeSecurityEvents Scope = "security_events" ) // AuthorizationsService handles communication with the authorization related // methods of the GitHub API. // // This service requires HTTP Basic Authentication; it cannot be accessed using // an OAuth token. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/oauth_authorizations/ type AuthorizationsService service // Authorization represents an individual GitHub authorization. type Authorization struct { ID *int64 `json:"id,omitempty"` URL *string `json:"url,omitempty"` Scopes []Scope `json:"scopes,omitempty"` Token *string `json:"token,omitempty"` TokenLastEight *string `json:"token_last_eight,omitempty"` HashedToken *string `json:"hashed_token,omitempty"` App *AuthorizationApp `json:"app,omitempty"` Note *string `json:"note,omitempty"` NoteURL *string `json:"note_url,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` Fingerprint *string `json:"fingerprint,omitempty"` // User is only populated by the Check and Reset methods. User *User `json:"user,omitempty"` } func (a Authorization) String() string { return Stringify(a) } // AuthorizationApp represents an individual GitHub app (in the context of authorization). type AuthorizationApp struct { URL *string `json:"url,omitempty"` Name *string `json:"name,omitempty"` ClientID *string `json:"client_id,omitempty"` } func (a AuthorizationApp) String() string { return Stringify(a) } // Grant represents an OAuth application that has been granted access to an account. type Grant struct { ID *int64 `json:"id,omitempty"` URL *string `json:"url,omitempty"` App *AuthorizationApp `json:"app,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` Scopes []string `json:"scopes,omitempty"` } func (g Grant) String() string { return Stringify(g) } // AuthorizationRequest represents a request to create an authorization. type AuthorizationRequest struct { Scopes []Scope `json:"scopes,omitempty"` Note *string `json:"note,omitempty"` NoteURL *string `json:"note_url,omitempty"` ClientID *string `json:"client_id,omitempty"` ClientSecret *string `json:"client_secret,omitempty"` Fingerprint *string `json:"fingerprint,omitempty"` } func (a AuthorizationRequest) String() string { return Stringify(a) } // AuthorizationUpdateRequest represents a request to update an authorization. // // Note that for any one update, you must only provide one of the "scopes" // fields. That is, you may provide only one of "Scopes", or "AddScopes", or // "RemoveScopes". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/oauth_authorizations/#update-an-existing-authorization type AuthorizationUpdateRequest struct { Scopes []string `json:"scopes,omitempty"` AddScopes []string `json:"add_scopes,omitempty"` RemoveScopes []string `json:"remove_scopes,omitempty"` Note *string `json:"note,omitempty"` NoteURL *string `json:"note_url,omitempty"` Fingerprint *string `json:"fingerprint,omitempty"` } func (a AuthorizationUpdateRequest) String() string { return Stringify(a) } // Check if an OAuth token is valid for a specific app. // // Note that this operation requires the use of BasicAuth, but where the // username is the OAuth application clientID, and the password is its // clientSecret. Invalid tokens will return a 404 Not Found. // // The returned Authorization.User field will be populated. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#check-a-token func (s *AuthorizationsService) Check(ctx context.Context, clientID, accessToken string) (*Authorization, *Response, error) { u := fmt.Sprintf("applications/%v/token", clientID) reqBody := &struct { AccessToken string `json:"access_token"` }{AccessToken: accessToken} req, err := s.client.NewRequest("POST", u, reqBody) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeOAuthAppPreview) a := new(Authorization) resp, err := s.client.Do(ctx, req, a) if err != nil { return nil, resp, err } return a, resp, nil } // Reset is used to reset a valid OAuth token without end user involvement. // Applications must save the "token" property in the response, because changes // take effect immediately. // // Note that this operation requires the use of BasicAuth, but where the // username is the OAuth application clientID, and the password is its // clientSecret. Invalid tokens will return a 404 Not Found. // // The returned Authorization.User field will be populated. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#reset-a-token func (s *AuthorizationsService) Reset(ctx context.Context, clientID, accessToken string) (*Authorization, *Response, error) { u := fmt.Sprintf("applications/%v/token", clientID) reqBody := &struct { AccessToken string `json:"access_token"` }{AccessToken: accessToken} req, err := s.client.NewRequest("PATCH", u, reqBody) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeOAuthAppPreview) a := new(Authorization) resp, err := s.client.Do(ctx, req, a) if err != nil { return nil, resp, err } return a, resp, nil } // Revoke an authorization for an application. // // Note that this operation requires the use of BasicAuth, but where the // username is the OAuth application clientID, and the password is its // clientSecret. Invalid tokens will return a 404 Not Found. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#delete-an-app-token func (s *AuthorizationsService) Revoke(ctx context.Context, clientID, accessToken string) (*Response, error) { u := fmt.Sprintf("applications/%v/token", clientID) reqBody := &struct { AccessToken string `json:"access_token"` }{AccessToken: accessToken} req, err := s.client.NewRequest("DELETE", u, reqBody) if err != nil { return nil, err } req.Header.Set("Accept", mediaTypeOAuthAppPreview) return s.client.Do(ctx, req, nil) } // DeleteGrant deletes an OAuth application grant. Deleting an application's // grant will also delete all OAuth tokens associated with the application for // the user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/apps/#delete-an-app-authorization func (s *AuthorizationsService) DeleteGrant(ctx context.Context, clientID, accessToken string) (*Response, error) { u := fmt.Sprintf("applications/%v/grant", clientID) reqBody := &struct { AccessToken string `json:"access_token"` }{AccessToken: accessToken} req, err := s.client.NewRequest("DELETE", u, reqBody) if err != nil { return nil, err } req.Header.Set("Accept", mediaTypeOAuthAppPreview) return s.client.Do(ctx, req, nil) } // CreateImpersonation creates an impersonation OAuth token. // // This requires admin permissions. With the returned Authorization.Token // you can e.g. create or delete a user's public SSH key. NOTE: creating a // new token automatically revokes an existing one. // // GitHub API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#create-an-impersonation-oauth-token func (s *AuthorizationsService) CreateImpersonation(ctx context.Context, username string, authReq *AuthorizationRequest) (*Authorization, *Response, error) { u := fmt.Sprintf("admin/users/%v/authorizations", username) req, err := s.client.NewRequest("POST", u, authReq) if err != nil { return nil, nil, err } a := new(Authorization) resp, err := s.client.Do(ctx, req, a) if err != nil { return nil, resp, err } return a, resp, nil } // DeleteImpersonation deletes an impersonation OAuth token. // // NOTE: there can be only one at a time. // // GitHub API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#delete-an-impersonation-oauth-token func (s *AuthorizationsService) DeleteImpersonation(ctx context.Context, username string) (*Response, error) { u := fmt.Sprintf("admin/users/%v/authorizations", username) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/authorizations_test.go000066400000000000000000000233031410475703100214260ustar00rootroot00000000000000// Copyright 2015 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestAuthorizationsService_Check(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/applications/id/token", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testBody(t, r, `{"access_token":"a"}`+"\n") testHeader(t, r, "Accept", mediaTypeOAuthAppPreview) fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() got, _, err := client.Authorizations.Check(ctx, "id", "a") if err != nil { t.Errorf("Authorizations.Check returned error: %v", err) } want := &Authorization{ID: Int64(1)} if !cmp.Equal(got, want) { t.Errorf("Authorizations.Check returned auth %+v, want %+v", got, want) } const methodName = "Check" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Authorizations.Check(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Authorizations.Check(ctx, "id", "a") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAuthorizationsService_Reset(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/applications/id/token", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") testBody(t, r, `{"access_token":"a"}`+"\n") testHeader(t, r, "Accept", mediaTypeOAuthAppPreview) fmt.Fprint(w, `{"ID":1}`) }) ctx := context.Background() got, _, err := client.Authorizations.Reset(ctx, "id", "a") if err != nil { t.Errorf("Authorizations.Reset returned error: %v", err) } want := &Authorization{ID: Int64(1)} if !cmp.Equal(got, want) { t.Errorf("Authorizations.Reset returned auth %+v, want %+v", got, want) } const methodName = "Reset" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Authorizations.Reset(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Authorizations.Reset(ctx, "id", "a") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAuthorizationsService_Revoke(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/applications/id/token", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testBody(t, r, `{"access_token":"a"}`+"\n") testHeader(t, r, "Accept", mediaTypeOAuthAppPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Authorizations.Revoke(ctx, "id", "a") if err != nil { t.Errorf("Authorizations.Revoke returned error: %v", err) } const methodName = "Revoke" testBadOptions(t, methodName, func() (err error) { _, err = client.Authorizations.Revoke(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Authorizations.Revoke(ctx, "id", "a") }) } func TestDeleteGrant(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/applications/id/grant", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testBody(t, r, `{"access_token":"a"}`+"\n") testHeader(t, r, "Accept", mediaTypeOAuthAppPreview) }) ctx := context.Background() _, err := client.Authorizations.DeleteGrant(ctx, "id", "a") if err != nil { t.Errorf("OAuthAuthorizations.DeleteGrant returned error: %v", err) } const methodName = "DeleteGrant" testBadOptions(t, methodName, func() (err error) { _, err = client.Authorizations.DeleteGrant(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Authorizations.DeleteGrant(ctx, "id", "a") }) } func TestAuthorizationsService_CreateImpersonation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/admin/users/u/authorizations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"id":1}`) }) req := &AuthorizationRequest{Scopes: []Scope{ScopePublicRepo}} ctx := context.Background() got, _, err := client.Authorizations.CreateImpersonation(ctx, "u", req) if err != nil { t.Errorf("Authorizations.CreateImpersonation returned error: %+v", err) } want := &Authorization{ID: Int64(1)} if !cmp.Equal(got, want) { t.Errorf("Authorizations.CreateImpersonation returned %+v, want %+v", *got.ID, *want.ID) } const methodName = "CreateImpersonation" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Authorizations.CreateImpersonation(ctx, "\n", req) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Authorizations.CreateImpersonation(ctx, "u", req) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAuthorizationsService_DeleteImpersonation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/admin/users/u/authorizations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Authorizations.DeleteImpersonation(ctx, "u") if err != nil { t.Errorf("Authorizations.DeleteImpersonation returned error: %+v", err) } const methodName = "DeleteImpersonation" testBadOptions(t, methodName, func() (err error) { _, err = client.Authorizations.DeleteImpersonation(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Authorizations.DeleteImpersonation(ctx, "u") }) } func TestAuthorizationUpdateRequest_Marshal(t *testing.T) { testJSONMarshal(t, &AuthorizationUpdateRequest{}, "{}") u := &AuthorizationUpdateRequest{ Scopes: []string{"s"}, AddScopes: []string{"a"}, RemoveScopes: []string{"r"}, Note: String("n"), NoteURL: String("nu"), Fingerprint: String("f"), } want := `{ "scopes": ["s"], "add_scopes": ["a"], "remove_scopes": ["r"], "note": "n", "note_url": "nu", "fingerprint": "f" }` testJSONMarshal(t, u, want) } func TestAuthorizationRequest_Marshal(t *testing.T) { testJSONMarshal(t, &AuthorizationRequest{}, "{}") u := &AuthorizationRequest{ Scopes: []Scope{"s"}, ClientID: String("cid"), ClientSecret: String("cs"), Note: String("n"), NoteURL: String("nu"), Fingerprint: String("f"), } want := `{ "scopes": ["s"], "client_id": "cid", "client_secret": "cs", "note": "n", "note_url": "nu", "fingerprint": "f" }` testJSONMarshal(t, u, want) } func TestAuthorizationApp_Marshal(t *testing.T) { testJSONMarshal(t, &AuthorizationApp{}, "{}") u := &AuthorizationApp{ URL: String("u"), Name: String("n"), ClientID: String("cid"), } want := `{ "url": "u", "name": "n", "client_id": "cid" }` testJSONMarshal(t, u, want) } func TestGrant_Marshal(t *testing.T) { testJSONMarshal(t, &Grant{}, "{}") u := &Grant{ ID: Int64(1), URL: String("u"), App: &AuthorizationApp{ URL: String("u"), Name: String("n"), ClientID: String("cid"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, Scopes: []string{"s"}, } want := `{ "id": 1, "url": "u", "app": { "url": "u", "name": "n", "client_id": "cid" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "scopes": ["s"] }` testJSONMarshal(t, u, want) } func TestAuthorization_Marshal(t *testing.T) { testJSONMarshal(t, &Authorization{}, "{}") u := &Authorization{ ID: Int64(1), URL: String("u"), Scopes: []Scope{"s"}, Token: String("t"), TokenLastEight: String("tle"), HashedToken: String("ht"), App: &AuthorizationApp{ URL: String("u"), Name: String("n"), ClientID: String("cid"), }, Note: String("n"), NoteURL: String("nu"), UpdatedAt: &Timestamp{referenceTime}, CreatedAt: &Timestamp{referenceTime}, Fingerprint: String("f"), User: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "id": 1, "url": "u", "scopes": ["s"], "token": "t", "token_last_eight": "tle", "hashed_token": "ht", "app": { "url": "u", "name": "n", "client_id": "cid" }, "note": "n", "note_url": "nu", "updated_at": ` + referenceTimeStr + `, "created_at": ` + referenceTimeStr + `, "fingerprint": "f", "user": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" } }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/billing.go000066400000000000000000000124711410475703100167300ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "fmt" ) // BillingService provides access to the billing related functions // in the GitHub API. // // GitHub API docs: https://docs.github.com/en/rest/reference/billing type BillingService service // ActionBilling represents a GitHub Action billing. type ActionBilling struct { TotalMinutesUsed int `json:"total_minutes_used"` TotalPaidMinutesUsed int `json:"total_paid_minutes_used"` IncludedMinutes int `json:"included_minutes"` MinutesUsedBreakdown MinutesUsedBreakdown `json:"minutes_used_breakdown"` } type MinutesUsedBreakdown struct { Ubuntu int `json:"UBUNTU"` MacOS int `json:"MACOS"` Windows int `json:"WINDOWS"` } // PackageBilling represents a GitHub Package billing. type PackageBilling struct { TotalGigabytesBandwidthUsed int `json:"total_gigabytes_bandwidth_used"` TotalPaidGigabytesBandwidthUsed int `json:"total_paid_gigabytes_bandwidth_used"` IncludedGigabytesBandwidth int `json:"included_gigabytes_bandwidth"` } // StorageBilling represents a GitHub Storage billing. type StorageBilling struct { DaysLeftInBillingCycle int `json:"days_left_in_billing_cycle"` EstimatedPaidStorageForMonth int `json:"estimated_paid_storage_for_month"` EstimatedStorageForMonth int `json:"estimated_storage_for_month"` } // GetActionsBillingOrg returns the summary of the free and paid GitHub Actions minutes used for an Org. // // GitHub API docs: https://docs.github.com/en/rest/reference/billing#get-github-actions-billing-for-an-organization func (s *BillingService) GetActionsBillingOrg(ctx context.Context, org string) (*ActionBilling, *Response, error) { u := fmt.Sprintf("orgs/%v/settings/billing/actions", org) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } actionsOrgBilling := new(ActionBilling) resp, err := s.client.Do(ctx, req, actionsOrgBilling) return actionsOrgBilling, resp, err } // GetPackagesBillingOrg returns the free and paid storage used for GitHub Packages in gigabytes for an Org. // // GitHub API docs: https://docs.github.com/en/rest/reference/billing#get-github-packages-billing-for-an-organization func (s *BillingService) GetPackagesBillingOrg(ctx context.Context, org string) (*PackageBilling, *Response, error) { u := fmt.Sprintf("orgs/%v/settings/billing/packages", org) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } packagesOrgBilling := new(PackageBilling) resp, err := s.client.Do(ctx, req, packagesOrgBilling) return packagesOrgBilling, resp, err } // GetStorageBillingOrg returns the estimated paid and estimated total storage used for GitHub Actions // and GitHub Packages in gigabytes for an Org. // // GitHub API docs: https://docs.github.com/en/rest/reference/billing#get-shared-storage-billing-for-an-organization func (s *BillingService) GetStorageBillingOrg(ctx context.Context, org string) (*StorageBilling, *Response, error) { u := fmt.Sprintf("orgs/%v/settings/billing/shared-storage", org) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } storageOrgBilling := new(StorageBilling) resp, err := s.client.Do(ctx, req, storageOrgBilling) return storageOrgBilling, resp, err } // GetActionsBillingUser returns the summary of the free and paid GitHub Actions minutes used for a user. // // GitHub API docs: https://docs.github.com/en/rest/reference/billing#get-github-actions-billing-for-a-user func (s *BillingService) GetActionsBillingUser(ctx context.Context, user string) (*ActionBilling, *Response, error) { u := fmt.Sprintf("users/%v/settings/billing/actions", user) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } actionsUserBilling := new(ActionBilling) resp, err := s.client.Do(ctx, req, actionsUserBilling) return actionsUserBilling, resp, err } // GetPackagesBillingUser returns the free and paid storage used for GitHub Packages in gigabytes for a user. // // GitHub API docs: https://docs.github.com/en/rest/reference/billing#get-github-packages-billing-for-an-organization func (s *BillingService) GetPackagesBillingUser(ctx context.Context, user string) (*PackageBilling, *Response, error) { u := fmt.Sprintf("users/%v/settings/billing/packages", user) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } packagesUserBilling := new(PackageBilling) resp, err := s.client.Do(ctx, req, packagesUserBilling) return packagesUserBilling, resp, err } // GetStorageBillingUser returns the estimated paid and estimated total storage used for GitHub Actions // and GitHub Packages in gigabytes for a user. // // GitHub API docs: https://docs.github.com/en/rest/reference/billing#get-shared-storage-billing-for-a-user func (s *BillingService) GetStorageBillingUser(ctx context.Context, user string) (*StorageBilling, *Response, error) { u := fmt.Sprintf("users/%v/settings/billing/shared-storage", user) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } storageUserBilling := new(StorageBilling) resp, err := s.client.Do(ctx, req, storageUserBilling) return storageUserBilling, resp, err } go-github-38.1.0/github/billing_test.go000066400000000000000000000227311410475703100177670ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestBillingService_GetActionsBillingOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/settings/billing/actions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "total_minutes_used": 305, "total_paid_minutes_used": 0, "included_minutes": 3000, "minutes_used_breakdown": { "UBUNTU": 205, "MACOS": 10, "WINDOWS": 90 } }`) }) ctx := context.Background() hook, _, err := client.Billing.GetActionsBillingOrg(ctx, "o") if err != nil { t.Errorf("Billing.GetActionsBillingOrg returned error: %v", err) } want := &ActionBilling{ TotalMinutesUsed: 305, TotalPaidMinutesUsed: 0, IncludedMinutes: 3000, MinutesUsedBreakdown: MinutesUsedBreakdown{ Ubuntu: 205, MacOS: 10, Windows: 90, }, } if !cmp.Equal(hook, want) { t.Errorf("Billing.GetActionsBillingOrg returned %+v, want %+v", hook, want) } const methodName = "GetActionsBillingOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Billing.GetActionsBillingOrg(ctx, "\n") return err }) } func TestBillingService_GetActionsBillingOrg_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Billing.GetActionsBillingOrg(ctx, "%") testURLParseError(t, err) } func TestBillingService_GetPackagesBillingOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/settings/billing/packages", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "total_gigabytes_bandwidth_used": 50, "total_paid_gigabytes_bandwidth_used": 40, "included_gigabytes_bandwidth": 10 }`) }) ctx := context.Background() hook, _, err := client.Billing.GetPackagesBillingOrg(ctx, "o") if err != nil { t.Errorf("Billing.GetPackagesBillingOrg returned error: %v", err) } want := &PackageBilling{ TotalGigabytesBandwidthUsed: 50, TotalPaidGigabytesBandwidthUsed: 40, IncludedGigabytesBandwidth: 10, } if !cmp.Equal(hook, want) { t.Errorf("Billing.GetPackagesBillingOrg returned %+v, want %+v", hook, want) } const methodName = "GetPackagesBillingOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Billing.GetPackagesBillingOrg(ctx, "\n") return err }) } func TestBillingService_GetPackagesBillingOrg_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Billing.GetPackagesBillingOrg(ctx, "%") testURLParseError(t, err) } func TestBillingService_GetStorageBillingOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/settings/billing/shared-storage", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "days_left_in_billing_cycle": 20, "estimated_paid_storage_for_month": 15, "estimated_storage_for_month": 40 }`) }) ctx := context.Background() hook, _, err := client.Billing.GetStorageBillingOrg(ctx, "o") if err != nil { t.Errorf("Billing.GetStorageBillingOrg returned error: %v", err) } want := &StorageBilling{ DaysLeftInBillingCycle: 20, EstimatedPaidStorageForMonth: 15, EstimatedStorageForMonth: 40, } if !cmp.Equal(hook, want) { t.Errorf("Billing.GetStorageBillingOrg returned %+v, want %+v", hook, want) } const methodName = "GetStorageBillingOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Billing.GetStorageBillingOrg(ctx, "\n") return err }) } func TestBillingService_GetStorageBillingOrg_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Billing.GetStorageBillingOrg(ctx, "%") testURLParseError(t, err) } func TestBillingService_GetActionsBillingUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/settings/billing/actions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "total_minutes_used": 10, "total_paid_minutes_used": 0, "included_minutes": 3000, "minutes_used_breakdown": { "UBUNTU": 205, "MACOS": 10, "WINDOWS": 90 } }`) }) ctx := context.Background() hook, _, err := client.Billing.GetActionsBillingUser(ctx, "u") if err != nil { t.Errorf("Billing.GetActionsBillingUser returned error: %v", err) } want := &ActionBilling{ TotalMinutesUsed: 10, TotalPaidMinutesUsed: 0, IncludedMinutes: 3000, MinutesUsedBreakdown: MinutesUsedBreakdown{ Ubuntu: 205, MacOS: 10, Windows: 90, }, } if !cmp.Equal(hook, want) { t.Errorf("Billing.GetActionsBillingUser returned %+v, want %+v", hook, want) } const methodName = "GetActionsBillingUser" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Billing.GetActionsBillingOrg(ctx, "\n") return err }) } func TestBillingService_GetActionsBillingUser_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Billing.GetActionsBillingUser(ctx, "%") testURLParseError(t, err) } func TestBillingService_GetPackagesBillingUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/settings/billing/packages", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "total_gigabytes_bandwidth_used": 50, "total_paid_gigabytes_bandwidth_used": 40, "included_gigabytes_bandwidth": 10 }`) }) ctx := context.Background() hook, _, err := client.Billing.GetPackagesBillingUser(ctx, "u") if err != nil { t.Errorf("Billing.GetPackagesBillingUser returned error: %v", err) } want := &PackageBilling{ TotalGigabytesBandwidthUsed: 50, TotalPaidGigabytesBandwidthUsed: 40, IncludedGigabytesBandwidth: 10, } if !cmp.Equal(hook, want) { t.Errorf("Billing.GetPackagesBillingUser returned %+v, want %+v", hook, want) } const methodName = "GetPackagesBillingUser" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Billing.GetPackagesBillingUser(ctx, "\n") return err }) } func TestBillingService_GetPackagesBillingUser_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Billing.GetPackagesBillingUser(ctx, "%") testURLParseError(t, err) } func TestBillingService_GetStorageBillingUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/settings/billing/shared-storage", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "days_left_in_billing_cycle": 20, "estimated_paid_storage_for_month": 15, "estimated_storage_for_month": 40 }`) }) ctx := context.Background() hook, _, err := client.Billing.GetStorageBillingUser(ctx, "u") if err != nil { t.Errorf("Billing.GetStorageBillingUser returned error: %v", err) } want := &StorageBilling{ DaysLeftInBillingCycle: 20, EstimatedPaidStorageForMonth: 15, EstimatedStorageForMonth: 40, } if !cmp.Equal(hook, want) { t.Errorf("Billing.GetStorageBillingUser returned %+v, want %+v", hook, want) } const methodName = "GetStorageBillingUser" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Billing.GetStorageBillingUser(ctx, "\n") return err }) } func TestBillingService_GetStorageBillingUser_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Billing.GetStorageBillingUser(ctx, "%") testURLParseError(t, err) } func TestMinutesUsedBreakdown_Marshal(t *testing.T) { testJSONMarshal(t, &MinutesUsedBreakdown{}, "{}") u := &MinutesUsedBreakdown{ Ubuntu: 1, MacOS: 1, Windows: 1, } want := `{ "UBUNTU": 1, "MACOS": 1, "WINDOWS": 1 }` testJSONMarshal(t, u, want) } func TestActionBilling_Marshal(t *testing.T) { testJSONMarshal(t, &MinutesUsedBreakdown{}, "{}") u := &ActionBilling{ TotalMinutesUsed: 1, TotalPaidMinutesUsed: 1, IncludedMinutes: 1, MinutesUsedBreakdown: MinutesUsedBreakdown{ Ubuntu: 1, MacOS: 1, Windows: 1, }, } want := `{ "total_minutes_used": 1, "total_paid_minutes_used": 1, "included_minutes": 1, "minutes_used_breakdown": { "UBUNTU": 1, "MACOS": 1, "WINDOWS": 1 } }` testJSONMarshal(t, u, want) } func TestPackageBilling_Marshal(t *testing.T) { testJSONMarshal(t, &PackageBilling{}, "{}") u := &PackageBilling{ TotalGigabytesBandwidthUsed: 1, TotalPaidGigabytesBandwidthUsed: 1, IncludedGigabytesBandwidth: 1, } want := `{ "total_gigabytes_bandwidth_used": 1, "total_paid_gigabytes_bandwidth_used": 1, "included_gigabytes_bandwidth": 1 }` testJSONMarshal(t, u, want) } func TestStorageBilling_Marshal(t *testing.T) { testJSONMarshal(t, &StorageBilling{}, "{}") u := &StorageBilling{ DaysLeftInBillingCycle: 1, EstimatedPaidStorageForMonth: 1, EstimatedStorageForMonth: 1, } want := `{ "days_left_in_billing_cycle": 1, "estimated_paid_storage_for_month": 1, "estimated_storage_for_month": 1 }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/checks.go000066400000000000000000000431231410475703100165460ustar00rootroot00000000000000// Copyright 2018 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 ( "context" "fmt" ) // ChecksService provides access to the Checks API in the // GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/checks/ type ChecksService service // CheckRun represents a GitHub check run on a repository associated with a GitHub app. type CheckRun struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` HeadSHA *string `json:"head_sha,omitempty"` ExternalID *string `json:"external_id,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` DetailsURL *string `json:"details_url,omitempty"` Status *string `json:"status,omitempty"` Conclusion *string `json:"conclusion,omitempty"` StartedAt *Timestamp `json:"started_at,omitempty"` CompletedAt *Timestamp `json:"completed_at,omitempty"` Output *CheckRunOutput `json:"output,omitempty"` Name *string `json:"name,omitempty"` CheckSuite *CheckSuite `json:"check_suite,omitempty"` App *App `json:"app,omitempty"` PullRequests []*PullRequest `json:"pull_requests,omitempty"` } // CheckRunOutput represents the output of a CheckRun. type CheckRunOutput struct { Title *string `json:"title,omitempty"` Summary *string `json:"summary,omitempty"` Text *string `json:"text,omitempty"` AnnotationsCount *int `json:"annotations_count,omitempty"` AnnotationsURL *string `json:"annotations_url,omitempty"` Annotations []*CheckRunAnnotation `json:"annotations,omitempty"` Images []*CheckRunImage `json:"images,omitempty"` } // CheckRunAnnotation represents an annotation object for a CheckRun output. type CheckRunAnnotation struct { Path *string `json:"path,omitempty"` StartLine *int `json:"start_line,omitempty"` EndLine *int `json:"end_line,omitempty"` StartColumn *int `json:"start_column,omitempty"` EndColumn *int `json:"end_column,omitempty"` AnnotationLevel *string `json:"annotation_level,omitempty"` Message *string `json:"message,omitempty"` Title *string `json:"title,omitempty"` RawDetails *string `json:"raw_details,omitempty"` } // CheckRunImage represents an image object for a CheckRun output. type CheckRunImage struct { Alt *string `json:"alt,omitempty"` ImageURL *string `json:"image_url,omitempty"` Caption *string `json:"caption,omitempty"` } // CheckSuite represents a suite of check runs. type CheckSuite struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` HeadBranch *string `json:"head_branch,omitempty"` HeadSHA *string `json:"head_sha,omitempty"` URL *string `json:"url,omitempty"` BeforeSHA *string `json:"before,omitempty"` AfterSHA *string `json:"after,omitempty"` Status *string `json:"status,omitempty"` Conclusion *string `json:"conclusion,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` App *App `json:"app,omitempty"` Repository *Repository `json:"repository,omitempty"` PullRequests []*PullRequest `json:"pull_requests,omitempty"` // The following fields are only populated by Webhook events. HeadCommit *Commit `json:"head_commit,omitempty"` } func (c CheckRun) String() string { return Stringify(c) } func (c CheckSuite) String() string { return Stringify(c) } // GetCheckRun gets a check-run for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/checks/#get-a-check-run func (s *ChecksService) GetCheckRun(ctx context.Context, owner, repo string, checkRunID int64) (*CheckRun, *Response, error) { u := fmt.Sprintf("repos/%v/%v/check-runs/%v", owner, repo, checkRunID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } checkRun := new(CheckRun) resp, err := s.client.Do(ctx, req, checkRun) if err != nil { return nil, resp, err } return checkRun, resp, nil } // GetCheckSuite gets a single check suite. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/checks/#get-a-check-suite func (s *ChecksService) GetCheckSuite(ctx context.Context, owner, repo string, checkSuiteID int64) (*CheckSuite, *Response, error) { u := fmt.Sprintf("repos/%v/%v/check-suites/%v", owner, repo, checkSuiteID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } checkSuite := new(CheckSuite) resp, err := s.client.Do(ctx, req, checkSuite) if err != nil { return nil, resp, err } return checkSuite, resp, nil } // CreateCheckRunOptions sets up parameters needed to create a CheckRun. type CreateCheckRunOptions struct { Name string `json:"name"` // The name of the check (e.g., "code-coverage"). (Required.) HeadSHA string `json:"head_sha"` // The SHA of the commit. (Required.) DetailsURL *string `json:"details_url,omitempty"` // The URL of the integrator's site that has the full details of the check. (Optional.) ExternalID *string `json:"external_id,omitempty"` // A reference for the run on the integrator's system. (Optional.) Status *string `json:"status,omitempty"` // The current status. Can be one of "queued", "in_progress", or "completed". Default: "queued". (Optional.) Conclusion *string `json:"conclusion,omitempty"` // Can be one of "success", "failure", "neutral", "cancelled", "skipped", "timed_out", or "action_required". (Optional. Required if you provide a status of "completed".) StartedAt *Timestamp `json:"started_at,omitempty"` // The time that the check run began. (Optional.) CompletedAt *Timestamp `json:"completed_at,omitempty"` // The time the check completed. (Optional. Required if you provide conclusion.) Output *CheckRunOutput `json:"output,omitempty"` // Provide descriptive details about the run. (Optional) Actions []*CheckRunAction `json:"actions,omitempty"` // Possible further actions the integrator can perform, which a user may trigger. (Optional.) } // CheckRunAction exposes further actions the integrator can perform, which a user may trigger. type CheckRunAction struct { Label string `json:"label"` // The text to be displayed on a button in the web UI. The maximum size is 20 characters. (Required.) Description string `json:"description"` // A short explanation of what this action would do. The maximum size is 40 characters. (Required.) Identifier string `json:"identifier"` // A reference for the action on the integrator's system. The maximum size is 20 characters. (Required.) } // CreateCheckRun creates a check run for repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/checks/#create-a-check-run func (s *ChecksService) CreateCheckRun(ctx context.Context, owner, repo string, opts CreateCheckRunOptions) (*CheckRun, *Response, error) { u := fmt.Sprintf("repos/%v/%v/check-runs", owner, repo) req, err := s.client.NewRequest("POST", u, opts) if err != nil { return nil, nil, err } checkRun := new(CheckRun) resp, err := s.client.Do(ctx, req, checkRun) if err != nil { return nil, resp, err } return checkRun, resp, nil } // UpdateCheckRunOptions sets up parameters needed to update a CheckRun. type UpdateCheckRunOptions struct { Name string `json:"name"` // The name of the check (e.g., "code-coverage"). (Required.) DetailsURL *string `json:"details_url,omitempty"` // The URL of the integrator's site that has the full details of the check. (Optional.) ExternalID *string `json:"external_id,omitempty"` // A reference for the run on the integrator's system. (Optional.) Status *string `json:"status,omitempty"` // The current status. Can be one of "queued", "in_progress", or "completed". Default: "queued". (Optional.) Conclusion *string `json:"conclusion,omitempty"` // Can be one of "success", "failure", "neutral", "cancelled", "skipped", "timed_out", or "action_required". (Optional. Required if you provide a status of "completed".) CompletedAt *Timestamp `json:"completed_at,omitempty"` // The time the check completed. (Optional. Required if you provide conclusion.) Output *CheckRunOutput `json:"output,omitempty"` // Provide descriptive details about the run. (Optional) Actions []*CheckRunAction `json:"actions,omitempty"` // Possible further actions the integrator can perform, which a user may trigger. (Optional.) } // UpdateCheckRun updates a check run for a specific commit in a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/checks/#update-a-check-run func (s *ChecksService) UpdateCheckRun(ctx context.Context, owner, repo string, checkRunID int64, opts UpdateCheckRunOptions) (*CheckRun, *Response, error) { u := fmt.Sprintf("repos/%v/%v/check-runs/%v", owner, repo, checkRunID) req, err := s.client.NewRequest("PATCH", u, opts) if err != nil { return nil, nil, err } checkRun := new(CheckRun) resp, err := s.client.Do(ctx, req, checkRun) if err != nil { return nil, resp, err } return checkRun, resp, nil } // ListCheckRunAnnotations lists the annotations for a check run. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/checks/#list-check-run-annotations func (s *ChecksService) ListCheckRunAnnotations(ctx context.Context, owner, repo string, checkRunID int64, opts *ListOptions) ([]*CheckRunAnnotation, *Response, error) { u := fmt.Sprintf("repos/%v/%v/check-runs/%v/annotations", owner, repo, checkRunID) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var checkRunAnnotations []*CheckRunAnnotation resp, err := s.client.Do(ctx, req, &checkRunAnnotations) if err != nil { return nil, resp, err } return checkRunAnnotations, resp, nil } // ListCheckRunsOptions represents parameters to list check runs. type ListCheckRunsOptions struct { CheckName *string `url:"check_name,omitempty"` // Returns check runs with the specified name. Status *string `url:"status,omitempty"` // Returns check runs with the specified status. Can be one of "queued", "in_progress", or "completed". Filter *string `url:"filter,omitempty"` // Filters check runs by their completed_at timestamp. Can be one of "latest" (returning the most recent check runs) or "all". Default: "latest" ListOptions } // ListCheckRunsResults represents the result of a check run list. type ListCheckRunsResults struct { Total *int `json:"total_count,omitempty"` CheckRuns []*CheckRun `json:"check_runs,omitempty"` } // ListCheckRunsForRef lists check runs for a specific ref. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/checks/#list-check-runs-for-a-git-reference func (s *ChecksService) ListCheckRunsForRef(ctx context.Context, owner, repo, ref string, opts *ListCheckRunsOptions) (*ListCheckRunsResults, *Response, error) { u := fmt.Sprintf("repos/%v/%v/commits/%v/check-runs", owner, repo, refURLEscape(ref)) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var checkRunResults *ListCheckRunsResults resp, err := s.client.Do(ctx, req, &checkRunResults) if err != nil { return nil, resp, err } return checkRunResults, resp, nil } // ListCheckRunsCheckSuite lists check runs for a check suite. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/checks/#list-check-runs-in-a-check-suite func (s *ChecksService) ListCheckRunsCheckSuite(ctx context.Context, owner, repo string, checkSuiteID int64, opts *ListCheckRunsOptions) (*ListCheckRunsResults, *Response, error) { u := fmt.Sprintf("repos/%v/%v/check-suites/%v/check-runs", owner, repo, checkSuiteID) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var checkRunResults *ListCheckRunsResults resp, err := s.client.Do(ctx, req, &checkRunResults) if err != nil { return nil, resp, err } return checkRunResults, resp, nil } // ListCheckSuiteOptions represents parameters to list check suites. type ListCheckSuiteOptions struct { CheckName *string `url:"check_name,omitempty"` // Filters checks suites by the name of the check run. AppID *int `url:"app_id,omitempty"` // Filters check suites by GitHub App id. ListOptions } // ListCheckSuiteResults represents the result of a check run list. type ListCheckSuiteResults struct { Total *int `json:"total_count,omitempty"` CheckSuites []*CheckSuite `json:"check_suites,omitempty"` } // ListCheckSuitesForRef lists check suite for a specific ref. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/checks/#list-check-suites-for-a-git-reference func (s *ChecksService) ListCheckSuitesForRef(ctx context.Context, owner, repo, ref string, opts *ListCheckSuiteOptions) (*ListCheckSuiteResults, *Response, error) { u := fmt.Sprintf("repos/%v/%v/commits/%v/check-suites", owner, repo, refURLEscape(ref)) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var checkSuiteResults *ListCheckSuiteResults resp, err := s.client.Do(ctx, req, &checkSuiteResults) if err != nil { return nil, resp, err } return checkSuiteResults, resp, nil } // AutoTriggerCheck enables or disables automatic creation of CheckSuite events upon pushes to the repository. type AutoTriggerCheck struct { AppID *int64 `json:"app_id,omitempty"` // The id of the GitHub App. (Required.) Setting *bool `json:"setting,omitempty"` // Set to "true" to enable automatic creation of CheckSuite events upon pushes to the repository, or "false" to disable them. Default: "true" (Required.) } // CheckSuitePreferenceOptions set options for check suite preferences for a repository. type CheckSuitePreferenceOptions struct { AutoTriggerChecks []*AutoTriggerCheck `json:"auto_trigger_checks,omitempty"` // A slice of auto trigger checks that can be set for a check suite in a repository. } // CheckSuitePreferenceResults represents the results of the preference set operation. type CheckSuitePreferenceResults struct { Preferences *PreferenceList `json:"preferences,omitempty"` Repository *Repository `json:"repository,omitempty"` } // PreferenceList represents a list of auto trigger checks for repository type PreferenceList struct { AutoTriggerChecks []*AutoTriggerCheck `json:"auto_trigger_checks,omitempty"` // A slice of auto trigger checks that can be set for a check suite in a repository. } // SetCheckSuitePreferences changes the default automatic flow when creating check suites. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/checks/#update-repository-preferences-for-check-suites func (s *ChecksService) SetCheckSuitePreferences(ctx context.Context, owner, repo string, opts CheckSuitePreferenceOptions) (*CheckSuitePreferenceResults, *Response, error) { u := fmt.Sprintf("repos/%v/%v/check-suites/preferences", owner, repo) req, err := s.client.NewRequest("PATCH", u, opts) if err != nil { return nil, nil, err } var checkSuitePrefResults *CheckSuitePreferenceResults resp, err := s.client.Do(ctx, req, &checkSuitePrefResults) if err != nil { return nil, resp, err } return checkSuitePrefResults, resp, nil } // CreateCheckSuiteOptions sets up parameters to manually create a check suites type CreateCheckSuiteOptions struct { HeadSHA string `json:"head_sha"` // The sha of the head commit. (Required.) HeadBranch *string `json:"head_branch,omitempty"` // The name of the head branch where the code changes are implemented. } // CreateCheckSuite manually creates a check suite for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/checks/#create-a-check-suite func (s *ChecksService) CreateCheckSuite(ctx context.Context, owner, repo string, opts CreateCheckSuiteOptions) (*CheckSuite, *Response, error) { u := fmt.Sprintf("repos/%v/%v/check-suites", owner, repo) req, err := s.client.NewRequest("POST", u, opts) if err != nil { return nil, nil, err } checkSuite := new(CheckSuite) resp, err := s.client.Do(ctx, req, checkSuite) if err != nil { return nil, resp, err } return checkSuite, resp, nil } // ReRequestCheckSuite triggers GitHub to rerequest an existing check suite, without pushing new code to a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/checks/#rerequest-a-check-suite func (s *ChecksService) ReRequestCheckSuite(ctx context.Context, owner, repo string, checkSuiteID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/check-suites/%v/rerequest", owner, repo, checkSuiteID) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, err } resp, err := s.client.Do(ctx, req, nil) return resp, err } go-github-38.1.0/github/checks_test.go000066400000000000000000001202621410475703100176050ustar00rootroot00000000000000// Copyright 2018 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 ( "context" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestChecksService_GetCheckRun(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/check-runs/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "id": 1, "name":"testCheckRun", "status": "completed", "conclusion": "neutral", "started_at": "2018-05-04T01:14:52Z", "completed_at": "2018-05-04T01:14:52Z"}`) }) ctx := context.Background() checkRun, _, err := client.Checks.GetCheckRun(ctx, "o", "r", 1) if err != nil { t.Errorf("Checks.GetCheckRun return error: %v", err) } startedAt, _ := time.Parse(time.RFC3339, "2018-05-04T01:14:52Z") completeAt, _ := time.Parse(time.RFC3339, "2018-05-04T01:14:52Z") want := &CheckRun{ ID: Int64(1), Status: String("completed"), Conclusion: String("neutral"), StartedAt: &Timestamp{startedAt}, CompletedAt: &Timestamp{completeAt}, Name: String("testCheckRun"), } if !cmp.Equal(checkRun, want) { t.Errorf("Checks.GetCheckRun return %+v, want %+v", checkRun, want) } const methodName = "GetCheckRun" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Checks.GetCheckRun(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Checks.GetCheckRun(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestChecksService_GetCheckSuite(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/check-suites/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "id": 1, "head_branch":"master", "head_sha": "deadbeef", "conclusion": "neutral", "before": "deadbeefb", "after": "deadbeefa", "status": "completed"}`) }) ctx := context.Background() checkSuite, _, err := client.Checks.GetCheckSuite(ctx, "o", "r", 1) if err != nil { t.Errorf("Checks.GetCheckSuite return error: %v", err) } want := &CheckSuite{ ID: Int64(1), HeadBranch: String("master"), HeadSHA: String("deadbeef"), AfterSHA: String("deadbeefa"), BeforeSHA: String("deadbeefb"), Status: String("completed"), Conclusion: String("neutral"), } if !cmp.Equal(checkSuite, want) { t.Errorf("Checks.GetCheckSuite return %+v, want %+v", checkSuite, want) } const methodName = "GetCheckSuite" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Checks.GetCheckSuite(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Checks.GetCheckSuite(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestChecksService_CreateCheckRun(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/check-runs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{ "id": 1, "name":"testCreateCheckRun", "head_sha":"deadbeef", "status": "in_progress", "conclusion": null, "started_at": "2018-05-04T01:14:52Z", "completed_at": null, "output":{"title": "Mighty test report", "summary":"", "text":""}}`) }) startedAt, _ := time.Parse(time.RFC3339, "2018-05-04T01:14:52Z") checkRunOpt := CreateCheckRunOptions{ Name: "testCreateCheckRun", HeadSHA: "deadbeef", Status: String("in_progress"), StartedAt: &Timestamp{startedAt}, Output: &CheckRunOutput{ Title: String("Mighty test report"), Summary: String(""), Text: String(""), }, } ctx := context.Background() checkRun, _, err := client.Checks.CreateCheckRun(ctx, "o", "r", checkRunOpt) if err != nil { t.Errorf("Checks.CreateCheckRun return error: %v", err) } want := &CheckRun{ ID: Int64(1), Status: String("in_progress"), StartedAt: &Timestamp{startedAt}, HeadSHA: String("deadbeef"), Name: String("testCreateCheckRun"), Output: &CheckRunOutput{ Title: String("Mighty test report"), Summary: String(""), Text: String(""), }, } if !cmp.Equal(checkRun, want) { t.Errorf("Checks.CreateCheckRun return %+v, want %+v", checkRun, want) } const methodName = "CreateCheckRun" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Checks.CreateCheckRun(ctx, "\n", "\n", CreateCheckRunOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Checks.CreateCheckRun(ctx, "o", "r", checkRunOpt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestChecksService_ListCheckRunAnnotations(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/check-runs/1/annotations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "1", }) fmt.Fprint(w, `[{ "path": "README.md", "start_line": 2, "end_line": 2, "start_column": 1, "end_column": 5, "annotation_level": "warning", "message": "Check your spelling for 'banaas'.", "title": "Spell check", "raw_details": "Do you mean 'bananas' or 'banana'?"}]`, ) }) ctx := context.Background() checkRunAnnotations, _, err := client.Checks.ListCheckRunAnnotations(ctx, "o", "r", 1, &ListOptions{Page: 1}) if err != nil { t.Errorf("Checks.ListCheckRunAnnotations return error: %v", err) } want := []*CheckRunAnnotation{{ Path: String("README.md"), StartLine: Int(2), EndLine: Int(2), StartColumn: Int(1), EndColumn: Int(5), AnnotationLevel: String("warning"), Message: String("Check your spelling for 'banaas'."), Title: String("Spell check"), RawDetails: String("Do you mean 'bananas' or 'banana'?"), }} if !cmp.Equal(checkRunAnnotations, want) { t.Errorf("Checks.ListCheckRunAnnotations returned %+v, want %+v", checkRunAnnotations, want) } const methodName = "ListCheckRunAnnotations" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Checks.ListCheckRunAnnotations(ctx, "\n", "\n", -1, &ListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Checks.ListCheckRunAnnotations(ctx, "o", "r", 1, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestChecksService_UpdateCheckRun(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/check-runs/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") fmt.Fprint(w, `{ "id": 1, "name":"testUpdateCheckRun", "status": "completed", "conclusion": "neutral", "started_at": "2018-05-04T01:14:52Z", "completed_at": "2018-05-04T01:14:52Z", "output":{"title": "Mighty test report", "summary":"There are 0 failures, 2 warnings and 1 notice", "text":"You may have misspelled some words."}}`) }) startedAt, _ := time.Parse(time.RFC3339, "2018-05-04T01:14:52Z") updateCheckRunOpt := UpdateCheckRunOptions{ Name: "testUpdateCheckRun", Status: String("completed"), CompletedAt: &Timestamp{startedAt}, Output: &CheckRunOutput{ Title: String("Mighty test report"), Summary: String("There are 0 failures, 2 warnings and 1 notice"), Text: String("You may have misspelled some words."), }, } ctx := context.Background() checkRun, _, err := client.Checks.UpdateCheckRun(ctx, "o", "r", 1, updateCheckRunOpt) if err != nil { t.Errorf("Checks.UpdateCheckRun return error: %v", err) } want := &CheckRun{ ID: Int64(1), Status: String("completed"), StartedAt: &Timestamp{startedAt}, CompletedAt: &Timestamp{startedAt}, Conclusion: String("neutral"), Name: String("testUpdateCheckRun"), Output: &CheckRunOutput{ Title: String("Mighty test report"), Summary: String("There are 0 failures, 2 warnings and 1 notice"), Text: String("You may have misspelled some words."), }, } if !cmp.Equal(checkRun, want) { t.Errorf("Checks.UpdateCheckRun return %+v, want %+v", checkRun, want) } const methodName = "UpdateCheckRun" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Checks.UpdateCheckRun(ctx, "\n", "\n", -1, UpdateCheckRunOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Checks.UpdateCheckRun(ctx, "o", "r", 1, updateCheckRunOpt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestChecksService_ListCheckRunsForRef(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/commits/master/check-runs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "check_name": "testing", "page": "1", "status": "completed", "filter": "all", }) fmt.Fprint(w, `{"total_count":1, "check_runs": [{ "id": 1, "head_sha": "deadbeef", "status": "completed", "conclusion": "neutral", "started_at": "2018-05-04T01:14:52Z", "completed_at": "2018-05-04T01:14:52Z"}]}`, ) }) opt := &ListCheckRunsOptions{ CheckName: String("testing"), Status: String("completed"), Filter: String("all"), ListOptions: ListOptions{Page: 1}, } ctx := context.Background() checkRuns, _, err := client.Checks.ListCheckRunsForRef(ctx, "o", "r", "master", opt) if err != nil { t.Errorf("Checks.ListCheckRunsForRef return error: %v", err) } startedAt, _ := time.Parse(time.RFC3339, "2018-05-04T01:14:52Z") want := &ListCheckRunsResults{ Total: Int(1), CheckRuns: []*CheckRun{{ ID: Int64(1), Status: String("completed"), StartedAt: &Timestamp{startedAt}, CompletedAt: &Timestamp{startedAt}, Conclusion: String("neutral"), HeadSHA: String("deadbeef"), }}, } if !cmp.Equal(checkRuns, want) { t.Errorf("Checks.ListCheckRunsForRef returned %+v, want %+v", checkRuns, want) } const methodName = "ListCheckRunsForRef" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Checks.ListCheckRunsForRef(ctx, "\n", "\n", "\n", &ListCheckRunsOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Checks.ListCheckRunsForRef(ctx, "o", "r", "master", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestChecksService_ListCheckRunsCheckSuite(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/check-suites/1/check-runs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "check_name": "testing", "page": "1", "status": "completed", "filter": "all", }) fmt.Fprint(w, `{"total_count":1, "check_runs": [{ "id": 1, "head_sha": "deadbeef", "status": "completed", "conclusion": "neutral", "started_at": "2018-05-04T01:14:52Z", "completed_at": "2018-05-04T01:14:52Z"}]}`, ) }) opt := &ListCheckRunsOptions{ CheckName: String("testing"), Status: String("completed"), Filter: String("all"), ListOptions: ListOptions{Page: 1}, } ctx := context.Background() checkRuns, _, err := client.Checks.ListCheckRunsCheckSuite(ctx, "o", "r", 1, opt) if err != nil { t.Errorf("Checks.ListCheckRunsCheckSuite return error: %v", err) } startedAt, _ := time.Parse(time.RFC3339, "2018-05-04T01:14:52Z") want := &ListCheckRunsResults{ Total: Int(1), CheckRuns: []*CheckRun{{ ID: Int64(1), Status: String("completed"), StartedAt: &Timestamp{startedAt}, CompletedAt: &Timestamp{startedAt}, Conclusion: String("neutral"), HeadSHA: String("deadbeef"), }}, } if !cmp.Equal(checkRuns, want) { t.Errorf("Checks.ListCheckRunsCheckSuite returned %+v, want %+v", checkRuns, want) } const methodName = "ListCheckRunsCheckSuite" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Checks.ListCheckRunsCheckSuite(ctx, "\n", "\n", -1, &ListCheckRunsOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Checks.ListCheckRunsCheckSuite(ctx, "o", "r", 1, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestChecksService_ListCheckSuiteForRef(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/commits/master/check-suites", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "check_name": "testing", "page": "1", "app_id": "2", }) fmt.Fprint(w, `{"total_count":1, "check_suites": [{ "id": 1, "head_sha": "deadbeef", "head_branch": "master", "status": "completed", "conclusion": "neutral", "before": "deadbeefb", "after": "deadbeefa"}]}`, ) }) opt := &ListCheckSuiteOptions{ CheckName: String("testing"), AppID: Int(2), ListOptions: ListOptions{Page: 1}, } ctx := context.Background() checkSuites, _, err := client.Checks.ListCheckSuitesForRef(ctx, "o", "r", "master", opt) if err != nil { t.Errorf("Checks.ListCheckSuitesForRef return error: %v", err) } want := &ListCheckSuiteResults{ Total: Int(1), CheckSuites: []*CheckSuite{{ ID: Int64(1), Status: String("completed"), Conclusion: String("neutral"), HeadSHA: String("deadbeef"), HeadBranch: String("master"), BeforeSHA: String("deadbeefb"), AfterSHA: String("deadbeefa"), }}, } if !cmp.Equal(checkSuites, want) { t.Errorf("Checks.ListCheckSuitesForRef returned %+v, want %+v", checkSuites, want) } const methodName = "ListCheckSuitesForRef" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Checks.ListCheckSuitesForRef(ctx, "\n", "\n", "\n", &ListCheckSuiteOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Checks.ListCheckSuitesForRef(ctx, "o", "r", "master", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestChecksService_SetCheckSuitePreferences(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/check-suites/preferences", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") testBody(t, r, `{"auto_trigger_checks":[{"app_id":2,"setting":false}]}`+"\n") fmt.Fprint(w, `{"preferences":{"auto_trigger_checks":[{"app_id": 2,"setting": false}]}}`) }) a := []*AutoTriggerCheck{{ AppID: Int64(2), Setting: Bool(false), }} opt := CheckSuitePreferenceOptions{AutoTriggerChecks: a} ctx := context.Background() prefResults, _, err := client.Checks.SetCheckSuitePreferences(ctx, "o", "r", opt) if err != nil { t.Errorf("Checks.SetCheckSuitePreferences return error: %v", err) } p := &PreferenceList{ AutoTriggerChecks: a, } want := &CheckSuitePreferenceResults{ Preferences: p, } if !cmp.Equal(prefResults, want) { t.Errorf("Checks.SetCheckSuitePreferences return %+v, want %+v", prefResults, want) } const methodName = "SetCheckSuitePreferences" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Checks.SetCheckSuitePreferences(ctx, "\n", "\n", CheckSuitePreferenceOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Checks.SetCheckSuitePreferences(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestChecksService_CreateCheckSuite(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/check-suites", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{ "id": 2, "head_branch":"master", "head_sha":"deadbeef", "status": "completed", "conclusion": "neutral", "before": "deadbeefb", "after": "deadbeefa"}`) }) checkSuiteOpt := CreateCheckSuiteOptions{ HeadSHA: "deadbeef", HeadBranch: String("master"), } ctx := context.Background() checkSuite, _, err := client.Checks.CreateCheckSuite(ctx, "o", "r", checkSuiteOpt) if err != nil { t.Errorf("Checks.CreateCheckSuite return error: %v", err) } want := &CheckSuite{ ID: Int64(2), Status: String("completed"), HeadSHA: String("deadbeef"), HeadBranch: String("master"), Conclusion: String("neutral"), BeforeSHA: String("deadbeefb"), AfterSHA: String("deadbeefa"), } if !cmp.Equal(checkSuite, want) { t.Errorf("Checks.CreateCheckSuite return %+v, want %+v", checkSuite, want) } const methodName = "CreateCheckSuite" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Checks.CreateCheckSuite(ctx, "\n", "\n", CreateCheckSuiteOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Checks.CreateCheckSuite(ctx, "o", "r", checkSuiteOpt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestChecksService_ReRequestCheckSuite(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/check-suites/1/rerequest", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") w.WriteHeader(http.StatusCreated) }) ctx := context.Background() resp, err := client.Checks.ReRequestCheckSuite(ctx, "o", "r", 1) if err != nil { t.Errorf("Checks.ReRequestCheckSuite return error: %v", err) } if got, want := resp.StatusCode, http.StatusCreated; got != want { t.Errorf("Checks.ReRequestCheckSuite = %v, want %v", got, want) } const methodName = "ReRequestCheckSuite" testBadOptions(t, methodName, func() (err error) { _, err = client.Checks.ReRequestCheckSuite(ctx, "\n", "\n", 1) return err }) } func Test_CheckRunMarshal(t *testing.T) { testJSONMarshal(t, &CheckRun{}, "{}") now := time.Now() ts := now.Format(time.RFC3339Nano) c := CheckRun{ ID: Int64(1), NodeID: String("n"), HeadSHA: String("h"), ExternalID: String("1"), URL: String("u"), HTMLURL: String("u"), DetailsURL: String("u"), Status: String("s"), Conclusion: String("c"), StartedAt: &Timestamp{Time: now}, CompletedAt: &Timestamp{Time: now}, Output: &CheckRunOutput{ Annotations: []*CheckRunAnnotation{ { AnnotationLevel: String("a"), EndLine: Int(1), Message: String("m"), Path: String("p"), RawDetails: String("r"), StartLine: Int(1), Title: String("t"), }, }, AnnotationsCount: Int(1), AnnotationsURL: String("a"), Images: []*CheckRunImage{ { Alt: String("a"), ImageURL: String("i"), Caption: String("c"), }, }, Title: String("t"), Summary: String("s"), Text: String("t"), }, Name: String("n"), CheckSuite: &CheckSuite{ ID: Int64(1), }, App: &App{ ID: Int64(1), NodeID: String("n"), Owner: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Name: String("n"), Description: String("d"), HTMLURL: String("h"), ExternalURL: String("u"), CreatedAt: &Timestamp{now}, UpdatedAt: &Timestamp{now}, }, PullRequests: []*PullRequest{ { URL: String("u"), ID: Int64(1), Number: Int(1), Head: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, }, Base: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, }, }, }, } w := fmt.Sprintf(`{ "id": 1, "node_id": "n", "head_sha": "h", "external_id": "1", "url": "u", "html_url": "u", "details_url": "u", "status": "s", "conclusion": "c", "started_at": "%s", "completed_at": "%s", "output": { "title": "t", "summary": "s", "text": "t", "annotations_count": 1, "annotations_url": "a", "annotations": [ { "path": "p", "start_line": 1, "end_line": 1, "annotation_level": "a", "message": "m", "title": "t", "raw_details": "r" } ], "images": [ { "alt": "a", "image_url": "i", "caption": "c" } ] }, "name": "n", "check_suite": { "id": 1 }, "app": { "id": 1, "node_id": "n", "owner": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "name": "n", "description": "d", "external_url": "u", "html_url": "h", "created_at": "%s", "updated_at": "%s" }, "pull_requests": [ { "id": 1, "number": 1, "url": "u", "head": { "ref": "r", "sha": "s", "repo": { "id": 1, "name": "n", "url": "s" } }, "base": { "ref": "r", "sha": "s", "repo": { "id": 1, "name": "n", "url": "u" } } } ] }`, ts, ts, ts, ts) testJSONMarshal(t, &c, w) } func Test_CheckSuiteMarshal(t *testing.T) { testJSONMarshal(t, &CheckSuite{}, "{}") now := time.Now() ts := now.Format(time.RFC3339Nano) c := CheckSuite{ ID: Int64(1), NodeID: String("n"), HeadBranch: String("h"), HeadSHA: String("h"), URL: String("u"), BeforeSHA: String("b"), AfterSHA: String("a"), Status: String("s"), Conclusion: String("c"), App: &App{ ID: Int64(1), NodeID: String("n"), Owner: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Name: String("n"), Description: String("d"), HTMLURL: String("h"), ExternalURL: String("u"), CreatedAt: &Timestamp{now}, UpdatedAt: &Timestamp{now}, }, Repository: &Repository{ ID: Int64(1), }, PullRequests: []*PullRequest{ { URL: String("u"), ID: Int64(1), Number: Int(1), Head: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, }, Base: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, }, }, }, HeadCommit: &Commit{ SHA: String("s"), }, } w := fmt.Sprintf(`{ "id": 1, "node_id": "n", "head_branch": "h", "head_sha": "h", "url": "u", "before": "b", "after": "a", "status": "s", "conclusion": "c", "app": { "id": 1, "node_id": "n", "owner": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "name": "n", "description": "d", "external_url": "u", "html_url": "h", "created_at": "%s", "updated_at": "%s" }, "repository": { "id": 1 }, "pull_requests": [ { "id": 1, "number": 1, "url": "u", "head": { "ref": "r", "sha": "s", "repo": { "id": 1, "name": "n", "url": "s" } }, "base": { "ref": "r", "sha": "s", "repo": { "id": 1, "name": "n", "url": "u" } } } ], "head_commit": { "sha": "s" } }`, ts, ts) testJSONMarshal(t, &c, w) } func TestCheckRunAnnotation_Marshal(t *testing.T) { testJSONMarshal(t, &CheckRunAnnotation{}, "{}") u := &CheckRunAnnotation{ Path: String("p"), StartLine: Int(1), EndLine: Int(1), StartColumn: Int(1), EndColumn: Int(1), AnnotationLevel: String("al"), Message: String("m"), Title: String("t"), RawDetails: String("rd"), } want := `{ "path": "p", "start_line": 1, "end_line": 1, "start_column": 1, "end_column": 1, "annotation_level": "al", "message": "m", "title": "t", "raw_details": "rd" }` testJSONMarshal(t, u, want) } func TestCheckRunImage_Marshal(t *testing.T) { testJSONMarshal(t, &CheckRunImage{}, "{}") u := &CheckRunImage{ Alt: String("a"), ImageURL: String("i"), Caption: String("c"), } want := `{ "alt": "a", "image_url": "i", "caption": "c" }` testJSONMarshal(t, u, want) } func TestCheckRunAction_Marshal(t *testing.T) { testJSONMarshal(t, &CheckRunAction{}, "{}") u := &CheckRunAction{ Label: "l", Description: "d", Identifier: "i", } want := `{ "label": "l", "description": "d", "identifier": "i" }` testJSONMarshal(t, u, want) } func TestAutoTriggerCheck_Marshal(t *testing.T) { testJSONMarshal(t, &AutoTriggerCheck{}, "{}") u := &AutoTriggerCheck{ AppID: Int64(1), Setting: Bool(false), } want := `{ "app_id": 1, "setting": false }` testJSONMarshal(t, u, want) } func TestCreateCheckSuiteOptions_Marshal(t *testing.T) { testJSONMarshal(t, &CreateCheckSuiteOptions{}, "{}") u := &CreateCheckSuiteOptions{ HeadSHA: "hsha", HeadBranch: String("hb"), } want := `{ "head_sha": "hsha", "head_branch": "hb" }` testJSONMarshal(t, u, want) } func TestCheckRunOutput_Marshal(t *testing.T) { testJSONMarshal(t, &CheckRunOutput{}, "{}") u := &CheckRunOutput{ Title: String("ti"), Summary: String("s"), Text: String("t"), AnnotationsCount: Int(1), AnnotationsURL: String("au"), Annotations: []*CheckRunAnnotation{ { Path: String("p"), StartLine: Int(1), EndLine: Int(1), StartColumn: Int(1), EndColumn: Int(1), AnnotationLevel: String("al"), Message: String("m"), Title: String("t"), RawDetails: String("rd"), }, }, Images: []*CheckRunImage{ { Alt: String("a"), ImageURL: String("i"), Caption: String("c"), }, }, } want := `{ "title": "ti", "summary": "s", "text": "t", "annotations_count": 1, "annotations_url": "au", "annotations": [ { "path": "p", "start_line": 1, "end_line": 1, "start_column": 1, "end_column": 1, "annotation_level": "al", "message": "m", "title": "t", "raw_details": "rd" } ], "images": [ { "alt": "a", "image_url": "i", "caption": "c" } ] }` testJSONMarshal(t, u, want) } func TestCreateCheckRunOptions_Marshal(t *testing.T) { testJSONMarshal(t, &CreateCheckRunOptions{}, "{}") u := &CreateCheckRunOptions{ Name: "n", HeadSHA: "hsha", DetailsURL: String("durl"), ExternalID: String("eid"), Status: String("s"), Conclusion: String("c"), StartedAt: &Timestamp{referenceTime}, CompletedAt: &Timestamp{referenceTime}, Output: &CheckRunOutput{ Title: String("ti"), Summary: String("s"), Text: String("t"), AnnotationsCount: Int(1), AnnotationsURL: String("au"), Annotations: []*CheckRunAnnotation{ { Path: String("p"), StartLine: Int(1), EndLine: Int(1), StartColumn: Int(1), EndColumn: Int(1), AnnotationLevel: String("al"), Message: String("m"), Title: String("t"), RawDetails: String("rd"), }, }, Images: []*CheckRunImage{ { Alt: String("a"), ImageURL: String("i"), Caption: String("c"), }, }, }, Actions: []*CheckRunAction{ { Label: "l", Description: "d", Identifier: "i", }, }, } want := `{ "name": "n", "head_sha": "hsha", "details_url": "durl", "external_id": "eid", "status": "s", "conclusion": "c", "started_at": ` + referenceTimeStr + `, "completed_at": ` + referenceTimeStr + `, "output": { "title": "ti", "summary": "s", "text": "t", "annotations_count": 1, "annotations_url": "au", "annotations": [ { "path": "p", "start_line": 1, "end_line": 1, "start_column": 1, "end_column": 1, "annotation_level": "al", "message": "m", "title": "t", "raw_details": "rd" } ], "images": [ { "alt": "a", "image_url": "i", "caption": "c" } ] }, "actions": [ { "label": "l", "description": "d", "identifier": "i" } ] }` testJSONMarshal(t, u, want) } func TestUpdateCheckRunOptions_Marshal(t *testing.T) { testJSONMarshal(t, &UpdateCheckRunOptions{}, "{}") u := &UpdateCheckRunOptions{ Name: "n", DetailsURL: String("durl"), ExternalID: String("eid"), Status: String("s"), Conclusion: String("c"), CompletedAt: &Timestamp{referenceTime}, Output: &CheckRunOutput{ Title: String("ti"), Summary: String("s"), Text: String("t"), AnnotationsCount: Int(1), AnnotationsURL: String("au"), Annotations: []*CheckRunAnnotation{ { Path: String("p"), StartLine: Int(1), EndLine: Int(1), StartColumn: Int(1), EndColumn: Int(1), AnnotationLevel: String("al"), Message: String("m"), Title: String("t"), RawDetails: String("rd"), }, }, Images: []*CheckRunImage{ { Alt: String("a"), ImageURL: String("i"), Caption: String("c"), }, }, }, Actions: []*CheckRunAction{ { Label: "l", Description: "d", Identifier: "i", }, }, } want := `{ "name": "n", "details_url": "durl", "external_id": "eid", "status": "s", "conclusion": "c", "completed_at": ` + referenceTimeStr + `, "output": { "title": "ti", "summary": "s", "text": "t", "annotations_count": 1, "annotations_url": "au", "annotations": [ { "path": "p", "start_line": 1, "end_line": 1, "start_column": 1, "end_column": 1, "annotation_level": "al", "message": "m", "title": "t", "raw_details": "rd" } ], "images": [ { "alt": "a", "image_url": "i", "caption": "c" } ] }, "actions": [ { "label": "l", "description": "d", "identifier": "i" } ] }` testJSONMarshal(t, u, want) } func TestListCheckRunsResults_Marshal(t *testing.T) { testJSONMarshal(t, &ListCheckRunsResults{}, "{}") l := &ListCheckRunsResults{ Total: Int(1), CheckRuns: []*CheckRun{ { ID: Int64(1), NodeID: String("n"), HeadSHA: String("h"), ExternalID: String("1"), URL: String("u"), HTMLURL: String("u"), DetailsURL: String("u"), Status: String("s"), Conclusion: String("c"), StartedAt: &Timestamp{referenceTime}, CompletedAt: &Timestamp{referenceTime}, Output: &CheckRunOutput{ Annotations: []*CheckRunAnnotation{ { AnnotationLevel: String("a"), EndLine: Int(1), Message: String("m"), Path: String("p"), RawDetails: String("r"), StartLine: Int(1), Title: String("t"), }, }, AnnotationsCount: Int(1), AnnotationsURL: String("a"), Images: []*CheckRunImage{ { Alt: String("a"), ImageURL: String("i"), Caption: String("c"), }, }, Title: String("t"), Summary: String("s"), Text: String("t"), }, Name: String("n"), CheckSuite: &CheckSuite{ ID: Int64(1), }, App: &App{ ID: Int64(1), NodeID: String("n"), Owner: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Name: String("n"), Description: String("d"), HTMLURL: String("h"), ExternalURL: String("u"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, }, PullRequests: []*PullRequest{ { URL: String("u"), ID: Int64(1), Number: Int(1), Head: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, }, Base: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, }, }, }, }, }, } w := `{ "total_count": 1, "check_runs": [ { "id": 1, "node_id": "n", "head_sha": "h", "external_id": "1", "url": "u", "html_url": "u", "details_url": "u", "status": "s", "conclusion": "c", "started_at": ` + referenceTimeStr + `, "completed_at": ` + referenceTimeStr + `, "output": { "title": "t", "summary": "s", "text": "t", "annotations_count": 1, "annotations_url": "a", "annotations": [ { "path": "p", "start_line": 1, "end_line": 1, "annotation_level": "a", "message": "m", "title": "t", "raw_details": "r" } ], "images": [ { "alt": "a", "image_url": "i", "caption": "c" } ] }, "name": "n", "check_suite": { "id": 1 }, "app": { "id": 1, "node_id": "n", "owner": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "name": "n", "description": "d", "external_url": "u", "html_url": "h", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` }, "pull_requests": [ { "id": 1, "number": 1, "url": "u", "head": { "ref": "r", "sha": "s", "repo": { "id": 1, "name": "n", "url": "s" } }, "base": { "ref": "r", "sha": "s", "repo": { "id": 1, "name": "n", "url": "u" } } } ] } ] }` testJSONMarshal(t, &l, w) } func TestListCheckSuiteResults_Marshal(t *testing.T) { testJSONMarshal(t, &ListCheckSuiteResults{}, "{}") l := &ListCheckSuiteResults{ Total: Int(1), CheckSuites: []*CheckSuite{ { ID: Int64(1), NodeID: String("n"), HeadBranch: String("h"), HeadSHA: String("h"), URL: String("u"), BeforeSHA: String("b"), AfterSHA: String("a"), Status: String("s"), Conclusion: String("c"), App: &App{ ID: Int64(1), NodeID: String("n"), Owner: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Name: String("n"), Description: String("d"), HTMLURL: String("h"), ExternalURL: String("u"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, }, Repository: &Repository{ ID: Int64(1), }, PullRequests: []*PullRequest{ { URL: String("u"), ID: Int64(1), Number: Int(1), Head: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, }, Base: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, }, }, }, HeadCommit: &Commit{ SHA: String("s"), }, }, }, } w := `{ "total_count": 1, "check_suites": [ { "id": 1, "node_id": "n", "head_branch": "h", "head_sha": "h", "url": "u", "before": "b", "after": "a", "status": "s", "conclusion": "c", "app": { "id": 1, "node_id": "n", "owner": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "name": "n", "description": "d", "external_url": "u", "html_url": "h", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` }, "repository": { "id": 1 }, "pull_requests": [ { "id": 1, "number": 1, "url": "u", "head": { "ref": "r", "sha": "s", "repo": { "id": 1, "name": "n", "url": "s" } }, "base": { "ref": "r", "sha": "s", "repo": { "id": 1, "name": "n", "url": "u" } } } ], "head_commit": { "sha": "s" } } ] }` testJSONMarshal(t, &l, w) } func TestCheckSuitePreferenceOptions_Marshal(t *testing.T) { testJSONMarshal(t, &CheckSuitePreferenceOptions{}, "{}") u := &CheckSuitePreferenceOptions{ AutoTriggerChecks: []*AutoTriggerCheck{ { AppID: Int64(1), Setting: Bool(false), }, }, } want := `{ "auto_trigger_checks": [ { "app_id": 1, "setting": false } ] }` testJSONMarshal(t, u, want) } func TestPreferenceList_Marshal(t *testing.T) { testJSONMarshal(t, &PreferenceList{}, "{}") u := &PreferenceList{ AutoTriggerChecks: []*AutoTriggerCheck{ { AppID: Int64(1), Setting: Bool(false), }, }, } want := `{ "auto_trigger_checks": [ { "app_id": 1, "setting": false } ] }` testJSONMarshal(t, u, want) } func TestCheckSuitePreferenceResults_Marshal(t *testing.T) { testJSONMarshal(t, &CheckSuitePreferenceResults{}, "{}") u := &CheckSuitePreferenceResults{ Preferences: &PreferenceList{ AutoTriggerChecks: []*AutoTriggerCheck{ { AppID: Int64(1), Setting: Bool(false), }, }, }, Repository: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, } want := `{ "preferences": { "auto_trigger_checks": [ { "app_id": 1, "setting": false } ] }, "repository": { "id":1, "name":"n", "url":"u" } }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/code-scanning.go000066400000000000000000000147431410475703100200240ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "fmt" "strconv" "strings" ) // CodeScanningService handles communication with the code scanning related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/code-scanning/ type CodeScanningService service // Rule represents the complete details of GitHub Code Scanning alert type. type Rule struct { ID *string `json:"id,omitempty"` Severity *string `json:"severity,omitempty"` Description *string `json:"description,omitempty"` Name *string `json:"name,omitempty"` SecuritySeverityLevel *string `json:"security_severity_level,omitempty"` FullDescription *string `json:"full_description,omitempty"` Tags []string `json:"tags,omitempty"` Help *string `json:"help,omitempty"` } // Location represents the exact location of the GitHub Code Scanning Alert in the scanned project. type Location struct { Path *string `json:"path,omitempty"` StartLine *int `json:"start_line,omitempty"` EndLine *int `json:"end_line,omitempty"` StartColumn *int `json:"start_column,omitempty"` EndColumn *int `json:"end_column,omitempty"` } // Message is a part of MostRecentInstance struct which provides the appropriate message when any action is performed on the analysis object. type Message struct { Text *string `json:"text,omitempty"` } // MostRecentInstance provides details of the most recent instance of this alert for the default branch or for the specified Git reference. type MostRecentInstance struct { Ref *string `json:"ref,omitempty"` AnalysisKey *string `json:"analysis_key,omitempty"` Environment *string `json:"environment,omitempty"` State *string `json:"state,omitempty"` CommitSHA *string `json:"commit_sha,omitempty"` Message *Message `json:"message,omitempty"` Location *Location `json:"location,omitempty"` Classifications []string `json:"classifications,omitempty"` } // Tool represents the tool used to generate a GitHub Code Scanning Alert. type Tool struct { Name *string `json:"name,omitempty"` GUID *string `json:"guid,omitempty"` Version *string `json:"version,omitempty"` } // Alert represents an individual GitHub Code Scanning Alert on a single repository. // // GitHub API docs: https://docs.github.com/en/rest/reference/code-scanning#list-code-scanning-alerts-for-a-repository type Alert struct { RuleID *string `json:"rule_id,omitempty"` RuleSeverity *string `json:"rule_severity,omitempty"` RuleDescription *string `json:"rule_description,omitempty"` Rule *Rule `json:"rule,omitempty"` Tool *Tool `json:"tool,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` State *string `json:"state,omitempty"` ClosedBy *User `json:"closed_by,omitempty"` ClosedAt *Timestamp `json:"closed_at,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` MostRecentInstance *MostRecentInstance `json:"most_recent_instance,omitempty"` DismissedBy *User `json:"dismissed_by,omitempty"` DismissedAt *Timestamp `json:"dismissed_at,omitempty"` DismissedReason *string `json:"dismissed_reason,omitempty"` InstancesURL *string `json:"instances_url,omitempty"` } // ID returns the ID associated with an alert. It is the number at the end of the security alert's URL. func (a *Alert) ID() int64 { if a == nil { return 0 } s := a.GetHTMLURL() // Check for an ID to parse at the end of the url if i := strings.LastIndex(s, "/"); i >= 0 { s = s[i+1:] } // Return the alert ID as a 64-bit integer. Unable to convert or out of range returns 0. id, err := strconv.ParseInt(s, 10, 64) if err != nil { return 0 } return id } // AlertListOptions specifies optional parameters to the CodeScanningService.ListAlerts // method. type AlertListOptions struct { // State of the code scanning alerts to list. Set to closed to list only closed code scanning alerts. Default: open State string `url:"state,omitempty"` // Return code scanning alerts for a specific branch reference. The ref must be formatted as heads/. Ref string `url:"ref,omitempty"` } // ListAlertsForRepo lists code scanning alerts for a repository. // // Lists all open code scanning alerts for the default branch (usually master) and protected branches in a repository. // You must use an access token with the security_events scope to use this endpoint. GitHub Apps must have the security_events // read permission to use this endpoint. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/code-scanning/#list-code-scanning-alerts-for-a-repository func (s *CodeScanningService) ListAlertsForRepo(ctx context.Context, owner, repo string, opts *AlertListOptions) ([]*Alert, *Response, error) { u := fmt.Sprintf("repos/%v/%v/code-scanning/alerts", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var alerts []*Alert resp, err := s.client.Do(ctx, req, &alerts) if err != nil { return nil, resp, err } return alerts, resp, nil } // GetAlert gets a single code scanning alert for a repository. // // You must use an access token with the security_events scope to use this endpoint. // GitHub Apps must have the security_events read permission to use this endpoint. // // The security alert_id is the number at the end of the security alert's URL. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/code-scanning/#get-a-code-scanning-alert func (s *CodeScanningService) GetAlert(ctx context.Context, owner, repo string, id int64) (*Alert, *Response, error) { u := fmt.Sprintf("repos/%v/%v/code-scanning/alerts/%v", owner, repo, id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } a := new(Alert) resp, err := s.client.Do(ctx, req, a) if err != nil { return nil, resp, err } return a, resp, nil } go-github-38.1.0/github/code-scanning_test.go000066400000000000000000000277231410475703100210650ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestActionsService_Alert_ID(t *testing.T) { // Test: nil Alert ID == 0 var a *Alert id := a.ID() var want int64 if id != want { t.Errorf("Alert.ID error returned %+v, want %+v", id, want) } // Test: Valid HTMLURL a = &Alert{ HTMLURL: String("https://github.com/o/r/security/code-scanning/88"), } id = a.ID() want = 88 if !cmp.Equal(id, want) { t.Errorf("Alert.ID error returned %+v, want %+v", id, want) } // Test: HTMLURL is nil a = &Alert{} id = a.ID() want = 0 if !cmp.Equal(id, want) { t.Errorf("Alert.ID error returned %+v, want %+v", id, want) } // Test: ID can't be parsed as an int a = &Alert{ HTMLURL: String("https://github.com/o/r/security/code-scanning/bad88"), } id = a.ID() want = 0 if !cmp.Equal(id, want) { t.Errorf("Alert.ID error returned %+v, want %+v", id, want) } } func TestActionsService_ListAlertsForRepo(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/code-scanning/alerts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"state": "open", "ref": "heads/master"}) fmt.Fprint(w, `[{ "rule_id":"js/trivial-conditional", "rule_severity":"warning", "rule_description":"Useless conditional", "tool": { "name": "CodeQL", "guid": null, "version": "1.4.0" }, "rule": { "id": "js/trivial-conditional", "severity": "warning", "description": "Useless conditional", "name": "js/trivial-conditional", "full_description": "Expression has no effect", "help": "Expression has no effect" }, "most_recent_instance": { "ref": "refs/heads/main", "state": "open", "commit_sha": "abcdefg12345", "message": { "text": "This path depends on a user-provided value." }, "location": { "path": "spec-main/api-session-spec.ts", "start_line": 917, "end_line": 917, "start_column": 7, "end_column": 18 }, "classifications": [ "test" ] }, "created_at":"2020-05-06T12:00:00Z", "state":"open", "closed_by":null, "closed_at":null, "url":"https://api.github.com/repos/o/r/code-scanning/alerts/25", "html_url":"https://github.com/o/r/security/code-scanning/25" }, { "rule_id":"js/useless-expression", "rule_severity":"warning", "rule_description":"Expression has no effect", "tool": { "name": "CodeQL", "guid": null, "version": "1.4.0" }, "rule": { "id": "js/useless-expression", "severity": "warning", "description": "Expression has no effect", "name": "js/useless-expression", "full_description": "Expression has no effect", "help": "Expression has no effect" }, "most_recent_instance": { "ref": "refs/heads/main", "state": "open", "commit_sha": "abcdefg12345", "message": { "text": "This path depends on a user-provided value." }, "location": { "path": "spec-main/api-session-spec.ts", "start_line": 917, "end_line": 917, "start_column": 7, "end_column": 18 }, "classifications": [ "test" ] }, "created_at":"2020-05-06T12:00:00Z", "state":"open", "closed_by":null, "closed_at":null, "url":"https://api.github.com/repos/o/r/code-scanning/alerts/88", "html_url":"https://github.com/o/r/security/code-scanning/88" }]`) }) opts := &AlertListOptions{State: "open", Ref: "heads/master"} ctx := context.Background() alerts, _, err := client.CodeScanning.ListAlertsForRepo(ctx, "o", "r", opts) if err != nil { t.Errorf("CodeScanning.ListAlertsForRepo returned error: %v", err) } date := Timestamp{time.Date(2020, time.May, 06, 12, 00, 00, 0, time.UTC)} want := []*Alert{ { RuleID: String("js/trivial-conditional"), RuleSeverity: String("warning"), RuleDescription: String("Useless conditional"), Tool: &Tool{Name: String("CodeQL"), GUID: nil, Version: String("1.4.0")}, Rule: &Rule{ ID: String("js/trivial-conditional"), Severity: String("warning"), Description: String("Useless conditional"), Name: String("js/trivial-conditional"), FullDescription: String("Expression has no effect"), Help: String("Expression has no effect"), }, CreatedAt: &date, State: String("open"), ClosedBy: nil, ClosedAt: nil, URL: String("https://api.github.com/repos/o/r/code-scanning/alerts/25"), HTMLURL: String("https://github.com/o/r/security/code-scanning/25"), MostRecentInstance: &MostRecentInstance{ Ref: String("refs/heads/main"), State: String("open"), CommitSHA: String("abcdefg12345"), Message: &Message{ Text: String("This path depends on a user-provided value."), }, Location: &Location{ Path: String("spec-main/api-session-spec.ts"), StartLine: Int(917), EndLine: Int(917), StartColumn: Int(7), EndColumn: Int(18), }, Classifications: []string{"test"}, }, }, { RuleID: String("js/useless-expression"), RuleSeverity: String("warning"), RuleDescription: String("Expression has no effect"), Tool: &Tool{Name: String("CodeQL"), GUID: nil, Version: String("1.4.0")}, Rule: &Rule{ ID: String("js/useless-expression"), Severity: String("warning"), Description: String("Expression has no effect"), Name: String("js/useless-expression"), FullDescription: String("Expression has no effect"), Help: String("Expression has no effect"), }, CreatedAt: &date, State: String("open"), ClosedBy: nil, ClosedAt: nil, URL: String("https://api.github.com/repos/o/r/code-scanning/alerts/88"), HTMLURL: String("https://github.com/o/r/security/code-scanning/88"), MostRecentInstance: &MostRecentInstance{ Ref: String("refs/heads/main"), State: String("open"), CommitSHA: String("abcdefg12345"), Message: &Message{ Text: String("This path depends on a user-provided value."), }, Location: &Location{ Path: String("spec-main/api-session-spec.ts"), StartLine: Int(917), EndLine: Int(917), StartColumn: Int(7), EndColumn: Int(18), }, Classifications: []string{"test"}, }, }, } if !cmp.Equal(alerts, want) { t.Errorf("CodeScanning.ListAlertsForRepo returned %+v, want %+v", alerts, want) } const methodName = "ListAlertsForRepo" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodeScanning.ListAlertsForRepo(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodeScanning.ListAlertsForRepo(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetAlert(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/code-scanning/alerts/88", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"rule_id":"js/useless-expression", "rule_severity":"warning", "rule_description":"Expression has no effect", "tool": { "name": "CodeQL", "guid": null, "version": "1.4.0" }, "rule": { "id": "useless expression", "severity": "warning", "description": "Expression has no effect", "name": "useless expression", "full_description": "Expression has no effect", "help": "Expression has no effect" }, "most_recent_instance": { "ref": "refs/heads/main", "state": "open", "commit_sha": "abcdefg12345", "message": { "text": "This path depends on a user-provided value." }, "location": { "path": "spec-main/api-session-spec.ts", "start_line": 917, "end_line": 917, "start_column": 7, "end_column": 18 }, "classifications": [ "test" ] }, "created_at":"2019-01-02T15:04:05Z", "state":"open", "closed_by":null, "closed_at":null, "url":"https://api.github.com/repos/o/r/code-scanning/alerts/88", "html_url":"https://github.com/o/r/security/code-scanning/88"}`) }) ctx := context.Background() alert, _, err := client.CodeScanning.GetAlert(ctx, "o", "r", 88) if err != nil { t.Errorf("CodeScanning.GetAlert returned error: %v", err) } date := Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)} want := &Alert{ RuleID: String("js/useless-expression"), RuleSeverity: String("warning"), RuleDescription: String("Expression has no effect"), Tool: &Tool{Name: String("CodeQL"), GUID: nil, Version: String("1.4.0")}, Rule: &Rule{ ID: String("useless expression"), Severity: String("warning"), Description: String("Expression has no effect"), Name: String("useless expression"), FullDescription: String("Expression has no effect"), Help: String("Expression has no effect"), }, CreatedAt: &date, State: String("open"), ClosedBy: nil, ClosedAt: nil, URL: String("https://api.github.com/repos/o/r/code-scanning/alerts/88"), HTMLURL: String("https://github.com/o/r/security/code-scanning/88"), MostRecentInstance: &MostRecentInstance{ Ref: String("refs/heads/main"), State: String("open"), CommitSHA: String("abcdefg12345"), Message: &Message{ Text: String("This path depends on a user-provided value."), }, Location: &Location{ Path: String("spec-main/api-session-spec.ts"), StartLine: Int(917), EndLine: Int(917), StartColumn: Int(7), EndColumn: Int(18), }, Classifications: []string{"test"}, }, } if !cmp.Equal(alert, want) { t.Errorf("CodeScanning.GetAlert returned %+v, want %+v", alert, want) } const methodName = "GetAlert" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodeScanning.GetAlert(ctx, "\n", "\n", -88) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodeScanning.GetAlert(ctx, "o", "r", 88) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAlert_Marshal(t *testing.T) { testJSONMarshal(t, &Alert{}, "{}") u := &Alert{ RuleID: String("rid"), RuleSeverity: String("rs"), RuleDescription: String("rd"), Tool: &Tool{ Name: String("n"), GUID: String("g"), Version: String("v"), }, CreatedAt: &Timestamp{referenceTime}, State: String("fixed"), ClosedBy: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, ClosedAt: &Timestamp{referenceTime}, URL: String("url"), HTMLURL: String("hurl"), } want := `{ "rule_id": "rid", "rule_severity": "rs", "rule_description": "rd", "tool": { "name": "n", "guid": "g", "version": "v" }, "created_at": ` + referenceTimeStr + `, "state": "fixed", "closed_by": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "closed_at": ` + referenceTimeStr + `, "url": "url", "html_url": "hurl" }` testJSONMarshal(t, u, want) } func TestTool_Marshal(t *testing.T) { testJSONMarshal(t, &Tool{}, "{}") u := &Tool{ Name: String("name"), GUID: String("guid"), Version: String("ver"), } want := `{ "name": "name", "guid": "guid", "version": "ver" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/doc.go000066400000000000000000000152651410475703100160610ustar00rootroot00000000000000// Copyright 2013 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 provides a client for using the GitHub API. Usage: import "github.com/google/go-github/v38/github" // with go modules enabled (GO111MODULE=on or outside GOPATH) import "github.com/google/go-github/github" // with go modules disabled Construct a new GitHub client, then use the various services on the client to access different parts of the GitHub API. For example: client := github.NewClient(nil) // list all organizations for user "willnorris" orgs, _, err := client.Organizations.List(ctx, "willnorris", nil) Some API methods have optional parameters that can be passed. For example: client := github.NewClient(nil) // list public repositories for org "github" opt := &github.RepositoryListByOrgOptions{Type: "public"} repos, _, err := client.Repositories.ListByOrg(ctx, "github", opt) The services of a client divide the API into logical chunks and correspond to the structure of the GitHub API documentation at https://docs.github.com/en/free-pro-team@latest/rest/reference/. NOTE: Using the https://godoc.org/context package, one can easily pass cancelation signals and deadlines to various services of the client for handling a request. In case there is no context available, then context.Background() can be used as a starting point. For more sample code snippets, head over to the https://github.com/google/go-github/tree/master/example directory. Authentication The go-github library does not directly handle authentication. Instead, when creating a new client, pass an http.Client that can handle authentication for you. The easiest and recommended way to do this is using the golang.org/x/oauth2 library, but you can always use any other library that provides an http.Client. If you have an OAuth2 access token (for example, a personal API token), you can use it with the oauth2 library using: import "golang.org/x/oauth2" func main() { ctx := context.Background() ts := oauth2.StaticTokenSource( &oauth2.Token{AccessToken: "... your access token ..."}, ) tc := oauth2.NewClient(ctx, ts) client := github.NewClient(tc) // list all repositories for the authenticated user repos, _, err := client.Repositories.List(ctx, "", nil) } Note that when using an authenticated Client, all calls made by the client will include the specified OAuth token. Therefore, authenticated clients should almost never be shared between different users. See the oauth2 docs for complete instructions on using that library. For API methods that require HTTP Basic Authentication, use the BasicAuthTransport. GitHub Apps authentication can be provided by the https://github.com/bradleyfalzon/ghinstallation package. import "github.com/bradleyfalzon/ghinstallation" func main() { // Wrap the shared transport for use with the integration ID 1 authenticating with installation ID 99. itr, err := ghinstallation.NewKeyFromFile(http.DefaultTransport, 1, 99, "2016-10-19.private-key.pem") if err != nil { // Handle error. } // Use installation transport with client client := github.NewClient(&http.Client{Transport: itr}) // Use client... } Rate Limiting GitHub imposes a rate limit on all API clients. Unauthenticated clients are limited to 60 requests per hour, while authenticated clients can make up to 5,000 requests per hour. The Search API has a custom rate limit. Unauthenticated clients are limited to 10 requests per minute, while authenticated clients can make up to 30 requests per minute. To receive the higher rate limit when making calls that are not issued on behalf of a user, use UnauthenticatedRateLimitedTransport. The returned Response.Rate value contains the rate limit information from the most recent API call. If a recent enough response isn't available, you can use RateLimits to fetch the most up-to-date rate limit data for the client. To detect an API rate limit error, you can check if its type is *github.RateLimitError: repos, _, err := client.Repositories.List(ctx, "", nil) if _, ok := err.(*github.RateLimitError); ok { log.Println("hit rate limit") } Learn more about GitHub rate limiting at https://docs.github.com/en/free-pro-team@latest/rest/overview/resources-in-the-rest-api#rate-limiting. Accepted Status Some endpoints may return a 202 Accepted status code, meaning that the information required is not yet ready and was scheduled to be gathered on the GitHub side. Methods known to behave like this are documented specifying this behavior. To detect this condition of error, you can check if its type is *github.AcceptedError: stats, _, err := client.Repositories.ListContributorsStats(ctx, org, repo) if _, ok := err.(*github.AcceptedError); ok { log.Println("scheduled on GitHub side") } Conditional Requests The GitHub API has good support for conditional requests which will help prevent you from burning through your rate limit, as well as help speed up your application. go-github does not handle conditional requests directly, but is instead designed to work with a caching http.Transport. We recommend using https://github.com/gregjones/httpcache for that. Learn more about GitHub conditional requests at https://docs.github.com/en/free-pro-team@latest/rest/overview/resources-in-the-rest-api#conditional-requests. Creating and Updating Resources All structs for GitHub resources use pointer values for all non-repeated fields. This allows distinguishing between unset fields and those set to a zero-value. Helper functions have been provided to easily create these pointers for string, bool, and int values. For example: // create a new private repository named "foo" repo := &github.Repository{ Name: github.String("foo"), Private: github.Bool(true), } client.Repositories.Create(ctx, "", repo) Users who have worked with protocol buffers should find this pattern familiar. Pagination All requests for resource collections (repos, pull requests, issues, etc.) support pagination. Pagination options are described in the github.ListOptions struct and passed to the list methods directly or as an embedded type of a more specific list options struct (for example github.PullRequestListOptions). Pages information is available via the github.Response struct. client := github.NewClient(nil) opt := &github.RepositoryListByOrgOptions{ ListOptions: github.ListOptions{PerPage: 10}, } // get all pages of results var allRepos []*github.Repository for { repos, resp, err := client.Repositories.ListByOrg(ctx, "github", opt) if err != nil { return err } allRepos = append(allRepos, repos...) if resp.NextPage == 0 { break } opt.Page = resp.NextPage } */ package github go-github-38.1.0/github/enterprise.go000066400000000000000000000006401410475703100174630ustar00rootroot00000000000000// Copyright 2020 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 // EnterpriseService provides access to the enterprise related functions // in the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/enterprise-admin/ type EnterpriseService service go-github-38.1.0/github/enterprise_actions_runners.go000066400000000000000000000043021410475703100227560ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "fmt" ) // CreateRegistrationToken creates a token that can be used to add a self-hosted runner. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/enterprise-admin/#create-a-registration-token-for-an-enterprise func (s *EnterpriseService) CreateRegistrationToken(ctx context.Context, enterprise string) (*RegistrationToken, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runners/registration-token", enterprise) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, nil, err } registrationToken := new(RegistrationToken) resp, err := s.client.Do(ctx, req, registrationToken) if err != nil { return nil, resp, err } return registrationToken, resp, nil } // ListRunners lists all the self-hosted runners for a enterprise. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/enterprise-admin/#list-self-hosted-runners-for-an-enterprise func (s *EnterpriseService) ListRunners(ctx context.Context, enterprise string, opts *ListOptions) (*Runners, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runners", enterprise) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } runners := &Runners{} resp, err := s.client.Do(ctx, req, &runners) if err != nil { return nil, resp, err } return runners, resp, nil } // RemoveRunner forces the removal of a self-hosted runner from an enterprise using the runner id. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/enterprise-admin/#delete-a-self-hosted-runner-from-an-enterprise func (s *EnterpriseService) RemoveRunner(ctx context.Context, enterprise string, runnerID int64) (*Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runners/%v", enterprise, runnerID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/enterprise_actions_runners_test.go000066400000000000000000000073101410475703100240170ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestEnterpriseService_CreateRegistrationToken(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/e/actions/runners/registration-token", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"token":"LLBF3JGZDX3P5PMEXLND6TS6FCWO6","expires_at":"2020-01-22T12:13:35.123Z"}`) }) ctx := context.Background() token, _, err := client.Enterprise.CreateRegistrationToken(ctx, "e") if err != nil { t.Errorf("Enterprise.CreateRegistrationToken returned error: %v", err) } want := &RegistrationToken{Token: String("LLBF3JGZDX3P5PMEXLND6TS6FCWO6"), ExpiresAt: &Timestamp{time.Date(2020, time.January, 22, 12, 13, 35, 123000000, time.UTC)}} if !cmp.Equal(token, want) { t.Errorf("Enterprise.CreateRegistrationToken returned %+v, want %+v", token, want) } const methodName = "CreateRegistrationToken" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Enterprise.CreateRegistrationToken(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Enterprise.CreateRegistrationToken(ctx, "e") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestEnterpriseService_ListRunners(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/e/actions/runners", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprint(w, `{"total_count":2,"runners":[{"id":23,"name":"MBP","os":"macos","status":"online"},{"id":24,"name":"iMac","os":"macos","status":"offline"}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() runners, _, err := client.Enterprise.ListRunners(ctx, "e", opts) if err != nil { t.Errorf("Enterprise.ListRunners returned error: %v", err) } want := &Runners{ TotalCount: 2, Runners: []*Runner{ {ID: Int64(23), Name: String("MBP"), OS: String("macos"), Status: String("online")}, {ID: Int64(24), Name: String("iMac"), OS: String("macos"), Status: String("offline")}, }, } if !cmp.Equal(runners, want) { t.Errorf("Actions.ListRunners returned %+v, want %+v", runners, want) } const methodName = "ListRunners" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Enterprise.ListRunners(ctx, "\n", &ListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Enterprise.ListRunners(ctx, "e", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestEnterpriseService_RemoveRunner(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/o/actions/runners/21", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Enterprise.RemoveRunner(ctx, "o", 21) if err != nil { t.Errorf("Actions.RemoveRunner returned error: %v", err) } const methodName = "RemoveRunner" testBadOptions(t, methodName, func() (err error) { _, err = client.Enterprise.RemoveRunner(ctx, "\n", 21) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Enterprise.RemoveRunner(ctx, "o", 21) }) } go-github-38.1.0/github/enterprise_audit_log.go000066400000000000000000000016361410475703100215200ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "fmt" ) // GetAuditLog gets the audit-log entries for an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/enterprise-admin#get-the-audit-log-for-an-enterprise func (s *EnterpriseService) GetAuditLog(ctx context.Context, enterprise string, opts *GetAuditLogOptions) ([]*AuditEntry, *Response, error) { u := fmt.Sprintf("enterprises/%v/audit-log", enterprise) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var auditEntries []*AuditEntry resp, err := s.client.Do(ctx, req, &auditEntries) if err != nil { return nil, resp, err } return auditEntries, resp, nil } go-github-38.1.0/github/enterprise_audit_log_test.go000066400000000000000000000057261410475703100225630ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestEnterpriseService_GetAuditLog(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/e/audit-log", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[ { "workflow_id": 123456, "head_branch": "master", "org": "o", "trigger_id": null, "repo": "o/blue-crayon-1", "created_at": 1615077308538, "head_sha": "5acdeadbeef64d1a62388e901e5cdc9358644b37", "conclusion": "success", "actor": "testactor", "completed_at": "2021-03-07T00:35:08.000Z", "@timestamp": 1615077308538, "name": "Code scanning - action", "action": "workflows.completed_workflow_run", "started_at": "2021-03-07T00:33:04.000Z", "event": "schedule", "workflow_run_id": 628312345, "_document_id": "beeZYapIUe-wKg5-beadb33" } ]`) }) getOpts := GetAuditLogOptions{ Include: String("all"), Phrase: String("action:workflows"), Order: String("asc"), } ctx := context.Background() auditEntries, _, err := client.Enterprise.GetAuditLog(ctx, "e", &getOpts) if err != nil { t.Errorf("Enterprise.GetAuditLog returned error: %v", err) } startedAt, _ := time.Parse(time.RFC3339, "2021-03-07T00:33:04.000Z") completedAt, _ := time.Parse(time.RFC3339, "2021-03-07T00:35:08.000Z") timestamp := time.Unix(0, 1615077308538*1e6) want := []*AuditEntry{ { Timestamp: &Timestamp{timestamp}, DocumentID: String("beeZYapIUe-wKg5-beadb33"), Action: String("workflows.completed_workflow_run"), Actor: String("testactor"), CompletedAt: &Timestamp{completedAt}, Conclusion: String("success"), CreatedAt: &Timestamp{timestamp}, Event: String("schedule"), HeadBranch: String("master"), HeadSHA: String("5acdeadbeef64d1a62388e901e5cdc9358644b37"), Name: String("Code scanning - action"), Org: String("o"), Repo: String("o/blue-crayon-1"), StartedAt: &Timestamp{startedAt}, WorkflowID: Int64(123456), WorkflowRunID: Int64(628312345), }, } if !cmp.Equal(auditEntries, want) { t.Errorf("Enterprise.GetAuditLog return \ngot: %+v,\nwant:%+v", auditEntries, want) } const methodName = "GetAuditLog" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Enterprise.GetAuditLog(ctx, "\n", &getOpts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Enterprise.GetAuditLog(ctx, "o", &GetAuditLogOptions{}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-38.1.0/github/event.go000066400000000000000000000101611410475703100164230ustar00rootroot00000000000000// Copyright 2018 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 ( "encoding/json" "time" ) // Event represents a GitHub event. type Event struct { Type *string `json:"type,omitempty"` Public *bool `json:"public,omitempty"` RawPayload *json.RawMessage `json:"payload,omitempty"` Repo *Repository `json:"repo,omitempty"` Actor *User `json:"actor,omitempty"` Org *Organization `json:"org,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` ID *string `json:"id,omitempty"` } func (e Event) String() string { return Stringify(e) } // ParsePayload parses the event payload. For recognized event types, // a value of the corresponding struct type will be returned. func (e *Event) ParsePayload() (payload interface{}, err error) { switch *e.Type { case "CheckRunEvent": payload = &CheckRunEvent{} case "CheckSuiteEvent": payload = &CheckSuiteEvent{} case "CommitCommentEvent": payload = &CommitCommentEvent{} case "ContentReferenceEvent": payload = &ContentReferenceEvent{} case "CreateEvent": payload = &CreateEvent{} case "DeleteEvent": payload = &DeleteEvent{} case "DeployKeyEvent": payload = &DeployKeyEvent{} case "DeploymentEvent": payload = &DeploymentEvent{} case "DeploymentStatusEvent": payload = &DeploymentStatusEvent{} case "ForkEvent": payload = &ForkEvent{} case "GitHubAppAuthorizationEvent": payload = &GitHubAppAuthorizationEvent{} case "GollumEvent": payload = &GollumEvent{} case "InstallationEvent": payload = &InstallationEvent{} case "InstallationRepositoriesEvent": payload = &InstallationRepositoriesEvent{} case "IssueCommentEvent": payload = &IssueCommentEvent{} case "IssuesEvent": payload = &IssuesEvent{} case "LabelEvent": payload = &LabelEvent{} case "MarketplacePurchaseEvent": payload = &MarketplacePurchaseEvent{} case "MemberEvent": payload = &MemberEvent{} case "MembershipEvent": payload = &MembershipEvent{} case "MetaEvent": payload = &MetaEvent{} case "MilestoneEvent": payload = &MilestoneEvent{} case "OrganizationEvent": payload = &OrganizationEvent{} case "OrgBlockEvent": payload = &OrgBlockEvent{} case "PackageEvent": payload = &PackageEvent{} case "PageBuildEvent": payload = &PageBuildEvent{} case "PingEvent": payload = &PingEvent{} case "ProjectEvent": payload = &ProjectEvent{} case "ProjectCardEvent": payload = &ProjectCardEvent{} case "ProjectColumnEvent": payload = &ProjectColumnEvent{} case "PublicEvent": payload = &PublicEvent{} case "PullRequestEvent": payload = &PullRequestEvent{} case "PullRequestReviewEvent": payload = &PullRequestReviewEvent{} case "PullRequestReviewCommentEvent": payload = &PullRequestReviewCommentEvent{} case "PullRequestTargetEvent": payload = &PullRequestTargetEvent{} case "PushEvent": payload = &PushEvent{} case "ReleaseEvent": payload = &ReleaseEvent{} case "RepositoryEvent": payload = &RepositoryEvent{} case "RepositoryDispatchEvent": payload = &RepositoryDispatchEvent{} case "RepositoryVulnerabilityAlertEvent": payload = &RepositoryVulnerabilityAlertEvent{} case "StarEvent": payload = &StarEvent{} case "StatusEvent": payload = &StatusEvent{} case "TeamEvent": payload = &TeamEvent{} case "TeamAddEvent": payload = &TeamAddEvent{} case "UserEvent": payload = &UserEvent{} case "WatchEvent": payload = &WatchEvent{} case "WorkflowDispatchEvent": payload = &WorkflowDispatchEvent{} case "WorkflowRunEvent": payload = &WorkflowRunEvent{} } err = json.Unmarshal(*e.RawPayload, &payload) return payload, err } // Payload returns the parsed event payload. For recognized event types, // a value of the corresponding struct type will be returned. // // Deprecated: Use ParsePayload instead, which returns an error // rather than panics if JSON unmarshaling raw payload fails. func (e *Event) Payload() (payload interface{}) { var err error payload, err = e.ParsePayload() if err != nil { panic(err) } return payload } go-github-38.1.0/github/event_test.go000066400000000000000000000066351410475703100174750ustar00rootroot00000000000000// Copyright 2020 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 ( "encoding/json" "testing" ) func TestPayload_Panic(t *testing.T) { defer func() { if r := recover(); r == nil { t.Errorf("Payload did not panic but should have") } }() name := "UserEvent" body := json.RawMessage("[") // bogus JSON e := &Event{Type: &name, RawPayload: &body} e.Payload() } func TestPayload_NoPanic(t *testing.T) { name := "UserEvent" body := json.RawMessage("{}") e := &Event{Type: &name, RawPayload: &body} e.Payload() } func TestEvent_Marshal(t *testing.T) { testJSONMarshal(t, &Event{}, "{}") l := make(map[string]interface{}) l["key"] = "value" jsonMsg, _ := json.Marshal(&l) u := &Event{ Type: String("t"), Public: Bool(false), RawPayload: (*json.RawMessage)(&jsonMsg), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Actor: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, CreatedAt: &referenceTime, ID: String("id"), } want := `{ "type": "t", "public": false, "payload": { "key": "value" }, "repo": { "id": 1, "name": "n", "url": "s" }, "actor": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "org": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "created_at": ` + referenceTimeStr + `, "id": "id" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/event_types.go000066400000000000000000001414041410475703100176540ustar00rootroot00000000000000// Copyright 2016 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. // These event types are shared between the Events API and used as Webhook payloads. package github import "encoding/json" // RequestedAction is included in a CheckRunEvent when a user has invoked an action, // i.e. when the CheckRunEvent's Action field is "requested_action". type RequestedAction struct { Identifier string `json:"identifier"` // The integrator reference of the action requested by the user. } // CheckRunEvent is triggered when a check run is "created", "completed", or "rerequested". // The Webhook event name is "check_run". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#check_run type CheckRunEvent struct { CheckRun *CheckRun `json:"check_run,omitempty"` // The action performed. Possible values are: "created", "completed", "rerequested" or "requested_action". Action *string `json:"action,omitempty"` // The following fields are only populated by Webhook events. Repo *Repository `json:"repository,omitempty"` Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` // The action requested by the user. Populated when the Action is "requested_action". RequestedAction *RequestedAction `json:"requested_action,omitempty"` // } // CheckSuiteEvent is triggered when a check suite is "completed", "requested", or "rerequested". // The Webhook event name is "check_suite". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#check_suite type CheckSuiteEvent struct { CheckSuite *CheckSuite `json:"check_suite,omitempty"` // The action performed. Possible values are: "completed", "requested" or "rerequested". Action *string `json:"action,omitempty"` // The following fields are only populated by Webhook events. Repo *Repository `json:"repository,omitempty"` Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // CommitCommentEvent is triggered when a commit comment is created. // The Webhook event name is "commit_comment". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#commit_comment type CommitCommentEvent struct { Comment *RepositoryComment `json:"comment,omitempty"` // The following fields are only populated by Webhook events. Action *string `json:"action,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // ContentReferenceEvent is triggered when the body or comment of an issue or // pull request includes a URL that matches a configured content reference // domain. // The Webhook event name is "content_reference". // // GitHub API docs: https://developer.github.com/webhooks/event-payloads/#content_reference type ContentReferenceEvent struct { Action *string `json:"action,omitempty"` ContentReference *ContentReference `json:"content_reference,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // CreateEvent represents a created repository, branch, or tag. // The Webhook event name is "create". // // Note: webhooks will not receive this event for created repositories. // Additionally, webhooks will not receive this event for tags if more // than three tags are pushed at once. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/github-event-types#createevent type CreateEvent struct { Ref *string `json:"ref,omitempty"` // RefType is the object that was created. Possible values are: "repository", "branch", "tag". RefType *string `json:"ref_type,omitempty"` MasterBranch *string `json:"master_branch,omitempty"` Description *string `json:"description,omitempty"` // The following fields are only populated by Webhook events. PusherType *string `json:"pusher_type,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // DeleteEvent represents a deleted branch or tag. // The Webhook event name is "delete". // // Note: webhooks will not receive this event for tags if more than three tags // are deleted at once. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/github-event-types#deleteevent type DeleteEvent struct { Ref *string `json:"ref,omitempty"` // RefType is the object that was deleted. Possible values are: "branch", "tag". RefType *string `json:"ref_type,omitempty"` // The following fields are only populated by Webhook events. PusherType *string `json:"pusher_type,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // DeployKeyEvent is triggered when a deploy key is added or removed from a repository. // The Webhook event name is "deploy_key". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#deploy_key type DeployKeyEvent struct { // Action is the action that was performed. Possible values are: // "created" or "deleted". Action *string `json:"action,omitempty"` // The deploy key resource. Key *Key `json:"key,omitempty"` } // DeploymentEvent represents a deployment. // The Webhook event name is "deployment". // // Events of this type are not visible in timelines, they are only used to trigger hooks. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#deployment type DeploymentEvent struct { Deployment *Deployment `json:"deployment,omitempty"` Repo *Repository `json:"repository,omitempty"` // The following fields are only populated by Webhook events. Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // DeploymentStatusEvent represents a deployment status. // The Webhook event name is "deployment_status". // // Events of this type are not visible in timelines, they are only used to trigger hooks. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#deployment_status type DeploymentStatusEvent struct { Deployment *Deployment `json:"deployment,omitempty"` DeploymentStatus *DeploymentStatus `json:"deployment_status,omitempty"` Repo *Repository `json:"repository,omitempty"` // The following fields are only populated by Webhook events. Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // ForkEvent is triggered when a user forks a repository. // The Webhook event name is "fork". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#fork type ForkEvent struct { // Forkee is the created repository. Forkee *Repository `json:"forkee,omitempty"` // The following fields are only populated by Webhook events. Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // GitHubAppAuthorizationEvent is triggered when a user's authorization for a // GitHub Application is revoked. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#github_app_authorization type GitHubAppAuthorizationEvent struct { // The action performed. Possible value is: "revoked". Action *string `json:"action,omitempty"` // The following fields are only populated by Webhook events. Sender *User `json:"sender,omitempty"` } // Page represents a single Wiki page. type Page struct { PageName *string `json:"page_name,omitempty"` Title *string `json:"title,omitempty"` Summary *string `json:"summary,omitempty"` Action *string `json:"action,omitempty"` SHA *string `json:"sha,omitempty"` HTMLURL *string `json:"html_url,omitempty"` } // GollumEvent is triggered when a Wiki page is created or updated. // The Webhook event name is "gollum". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#gollum type GollumEvent struct { Pages []*Page `json:"pages,omitempty"` // The following fields are only populated by Webhook events. Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // EditChange represents the changes when an issue, pull request, or comment has // been edited. type EditChange struct { Title *EditTitle `json:"title,omitempty"` Body *EditBody `json:"body,omitempty"` Base *EditBase `json:"base,omitempty"` } // EditTitle represents a pull-request title change. type EditTitle struct { From *string `json:"from,omitempty"` } // EditBody represents a change of pull-request body. type EditBody struct { From *string `json:"from,omitempty"` } // EditBase represents the change of a pull-request base branch. type EditBase struct { Ref *EditRef `json:"ref,omitempty"` SHA *EditSHA `json:"sha,omitempty"` } // EditRef represents a ref change of a pull-request. type EditRef struct { From *string `json:"from,omitempty"` } // EditSHA represents a sha change of a pull-request. type EditSHA struct { From *string `json:"from,omitempty"` } // ProjectChange represents the changes when a project has been edited. type ProjectChange struct { Name *ProjectName `json:"name,omitempty"` Body *ProjectBody `json:"body,omitempty"` } // ProjectName represents a project name change. type ProjectName struct { From *string `json:"from,omitempty"` } // ProjectBody represents a project body change. type ProjectBody struct { From *string `json:"from,omitempty"` } // ProjectCardChange represents the changes when a project card has been edited. type ProjectCardChange struct { Note *ProjectCardNote `json:"note,omitempty"` } // ProjectCardNote represents a change of a note of a project card. type ProjectCardNote struct { From *string `json:"from,omitempty"` } // ProjectColumnChange represents the changes when a project column has been edited. type ProjectColumnChange struct { Name *ProjectColumnName `json:"name,omitempty"` } // ProjectColumnName represents a project column name change. type ProjectColumnName struct { From *string `json:"from,omitempty"` } // TeamChange represents the changes when a team has been edited. type TeamChange struct { Description *TeamDescription `json:"description,omitempty"` Name *TeamName `json:"name,omitempty"` Privacy *TeamPrivacy `json:"privacy,omitempty"` Repository *TeamRepository `json:"repository,omitempty"` } // TeamDescription represents a team description change. type TeamDescription struct { From *string `json:"from,omitempty"` } // TeamName represents a team name change. type TeamName struct { From *string `json:"from,omitempty"` } // TeamPrivacy represents a team privacy change. type TeamPrivacy struct { From *string `json:"from,omitempty"` } // TeamRepository represents a team repository permission change. type TeamRepository struct { Permissions *TeamPermissions `json:"permissions,omitempty"` } // TeamPermissions represents a team permission change. type TeamPermissions struct { From *TeamPermissionsFrom `json:"from,omitempty"` } // TeamPermissionsFrom represents a team permission change. type TeamPermissionsFrom struct { Admin *bool `json:"admin,omitempty"` Pull *bool `json:"pull,omitempty"` Push *bool `json:"push,omitempty"` } // InstallationEvent is triggered when a GitHub App has been installed, uninstalled, suspend, unsuspended // or new permissions have been accepted. // The Webhook event name is "installation". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#installation type InstallationEvent struct { // The action that was performed. Can be either "created", "deleted", "suspend", "unsuspend" or "new_permissions_accepted". Action *string `json:"action,omitempty"` Repositories []*Repository `json:"repositories,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` // TODO key "requester" is not covered } // InstallationRepositoriesEvent is triggered when a repository is added or // removed from an installation. The Webhook event name is "installation_repositories". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#installation_repositories type InstallationRepositoriesEvent struct { // The action that was performed. Can be either "added" or "removed". Action *string `json:"action,omitempty"` RepositoriesAdded []*Repository `json:"repositories_added,omitempty"` RepositoriesRemoved []*Repository `json:"repositories_removed,omitempty"` RepositorySelection *string `json:"repository_selection,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // IssueCommentEvent is triggered when an issue comment is created on an issue // or pull request. // The Webhook event name is "issue_comment". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#issue_comment type IssueCommentEvent struct { // Action is the action that was performed on the comment. // Possible values are: "created", "edited", "deleted". Action *string `json:"action,omitempty"` Issue *Issue `json:"issue,omitempty"` Comment *IssueComment `json:"comment,omitempty"` // The following fields are only populated by Webhook events. Changes *EditChange `json:"changes,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // IssuesEvent is triggered when an issue is opened, edited, deleted, transferred, // pinned, unpinned, closed, reopened, assigned, unassigned, labeled, unlabeled, // locked, unlocked, milestoned, or demilestoned. // The Webhook event name is "issues". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#issues type IssuesEvent struct { // Action is the action that was performed. Possible values are: "opened", // "edited", "deleted", "transferred", "pinned", "unpinned", "closed", "reopened", // "assigned", "unassigned", "labeled", "unlabeled", "locked", "unlocked", // "milestoned", or "demilestoned". Action *string `json:"action,omitempty"` Issue *Issue `json:"issue,omitempty"` Assignee *User `json:"assignee,omitempty"` Label *Label `json:"label,omitempty"` // The following fields are only populated by Webhook events. Changes *EditChange `json:"changes,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // LabelEvent is triggered when a repository's label is created, edited, or deleted. // The Webhook event name is "label" // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#label type LabelEvent struct { // Action is the action that was performed. Possible values are: // "created", "edited", "deleted" Action *string `json:"action,omitempty"` Label *Label `json:"label,omitempty"` // The following fields are only populated by Webhook events. Changes *EditChange `json:"changes,omitempty"` Repo *Repository `json:"repository,omitempty"` Org *Organization `json:"organization,omitempty"` Installation *Installation `json:"installation,omitempty"` } // MarketplacePurchaseEvent is triggered when a user purchases, cancels, or changes // their GitHub Marketplace plan. // Webhook event name "marketplace_purchase". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#marketplace_purchase type MarketplacePurchaseEvent struct { // Action is the action that was performed. Possible values are: // "purchased", "cancelled", "pending_change", "pending_change_cancelled", "changed". Action *string `json:"action,omitempty"` // The following fields are only populated by Webhook events. EffectiveDate *Timestamp `json:"effective_date,omitempty"` MarketplacePurchase *MarketplacePurchase `json:"marketplace_purchase,omitempty"` PreviousMarketplacePurchase *MarketplacePurchase `json:"previous_marketplace_purchase,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // MemberEvent is triggered when a user is added as a collaborator to a repository. // The Webhook event name is "member". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#member type MemberEvent struct { // Action is the action that was performed. Possible value is: "added". Action *string `json:"action,omitempty"` Member *User `json:"member,omitempty"` // The following fields are only populated by Webhook events. Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // MembershipEvent is triggered when a user is added or removed from a team. // The Webhook event name is "membership". // // Events of this type are not visible in timelines, they are only used to // trigger organization webhooks. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#membership type MembershipEvent struct { // Action is the action that was performed. Possible values are: "added", "removed". Action *string `json:"action,omitempty"` // Scope is the scope of the membership. Possible value is: "team". Scope *string `json:"scope,omitempty"` Member *User `json:"member,omitempty"` Team *Team `json:"team,omitempty"` // The following fields are only populated by Webhook events. Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // MetaEvent is triggered when the webhook that this event is configured on is deleted. // This event will only listen for changes to the particular hook the event is installed on. // Therefore, it must be selected for each hook that you'd like to receive meta events for. // The Webhook event name is "meta". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#meta type MetaEvent struct { // Action is the action that was performed. Possible value is: "deleted". Action *string `json:"action,omitempty"` // The ID of the modified webhook. HookID *int64 `json:"hook_id,omitempty"` // The modified webhook. // This will contain different keys based on the type of webhook it is: repository, // organization, business, app, or GitHub Marketplace. Hook *Hook `json:"hook,omitempty"` } // MilestoneEvent is triggered when a milestone is created, closed, opened, edited, or deleted. // The Webhook event name is "milestone". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#milestone type MilestoneEvent struct { // Action is the action that was performed. Possible values are: // "created", "closed", "opened", "edited", "deleted" Action *string `json:"action,omitempty"` Milestone *Milestone `json:"milestone,omitempty"` // The following fields are only populated by Webhook events. Changes *EditChange `json:"changes,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Org *Organization `json:"organization,omitempty"` Installation *Installation `json:"installation,omitempty"` } // OrganizationEvent is triggered when an organization is deleted and renamed, and when a user is added, // removed, or invited to an organization. // Events of this type are not visible in timelines. These events are only used to trigger organization hooks. // Webhook event name is "organization". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#organization type OrganizationEvent struct { // Action is the action that was performed. // Possible values are: "deleted", "renamed", "member_added", "member_removed", or "member_invited". Action *string `json:"action,omitempty"` // Invitation is the invitation for the user or email if the action is "member_invited". Invitation *Invitation `json:"invitation,omitempty"` // Membership is the membership between the user and the organization. // Not present when the action is "member_invited". Membership *Membership `json:"membership,omitempty"` Organization *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // OrgBlockEvent is triggered when an organization blocks or unblocks a user. // The Webhook event name is "org_block". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#org_block type OrgBlockEvent struct { // Action is the action that was performed. // Can be "blocked" or "unblocked". Action *string `json:"action,omitempty"` BlockedUser *User `json:"blocked_user,omitempty"` Organization *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` // The following fields are only populated by Webhook events. Installation *Installation `json:"installation,omitempty"` } // PackageEvent represents activity related to GitHub Packages. // The Webhook event name is "package". // // This event is triggered when a GitHub Package is published or updated. // // GitHub API docs: https://developer.github.com/webhooks/event-payloads/#package type PackageEvent struct { // Action is the action that was performed. // Can be "published" or "updated". Action *string `json:"action,omitempty"` Package *Package `json:"package,omitempty"` Repo *Repository `json:"repository,omitempty"` Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` } // PageBuildEvent represents an attempted build of a GitHub Pages site, whether // successful or not. // The Webhook event name is "page_build". // // This event is triggered on push to a GitHub Pages enabled branch (gh-pages // for project pages, master for user and organization pages). // // Events of this type are not visible in timelines, they are only used to trigger hooks. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#page_build type PageBuildEvent struct { Build *PagesBuild `json:"build,omitempty"` // The following fields are only populated by Webhook events. ID *int64 `json:"id,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // PingEvent is triggered when a Webhook is added to GitHub. // // GitHub API docs: https://developer.github.com/webhooks/#ping-event type PingEvent struct { // Random string of GitHub zen. Zen *string `json:"zen,omitempty"` // The ID of the webhook that triggered the ping. HookID *int64 `json:"hook_id,omitempty"` // The webhook configuration. Hook *Hook `json:"hook,omitempty"` Installation *Installation `json:"installation,omitempty"` } // ProjectEvent is triggered when project is created, modified or deleted. // The webhook event name is "project". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#project type ProjectEvent struct { Action *string `json:"action,omitempty"` Changes *ProjectChange `json:"changes,omitempty"` Project *Project `json:"project,omitempty"` // The following fields are only populated by Webhook events. Repo *Repository `json:"repository,omitempty"` Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // ProjectCardEvent is triggered when a project card is created, updated, moved, converted to an issue, or deleted. // The webhook event name is "project_card". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#project_card type ProjectCardEvent struct { Action *string `json:"action,omitempty"` Changes *ProjectCardChange `json:"changes,omitempty"` AfterID *int64 `json:"after_id,omitempty"` ProjectCard *ProjectCard `json:"project_card,omitempty"` // The following fields are only populated by Webhook events. Repo *Repository `json:"repository,omitempty"` Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // ProjectColumnEvent is triggered when a project column is created, updated, moved, or deleted. // The webhook event name is "project_column". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#project_column type ProjectColumnEvent struct { Action *string `json:"action,omitempty"` Changes *ProjectColumnChange `json:"changes,omitempty"` AfterID *int64 `json:"after_id,omitempty"` ProjectColumn *ProjectColumn `json:"project_column,omitempty"` // The following fields are only populated by Webhook events. Repo *Repository `json:"repository,omitempty"` Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // PublicEvent is triggered when a private repository is open sourced. // According to GitHub: "Without a doubt: the best GitHub event." // The Webhook event name is "public". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#public type PublicEvent struct { // The following fields are only populated by Webhook events. Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // PullRequestEvent is triggered when a pull request is assigned, unassigned, labeled, // unlabeled, opened, edited, closed, reopened, synchronize, ready_for_review, // locked, unlocked, a pull request review is requested, or a review request is removed. // The Webhook event name is "pull_request". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/github-event-types#pullrequestevent type PullRequestEvent struct { // Action is the action that was performed. Possible values are: // "assigned", "unassigned", "review_requested", "review_request_removed", "labeled", "unlabeled", // "opened", "edited", "closed", "ready_for_review", "locked", "unlocked", or "reopened". // If the action is "closed" and the "merged" key is "false", the pull request was closed with unmerged commits. // If the action is "closed" and the "merged" key is "true", the pull request was merged. // While webhooks are also triggered when a pull request is synchronized, Events API timelines // don't include pull request events with the "synchronize" action. Action *string `json:"action,omitempty"` Assignee *User `json:"assignee,omitempty"` Number *int `json:"number,omitempty"` PullRequest *PullRequest `json:"pull_request,omitempty"` // The following fields are only populated by Webhook events. Changes *EditChange `json:"changes,omitempty"` // RequestedReviewer is populated in "review_requested", "review_request_removed" event deliveries. // A request affecting multiple reviewers at once is split into multiple // such event deliveries, each with a single, different RequestedReviewer. RequestedReviewer *User `json:"requested_reviewer,omitempty"` // In the event that a team is requested instead of a user, "requested_team" gets sent in place of // "requested_user" with the same delivery behavior. RequestedTeam *Team `json:"requested_team,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` Label *Label `json:"label,omitempty"` // Populated in "labeled" event deliveries. // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Organization *Organization `json:"organization,omitempty"` // The following fields are only populated when the Action is "synchronize". Before *string `json:"before,omitempty"` After *string `json:"after,omitempty"` } // PullRequestReviewEvent is triggered when a review is submitted on a pull // request. // The Webhook event name is "pull_request_review". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#pull_request_review type PullRequestReviewEvent struct { // Action is always "submitted". Action *string `json:"action,omitempty"` Review *PullRequestReview `json:"review,omitempty"` PullRequest *PullRequest `json:"pull_request,omitempty"` // The following fields are only populated by Webhook events. Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Organization *Organization `json:"organization,omitempty"` } // PullRequestReviewCommentEvent is triggered when a comment is created on a // portion of the unified diff of a pull request. // The Webhook event name is "pull_request_review_comment". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#pull_request_review_comment type PullRequestReviewCommentEvent struct { // Action is the action that was performed on the comment. // Possible values are: "created", "edited", "deleted". Action *string `json:"action,omitempty"` PullRequest *PullRequest `json:"pull_request,omitempty"` Comment *PullRequestComment `json:"comment,omitempty"` // The following fields are only populated by Webhook events. Changes *EditChange `json:"changes,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // PullRequestTargetEvent is triggered when a pull request is assigned, unassigned, labeled, // unlabeled, opened, edited, closed, reopened, synchronize, ready_for_review, // locked, unlocked, a pull request review is requested, or a review request is removed. // The Webhook event name is "pull_request_target". // // GitHub API docs: https://docs.github.com/en/actions/reference/events-that-trigger-workflows#pull_request_target type PullRequestTargetEvent struct { // Action is the action that was performed. Possible values are: // "assigned", "unassigned", "labeled", "unlabeled", "opened", "edited", "closed", "reopened", // "ready_for_review", "locked", "unlocked", "review_requested" or "review_request_removed". // If the action is "closed" and the "merged" key is "false", the pull request was closed with unmerged commits. // If the action is "closed" and the "merged" key is "true", the pull request was merged. // While webhooks are also triggered when a pull request is synchronized, Events API timelines // don't include pull request events with the "synchronize" action. Action *string `json:"action,omitempty"` Assignee *User `json:"assignee,omitempty"` Number *int `json:"number,omitempty"` PullRequest *PullRequest `json:"pull_request,omitempty"` // The following fields are only populated by Webhook events. Changes *EditChange `json:"changes,omitempty"` // RequestedReviewer is populated in "review_requested", "review_request_removed" event deliveries. // A request affecting multiple reviewers at once is split into multiple // such event deliveries, each with a single, different RequestedReviewer. RequestedReviewer *User `json:"requested_reviewer,omitempty"` // In the event that a team is requested instead of a user, "requested_team" gets sent in place of // "requested_user" with the same delivery behavior. RequestedTeam *Team `json:"requested_team,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` Label *Label `json:"label,omitempty"` // Populated in "labeled" event deliveries. // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Organization *Organization `json:"organization,omitempty"` // The following fields are only populated when the Action is "synchronize". Before *string `json:"before,omitempty"` After *string `json:"after,omitempty"` } // PushEvent represents a git push to a GitHub repository. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#push type PushEvent struct { PushID *int64 `json:"push_id,omitempty"` Head *string `json:"head,omitempty"` Ref *string `json:"ref,omitempty"` Size *int `json:"size,omitempty"` Commits []*HeadCommit `json:"commits,omitempty"` Before *string `json:"before,omitempty"` DistinctSize *int `json:"distinct_size,omitempty"` // The following fields are only populated by Webhook events. After *string `json:"after,omitempty"` Created *bool `json:"created,omitempty"` Deleted *bool `json:"deleted,omitempty"` Forced *bool `json:"forced,omitempty"` BaseRef *string `json:"base_ref,omitempty"` Compare *string `json:"compare,omitempty"` Repo *PushEventRepository `json:"repository,omitempty"` HeadCommit *HeadCommit `json:"head_commit,omitempty"` Pusher *User `json:"pusher,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } func (p PushEvent) String() string { return Stringify(p) } // HeadCommit represents a git commit in a GitHub PushEvent. type HeadCommit struct { Message *string `json:"message,omitempty"` Author *CommitAuthor `json:"author,omitempty"` URL *string `json:"url,omitempty"` Distinct *bool `json:"distinct,omitempty"` // The following fields are only populated by Events API. SHA *string `json:"sha,omitempty"` // The following fields are only populated by Webhook events. ID *string `json:"id,omitempty"` TreeID *string `json:"tree_id,omitempty"` Timestamp *Timestamp `json:"timestamp,omitempty"` Committer *CommitAuthor `json:"committer,omitempty"` Added []string `json:"added,omitempty"` Removed []string `json:"removed,omitempty"` Modified []string `json:"modified,omitempty"` } func (p HeadCommit) String() string { return Stringify(p) } // PushEventRepository represents the repo object in a PushEvent payload. type PushEventRepository struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Name *string `json:"name,omitempty"` FullName *string `json:"full_name,omitempty"` Owner *User `json:"owner,omitempty"` Private *bool `json:"private,omitempty"` Description *string `json:"description,omitempty"` Fork *bool `json:"fork,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` PushedAt *Timestamp `json:"pushed_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` Homepage *string `json:"homepage,omitempty"` PullsURL *string `json:"pulls_url,omitempty"` Size *int `json:"size,omitempty"` StargazersCount *int `json:"stargazers_count,omitempty"` WatchersCount *int `json:"watchers_count,omitempty"` Language *string `json:"language,omitempty"` HasIssues *bool `json:"has_issues,omitempty"` HasDownloads *bool `json:"has_downloads,omitempty"` HasWiki *bool `json:"has_wiki,omitempty"` HasPages *bool `json:"has_pages,omitempty"` ForksCount *int `json:"forks_count,omitempty"` Archived *bool `json:"archived,omitempty"` Disabled *bool `json:"disabled,omitempty"` OpenIssuesCount *int `json:"open_issues_count,omitempty"` DefaultBranch *string `json:"default_branch,omitempty"` MasterBranch *string `json:"master_branch,omitempty"` Organization *string `json:"organization,omitempty"` URL *string `json:"url,omitempty"` ArchiveURL *string `json:"archive_url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` StatusesURL *string `json:"statuses_url,omitempty"` GitURL *string `json:"git_url,omitempty"` SSHURL *string `json:"ssh_url,omitempty"` CloneURL *string `json:"clone_url,omitempty"` SVNURL *string `json:"svn_url,omitempty"` } // PushEventRepoOwner is a basic representation of user/org in a PushEvent payload. type PushEventRepoOwner struct { Name *string `json:"name,omitempty"` Email *string `json:"email,omitempty"` } // ReleaseEvent is triggered when a release is published, unpublished, created, // edited, deleted, or prereleased. // The Webhook event name is "release". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#release type ReleaseEvent struct { // Action is the action that was performed. Possible values are: "published", "unpublished", // "created", "edited", "deleted", or "prereleased". Action *string `json:"action,omitempty"` Release *RepositoryRelease `json:"release,omitempty"` // The following fields are only populated by Webhook events. Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // RepositoryEvent is triggered when a repository is created, archived, unarchived, // renamed, edited, transferred, made public, or made private. Organization hooks are // also trigerred when a repository is deleted. // The Webhook event name is "repository". // // Events of this type are not visible in timelines, they are only used to // trigger organization webhooks. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#repository type RepositoryEvent struct { // Action is the action that was performed. Possible values are: "created", // "deleted" (organization hooks only), "archived", "unarchived", "edited", "renamed", // "transferred", "publicized", or "privatized". Action *string `json:"action,omitempty"` Repo *Repository `json:"repository,omitempty"` // The following fields are only populated by Webhook events. Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // RepositoryDispatchEvent is triggered when a client sends a POST request to the repository dispatch event endpoint. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#repository_dispatch type RepositoryDispatchEvent struct { // Action is the event_type that submitted with the repository dispatch payload. Value can be any string. Action *string `json:"action,omitempty"` Branch *string `json:"branch,omitempty"` ClientPayload json.RawMessage `json:"client_payload,omitempty"` Repo *Repository `json:"repository,omitempty"` // The following fields are only populated by Webhook events. Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // RepositoryVulnerabilityAlertEvent is triggered when a security alert is created, dismissed, or resolved. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#repository_vulnerability_alert type RepositoryVulnerabilityAlertEvent struct { // Action is the action that was performed. Possible values are: "create", "dismiss", "resolve". Action *string `json:"action,omitempty"` //The security alert of the vulnerable dependency. Alert *RepositoryVulnerabilityAlert `json:"alert,omitempty"` //The repository of the vulnerable dependency. Repository *Repository `json:"repository,omitempty"` } // RepositoryVulnerabilityAlert represents a repository security alert. type RepositoryVulnerabilityAlert struct { ID *int64 `json:"id,omitempty"` AffectedRange *string `json:"affected_range,omitempty"` AffectedPackageName *string `json:"affected_package_name,omitempty"` ExternalReference *string `json:"external_reference,omitempty"` ExternalIdentifier *string `json:"external_identifier,omitempty"` GitHubSecurityAdvisoryID *string `json:"ghsa_id,omitempty"` Severity *string `json:"severity,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` FixedIn *string `json:"fixed_in,omitempty"` Dismisser *User `json:"dismisser,omitempty"` DismissReason *string `json:"dismiss_reason,omitempty"` DismissedAt *Timestamp `json:"dismissed_at,omitempty"` } // StarEvent is triggered when a star is added or removed from a repository. // The Webhook event name is "star". // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#star type StarEvent struct { // Action is the action that was performed. Possible values are: "created" or "deleted". Action *string `json:"action,omitempty"` // StarredAt is the time the star was created. It will be null for the "deleted" action. StarredAt *Timestamp `json:"starred_at,omitempty"` // The following fields are only populated by Webhook events. Org *Organization `json:"organization,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` } // StatusEvent is triggered when the status of a Git commit changes. // The Webhook event name is "status". // // Events of this type are not visible in timelines, they are only used to // trigger hooks. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#status type StatusEvent struct { SHA *string `json:"sha,omitempty"` // State is the new state. Possible values are: "pending", "success", "failure", "error". State *string `json:"state,omitempty"` Description *string `json:"description,omitempty"` TargetURL *string `json:"target_url,omitempty"` Branches []*Branch `json:"branches,omitempty"` // The following fields are only populated by Webhook events. ID *int64 `json:"id,omitempty"` Name *string `json:"name,omitempty"` Context *string `json:"context,omitempty"` Commit *RepositoryCommit `json:"commit,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // TeamEvent is triggered when an organization's team is created, modified or deleted. // The Webhook event name is "team". // // Events of this type are not visible in timelines. These events are only used // to trigger hooks. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#team type TeamEvent struct { Action *string `json:"action,omitempty"` Team *Team `json:"team,omitempty"` Changes *TeamChange `json:"changes,omitempty"` Repo *Repository `json:"repository,omitempty"` // The following fields are only populated by Webhook events. Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // TeamAddEvent is triggered when a repository is added to a team. // The Webhook event name is "team_add". // // Events of this type are not visible in timelines. These events are only used // to trigger hooks. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#team_add type TeamAddEvent struct { Team *Team `json:"team,omitempty"` Repo *Repository `json:"repository,omitempty"` // The following fields are only populated by Webhook events. Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // UserEvent is triggered when a user is created or deleted. // The Webhook event name is "user". // // Only global webhooks can subscribe to this event type. // // GitHub API docs: https://developer.github.com/enterprise/v3/activity/events/types/#userevent-enterprise type UserEvent struct { User *User `json:"user,omitempty"` // The action performed. Possible values are: "created" or "deleted". Action *string `json:"action,omitempty"` Enterprise *Enterprise `json:"enterprise,omitempty"` Sender *User `json:"sender,omitempty"` } // WatchEvent is related to starring a repository, not watching. See this API // blog post for an explanation: https://developer.github.com/changes/2012-09-05-watcher-api/ // // The event’s actor is the user who starred a repository, and the event’s // repository is the repository that was starred. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#watch type WatchEvent struct { // Action is the action that was performed. Possible value is: "started". Action *string `json:"action,omitempty"` // The following fields are only populated by Webhook events. Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // WorkflowDispatchEvent is triggered when someone triggers a workflow run on GitHub or // sends a POST request to the create a workflow dispatch event endpoint. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#workflow_dispatch type WorkflowDispatchEvent struct { Inputs json.RawMessage `json:"inputs,omitempty"` Ref *string `json:"ref,omitempty"` Workflow *string `json:"workflow,omitempty"` // The following fields are only populated by Webhook events. Repo *Repository `json:"repository,omitempty"` Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` } // WorkflowRunEvent is triggered when a GitHub Actions workflow run is requested or completed. // // GitHub API docs: https://docs.github.com/en/developers/webhooks-and-events/webhook-events-and-payloads#workflow_run type WorkflowRunEvent struct { Action *string `json:"action,omitempty"` Workflow *Workflow `json:"workflow,omitempty"` WorkflowRun *WorkflowRun `json:"workflow_run,omitempty"` // The following fields are only populated by Webhook events. Org *Organization `json:"organization,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` } go-github-38.1.0/github/event_types_test.go000066400000000000000000012725421410475703100207240ustar00rootroot00000000000000// Copyright 2020 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 ( "encoding/json" "testing" ) func TestEditChange_Marshal_TitleChange(t *testing.T) { testJSONMarshal(t, &EditChange{}, "{}") u := &EditChange{ Title: &EditTitle{ From: String("TitleFrom"), }, Body: nil, Base: nil, } want := `{ "title": { "from": "TitleFrom" } }` testJSONMarshal(t, u, want) } func TestEditChange_Marshal_BodyChange(t *testing.T) { testJSONMarshal(t, &EditChange{}, "{}") u := &EditChange{ Title: nil, Body: &EditBody{ From: String("BodyFrom"), }, Base: nil, } want := `{ "body": { "from": "BodyFrom" } }` testJSONMarshal(t, u, want) } func TestEditChange_Marshal_BaseChange(t *testing.T) { testJSONMarshal(t, &EditChange{}, "{}") Base := EditBase{ Ref: &EditRef{ From: String("BaseRefFrom"), }, SHA: &EditSHA{ From: String("BaseSHAFrom"), }, } u := &EditChange{ Title: nil, Body: nil, Base: &Base, } want := `{ "base": { "ref": { "from": "BaseRefFrom" }, "sha": { "from": "BaseSHAFrom" } } }` testJSONMarshal(t, u, want) } func TestProjectChange_Marshal_NameChange(t *testing.T) { testJSONMarshal(t, &ProjectChange{}, "{}") u := &ProjectChange{ Name: &ProjectName{From: String("NameFrom")}, Body: nil, } want := `{ "name": { "from": "NameFrom" } }` testJSONMarshal(t, u, want) } func TestProjectChange_Marshal_BodyChange(t *testing.T) { testJSONMarshal(t, &ProjectChange{}, "{}") u := &ProjectChange{ Name: nil, Body: &ProjectBody{From: String("BodyFrom")}, } want := `{ "body": { "from": "BodyFrom" } }` testJSONMarshal(t, u, want) } func TestProjectCardChange_Marshal_NoteChange(t *testing.T) { testJSONMarshal(t, &ProjectCardChange{}, "{}") u := &ProjectCardChange{ Note: &ProjectCardNote{From: String("NoteFrom")}, } want := `{ "note": { "from": "NoteFrom" } }` testJSONMarshal(t, u, want) } func TestProjectColumnChange_Marshal_NameChange(t *testing.T) { testJSONMarshal(t, &ProjectColumnChange{}, "{}") u := &ProjectColumnChange{ Name: &ProjectColumnName{From: String("NameFrom")}, } want := `{ "name": { "from": "NameFrom" } }` testJSONMarshal(t, u, want) } func TestTeamAddEvent_Marshal(t *testing.T) { testJSONMarshal(t, &TeamAddEvent{}, "{}") u := &TeamAddEvent{ Team: &Team{ ID: Int64(1), NodeID: String("n"), Name: String("n"), Description: String("d"), URL: String("u"), Slug: String("s"), Permission: String("p"), Privacy: String("p"), MembersCount: Int(1), ReposCount: Int(1), MembersURL: String("m"), RepositoriesURL: String("r"), Organization: &Organization{ Login: String("l"), ID: Int64(1), NodeID: String("n"), AvatarURL: String("a"), HTMLURL: String("h"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), }, Parent: &Team{ ID: Int64(1), NodeID: String("n"), Name: String("n"), Description: String("d"), URL: String("u"), Slug: String("s"), Permission: String("p"), Privacy: String("p"), MembersCount: Int(1), ReposCount: Int(1), }, LDAPDN: String("l"), }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "team": { "id": 1, "node_id": "n", "name": "n", "description": "d", "url": "u", "slug": "s", "permission": "p", "privacy": "p", "members_count": 1, "repos_count": 1, "organization": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "html_url": "h", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e" }, "members_url": "m", "repositories_url": "r", "parent": { "id": 1, "node_id": "n", "name": "n", "description": "d", "url": "u", "slug": "s", "permission": "p", "privacy": "p", "members_count": 1, "repos_count": 1 }, "ldap_dn": "l" }, "repository": { "id": 1, "name": "n", "url": "s" }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestStarEvent_Marshal(t *testing.T) { testJSONMarshal(t, &StarEvent{}, "{}") u := &StarEvent{ Action: String("a"), StarredAt: &Timestamp{referenceTime}, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, } want := `{ "action": "a", "starred_at": ` + referenceTimeStr + `, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" } }` testJSONMarshal(t, u, want) } func TestTeamEvent_Marshal(t *testing.T) { testJSONMarshal(t, &TeamEvent{}, "{}") u := &TeamEvent{ Action: String("a"), Team: &Team{ ID: Int64(1), NodeID: String("n"), Name: String("n"), Description: String("d"), URL: String("u"), Slug: String("s"), Permission: String("p"), Privacy: String("p"), MembersCount: Int(1), ReposCount: Int(1), MembersURL: String("m"), RepositoriesURL: String("r"), Organization: &Organization{ Login: String("l"), ID: Int64(1), NodeID: String("n"), AvatarURL: String("a"), HTMLURL: String("h"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), }, Parent: &Team{ ID: Int64(1), NodeID: String("n"), Name: String("n"), Description: String("d"), URL: String("u"), Slug: String("s"), Permission: String("p"), Privacy: String("p"), MembersCount: Int(1), ReposCount: Int(1), }, LDAPDN: String("l"), }, Changes: &TeamChange{ Description: &TeamDescription{ From: String("from"), }, Name: &TeamName{ From: String("from"), }, Privacy: &TeamPrivacy{ From: String("from"), }, Repository: &TeamRepository{ Permissions: &TeamPermissions{ From: &TeamPermissionsFrom{ Admin: Bool(true), Pull: Bool(true), Push: Bool(true), }, }, }, }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "team": { "id": 1, "node_id": "n", "name": "n", "description": "d", "url": "u", "slug": "s", "permission": "p", "privacy": "p", "members_count": 1, "repos_count": 1, "organization": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "html_url": "h", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e" }, "members_url": "m", "repositories_url": "r", "parent": { "id": 1, "node_id": "n", "name": "n", "description": "d", "url": "u", "slug": "s", "permission": "p", "privacy": "p", "members_count": 1, "repos_count": 1 }, "ldap_dn": "l" }, "changes": { "description": { "from": "from" }, "name": { "from": "from" }, "privacy": { "from": "from" }, "repository": { "permissions": { "from": { "admin": true, "pull": true, "push": true } } } }, "repository": { "id": 1, "name": "n", "url": "s" }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestInstallationRepositoriesEvent_Marshal(t *testing.T) { testJSONMarshal(t, &InstallationRepositoriesEvent{}, "{}") u := &InstallationRepositoriesEvent{ Action: String("a"), RepositoriesAdded: []*Repository{ { ID: Int64(1), URL: String("s"), Name: String("n"), }, }, RepositoriesRemoved: []*Repository{ { ID: Int64(1), URL: String("s"), Name: String("n"), }, }, RepositorySelection: String("rs"), Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "repositories_added": [ { "id": 1, "name": "n", "url": "s" } ], "repositories_removed": [ { "id": 1, "name": "n", "url": "s" } ], "repository_selection": "rs", "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestEditTitle_Marshal(t *testing.T) { testJSONMarshal(t, &EditTitle{}, "{}") u := &EditTitle{ From: String("EditTitleFrom"), } want := `{ "from": "EditTitleFrom" }` testJSONMarshal(t, u, want) } func TestEditBody_Marshal(t *testing.T) { testJSONMarshal(t, &EditBody{}, "{}") u := &EditBody{ From: String("EditBodyFrom"), } want := `{ "from": "EditBodyFrom" }` testJSONMarshal(t, u, want) } func TestEditBase_Marshal(t *testing.T) { testJSONMarshal(t, &EditBase{}, "{}") u := &EditBase{ Ref: &EditRef{ From: String("EditRefFrom"), }, SHA: &EditSHA{ From: String("EditSHAFrom"), }, } want := `{ "ref": { "from": "EditRefFrom" }, "sha": { "from": "EditSHAFrom" } }` testJSONMarshal(t, u, want) } func TestEditRef_Marshal(t *testing.T) { testJSONMarshal(t, &EditRef{}, "{}") u := &EditRef{ From: String("EditRefFrom"), } want := `{ "from": "EditRefFrom" }` testJSONMarshal(t, u, want) } func TestEditSHA_Marshal(t *testing.T) { testJSONMarshal(t, &EditSHA{}, "{}") u := &EditSHA{ From: String("EditSHAFrom"), } want := `{ "from": "EditSHAFrom" }` testJSONMarshal(t, u, want) } func TestProjectName_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectName{}, "{}") u := &ProjectName{ From: String("ProjectNameFrom"), } want := `{ "from": "ProjectNameFrom" }` testJSONMarshal(t, u, want) } func TestProjectBody_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectBody{}, "{}") u := &ProjectBody{ From: String("ProjectBodyFrom"), } want := `{ "from": "ProjectBodyFrom" }` testJSONMarshal(t, u, want) } func TestProjectCardNote_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectCardNote{}, "{}") u := &ProjectCardNote{ From: String("ProjectCardNoteFrom"), } want := `{ "from": "ProjectCardNoteFrom" }` testJSONMarshal(t, u, want) } func TestProjectColumnName_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectColumnName{}, "{}") u := &ProjectColumnName{ From: String("ProjectColumnNameFrom"), } want := `{ "from": "ProjectColumnNameFrom" }` testJSONMarshal(t, u, want) } func TestTeamDescription_Marshal(t *testing.T) { testJSONMarshal(t, &TeamDescription{}, "{}") u := &TeamDescription{ From: String("TeamDescriptionFrom"), } want := `{ "from": "TeamDescriptionFrom" }` testJSONMarshal(t, u, want) } func TestTeamName_Marshal(t *testing.T) { testJSONMarshal(t, &TeamName{}, "{}") u := &TeamName{ From: String("TeamNameFrom"), } want := `{ "from": "TeamNameFrom" }` testJSONMarshal(t, u, want) } func TestTeamPrivacy_Marshal(t *testing.T) { testJSONMarshal(t, &TeamPrivacy{}, "{}") u := &TeamPrivacy{ From: String("TeamPrivacyFrom"), } want := `{ "from": "TeamPrivacyFrom" }` testJSONMarshal(t, u, want) } func TestTeamRepository_Marshal(t *testing.T) { testJSONMarshal(t, &TeamRepository{}, "{}") u := &TeamRepository{ Permissions: &TeamPermissions{ From: &TeamPermissionsFrom{ Admin: Bool(true), Pull: Bool(true), Push: Bool(true), }, }, } want := `{ "permissions": { "from": { "admin": true, "pull": true, "push": true } } }` testJSONMarshal(t, u, want) } func TestTeamPermissions_Marshal(t *testing.T) { testJSONMarshal(t, &TeamPermissions{}, "{}") u := &TeamPermissions{ From: &TeamPermissionsFrom{ Admin: Bool(true), Pull: Bool(true), Push: Bool(true), }, } want := `{ "from": { "admin": true, "pull": true, "push": true } }` testJSONMarshal(t, u, want) } func TestTeamPermissionsFrom_Marshal(t *testing.T) { testJSONMarshal(t, &TeamPermissionsFrom{}, "{}") u := &TeamPermissionsFrom{ Admin: Bool(true), Pull: Bool(true), Push: Bool(true), } want := `{ "admin": true, "pull": true, "push": true }` testJSONMarshal(t, u, want) } func TestRepositoryVulnerabilityAlert_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryVulnerabilityAlert{}, "{}") u := &RepositoryVulnerabilityAlert{ ID: Int64(1), AffectedRange: String("ar"), AffectedPackageName: String("apn"), ExternalReference: String("er"), ExternalIdentifier: String("ei"), FixedIn: String("fi"), Dismisser: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, DismissReason: String("dr"), DismissedAt: &Timestamp{referenceTime}, } want := `{ "id": 1, "affected_range": "ar", "affected_package_name": "apn", "external_reference": "er", "external_identifier": "ei", "fixed_in": "fi", "dismisser": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "dismiss_reason": "dr", "dismissed_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } func TestPage_Marshal(t *testing.T) { testJSONMarshal(t, &Page{}, "{}") u := &Page{ PageName: String("p"), Title: String("t"), Summary: String("s"), Action: String("a"), SHA: String("s"), HTMLURL: String("h"), } want := `{ "page_name": "p", "title": "t", "summary": "s", "action": "a", "sha": "s", "html_url": "h" }` testJSONMarshal(t, u, want) } func TestTeamChange_Marshal(t *testing.T) { testJSONMarshal(t, &TeamChange{}, "{}") u := &TeamChange{ Description: &TeamDescription{ From: String("DescriptionFrom"), }, Name: &TeamName{ From: String("NameFrom"), }, Privacy: &TeamPrivacy{ From: String("PrivacyFrom"), }, Repository: &TeamRepository{ Permissions: &TeamPermissions{ From: &TeamPermissionsFrom{ Admin: Bool(false), Pull: Bool(false), Push: Bool(false), }, }, }, } want := `{ "description": { "from": "DescriptionFrom" }, "name": { "from": "NameFrom" }, "privacy": { "from": "PrivacyFrom" }, "repository": { "permissions": { "from": { "admin": false, "pull": false, "push": false } } } }` testJSONMarshal(t, u, want) } func TestIssueCommentEvent_Marshal(t *testing.T) { testJSONMarshal(t, &IssueCommentEvent{}, "{}") u := &IssueCommentEvent{ Action: String("a"), Issue: &Issue{ID: Int64(1)}, Comment: &IssueComment{ID: Int64(1)}, Changes: &EditChange{ Title: &EditTitle{ From: String("TitleFrom"), }, Body: &EditBody{ From: String("BodyFrom"), }, Base: &EditBase{ Ref: &EditRef{ From: String("BaseRefFrom"), }, SHA: &EditSHA{ From: String("BaseSHAFrom"), }, }, }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "issue": { "id": 1 }, "comment": { "id": 1 }, "changes": { "title": { "from": "TitleFrom" }, "body": { "from": "BodyFrom" }, "base": { "ref": { "from": "BaseRefFrom" }, "sha": { "from": "BaseSHAFrom" } } }, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestIssuesEvent_Marshal(t *testing.T) { testJSONMarshal(t, &IssuesEvent{}, "{}") u := &IssuesEvent{ Action: String("a"), Issue: &Issue{ID: Int64(1)}, Assignee: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Label: &Label{ID: Int64(1)}, Changes: &EditChange{ Title: &EditTitle{ From: String("TitleFrom"), }, Body: &EditBody{ From: String("BodyFrom"), }, Base: &EditBase{ Ref: &EditRef{ From: String("BaseRefFrom"), }, SHA: &EditSHA{ From: String("BaseSHAFrom"), }, }, }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "issue": { "id": 1 }, "assignee": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "label": { "id": 1 }, "changes": { "title": { "from": "TitleFrom" }, "body": { "from": "BodyFrom" }, "base": { "ref": { "from": "BaseRefFrom" }, "sha": { "from": "BaseSHAFrom" } } }, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestLabelEvent_Marshal(t *testing.T) { testJSONMarshal(t, &LabelEvent{}, "{}") u := &LabelEvent{ Action: String("a"), Label: &Label{ID: Int64(1)}, Changes: &EditChange{ Title: &EditTitle{ From: String("TitleFrom"), }, Body: &EditBody{ From: String("BodyFrom"), }, Base: &EditBase{ Ref: &EditRef{ From: String("BaseRefFrom"), }, SHA: &EditSHA{ From: String("BaseSHAFrom"), }, }, }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "label": { "id": 1 }, "changes": { "title": { "from": "TitleFrom" }, "body": { "from": "BodyFrom" }, "base": { "ref": { "from": "BaseRefFrom" }, "sha": { "from": "BaseSHAFrom" } } }, "repository": { "id": 1, "name": "n", "url": "s" }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestMilestoneEvent_Marshal(t *testing.T) { testJSONMarshal(t, &MilestoneEvent{}, "{}") u := &MilestoneEvent{ Action: String("a"), Milestone: &Milestone{ID: Int64(1)}, Changes: &EditChange{ Title: &EditTitle{ From: String("TitleFrom"), }, Body: &EditBody{ From: String("BodyFrom"), }, Base: &EditBase{ Ref: &EditRef{ From: String("BaseRefFrom"), }, SHA: &EditSHA{ From: String("BaseSHAFrom"), }, }, }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "milestone": { "id": 1 }, "changes": { "title": { "from": "TitleFrom" }, "body": { "from": "BodyFrom" }, "base": { "ref": { "from": "BaseRefFrom" }, "sha": { "from": "BaseSHAFrom" } } }, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestPublicEvent_Marshal(t *testing.T) { testJSONMarshal(t, &PublicEvent{}, "{}") u := &PublicEvent{ Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestPullRequestReviewEvent_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestReviewEvent{}, "{}") u := &PullRequestReviewEvent{ Action: String("a"), Review: &PullRequestReview{ID: Int64(1)}, PullRequest: &PullRequest{ID: Int64(1)}, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, Organization: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, } want := `{ "action": "a", "review": { "id": 1 }, "pull_request": { "id": 1 }, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true } }` testJSONMarshal(t, u, want) } func TestPushEvent_Marshal(t *testing.T) { testJSONMarshal(t, &PushEvent{}, "{}") u := &PushEvent{ PushID: Int64(1), Head: String("h"), Ref: String("ref"), Size: Int(1), Commits: []*HeadCommit{ {ID: String("id")}, }, Before: String("b"), DistinctSize: Int(1), After: String("a"), Created: Bool(true), Deleted: Bool(true), Forced: Bool(true), BaseRef: String("a"), Compare: String("a"), Repo: &PushEventRepository{ID: Int64(1)}, HeadCommit: &HeadCommit{ID: String("id")}, Pusher: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "push_id": 1, "head": "h", "ref": "ref", "size": 1, "commits": [ { "id": "id" } ], "before": "b", "distinct_size": 1, "after": "a", "created": true, "deleted": true, "forced": true, "base_ref": "a", "compare": "a", "repository": { "id": 1 }, "head_commit": { "id": "id" }, "pusher": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestStatusEvent_Marshal(t *testing.T) { testJSONMarshal(t, &StatusEvent{}, "{}") u := &StatusEvent{ SHA: String("sha"), State: String("s"), Description: String("d"), TargetURL: String("turl"), Branches: []*Branch{ { Name: String("n"), Commit: &RepositoryCommit{NodeID: String("nid")}, Protected: Bool(false), }, }, ID: Int64(1), Name: String("n"), Context: String("c"), Commit: &RepositoryCommit{NodeID: String("nid")}, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "sha": "sha", "state": "s", "description": "d", "target_url": "turl", "branches": [ { "name": "n", "commit": { "node_id": "nid" }, "protected": false } ], "id": 1, "name": "n", "context": "c", "commit": { "node_id": "nid" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestMarketplacePurchaseEvent_Marshal(t *testing.T) { testJSONMarshal(t, &MarketplacePurchaseEvent{}, "{}") u := &MarketplacePurchaseEvent{ Action: String("a"), EffectiveDate: &Timestamp{referenceTime}, MarketplacePurchase: &MarketplacePurchase{ BillingCycle: String("bc"), NextBillingDate: &Timestamp{referenceTime}, UnitCount: Int(1), Plan: &MarketplacePlan{ URL: String("u"), AccountsURL: String("au"), ID: Int64(1), Number: Int(1), Name: String("n"), Description: String("d"), MonthlyPriceInCents: Int(1), YearlyPriceInCents: Int(1), PriceModel: String("pm"), UnitName: String("un"), Bullets: &[]string{"b"}, State: String("s"), HasFreeTrial: Bool(false), }, OnFreeTrial: Bool(false), FreeTrialEndsOn: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, }, PreviousMarketplacePurchase: &MarketplacePurchase{ BillingCycle: String("bc"), NextBillingDate: &Timestamp{referenceTime}, UnitCount: Int(1), Plan: &MarketplacePlan{ URL: String("u"), AccountsURL: String("au"), ID: Int64(1), Number: Int(1), Name: String("n"), Description: String("d"), MonthlyPriceInCents: Int(1), YearlyPriceInCents: Int(1), PriceModel: String("pm"), UnitName: String("un"), Bullets: &[]string{"b"}, State: String("s"), HasFreeTrial: Bool(false), }, OnFreeTrial: Bool(false), FreeTrialEndsOn: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "effective_date": ` + referenceTimeStr + `, "marketplace_purchase": { "billing_cycle": "bc", "next_billing_date": ` + referenceTimeStr + `, "unit_count": 1, "plan": { "url": "u", "accounts_url": "au", "id": 1, "number": 1, "name": "n", "description": "d", "monthly_price_in_cents": 1, "yearly_price_in_cents": 1, "price_model": "pm", "unit_name": "un", "bullets": [ "b" ], "state": "s", "has_free_trial": false }, "on_free_trial": false, "free_trial_ends_on": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` }, "previous_marketplace_purchase": { "billing_cycle": "bc", "next_billing_date": ` + referenceTimeStr + `, "unit_count": 1, "plan": { "url": "u", "accounts_url": "au", "id": 1, "number": 1, "name": "n", "description": "d", "monthly_price_in_cents": 1, "yearly_price_in_cents": 1, "price_model": "pm", "unit_name": "un", "bullets": [ "b" ], "state": "s", "has_free_trial": false }, "on_free_trial": false, "free_trial_ends_on": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestOrganizationEvent_Marshal(t *testing.T) { testJSONMarshal(t, &OrganizationEvent{}, "{}") u := &OrganizationEvent{ Action: String("a"), Invitation: &Invitation{ID: Int64(1)}, Membership: &Membership{ URL: String("url"), State: String("s"), Role: String("r"), OrganizationURL: String("ou"), Organization: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, User: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, }, Organization: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "invitation": { "id": 1 }, "membership": { "url": "url", "state": "s", "role": "r", "organization_url": "ou", "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "user": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" } }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestPageBuildEvent_Marshal(t *testing.T) { testJSONMarshal(t, &PageBuildEvent{}, "{}") u := &PageBuildEvent{ Build: &PagesBuild{URL: String("url")}, ID: Int64(1), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "build": { "url": "url" }, "id": 1, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestCommitCommentEvent_Marshal(t *testing.T) { testJSONMarshal(t, &CommitCommentEvent{}, "{}") u := &CommitCommentEvent{ Comment: &RepositoryComment{ HTMLURL: String("hurl"), URL: String("url"), ID: Int64(1), NodeID: String("nid"), CommitID: String("cid"), User: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Reactions: &Reactions{ TotalCount: Int(1), PlusOne: Int(1), MinusOne: Int(1), Laugh: Int(1), Confused: Int(1), Heart: Int(1), Hooray: Int(1), Rocket: Int(1), Eyes: Int(1), URL: String("url"), }, CreatedAt: &referenceTime, UpdatedAt: &referenceTime, Body: String("b"), Path: String("path"), Position: Int(1), }, Action: String("a"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "comment": { "html_url": "hurl", "url": "url", "id": 1, "node_id": "nid", "commit_id": "cid", "user": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "reactions": { "total_count": 1, "+1": 1, "-1": 1, "laugh": 1, "confused": 1, "heart": 1, "hooray": 1, "rocket": 1, "eyes": 1, "url": "url" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "body": "b", "path": "path", "position": 1 }, "action": "a", "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestDeploymentEvent_Marshal(t *testing.T) { testJSONMarshal(t, &DeploymentEvent{}, "{}") l := make(map[string]interface{}) l["key"] = "value" jsonMsg, _ := json.Marshal(&l) u := &DeploymentEvent{ Deployment: &Deployment{ URL: String("url"), ID: Int64(1), SHA: String("sha"), Ref: String("ref"), Task: String("t"), Payload: jsonMsg, Environment: String("e"), Description: String("d"), Creator: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, StatusesURL: String("surl"), RepositoryURL: String("rurl"), NodeID: String("nid"), }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "deployment": { "url": "url", "id": 1, "sha": "sha", "ref": "ref", "task": "t", "payload": { "key": "value" }, "environment": "e", "description": "d", "creator": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "statuses_url": "surl", "repository_url": "rurl", "node_id": "nid" }, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestDeploymentStatusEvent_Marshal(t *testing.T) { testJSONMarshal(t, &DeploymentStatusEvent{}, "{}") l := make(map[string]interface{}) l["key"] = "value" jsonMsg, _ := json.Marshal(&l) u := &DeploymentStatusEvent{ Deployment: &Deployment{ URL: String("url"), ID: Int64(1), SHA: String("sha"), Ref: String("ref"), Task: String("t"), Payload: jsonMsg, Environment: String("e"), Description: String("d"), Creator: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, StatusesURL: String("surl"), RepositoryURL: String("rurl"), NodeID: String("nid"), }, DeploymentStatus: &DeploymentStatus{ ID: Int64(1), State: String("s"), Creator: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Description: String("s"), Environment: String("s"), NodeID: String("s"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, TargetURL: String("s"), DeploymentURL: String("s"), RepositoryURL: String("s"), EnvironmentURL: String("s"), LogURL: String("s"), URL: String("s"), }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "deployment": { "url": "url", "id": 1, "sha": "sha", "ref": "ref", "task": "t", "payload": { "key": "value" }, "environment": "e", "description": "d", "creator": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "statuses_url": "surl", "repository_url": "rurl", "node_id": "nid" }, "deployment_status": { "id": 1, "state": "s", "creator": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "description": "s", "environment": "s", "node_id": "s", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "target_url": "s", "deployment_url": "s", "repository_url": "s", "environment_url": "s", "log_url": "s", "url": "s" }, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestPackageEvent_Marshal(t *testing.T) { testJSONMarshal(t, &PackageEvent{}, "{}") u := &PackageEvent{ Action: String("a"), Package: &Package{ ID: Int64(1), Name: String("n"), PackageType: String("pt"), HTMLURL: String("hurl"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, Owner: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, PackageVersion: &PackageVersion{ID: Int64(1)}, Registry: &PackageRegistry{Name: String("n")}, }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, } want := `{ "action": "a", "package": { "id": 1, "name": "n", "package_type": "pt", "html_url": "hurl", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "owner": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "package_version": { "id": 1 }, "registry": { "name": "n" } }, "repository": { "id": 1, "name": "n", "url": "s" }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" } }` testJSONMarshal(t, u, want) } func TestPingEvent_Marshal(t *testing.T) { testJSONMarshal(t, &PingEvent{}, "{}") l := make(map[string]interface{}) l["key"] = "value" u := &PingEvent{ Zen: String("z"), HookID: Int64(1), Hook: &Hook{ CreatedAt: &referenceTime, UpdatedAt: &referenceTime, URL: String("url"), ID: Int64(1), Type: String("t"), Name: String("n"), TestURL: String("tu"), PingURL: String("pu"), LastResponse: l, Config: l, Events: []string{"a"}, Active: Bool(true), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "zen": "z", "hook_id": 1, "hook": { "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "url": "url", "id": 1, "type": "t", "name": "n", "test_url": "tu", "ping_url": "pu", "last_response": { "key": "value" }, "config": { "key": "value" }, "events": [ "a" ], "active": true }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestRepositoryDispatchEvent_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryDispatchEvent{}, "{}") l := make(map[string]interface{}) l["key"] = "value" jsonMsg, _ := json.Marshal(&l) u := &RepositoryDispatchEvent{ Action: String("a"), Branch: String("b"), ClientPayload: jsonMsg, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "branch": "b", "client_payload": { "key": "value" }, "repository": { "id": 1, "name": "n", "url": "s" }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestRepositoryEvent_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryEvent{}, "{}") u := &RepositoryEvent{ Action: String("a"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "repository": { "id": 1, "name": "n", "url": "s" }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestReleaseEvent_Marshal(t *testing.T) { testJSONMarshal(t, &ReleaseEvent{}, "{}") u := &ReleaseEvent{ Action: String("a"), Release: &RepositoryRelease{ Name: String("n"), DiscussionCategoryName: String("dcn"), ID: Int64(2), CreatedAt: &Timestamp{referenceTime}, PublishedAt: &Timestamp{referenceTime}, URL: String("url"), HTMLURL: String("htmlurl"), AssetsURL: String("assetsurl"), Assets: []*ReleaseAsset{{ID: Int64(1)}}, UploadURL: String("uploadurl"), ZipballURL: String("zipballurl"), TarballURL: String("tarballurl"), Author: &User{Name: String("octocat")}, NodeID: String("nid"), }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "release": { "name": "n", "discussion_category_name": "dcn", "id": 2, "created_at": ` + referenceTimeStr + `, "published_at": ` + referenceTimeStr + `, "url": "url", "html_url": "htmlurl", "assets_url": "assetsurl", "assets": [ { "id": 1 } ], "upload_url": "uploadurl", "zipball_url": "zipballurl", "tarball_url": "tarballurl", "author": { "name": "octocat" }, "node_id": "nid" }, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestContentReferenceEvent_Marshal(t *testing.T) { testJSONMarshal(t, &ContentReferenceEvent{}, "{}") u := &ContentReferenceEvent{ Action: String("a"), ContentReference: &ContentReference{ ID: Int64(1), NodeID: String("nid"), Reference: String("ref"), }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "content_reference": { "id": 1, "node_id": "nid", "reference": "ref" }, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestMemberEvent_Marshal(t *testing.T) { testJSONMarshal(t, &MemberEvent{}, "{}") u := &MemberEvent{ Action: String("a"), Member: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "member": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestMembershipEvent_Marshal(t *testing.T) { testJSONMarshal(t, &MembershipEvent{}, "{}") u := &MembershipEvent{ Action: String("a"), Scope: String("s"), Member: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Team: &Team{ ID: Int64(1), NodeID: String("n"), Name: String("n"), Description: String("d"), URL: String("u"), Slug: String("s"), Permission: String("p"), Privacy: String("p"), MembersCount: Int(1), ReposCount: Int(1), MembersURL: String("m"), RepositoriesURL: String("r"), Organization: &Organization{ Login: String("l"), ID: Int64(1), NodeID: String("n"), AvatarURL: String("a"), HTMLURL: String("h"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), }, Parent: &Team{ ID: Int64(1), NodeID: String("n"), Name: String("n"), Description: String("d"), URL: String("u"), Slug: String("s"), Permission: String("p"), Privacy: String("p"), MembersCount: Int(1), ReposCount: Int(1), }, LDAPDN: String("l"), }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "scope": "s", "member": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "team": { "id": 1, "node_id": "n", "name": "n", "description": "d", "url": "u", "slug": "s", "permission": "p", "privacy": "p", "members_count": 1, "repos_count": 1, "organization": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "html_url": "h", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e" }, "members_url": "m", "repositories_url": "r", "parent": { "id": 1, "node_id": "n", "name": "n", "description": "d", "url": "u", "slug": "s", "permission": "p", "privacy": "p", "members_count": 1, "repos_count": 1 }, "ldap_dn": "l" }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestOrgBlockEvent_Marshal(t *testing.T) { testJSONMarshal(t, &OrgBlockEvent{}, "{}") u := &OrgBlockEvent{ Action: String("a"), BlockedUser: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Organization: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "blocked_user": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestGollumEvent_Marshal(t *testing.T) { testJSONMarshal(t, &GollumEvent{}, "{}") u := &GollumEvent{ Pages: []*Page{ { PageName: String("pn"), Title: String("t"), Summary: String("s"), Action: String("a"), SHA: String("sha"), HTMLURL: String("hu"), }, }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "pages": [ { "page_name": "pn", "title": "t", "summary": "s", "action": "a", "sha": "sha", "html_url": "hu" } ], "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestWorkflowRunEvent_Marshal(t *testing.T) { testJSONMarshal(t, &WorkflowRunEvent{}, "{}") u := &WorkflowRunEvent{ Action: String("a"), Workflow: &Workflow{ ID: Int64(1), NodeID: String("nid"), Name: String("n"), Path: String("p"), State: String("s"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, URL: String("u"), HTMLURL: String("h"), BadgeURL: String("b"), }, WorkflowRun: &WorkflowRun{ ID: Int64(1), Name: String("n"), NodeID: String("nid"), HeadBranch: String("hb"), HeadSHA: String("hs"), RunNumber: Int(1), Event: String("e"), Status: String("s"), Conclusion: String("c"), WorkflowID: Int64(1), URL: String("u"), HTMLURL: String("h"), PullRequests: []*PullRequest{ { URL: String("u"), ID: Int64(1), Number: Int(1), Head: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, }, Base: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, }, }, }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, JobsURL: String("j"), LogsURL: String("l"), CheckSuiteURL: String("c"), ArtifactsURL: String("a"), CancelURL: String("c"), RerunURL: String("r"), HeadCommit: &HeadCommit{ Message: String("m"), Author: &CommitAuthor{ Name: String("n"), Email: String("e"), Login: String("l"), }, URL: String("u"), Distinct: Bool(false), SHA: String("s"), ID: String("i"), TreeID: String("tid"), Timestamp: &Timestamp{referenceTime}, Committer: &CommitAuthor{ Name: String("n"), Email: String("e"), Login: String("l"), }, }, WorkflowURL: String("w"), Repository: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, HeadRepository: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, } want := `{ "action": "a", "workflow": { "id": 1, "node_id": "nid", "name": "n", "path": "p", "state": "s", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "url": "u", "html_url": "h", "badge_url": "b" }, "workflow_run": { "id": 1, "name": "n", "node_id": "nid", "head_branch": "hb", "head_sha": "hs", "run_number": 1, "event": "e", "status": "s", "conclusion": "c", "workflow_id": 1, "url": "u", "html_url": "h", "pull_requests": [ { "id": 1, "number": 1, "url": "u", "head": { "ref": "r", "sha": "s", "repo": { "id": 1, "name": "n", "url": "s" } }, "base": { "ref": "r", "sha": "s", "repo": { "id": 1, "name": "n", "url": "u" } } } ], "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "jobs_url": "j", "logs_url": "l", "check_suite_url": "c", "artifacts_url": "a", "cancel_url": "c", "rerun_url": "r", "head_commit": { "message": "m", "author": { "name": "n", "email": "e", "username": "l" }, "url": "u", "distinct": false, "sha": "s", "id": "i", "tree_id": "tid", "timestamp": ` + referenceTimeStr + `, "committer": { "name": "n", "email": "e", "username": "l" } }, "workflow_url": "w", "repository": { "id": 1, "name": "n", "url": "u" }, "head_repository": { "id": 1, "name": "n", "url": "u" } }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" } }` testJSONMarshal(t, u, want) } func TestWorkflowDispatchEvent_Marshal(t *testing.T) { testJSONMarshal(t, &WorkflowDispatchEvent{}, "{}") i := make(map[string]interface{}) i["key"] = "value" jsonMsg, _ := json.Marshal(i) u := &WorkflowDispatchEvent{ Inputs: jsonMsg, Ref: String("r"), Workflow: String("w"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, } want := `{ "inputs": { "key": "value" }, "ref": "r", "workflow": "w", "repository": { "id": 1, "name": "n", "url": "s" }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" } }` testJSONMarshal(t, u, want) } func TestWatchEvent_Marshal(t *testing.T) { testJSONMarshal(t, &WatchEvent{}, "{}") u := &WatchEvent{ Action: String("a"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestUserEvent_Marshal(t *testing.T) { testJSONMarshal(t, &UserEvent{}, "{}") u := &UserEvent{ User: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, // The action performed. Possible values are: "created" or "deleted". Action: String("a"), Enterprise: &Enterprise{ ID: Int(1), Slug: String("s"), Name: String("n"), NodeID: String("nid"), AvatarURL: String("au"), Description: String("d"), WebsiteURL: String("wu"), HTMLURL: String("hu"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, } want := `{ "user": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "action": "a", "enterprise": { "id": 1, "slug": "s", "name": "n", "node_id": "nid", "avatar_url": "au", "description": "d", "website_url": "wu", "html_url": "hu", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" } }` testJSONMarshal(t, u, want) } func TestCheckRunEvent_Marshal(t *testing.T) { testJSONMarshal(t, &CheckRunEvent{}, "{}") r := &CheckRunEvent{ CheckRun: &CheckRun{ ID: Int64(1), NodeID: String("n"), HeadSHA: String("h"), ExternalID: String("1"), URL: String("u"), HTMLURL: String("u"), DetailsURL: String("u"), Status: String("s"), Conclusion: String("c"), StartedAt: &Timestamp{referenceTime}, CompletedAt: &Timestamp{referenceTime}, Output: &CheckRunOutput{ Annotations: []*CheckRunAnnotation{ { AnnotationLevel: String("a"), EndLine: Int(1), Message: String("m"), Path: String("p"), RawDetails: String("r"), StartLine: Int(1), Title: String("t"), }, }, AnnotationsCount: Int(1), AnnotationsURL: String("a"), Images: []*CheckRunImage{ { Alt: String("a"), ImageURL: String("i"), Caption: String("c"), }, }, Title: String("t"), Summary: String("s"), Text: String("t"), }, Name: String("n"), CheckSuite: &CheckSuite{ ID: Int64(1), }, App: &App{ ID: Int64(1), NodeID: String("n"), Owner: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Name: String("n"), Description: String("d"), HTMLURL: String("h"), ExternalURL: String("u"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, }, PullRequests: []*PullRequest{ { URL: String("u"), ID: Int64(1), Number: Int(1), Head: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, }, Base: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, }, }, }, }, Action: String("a"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, RequestedAction: &RequestedAction{ Identifier: "i", }, } want := `{ "check_run": { "id": 1, "node_id": "n", "head_sha": "h", "external_id": "1", "url": "u", "html_url": "u", "details_url": "u", "status": "s", "conclusion": "c", "started_at": ` + referenceTimeStr + `, "completed_at": ` + referenceTimeStr + `, "output": { "title": "t", "summary": "s", "text": "t", "annotations_count": 1, "annotations_url": "a", "annotations": [ { "path": "p", "start_line": 1, "end_line": 1, "annotation_level": "a", "message": "m", "title": "t", "raw_details": "r" } ], "images": [ { "alt": "a", "image_url": "i", "caption": "c" } ] }, "name": "n", "check_suite": { "id": 1 }, "app": { "id": 1, "node_id": "n", "owner": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "name": "n", "description": "d", "external_url": "u", "html_url": "h", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` }, "pull_requests": [ { "id": 1, "number": 1, "url": "u", "head": { "ref": "r", "sha": "s", "repo": { "id": 1, "name": "n", "url": "s" } }, "base": { "ref": "r", "sha": "s", "repo": { "id": 1, "name": "n", "url": "u" } } } ] }, "action": "a", "repository": { "id": 1, "name": "n", "url": "s" }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` }, "requested_action": { "identifier": "i" } }` testJSONMarshal(t, r, want) } func TestCheckSuiteEvent_Marshal(t *testing.T) { testJSONMarshal(t, &CheckSuiteEvent{}, "{}") r := &CheckSuiteEvent{ CheckSuite: &CheckSuite{ ID: Int64(1), NodeID: String("n"), HeadBranch: String("h"), HeadSHA: String("h"), URL: String("u"), BeforeSHA: String("b"), AfterSHA: String("a"), Status: String("s"), Conclusion: String("c"), App: &App{ ID: Int64(1), NodeID: String("n"), Owner: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Name: String("n"), Description: String("d"), HTMLURL: String("h"), ExternalURL: String("u"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, }, Repository: &Repository{ ID: Int64(1), }, PullRequests: []*PullRequest{ { URL: String("u"), ID: Int64(1), Number: Int(1), Head: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, }, Base: &PullRequestBranch{ Ref: String("r"), SHA: String("s"), Repo: &Repository{ ID: Int64(1), URL: String("u"), Name: String("n"), }, }, }, }, HeadCommit: &Commit{ SHA: String("s"), }, }, Action: String("a"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "check_suite": { "id": 1, "node_id": "n", "head_branch": "h", "head_sha": "h", "url": "u", "before": "b", "after": "a", "status": "s", "conclusion": "c", "app": { "id": 1, "node_id": "n", "owner": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "name": "n", "description": "d", "external_url": "u", "html_url": "h", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` }, "repository": { "id": 1 }, "pull_requests": [ { "id": 1, "number": 1, "url": "u", "head": { "ref": "r", "sha": "s", "repo": { "id": 1, "name": "n", "url": "s" } }, "base": { "ref": "r", "sha": "s", "repo": { "id": 1, "name": "n", "url": "u" } } } ], "head_commit": { "sha": "s" } }, "action": "a", "repository": { "id": 1, "name": "n", "url": "s" }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, r, want) } func TestDeployKeyEvent_Marshal(t *testing.T) { testJSONMarshal(t, &DeployKeyEvent{}, "{}") u := &DeployKeyEvent{ Action: String("a"), Key: &Key{ ID: Int64(1), Key: String("k"), URL: String("k"), Title: String("k"), ReadOnly: Bool(false), Verified: Bool(false), CreatedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "key": { "id": 1, "key": "k", "url": "k", "title": "k", "read_only": false, "verified": false, "created_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestMetaEvent_Marshal(t *testing.T) { testJSONMarshal(t, &MetaEvent{}, "{}") v := make(map[string]interface{}) v["a"] = "b" u := &MetaEvent{ Action: String("a"), HookID: Int64(1), Hook: &Hook{ CreatedAt: &referenceTime, UpdatedAt: &referenceTime, URL: String("u"), ID: Int64(1), Type: String("t"), Name: String("n"), TestURL: String("tu"), PingURL: String("pu"), LastResponse: v, Config: v, Events: []string{"a"}, Active: Bool(true), }, } want := `{ "action": "a", "hook_id": 1, "hook": { "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "url": "u", "id": 1, "type": "t", "name": "n", "test_url": "tu", "ping_url": "pu", "last_response": { "a": "b" }, "config": { "a": "b" }, "events": [ "a" ], "active": true } }` testJSONMarshal(t, u, want) } func TestRequestedAction_Marshal(t *testing.T) { testJSONMarshal(t, &RequestedAction{}, "{}") r := &RequestedAction{ Identifier: "i", } want := `{ "identifier": "i" }` testJSONMarshal(t, r, want) } func TestCreateEvent_Marshal(t *testing.T) { testJSONMarshal(t, &CreateEvent{}, "{}") r := &CreateEvent{ Ref: String("r"), RefType: String("rt"), MasterBranch: String("mb"), Description: String("d"), PusherType: String("pt"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "ref": "r", "ref_type": "rt", "master_branch": "mb", "description": "d", "pusher_type": "pt", "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, r, want) } func TestDeleteEvent_Marshal(t *testing.T) { testJSONMarshal(t, &DeleteEvent{}, "{}") r := &DeleteEvent{ Ref: String("r"), RefType: String("rt"), PusherType: String("pt"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "ref": "r", "ref_type": "rt", "pusher_type": "pt", "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, r, want) } func TestForkEvent_Marshal(t *testing.T) { testJSONMarshal(t, &ForkEvent{}, "{}") u := &ForkEvent{ Forkee: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "forkee": { "id": 1, "name": "n", "url": "s" }, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestGitHubAppAuthorizationEvent_Marshal(t *testing.T) { testJSONMarshal(t, &GitHubAppAuthorizationEvent{}, "{}") u := &GitHubAppAuthorizationEvent{ Action: String("a"), Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, } want := `{ "action": "a", "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" } }` testJSONMarshal(t, u, want) } func TestInstallationEvent_Marshal(t *testing.T) { testJSONMarshal(t, &InstallationEvent{}, "{}") u := &InstallationEvent{ Action: String("a"), Repositories: []*Repository{ { ID: Int64(1), URL: String("u"), Name: String("n"), }, }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "repositories": [ { "id":1, "name":"n", "url":"u" } ], "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestHeadCommit_Marshal(t *testing.T) { testJSONMarshal(t, &HeadCommit{}, "{}") u := &HeadCommit{ Message: String("m"), Author: &CommitAuthor{ Date: &referenceTime, Name: String("n"), Email: String("e"), Login: String("u"), }, URL: String("u"), Distinct: Bool(true), SHA: String("s"), ID: String("id"), TreeID: String("tid"), Timestamp: &Timestamp{referenceTime}, Committer: &CommitAuthor{ Date: &referenceTime, Name: String("n"), Email: String("e"), Login: String("u"), }, Added: []string{"a"}, Removed: []string{"r"}, Modified: []string{"m"}, } want := `{ "message": "m", "author": { "date": ` + referenceTimeStr + `, "name": "n", "email": "e", "username": "u" }, "url": "u", "distinct": true, "sha": "s", "id": "id", "tree_id": "tid", "timestamp": ` + referenceTimeStr + `, "committer": { "date": ` + referenceTimeStr + `, "name": "n", "email": "e", "username": "u" }, "added": [ "a" ], "removed": [ "r" ], "modified": [ "m" ] }` testJSONMarshal(t, u, want) } func TestPushEventRepository_Marshal(t *testing.T) { testJSONMarshal(t, &PushEventRepository{}, "{}") u := &PushEventRepository{ ID: Int64(1), NodeID: String("nid"), Name: String("n"), FullName: String("fn"), Owner: &User{ Login: String("l"), ID: Int64(1), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, URL: String("u"), }, Private: Bool(true), Description: String("d"), Fork: Bool(true), CreatedAt: &Timestamp{referenceTime}, PushedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, Homepage: String("h"), PullsURL: String("p"), Size: Int(1), StargazersCount: Int(1), WatchersCount: Int(1), Language: String("l"), HasIssues: Bool(true), HasDownloads: Bool(true), HasWiki: Bool(true), HasPages: Bool(true), ForksCount: Int(1), Archived: Bool(true), Disabled: Bool(true), OpenIssuesCount: Int(1), DefaultBranch: String("d"), MasterBranch: String("m"), Organization: String("o"), URL: String("u"), ArchiveURL: String("a"), HTMLURL: String("h"), StatusesURL: String("s"), GitURL: String("g"), SSHURL: String("s"), CloneURL: String("c"), SVNURL: String("s"), } want := `{ "id": 1, "node_id": "nid", "name": "n", "full_name": "fn", "owner": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "url": "u" }, "private": true, "description": "d", "fork": true, "created_at": ` + referenceTimeStr + `, "pushed_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "homepage": "h", "pulls_url": "p", "size": 1, "stargazers_count": 1, "watchers_count": 1, "language": "l", "has_issues": true, "has_downloads": true, "has_wiki": true, "has_pages": true, "forks_count": 1, "archived": true, "disabled": true, "open_issues_count": 1, "default_branch": "d", "master_branch": "m", "organization": "o", "url": "u", "archive_url": "a", "html_url": "h", "statuses_url": "s", "git_url": "g", "ssh_url": "s", "clone_url": "c", "svn_url": "s" }` testJSONMarshal(t, u, want) } func TestPushEventRepoOwner_Marshal(t *testing.T) { testJSONMarshal(t, &PushEventRepoOwner{}, "{}") u := &PushEventRepoOwner{ Name: String("n"), Email: String("e"), } want := `{ "name": "n", "email": "e" }` testJSONMarshal(t, u, want) } func TestProjectEvent_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectEvent{}, "{}") u := &ProjectEvent{ Project: &Project{ID: Int64(1)}, Action: String("a"), Changes: &ProjectChange{ Name: &ProjectName{From: String("NameFrom")}, Body: &ProjectBody{From: String("BodyFrom")}, }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "changes": { "name": { "from": "NameFrom" }, "body": { "from": "BodyFrom" } }, "project": { "id": 1 }, "repository": { "id": 1, "name": "n", "url": "s" }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestProjectCardEvent_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectCardEvent{}, "{}") u := &ProjectCardEvent{ Action: String("a"), Changes: &ProjectCardChange{ Note: &ProjectCardNote{From: String("NoteFrom")}, }, AfterID: Int64(1), ProjectCard: &ProjectCard{ID: Int64(1)}, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "changes": { "note": { "from": "NoteFrom" } }, "after_id": 1, "project_card": { "id": 1 }, "repository": { "id": 1, "name": "n", "url": "s" }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestProjectColumnEvent_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectColumnEvent{}, "{}") u := &ProjectColumnEvent{ Action: String("a"), Changes: &ProjectColumnChange{ Name: &ProjectColumnName{From: String("NameFrom")}, }, AfterID: Int64(1), ProjectColumn: &ProjectColumn{ID: Int64(1)}, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Org: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "changes": { "name": { "from": "NameFrom" } }, "after_id": 1, "project_column": { "id": 1 }, "repository": { "id": 1, "name": "n", "url": "s" }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestPullRequestEvent_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestEvent{}, "{}") u := &PullRequestEvent{ Action: String("a"), Assignee: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Number: Int(1), PullRequest: &PullRequest{ID: Int64(1)}, Changes: &EditChange{ Title: &EditTitle{ From: String("TitleFrom"), }, Body: &EditBody{ From: String("BodyFrom"), }, Base: &EditBase{ Ref: &EditRef{ From: String("BaseRefFrom"), }, SHA: &EditSHA{ From: String("BaseSHAFrom"), }, }, }, RequestedReviewer: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, RequestedTeam: &Team{ID: Int64(1)}, Label: &Label{ID: Int64(1)}, Before: String("before"), After: String("after"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Organization: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "assignee": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "number": 1, "pull_request": { "id": 1 }, "changes": { "title": { "from": "TitleFrom" }, "body": { "from": "BodyFrom" }, "base": { "ref": { "from": "BaseRefFrom" }, "sha": { "from": "BaseSHAFrom" } } }, "requested_reviewer": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "requested_team": { "id": 1 }, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` }, "label": { "id": 1 }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "before": "before", "after": "after" }` testJSONMarshal(t, u, want) } func TestPullRequestReviewCommentEvent_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestReviewCommentEvent{}, "{}") u := &PullRequestReviewCommentEvent{ Action: String("a"), PullRequest: &PullRequest{ID: Int64(1)}, Comment: &PullRequestComment{ID: Int64(1)}, Changes: &EditChange{ Title: &EditTitle{ From: String("TitleFrom"), }, Body: &EditBody{ From: String("BodyFrom"), }, Base: &EditBase{ Ref: &EditRef{ From: String("BaseRefFrom"), }, SHA: &EditSHA{ From: String("BaseSHAFrom"), }, }, }, Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "pull_request": { "id": 1 }, "comment": { "id": 1 }, "changes": { "title": { "from": "TitleFrom" }, "body": { "from": "BodyFrom" }, "base": { "ref": { "from": "BaseRefFrom" }, "sha": { "from": "BaseSHAFrom" } } }, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestPullRequestTargetEvent_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestTargetEvent{}, "{}") u := &PullRequestTargetEvent{ Action: String("a"), Assignee: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Number: Int(1), PullRequest: &PullRequest{ID: Int64(1)}, Changes: &EditChange{ Title: &EditTitle{ From: String("TitleFrom"), }, Body: &EditBody{ From: String("BodyFrom"), }, Base: &EditBase{ Ref: &EditRef{ From: String("BaseRefFrom"), }, SHA: &EditSHA{ From: String("BaseSHAFrom"), }, }, }, RequestedReviewer: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, RequestedTeam: &Team{ID: Int64(1)}, Label: &Label{ID: Int64(1)}, Before: String("before"), After: String("after"), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, Organization: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, Sender: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Installation: &Installation{ ID: Int64(1), NodeID: String("nid"), AppID: Int64(1), AppSlug: String("as"), TargetID: Int64(1), Account: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, AccessTokensURL: String("atu"), RepositoriesURL: String("ru"), HTMLURL: String("hu"), TargetType: String("tt"), SingleFileName: String("sfn"), RepositorySelection: String("rs"), Events: []string{"e"}, SingleFilePaths: []string{"s"}, Permissions: &InstallationPermissions{ Actions: String("a"), Administration: String("ad"), Checks: String("c"), Contents: String("co"), ContentReferences: String("cr"), Deployments: String("d"), Environments: String("e"), Issues: String("i"), Metadata: String("md"), Members: String("m"), OrganizationAdministration: String("oa"), OrganizationHooks: String("oh"), OrganizationPlan: String("op"), OrganizationPreReceiveHooks: String("opr"), OrganizationProjects: String("op"), OrganizationSecrets: String("os"), OrganizationSelfHostedRunners: String("osh"), OrganizationUserBlocking: String("oub"), Packages: String("pkg"), Pages: String("pg"), PullRequests: String("pr"), RepositoryHooks: String("rh"), RepositoryProjects: String("rp"), RepositoryPreReceiveHooks: String("rprh"), Secrets: String("s"), SecretScanningAlerts: String("ssa"), SecurityEvents: String("se"), SingleFile: String("sf"), Statuses: String("s"), TeamDiscussions: String("td"), VulnerabilityAlerts: String("va"), Workflows: String("w"), }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "action": "a", "assignee": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "number": 1, "pull_request": { "id": 1 }, "changes": { "title": { "from": "TitleFrom" }, "body": { "from": "BodyFrom" }, "base": { "ref": { "from": "BaseRefFrom" }, "sha": { "from": "BaseSHAFrom" } } }, "requested_reviewer": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "requested_team": { "id": 1 }, "repository": { "id": 1, "name": "n", "url": "s" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "installation": { "id": 1, "node_id": "nid", "app_id": 1, "app_slug": "as", "target_id": 1, "account": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "access_tokens_url": "atu", "repositories_url": "ru", "html_url": "hu", "target_type": "tt", "single_file_name": "sfn", "repository_selection": "rs", "events": [ "e" ], "single_file_paths": [ "s" ], "permissions": { "actions": "a", "administration": "ad", "checks": "c", "contents": "co", "content_references": "cr", "deployments": "d", "environments": "e", "issues": "i", "metadata": "md", "members": "m", "organization_administration": "oa", "organization_hooks": "oh", "organization_plan": "op", "organization_pre_receive_hooks": "opr", "organization_projects": "op", "organization_secrets": "os", "organization_self_hosted_runners": "osh", "organization_user_blocking": "oub", "packages": "pkg", "pages": "pg", "pull_requests": "pr", "repository_hooks": "rh", "repository_projects": "rp", "repository_pre_receive_hooks": "rprh", "secrets": "s", "secret_scanning_alerts": "ssa", "security_events": "se", "single_file": "sf", "statuses": "s", "team_discussions": "td", "vulnerability_alerts": "va", "workflows": "w" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "has_multiple_single_files": false, "suspended_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "suspended_at": ` + referenceTimeStr + ` }, "label": { "id": 1 }, "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "before": "before", "after": "after" }` testJSONMarshal(t, u, want) } func TestRepositoryVulnerabilityAlertEvent_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryVulnerabilityAlertEvent{}, "{}") u := &RepositoryVulnerabilityAlertEvent{ Action: String("a"), Alert: &RepositoryVulnerabilityAlert{ ID: Int64(1), AffectedRange: String("ar"), AffectedPackageName: String("apn"), ExternalReference: String("er"), ExternalIdentifier: String("ei"), FixedIn: String("fi"), Dismisser: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, DismissReason: String("dr"), DismissedAt: &Timestamp{referenceTime}, }, Repository: &Repository{ ID: Int64(1), URL: String("s"), Name: String("n"), }, } want := `{ "action": "a", "alert": { "id": 1, "affected_range": "ar", "affected_package_name": "apn", "external_reference": "er", "external_identifier": "ei", "fixed_in": "fi", "dismisser": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "dismiss_reason": "dr", "dismissed_at": ` + referenceTimeStr + ` }, "repository": { "id": 1, "name": "n", "url": "s" } }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/examples_test.go000066400000000000000000000121711410475703100201620ustar00rootroot00000000000000// Copyright 2016 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. // These examples are inlined in godoc. package github_test import ( "context" "fmt" "log" "github.com/google/go-github/v38/github" ) func ExampleClient_Markdown() { client := github.NewClient(nil) input := "# heading #\n\nLink to issue #1" opt := &github.MarkdownOptions{Mode: "gfm", Context: "google/go-github"} ctx := context.Background() output, _, err := client.Markdown(ctx, input, opt) if err != nil { fmt.Println(err) } fmt.Println(output) } func ExampleRepositoriesService_GetReadme() { client := github.NewClient(nil) ctx := context.Background() readme, _, err := client.Repositories.GetReadme(ctx, "google", "go-github", nil) if err != nil { fmt.Println(err) return } content, err := readme.GetContent() if err != nil { fmt.Println(err) return } fmt.Printf("google/go-github README:\n%v\n", content) } func ExampleRepositoriesService_List() { client := github.NewClient(nil) user := "willnorris" opt := &github.RepositoryListOptions{Type: "owner", Sort: "updated", Direction: "desc"} ctx := context.Background() repos, _, err := client.Repositories.List(ctx, user, opt) if err != nil { fmt.Println(err) } fmt.Printf("Recently updated repositories by %q: %v", user, github.Stringify(repos)) } func ExampleRepositoriesService_CreateFile() { // In this example we're creating a new file in a repository using the // Contents API. Only 1 file per commit can be managed through that API. // Note that authentication is needed here as you are performing a modification // so you will need to modify the example to provide an oauth client to // github.NewClient() instead of nil. See the following documentation for more // information on how to authenticate with the client: // https://godoc.org/github.com/google/go-github/github#hdr-Authentication client := github.NewClient(nil) ctx := context.Background() fileContent := []byte("This is the content of my file\nand the 2nd line of it") // Note: the file needs to be absent from the repository as you are not // specifying a SHA reference here. opts := &github.RepositoryContentFileOptions{ Message: github.String("This is my commit message"), Content: fileContent, Branch: github.String("master"), Committer: &github.CommitAuthor{Name: github.String("FirstName LastName"), Email: github.String("user@example.com")}, } _, _, err := client.Repositories.CreateFile(ctx, "myOrganization", "myRepository", "myNewFile.md", opts) if err != nil { fmt.Println(err) return } } func ExampleUsersService_ListAll() { client := github.NewClient(nil) opts := &github.UserListOptions{} for { ctx := context.Background() users, _, err := client.Users.ListAll(ctx, opts) if err != nil { log.Fatalf("error listing users: %v", err) } if len(users) == 0 { break } opts.Since = *users[len(users)-1].ID // Process users... } } func ExamplePullRequestsService_Create() { // In this example we're creating a PR and displaying the HTML url at the end. // Note that authentication is needed here as you are performing a modification // so you will need to modify the example to provide an oauth client to // github.NewClient() instead of nil. See the following documentation for more // information on how to authenticate with the client: // https://godoc.org/github.com/google/go-github/github#hdr-Authentication client := github.NewClient(nil) newPR := &github.NewPullRequest{ Title: github.String("My awesome pull request"), Head: github.String("branch_to_merge"), Base: github.String("master"), Body: github.String("This is the description of the PR created with the package `github.com/google/go-github/github`"), MaintainerCanModify: github.Bool(true), } ctx := context.Background() pr, _, err := client.PullRequests.Create(ctx, "myOrganization", "myRepository", newPR) if err != nil { fmt.Println(err) return } fmt.Printf("PR created: %s\n", pr.GetHTMLURL()) } func ExampleTeamsService_ListTeams() { // This example shows how to get a team ID corresponding to a given team name. // Note that authentication is needed here as you are performing a lookup on // an organization's administrative configuration, so you will need to modify // the example to provide an oauth client to github.NewClient() instead of nil. // See the following documentation for more information on how to authenticate // with the client: // https://godoc.org/github.com/google/go-github/github#hdr-Authentication client := github.NewClient(nil) teamName := "Developers team" ctx := context.Background() opts := &github.ListOptions{} for { teams, resp, err := client.Teams.ListTeams(ctx, "myOrganization", opts) if err != nil { fmt.Println(err) return } for _, t := range teams { if t.GetName() == teamName { fmt.Printf("Team %q has ID %d\n", teamName, t.GetID()) return } } if resp.NextPage == 0 { break } opts.Page = resp.NextPage } fmt.Printf("Team %q was not found\n", teamName) } go-github-38.1.0/github/gen-accessors.go000066400000000000000000000254411410475703100200450ustar00rootroot00000000000000// Copyright 2017 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. //go:build ignore // +build ignore // gen-accessors generates accessor methods for structs with pointer fields. // // It is meant to be used by go-github contributors in conjunction with the // go generate tool before sending a PR to GitHub. // Please see the CONTRIBUTING.md file for more information. package main import ( "bytes" "flag" "fmt" "go/ast" "go/format" "go/parser" "go/token" "io/ioutil" "log" "os" "sort" "strings" "text/template" ) const ( fileSuffix = "-accessors.go" ) var ( verbose = flag.Bool("v", false, "Print verbose log messages") sourceTmpl = template.Must(template.New("source").Parse(source)) testTmpl = template.Must(template.New("test").Parse(test)) // skipStructMethods lists "struct.method" combos to skip. skipStructMethods = map[string]bool{ "RepositoryContent.GetContent": true, "Client.GetBaseURL": true, "Client.GetUploadURL": true, "ErrorResponse.GetResponse": true, "RateLimitError.GetResponse": true, "AbuseRateLimitError.GetResponse": true, } // skipStructs lists structs to skip. skipStructs = map[string]bool{ "Client": true, } ) func logf(fmt string, args ...interface{}) { if *verbose { log.Printf(fmt, args...) } } func main() { flag.Parse() fset := token.NewFileSet() pkgs, err := parser.ParseDir(fset, ".", sourceFilter, 0) if err != nil { log.Fatal(err) return } for pkgName, pkg := range pkgs { t := &templateData{ filename: pkgName + fileSuffix, Year: 2017, Package: pkgName, Imports: map[string]string{}, } for filename, f := range pkg.Files { logf("Processing %v...", filename) if err := t.processAST(f); err != nil { log.Fatal(err) } } if err := t.dump(); err != nil { log.Fatal(err) } } logf("Done.") } func (t *templateData) processAST(f *ast.File) error { for _, decl := range f.Decls { gd, ok := decl.(*ast.GenDecl) if !ok { continue } for _, spec := range gd.Specs { ts, ok := spec.(*ast.TypeSpec) if !ok { continue } // Skip unexported identifiers. if !ts.Name.IsExported() { logf("Struct %v is unexported; skipping.", ts.Name) continue } // Check if the struct should be skipped. if skipStructs[ts.Name.Name] { logf("Struct %v is in skip list; skipping.", ts.Name) continue } st, ok := ts.Type.(*ast.StructType) if !ok { continue } for _, field := range st.Fields.List { if len(field.Names) == 0 { continue } fieldName := field.Names[0] // Skip unexported identifiers. if !fieldName.IsExported() { logf("Field %v is unexported; skipping.", fieldName) continue } // Check if "struct.method" should be skipped. if key := fmt.Sprintf("%v.Get%v", ts.Name, fieldName); skipStructMethods[key] { logf("Method %v is skip list; skipping.", key) continue } se, ok := field.Type.(*ast.StarExpr) if !ok { switch x := field.Type.(type) { case *ast.MapType: t.addMapType(x, ts.Name.String(), fieldName.String(), false) continue } logf("Skipping field type %T, fieldName=%v", field.Type, fieldName) continue } switch x := se.X.(type) { case *ast.ArrayType: t.addArrayType(x, ts.Name.String(), fieldName.String()) case *ast.Ident: t.addIdent(x, ts.Name.String(), fieldName.String()) case *ast.MapType: t.addMapType(x, ts.Name.String(), fieldName.String(), true) case *ast.SelectorExpr: t.addSelectorExpr(x, ts.Name.String(), fieldName.String()) default: logf("processAST: type %q, field %q, unknown %T: %+v", ts.Name, fieldName, x, x) } } } } return nil } func sourceFilter(fi os.FileInfo) bool { return !strings.HasSuffix(fi.Name(), "_test.go") && !strings.HasSuffix(fi.Name(), fileSuffix) } func (t *templateData) dump() error { if len(t.Getters) == 0 { logf("No getters for %v; skipping.", t.filename) return nil } // Sort getters by ReceiverType.FieldName. sort.Sort(byName(t.Getters)) processTemplate := func(tmpl *template.Template, filename string) error { var buf bytes.Buffer if err := tmpl.Execute(&buf, t); err != nil { return err } clean, err := format.Source(buf.Bytes()) if err != nil { return fmt.Errorf("format.Source:\n%v\n%v", buf.String(), err) } logf("Writing %v...", filename) if err := ioutil.WriteFile(filename, clean, 0644); err != nil { return err } return nil } if err := processTemplate(sourceTmpl, t.filename); err != nil { return err } return processTemplate(testTmpl, strings.ReplaceAll(t.filename, ".go", "_test.go")) } func newGetter(receiverType, fieldName, fieldType, zeroValue string, namedStruct bool) *getter { return &getter{ sortVal: strings.ToLower(receiverType) + "." + strings.ToLower(fieldName), ReceiverVar: strings.ToLower(receiverType[:1]), ReceiverType: receiverType, FieldName: fieldName, FieldType: fieldType, ZeroValue: zeroValue, NamedStruct: namedStruct, } } func (t *templateData) addArrayType(x *ast.ArrayType, receiverType, fieldName string) { var eltType string switch elt := x.Elt.(type) { case *ast.Ident: eltType = elt.String() default: logf("addArrayType: type %q, field %q: unknown elt type: %T %+v; skipping.", receiverType, fieldName, elt, elt) return } t.Getters = append(t.Getters, newGetter(receiverType, fieldName, "[]"+eltType, "nil", false)) } func (t *templateData) addIdent(x *ast.Ident, receiverType, fieldName string) { var zeroValue string var namedStruct = false switch x.String() { case "int", "int64": zeroValue = "0" case "string": zeroValue = `""` case "bool": zeroValue = "false" case "Timestamp": zeroValue = "Timestamp{}" default: zeroValue = "nil" namedStruct = true } t.Getters = append(t.Getters, newGetter(receiverType, fieldName, x.String(), zeroValue, namedStruct)) } func (t *templateData) addMapType(x *ast.MapType, receiverType, fieldName string, isAPointer bool) { var keyType string switch key := x.Key.(type) { case *ast.Ident: keyType = key.String() default: logf("addMapType: type %q, field %q: unknown key type: %T %+v; skipping.", receiverType, fieldName, key, key) return } var valueType string switch value := x.Value.(type) { case *ast.Ident: valueType = value.String() default: logf("addMapType: type %q, field %q: unknown value type: %T %+v; skipping.", receiverType, fieldName, value, value) return } fieldType := fmt.Sprintf("map[%v]%v", keyType, valueType) zeroValue := fmt.Sprintf("map[%v]%v{}", keyType, valueType) ng := newGetter(receiverType, fieldName, fieldType, zeroValue, false) ng.MapType = !isAPointer t.Getters = append(t.Getters, ng) } func (t *templateData) addSelectorExpr(x *ast.SelectorExpr, receiverType, fieldName string) { if strings.ToLower(fieldName[:1]) == fieldName[:1] { // Non-exported field. return } var xX string if xx, ok := x.X.(*ast.Ident); ok { xX = xx.String() } switch xX { case "time", "json": if xX == "json" { t.Imports["encoding/json"] = "encoding/json" } else { t.Imports[xX] = xX } fieldType := fmt.Sprintf("%v.%v", xX, x.Sel.Name) zeroValue := fmt.Sprintf("%v.%v{}", xX, x.Sel.Name) if xX == "time" && x.Sel.Name == "Duration" { zeroValue = "0" } t.Getters = append(t.Getters, newGetter(receiverType, fieldName, fieldType, zeroValue, false)) default: logf("addSelectorExpr: xX %q, type %q, field %q: unknown x=%+v; skipping.", xX, receiverType, fieldName, x) } } type templateData struct { filename string Year int Package string Imports map[string]string Getters []*getter } type getter struct { sortVal string // Lower-case version of "ReceiverType.FieldName". ReceiverVar string // The one-letter variable name to match the ReceiverType. ReceiverType string FieldName string FieldType string ZeroValue string NamedStruct bool // Getter for named struct. MapType bool } type byName []*getter func (b byName) Len() int { return len(b) } func (b byName) Less(i, j int) bool { return b[i].sortVal < b[j].sortVal } func (b byName) Swap(i, j int) { b[i], b[j] = b[j], b[i] } const source = `// Copyright {{.Year}} 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. // Code generated by gen-accessors; DO NOT EDIT. package {{.Package}} {{with .Imports}} import ( {{- range . -}} "{{.}}" {{end -}} ) {{end}} {{range .Getters}} {{if .NamedStruct}} // Get{{.FieldName}} returns the {{.FieldName}} field. func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() *{{.FieldType}} { if {{.ReceiverVar}} == nil { return {{.ZeroValue}} } return {{.ReceiverVar}}.{{.FieldName}} } {{else if .MapType}} // Get{{.FieldName}} returns the {{.FieldName}} map if it's non-nil, an empty map otherwise. func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() {{.FieldType}} { if {{.ReceiverVar}} == nil || {{.ReceiverVar}}.{{.FieldName}} == nil { return {{.ZeroValue}} } return {{.ReceiverVar}}.{{.FieldName}} } {{else}} // Get{{.FieldName}} returns the {{.FieldName}} field if it's non-nil, zero value otherwise. func ({{.ReceiverVar}} *{{.ReceiverType}}) Get{{.FieldName}}() {{.FieldType}} { if {{.ReceiverVar}} == nil || {{.ReceiverVar}}.{{.FieldName}} == nil { return {{.ZeroValue}} } return *{{.ReceiverVar}}.{{.FieldName}} } {{end}} {{end}} ` const test = `// Copyright {{.Year}} 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. // Code generated by gen-accessors; DO NOT EDIT. package {{.Package}} {{with .Imports}} import ( "testing" {{range . -}} "{{.}}" {{end -}} ) {{end}} {{range .Getters}} {{if .NamedStruct}} func Test{{.ReceiverType}}_Get{{.FieldName}}(tt *testing.T) { {{.ReceiverVar}} := &{{.ReceiverType}}{} {{.ReceiverVar}}.Get{{.FieldName}}() {{.ReceiverVar}} = nil {{.ReceiverVar}}.Get{{.FieldName}}() } {{else if .MapType}} func Test{{.ReceiverType}}_Get{{.FieldName}}(tt *testing.T) { zeroValue := {{.FieldType}}{} {{.ReceiverVar}} := &{{.ReceiverType}}{ {{.FieldName}}: zeroValue } {{.ReceiverVar}}.Get{{.FieldName}}() {{.ReceiverVar}} = &{{.ReceiverType}}{} {{.ReceiverVar}}.Get{{.FieldName}}() {{.ReceiverVar}} = nil {{.ReceiverVar}}.Get{{.FieldName}}() } {{else}} func Test{{.ReceiverType}}_Get{{.FieldName}}(tt *testing.T) { var zeroValue {{.FieldType}} {{.ReceiverVar}} := &{{.ReceiverType}}{ {{.FieldName}}: &zeroValue } {{.ReceiverVar}}.Get{{.FieldName}}() {{.ReceiverVar}} = &{{.ReceiverType}}{} {{.ReceiverVar}}.Get{{.FieldName}}() {{.ReceiverVar}} = nil {{.ReceiverVar}}.Get{{.FieldName}}() } {{end}} {{end}} ` go-github-38.1.0/github/gen-stringify-test.go000066400000000000000000000217431410475703100210540ustar00rootroot00000000000000// Copyright 2019 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. //go:build ignore // +build ignore // gen-stringify-test generates test methods to test the String methods. // // These tests eliminate most of the code coverage problems so that real // code coverage issues can be more readily identified. // // It is meant to be used by go-github contributors in conjunction with the // go generate tool before sending a PR to GitHub. // Please see the CONTRIBUTING.md file for more information. package main import ( "bytes" "flag" "fmt" "go/ast" "go/format" "go/parser" "go/token" "io/ioutil" "log" "os" "strings" "text/template" ) const ( ignoreFilePrefix1 = "gen-" ignoreFilePrefix2 = "github-" outputFileSuffix = "-stringify_test.go" ) var ( verbose = flag.Bool("v", false, "Print verbose log messages") // skipStructMethods lists "struct.method" combos to skip. skipStructMethods = map[string]bool{} // skipStructs lists structs to skip. skipStructs = map[string]bool{ "RateLimits": true, } funcMap = template.FuncMap{ "isNotLast": func(index int, slice []*structField) string { if index+1 < len(slice) { return ", " } return "" }, "processZeroValue": func(v string) string { switch v { case "Bool(false)": return "false" case "Float64(0.0)": return "0" case "0", "Int(0)", "Int64(0)": return "0" case `""`, `String("")`: return `""` case "Timestamp{}", "&Timestamp{}": return "github.Timestamp{0001-01-01 00:00:00 +0000 UTC}" case "nil": return "map[]" } log.Fatalf("Unhandled zero value: %q", v) return "" }, } sourceTmpl = template.Must(template.New("source").Funcs(funcMap).Parse(source)) ) func main() { flag.Parse() fset := token.NewFileSet() pkgs, err := parser.ParseDir(fset, ".", sourceFilter, 0) if err != nil { log.Fatal(err) return } for pkgName, pkg := range pkgs { t := &templateData{ filename: pkgName + outputFileSuffix, Year: 2019, // No need to change this once set (even in following years). Package: pkgName, Imports: map[string]string{"testing": "testing"}, StringFuncs: map[string]bool{}, StructFields: map[string][]*structField{}, } for filename, f := range pkg.Files { logf("Processing %v...", filename) if err := t.processAST(f); err != nil { log.Fatal(err) } } if err := t.dump(); err != nil { log.Fatal(err) } } logf("Done.") } func sourceFilter(fi os.FileInfo) bool { return !strings.HasSuffix(fi.Name(), "_test.go") && !strings.HasPrefix(fi.Name(), ignoreFilePrefix1) && !strings.HasPrefix(fi.Name(), ignoreFilePrefix2) } type templateData struct { filename string Year int Package string Imports map[string]string StringFuncs map[string]bool StructFields map[string][]*structField } type structField struct { sortVal string // Lower-case version of "ReceiverType.FieldName". ReceiverVar string // The one-letter variable name to match the ReceiverType. ReceiverType string FieldName string FieldType string ZeroValue string NamedStruct bool // Getter for named struct. } func (t *templateData) processAST(f *ast.File) error { for _, decl := range f.Decls { fn, ok := decl.(*ast.FuncDecl) if ok { if fn.Recv != nil && len(fn.Recv.List) > 0 { id, ok := fn.Recv.List[0].Type.(*ast.Ident) if ok && fn.Name.Name == "String" { logf("Got FuncDecl: Name=%q, id.Name=%#v", fn.Name.Name, id.Name) t.StringFuncs[id.Name] = true } else { logf("Ignoring FuncDecl: Name=%q, Type=%T", fn.Name.Name, fn.Recv.List[0].Type) } } else { logf("Ignoring FuncDecl: Name=%q, fn=%#v", fn.Name.Name, fn) } continue } gd, ok := decl.(*ast.GenDecl) if !ok { logf("Ignoring AST decl type %T", decl) continue } for _, spec := range gd.Specs { ts, ok := spec.(*ast.TypeSpec) if !ok { continue } // Skip unexported identifiers. if !ts.Name.IsExported() { logf("Struct %v is unexported; skipping.", ts.Name) continue } // Check if the struct should be skipped. if skipStructs[ts.Name.Name] { logf("Struct %v is in skip list; skipping.", ts.Name) continue } st, ok := ts.Type.(*ast.StructType) if !ok { logf("Ignoring AST type %T, Name=%q", ts.Type, ts.Name.String()) continue } for _, field := range st.Fields.List { if len(field.Names) == 0 { continue } fieldName := field.Names[0] if id, ok := field.Type.(*ast.Ident); ok { t.addIdent(id, ts.Name.String(), fieldName.String()) continue } se, ok := field.Type.(*ast.StarExpr) if !ok { logf("Ignoring type %T for Name=%q, FieldName=%q", field.Type, ts.Name.String(), fieldName.String()) continue } // Skip unexported identifiers. if !fieldName.IsExported() { logf("Field %v is unexported; skipping.", fieldName) continue } // Check if "struct.method" should be skipped. if key := fmt.Sprintf("%v.Get%v", ts.Name, fieldName); skipStructMethods[key] { logf("Method %v is in skip list; skipping.", key) continue } switch x := se.X.(type) { case *ast.ArrayType: case *ast.Ident: t.addIdentPtr(x, ts.Name.String(), fieldName.String()) case *ast.MapType: case *ast.SelectorExpr: default: logf("processAST: type %q, field %q, unknown %T: %+v", ts.Name, fieldName, x, x) } } } } return nil } func (t *templateData) addMapType(receiverType, fieldName string) { t.StructFields[receiverType] = append(t.StructFields[receiverType], newStructField(receiverType, fieldName, "map[]", "nil", false)) } func (t *templateData) addIdent(x *ast.Ident, receiverType, fieldName string) { var zeroValue string var namedStruct = false switch x.String() { case "int": zeroValue = "0" case "int64": zeroValue = "0" case "float64": zeroValue = "0.0" case "string": zeroValue = `""` case "bool": zeroValue = "false" case "Timestamp": zeroValue = "Timestamp{}" default: zeroValue = "nil" namedStruct = true } t.StructFields[receiverType] = append(t.StructFields[receiverType], newStructField(receiverType, fieldName, x.String(), zeroValue, namedStruct)) } func (t *templateData) addIdentPtr(x *ast.Ident, receiverType, fieldName string) { var zeroValue string var namedStruct = false switch x.String() { case "int": zeroValue = "Int(0)" case "int64": zeroValue = "Int64(0)" case "float64": zeroValue = "Float64(0.0)" case "string": zeroValue = `String("")` case "bool": zeroValue = "Bool(false)" case "Timestamp": zeroValue = "&Timestamp{}" default: zeroValue = "nil" namedStruct = true } t.StructFields[receiverType] = append(t.StructFields[receiverType], newStructField(receiverType, fieldName, x.String(), zeroValue, namedStruct)) } func (t *templateData) dump() error { if len(t.StructFields) == 0 { logf("No StructFields for %v; skipping.", t.filename) return nil } // Remove unused structs. var toDelete []string for k := range t.StructFields { if !t.StringFuncs[k] { toDelete = append(toDelete, k) continue } } for _, k := range toDelete { delete(t.StructFields, k) } var buf bytes.Buffer if err := sourceTmpl.Execute(&buf, t); err != nil { return err } clean, err := format.Source(buf.Bytes()) if err != nil { log.Printf("failed-to-format source:\n%v", buf.String()) return err } logf("Writing %v...", t.filename) return ioutil.WriteFile(t.filename, clean, 0644) } func newStructField(receiverType, fieldName, fieldType, zeroValue string, namedStruct bool) *structField { return &structField{ sortVal: strings.ToLower(receiverType) + "." + strings.ToLower(fieldName), ReceiverVar: strings.ToLower(receiverType[:1]), ReceiverType: receiverType, FieldName: fieldName, FieldType: fieldType, ZeroValue: zeroValue, NamedStruct: namedStruct, } } func logf(fmt string, args ...interface{}) { if *verbose { log.Printf(fmt, args...) } } const source = `// Copyright {{.Year}} 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. // Code generated by gen-stringify-tests; DO NOT EDIT. package {{ $package := .Package}}{{$package}} {{with .Imports}} import ( {{- range . -}} "{{.}}" {{end -}} ) {{end}} func Float64(v float64) *float64 { return &v } {{range $key, $value := .StructFields}} func Test{{ $key }}_String(t *testing.T) { v := {{ $key }}{ {{range .}}{{if .NamedStruct}} {{ .FieldName }}: &{{ .FieldType }}{},{{else}} {{ .FieldName }}: {{.ZeroValue}},{{end}}{{end}} } want := ` + "`" + `{{ $package }}.{{ $key }}{{ $slice := . }}{ {{- range $ind, $val := .}}{{if .NamedStruct}}{{ .FieldName }}:{{ $package }}.{{ .FieldType }}{}{{else}}{{ .FieldName }}:{{ processZeroValue .ZeroValue }}{{end}}{{ isNotLast $ind $slice }}{{end}}}` + "`" + ` if got := v.String(); got != want { t.Errorf("{{ $key }}.String = %v, want %v", got, want) } } {{end}} ` go-github-38.1.0/github/gists.go000066400000000000000000000243341410475703100164420ustar00rootroot00000000000000// Copyright 2013 The go-github AUTHORS. All rights reserved. // // Use of this source code is governed by BSD-style // license that can be found in the LICENSE file. package github import ( "context" "fmt" "time" ) // GistsService handles communication with the Gist related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/ type GistsService service // Gist represents a GitHub's gist. type Gist struct { ID *string `json:"id,omitempty"` Description *string `json:"description,omitempty"` Public *bool `json:"public,omitempty"` Owner *User `json:"owner,omitempty"` Files map[GistFilename]GistFile `json:"files,omitempty"` Comments *int `json:"comments,omitempty"` HTMLURL *string `json:"html_url,omitempty"` GitPullURL *string `json:"git_pull_url,omitempty"` GitPushURL *string `json:"git_push_url,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` UpdatedAt *time.Time `json:"updated_at,omitempty"` NodeID *string `json:"node_id,omitempty"` } func (g Gist) String() string { return Stringify(g) } // GistFilename represents filename on a gist. type GistFilename string // GistFile represents a file on a gist. type GistFile struct { Size *int `json:"size,omitempty"` Filename *string `json:"filename,omitempty"` Language *string `json:"language,omitempty"` Type *string `json:"type,omitempty"` RawURL *string `json:"raw_url,omitempty"` Content *string `json:"content,omitempty"` } func (g GistFile) String() string { return Stringify(g) } // GistCommit represents a commit on a gist. type GistCommit struct { URL *string `json:"url,omitempty"` Version *string `json:"version,omitempty"` User *User `json:"user,omitempty"` ChangeStatus *CommitStats `json:"change_status,omitempty"` CommittedAt *Timestamp `json:"committed_at,omitempty"` NodeID *string `json:"node_id,omitempty"` } func (gc GistCommit) String() string { return Stringify(gc) } // GistFork represents a fork of a gist. type GistFork struct { URL *string `json:"url,omitempty"` User *User `json:"user,omitempty"` ID *string `json:"id,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` NodeID *string `json:"node_id,omitempty"` } func (gf GistFork) String() string { return Stringify(gf) } // GistListOptions specifies the optional parameters to the // GistsService.List, GistsService.ListAll, and GistsService.ListStarred methods. type GistListOptions struct { // Since filters Gists by time. Since time.Time `url:"since,omitempty"` ListOptions } // List gists for a user. Passing the empty string will list // all public gists if called anonymously. However, if the call // is authenticated, it will returns all gists for the authenticated // user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#list-gists-for-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#list-gists-for-a-user func (s *GistsService) List(ctx context.Context, user string, opts *GistListOptions) ([]*Gist, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/gists", user) } else { u = "gists" } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var gists []*Gist resp, err := s.client.Do(ctx, req, &gists) if err != nil { return nil, resp, err } return gists, resp, nil } // ListAll lists all public gists. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#list-public-gists func (s *GistsService) ListAll(ctx context.Context, opts *GistListOptions) ([]*Gist, *Response, error) { u, err := addOptions("gists/public", opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var gists []*Gist resp, err := s.client.Do(ctx, req, &gists) if err != nil { return nil, resp, err } return gists, resp, nil } // ListStarred lists starred gists of authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#list-starred-gists func (s *GistsService) ListStarred(ctx context.Context, opts *GistListOptions) ([]*Gist, *Response, error) { u, err := addOptions("gists/starred", opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var gists []*Gist resp, err := s.client.Do(ctx, req, &gists) if err != nil { return nil, resp, err } return gists, resp, nil } // Get a single gist. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#get-a-gist func (s *GistsService) Get(ctx context.Context, id string) (*Gist, *Response, error) { u := fmt.Sprintf("gists/%v", id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } gist := new(Gist) resp, err := s.client.Do(ctx, req, gist) if err != nil { return nil, resp, err } return gist, resp, nil } // GetRevision gets a specific revision of a gist. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#get-a-gist-revision func (s *GistsService) GetRevision(ctx context.Context, id, sha string) (*Gist, *Response, error) { u := fmt.Sprintf("gists/%v/%v", id, sha) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } gist := new(Gist) resp, err := s.client.Do(ctx, req, gist) if err != nil { return nil, resp, err } return gist, resp, nil } // Create a gist for authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#create-a-gist func (s *GistsService) Create(ctx context.Context, gist *Gist) (*Gist, *Response, error) { u := "gists" req, err := s.client.NewRequest("POST", u, gist) if err != nil { return nil, nil, err } g := new(Gist) resp, err := s.client.Do(ctx, req, g) if err != nil { return nil, resp, err } return g, resp, nil } // Edit a gist. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#update-a-gist func (s *GistsService) Edit(ctx context.Context, id string, gist *Gist) (*Gist, *Response, error) { u := fmt.Sprintf("gists/%v", id) req, err := s.client.NewRequest("PATCH", u, gist) if err != nil { return nil, nil, err } g := new(Gist) resp, err := s.client.Do(ctx, req, g) if err != nil { return nil, resp, err } return g, resp, nil } // ListCommits lists commits of a gist. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#list-gist-commits func (s *GistsService) ListCommits(ctx context.Context, id string, opts *ListOptions) ([]*GistCommit, *Response, error) { u := fmt.Sprintf("gists/%v/commits", id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var gistCommits []*GistCommit resp, err := s.client.Do(ctx, req, &gistCommits) if err != nil { return nil, resp, err } return gistCommits, resp, nil } // Delete a gist. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#delete-a-gist func (s *GistsService) Delete(ctx context.Context, id string) (*Response, error) { u := fmt.Sprintf("gists/%v", id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // Star a gist on behalf of authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#star-a-gist func (s *GistsService) Star(ctx context.Context, id string) (*Response, error) { u := fmt.Sprintf("gists/%v/star", id) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // Unstar a gist on a behalf of authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#unstar-a-gist func (s *GistsService) Unstar(ctx context.Context, id string) (*Response, error) { u := fmt.Sprintf("gists/%v/star", id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // IsStarred checks if a gist is starred by authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#check-if-a-gist-is-starred func (s *GistsService) IsStarred(ctx context.Context, id string) (bool, *Response, error) { u := fmt.Sprintf("gists/%v/star", id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return false, nil, err } resp, err := s.client.Do(ctx, req, nil) starred, err := parseBoolResponse(err) return starred, resp, err } // Fork a gist. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#fork-a-gist func (s *GistsService) Fork(ctx context.Context, id string) (*Gist, *Response, error) { u := fmt.Sprintf("gists/%v/forks", id) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, nil, err } g := new(Gist) resp, err := s.client.Do(ctx, req, g) if err != nil { return nil, resp, err } return g, resp, nil } // ListForks lists forks of a gist. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#list-gist-forks func (s *GistsService) ListForks(ctx context.Context, id string, opts *ListOptions) ([]*GistFork, *Response, error) { u := fmt.Sprintf("gists/%v/forks", id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var gistForks []*GistFork resp, err := s.client.Do(ctx, req, &gistForks) if err != nil { return nil, resp, err } return gistForks, resp, nil } go-github-38.1.0/github/gists_comments.go000066400000000000000000000065531410475703100203520ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "time" ) // GistComment represents a Gist comment. type GistComment struct { ID *int64 `json:"id,omitempty"` URL *string `json:"url,omitempty"` Body *string `json:"body,omitempty"` User *User `json:"user,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` } func (g GistComment) String() string { return Stringify(g) } // ListComments lists all comments for a gist. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#list-gist-comments func (s *GistsService) ListComments(ctx context.Context, gistID string, opts *ListOptions) ([]*GistComment, *Response, error) { u := fmt.Sprintf("gists/%v/comments", gistID) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var comments []*GistComment resp, err := s.client.Do(ctx, req, &comments) if err != nil { return nil, resp, err } return comments, resp, nil } // GetComment retrieves a single comment from a gist. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#get-a-gist-comment func (s *GistsService) GetComment(ctx context.Context, gistID string, commentID int64) (*GistComment, *Response, error) { u := fmt.Sprintf("gists/%v/comments/%v", gistID, commentID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } c := new(GistComment) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } // CreateComment creates a comment for a gist. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#create-a-gist-comment func (s *GistsService) CreateComment(ctx context.Context, gistID string, comment *GistComment) (*GistComment, *Response, error) { u := fmt.Sprintf("gists/%v/comments", gistID) req, err := s.client.NewRequest("POST", u, comment) if err != nil { return nil, nil, err } c := new(GistComment) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } // EditComment edits an existing gist comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#update-a-gist-comment func (s *GistsService) EditComment(ctx context.Context, gistID string, commentID int64, comment *GistComment) (*GistComment, *Response, error) { u := fmt.Sprintf("gists/%v/comments/%v", gistID, commentID) req, err := s.client.NewRequest("PATCH", u, comment) if err != nil { return nil, nil, err } c := new(GistComment) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } // DeleteComment deletes a gist comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gists/#delete-a-gist-comment func (s *GistsService) DeleteComment(ctx context.Context, gistID string, commentID int64) (*Response, error) { u := fmt.Sprintf("gists/%v/comments/%v", gistID, commentID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/gists_comments_test.go000066400000000000000000000171261410475703100214070ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestGistComments_Marshal(t *testing.T) { testJSONMarshal(t, &GistComment{}, "{}") createdAt := time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC) u := &GistComment{ ID: Int64(1), URL: String("u"), Body: String("test gist comment"), User: &User{ Login: String("ll"), ID: Int64(123), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, URL: String("u"), }, CreatedAt: &createdAt, } want := `{ "id": 1, "url": "u", "body": "test gist comment", "user": { "login": "ll", "id": 123, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "url": "u" }, "created_at": "2002-02-10T15:30:00Z" }` testJSONMarshal(t, u, want) } func TestGistsService_ListComments(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists/1/comments", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id": 1}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() comments, _, err := client.Gists.ListComments(ctx, "1", opt) if err != nil { t.Errorf("Gists.Comments returned error: %v", err) } want := []*GistComment{{ID: Int64(1)}} if !cmp.Equal(comments, want) { t.Errorf("Gists.ListComments returned %+v, want %+v", comments, want) } const methodName = "ListComments" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.ListComments(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.ListComments(ctx, "1", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_ListComments_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Gists.ListComments(ctx, "%", nil) testURLParseError(t, err) } func TestGistsService_GetComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists/1/comments/2", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id": 1}`) }) ctx := context.Background() comment, _, err := client.Gists.GetComment(ctx, "1", 2) if err != nil { t.Errorf("Gists.GetComment returned error: %v", err) } want := &GistComment{ID: Int64(1)} if !cmp.Equal(comment, want) { t.Errorf("Gists.GetComment returned %+v, want %+v", comment, want) } const methodName = "GetComment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.GetComment(ctx, "\n", -2) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.GetComment(ctx, "1", 2) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_GetComment_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Gists.GetComment(ctx, "%", 1) testURLParseError(t, err) } func TestGistsService_CreateComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &GistComment{ID: Int64(1), Body: String("b")} mux.HandleFunc("/gists/1/comments", func(w http.ResponseWriter, r *http.Request) { v := new(GistComment) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() comment, _, err := client.Gists.CreateComment(ctx, "1", input) if err != nil { t.Errorf("Gists.CreateComment returned error: %v", err) } want := &GistComment{ID: Int64(1)} if !cmp.Equal(comment, want) { t.Errorf("Gists.CreateComment returned %+v, want %+v", comment, want) } const methodName = "CreateComment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.CreateComment(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.CreateComment(ctx, "1", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_CreateComment_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Gists.CreateComment(ctx, "%", nil) testURLParseError(t, err) } func TestGistsService_EditComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &GistComment{ID: Int64(1), Body: String("b")} mux.HandleFunc("/gists/1/comments/2", func(w http.ResponseWriter, r *http.Request) { v := new(GistComment) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() comment, _, err := client.Gists.EditComment(ctx, "1", 2, input) if err != nil { t.Errorf("Gists.EditComment returned error: %v", err) } want := &GistComment{ID: Int64(1)} if !cmp.Equal(comment, want) { t.Errorf("Gists.EditComment returned %+v, want %+v", comment, want) } const methodName = "EditComment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.EditComment(ctx, "\n", -2, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.EditComment(ctx, "1", 2, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_EditComment_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Gists.EditComment(ctx, "%", 1, nil) testURLParseError(t, err) } func TestGistsService_DeleteComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists/1/comments/2", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Gists.DeleteComment(ctx, "1", 2) if err != nil { t.Errorf("Gists.Delete returned error: %v", err) } const methodName = "DeleteComment" testBadOptions(t, methodName, func() (err error) { _, err = client.Gists.DeleteComment(ctx, "\n", -2) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Gists.DeleteComment(ctx, "1", 2) }) } func TestGistsService_DeleteComment_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Gists.DeleteComment(ctx, "%", 1) testURLParseError(t, err) } go-github-38.1.0/github/gists_test.go000066400000000000000000000626061410475703100175050ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestGist_Marshal(t *testing.T) { testJSONMarshal(t, &Gist{}, "{}") createdAt := time.Date(2010, time.February, 10, 10, 10, 0, 0, time.UTC) updatedAt := time.Date(2010, time.February, 10, 10, 10, 0, 0, time.UTC) u := &Gist{ ID: String("i"), Description: String("description"), Public: Bool(true), Owner: &User{ Login: String("ll"), ID: Int64(123), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, URL: String("u"), }, Files: map[GistFilename]GistFile{ "gistfile.py": { Size: Int(167), Filename: String("gistfile.py"), Language: String("Python"), Type: String("application/x-python"), RawURL: String("raw-url"), Content: String("c"), }, }, Comments: Int(1), HTMLURL: String("html-url"), GitPullURL: String("gitpull-url"), GitPushURL: String("gitpush-url"), CreatedAt: &createdAt, UpdatedAt: &updatedAt, NodeID: String("node"), } want := `{ "id": "i", "description": "description", "public": true, "owner": { "login": "ll", "id": 123, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "url": "u" }, "files": { "gistfile.py": { "size": 167, "filename": "gistfile.py", "language": "Python", "type": "application/x-python", "raw_url": "raw-url", "content": "c" } }, "comments": 1, "html_url": "html-url", "git_pull_url": "gitpull-url", "git_push_url": "gitpush-url", "created_at": "2010-02-10T10:10:00Z", "updated_at": "2010-02-10T10:10:00Z", "node_id": "node" }` testJSONMarshal(t, u, want) } func TestGistCommit_Marshal(t *testing.T) { testJSONMarshal(t, &GistCommit{}, "{}") u := &GistCommit{ URL: String("u"), Version: String("v"), User: &User{ Login: String("ll"), ID: Int64(123), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, URL: String("u"), }, ChangeStatus: &CommitStats{ Additions: Int(1), Deletions: Int(1), Total: Int(2), }, CommittedAt: &Timestamp{referenceTime}, NodeID: String("node"), } want := `{ "url": "u", "version": "v", "user": { "login": "ll", "id": 123, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "url": "u" }, "change_status": { "additions": 1, "deletions": 1, "total": 2 }, "committed_at": ` + referenceTimeStr + `, "node_id": "node" }` testJSONMarshal(t, u, want) } func TestGistFork_Marshal(t *testing.T) { testJSONMarshal(t, &GistFork{}, "{}") u := &GistFork{ URL: String("u"), User: &User{ Login: String("ll"), ID: Int64(123), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, URL: String("u"), }, ID: String("id"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, NodeID: String("node"), } want := `{ "url": "u", "user": { "login": "ll", "id": 123, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "url": "u" }, "id": "id", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "node_id": "node" }` testJSONMarshal(t, u, want) } func TestGistsService_List_specifiedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() since := "2013-01-01T00:00:00Z" mux.HandleFunc("/users/u/gists", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "since": since, }) fmt.Fprint(w, `[{"id": "1"}]`) }) opt := &GistListOptions{Since: time.Date(2013, time.January, 1, 0, 0, 0, 0, time.UTC)} ctx := context.Background() gists, _, err := client.Gists.List(ctx, "u", opt) if err != nil { t.Errorf("Gists.List returned error: %v", err) } want := []*Gist{{ID: String("1")}} if !cmp.Equal(gists, want) { t.Errorf("Gists.List returned %+v, want %+v", gists, want) } const methodName = "List" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.List(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.List(ctx, "u", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_List_authenticatedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id": "1"}]`) }) ctx := context.Background() gists, _, err := client.Gists.List(ctx, "", nil) if err != nil { t.Errorf("Gists.List returned error: %v", err) } want := []*Gist{{ID: String("1")}} if !cmp.Equal(gists, want) { t.Errorf("Gists.List returned %+v, want %+v", gists, want) } const methodName = "List" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.List(ctx, "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.List(ctx, "", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_List_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Gists.List(ctx, "%", nil) testURLParseError(t, err) } func TestGistsService_ListAll(t *testing.T) { client, mux, _, teardown := setup() defer teardown() since := "2013-01-01T00:00:00Z" mux.HandleFunc("/gists/public", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "since": since, }) fmt.Fprint(w, `[{"id": "1"}]`) }) opt := &GistListOptions{Since: time.Date(2013, time.January, 1, 0, 0, 0, 0, time.UTC)} ctx := context.Background() gists, _, err := client.Gists.ListAll(ctx, opt) if err != nil { t.Errorf("Gists.ListAll returned error: %v", err) } want := []*Gist{{ID: String("1")}} if !cmp.Equal(gists, want) { t.Errorf("Gists.ListAll returned %+v, want %+v", gists, want) } const methodName = "ListAll" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.ListAll(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_ListStarred(t *testing.T) { client, mux, _, teardown := setup() defer teardown() since := "2013-01-01T00:00:00Z" mux.HandleFunc("/gists/starred", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "since": since, }) fmt.Fprint(w, `[{"id": "1"}]`) }) opt := &GistListOptions{Since: time.Date(2013, time.January, 1, 0, 0, 0, 0, time.UTC)} ctx := context.Background() gists, _, err := client.Gists.ListStarred(ctx, opt) if err != nil { t.Errorf("Gists.ListStarred returned error: %v", err) } want := []*Gist{{ID: String("1")}} if !cmp.Equal(gists, want) { t.Errorf("Gists.ListStarred returned %+v, want %+v", gists, want) } const methodName = "ListStarred" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.ListStarred(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_Get(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id": "1"}`) }) ctx := context.Background() gist, _, err := client.Gists.Get(ctx, "1") if err != nil { t.Errorf("Gists.Get returned error: %v", err) } want := &Gist{ID: String("1")} if !cmp.Equal(gist, want) { t.Errorf("Gists.Get returned %+v, want %+v", gist, want) } const methodName = "Get" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.Get(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.Get(ctx, "1") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_Get_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Gists.Get(ctx, "%") testURLParseError(t, err) } func TestGistsService_GetRevision(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists/1/s", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id": "1"}`) }) ctx := context.Background() gist, _, err := client.Gists.GetRevision(ctx, "1", "s") if err != nil { t.Errorf("Gists.Get returned error: %v", err) } want := &Gist{ID: String("1")} if !cmp.Equal(gist, want) { t.Errorf("Gists.Get returned %+v, want %+v", gist, want) } const methodName = "GetRevision" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.GetRevision(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.GetRevision(ctx, "1", "s") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_GetRevision_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Gists.GetRevision(ctx, "%", "%") testURLParseError(t, err) } func TestGistsService_Create(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Gist{ Description: String("Gist description"), Public: Bool(false), Files: map[GistFilename]GistFile{ "test.txt": {Content: String("Gist file content")}, }, } mux.HandleFunc("/gists", func(w http.ResponseWriter, r *http.Request) { v := new(Gist) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, ` { "id": "1", "description": "Gist description", "public": false, "files": { "test.txt": { "filename": "test.txt" } } }`) }) ctx := context.Background() gist, _, err := client.Gists.Create(ctx, input) if err != nil { t.Errorf("Gists.Create returned error: %v", err) } want := &Gist{ ID: String("1"), Description: String("Gist description"), Public: Bool(false), Files: map[GistFilename]GistFile{ "test.txt": {Filename: String("test.txt")}, }, } if !cmp.Equal(gist, want) { t.Errorf("Gists.Create returned %+v, want %+v", gist, want) } const methodName = "Create" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.Create(ctx, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_Edit(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Gist{ Description: String("New description"), Files: map[GistFilename]GistFile{ "new.txt": {Content: String("new file content")}, }, } mux.HandleFunc("/gists/1", func(w http.ResponseWriter, r *http.Request) { v := new(Gist) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, ` { "id": "1", "description": "new description", "public": false, "files": { "test.txt": { "filename": "test.txt" }, "new.txt": { "filename": "new.txt" } } }`) }) ctx := context.Background() gist, _, err := client.Gists.Edit(ctx, "1", input) if err != nil { t.Errorf("Gists.Edit returned error: %v", err) } want := &Gist{ ID: String("1"), Description: String("new description"), Public: Bool(false), Files: map[GistFilename]GistFile{ "test.txt": {Filename: String("test.txt")}, "new.txt": {Filename: String("new.txt")}, }, } if !cmp.Equal(gist, want) { t.Errorf("Gists.Edit returned %+v, want %+v", gist, want) } const methodName = "Edit" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.Edit(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.Edit(ctx, "1", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_Edit_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Gists.Edit(ctx, "%", nil) testURLParseError(t, err) } func TestGistsService_ListCommits(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists/1/commits", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, nil) fmt.Fprint(w, ` [ { "url": "https://api.github.com/gists/1/1", "version": "1", "user": { "id": 1 }, "change_status": { "deletions": 0, "additions": 180, "total": 180 }, "committed_at": "2010-01-01T00:00:00Z" } ] `) }) ctx := context.Background() gistCommits, _, err := client.Gists.ListCommits(ctx, "1", nil) if err != nil { t.Errorf("Gists.ListCommits returned error: %v", err) } want := []*GistCommit{{ URL: String("https://api.github.com/gists/1/1"), Version: String("1"), User: &User{ID: Int64(1)}, CommittedAt: &Timestamp{time.Date(2010, time.January, 1, 00, 00, 00, 0, time.UTC)}, ChangeStatus: &CommitStats{ Additions: Int(180), Deletions: Int(0), Total: Int(180), }}} if !cmp.Equal(gistCommits, want) { t.Errorf("Gists.ListCommits returned %+v, want %+v", gistCommits, want) } const methodName = "ListCommits" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.ListCommits(ctx, "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.ListCommits(ctx, "1", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_ListCommits_withOptions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists/1/commits", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[]`) }) ctx := context.Background() _, _, err := client.Gists.ListCommits(ctx, "1", &ListOptions{Page: 2}) if err != nil { t.Errorf("Gists.ListCommits returned error: %v", err) } const methodName = "ListCommits" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.ListCommits(ctx, "\n", &ListOptions{Page: 2}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.ListCommits(ctx, "1", &ListOptions{Page: 2}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_ListCommits_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Gists.ListCommits(ctx, "%", nil) testURLParseError(t, err) } func TestGistsService_Delete(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Gists.Delete(ctx, "1") if err != nil { t.Errorf("Gists.Delete returned error: %v", err) } const methodName = "Delete" testBadOptions(t, methodName, func() (err error) { _, err = client.Gists.Delete(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Gists.Delete(ctx, "1") }) } func TestGistsService_Delete_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Gists.Delete(ctx, "%") testURLParseError(t, err) } func TestGistsService_Star(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists/1/star", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") }) ctx := context.Background() _, err := client.Gists.Star(ctx, "1") if err != nil { t.Errorf("Gists.Star returned error: %v", err) } const methodName = "Star" testBadOptions(t, methodName, func() (err error) { _, err = client.Gists.Star(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Gists.Star(ctx, "1") }) } func TestGistsService_Star_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Gists.Star(ctx, "%") testURLParseError(t, err) } func TestGistsService_Unstar(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists/1/star", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Gists.Unstar(ctx, "1") if err != nil { t.Errorf("Gists.Unstar returned error: %v", err) } const methodName = "Unstar" testBadOptions(t, methodName, func() (err error) { _, err = client.Gists.Unstar(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Gists.Unstar(ctx, "1") }) } func TestGistsService_Unstar_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Gists.Unstar(ctx, "%") testURLParseError(t, err) } func TestGistsService_IsStarred_hasStar(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists/1/star", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() star, _, err := client.Gists.IsStarred(ctx, "1") if err != nil { t.Errorf("Gists.Starred returned error: %v", err) } if want := true; star != want { t.Errorf("Gists.Starred returned %+v, want %+v", star, want) } const methodName = "IsStarred" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.IsStarred(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.IsStarred(ctx, "1") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) } return resp, err }) } func TestGistsService_IsStarred_noStar(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists/1/star", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() star, _, err := client.Gists.IsStarred(ctx, "1") if err != nil { t.Errorf("Gists.Starred returned error: %v", err) } if want := false; star != want { t.Errorf("Gists.Starred returned %+v, want %+v", star, want) } const methodName = "IsStarred" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.IsStarred(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.IsStarred(ctx, "1") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) } return resp, err }) } func TestGistsService_IsStarred_invalidID(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Gists.IsStarred(ctx, "%") testURLParseError(t, err) } func TestGistsService_Fork(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists/1/forks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"id": "2"}`) }) ctx := context.Background() gist, _, err := client.Gists.Fork(ctx, "1") if err != nil { t.Errorf("Gists.Fork returned error: %v", err) } want := &Gist{ID: String("2")} if !cmp.Equal(gist, want) { t.Errorf("Gists.Fork returned %+v, want %+v", gist, want) } const methodName = "Fork" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.Fork(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.Fork(ctx, "1") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_ListForks(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists/1/forks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, nil) fmt.Fprint(w, ` [ {"url": "https://api.github.com/gists/1", "user": {"id": 1}, "id": "1", "created_at": "2010-01-01T00:00:00Z", "updated_at": "2013-01-01T00:00:00Z" } ] `) }) ctx := context.Background() gistForks, _, err := client.Gists.ListForks(ctx, "1", nil) if err != nil { t.Errorf("Gists.ListForks returned error: %v", err) } want := []*GistFork{{ URL: String("https://api.github.com/gists/1"), ID: String("1"), User: &User{ID: Int64(1)}, CreatedAt: &Timestamp{time.Date(2010, time.January, 1, 00, 00, 00, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2013, time.January, 1, 00, 00, 00, 0, time.UTC)}}} if !cmp.Equal(gistForks, want) { t.Errorf("Gists.ListForks returned %+v, want %+v", gistForks, want) } const methodName = "ListForks" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.ListForks(ctx, "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.ListForks(ctx, "1", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistsService_ListForks_withOptions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gists/1/forks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[]`) }) ctx := context.Background() gistForks, _, err := client.Gists.ListForks(ctx, "1", &ListOptions{Page: 2}) if err != nil { t.Errorf("Gists.ListForks returned error: %v", err) } want := []*GistFork{} if !cmp.Equal(gistForks, want) { t.Errorf("Gists.ListForks returned %+v, want %+v", gistForks, want) } const methodName = "ListForks" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gists.ListForks(ctx, "\n", &ListOptions{Page: 2}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gists.ListForks(ctx, "1", &ListOptions{Page: 2}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGistFile_Marshal(t *testing.T) { testJSONMarshal(t, &GistFile{}, "{}") u := &GistFile{ Size: Int(1), Filename: String("fn"), Language: String("lan"), Type: String("type"), RawURL: String("rurl"), Content: String("con"), } want := `{ "size": 1, "filename": "fn", "language": "lan", "type": "type", "raw_url": "rurl", "content": "con" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/git.go000066400000000000000000000006111410475703100160640ustar00rootroot00000000000000// Copyright 2013 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 // GitService handles communication with the git data related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/git/ type GitService service go-github-38.1.0/github/git_blobs.go000066400000000000000000000042311410475703100172470ustar00rootroot00000000000000// Copyright 2013 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 ( "bytes" "context" "fmt" ) // Blob represents a blob object. type Blob struct { Content *string `json:"content,omitempty"` Encoding *string `json:"encoding,omitempty"` SHA *string `json:"sha,omitempty"` Size *int `json:"size,omitempty"` URL *string `json:"url,omitempty"` NodeID *string `json:"node_id,omitempty"` } // GetBlob fetches a blob from a repo given a SHA. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/git/#get-a-blob func (s *GitService) GetBlob(ctx context.Context, owner string, repo string, sha string) (*Blob, *Response, error) { u := fmt.Sprintf("repos/%v/%v/git/blobs/%v", owner, repo, sha) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } blob := new(Blob) resp, err := s.client.Do(ctx, req, blob) return blob, resp, err } // GetBlobRaw fetches a blob's contents from a repo. // Unlike GetBlob, it returns the raw bytes rather than the base64-encoded data. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/git/#get-a-blob func (s *GitService) GetBlobRaw(ctx context.Context, owner, repo, sha string) ([]byte, *Response, error) { u := fmt.Sprintf("repos/%v/%v/git/blobs/%v", owner, repo, sha) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } req.Header.Set("Accept", "application/vnd.github.v3.raw") var buf bytes.Buffer resp, err := s.client.Do(ctx, req, &buf) return buf.Bytes(), resp, err } // CreateBlob creates a blob object. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/git/#create-a-blob func (s *GitService) CreateBlob(ctx context.Context, owner string, repo string, blob *Blob) (*Blob, *Response, error) { u := fmt.Sprintf("repos/%v/%v/git/blobs", owner, repo) req, err := s.client.NewRequest("POST", u, blob) if err != nil { return nil, nil, err } t := new(Blob) resp, err := s.client.Do(ctx, req, t) return t, resp, err } go-github-38.1.0/github/git_blobs_test.go000066400000000000000000000077511410475703100203200ustar00rootroot00000000000000// 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 ( "bytes" "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestGitService_GetBlob(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/git/blobs/s", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "sha": "s", "content": "blob content" }`) }) ctx := context.Background() blob, _, err := client.Git.GetBlob(ctx, "o", "r", "s") if err != nil { t.Errorf("Git.GetBlob returned error: %v", err) } want := Blob{ SHA: String("s"), Content: String("blob content"), } if !cmp.Equal(*blob, want) { t.Errorf("Blob.Get returned %+v, want %+v", *blob, want) } const methodName = "GetBlob" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.GetBlob(ctx, "\n", "\n", "\n") return err }) } func TestGitService_GetBlob_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Git.GetBlob(ctx, "%", "%", "%") testURLParseError(t, err) } func TestGitService_GetBlobRaw(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/git/blobs/s", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", "application/vnd.github.v3.raw") fmt.Fprint(w, `raw contents here`) }) ctx := context.Background() blob, _, err := client.Git.GetBlobRaw(ctx, "o", "r", "s") if err != nil { t.Errorf("Git.GetBlobRaw returned error: %v", err) } want := []byte("raw contents here") if !bytes.Equal(blob, want) { t.Errorf("GetBlobRaw returned %q, want %q", blob, want) } const methodName = "GetBlobRaw" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.GetBlobRaw(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.GetBlobRaw(ctx, "o", "r", "s") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_CreateBlob(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Blob{ SHA: String("s"), Content: String("blob content"), Encoding: String("utf-8"), Size: Int(12), } mux.HandleFunc("/repos/o/r/git/blobs", func(w http.ResponseWriter, r *http.Request) { v := new(Blob) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") want := input if !cmp.Equal(v, want) { t.Errorf("Git.CreateBlob request body: %+v, want %+v", v, want) } fmt.Fprint(w, `{ "sha": "s", "content": "blob content", "encoding": "utf-8", "size": 12 }`) }) ctx := context.Background() blob, _, err := client.Git.CreateBlob(ctx, "o", "r", input) if err != nil { t.Errorf("Git.CreateBlob returned error: %v", err) } want := input if !cmp.Equal(*blob, *want) { t.Errorf("Git.CreateBlob returned %+v, want %+v", *blob, *want) } const methodName = "CreateBlob" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.CreateBlob(ctx, "\n", "\n", input) return err }) } func TestGitService_CreateBlob_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Git.CreateBlob(ctx, "%", "%", &Blob{}) testURLParseError(t, err) } func TestBlob_Marshal(t *testing.T) { testJSONMarshal(t, &Blob{}, "{}") u := &Blob{ Content: String("content"), Encoding: String("encoding"), SHA: String("sha"), Size: Int(1), URL: String("url"), NodeID: String("nid"), } want := `{ "content": "content", "encoding": "encoding", "sha": "sha", "size": 1, "url": "url", "node_id": "nid" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/git_commits.go000066400000000000000000000143401410475703100176230ustar00rootroot00000000000000// Copyright 2013 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 ( "bytes" "context" "errors" "fmt" "strings" "time" "golang.org/x/crypto/openpgp" ) // SignatureVerification represents GPG signature verification. type SignatureVerification struct { Verified *bool `json:"verified,omitempty"` Reason *string `json:"reason,omitempty"` Signature *string `json:"signature,omitempty"` Payload *string `json:"payload,omitempty"` } // Commit represents a GitHub commit. type Commit struct { SHA *string `json:"sha,omitempty"` Author *CommitAuthor `json:"author,omitempty"` Committer *CommitAuthor `json:"committer,omitempty"` Message *string `json:"message,omitempty"` Tree *Tree `json:"tree,omitempty"` Parents []*Commit `json:"parents,omitempty"` Stats *CommitStats `json:"stats,omitempty"` HTMLURL *string `json:"html_url,omitempty"` URL *string `json:"url,omitempty"` Verification *SignatureVerification `json:"verification,omitempty"` NodeID *string `json:"node_id,omitempty"` // CommentCount is the number of GitHub comments on the commit. This // is only populated for requests that fetch GitHub data like // Pulls.ListCommits, Repositories.ListCommits, etc. CommentCount *int `json:"comment_count,omitempty"` // SigningKey denotes a key to sign the commit with. If not nil this key will // be used to sign the commit. The private key must be present and already // decrypted. Ignored if Verification.Signature is defined. SigningKey *openpgp.Entity `json:"-"` } func (c Commit) String() string { return Stringify(c) } // CommitAuthor represents the author or committer of a commit. The commit // author may not correspond to a GitHub User. type CommitAuthor struct { Date *time.Time `json:"date,omitempty"` Name *string `json:"name,omitempty"` Email *string `json:"email,omitempty"` // The following fields are only populated by Webhook events. Login *string `json:"username,omitempty"` // Renamed for go-github consistency. } func (c CommitAuthor) String() string { return Stringify(c) } // GetCommit fetches the Commit object for a given SHA. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/git/#get-a-commit func (s *GitService) GetCommit(ctx context.Context, owner string, repo string, sha string) (*Commit, *Response, error) { u := fmt.Sprintf("repos/%v/%v/git/commits/%v", owner, repo, sha) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } c := new(Commit) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } // createCommit represents the body of a CreateCommit request. type createCommit struct { Author *CommitAuthor `json:"author,omitempty"` Committer *CommitAuthor `json:"committer,omitempty"` Message *string `json:"message,omitempty"` Tree *string `json:"tree,omitempty"` Parents []string `json:"parents,omitempty"` Signature *string `json:"signature,omitempty"` } // CreateCommit creates a new commit in a repository. // commit must not be nil. // // The commit.Committer is optional and will be filled with the commit.Author // data if omitted. If the commit.Author is omitted, it will be filled in with // the authenticated user’s information and the current date. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/git/#create-a-commit func (s *GitService) CreateCommit(ctx context.Context, owner string, repo string, commit *Commit) (*Commit, *Response, error) { if commit == nil { return nil, nil, fmt.Errorf("commit must be provided") } u := fmt.Sprintf("repos/%v/%v/git/commits", owner, repo) parents := make([]string, len(commit.Parents)) for i, parent := range commit.Parents { parents[i] = *parent.SHA } body := &createCommit{ Author: commit.Author, Committer: commit.Committer, Message: commit.Message, Parents: parents, } if commit.Tree != nil { body.Tree = commit.Tree.SHA } if commit.SigningKey != nil { signature, err := createSignature(commit.SigningKey, body) if err != nil { return nil, nil, err } body.Signature = &signature } if commit.Verification != nil { body.Signature = commit.Verification.Signature } req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } c := new(Commit) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } func createSignature(signingKey *openpgp.Entity, commit *createCommit) (string, error) { if signingKey == nil || commit == nil { return "", errors.New("createSignature: invalid parameters") } message, err := createSignatureMessage(commit) if err != nil { return "", err } writer := new(bytes.Buffer) reader := bytes.NewReader([]byte(message)) if err := openpgp.ArmoredDetachSign(writer, signingKey, reader, nil); err != nil { return "", err } return writer.String(), nil } func createSignatureMessage(commit *createCommit) (string, error) { if commit == nil || commit.Message == nil || *commit.Message == "" || commit.Author == nil { return "", errors.New("createSignatureMessage: invalid parameters") } var message []string if commit.Tree != nil { message = append(message, fmt.Sprintf("tree %s", *commit.Tree)) } for _, parent := range commit.Parents { message = append(message, fmt.Sprintf("parent %s", parent)) } message = append(message, fmt.Sprintf("author %s <%s> %d %s", commit.Author.GetName(), commit.Author.GetEmail(), commit.Author.GetDate().Unix(), commit.Author.GetDate().Format("-0700"))) committer := commit.Committer if committer == nil { committer = commit.Author } // There needs to be a double newline after committer message = append(message, fmt.Sprintf("committer %s <%s> %d %s\n", committer.GetName(), committer.GetEmail(), committer.GetDate().Unix(), committer.GetDate().Format("-0700"))) message = append(message, *commit.Message) return strings.Join(message, "\n"), nil } go-github-38.1.0/github/git_commits_test.go000066400000000000000000000444001410475703100206620ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "strings" "testing" "time" "github.com/google/go-cmp/cmp" "golang.org/x/crypto/openpgp" ) func TestCommit_Marshal(t *testing.T) { testJSONMarshal(t, &Commit{}, "{}") u := &Commit{ SHA: String("s"), Author: &CommitAuthor{ Date: &referenceTime, Name: String("n"), Email: String("e"), Login: String("u"), }, Committer: &CommitAuthor{ Date: &referenceTime, Name: String("n"), Email: String("e"), Login: String("u"), }, Message: String("m"), Tree: &Tree{ SHA: String("s"), Entries: []*TreeEntry{{ SHA: String("s"), Path: String("p"), Mode: String("m"), Type: String("t"), Size: Int(1), Content: String("c"), URL: String("u"), }}, Truncated: Bool(false), }, Parents: nil, Stats: &CommitStats{ Additions: Int(1), Deletions: Int(1), Total: Int(1), }, HTMLURL: String("h"), URL: String("u"), Verification: &SignatureVerification{ Verified: Bool(false), Reason: String("r"), Signature: String("s"), Payload: String("p"), }, NodeID: String("n"), CommentCount: Int(1), SigningKey: &openpgp.Entity{}, } want := `{ "sha": "s", "author": { "date": ` + referenceTimeStr + `, "name": "n", "email": "e", "username": "u" }, "committer": { "date": ` + referenceTimeStr + `, "name": "n", "email": "e", "username": "u" }, "message": "m", "tree": { "sha": "s", "tree": [ { "sha": "s", "path": "p", "mode": "m", "type": "t", "size": 1, "content": "c", "url": "u" } ], "truncated": false }, "stats": { "additions": 1, "deletions": 1, "total": 1 }, "html_url": "h", "url": "u", "verification": { "verified": false, "reason": "r", "signature": "s", "payload": "p" }, "node_id": "n", "comment_count": 1 }` testJSONMarshal(t, u, want) } func TestGitService_GetCommit(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/git/commits/s", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"sha":"s","message":"Commit Message.","author":{"name":"n"}}`) }) ctx := context.Background() commit, _, err := client.Git.GetCommit(ctx, "o", "r", "s") if err != nil { t.Errorf("Git.GetCommit returned error: %v", err) } want := &Commit{SHA: String("s"), Message: String("Commit Message."), Author: &CommitAuthor{Name: String("n")}} if !cmp.Equal(commit, want) { t.Errorf("Git.GetCommit returned %+v, want %+v", commit, want) } const methodName = "GetCommit" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.GetCommit(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.GetCommit(ctx, "o", "r", "s") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_GetCommit_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Git.GetCommit(ctx, "%", "%", "%") testURLParseError(t, err) } func TestGitService_CreateCommit(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Commit{ Message: String("Commit Message."), Tree: &Tree{SHA: String("t")}, Parents: []*Commit{{SHA: String("p")}}, } mux.HandleFunc("/repos/o/r/git/commits", func(w http.ResponseWriter, r *http.Request) { v := new(createCommit) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") want := &createCommit{ Message: input.Message, Tree: String("t"), Parents: []string{"p"}, } if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"sha":"s"}`) }) ctx := context.Background() commit, _, err := client.Git.CreateCommit(ctx, "o", "r", input) if err != nil { t.Errorf("Git.CreateCommit returned error: %v", err) } want := &Commit{SHA: String("s")} if !cmp.Equal(commit, want) { t.Errorf("Git.CreateCommit returned %+v, want %+v", commit, want) } const methodName = "CreateCommit" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.CreateCommit(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.CreateCommit(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_CreateSignedCommit(t *testing.T) { client, mux, _, teardown := setup() defer teardown() signature := "----- BEGIN PGP SIGNATURE -----\n\naaaa\naaaa\n----- END PGP SIGNATURE -----" input := &Commit{ Message: String("Commit Message."), Tree: &Tree{SHA: String("t")}, Parents: []*Commit{{SHA: String("p")}}, Verification: &SignatureVerification{ Signature: String(signature), }, } mux.HandleFunc("/repos/o/r/git/commits", func(w http.ResponseWriter, r *http.Request) { v := new(createCommit) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") want := &createCommit{ Message: input.Message, Tree: String("t"), Parents: []string{"p"}, Signature: String(signature), } if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"sha":"commitSha"}`) }) ctx := context.Background() commit, _, err := client.Git.CreateCommit(ctx, "o", "r", input) if err != nil { t.Errorf("Git.CreateCommit returned error: %v", err) } want := &Commit{SHA: String("commitSha")} if !cmp.Equal(commit, want) { t.Errorf("Git.CreateCommit returned %+v, want %+v", commit, want) } const methodName = "CreateCommit" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.CreateCommit(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.CreateCommit(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_CreateSignedCommitWithInvalidParams(t *testing.T) { client, _, _, teardown := setup() defer teardown() input := &Commit{ SigningKey: &openpgp.Entity{}, } ctx := context.Background() _, _, err := client.Git.CreateCommit(ctx, "o", "r", input) if err == nil { t.Errorf("Expected error to be returned because invalid params was passed") } } func TestGitService_CreateSignedCommitWithKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() s := strings.NewReader(testGPGKey) keyring, err := openpgp.ReadArmoredKeyRing(s) if err != nil { t.Errorf("Error reading keyring: %+v", err) } date, _ := time.Parse("Mon Jan 02 15:04:05 2006 -0700", "Thu May 04 00:03:43 2017 +0200") author := CommitAuthor{ Name: String("go-github"), Email: String("go-github@github.com"), Date: &date, } input := &Commit{ Message: String("Commit Message."), Tree: &Tree{SHA: String("t")}, Parents: []*Commit{{SHA: String("p")}}, SigningKey: keyring[0], Author: &author, } messageReader := strings.NewReader(`tree t parent p author go-github 1493849023 +0200 committer go-github 1493849023 +0200 Commit Message.`) mux.HandleFunc("/repos/o/r/git/commits", func(w http.ResponseWriter, r *http.Request) { v := new(createCommit) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") want := &createCommit{ Message: input.Message, Tree: String("t"), Parents: []string{"p"}, Author: &author, } sigReader := strings.NewReader(*v.Signature) signer, err := openpgp.CheckArmoredDetachedSignature(keyring, messageReader, sigReader) if err != nil { t.Errorf("Error verifying signature: %+v", err) } if signer.Identities["go-github "].Name != "go-github " { t.Errorf("Signer is incorrect. got: %+v, want %+v", signer.Identities["go-github "].Name, "go-github ") } // Nullify Signature since we checked it above v.Signature = nil if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"sha":"commitSha"}`) }) ctx := context.Background() commit, _, err := client.Git.CreateCommit(ctx, "o", "r", input) if err != nil { t.Errorf("Git.CreateCommit returned error: %v", err) } want := &Commit{SHA: String("commitSha")} if !cmp.Equal(commit, want) { t.Errorf("Git.CreateCommit returned %+v, want %+v", commit, want) } } func TestGitService_createSignature_nilSigningKey(t *testing.T) { a := &createCommit{ Message: String("Commit Message."), Tree: String("t"), Parents: []string{"p"}, } _, err := createSignature(nil, a) if err == nil { t.Errorf("Expected error to be returned because no author was passed") } } func TestGitService_createSignature_nilCommit(t *testing.T) { _, err := createSignature(&openpgp.Entity{}, nil) if err == nil { t.Errorf("Expected error to be returned because no author was passed") } } func TestGitService_createSignature_noAuthor(t *testing.T) { a := &createCommit{ Message: String("Commit Message."), Tree: String("t"), Parents: []string{"p"}, } _, err := createSignature(&openpgp.Entity{}, a) if err == nil { t.Errorf("Expected error to be returned because no author was passed") } } func TestGitService_createSignature_invalidKey(t *testing.T) { date, _ := time.Parse("Mon Jan 02 15:04:05 2006 -0700", "Thu May 04 00:03:43 2017 +0200") _, err := createSignature(&openpgp.Entity{}, &createCommit{ Message: String("Commit Message."), Tree: String("t"), Parents: []string{"p"}, Author: &CommitAuthor{ Name: String("go-github"), Email: String("go-github@github.com"), Date: &date, }, }) if err == nil { t.Errorf("Expected error to be returned due to invalid key") } } func TestGitService_createSignatureMessage_nilCommit(t *testing.T) { _, err := createSignatureMessage(nil) if err == nil { t.Errorf("Expected error to be returned due to nil key") } } func TestGitService_createSignatureMessage_nilMessage(t *testing.T) { date, _ := time.Parse("Mon Jan 02 15:04:05 2006 -0700", "Thu May 04 00:03:43 2017 +0200") _, err := createSignatureMessage(&createCommit{ Message: nil, Parents: []string{"p"}, Author: &CommitAuthor{ Name: String("go-github"), Email: String("go-github@github.com"), Date: &date, }, }) if err == nil { t.Errorf("Expected error to be returned due to nil key") } } func TestGitService_createSignatureMessage_emptyMessage(t *testing.T) { date, _ := time.Parse("Mon Jan 02 15:04:05 2006 -0700", "Thu May 04 00:03:43 2017 +0200") emptyString := "" _, err := createSignatureMessage(&createCommit{ Message: &emptyString, Parents: []string{"p"}, Author: &CommitAuthor{ Name: String("go-github"), Email: String("go-github@github.com"), Date: &date, }, }) if err == nil { t.Errorf("Expected error to be returned due to nil key") } } func TestGitService_createSignatureMessage_nilAuthor(t *testing.T) { _, err := createSignatureMessage(&createCommit{ Message: String("Commit Message."), Parents: []string{"p"}, Author: nil, }) if err == nil { t.Errorf("Expected error to be returned due to nil key") } } func TestGitService_createSignatureMessage_withoutTree(t *testing.T) { date, _ := time.Parse("Mon Jan 02 15:04:05 2006 -0700", "Thu May 04 00:03:43 2017 +0200") msg, _ := createSignatureMessage(&createCommit{ Message: String("Commit Message."), Parents: []string{"p"}, Author: &CommitAuthor{ Name: String("go-github"), Email: String("go-github@github.com"), Date: &date, }, }) expected := `parent p author go-github 1493849023 +0200 committer go-github 1493849023 +0200 Commit Message.` if msg != expected { t.Errorf("Returned message incorrect. returned %s, want %s", msg, expected) } } func TestGitService_createSignatureMessage_withoutCommitter(t *testing.T) { date, _ := time.Parse("Mon Jan 02 15:04:05 2006 -0700", "Thu May 04 00:03:43 2017 +0200") msg, _ := createSignatureMessage(&createCommit{ Message: String("Commit Message."), Parents: []string{"p"}, Author: &CommitAuthor{ Name: String("go-github"), Email: String("go-github@github.com"), Date: &date, }, Committer: &CommitAuthor{ Name: String("foo"), Email: String("foo@bar.com"), Date: &date, }, }) expected := `parent p author go-github 1493849023 +0200 committer foo 1493849023 +0200 Commit Message.` if msg != expected { t.Errorf("Returned message incorrect. returned %s, want %s", msg, expected) } } func TestGitService_CreateCommit_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Git.CreateCommit(ctx, "%", "%", &Commit{}) testURLParseError(t, err) } const testGPGKey = ` -----BEGIN PGP PRIVATE KEY BLOCK----- lQOYBFyi1qYBCAD3EPfLJzIt4qkAceUKkhdvfaIvOsBwXbfr5sSu/lkMqL0Wq47+ iv+SRwOC7zvN8SlB8nPUgs5dbTRCJJfG5MAqTRR7KZRbyq2jBpi4BtmO30Ul/qId 3A18cVUfgVbxH85K9bdnyOxep/Q2NjLjTKmWLkzgmgkfbUmSLuWW9HRXPjYy9B7i dOFD6GdkN/HwPAaId8ym0TE1mIuSpw8UQHyxusAkK52Pn4h/PgJhLTzbSi1X2eDt OgzjhbdxTPzKFQfs97dY8y9C7Bt+CqH6Bvr3785LeKdxiUnCjfUJ+WAoJy780ec+ IVwSpPp1CaEtzu73w6GH5945GELHE8HRe25FABEBAAEAB/9dtx72/VAoXZCTbaBe iRnAnZwWZCe4t6PbJHa4lhv7FEpdPggIf3r/5lXrpYk+zdpDfI75LgDPKWwoJq83 r29A3GoHabcvtkp0yzzEmTyO2BvnlJWz09N9v5N1Vt8+qTzb7CZ8hJc8NGMK6TYW R+8P21In4+XP+OluPMGzp9g1etHScLhQUtF/xcN3JQGkeq4CPX6jUSYlJNeEtuLm xjBTLBdg8zK5mJ3tolvnS/VhSTdiBeUaYtVt/qxq+fPqdFGHrO5H9ORbt56ahU+f Ne86sOjQfJZPsx9z8ffP+XhLZPT1ZUGJMI/Vysx9gwDiEnaxrCJ02fO0Dnqsj/o2 T14lBAD55+KtaS0C0OpHpA/F+XhL3IDcYQOYgu8idBTshr4vv7M+jdZqpECOn72Q 8SZJ+gYMcA9Z07Afnin1DVdtxiMN/tbyOu7e1BE7y77eA+zQw4PjLJPZJMbco7z+ q9ZnZF3GyRyil6HkKUTfrao8AMtb0allZnqXwpPb5Mza32VqtwQA/RdbG6OIS6og OpP7zKu4GP4guBk8NrVpVuV5Xz4r8JlL+POt0TadlT93coW/SajLrN/eeUwk6jQw wrabmIGMarG5mrC4tnXLze5LICJTpOuqCACyFwL6w/ag+c7Qt9t9hvLMDFifcZW/ mylqY7Z1eVcnbOcFsQG+0LzJBU0qouMEAKkXmJcQ3lJM8yoJuYOvbwexVR+5Y+5v FNEGPlp3H/fq6ETYWHjMxPOE5dvGbQL8oKWZgkkHEGAKAavEGebM/y/qIPOCAluT tn1sfx//n6kTMhswpg/3+BciUaJFjwYbIwUH5XD0vFbe9O2VOfTVdo1p19wegVs5 LMf8rWFWYXtqUgG0IGdvLWdpdGh1YiA8Z28tZ2l0aHViQGdpdGh1Yi5jb20+iQFU BBMBCAA+FiEELZ6AMqOpBMVblK0uiKTQXVy+MAsFAlyi1qYCGwMFCQPCZwAFCwkI BwIGFQoJCAsCBBYCAwECHgECF4AACgkQiKTQXVy+MAtEYggA0LRecz71HUjEKXJj C5Wgds1hZ0q+g3ew7zms4fuascd/2PqT5lItHU3oezdzMOHetSPvPzJILjl7RYcY pWvoyzEBC5MutlmuzfwUa7qYCiuRDkYRjke8a4o8ijsxc8ANXwulXcI3udjAZdV0 CKjrjPTyrHFUnPyZyaZp8p2eX62iPYhaXkoBnEiarf0xKtJuT/8IlP5n/redlKYz GIHG5Svg3uDq9E09BOjFsgemhPyqbf7yrh5aRwDOIdHtn9mNevFPfQ1jO8lI/wbe 4kC6zXM7te0/ZkM06DYRhcaeoYdeyY/gvE+w7wU/+f7Wzqt+LxOMIjKk0oDxZIv9 praEM50DmARcotamAQgAsiO75WZvjt7BEAzdTvWekWXqBo4NOes2UgzSYToVs6xW 8iXnE+mpDS7GHtNQLU6oeC0vizUjCwBfU+qGqw1JjI3I1pwv7xRqBIlA6f5ancVK KiMx+/HxasbBrbav8DmZT8E8VaJhYM614Kav91W8YoqK5YXmP/A+OwwhkVEGo8v3 Iy7mnJPMSjNiNTpiDgc5wvRiTan+uf+AtNPUS0k0fbrTZWosbrSmBymhrEy8stMj rG2wZX5aRY7AXrQXoIXedqvP3kW/nqd0wvuiD11ZZWvoawjZRRVsT27DED0x2+o6 aAEKrSLj8LlWvGVkD/jP9lSkC81uwGgD5VIMeXv6EQARAQABAAf7BHef8SdJ+ee9 KLVh4WaIdPX80fBDBaZP5OvcZMLLo4dZYNYxfs7XxfRb1I8RDinQUL81V4TcHZ0D Rvv1J5n8M7GkjTk6fIDjDb0RayzNQfKeIwNh8AMHvllApyYTMG+JWDYs2KrrTT2x 0vHrLMUyJbh6tjnO5eCU9u8dcmL5Syc6DzGUvDl6ZdJxlHEEJOwMlVCwQn5LQDVI t0KEXigqs7eDCpTduJeAI7oA96s/8LwdlG5t6q9vbkEjl1XpR5FfKvJcZbd7Kmk9 6R0EdbH6Ffe8qAp8lGmjx+91gqeL7jyl500H4gK/ybzlxQczIsbQ7WcZTPEnROIX tCFWh6puvwQAyV6ygcatz+1BfCfgxWNYFXyowwOGSP9Nma+/aDVdeRCjZ69Is0lz GV0NNqh7hpaoVbXS9Vc3sFOwBr5ZyKQaf07BoCDW+XJtvPyyZNLb004smtB5uHCf uWDBpQ9erlrpSkOLgifbzfkYHdSvhc2ws9Tgab7Mk7P/ExOZjnUJPOcEAOJ3q/2/ 0wqRnkSelgkWwUmZ+hFIBz6lgWS3KTJs6Qc5WBnXono+EOoqhFxsiRM4lewExxHM kPIcxb+0hiNz8hJkWOHEdgkXNim9Q08J0HPz6owtlD/rtmOi2+7d5BukbY/3JEXs r2bjqbXXIE7heytIn/dQv7aEDyDqexiJKnpHBACQItjuYlewLt94NMNdGcwxmKdJ bfaoIQz1h8fX5uSGKU+hXatI6sltD9PrhwwhdqJNcQ0K1dRkm24olO4I/sJwactI G3r1UTq6BMV94eIyS/zZH5xChlOUavy9PrgU3kAK21bdmAFuNwbHnN34BBUk9J6f IIxEZUOxw2CrKhsubUOuiQE8BBgBCAAmFiEELZ6AMqOpBMVblK0uiKTQXVy+MAsF Alyi1qYCGwwFCQPCZwAACgkQiKTQXVy+MAstJAf/Tm2hfagVjzgJ5pFHmpP+fYxp 8dIPZLonP5HW12iaSOXThtvWBY578Cb9RmU+WkHyPXg8SyshW7aco4HrUDk+Qmyi f9BvHS5RsLbyPlhgCqNkn+3QS62fZiIlbHLrQ/6iHXkgLV04Fnj+F4v8YYpOI9nY NFc5iWm0zZRcLiRKZk1up8SCngyolcjVuTuCXDKyAUX1jRqDu7tlN0qVH0CYDGch BqTKXNkzAvV+CKOyaUILSBBWdef+cxVrDCJuuC3894x3G1FjJycOy0m9PArvGtSG g7/0Bp9oLXwiHzFoUMDvx+WlPnPHQNcufmQXUNdZvg+Ad4/unEU81EGDBDz3Eg== =VFSn -----END PGP PRIVATE KEY BLOCK-----` func TestSignatureVerification_Marshal(t *testing.T) { testJSONMarshal(t, &SignatureVerification{}, "{}") u := &SignatureVerification{ Verified: Bool(true), Reason: String("reason"), Signature: String("sign"), Payload: String("payload"), } want := `{ "verified": true, "reason": "reason", "signature": "sign", "payload": "payload" }` testJSONMarshal(t, u, want) } func TestCommitAuthor_Marshal(t *testing.T) { testJSONMarshal(t, &CommitAuthor{}, "{}") u := &CommitAuthor{ Date: &referenceTime, Name: String("name"), Email: String("email"), Login: String("login"), } want := `{ "date": ` + referenceTimeStr + `, "name": "name", "email": "email", "username": "login" }` testJSONMarshal(t, u, want) } func TestCreateCommit_Marshal(t *testing.T) { testJSONMarshal(t, &createCommit{}, "{}") u := &createCommit{ Author: &CommitAuthor{ Date: &referenceTime, Name: String("name"), Email: String("email"), Login: String("login"), }, Committer: &CommitAuthor{ Date: &referenceTime, Name: String("name"), Email: String("email"), Login: String("login"), }, Message: String("message"), Tree: String("tree"), Parents: []string{"p"}, Signature: String("sign"), } want := `{ "author": { "date": ` + referenceTimeStr + `, "name": "name", "email": "email", "username": "login" }, "committer": { "date": ` + referenceTimeStr + `, "name": "name", "email": "email", "username": "login" }, "message": "message", "tree": "tree", "parents": [ "p" ], "signature": "sign" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/git_refs.go000066400000000000000000000115341410475703100171110ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "net/url" "strings" ) // Reference represents a GitHub reference. type Reference struct { Ref *string `json:"ref"` URL *string `json:"url"` Object *GitObject `json:"object"` NodeID *string `json:"node_id,omitempty"` } func (r Reference) String() string { return Stringify(r) } // GitObject represents a Git object. type GitObject struct { Type *string `json:"type"` SHA *string `json:"sha"` URL *string `json:"url"` } func (o GitObject) String() string { return Stringify(o) } // createRefRequest represents the payload for creating a reference. type createRefRequest struct { Ref *string `json:"ref"` SHA *string `json:"sha"` } // updateRefRequest represents the payload for updating a reference. type updateRefRequest struct { SHA *string `json:"sha"` Force *bool `json:"force"` } // GetRef fetches a single reference in a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/git/#get-a-reference func (s *GitService) GetRef(ctx context.Context, owner string, repo string, ref string) (*Reference, *Response, error) { ref = strings.TrimPrefix(ref, "refs/") u := fmt.Sprintf("repos/%v/%v/git/ref/%v", owner, repo, refURLEscape(ref)) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } r := new(Reference) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // refURLEscape escapes every path segment of the given ref. Those must // not contain escaped "/" - as "%2F" - or github will not recognize it. func refURLEscape(ref string) string { parts := strings.Split(ref, "/") for i, s := range parts { parts[i] = url.PathEscape(s) } return strings.Join(parts, "/") } // ReferenceListOptions specifies optional parameters to the // GitService.ListMatchingRefs method. type ReferenceListOptions struct { Ref string `url:"-"` ListOptions } // ListMatchingRefs lists references in a repository that match a supplied ref. // Use an empty ref to list all references. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/git/#list-matching-references func (s *GitService) ListMatchingRefs(ctx context.Context, owner, repo string, opts *ReferenceListOptions) ([]*Reference, *Response, error) { var ref string if opts != nil { ref = strings.TrimPrefix(opts.Ref, "refs/") } u := fmt.Sprintf("repos/%v/%v/git/matching-refs/%v", owner, repo, refURLEscape(ref)) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var rs []*Reference resp, err := s.client.Do(ctx, req, &rs) if err != nil { return nil, resp, err } return rs, resp, nil } // CreateRef creates a new ref in a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/git/#create-a-reference func (s *GitService) CreateRef(ctx context.Context, owner string, repo string, ref *Reference) (*Reference, *Response, error) { u := fmt.Sprintf("repos/%v/%v/git/refs", owner, repo) req, err := s.client.NewRequest("POST", u, &createRefRequest{ // back-compat with previous behavior that didn't require 'refs/' prefix Ref: String("refs/" + strings.TrimPrefix(*ref.Ref, "refs/")), SHA: ref.Object.SHA, }) if err != nil { return nil, nil, err } r := new(Reference) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // UpdateRef updates an existing ref in a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/git/#update-a-reference func (s *GitService) UpdateRef(ctx context.Context, owner string, repo string, ref *Reference, force bool) (*Reference, *Response, error) { refPath := strings.TrimPrefix(*ref.Ref, "refs/") u := fmt.Sprintf("repos/%v/%v/git/refs/%v", owner, repo, refPath) req, err := s.client.NewRequest("PATCH", u, &updateRefRequest{ SHA: ref.Object.SHA, Force: &force, }) if err != nil { return nil, nil, err } r := new(Reference) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // DeleteRef deletes a ref from a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/git/#delete-a-reference func (s *GitService) DeleteRef(ctx context.Context, owner string, repo string, ref string) (*Response, error) { ref = strings.TrimPrefix(ref, "refs/") u := fmt.Sprintf("repos/%v/%v/git/refs/%v", owner, repo, refURLEscape(ref)) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/git_refs_test.go000066400000000000000000000475161410475703100201610ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "strings" "testing" "github.com/google/go-cmp/cmp" ) func TestGitService_GetRef_singleRef(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/git/ref/heads/b", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, ` { "ref": "refs/heads/b", "url": "https://api.github.com/repos/o/r/git/refs/heads/b", "object": { "type": "commit", "sha": "aa218f56b14c9653891f9e74264a383fa43fefbd", "url": "https://api.github.com/repos/o/r/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd" } }`) }) ctx := context.Background() ref, _, err := client.Git.GetRef(ctx, "o", "r", "refs/heads/b") if err != nil { t.Fatalf("Git.GetRef returned error: %v", err) } want := &Reference{ Ref: String("refs/heads/b"), URL: String("https://api.github.com/repos/o/r/git/refs/heads/b"), Object: &GitObject{ Type: String("commit"), SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd"), URL: String("https://api.github.com/repos/o/r/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd"), }, } if !cmp.Equal(ref, want) { t.Errorf("Git.GetRef returned %+v, want %+v", ref, want) } // without 'refs/' prefix if _, _, err := client.Git.GetRef(ctx, "o", "r", "heads/b"); err != nil { t.Errorf("Git.GetRef returned error: %v", err) } const methodName = "GetRef" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.GetRef(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.GetRef(ctx, "o", "r", "refs/heads/b") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_GetRef_noRefs(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/git/refs/heads/b", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() ref, resp, err := client.Git.GetRef(ctx, "o", "r", "refs/heads/b") if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Git.GetRef returned status %d, want %d", got, want) } if ref != nil { t.Errorf("Git.GetRef return %+v, want nil", ref) } const methodName = "GetRef" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.GetRef(ctx, "o", "r", "refs/heads/b") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.GetRef(ctx, "o", "r", "refs/heads/b") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_ListMatchingRefs_singleRef(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/git/matching-refs/heads/b", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, ` [ { "ref": "refs/heads/b", "url": "https://api.github.com/repos/o/r/git/refs/heads/b", "object": { "type": "commit", "sha": "aa218f56b14c9653891f9e74264a383fa43fefbd", "url": "https://api.github.com/repos/o/r/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd" } } ]`) }) opts := &ReferenceListOptions{Ref: "refs/heads/b"} ctx := context.Background() refs, _, err := client.Git.ListMatchingRefs(ctx, "o", "r", opts) if err != nil { t.Fatalf("Git.ListMatchingRefs returned error: %v", err) } ref := refs[0] want := &Reference{ Ref: String("refs/heads/b"), URL: String("https://api.github.com/repos/o/r/git/refs/heads/b"), Object: &GitObject{ Type: String("commit"), SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd"), URL: String("https://api.github.com/repos/o/r/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd"), }, } if !cmp.Equal(ref, want) { t.Errorf("Git.ListMatchingRefs returned %+v, want %+v", ref, want) } // without 'refs/' prefix opts = &ReferenceListOptions{Ref: "heads/b"} if _, _, err := client.Git.ListMatchingRefs(ctx, "o", "r", opts); err != nil { t.Errorf("Git.ListMatchingRefs returned error: %v", err) } const methodName = "ListMatchingRefs" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.ListMatchingRefs(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.ListMatchingRefs(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_ListMatchingRefs_multipleRefs(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/git/matching-refs/heads/b", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, ` [ { "ref": "refs/heads/booger", "url": "https://api.github.com/repos/o/r/git/refs/heads/booger", "object": { "type": "commit", "sha": "aa218f56b14c9653891f9e74264a383fa43fefbd", "url": "https://api.github.com/repos/o/r/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd" } }, { "ref": "refs/heads/bandsaw", "url": "https://api.github.com/repos/o/r/git/refs/heads/bandsaw", "object": { "type": "commit", "sha": "612077ae6dffb4d2fbd8ce0cccaa58893b07b5ac", "url": "https://api.github.com/repos/o/r/git/commits/612077ae6dffb4d2fbd8ce0cccaa58893b07b5ac" } } ] `) }) opts := &ReferenceListOptions{Ref: "refs/heads/b"} ctx := context.Background() refs, _, err := client.Git.ListMatchingRefs(ctx, "o", "r", opts) if err != nil { t.Errorf("Git.ListMatchingRefs returned error: %v", err) } want := &Reference{ Ref: String("refs/heads/booger"), URL: String("https://api.github.com/repos/o/r/git/refs/heads/booger"), Object: &GitObject{ Type: String("commit"), SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd"), URL: String("https://api.github.com/repos/o/r/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd"), }, } if !cmp.Equal(refs[0], want) { t.Errorf("Git.ListMatchingRefs returned %+v, want %+v", refs[0], want) } const methodName = "ListMatchingRefs" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.ListMatchingRefs(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.ListMatchingRefs(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_ListMatchingRefs_noRefs(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/git/matching-refs/heads/b", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, "[]") }) opts := &ReferenceListOptions{Ref: "refs/heads/b"} ctx := context.Background() refs, _, err := client.Git.ListMatchingRefs(ctx, "o", "r", opts) if err != nil { t.Errorf("Git.ListMatchingRefs returned error: %v", err) } if len(refs) != 0 { t.Errorf("Git.ListMatchingRefs returned %+v, want an empty slice", refs) } const methodName = "ListMatchingRefs" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.ListMatchingRefs(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.ListMatchingRefs(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_ListMatchingRefs_allRefs(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/git/matching-refs/", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, ` [ { "ref": "refs/heads/branchA", "url": "https://api.github.com/repos/o/r/git/refs/heads/branchA", "object": { "type": "commit", "sha": "aa218f56b14c9653891f9e74264a383fa43fefbd", "url": "https://api.github.com/repos/o/r/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd" } }, { "ref": "refs/heads/branchB", "url": "https://api.github.com/repos/o/r/git/refs/heads/branchB", "object": { "type": "commit", "sha": "aa218f56b14c9653891f9e74264a383fa43fefbd", "url": "https://api.github.com/repos/o/r/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd" } } ]`) }) ctx := context.Background() refs, _, err := client.Git.ListMatchingRefs(ctx, "o", "r", nil) if err != nil { t.Errorf("Git.ListMatchingRefs returned error: %v", err) } want := []*Reference{ { Ref: String("refs/heads/branchA"), URL: String("https://api.github.com/repos/o/r/git/refs/heads/branchA"), Object: &GitObject{ Type: String("commit"), SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd"), URL: String("https://api.github.com/repos/o/r/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd"), }, }, { Ref: String("refs/heads/branchB"), URL: String("https://api.github.com/repos/o/r/git/refs/heads/branchB"), Object: &GitObject{ Type: String("commit"), SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd"), URL: String("https://api.github.com/repos/o/r/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd"), }, }, } if !cmp.Equal(refs, want) { t.Errorf("Git.ListMatchingRefs returned %+v, want %+v", refs, want) } const methodName = "ListMatchingRefs" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.ListMatchingRefs(ctx, "\n", "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.ListMatchingRefs(ctx, "o", "r", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_ListMatchingRefs_options(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/git/matching-refs/t", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"ref": "r"}]`) }) opts := &ReferenceListOptions{Ref: "t", ListOptions: ListOptions{Page: 2}} ctx := context.Background() refs, _, err := client.Git.ListMatchingRefs(ctx, "o", "r", opts) if err != nil { t.Errorf("Git.ListMatchingRefs returned error: %v", err) } want := []*Reference{{Ref: String("r")}} if !cmp.Equal(refs, want) { t.Errorf("Git.ListMatchingRefs returned %+v, want %+v", refs, want) } const methodName = "ListMatchingRefs" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.ListMatchingRefs(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.ListMatchingRefs(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_CreateRef(t *testing.T) { client, mux, _, teardown := setup() defer teardown() args := &createRefRequest{ Ref: String("refs/heads/b"), SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd"), } mux.HandleFunc("/repos/o/r/git/refs", func(w http.ResponseWriter, r *http.Request) { v := new(createRefRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, args) { t.Errorf("Request body = %+v, want %+v", v, args) } fmt.Fprint(w, ` { "ref": "refs/heads/b", "url": "https://api.github.com/repos/o/r/git/refs/heads/b", "object": { "type": "commit", "sha": "aa218f56b14c9653891f9e74264a383fa43fefbd", "url": "https://api.github.com/repos/o/r/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd" } }`) }) ctx := context.Background() ref, _, err := client.Git.CreateRef(ctx, "o", "r", &Reference{ Ref: String("refs/heads/b"), Object: &GitObject{ SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd"), }, }) if err != nil { t.Errorf("Git.CreateRef returned error: %v", err) } want := &Reference{ Ref: String("refs/heads/b"), URL: String("https://api.github.com/repos/o/r/git/refs/heads/b"), Object: &GitObject{ Type: String("commit"), SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd"), URL: String("https://api.github.com/repos/o/r/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd"), }, } if !cmp.Equal(ref, want) { t.Errorf("Git.CreateRef returned %+v, want %+v", ref, want) } // without 'refs/' prefix _, _, err = client.Git.CreateRef(ctx, "o", "r", &Reference{ Ref: String("heads/b"), Object: &GitObject{ SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd"), }, }) if err != nil { t.Errorf("Git.CreateRef returned error: %v", err) } const methodName = "CreateRef" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.CreateRef(ctx, "\n", "\n", &Reference{ Ref: String("refs/heads/b"), Object: &GitObject{ SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd"), }, }) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.CreateRef(ctx, "o", "r", &Reference{ Ref: String("refs/heads/b"), Object: &GitObject{ SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd"), }, }) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_UpdateRef(t *testing.T) { client, mux, _, teardown := setup() defer teardown() args := &updateRefRequest{ SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd"), Force: Bool(true), } mux.HandleFunc("/repos/o/r/git/refs/heads/b", func(w http.ResponseWriter, r *http.Request) { v := new(updateRefRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, args) { t.Errorf("Request body = %+v, want %+v", v, args) } fmt.Fprint(w, ` { "ref": "refs/heads/b", "url": "https://api.github.com/repos/o/r/git/refs/heads/b", "object": { "type": "commit", "sha": "aa218f56b14c9653891f9e74264a383fa43fefbd", "url": "https://api.github.com/repos/o/r/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd" } }`) }) ctx := context.Background() ref, _, err := client.Git.UpdateRef(ctx, "o", "r", &Reference{ Ref: String("refs/heads/b"), Object: &GitObject{SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd")}, }, true) if err != nil { t.Errorf("Git.UpdateRef returned error: %v", err) } want := &Reference{ Ref: String("refs/heads/b"), URL: String("https://api.github.com/repos/o/r/git/refs/heads/b"), Object: &GitObject{ Type: String("commit"), SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd"), URL: String("https://api.github.com/repos/o/r/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd"), }, } if !cmp.Equal(ref, want) { t.Errorf("Git.UpdateRef returned %+v, want %+v", ref, want) } // without 'refs/' prefix _, _, err = client.Git.UpdateRef(ctx, "o", "r", &Reference{ Ref: String("heads/b"), Object: &GitObject{SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd")}, }, true) if err != nil { t.Errorf("Git.UpdateRef returned error: %v", err) } const methodName = "UpdateRef" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.UpdateRef(ctx, "\n", "\n", &Reference{ Ref: String("refs/heads/b"), Object: &GitObject{SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd")}, }, true) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.UpdateRef(ctx, "o", "r", &Reference{ Ref: String("refs/heads/b"), Object: &GitObject{SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd")}, }, true) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_DeleteRef(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/git/refs/heads/b", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Git.DeleteRef(ctx, "o", "r", "refs/heads/b") if err != nil { t.Errorf("Git.DeleteRef returned error: %v", err) } // without 'refs/' prefix if _, err := client.Git.DeleteRef(ctx, "o", "r", "heads/b"); err != nil { t.Errorf("Git.DeleteRef returned error: %v", err) } const methodName = "DeleteRef" testBadOptions(t, methodName, func() (err error) { _, err = client.Git.DeleteRef(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Git.DeleteRef(ctx, "o", "r", "refs/heads/b") }) } func TestGitService_GetRef_pathEscape(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/git/ref/heads/b", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") if strings.Contains(r.URL.RawPath, "%2F") { t.Errorf("RawPath still contains escaped / as %%2F: %v", r.URL.RawPath) } fmt.Fprint(w, ` { "ref": "refs/heads/b", "url": "https://api.github.com/repos/o/r/git/refs/heads/b", "object": { "type": "commit", "sha": "aa218f56b14c9653891f9e74264a383fa43fefbd", "url": "https://api.github.com/repos/o/r/git/commits/aa218f56b14c9653891f9e74264a383fa43fefbd" } }`) }) ctx := context.Background() _, _, err := client.Git.GetRef(ctx, "o", "r", "refs/heads/b") if err != nil { t.Fatalf("Git.GetRef returned error: %v", err) } const methodName = "GetRef" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.GetRef(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.GetRef(ctx, "o", "r", "refs/heads/b") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestReference_Marshal(t *testing.T) { testJSONMarshal(t, &Reference{}, "{}") u := &Reference{ Ref: String("ref"), URL: String("url"), Object: &GitObject{ Type: String("type"), SHA: String("sha"), URL: String("url"), }, NodeID: String("nid"), } want := `{ "ref": "ref", "url": "url", "object": { "type": "type", "sha": "sha", "url": "url" }, "node_id": "nid" }` testJSONMarshal(t, u, want) } func TestGitObject_Marshal(t *testing.T) { testJSONMarshal(t, &GitObject{}, "{}") u := &GitObject{ Type: String("type"), SHA: String("sha"), URL: String("url"), } want := `{ "type": "type", "sha": "sha", "url": "url" }` testJSONMarshal(t, u, want) } func TestCreateRefRequest_Marshal(t *testing.T) { testJSONMarshal(t, &createRefRequest{}, "{}") u := &createRefRequest{ Ref: String("ref"), SHA: String("sha"), } want := `{ "ref": "ref", "sha": "sha" }` testJSONMarshal(t, u, want) } func TestUpdateRefRequest_Marshal(t *testing.T) { testJSONMarshal(t, &updateRefRequest{}, "{}") u := &updateRefRequest{ SHA: String("sha"), Force: Bool(true), } want := `{ "sha": "sha", "force": true }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/git_tags.go000066400000000000000000000047161410475703100171140ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" ) // Tag represents a tag object. type Tag struct { Tag *string `json:"tag,omitempty"` SHA *string `json:"sha,omitempty"` URL *string `json:"url,omitempty"` Message *string `json:"message,omitempty"` Tagger *CommitAuthor `json:"tagger,omitempty"` Object *GitObject `json:"object,omitempty"` Verification *SignatureVerification `json:"verification,omitempty"` NodeID *string `json:"node_id,omitempty"` } // createTagRequest represents the body of a CreateTag request. This is mostly // identical to Tag with the exception that the object SHA and Type are // top-level fields, rather than being nested inside a JSON object. type createTagRequest struct { Tag *string `json:"tag,omitempty"` Message *string `json:"message,omitempty"` Object *string `json:"object,omitempty"` Type *string `json:"type,omitempty"` Tagger *CommitAuthor `json:"tagger,omitempty"` } // GetTag fetches a tag from a repo given a SHA. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/git/#get-a-tag func (s *GitService) GetTag(ctx context.Context, owner string, repo string, sha string) (*Tag, *Response, error) { u := fmt.Sprintf("repos/%v/%v/git/tags/%v", owner, repo, sha) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } tag := new(Tag) resp, err := s.client.Do(ctx, req, tag) return tag, resp, err } // CreateTag creates a tag object. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/git/#create-a-tag-object func (s *GitService) CreateTag(ctx context.Context, owner string, repo string, tag *Tag) (*Tag, *Response, error) { u := fmt.Sprintf("repos/%v/%v/git/tags", owner, repo) // convert Tag into a createTagRequest tagRequest := &createTagRequest{ Tag: tag.Tag, Message: tag.Message, Tagger: tag.Tagger, } if tag.Object != nil { tagRequest.Object = tag.Object.SHA tagRequest.Type = tag.Object.Type } req, err := s.client.NewRequest("POST", u, tagRequest) if err != nil { return nil, nil, err } t := new(Tag) resp, err := s.client.Do(ctx, req, t) return t, resp, err } go-github-38.1.0/github/git_tags_test.go000066400000000000000000000071551410475703100201530ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestGitService_GetTag(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/git/tags/s", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"tag": "t"}`) }) ctx := context.Background() tag, _, err := client.Git.GetTag(ctx, "o", "r", "s") if err != nil { t.Errorf("Git.GetTag returned error: %v", err) } want := &Tag{Tag: String("t")} if !cmp.Equal(tag, want) { t.Errorf("Git.GetTag returned %+v, want %+v", tag, want) } const methodName = "GetTag" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.GetTag(ctx, "\n", "\n", "\n") return err }) } func TestGitService_CreateTag(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &createTagRequest{Tag: String("t"), Object: String("s")} mux.HandleFunc("/repos/o/r/git/tags", func(w http.ResponseWriter, r *http.Request) { v := new(createTagRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"tag": "t"}`) }) ctx := context.Background() tag, _, err := client.Git.CreateTag(ctx, "o", "r", &Tag{ Tag: input.Tag, Object: &GitObject{SHA: input.Object}, }) if err != nil { t.Errorf("Git.CreateTag returned error: %v", err) } want := &Tag{Tag: String("t")} if !cmp.Equal(tag, want) { t.Errorf("Git.GetTag returned %+v, want %+v", tag, want) } const methodName = "CreateTag" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.CreateTag(ctx, "\n", "\n", &Tag{ Tag: input.Tag, Object: &GitObject{SHA: input.Object}, }) return err }) } func TestTag_Marshal(t *testing.T) { testJSONMarshal(t, &Tag{}, "{}") u := &Tag{ Tag: String("tag"), SHA: String("sha"), URL: String("url"), Message: String("msg"), Tagger: &CommitAuthor{ Date: &referenceTime, Name: String("name"), Email: String("email"), Login: String("login"), }, Object: &GitObject{ Type: String("type"), SHA: String("sha"), URL: String("url"), }, Verification: &SignatureVerification{ Verified: Bool(true), Reason: String("reason"), Signature: String("sign"), Payload: String("payload"), }, NodeID: String("nid"), } want := `{ "tag": "tag", "sha": "sha", "url": "url", "message": "msg", "tagger": { "date": ` + referenceTimeStr + `, "name": "name", "email": "email", "username": "login" }, "object": { "type": "type", "sha": "sha", "url": "url" }, "verification": { "verified": true, "reason": "reason", "signature": "sign", "payload": "payload" }, "node_id": "nid" }` testJSONMarshal(t, u, want) } func TestCreateTagRequest_Marshal(t *testing.T) { testJSONMarshal(t, &createTagRequest{}, "{}") u := &createTagRequest{ Tag: String("tag"), Message: String("msg"), Object: String("obj"), Type: String("type"), Tagger: &CommitAuthor{ Date: &referenceTime, Name: String("name"), Email: String("email"), Login: String("login"), }, } want := `{ "tag": "tag", "message": "msg", "object": "obj", "type": "type", "tagger": { "date": ` + referenceTimeStr + `, "name": "name", "email": "email", "username": "login" } }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/git_trees.go000066400000000000000000000107751410475703100173020ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" ) // Tree represents a GitHub tree. type Tree struct { SHA *string `json:"sha,omitempty"` Entries []*TreeEntry `json:"tree,omitempty"` // Truncated is true if the number of items in the tree // exceeded GitHub's maximum limit and the Entries were truncated // in the response. Only populated for requests that fetch // trees like Git.GetTree. Truncated *bool `json:"truncated,omitempty"` } func (t Tree) String() string { return Stringify(t) } // TreeEntry represents the contents of a tree structure. TreeEntry can // represent either a blob, a commit (in the case of a submodule), or another // tree. type TreeEntry struct { SHA *string `json:"sha,omitempty"` Path *string `json:"path,omitempty"` Mode *string `json:"mode,omitempty"` Type *string `json:"type,omitempty"` Size *int `json:"size,omitempty"` Content *string `json:"content,omitempty"` URL *string `json:"url,omitempty"` } func (t TreeEntry) String() string { return Stringify(t) } // treeEntryWithFileDelete is used internally to delete a file whose // Content and SHA fields are empty. It does this by removing the "omitempty" // tag modifier on the SHA field which causes the GitHub API to receive // {"sha":null} and thereby delete the file. type treeEntryWithFileDelete struct { SHA *string `json:"sha"` Path *string `json:"path,omitempty"` Mode *string `json:"mode,omitempty"` Type *string `json:"type,omitempty"` Size *int `json:"size,omitempty"` Content *string `json:"content,omitempty"` URL *string `json:"url,omitempty"` } func (t *TreeEntry) MarshalJSON() ([]byte, error) { if t.SHA == nil && t.Content == nil { return json.Marshal(struct { SHA *string `json:"sha"` Path *string `json:"path,omitempty"` Mode *string `json:"mode,omitempty"` Type *string `json:"type,omitempty"` }{ nil, t.Path, t.Mode, t.Type, }) } return json.Marshal(struct { SHA *string `json:"sha,omitempty"` Path *string `json:"path,omitempty"` Mode *string `json:"mode,omitempty"` Type *string `json:"type,omitempty"` Size *int `json:"size,omitempty"` Content *string `json:"content,omitempty"` URL *string `json:"url,omitempty"` }{ SHA: t.SHA, Path: t.Path, Mode: t.Mode, Type: t.Type, Size: t.Size, Content: t.Content, URL: t.URL, }) } // GetTree fetches the Tree object for a given sha hash from a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/git/#get-a-tree func (s *GitService) GetTree(ctx context.Context, owner string, repo string, sha string, recursive bool) (*Tree, *Response, error) { u := fmt.Sprintf("repos/%v/%v/git/trees/%v", owner, repo, sha) if recursive { u += "?recursive=1" } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } t := new(Tree) resp, err := s.client.Do(ctx, req, t) if err != nil { return nil, resp, err } return t, resp, nil } // createTree represents the body of a CreateTree request. type createTree struct { BaseTree string `json:"base_tree,omitempty"` Entries []interface{} `json:"tree"` } // CreateTree creates a new tree in a repository. If both a tree and a nested // path modifying that tree are specified, it will overwrite the contents of // that tree with the new path contents and write a new tree out. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/git/#create-a-tree func (s *GitService) CreateTree(ctx context.Context, owner string, repo string, baseTree string, entries []*TreeEntry) (*Tree, *Response, error) { u := fmt.Sprintf("repos/%v/%v/git/trees", owner, repo) newEntries := make([]interface{}, 0, len(entries)) for _, entry := range entries { if entry.Content == nil && entry.SHA == nil { newEntries = append(newEntries, treeEntryWithFileDelete{ Path: entry.Path, Mode: entry.Mode, Type: entry.Type, Size: entry.Size, URL: entry.URL, }) continue } newEntries = append(newEntries, entry) } body := &createTree{ BaseTree: baseTree, Entries: newEntries, } req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } t := new(Tree) resp, err := s.client.Do(ctx, req, t) if err != nil { return nil, resp, err } return t, resp, nil } go-github-38.1.0/github/git_trees_test.go000066400000000000000000000244271410475703100203400ustar00rootroot00000000000000// Copyright 2013 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 ( "bytes" "context" "fmt" "io/ioutil" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestMarshalJSON_withNilContentAndSHA(t *testing.T) { te := &TreeEntry{ Path: String("path"), Mode: String("mode"), Type: String("type"), Size: Int(1), URL: String("url"), } got, err := te.MarshalJSON() if err != nil { t.Errorf("MarshalJSON: %v", err) } want := `{"sha":null,"path":"path","mode":"mode","type":"type"}` if string(got) != want { t.Errorf("MarshalJSON = %s, want %v", got, want) } } func TestGitService_GetTree(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/git/trees/s", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "sha": "s", "tree": [ { "type": "blob" } ], "truncated": true }`) }) ctx := context.Background() tree, _, err := client.Git.GetTree(ctx, "o", "r", "s", true) if err != nil { t.Errorf("Git.GetTree returned error: %v", err) } want := Tree{ SHA: String("s"), Entries: []*TreeEntry{ { Type: String("blob"), }, }, Truncated: Bool(true), } if !cmp.Equal(*tree, want) { t.Errorf("Tree.Get returned %+v, want %+v", *tree, want) } const methodName = "GetTree" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.GetTree(ctx, "\n", "\n", "\n", true) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.GetTree(ctx, "o", "r", "s", true) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_GetTree_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Git.GetTree(ctx, "%", "%", "%", false) testURLParseError(t, err) } func TestGitService_CreateTree(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := []*TreeEntry{ { Path: String("file.rb"), Mode: String("100644"), Type: String("blob"), SHA: String("7c258a9869f33c1e1e1f74fbb32f07c86cb5a75b"), }, } mux.HandleFunc("/repos/o/r/git/trees", func(w http.ResponseWriter, r *http.Request) { got, err := ioutil.ReadAll(r.Body) if err != nil { t.Fatalf("unable to read body: %v", err) } testMethod(t, r, "POST") want := []byte(`{"base_tree":"b","tree":[{"sha":"7c258a9869f33c1e1e1f74fbb32f07c86cb5a75b","path":"file.rb","mode":"100644","type":"blob"}]}` + "\n") if !bytes.Equal(got, want) { t.Errorf("Git.CreateTree request body: %s, want %s", got, want) } fmt.Fprint(w, `{ "sha": "cd8274d15fa3ae2ab983129fb037999f264ba9a7", "tree": [ { "path": "file.rb", "mode": "100644", "type": "blob", "size": 132, "sha": "7c258a9869f33c1e1e1f74fbb32f07c86cb5a75b" } ] }`) }) ctx := context.Background() tree, _, err := client.Git.CreateTree(ctx, "o", "r", "b", input) if err != nil { t.Errorf("Git.CreateTree returned error: %v", err) } want := Tree{ String("cd8274d15fa3ae2ab983129fb037999f264ba9a7"), []*TreeEntry{ { Path: String("file.rb"), Mode: String("100644"), Type: String("blob"), Size: Int(132), SHA: String("7c258a9869f33c1e1e1f74fbb32f07c86cb5a75b"), }, }, nil, } if !cmp.Equal(*tree, want) { t.Errorf("Git.CreateTree returned %+v, want %+v", *tree, want) } const methodName = "CreateTree" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.CreateTree(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.CreateTree(ctx, "o", "r", "b", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_CreateTree_Content(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := []*TreeEntry{ { Path: String("content.md"), Mode: String("100644"), Content: String("file content"), }, } mux.HandleFunc("/repos/o/r/git/trees", func(w http.ResponseWriter, r *http.Request) { got, err := ioutil.ReadAll(r.Body) if err != nil { t.Fatalf("unable to read body: %v", err) } testMethod(t, r, "POST") want := []byte(`{"base_tree":"b","tree":[{"path":"content.md","mode":"100644","content":"file content"}]}` + "\n") if !bytes.Equal(got, want) { t.Errorf("Git.CreateTree request body: %s, want %s", got, want) } fmt.Fprint(w, `{ "sha": "5c6780ad2c68743383b740fd1dab6f6a33202b11", "url": "https://api.github.com/repos/o/r/git/trees/5c6780ad2c68743383b740fd1dab6f6a33202b11", "tree": [ { "mode": "100644", "type": "blob", "sha": "aad8feacf6f8063150476a7b2bd9770f2794c08b", "path": "content.md", "size": 12, "url": "https://api.github.com/repos/o/r/git/blobs/aad8feacf6f8063150476a7b2bd9770f2794c08b" } ] }`) }) ctx := context.Background() tree, _, err := client.Git.CreateTree(ctx, "o", "r", "b", input) if err != nil { t.Errorf("Git.CreateTree returned error: %v", err) } want := Tree{ String("5c6780ad2c68743383b740fd1dab6f6a33202b11"), []*TreeEntry{ { Path: String("content.md"), Mode: String("100644"), Type: String("blob"), Size: Int(12), SHA: String("aad8feacf6f8063150476a7b2bd9770f2794c08b"), URL: String("https://api.github.com/repos/o/r/git/blobs/aad8feacf6f8063150476a7b2bd9770f2794c08b"), }, }, nil, } if !cmp.Equal(*tree, want) { t.Errorf("Git.CreateTree returned %+v, want %+v", *tree, want) } const methodName = "CreateTree" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.CreateTree(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.CreateTree(ctx, "o", "r", "b", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_CreateTree_Delete(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := []*TreeEntry{ { Path: String("content.md"), Mode: String("100644"), }, } mux.HandleFunc("/repos/o/r/git/trees", func(w http.ResponseWriter, r *http.Request) { got, err := ioutil.ReadAll(r.Body) if err != nil { t.Fatalf("unable to read body: %v", err) } testMethod(t, r, "POST") want := []byte(`{"base_tree":"b","tree":[{"sha":null,"path":"content.md","mode":"100644"}]}` + "\n") if !bytes.Equal(got, want) { t.Errorf("Git.CreateTree request body: %s, want %s", got, want) } fmt.Fprint(w, `{ "sha": "5c6780ad2c68743383b740fd1dab6f6a33202b11", "url": "https://api.github.com/repos/o/r/git/trees/5c6780ad2c68743383b740fd1dab6f6a33202b11", "tree": [ { "mode": "100644", "type": "blob", "sha": null, "path": "content.md", "size": 12, "url": "https://api.github.com/repos/o/r/git/blobs/aad8feacf6f8063150476a7b2bd9770f2794c08b" } ] }`) }) ctx := context.Background() tree, _, err := client.Git.CreateTree(ctx, "o", "r", "b", input) if err != nil { t.Errorf("Git.CreateTree returned error: %v", err) } want := Tree{ String("5c6780ad2c68743383b740fd1dab6f6a33202b11"), []*TreeEntry{ { Path: String("content.md"), Mode: String("100644"), Type: String("blob"), Size: Int(12), SHA: nil, URL: String("https://api.github.com/repos/o/r/git/blobs/aad8feacf6f8063150476a7b2bd9770f2794c08b"), }, }, nil, } if !cmp.Equal(*tree, want) { t.Errorf("Git.CreateTree returned %+v, want %+v", *tree, want) } const methodName = "CreateTree" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Git.CreateTree(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.CreateTree(ctx, "o", "r", "b", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitService_CreateTree_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Git.CreateTree(ctx, "%", "%", "", nil) testURLParseError(t, err) } func TestTree_Marshal(t *testing.T) { testJSONMarshal(t, &Tree{}, "{}") u := &Tree{ SHA: String("sha"), Entries: []*TreeEntry{ { SHA: String("sha"), Path: String("path"), Mode: String("mode"), Type: String("type"), Size: Int(1), Content: String("content"), URL: String("url"), }, }, Truncated: Bool(false), } want := `{ "sha": "sha", "tree": [ { "sha": "sha", "path": "path", "mode": "mode", "type": "type", "size": 1, "content": "content", "url": "url" } ], "truncated": false }` testJSONMarshal(t, u, want) } func TestTreeEntry_Marshal(t *testing.T) { testJSONMarshal(t, &TreeEntry{}, "{}") u := &TreeEntry{ SHA: String("sha"), Path: String("path"), Mode: String("mode"), Type: String("type"), Size: Int(1), Content: String("content"), URL: String("url"), } want := `{ "sha": "sha", "path": "path", "mode": "mode", "type": "type", "size": 1, "content": "content", "url": "url" }` testJSONMarshal(t, u, want) } func TestTreeEntryWithFileDelete_Marshal(t *testing.T) { testJSONMarshal(t, &treeEntryWithFileDelete{}, "{}") u := &treeEntryWithFileDelete{ SHA: String("sha"), Path: String("path"), Mode: String("mode"), Type: String("type"), Size: Int(1), Content: String("content"), URL: String("url"), } want := `{ "sha": "sha", "path": "path", "mode": "mode", "type": "type", "size": 1, "content": "content", "url": "url" }` testJSONMarshal(t, u, want) } func TestCreateTree_Marshal(t *testing.T) { testJSONMarshal(t, &createTree{}, "{}") u := &createTree{ BaseTree: "bt", Entries: []interface{}{"e"}, } want := `{ "base_tree": "bt", "tree": ["e"] }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/github-accessors.go000066400000000000000000014771601410475703100205700ustar00rootroot00000000000000// Copyright 2017 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. // Code generated by gen-accessors; DO NOT EDIT. package github import ( "encoding/json" "time" ) // GetRetryAfter returns the RetryAfter field if it's non-nil, zero value otherwise. func (a *AbuseRateLimitError) GetRetryAfter() time.Duration { if a == nil || a.RetryAfter == nil { return 0 } return *a.RetryAfter } // GetGithubOwnedAllowed returns the GithubOwnedAllowed field if it's non-nil, zero value otherwise. func (a *ActionsAllowed) GetGithubOwnedAllowed() bool { if a == nil || a.GithubOwnedAllowed == nil { return false } return *a.GithubOwnedAllowed } // GetVerifiedAllowed returns the VerifiedAllowed field if it's non-nil, zero value otherwise. func (a *ActionsAllowed) GetVerifiedAllowed() bool { if a == nil || a.VerifiedAllowed == nil { return false } return *a.VerifiedAllowed } // GetAllowedActions returns the AllowedActions field if it's non-nil, zero value otherwise. func (a *ActionsPermissions) GetAllowedActions() string { if a == nil || a.AllowedActions == nil { return "" } return *a.AllowedActions } // GetEnabledRepositories returns the EnabledRepositories field if it's non-nil, zero value otherwise. func (a *ActionsPermissions) GetEnabledRepositories() string { if a == nil || a.EnabledRepositories == nil { return "" } return *a.EnabledRepositories } // GetSelectedActionsURL returns the SelectedActionsURL field if it's non-nil, zero value otherwise. func (a *ActionsPermissions) GetSelectedActionsURL() string { if a == nil || a.SelectedActionsURL == nil { return "" } return *a.SelectedActionsURL } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (a *AdminEnforcement) GetURL() string { if a == nil || a.URL == nil { return "" } return *a.URL } // GetComments returns the Comments field. func (a *AdminStats) GetComments() *CommentStats { if a == nil { return nil } return a.Comments } // GetGists returns the Gists field. func (a *AdminStats) GetGists() *GistStats { if a == nil { return nil } return a.Gists } // GetHooks returns the Hooks field. func (a *AdminStats) GetHooks() *HookStats { if a == nil { return nil } return a.Hooks } // GetIssues returns the Issues field. func (a *AdminStats) GetIssues() *IssueStats { if a == nil { return nil } return a.Issues } // GetMilestones returns the Milestones field. func (a *AdminStats) GetMilestones() *MilestoneStats { if a == nil { return nil } return a.Milestones } // GetOrgs returns the Orgs field. func (a *AdminStats) GetOrgs() *OrgStats { if a == nil { return nil } return a.Orgs } // GetPages returns the Pages field. func (a *AdminStats) GetPages() *PageStats { if a == nil { return nil } return a.Pages } // GetPulls returns the Pulls field. func (a *AdminStats) GetPulls() *PullStats { if a == nil { return nil } return a.Pulls } // GetRepos returns the Repos field. func (a *AdminStats) GetRepos() *RepoStats { if a == nil { return nil } return a.Repos } // GetUsers returns the Users field. func (a *AdminStats) GetUsers() *UserStats { if a == nil { return nil } return a.Users } // GetClosedAt returns the ClosedAt field if it's non-nil, zero value otherwise. func (a *Alert) GetClosedAt() Timestamp { if a == nil || a.ClosedAt == nil { return Timestamp{} } return *a.ClosedAt } // GetClosedBy returns the ClosedBy field. func (a *Alert) GetClosedBy() *User { if a == nil { return nil } return a.ClosedBy } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (a *Alert) GetCreatedAt() Timestamp { if a == nil || a.CreatedAt == nil { return Timestamp{} } return *a.CreatedAt } // GetDismissedAt returns the DismissedAt field if it's non-nil, zero value otherwise. func (a *Alert) GetDismissedAt() Timestamp { if a == nil || a.DismissedAt == nil { return Timestamp{} } return *a.DismissedAt } // GetDismissedBy returns the DismissedBy field. func (a *Alert) GetDismissedBy() *User { if a == nil { return nil } return a.DismissedBy } // GetDismissedReason returns the DismissedReason field if it's non-nil, zero value otherwise. func (a *Alert) GetDismissedReason() string { if a == nil || a.DismissedReason == nil { return "" } return *a.DismissedReason } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (a *Alert) GetHTMLURL() string { if a == nil || a.HTMLURL == nil { return "" } return *a.HTMLURL } // GetInstancesURL returns the InstancesURL field if it's non-nil, zero value otherwise. func (a *Alert) GetInstancesURL() string { if a == nil || a.InstancesURL == nil { return "" } return *a.InstancesURL } // GetMostRecentInstance returns the MostRecentInstance field. func (a *Alert) GetMostRecentInstance() *MostRecentInstance { if a == nil { return nil } return a.MostRecentInstance } // GetRule returns the Rule field. func (a *Alert) GetRule() *Rule { if a == nil { return nil } return a.Rule } // GetRuleDescription returns the RuleDescription field if it's non-nil, zero value otherwise. func (a *Alert) GetRuleDescription() string { if a == nil || a.RuleDescription == nil { return "" } return *a.RuleDescription } // GetRuleID returns the RuleID field if it's non-nil, zero value otherwise. func (a *Alert) GetRuleID() string { if a == nil || a.RuleID == nil { return "" } return *a.RuleID } // GetRuleSeverity returns the RuleSeverity field if it's non-nil, zero value otherwise. func (a *Alert) GetRuleSeverity() string { if a == nil || a.RuleSeverity == nil { return "" } return *a.RuleSeverity } // GetState returns the State field if it's non-nil, zero value otherwise. func (a *Alert) GetState() string { if a == nil || a.State == nil { return "" } return *a.State } // GetTool returns the Tool field. func (a *Alert) GetTool() *Tool { if a == nil { return nil } return a.Tool } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (a *Alert) GetURL() string { if a == nil || a.URL == nil { return "" } return *a.URL } // GetVerifiablePasswordAuthentication returns the VerifiablePasswordAuthentication field if it's non-nil, zero value otherwise. func (a *APIMeta) GetVerifiablePasswordAuthentication() bool { if a == nil || a.VerifiablePasswordAuthentication == nil { return false } return *a.VerifiablePasswordAuthentication } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (a *App) GetCreatedAt() Timestamp { if a == nil || a.CreatedAt == nil { return Timestamp{} } return *a.CreatedAt } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (a *App) GetDescription() string { if a == nil || a.Description == nil { return "" } return *a.Description } // GetExternalURL returns the ExternalURL field if it's non-nil, zero value otherwise. func (a *App) GetExternalURL() string { if a == nil || a.ExternalURL == nil { return "" } return *a.ExternalURL } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (a *App) GetHTMLURL() string { if a == nil || a.HTMLURL == nil { return "" } return *a.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (a *App) GetID() int64 { if a == nil || a.ID == nil { return 0 } return *a.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (a *App) GetName() string { if a == nil || a.Name == nil { return "" } return *a.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (a *App) GetNodeID() string { if a == nil || a.NodeID == nil { return "" } return *a.NodeID } // GetOwner returns the Owner field. func (a *App) GetOwner() *User { if a == nil { return nil } return a.Owner } // GetPermissions returns the Permissions field. func (a *App) GetPermissions() *InstallationPermissions { if a == nil { return nil } return a.Permissions } // GetSlug returns the Slug field if it's non-nil, zero value otherwise. func (a *App) GetSlug() string { if a == nil || a.Slug == nil { return "" } return *a.Slug } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (a *App) GetUpdatedAt() Timestamp { if a == nil || a.UpdatedAt == nil { return Timestamp{} } return *a.UpdatedAt } // GetClientID returns the ClientID field if it's non-nil, zero value otherwise. func (a *AppConfig) GetClientID() string { if a == nil || a.ClientID == nil { return "" } return *a.ClientID } // GetClientSecret returns the ClientSecret field if it's non-nil, zero value otherwise. func (a *AppConfig) GetClientSecret() string { if a == nil || a.ClientSecret == nil { return "" } return *a.ClientSecret } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (a *AppConfig) GetCreatedAt() Timestamp { if a == nil || a.CreatedAt == nil { return Timestamp{} } return *a.CreatedAt } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (a *AppConfig) GetDescription() string { if a == nil || a.Description == nil { return "" } return *a.Description } // GetExternalURL returns the ExternalURL field if it's non-nil, zero value otherwise. func (a *AppConfig) GetExternalURL() string { if a == nil || a.ExternalURL == nil { return "" } return *a.ExternalURL } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (a *AppConfig) GetHTMLURL() string { if a == nil || a.HTMLURL == nil { return "" } return *a.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (a *AppConfig) GetID() int64 { if a == nil || a.ID == nil { return 0 } return *a.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (a *AppConfig) GetName() string { if a == nil || a.Name == nil { return "" } return *a.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (a *AppConfig) GetNodeID() string { if a == nil || a.NodeID == nil { return "" } return *a.NodeID } // GetOwner returns the Owner field. func (a *AppConfig) GetOwner() *User { if a == nil { return nil } return a.Owner } // GetPEM returns the PEM field if it's non-nil, zero value otherwise. func (a *AppConfig) GetPEM() string { if a == nil || a.PEM == nil { return "" } return *a.PEM } // GetSlug returns the Slug field if it's non-nil, zero value otherwise. func (a *AppConfig) GetSlug() string { if a == nil || a.Slug == nil { return "" } return *a.Slug } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (a *AppConfig) GetUpdatedAt() Timestamp { if a == nil || a.UpdatedAt == nil { return Timestamp{} } return *a.UpdatedAt } // GetWebhookSecret returns the WebhookSecret field if it's non-nil, zero value otherwise. func (a *AppConfig) GetWebhookSecret() string { if a == nil || a.WebhookSecret == nil { return "" } return *a.WebhookSecret } // GetArchiveDownloadURL returns the ArchiveDownloadURL field if it's non-nil, zero value otherwise. func (a *Artifact) GetArchiveDownloadURL() string { if a == nil || a.ArchiveDownloadURL == nil { return "" } return *a.ArchiveDownloadURL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (a *Artifact) GetCreatedAt() Timestamp { if a == nil || a.CreatedAt == nil { return Timestamp{} } return *a.CreatedAt } // GetExpired returns the Expired field if it's non-nil, zero value otherwise. func (a *Artifact) GetExpired() bool { if a == nil || a.Expired == nil { return false } return *a.Expired } // GetExpiresAt returns the ExpiresAt field if it's non-nil, zero value otherwise. func (a *Artifact) GetExpiresAt() Timestamp { if a == nil || a.ExpiresAt == nil { return Timestamp{} } return *a.ExpiresAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (a *Artifact) GetID() int64 { if a == nil || a.ID == nil { return 0 } return *a.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (a *Artifact) GetName() string { if a == nil || a.Name == nil { return "" } return *a.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (a *Artifact) GetNodeID() string { if a == nil || a.NodeID == nil { return "" } return *a.NodeID } // GetSizeInBytes returns the SizeInBytes field if it's non-nil, zero value otherwise. func (a *Artifact) GetSizeInBytes() int64 { if a == nil || a.SizeInBytes == nil { return 0 } return *a.SizeInBytes } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (a *ArtifactList) GetTotalCount() int64 { if a == nil || a.TotalCount == nil { return 0 } return *a.TotalCount } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (a *Attachment) GetBody() string { if a == nil || a.Body == nil { return "" } return *a.Body } // GetID returns the ID field if it's non-nil, zero value otherwise. func (a *Attachment) GetID() int64 { if a == nil || a.ID == nil { return 0 } return *a.ID } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (a *Attachment) GetTitle() string { if a == nil || a.Title == nil { return "" } return *a.Title } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetAction() string { if a == nil || a.Action == nil { return "" } return *a.Action } // GetActive returns the Active field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetActive() bool { if a == nil || a.Active == nil { return false } return *a.Active } // GetActiveWas returns the ActiveWas field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetActiveWas() bool { if a == nil || a.ActiveWas == nil { return false } return *a.ActiveWas } // GetActor returns the Actor field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetActor() string { if a == nil || a.Actor == nil { return "" } return *a.Actor } // GetBlockedUser returns the BlockedUser field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetBlockedUser() string { if a == nil || a.BlockedUser == nil { return "" } return *a.BlockedUser } // GetBusiness returns the Business field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetBusiness() string { if a == nil || a.Business == nil { return "" } return *a.Business } // GetCancelledAt returns the CancelledAt field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetCancelledAt() Timestamp { if a == nil || a.CancelledAt == nil { return Timestamp{} } return *a.CancelledAt } // GetCompletedAt returns the CompletedAt field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetCompletedAt() Timestamp { if a == nil || a.CompletedAt == nil { return Timestamp{} } return *a.CompletedAt } // GetConclusion returns the Conclusion field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetConclusion() string { if a == nil || a.Conclusion == nil { return "" } return *a.Conclusion } // GetConfig returns the Config field. func (a *AuditEntry) GetConfig() *HookConfig { if a == nil { return nil } return a.Config } // GetConfigWas returns the ConfigWas field. func (a *AuditEntry) GetConfigWas() *HookConfig { if a == nil { return nil } return a.ConfigWas } // GetContentType returns the ContentType field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetContentType() string { if a == nil || a.ContentType == nil { return "" } return *a.ContentType } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetCreatedAt() Timestamp { if a == nil || a.CreatedAt == nil { return Timestamp{} } return *a.CreatedAt } // GetDeployKeyFingerprint returns the DeployKeyFingerprint field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetDeployKeyFingerprint() string { if a == nil || a.DeployKeyFingerprint == nil { return "" } return *a.DeployKeyFingerprint } // GetDocumentID returns the DocumentID field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetDocumentID() string { if a == nil || a.DocumentID == nil { return "" } return *a.DocumentID } // GetEmoji returns the Emoji field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetEmoji() string { if a == nil || a.Emoji == nil { return "" } return *a.Emoji } // GetEnvironmentName returns the EnvironmentName field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetEnvironmentName() string { if a == nil || a.EnvironmentName == nil { return "" } return *a.EnvironmentName } // GetEvent returns the Event field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetEvent() string { if a == nil || a.Event == nil { return "" } return *a.Event } // GetExplanation returns the Explanation field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetExplanation() string { if a == nil || a.Explanation == nil { return "" } return *a.Explanation } // GetFingerprint returns the Fingerprint field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetFingerprint() string { if a == nil || a.Fingerprint == nil { return "" } return *a.Fingerprint } // GetHeadBranch returns the HeadBranch field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetHeadBranch() string { if a == nil || a.HeadBranch == nil { return "" } return *a.HeadBranch } // GetHeadSHA returns the HeadSHA field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetHeadSHA() string { if a == nil || a.HeadSHA == nil { return "" } return *a.HeadSHA } // GetHookID returns the HookID field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetHookID() int64 { if a == nil || a.HookID == nil { return 0 } return *a.HookID } // GetIsHostedRunner returns the IsHostedRunner field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetIsHostedRunner() bool { if a == nil || a.IsHostedRunner == nil { return false } return *a.IsHostedRunner } // GetJobName returns the JobName field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetJobName() string { if a == nil || a.JobName == nil { return "" } return *a.JobName } // GetLimitedAvailability returns the LimitedAvailability field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetLimitedAvailability() bool { if a == nil || a.LimitedAvailability == nil { return false } return *a.LimitedAvailability } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetMessage() string { if a == nil || a.Message == nil { return "" } return *a.Message } // GetName returns the Name field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetName() string { if a == nil || a.Name == nil { return "" } return *a.Name } // GetOldUser returns the OldUser field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetOldUser() string { if a == nil || a.OldUser == nil { return "" } return *a.OldUser } // GetOpenSSHPublicKey returns the OpenSSHPublicKey field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetOpenSSHPublicKey() string { if a == nil || a.OpenSSHPublicKey == nil { return "" } return *a.OpenSSHPublicKey } // GetOrg returns the Org field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetOrg() string { if a == nil || a.Org == nil { return "" } return *a.Org } // GetPreviousVisibility returns the PreviousVisibility field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetPreviousVisibility() string { if a == nil || a.PreviousVisibility == nil { return "" } return *a.PreviousVisibility } // GetReadOnly returns the ReadOnly field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetReadOnly() string { if a == nil || a.ReadOnly == nil { return "" } return *a.ReadOnly } // GetRepo returns the Repo field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetRepo() string { if a == nil || a.Repo == nil { return "" } return *a.Repo } // GetRepository returns the Repository field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetRepository() string { if a == nil || a.Repository == nil { return "" } return *a.Repository } // GetRepositoryPublic returns the RepositoryPublic field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetRepositoryPublic() bool { if a == nil || a.RepositoryPublic == nil { return false } return *a.RepositoryPublic } // GetRunnerGroupID returns the RunnerGroupID field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetRunnerGroupID() string { if a == nil || a.RunnerGroupID == nil { return "" } return *a.RunnerGroupID } // GetRunnerGroupName returns the RunnerGroupName field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetRunnerGroupName() string { if a == nil || a.RunnerGroupName == nil { return "" } return *a.RunnerGroupName } // GetRunnerID returns the RunnerID field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetRunnerID() string { if a == nil || a.RunnerID == nil { return "" } return *a.RunnerID } // GetRunnerName returns the RunnerName field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetRunnerName() string { if a == nil || a.RunnerName == nil { return "" } return *a.RunnerName } // GetSourceVersion returns the SourceVersion field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetSourceVersion() string { if a == nil || a.SourceVersion == nil { return "" } return *a.SourceVersion } // GetStartedAt returns the StartedAt field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetStartedAt() Timestamp { if a == nil || a.StartedAt == nil { return Timestamp{} } return *a.StartedAt } // GetTargetLogin returns the TargetLogin field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetTargetLogin() string { if a == nil || a.TargetLogin == nil { return "" } return *a.TargetLogin } // GetTargetVersion returns the TargetVersion field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetTargetVersion() string { if a == nil || a.TargetVersion == nil { return "" } return *a.TargetVersion } // GetTeam returns the Team field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetTeam() string { if a == nil || a.Team == nil { return "" } return *a.Team } // GetTimestamp returns the Timestamp field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetTimestamp() Timestamp { if a == nil || a.Timestamp == nil { return Timestamp{} } return *a.Timestamp } // GetTransportProtocol returns the TransportProtocol field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetTransportProtocol() int { if a == nil || a.TransportProtocol == nil { return 0 } return *a.TransportProtocol } // GetTransportProtocolName returns the TransportProtocolName field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetTransportProtocolName() string { if a == nil || a.TransportProtocolName == nil { return "" } return *a.TransportProtocolName } // GetTriggerID returns the TriggerID field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetTriggerID() int64 { if a == nil || a.TriggerID == nil { return 0 } return *a.TriggerID } // GetUser returns the User field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetUser() string { if a == nil || a.User == nil { return "" } return *a.User } // GetVisibility returns the Visibility field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetVisibility() string { if a == nil || a.Visibility == nil { return "" } return *a.Visibility } // GetWorkflowID returns the WorkflowID field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetWorkflowID() int64 { if a == nil || a.WorkflowID == nil { return 0 } return *a.WorkflowID } // GetWorkflowRunID returns the WorkflowRunID field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetWorkflowRunID() int64 { if a == nil || a.WorkflowRunID == nil { return 0 } return *a.WorkflowRunID } // GetApp returns the App field. func (a *Authorization) GetApp() *AuthorizationApp { if a == nil { return nil } return a.App } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (a *Authorization) GetCreatedAt() Timestamp { if a == nil || a.CreatedAt == nil { return Timestamp{} } return *a.CreatedAt } // GetFingerprint returns the Fingerprint field if it's non-nil, zero value otherwise. func (a *Authorization) GetFingerprint() string { if a == nil || a.Fingerprint == nil { return "" } return *a.Fingerprint } // GetHashedToken returns the HashedToken field if it's non-nil, zero value otherwise. func (a *Authorization) GetHashedToken() string { if a == nil || a.HashedToken == nil { return "" } return *a.HashedToken } // GetID returns the ID field if it's non-nil, zero value otherwise. func (a *Authorization) GetID() int64 { if a == nil || a.ID == nil { return 0 } return *a.ID } // GetNote returns the Note field if it's non-nil, zero value otherwise. func (a *Authorization) GetNote() string { if a == nil || a.Note == nil { return "" } return *a.Note } // GetNoteURL returns the NoteURL field if it's non-nil, zero value otherwise. func (a *Authorization) GetNoteURL() string { if a == nil || a.NoteURL == nil { return "" } return *a.NoteURL } // GetToken returns the Token field if it's non-nil, zero value otherwise. func (a *Authorization) GetToken() string { if a == nil || a.Token == nil { return "" } return *a.Token } // GetTokenLastEight returns the TokenLastEight field if it's non-nil, zero value otherwise. func (a *Authorization) GetTokenLastEight() string { if a == nil || a.TokenLastEight == nil { return "" } return *a.TokenLastEight } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (a *Authorization) GetUpdatedAt() Timestamp { if a == nil || a.UpdatedAt == nil { return Timestamp{} } return *a.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (a *Authorization) GetURL() string { if a == nil || a.URL == nil { return "" } return *a.URL } // GetUser returns the User field. func (a *Authorization) GetUser() *User { if a == nil { return nil } return a.User } // GetClientID returns the ClientID field if it's non-nil, zero value otherwise. func (a *AuthorizationApp) GetClientID() string { if a == nil || a.ClientID == nil { return "" } return *a.ClientID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (a *AuthorizationApp) GetName() string { if a == nil || a.Name == nil { return "" } return *a.Name } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (a *AuthorizationApp) GetURL() string { if a == nil || a.URL == nil { return "" } return *a.URL } // GetClientID returns the ClientID field if it's non-nil, zero value otherwise. func (a *AuthorizationRequest) GetClientID() string { if a == nil || a.ClientID == nil { return "" } return *a.ClientID } // GetClientSecret returns the ClientSecret field if it's non-nil, zero value otherwise. func (a *AuthorizationRequest) GetClientSecret() string { if a == nil || a.ClientSecret == nil { return "" } return *a.ClientSecret } // GetFingerprint returns the Fingerprint field if it's non-nil, zero value otherwise. func (a *AuthorizationRequest) GetFingerprint() string { if a == nil || a.Fingerprint == nil { return "" } return *a.Fingerprint } // GetNote returns the Note field if it's non-nil, zero value otherwise. func (a *AuthorizationRequest) GetNote() string { if a == nil || a.Note == nil { return "" } return *a.Note } // GetNoteURL returns the NoteURL field if it's non-nil, zero value otherwise. func (a *AuthorizationRequest) GetNoteURL() string { if a == nil || a.NoteURL == nil { return "" } return *a.NoteURL } // GetFingerprint returns the Fingerprint field if it's non-nil, zero value otherwise. func (a *AuthorizationUpdateRequest) GetFingerprint() string { if a == nil || a.Fingerprint == nil { return "" } return *a.Fingerprint } // GetNote returns the Note field if it's non-nil, zero value otherwise. func (a *AuthorizationUpdateRequest) GetNote() string { if a == nil || a.Note == nil { return "" } return *a.Note } // GetNoteURL returns the NoteURL field if it's non-nil, zero value otherwise. func (a *AuthorizationUpdateRequest) GetNoteURL() string { if a == nil || a.NoteURL == nil { return "" } return *a.NoteURL } // GetAppID returns the AppID field if it's non-nil, zero value otherwise. func (a *AutoTriggerCheck) GetAppID() int64 { if a == nil || a.AppID == nil { return 0 } return *a.AppID } // GetSetting returns the Setting field if it's non-nil, zero value otherwise. func (a *AutoTriggerCheck) GetSetting() bool { if a == nil || a.Setting == nil { return false } return *a.Setting } // GetContent returns the Content field if it's non-nil, zero value otherwise. func (b *Blob) GetContent() string { if b == nil || b.Content == nil { return "" } return *b.Content } // GetEncoding returns the Encoding field if it's non-nil, zero value otherwise. func (b *Blob) GetEncoding() string { if b == nil || b.Encoding == nil { return "" } return *b.Encoding } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (b *Blob) GetNodeID() string { if b == nil || b.NodeID == nil { return "" } return *b.NodeID } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (b *Blob) GetSHA() string { if b == nil || b.SHA == nil { return "" } return *b.SHA } // GetSize returns the Size field if it's non-nil, zero value otherwise. func (b *Blob) GetSize() int { if b == nil || b.Size == nil { return 0 } return *b.Size } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (b *Blob) GetURL() string { if b == nil || b.URL == nil { return "" } return *b.URL } // GetCommit returns the Commit field. func (b *Branch) GetCommit() *RepositoryCommit { if b == nil { return nil } return b.Commit } // GetName returns the Name field if it's non-nil, zero value otherwise. func (b *Branch) GetName() string { if b == nil || b.Name == nil { return "" } return *b.Name } // GetProtected returns the Protected field if it's non-nil, zero value otherwise. func (b *Branch) GetProtected() bool { if b == nil || b.Protected == nil { return false } return *b.Protected } // GetCommit returns the Commit field. func (b *BranchCommit) GetCommit() *Commit { if b == nil { return nil } return b.Commit } // GetName returns the Name field if it's non-nil, zero value otherwise. func (b *BranchCommit) GetName() string { if b == nil || b.Name == nil { return "" } return *b.Name } // GetProtected returns the Protected field if it's non-nil, zero value otherwise. func (b *BranchCommit) GetProtected() bool { if b == nil || b.Protected == nil { return false } return *b.Protected } // GetProtected returns the Protected field if it's non-nil, zero value otherwise. func (b *BranchListOptions) GetProtected() bool { if b == nil || b.Protected == nil { return false } return *b.Protected } // GetCustomBranchPolicies returns the CustomBranchPolicies field if it's non-nil, zero value otherwise. func (b *BranchPolicy) GetCustomBranchPolicies() bool { if b == nil || b.CustomBranchPolicies == nil { return false } return *b.CustomBranchPolicies } // GetProtectedBranches returns the ProtectedBranches field if it's non-nil, zero value otherwise. func (b *BranchPolicy) GetProtectedBranches() bool { if b == nil || b.ProtectedBranches == nil { return false } return *b.ProtectedBranches } // GetApp returns the App field. func (c *CheckRun) GetApp() *App { if c == nil { return nil } return c.App } // GetCheckSuite returns the CheckSuite field. func (c *CheckRun) GetCheckSuite() *CheckSuite { if c == nil { return nil } return c.CheckSuite } // GetCompletedAt returns the CompletedAt field if it's non-nil, zero value otherwise. func (c *CheckRun) GetCompletedAt() Timestamp { if c == nil || c.CompletedAt == nil { return Timestamp{} } return *c.CompletedAt } // GetConclusion returns the Conclusion field if it's non-nil, zero value otherwise. func (c *CheckRun) GetConclusion() string { if c == nil || c.Conclusion == nil { return "" } return *c.Conclusion } // GetDetailsURL returns the DetailsURL field if it's non-nil, zero value otherwise. func (c *CheckRun) GetDetailsURL() string { if c == nil || c.DetailsURL == nil { return "" } return *c.DetailsURL } // GetExternalID returns the ExternalID field if it's non-nil, zero value otherwise. func (c *CheckRun) GetExternalID() string { if c == nil || c.ExternalID == nil { return "" } return *c.ExternalID } // GetHeadSHA returns the HeadSHA field if it's non-nil, zero value otherwise. func (c *CheckRun) GetHeadSHA() string { if c == nil || c.HeadSHA == nil { return "" } return *c.HeadSHA } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (c *CheckRun) GetHTMLURL() string { if c == nil || c.HTMLURL == nil { return "" } return *c.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (c *CheckRun) GetID() int64 { if c == nil || c.ID == nil { return 0 } return *c.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (c *CheckRun) GetName() string { if c == nil || c.Name == nil { return "" } return *c.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (c *CheckRun) GetNodeID() string { if c == nil || c.NodeID == nil { return "" } return *c.NodeID } // GetOutput returns the Output field. func (c *CheckRun) GetOutput() *CheckRunOutput { if c == nil { return nil } return c.Output } // GetStartedAt returns the StartedAt field if it's non-nil, zero value otherwise. func (c *CheckRun) GetStartedAt() Timestamp { if c == nil || c.StartedAt == nil { return Timestamp{} } return *c.StartedAt } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (c *CheckRun) GetStatus() string { if c == nil || c.Status == nil { return "" } return *c.Status } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (c *CheckRun) GetURL() string { if c == nil || c.URL == nil { return "" } return *c.URL } // GetAnnotationLevel returns the AnnotationLevel field if it's non-nil, zero value otherwise. func (c *CheckRunAnnotation) GetAnnotationLevel() string { if c == nil || c.AnnotationLevel == nil { return "" } return *c.AnnotationLevel } // GetEndColumn returns the EndColumn field if it's non-nil, zero value otherwise. func (c *CheckRunAnnotation) GetEndColumn() int { if c == nil || c.EndColumn == nil { return 0 } return *c.EndColumn } // GetEndLine returns the EndLine field if it's non-nil, zero value otherwise. func (c *CheckRunAnnotation) GetEndLine() int { if c == nil || c.EndLine == nil { return 0 } return *c.EndLine } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (c *CheckRunAnnotation) GetMessage() string { if c == nil || c.Message == nil { return "" } return *c.Message } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (c *CheckRunAnnotation) GetPath() string { if c == nil || c.Path == nil { return "" } return *c.Path } // GetRawDetails returns the RawDetails field if it's non-nil, zero value otherwise. func (c *CheckRunAnnotation) GetRawDetails() string { if c == nil || c.RawDetails == nil { return "" } return *c.RawDetails } // GetStartColumn returns the StartColumn field if it's non-nil, zero value otherwise. func (c *CheckRunAnnotation) GetStartColumn() int { if c == nil || c.StartColumn == nil { return 0 } return *c.StartColumn } // GetStartLine returns the StartLine field if it's non-nil, zero value otherwise. func (c *CheckRunAnnotation) GetStartLine() int { if c == nil || c.StartLine == nil { return 0 } return *c.StartLine } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (c *CheckRunAnnotation) GetTitle() string { if c == nil || c.Title == nil { return "" } return *c.Title } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (c *CheckRunEvent) GetAction() string { if c == nil || c.Action == nil { return "" } return *c.Action } // GetCheckRun returns the CheckRun field. func (c *CheckRunEvent) GetCheckRun() *CheckRun { if c == nil { return nil } return c.CheckRun } // GetInstallation returns the Installation field. func (c *CheckRunEvent) GetInstallation() *Installation { if c == nil { return nil } return c.Installation } // GetOrg returns the Org field. func (c *CheckRunEvent) GetOrg() *Organization { if c == nil { return nil } return c.Org } // GetRepo returns the Repo field. func (c *CheckRunEvent) GetRepo() *Repository { if c == nil { return nil } return c.Repo } // GetRequestedAction returns the RequestedAction field. func (c *CheckRunEvent) GetRequestedAction() *RequestedAction { if c == nil { return nil } return c.RequestedAction } // GetSender returns the Sender field. func (c *CheckRunEvent) GetSender() *User { if c == nil { return nil } return c.Sender } // GetAlt returns the Alt field if it's non-nil, zero value otherwise. func (c *CheckRunImage) GetAlt() string { if c == nil || c.Alt == nil { return "" } return *c.Alt } // GetCaption returns the Caption field if it's non-nil, zero value otherwise. func (c *CheckRunImage) GetCaption() string { if c == nil || c.Caption == nil { return "" } return *c.Caption } // GetImageURL returns the ImageURL field if it's non-nil, zero value otherwise. func (c *CheckRunImage) GetImageURL() string { if c == nil || c.ImageURL == nil { return "" } return *c.ImageURL } // GetAnnotationsCount returns the AnnotationsCount field if it's non-nil, zero value otherwise. func (c *CheckRunOutput) GetAnnotationsCount() int { if c == nil || c.AnnotationsCount == nil { return 0 } return *c.AnnotationsCount } // GetAnnotationsURL returns the AnnotationsURL field if it's non-nil, zero value otherwise. func (c *CheckRunOutput) GetAnnotationsURL() string { if c == nil || c.AnnotationsURL == nil { return "" } return *c.AnnotationsURL } // GetSummary returns the Summary field if it's non-nil, zero value otherwise. func (c *CheckRunOutput) GetSummary() string { if c == nil || c.Summary == nil { return "" } return *c.Summary } // GetText returns the Text field if it's non-nil, zero value otherwise. func (c *CheckRunOutput) GetText() string { if c == nil || c.Text == nil { return "" } return *c.Text } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (c *CheckRunOutput) GetTitle() string { if c == nil || c.Title == nil { return "" } return *c.Title } // GetAfterSHA returns the AfterSHA field if it's non-nil, zero value otherwise. func (c *CheckSuite) GetAfterSHA() string { if c == nil || c.AfterSHA == nil { return "" } return *c.AfterSHA } // GetApp returns the App field. func (c *CheckSuite) GetApp() *App { if c == nil { return nil } return c.App } // GetBeforeSHA returns the BeforeSHA field if it's non-nil, zero value otherwise. func (c *CheckSuite) GetBeforeSHA() string { if c == nil || c.BeforeSHA == nil { return "" } return *c.BeforeSHA } // GetConclusion returns the Conclusion field if it's non-nil, zero value otherwise. func (c *CheckSuite) GetConclusion() string { if c == nil || c.Conclusion == nil { return "" } return *c.Conclusion } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (c *CheckSuite) GetCreatedAt() Timestamp { if c == nil || c.CreatedAt == nil { return Timestamp{} } return *c.CreatedAt } // GetHeadBranch returns the HeadBranch field if it's non-nil, zero value otherwise. func (c *CheckSuite) GetHeadBranch() string { if c == nil || c.HeadBranch == nil { return "" } return *c.HeadBranch } // GetHeadCommit returns the HeadCommit field. func (c *CheckSuite) GetHeadCommit() *Commit { if c == nil { return nil } return c.HeadCommit } // GetHeadSHA returns the HeadSHA field if it's non-nil, zero value otherwise. func (c *CheckSuite) GetHeadSHA() string { if c == nil || c.HeadSHA == nil { return "" } return *c.HeadSHA } // GetID returns the ID field if it's non-nil, zero value otherwise. func (c *CheckSuite) GetID() int64 { if c == nil || c.ID == nil { return 0 } return *c.ID } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (c *CheckSuite) GetNodeID() string { if c == nil || c.NodeID == nil { return "" } return *c.NodeID } // GetRepository returns the Repository field. func (c *CheckSuite) GetRepository() *Repository { if c == nil { return nil } return c.Repository } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (c *CheckSuite) GetStatus() string { if c == nil || c.Status == nil { return "" } return *c.Status } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (c *CheckSuite) GetUpdatedAt() Timestamp { if c == nil || c.UpdatedAt == nil { return Timestamp{} } return *c.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (c *CheckSuite) GetURL() string { if c == nil || c.URL == nil { return "" } return *c.URL } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (c *CheckSuiteEvent) GetAction() string { if c == nil || c.Action == nil { return "" } return *c.Action } // GetCheckSuite returns the CheckSuite field. func (c *CheckSuiteEvent) GetCheckSuite() *CheckSuite { if c == nil { return nil } return c.CheckSuite } // GetInstallation returns the Installation field. func (c *CheckSuiteEvent) GetInstallation() *Installation { if c == nil { return nil } return c.Installation } // GetOrg returns the Org field. func (c *CheckSuiteEvent) GetOrg() *Organization { if c == nil { return nil } return c.Org } // GetRepo returns the Repo field. func (c *CheckSuiteEvent) GetRepo() *Repository { if c == nil { return nil } return c.Repo } // GetSender returns the Sender field. func (c *CheckSuiteEvent) GetSender() *User { if c == nil { return nil } return c.Sender } // GetPreferences returns the Preferences field. func (c *CheckSuitePreferenceResults) GetPreferences() *PreferenceList { if c == nil { return nil } return c.Preferences } // GetRepository returns the Repository field. func (c *CheckSuitePreferenceResults) GetRepository() *Repository { if c == nil { return nil } return c.Repository } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (c *CodeOfConduct) GetBody() string { if c == nil || c.Body == nil { return "" } return *c.Body } // GetKey returns the Key field if it's non-nil, zero value otherwise. func (c *CodeOfConduct) GetKey() string { if c == nil || c.Key == nil { return "" } return *c.Key } // GetName returns the Name field if it's non-nil, zero value otherwise. func (c *CodeOfConduct) GetName() string { if c == nil || c.Name == nil { return "" } return *c.Name } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (c *CodeOfConduct) GetURL() string { if c == nil || c.URL == nil { return "" } return *c.URL } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (c *CodeResult) GetHTMLURL() string { if c == nil || c.HTMLURL == nil { return "" } return *c.HTMLURL } // GetName returns the Name field if it's non-nil, zero value otherwise. func (c *CodeResult) GetName() string { if c == nil || c.Name == nil { return "" } return *c.Name } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (c *CodeResult) GetPath() string { if c == nil || c.Path == nil { return "" } return *c.Path } // GetRepository returns the Repository field. func (c *CodeResult) GetRepository() *Repository { if c == nil { return nil } return c.Repository } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (c *CodeResult) GetSHA() string { if c == nil || c.SHA == nil { return "" } return *c.SHA } // GetIncompleteResults returns the IncompleteResults field if it's non-nil, zero value otherwise. func (c *CodeSearchResult) GetIncompleteResults() bool { if c == nil || c.IncompleteResults == nil { return false } return *c.IncompleteResults } // GetTotal returns the Total field if it's non-nil, zero value otherwise. func (c *CodeSearchResult) GetTotal() int { if c == nil || c.Total == nil { return 0 } return *c.Total } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (c *CollaboratorInvitation) GetCreatedAt() Timestamp { if c == nil || c.CreatedAt == nil { return Timestamp{} } return *c.CreatedAt } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (c *CollaboratorInvitation) GetHTMLURL() string { if c == nil || c.HTMLURL == nil { return "" } return *c.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (c *CollaboratorInvitation) GetID() int64 { if c == nil || c.ID == nil { return 0 } return *c.ID } // GetInvitee returns the Invitee field. func (c *CollaboratorInvitation) GetInvitee() *User { if c == nil { return nil } return c.Invitee } // GetInviter returns the Inviter field. func (c *CollaboratorInvitation) GetInviter() *User { if c == nil { return nil } return c.Inviter } // GetPermissions returns the Permissions field if it's non-nil, zero value otherwise. func (c *CollaboratorInvitation) GetPermissions() string { if c == nil || c.Permissions == nil { return "" } return *c.Permissions } // GetRepo returns the Repo field. func (c *CollaboratorInvitation) GetRepo() *Repository { if c == nil { return nil } return c.Repo } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (c *CollaboratorInvitation) GetURL() string { if c == nil || c.URL == nil { return "" } return *c.URL } // GetCommitURL returns the CommitURL field if it's non-nil, zero value otherwise. func (c *CombinedStatus) GetCommitURL() string { if c == nil || c.CommitURL == nil { return "" } return *c.CommitURL } // GetName returns the Name field if it's non-nil, zero value otherwise. func (c *CombinedStatus) GetName() string { if c == nil || c.Name == nil { return "" } return *c.Name } // GetRepositoryURL returns the RepositoryURL field if it's non-nil, zero value otherwise. func (c *CombinedStatus) GetRepositoryURL() string { if c == nil || c.RepositoryURL == nil { return "" } return *c.RepositoryURL } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (c *CombinedStatus) GetSHA() string { if c == nil || c.SHA == nil { return "" } return *c.SHA } // GetState returns the State field if it's non-nil, zero value otherwise. func (c *CombinedStatus) GetState() string { if c == nil || c.State == nil { return "" } return *c.State } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (c *CombinedStatus) GetTotalCount() int { if c == nil || c.TotalCount == nil { return 0 } return *c.TotalCount } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (c *Comment) GetCreatedAt() time.Time { if c == nil || c.CreatedAt == nil { return time.Time{} } return *c.CreatedAt } // GetTotalCommitComments returns the TotalCommitComments field if it's non-nil, zero value otherwise. func (c *CommentStats) GetTotalCommitComments() int { if c == nil || c.TotalCommitComments == nil { return 0 } return *c.TotalCommitComments } // GetTotalGistComments returns the TotalGistComments field if it's non-nil, zero value otherwise. func (c *CommentStats) GetTotalGistComments() int { if c == nil || c.TotalGistComments == nil { return 0 } return *c.TotalGistComments } // GetTotalIssueComments returns the TotalIssueComments field if it's non-nil, zero value otherwise. func (c *CommentStats) GetTotalIssueComments() int { if c == nil || c.TotalIssueComments == nil { return 0 } return *c.TotalIssueComments } // GetTotalPullRequestComments returns the TotalPullRequestComments field if it's non-nil, zero value otherwise. func (c *CommentStats) GetTotalPullRequestComments() int { if c == nil || c.TotalPullRequestComments == nil { return 0 } return *c.TotalPullRequestComments } // GetAuthor returns the Author field. func (c *Commit) GetAuthor() *CommitAuthor { if c == nil { return nil } return c.Author } // GetCommentCount returns the CommentCount field if it's non-nil, zero value otherwise. func (c *Commit) GetCommentCount() int { if c == nil || c.CommentCount == nil { return 0 } return *c.CommentCount } // GetCommitter returns the Committer field. func (c *Commit) GetCommitter() *CommitAuthor { if c == nil { return nil } return c.Committer } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (c *Commit) GetHTMLURL() string { if c == nil || c.HTMLURL == nil { return "" } return *c.HTMLURL } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (c *Commit) GetMessage() string { if c == nil || c.Message == nil { return "" } return *c.Message } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (c *Commit) GetNodeID() string { if c == nil || c.NodeID == nil { return "" } return *c.NodeID } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (c *Commit) GetSHA() string { if c == nil || c.SHA == nil { return "" } return *c.SHA } // GetStats returns the Stats field. func (c *Commit) GetStats() *CommitStats { if c == nil { return nil } return c.Stats } // GetTree returns the Tree field. func (c *Commit) GetTree() *Tree { if c == nil { return nil } return c.Tree } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (c *Commit) GetURL() string { if c == nil || c.URL == nil { return "" } return *c.URL } // GetVerification returns the Verification field. func (c *Commit) GetVerification() *SignatureVerification { if c == nil { return nil } return c.Verification } // GetDate returns the Date field if it's non-nil, zero value otherwise. func (c *CommitAuthor) GetDate() time.Time { if c == nil || c.Date == nil { return time.Time{} } return *c.Date } // GetEmail returns the Email field if it's non-nil, zero value otherwise. func (c *CommitAuthor) GetEmail() string { if c == nil || c.Email == nil { return "" } return *c.Email } // GetLogin returns the Login field if it's non-nil, zero value otherwise. func (c *CommitAuthor) GetLogin() string { if c == nil || c.Login == nil { return "" } return *c.Login } // GetName returns the Name field if it's non-nil, zero value otherwise. func (c *CommitAuthor) GetName() string { if c == nil || c.Name == nil { return "" } return *c.Name } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (c *CommitCommentEvent) GetAction() string { if c == nil || c.Action == nil { return "" } return *c.Action } // GetComment returns the Comment field. func (c *CommitCommentEvent) GetComment() *RepositoryComment { if c == nil { return nil } return c.Comment } // GetInstallation returns the Installation field. func (c *CommitCommentEvent) GetInstallation() *Installation { if c == nil { return nil } return c.Installation } // GetRepo returns the Repo field. func (c *CommitCommentEvent) GetRepo() *Repository { if c == nil { return nil } return c.Repo } // GetSender returns the Sender field. func (c *CommitCommentEvent) GetSender() *User { if c == nil { return nil } return c.Sender } // GetAdditions returns the Additions field if it's non-nil, zero value otherwise. func (c *CommitFile) GetAdditions() int { if c == nil || c.Additions == nil { return 0 } return *c.Additions } // GetBlobURL returns the BlobURL field if it's non-nil, zero value otherwise. func (c *CommitFile) GetBlobURL() string { if c == nil || c.BlobURL == nil { return "" } return *c.BlobURL } // GetChanges returns the Changes field if it's non-nil, zero value otherwise. func (c *CommitFile) GetChanges() int { if c == nil || c.Changes == nil { return 0 } return *c.Changes } // GetContentsURL returns the ContentsURL field if it's non-nil, zero value otherwise. func (c *CommitFile) GetContentsURL() string { if c == nil || c.ContentsURL == nil { return "" } return *c.ContentsURL } // GetDeletions returns the Deletions field if it's non-nil, zero value otherwise. func (c *CommitFile) GetDeletions() int { if c == nil || c.Deletions == nil { return 0 } return *c.Deletions } // GetFilename returns the Filename field if it's non-nil, zero value otherwise. func (c *CommitFile) GetFilename() string { if c == nil || c.Filename == nil { return "" } return *c.Filename } // GetPatch returns the Patch field if it's non-nil, zero value otherwise. func (c *CommitFile) GetPatch() string { if c == nil || c.Patch == nil { return "" } return *c.Patch } // GetPreviousFilename returns the PreviousFilename field if it's non-nil, zero value otherwise. func (c *CommitFile) GetPreviousFilename() string { if c == nil || c.PreviousFilename == nil { return "" } return *c.PreviousFilename } // GetRawURL returns the RawURL field if it's non-nil, zero value otherwise. func (c *CommitFile) GetRawURL() string { if c == nil || c.RawURL == nil { return "" } return *c.RawURL } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (c *CommitFile) GetSHA() string { if c == nil || c.SHA == nil { return "" } return *c.SHA } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (c *CommitFile) GetStatus() string { if c == nil || c.Status == nil { return "" } return *c.Status } // GetAuthor returns the Author field. func (c *CommitResult) GetAuthor() *User { if c == nil { return nil } return c.Author } // GetCommentsURL returns the CommentsURL field if it's non-nil, zero value otherwise. func (c *CommitResult) GetCommentsURL() string { if c == nil || c.CommentsURL == nil { return "" } return *c.CommentsURL } // GetCommit returns the Commit field. func (c *CommitResult) GetCommit() *Commit { if c == nil { return nil } return c.Commit } // GetCommitter returns the Committer field. func (c *CommitResult) GetCommitter() *User { if c == nil { return nil } return c.Committer } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (c *CommitResult) GetHTMLURL() string { if c == nil || c.HTMLURL == nil { return "" } return *c.HTMLURL } // GetRepository returns the Repository field. func (c *CommitResult) GetRepository() *Repository { if c == nil { return nil } return c.Repository } // GetScore returns the Score field. func (c *CommitResult) GetScore() *float64 { if c == nil { return nil } return c.Score } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (c *CommitResult) GetSHA() string { if c == nil || c.SHA == nil { return "" } return *c.SHA } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (c *CommitResult) GetURL() string { if c == nil || c.URL == nil { return "" } return *c.URL } // GetAheadBy returns the AheadBy field if it's non-nil, zero value otherwise. func (c *CommitsComparison) GetAheadBy() int { if c == nil || c.AheadBy == nil { return 0 } return *c.AheadBy } // GetBaseCommit returns the BaseCommit field. func (c *CommitsComparison) GetBaseCommit() *RepositoryCommit { if c == nil { return nil } return c.BaseCommit } // GetBehindBy returns the BehindBy field if it's non-nil, zero value otherwise. func (c *CommitsComparison) GetBehindBy() int { if c == nil || c.BehindBy == nil { return 0 } return *c.BehindBy } // GetDiffURL returns the DiffURL field if it's non-nil, zero value otherwise. func (c *CommitsComparison) GetDiffURL() string { if c == nil || c.DiffURL == nil { return "" } return *c.DiffURL } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (c *CommitsComparison) GetHTMLURL() string { if c == nil || c.HTMLURL == nil { return "" } return *c.HTMLURL } // GetMergeBaseCommit returns the MergeBaseCommit field. func (c *CommitsComparison) GetMergeBaseCommit() *RepositoryCommit { if c == nil { return nil } return c.MergeBaseCommit } // GetPatchURL returns the PatchURL field if it's non-nil, zero value otherwise. func (c *CommitsComparison) GetPatchURL() string { if c == nil || c.PatchURL == nil { return "" } return *c.PatchURL } // GetPermalinkURL returns the PermalinkURL field if it's non-nil, zero value otherwise. func (c *CommitsComparison) GetPermalinkURL() string { if c == nil || c.PermalinkURL == nil { return "" } return *c.PermalinkURL } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (c *CommitsComparison) GetStatus() string { if c == nil || c.Status == nil { return "" } return *c.Status } // GetTotalCommits returns the TotalCommits field if it's non-nil, zero value otherwise. func (c *CommitsComparison) GetTotalCommits() int { if c == nil || c.TotalCommits == nil { return 0 } return *c.TotalCommits } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (c *CommitsComparison) GetURL() string { if c == nil || c.URL == nil { return "" } return *c.URL } // GetIncompleteResults returns the IncompleteResults field if it's non-nil, zero value otherwise. func (c *CommitsSearchResult) GetIncompleteResults() bool { if c == nil || c.IncompleteResults == nil { return false } return *c.IncompleteResults } // GetTotal returns the Total field if it's non-nil, zero value otherwise. func (c *CommitsSearchResult) GetTotal() int { if c == nil || c.Total == nil { return 0 } return *c.Total } // GetAdditions returns the Additions field if it's non-nil, zero value otherwise. func (c *CommitStats) GetAdditions() int { if c == nil || c.Additions == nil { return 0 } return *c.Additions } // GetDeletions returns the Deletions field if it's non-nil, zero value otherwise. func (c *CommitStats) GetDeletions() int { if c == nil || c.Deletions == nil { return 0 } return *c.Deletions } // GetTotal returns the Total field if it's non-nil, zero value otherwise. func (c *CommitStats) GetTotal() int { if c == nil || c.Total == nil { return 0 } return *c.Total } // GetCodeOfConduct returns the CodeOfConduct field. func (c *CommunityHealthFiles) GetCodeOfConduct() *Metric { if c == nil { return nil } return c.CodeOfConduct } // GetContributing returns the Contributing field. func (c *CommunityHealthFiles) GetContributing() *Metric { if c == nil { return nil } return c.Contributing } // GetIssueTemplate returns the IssueTemplate field. func (c *CommunityHealthFiles) GetIssueTemplate() *Metric { if c == nil { return nil } return c.IssueTemplate } // GetLicense returns the License field. func (c *CommunityHealthFiles) GetLicense() *Metric { if c == nil { return nil } return c.License } // GetPullRequestTemplate returns the PullRequestTemplate field. func (c *CommunityHealthFiles) GetPullRequestTemplate() *Metric { if c == nil { return nil } return c.PullRequestTemplate } // GetReadme returns the Readme field. func (c *CommunityHealthFiles) GetReadme() *Metric { if c == nil { return nil } return c.Readme } // GetFiles returns the Files field. func (c *CommunityHealthMetrics) GetFiles() *CommunityHealthFiles { if c == nil { return nil } return c.Files } // GetHealthPercentage returns the HealthPercentage field if it's non-nil, zero value otherwise. func (c *CommunityHealthMetrics) GetHealthPercentage() int { if c == nil || c.HealthPercentage == nil { return 0 } return *c.HealthPercentage } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (c *CommunityHealthMetrics) GetUpdatedAt() time.Time { if c == nil || c.UpdatedAt == nil { return time.Time{} } return *c.UpdatedAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (c *ContentReference) GetID() int64 { if c == nil || c.ID == nil { return 0 } return *c.ID } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (c *ContentReference) GetNodeID() string { if c == nil || c.NodeID == nil { return "" } return *c.NodeID } // GetReference returns the Reference field if it's non-nil, zero value otherwise. func (c *ContentReference) GetReference() string { if c == nil || c.Reference == nil { return "" } return *c.Reference } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (c *ContentReferenceEvent) GetAction() string { if c == nil || c.Action == nil { return "" } return *c.Action } // GetContentReference returns the ContentReference field. func (c *ContentReferenceEvent) GetContentReference() *ContentReference { if c == nil { return nil } return c.ContentReference } // GetInstallation returns the Installation field. func (c *ContentReferenceEvent) GetInstallation() *Installation { if c == nil { return nil } return c.Installation } // GetRepo returns the Repo field. func (c *ContentReferenceEvent) GetRepo() *Repository { if c == nil { return nil } return c.Repo } // GetSender returns the Sender field. func (c *ContentReferenceEvent) GetSender() *User { if c == nil { return nil } return c.Sender } // GetAvatarURL returns the AvatarURL field if it's non-nil, zero value otherwise. func (c *Contributor) GetAvatarURL() string { if c == nil || c.AvatarURL == nil { return "" } return *c.AvatarURL } // GetContributions returns the Contributions field if it's non-nil, zero value otherwise. func (c *Contributor) GetContributions() int { if c == nil || c.Contributions == nil { return 0 } return *c.Contributions } // GetEmail returns the Email field if it's non-nil, zero value otherwise. func (c *Contributor) GetEmail() string { if c == nil || c.Email == nil { return "" } return *c.Email } // GetEventsURL returns the EventsURL field if it's non-nil, zero value otherwise. func (c *Contributor) GetEventsURL() string { if c == nil || c.EventsURL == nil { return "" } return *c.EventsURL } // GetFollowersURL returns the FollowersURL field if it's non-nil, zero value otherwise. func (c *Contributor) GetFollowersURL() string { if c == nil || c.FollowersURL == nil { return "" } return *c.FollowersURL } // GetFollowingURL returns the FollowingURL field if it's non-nil, zero value otherwise. func (c *Contributor) GetFollowingURL() string { if c == nil || c.FollowingURL == nil { return "" } return *c.FollowingURL } // GetGistsURL returns the GistsURL field if it's non-nil, zero value otherwise. func (c *Contributor) GetGistsURL() string { if c == nil || c.GistsURL == nil { return "" } return *c.GistsURL } // GetGravatarID returns the GravatarID field if it's non-nil, zero value otherwise. func (c *Contributor) GetGravatarID() string { if c == nil || c.GravatarID == nil { return "" } return *c.GravatarID } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (c *Contributor) GetHTMLURL() string { if c == nil || c.HTMLURL == nil { return "" } return *c.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (c *Contributor) GetID() int64 { if c == nil || c.ID == nil { return 0 } return *c.ID } // GetLogin returns the Login field if it's non-nil, zero value otherwise. func (c *Contributor) GetLogin() string { if c == nil || c.Login == nil { return "" } return *c.Login } // GetName returns the Name field if it's non-nil, zero value otherwise. func (c *Contributor) GetName() string { if c == nil || c.Name == nil { return "" } return *c.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (c *Contributor) GetNodeID() string { if c == nil || c.NodeID == nil { return "" } return *c.NodeID } // GetOrganizationsURL returns the OrganizationsURL field if it's non-nil, zero value otherwise. func (c *Contributor) GetOrganizationsURL() string { if c == nil || c.OrganizationsURL == nil { return "" } return *c.OrganizationsURL } // GetReceivedEventsURL returns the ReceivedEventsURL field if it's non-nil, zero value otherwise. func (c *Contributor) GetReceivedEventsURL() string { if c == nil || c.ReceivedEventsURL == nil { return "" } return *c.ReceivedEventsURL } // GetReposURL returns the ReposURL field if it's non-nil, zero value otherwise. func (c *Contributor) GetReposURL() string { if c == nil || c.ReposURL == nil { return "" } return *c.ReposURL } // GetSiteAdmin returns the SiteAdmin field if it's non-nil, zero value otherwise. func (c *Contributor) GetSiteAdmin() bool { if c == nil || c.SiteAdmin == nil { return false } return *c.SiteAdmin } // GetStarredURL returns the StarredURL field if it's non-nil, zero value otherwise. func (c *Contributor) GetStarredURL() string { if c == nil || c.StarredURL == nil { return "" } return *c.StarredURL } // GetSubscriptionsURL returns the SubscriptionsURL field if it's non-nil, zero value otherwise. func (c *Contributor) GetSubscriptionsURL() string { if c == nil || c.SubscriptionsURL == nil { return "" } return *c.SubscriptionsURL } // GetType returns the Type field if it's non-nil, zero value otherwise. func (c *Contributor) GetType() string { if c == nil || c.Type == nil { return "" } return *c.Type } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (c *Contributor) GetURL() string { if c == nil || c.URL == nil { return "" } return *c.URL } // GetAuthor returns the Author field. func (c *ContributorStats) GetAuthor() *Contributor { if c == nil { return nil } return c.Author } // GetTotal returns the Total field if it's non-nil, zero value otherwise. func (c *ContributorStats) GetTotal() int { if c == nil || c.Total == nil { return 0 } return *c.Total } // GetCompletedAt returns the CompletedAt field if it's non-nil, zero value otherwise. func (c *CreateCheckRunOptions) GetCompletedAt() Timestamp { if c == nil || c.CompletedAt == nil { return Timestamp{} } return *c.CompletedAt } // GetConclusion returns the Conclusion field if it's non-nil, zero value otherwise. func (c *CreateCheckRunOptions) GetConclusion() string { if c == nil || c.Conclusion == nil { return "" } return *c.Conclusion } // GetDetailsURL returns the DetailsURL field if it's non-nil, zero value otherwise. func (c *CreateCheckRunOptions) GetDetailsURL() string { if c == nil || c.DetailsURL == nil { return "" } return *c.DetailsURL } // GetExternalID returns the ExternalID field if it's non-nil, zero value otherwise. func (c *CreateCheckRunOptions) GetExternalID() string { if c == nil || c.ExternalID == nil { return "" } return *c.ExternalID } // GetOutput returns the Output field. func (c *CreateCheckRunOptions) GetOutput() *CheckRunOutput { if c == nil { return nil } return c.Output } // GetStartedAt returns the StartedAt field if it's non-nil, zero value otherwise. func (c *CreateCheckRunOptions) GetStartedAt() Timestamp { if c == nil || c.StartedAt == nil { return Timestamp{} } return *c.StartedAt } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (c *CreateCheckRunOptions) GetStatus() string { if c == nil || c.Status == nil { return "" } return *c.Status } // GetHeadBranch returns the HeadBranch field if it's non-nil, zero value otherwise. func (c *CreateCheckSuiteOptions) GetHeadBranch() string { if c == nil || c.HeadBranch == nil { return "" } return *c.HeadBranch } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (c *CreateEvent) GetDescription() string { if c == nil || c.Description == nil { return "" } return *c.Description } // GetInstallation returns the Installation field. func (c *CreateEvent) GetInstallation() *Installation { if c == nil { return nil } return c.Installation } // GetMasterBranch returns the MasterBranch field if it's non-nil, zero value otherwise. func (c *CreateEvent) GetMasterBranch() string { if c == nil || c.MasterBranch == nil { return "" } return *c.MasterBranch } // GetPusherType returns the PusherType field if it's non-nil, zero value otherwise. func (c *CreateEvent) GetPusherType() string { if c == nil || c.PusherType == nil { return "" } return *c.PusherType } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (c *CreateEvent) GetRef() string { if c == nil || c.Ref == nil { return "" } return *c.Ref } // GetRefType returns the RefType field if it's non-nil, zero value otherwise. func (c *CreateEvent) GetRefType() string { if c == nil || c.RefType == nil { return "" } return *c.RefType } // GetRepo returns the Repo field. func (c *CreateEvent) GetRepo() *Repository { if c == nil { return nil } return c.Repo } // GetSender returns the Sender field. func (c *CreateEvent) GetSender() *User { if c == nil { return nil } return c.Sender } // GetEmail returns the Email field if it's non-nil, zero value otherwise. func (c *CreateOrgInvitationOptions) GetEmail() string { if c == nil || c.Email == nil { return "" } return *c.Email } // GetInviteeID returns the InviteeID field if it's non-nil, zero value otherwise. func (c *CreateOrgInvitationOptions) GetInviteeID() int64 { if c == nil || c.InviteeID == nil { return 0 } return *c.InviteeID } // GetRole returns the Role field if it's non-nil, zero value otherwise. func (c *CreateOrgInvitationOptions) GetRole() string { if c == nil || c.Role == nil { return "" } return *c.Role } // GetAllowsPublicRepositories returns the AllowsPublicRepositories field if it's non-nil, zero value otherwise. func (c *CreateRunnerGroupRequest) GetAllowsPublicRepositories() bool { if c == nil || c.AllowsPublicRepositories == nil { return false } return *c.AllowsPublicRepositories } // GetName returns the Name field if it's non-nil, zero value otherwise. func (c *CreateRunnerGroupRequest) GetName() string { if c == nil || c.Name == nil { return "" } return *c.Name } // GetVisibility returns the Visibility field if it's non-nil, zero value otherwise. func (c *CreateRunnerGroupRequest) GetVisibility() string { if c == nil || c.Visibility == nil { return "" } return *c.Visibility } // GetDeploymentBranchPolicy returns the DeploymentBranchPolicy field. func (c *CreateUpdateEnvironment) GetDeploymentBranchPolicy() *BranchPolicy { if c == nil { return nil } return c.DeploymentBranchPolicy } // GetWaitTimer returns the WaitTimer field if it's non-nil, zero value otherwise. func (c *CreateUpdateEnvironment) GetWaitTimer() int { if c == nil || c.WaitTimer == nil { return 0 } return *c.WaitTimer } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (c *CreateUserProjectOptions) GetBody() string { if c == nil || c.Body == nil { return "" } return *c.Body } // GetInstallation returns the Installation field. func (d *DeleteEvent) GetInstallation() *Installation { if d == nil { return nil } return d.Installation } // GetPusherType returns the PusherType field if it's non-nil, zero value otherwise. func (d *DeleteEvent) GetPusherType() string { if d == nil || d.PusherType == nil { return "" } return *d.PusherType } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (d *DeleteEvent) GetRef() string { if d == nil || d.Ref == nil { return "" } return *d.Ref } // GetRefType returns the RefType field if it's non-nil, zero value otherwise. func (d *DeleteEvent) GetRefType() string { if d == nil || d.RefType == nil { return "" } return *d.RefType } // GetRepo returns the Repo field. func (d *DeleteEvent) GetRepo() *Repository { if d == nil { return nil } return d.Repo } // GetSender returns the Sender field. func (d *DeleteEvent) GetSender() *User { if d == nil { return nil } return d.Sender } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (d *DeployKeyEvent) GetAction() string { if d == nil || d.Action == nil { return "" } return *d.Action } // GetKey returns the Key field. func (d *DeployKeyEvent) GetKey() *Key { if d == nil { return nil } return d.Key } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (d *Deployment) GetCreatedAt() Timestamp { if d == nil || d.CreatedAt == nil { return Timestamp{} } return *d.CreatedAt } // GetCreator returns the Creator field. func (d *Deployment) GetCreator() *User { if d == nil { return nil } return d.Creator } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (d *Deployment) GetDescription() string { if d == nil || d.Description == nil { return "" } return *d.Description } // GetEnvironment returns the Environment field if it's non-nil, zero value otherwise. func (d *Deployment) GetEnvironment() string { if d == nil || d.Environment == nil { return "" } return *d.Environment } // GetID returns the ID field if it's non-nil, zero value otherwise. func (d *Deployment) GetID() int64 { if d == nil || d.ID == nil { return 0 } return *d.ID } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (d *Deployment) GetNodeID() string { if d == nil || d.NodeID == nil { return "" } return *d.NodeID } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (d *Deployment) GetRef() string { if d == nil || d.Ref == nil { return "" } return *d.Ref } // GetRepositoryURL returns the RepositoryURL field if it's non-nil, zero value otherwise. func (d *Deployment) GetRepositoryURL() string { if d == nil || d.RepositoryURL == nil { return "" } return *d.RepositoryURL } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (d *Deployment) GetSHA() string { if d == nil || d.SHA == nil { return "" } return *d.SHA } // GetStatusesURL returns the StatusesURL field if it's non-nil, zero value otherwise. func (d *Deployment) GetStatusesURL() string { if d == nil || d.StatusesURL == nil { return "" } return *d.StatusesURL } // GetTask returns the Task field if it's non-nil, zero value otherwise. func (d *Deployment) GetTask() string { if d == nil || d.Task == nil { return "" } return *d.Task } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (d *Deployment) GetUpdatedAt() Timestamp { if d == nil || d.UpdatedAt == nil { return Timestamp{} } return *d.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (d *Deployment) GetURL() string { if d == nil || d.URL == nil { return "" } return *d.URL } // GetDeployment returns the Deployment field. func (d *DeploymentEvent) GetDeployment() *Deployment { if d == nil { return nil } return d.Deployment } // GetInstallation returns the Installation field. func (d *DeploymentEvent) GetInstallation() *Installation { if d == nil { return nil } return d.Installation } // GetRepo returns the Repo field. func (d *DeploymentEvent) GetRepo() *Repository { if d == nil { return nil } return d.Repo } // GetSender returns the Sender field. func (d *DeploymentEvent) GetSender() *User { if d == nil { return nil } return d.Sender } // GetAutoMerge returns the AutoMerge field if it's non-nil, zero value otherwise. func (d *DeploymentRequest) GetAutoMerge() bool { if d == nil || d.AutoMerge == nil { return false } return *d.AutoMerge } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (d *DeploymentRequest) GetDescription() string { if d == nil || d.Description == nil { return "" } return *d.Description } // GetEnvironment returns the Environment field if it's non-nil, zero value otherwise. func (d *DeploymentRequest) GetEnvironment() string { if d == nil || d.Environment == nil { return "" } return *d.Environment } // GetProductionEnvironment returns the ProductionEnvironment field if it's non-nil, zero value otherwise. func (d *DeploymentRequest) GetProductionEnvironment() bool { if d == nil || d.ProductionEnvironment == nil { return false } return *d.ProductionEnvironment } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (d *DeploymentRequest) GetRef() string { if d == nil || d.Ref == nil { return "" } return *d.Ref } // GetRequiredContexts returns the RequiredContexts field if it's non-nil, zero value otherwise. func (d *DeploymentRequest) GetRequiredContexts() []string { if d == nil || d.RequiredContexts == nil { return nil } return *d.RequiredContexts } // GetTask returns the Task field if it's non-nil, zero value otherwise. func (d *DeploymentRequest) GetTask() string { if d == nil || d.Task == nil { return "" } return *d.Task } // GetTransientEnvironment returns the TransientEnvironment field if it's non-nil, zero value otherwise. func (d *DeploymentRequest) GetTransientEnvironment() bool { if d == nil || d.TransientEnvironment == nil { return false } return *d.TransientEnvironment } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (d *DeploymentStatus) GetCreatedAt() Timestamp { if d == nil || d.CreatedAt == nil { return Timestamp{} } return *d.CreatedAt } // GetCreator returns the Creator field. func (d *DeploymentStatus) GetCreator() *User { if d == nil { return nil } return d.Creator } // GetDeploymentURL returns the DeploymentURL field if it's non-nil, zero value otherwise. func (d *DeploymentStatus) GetDeploymentURL() string { if d == nil || d.DeploymentURL == nil { return "" } return *d.DeploymentURL } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (d *DeploymentStatus) GetDescription() string { if d == nil || d.Description == nil { return "" } return *d.Description } // GetEnvironment returns the Environment field if it's non-nil, zero value otherwise. func (d *DeploymentStatus) GetEnvironment() string { if d == nil || d.Environment == nil { return "" } return *d.Environment } // GetEnvironmentURL returns the EnvironmentURL field if it's non-nil, zero value otherwise. func (d *DeploymentStatus) GetEnvironmentURL() string { if d == nil || d.EnvironmentURL == nil { return "" } return *d.EnvironmentURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (d *DeploymentStatus) GetID() int64 { if d == nil || d.ID == nil { return 0 } return *d.ID } // GetLogURL returns the LogURL field if it's non-nil, zero value otherwise. func (d *DeploymentStatus) GetLogURL() string { if d == nil || d.LogURL == nil { return "" } return *d.LogURL } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (d *DeploymentStatus) GetNodeID() string { if d == nil || d.NodeID == nil { return "" } return *d.NodeID } // GetRepositoryURL returns the RepositoryURL field if it's non-nil, zero value otherwise. func (d *DeploymentStatus) GetRepositoryURL() string { if d == nil || d.RepositoryURL == nil { return "" } return *d.RepositoryURL } // GetState returns the State field if it's non-nil, zero value otherwise. func (d *DeploymentStatus) GetState() string { if d == nil || d.State == nil { return "" } return *d.State } // GetTargetURL returns the TargetURL field if it's non-nil, zero value otherwise. func (d *DeploymentStatus) GetTargetURL() string { if d == nil || d.TargetURL == nil { return "" } return *d.TargetURL } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (d *DeploymentStatus) GetUpdatedAt() Timestamp { if d == nil || d.UpdatedAt == nil { return Timestamp{} } return *d.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (d *DeploymentStatus) GetURL() string { if d == nil || d.URL == nil { return "" } return *d.URL } // GetDeployment returns the Deployment field. func (d *DeploymentStatusEvent) GetDeployment() *Deployment { if d == nil { return nil } return d.Deployment } // GetDeploymentStatus returns the DeploymentStatus field. func (d *DeploymentStatusEvent) GetDeploymentStatus() *DeploymentStatus { if d == nil { return nil } return d.DeploymentStatus } // GetInstallation returns the Installation field. func (d *DeploymentStatusEvent) GetInstallation() *Installation { if d == nil { return nil } return d.Installation } // GetRepo returns the Repo field. func (d *DeploymentStatusEvent) GetRepo() *Repository { if d == nil { return nil } return d.Repo } // GetSender returns the Sender field. func (d *DeploymentStatusEvent) GetSender() *User { if d == nil { return nil } return d.Sender } // GetAutoInactive returns the AutoInactive field if it's non-nil, zero value otherwise. func (d *DeploymentStatusRequest) GetAutoInactive() bool { if d == nil || d.AutoInactive == nil { return false } return *d.AutoInactive } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (d *DeploymentStatusRequest) GetDescription() string { if d == nil || d.Description == nil { return "" } return *d.Description } // GetEnvironment returns the Environment field if it's non-nil, zero value otherwise. func (d *DeploymentStatusRequest) GetEnvironment() string { if d == nil || d.Environment == nil { return "" } return *d.Environment } // GetEnvironmentURL returns the EnvironmentURL field if it's non-nil, zero value otherwise. func (d *DeploymentStatusRequest) GetEnvironmentURL() string { if d == nil || d.EnvironmentURL == nil { return "" } return *d.EnvironmentURL } // GetLogURL returns the LogURL field if it's non-nil, zero value otherwise. func (d *DeploymentStatusRequest) GetLogURL() string { if d == nil || d.LogURL == nil { return "" } return *d.LogURL } // GetState returns the State field if it's non-nil, zero value otherwise. func (d *DeploymentStatusRequest) GetState() string { if d == nil || d.State == nil { return "" } return *d.State } // GetAuthor returns the Author field. func (d *DiscussionComment) GetAuthor() *User { if d == nil { return nil } return d.Author } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (d *DiscussionComment) GetBody() string { if d == nil || d.Body == nil { return "" } return *d.Body } // GetBodyHTML returns the BodyHTML field if it's non-nil, zero value otherwise. func (d *DiscussionComment) GetBodyHTML() string { if d == nil || d.BodyHTML == nil { return "" } return *d.BodyHTML } // GetBodyVersion returns the BodyVersion field if it's non-nil, zero value otherwise. func (d *DiscussionComment) GetBodyVersion() string { if d == nil || d.BodyVersion == nil { return "" } return *d.BodyVersion } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (d *DiscussionComment) GetCreatedAt() Timestamp { if d == nil || d.CreatedAt == nil { return Timestamp{} } return *d.CreatedAt } // GetDiscussionURL returns the DiscussionURL field if it's non-nil, zero value otherwise. func (d *DiscussionComment) GetDiscussionURL() string { if d == nil || d.DiscussionURL == nil { return "" } return *d.DiscussionURL } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (d *DiscussionComment) GetHTMLURL() string { if d == nil || d.HTMLURL == nil { return "" } return *d.HTMLURL } // GetLastEditedAt returns the LastEditedAt field if it's non-nil, zero value otherwise. func (d *DiscussionComment) GetLastEditedAt() Timestamp { if d == nil || d.LastEditedAt == nil { return Timestamp{} } return *d.LastEditedAt } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (d *DiscussionComment) GetNodeID() string { if d == nil || d.NodeID == nil { return "" } return *d.NodeID } // GetNumber returns the Number field if it's non-nil, zero value otherwise. func (d *DiscussionComment) GetNumber() int { if d == nil || d.Number == nil { return 0 } return *d.Number } // GetReactions returns the Reactions field. func (d *DiscussionComment) GetReactions() *Reactions { if d == nil { return nil } return d.Reactions } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (d *DiscussionComment) GetUpdatedAt() Timestamp { if d == nil || d.UpdatedAt == nil { return Timestamp{} } return *d.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (d *DiscussionComment) GetURL() string { if d == nil || d.URL == nil { return "" } return *d.URL } // GetTeams returns the Teams field if it's non-nil, zero value otherwise. func (d *DismissalRestrictionsRequest) GetTeams() []string { if d == nil || d.Teams == nil { return nil } return *d.Teams } // GetUsers returns the Users field if it's non-nil, zero value otherwise. func (d *DismissalRestrictionsRequest) GetUsers() []string { if d == nil || d.Users == nil { return nil } return *d.Users } // GetDismissalCommitID returns the DismissalCommitID field if it's non-nil, zero value otherwise. func (d *DismissedReview) GetDismissalCommitID() string { if d == nil || d.DismissalCommitID == nil { return "" } return *d.DismissalCommitID } // GetDismissalMessage returns the DismissalMessage field if it's non-nil, zero value otherwise. func (d *DismissedReview) GetDismissalMessage() string { if d == nil || d.DismissalMessage == nil { return "" } return *d.DismissalMessage } // GetReviewID returns the ReviewID field if it's non-nil, zero value otherwise. func (d *DismissedReview) GetReviewID() int64 { if d == nil || d.ReviewID == nil { return 0 } return *d.ReviewID } // GetState returns the State field if it's non-nil, zero value otherwise. func (d *DismissedReview) GetState() string { if d == nil || d.State == nil { return "" } return *d.State } // GetClientPayload returns the ClientPayload field if it's non-nil, zero value otherwise. func (d *DispatchRequestOptions) GetClientPayload() json.RawMessage { if d == nil || d.ClientPayload == nil { return json.RawMessage{} } return *d.ClientPayload } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (d *DraftReviewComment) GetBody() string { if d == nil || d.Body == nil { return "" } return *d.Body } // GetLine returns the Line field if it's non-nil, zero value otherwise. func (d *DraftReviewComment) GetLine() int { if d == nil || d.Line == nil { return 0 } return *d.Line } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (d *DraftReviewComment) GetPath() string { if d == nil || d.Path == nil { return "" } return *d.Path } // GetPosition returns the Position field if it's non-nil, zero value otherwise. func (d *DraftReviewComment) GetPosition() int { if d == nil || d.Position == nil { return 0 } return *d.Position } // GetSide returns the Side field if it's non-nil, zero value otherwise. func (d *DraftReviewComment) GetSide() string { if d == nil || d.Side == nil { return "" } return *d.Side } // GetStartLine returns the StartLine field if it's non-nil, zero value otherwise. func (d *DraftReviewComment) GetStartLine() int { if d == nil || d.StartLine == nil { return 0 } return *d.StartLine } // GetStartSide returns the StartSide field if it's non-nil, zero value otherwise. func (d *DraftReviewComment) GetStartSide() string { if d == nil || d.StartSide == nil { return "" } return *d.StartSide } // GetRef returns the Ref field. func (e *EditBase) GetRef() *EditRef { if e == nil { return nil } return e.Ref } // GetSHA returns the SHA field. func (e *EditBase) GetSHA() *EditSHA { if e == nil { return nil } return e.SHA } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (e *EditBody) GetFrom() string { if e == nil || e.From == nil { return "" } return *e.From } // GetBase returns the Base field. func (e *EditChange) GetBase() *EditBase { if e == nil { return nil } return e.Base } // GetBody returns the Body field. func (e *EditChange) GetBody() *EditBody { if e == nil { return nil } return e.Body } // GetTitle returns the Title field. func (e *EditChange) GetTitle() *EditTitle { if e == nil { return nil } return e.Title } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (e *EditRef) GetFrom() string { if e == nil || e.From == nil { return "" } return *e.From } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (e *EditSHA) GetFrom() string { if e == nil || e.From == nil { return "" } return *e.From } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (e *EditTitle) GetFrom() string { if e == nil || e.From == nil { return "" } return *e.From } // GetAvatarURL returns the AvatarURL field if it's non-nil, zero value otherwise. func (e *Enterprise) GetAvatarURL() string { if e == nil || e.AvatarURL == nil { return "" } return *e.AvatarURL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (e *Enterprise) GetCreatedAt() Timestamp { if e == nil || e.CreatedAt == nil { return Timestamp{} } return *e.CreatedAt } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (e *Enterprise) GetDescription() string { if e == nil || e.Description == nil { return "" } return *e.Description } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (e *Enterprise) GetHTMLURL() string { if e == nil || e.HTMLURL == nil { return "" } return *e.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (e *Enterprise) GetID() int { if e == nil || e.ID == nil { return 0 } return *e.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (e *Enterprise) GetName() string { if e == nil || e.Name == nil { return "" } return *e.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (e *Enterprise) GetNodeID() string { if e == nil || e.NodeID == nil { return "" } return *e.NodeID } // GetSlug returns the Slug field if it's non-nil, zero value otherwise. func (e *Enterprise) GetSlug() string { if e == nil || e.Slug == nil { return "" } return *e.Slug } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (e *Enterprise) GetUpdatedAt() Timestamp { if e == nil || e.UpdatedAt == nil { return Timestamp{} } return *e.UpdatedAt } // GetWebsiteURL returns the WebsiteURL field if it's non-nil, zero value otherwise. func (e *Enterprise) GetWebsiteURL() string { if e == nil || e.WebsiteURL == nil { return "" } return *e.WebsiteURL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (e *Environment) GetCreatedAt() Timestamp { if e == nil || e.CreatedAt == nil { return Timestamp{} } return *e.CreatedAt } // GetDeploymentBranchPolicy returns the DeploymentBranchPolicy field. func (e *Environment) GetDeploymentBranchPolicy() *BranchPolicy { if e == nil { return nil } return e.DeploymentBranchPolicy } // GetEnvironmentName returns the EnvironmentName field if it's non-nil, zero value otherwise. func (e *Environment) GetEnvironmentName() string { if e == nil || e.EnvironmentName == nil { return "" } return *e.EnvironmentName } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (e *Environment) GetHTMLURL() string { if e == nil || e.HTMLURL == nil { return "" } return *e.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (e *Environment) GetID() int64 { if e == nil || e.ID == nil { return 0 } return *e.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (e *Environment) GetName() string { if e == nil || e.Name == nil { return "" } return *e.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (e *Environment) GetNodeID() string { if e == nil || e.NodeID == nil { return "" } return *e.NodeID } // GetOwner returns the Owner field if it's non-nil, zero value otherwise. func (e *Environment) GetOwner() string { if e == nil || e.Owner == nil { return "" } return *e.Owner } // GetRepo returns the Repo field if it's non-nil, zero value otherwise. func (e *Environment) GetRepo() string { if e == nil || e.Repo == nil { return "" } return *e.Repo } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (e *Environment) GetUpdatedAt() Timestamp { if e == nil || e.UpdatedAt == nil { return Timestamp{} } return *e.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (e *Environment) GetURL() string { if e == nil || e.URL == nil { return "" } return *e.URL } // GetWaitTimer returns the WaitTimer field if it's non-nil, zero value otherwise. func (e *Environment) GetWaitTimer() int { if e == nil || e.WaitTimer == nil { return 0 } return *e.WaitTimer } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (e *EnvResponse) GetTotalCount() int { if e == nil || e.TotalCount == nil { return 0 } return *e.TotalCount } // GetID returns the ID field if it's non-nil, zero value otherwise. func (e *EnvReviewers) GetID() int64 { if e == nil || e.ID == nil { return 0 } return *e.ID } // GetType returns the Type field if it's non-nil, zero value otherwise. func (e *EnvReviewers) GetType() string { if e == nil || e.Type == nil { return "" } return *e.Type } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (e *ErrorBlock) GetCreatedAt() Timestamp { if e == nil || e.CreatedAt == nil { return Timestamp{} } return *e.CreatedAt } // GetBlock returns the Block field. func (e *ErrorResponse) GetBlock() *ErrorBlock { if e == nil { return nil } return e.Block } // GetActor returns the Actor field. func (e *Event) GetActor() *User { if e == nil { return nil } return e.Actor } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (e *Event) GetCreatedAt() time.Time { if e == nil || e.CreatedAt == nil { return time.Time{} } return *e.CreatedAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (e *Event) GetID() string { if e == nil || e.ID == nil { return "" } return *e.ID } // GetOrg returns the Org field. func (e *Event) GetOrg() *Organization { if e == nil { return nil } return e.Org } // GetPublic returns the Public field if it's non-nil, zero value otherwise. func (e *Event) GetPublic() bool { if e == nil || e.Public == nil { return false } return *e.Public } // GetRawPayload returns the RawPayload field if it's non-nil, zero value otherwise. func (e *Event) GetRawPayload() json.RawMessage { if e == nil || e.RawPayload == nil { return json.RawMessage{} } return *e.RawPayload } // GetRepo returns the Repo field. func (e *Event) GetRepo() *Repository { if e == nil { return nil } return e.Repo } // GetType returns the Type field if it's non-nil, zero value otherwise. func (e *Event) GetType() string { if e == nil || e.Type == nil { return "" } return *e.Type } // GetHRef returns the HRef field if it's non-nil, zero value otherwise. func (f *FeedLink) GetHRef() string { if f == nil || f.HRef == nil { return "" } return *f.HRef } // GetType returns the Type field if it's non-nil, zero value otherwise. func (f *FeedLink) GetType() string { if f == nil || f.Type == nil { return "" } return *f.Type } // GetCurrentUser returns the CurrentUser field. func (f *FeedLinks) GetCurrentUser() *FeedLink { if f == nil { return nil } return f.CurrentUser } // GetCurrentUserActor returns the CurrentUserActor field. func (f *FeedLinks) GetCurrentUserActor() *FeedLink { if f == nil { return nil } return f.CurrentUserActor } // GetCurrentUserOrganization returns the CurrentUserOrganization field. func (f *FeedLinks) GetCurrentUserOrganization() *FeedLink { if f == nil { return nil } return f.CurrentUserOrganization } // GetCurrentUserPublic returns the CurrentUserPublic field. func (f *FeedLinks) GetCurrentUserPublic() *FeedLink { if f == nil { return nil } return f.CurrentUserPublic } // GetTimeline returns the Timeline field. func (f *FeedLinks) GetTimeline() *FeedLink { if f == nil { return nil } return f.Timeline } // GetUser returns the User field. func (f *FeedLinks) GetUser() *FeedLink { if f == nil { return nil } return f.User } // GetCurrentUserActorURL returns the CurrentUserActorURL field if it's non-nil, zero value otherwise. func (f *Feeds) GetCurrentUserActorURL() string { if f == nil || f.CurrentUserActorURL == nil { return "" } return *f.CurrentUserActorURL } // GetCurrentUserOrganizationURL returns the CurrentUserOrganizationURL field if it's non-nil, zero value otherwise. func (f *Feeds) GetCurrentUserOrganizationURL() string { if f == nil || f.CurrentUserOrganizationURL == nil { return "" } return *f.CurrentUserOrganizationURL } // GetCurrentUserPublicURL returns the CurrentUserPublicURL field if it's non-nil, zero value otherwise. func (f *Feeds) GetCurrentUserPublicURL() string { if f == nil || f.CurrentUserPublicURL == nil { return "" } return *f.CurrentUserPublicURL } // GetCurrentUserURL returns the CurrentUserURL field if it's non-nil, zero value otherwise. func (f *Feeds) GetCurrentUserURL() string { if f == nil || f.CurrentUserURL == nil { return "" } return *f.CurrentUserURL } // GetLinks returns the Links field. func (f *Feeds) GetLinks() *FeedLinks { if f == nil { return nil } return f.Links } // GetTimelineURL returns the TimelineURL field if it's non-nil, zero value otherwise. func (f *Feeds) GetTimelineURL() string { if f == nil || f.TimelineURL == nil { return "" } return *f.TimelineURL } // GetUserURL returns the UserURL field if it's non-nil, zero value otherwise. func (f *Feeds) GetUserURL() string { if f == nil || f.UserURL == nil { return "" } return *f.UserURL } // GetForkee returns the Forkee field. func (f *ForkEvent) GetForkee() *Repository { if f == nil { return nil } return f.Forkee } // GetInstallation returns the Installation field. func (f *ForkEvent) GetInstallation() *Installation { if f == nil { return nil } return f.Installation } // GetRepo returns the Repo field. func (f *ForkEvent) GetRepo() *Repository { if f == nil { return nil } return f.Repo } // GetSender returns the Sender field. func (f *ForkEvent) GetSender() *User { if f == nil { return nil } return f.Sender } // GetInclude returns the Include field if it's non-nil, zero value otherwise. func (g *GetAuditLogOptions) GetInclude() string { if g == nil || g.Include == nil { return "" } return *g.Include } // GetOrder returns the Order field if it's non-nil, zero value otherwise. func (g *GetAuditLogOptions) GetOrder() string { if g == nil || g.Order == nil { return "" } return *g.Order } // GetPhrase returns the Phrase field if it's non-nil, zero value otherwise. func (g *GetAuditLogOptions) GetPhrase() string { if g == nil || g.Phrase == nil { return "" } return *g.Phrase } // GetComments returns the Comments field if it's non-nil, zero value otherwise. func (g *Gist) GetComments() int { if g == nil || g.Comments == nil { return 0 } return *g.Comments } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (g *Gist) GetCreatedAt() time.Time { if g == nil || g.CreatedAt == nil { return time.Time{} } return *g.CreatedAt } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (g *Gist) GetDescription() string { if g == nil || g.Description == nil { return "" } return *g.Description } // GetFiles returns the Files map if it's non-nil, an empty map otherwise. func (g *Gist) GetFiles() map[GistFilename]GistFile { if g == nil || g.Files == nil { return map[GistFilename]GistFile{} } return g.Files } // GetGitPullURL returns the GitPullURL field if it's non-nil, zero value otherwise. func (g *Gist) GetGitPullURL() string { if g == nil || g.GitPullURL == nil { return "" } return *g.GitPullURL } // GetGitPushURL returns the GitPushURL field if it's non-nil, zero value otherwise. func (g *Gist) GetGitPushURL() string { if g == nil || g.GitPushURL == nil { return "" } return *g.GitPushURL } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (g *Gist) GetHTMLURL() string { if g == nil || g.HTMLURL == nil { return "" } return *g.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (g *Gist) GetID() string { if g == nil || g.ID == nil { return "" } return *g.ID } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (g *Gist) GetNodeID() string { if g == nil || g.NodeID == nil { return "" } return *g.NodeID } // GetOwner returns the Owner field. func (g *Gist) GetOwner() *User { if g == nil { return nil } return g.Owner } // GetPublic returns the Public field if it's non-nil, zero value otherwise. func (g *Gist) GetPublic() bool { if g == nil || g.Public == nil { return false } return *g.Public } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (g *Gist) GetUpdatedAt() time.Time { if g == nil || g.UpdatedAt == nil { return time.Time{} } return *g.UpdatedAt } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (g *GistComment) GetBody() string { if g == nil || g.Body == nil { return "" } return *g.Body } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (g *GistComment) GetCreatedAt() time.Time { if g == nil || g.CreatedAt == nil { return time.Time{} } return *g.CreatedAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (g *GistComment) GetID() int64 { if g == nil || g.ID == nil { return 0 } return *g.ID } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (g *GistComment) GetURL() string { if g == nil || g.URL == nil { return "" } return *g.URL } // GetUser returns the User field. func (g *GistComment) GetUser() *User { if g == nil { return nil } return g.User } // GetChangeStatus returns the ChangeStatus field. func (g *GistCommit) GetChangeStatus() *CommitStats { if g == nil { return nil } return g.ChangeStatus } // GetCommittedAt returns the CommittedAt field if it's non-nil, zero value otherwise. func (g *GistCommit) GetCommittedAt() Timestamp { if g == nil || g.CommittedAt == nil { return Timestamp{} } return *g.CommittedAt } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (g *GistCommit) GetNodeID() string { if g == nil || g.NodeID == nil { return "" } return *g.NodeID } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (g *GistCommit) GetURL() string { if g == nil || g.URL == nil { return "" } return *g.URL } // GetUser returns the User field. func (g *GistCommit) GetUser() *User { if g == nil { return nil } return g.User } // GetVersion returns the Version field if it's non-nil, zero value otherwise. func (g *GistCommit) GetVersion() string { if g == nil || g.Version == nil { return "" } return *g.Version } // GetContent returns the Content field if it's non-nil, zero value otherwise. func (g *GistFile) GetContent() string { if g == nil || g.Content == nil { return "" } return *g.Content } // GetFilename returns the Filename field if it's non-nil, zero value otherwise. func (g *GistFile) GetFilename() string { if g == nil || g.Filename == nil { return "" } return *g.Filename } // GetLanguage returns the Language field if it's non-nil, zero value otherwise. func (g *GistFile) GetLanguage() string { if g == nil || g.Language == nil { return "" } return *g.Language } // GetRawURL returns the RawURL field if it's non-nil, zero value otherwise. func (g *GistFile) GetRawURL() string { if g == nil || g.RawURL == nil { return "" } return *g.RawURL } // GetSize returns the Size field if it's non-nil, zero value otherwise. func (g *GistFile) GetSize() int { if g == nil || g.Size == nil { return 0 } return *g.Size } // GetType returns the Type field if it's non-nil, zero value otherwise. func (g *GistFile) GetType() string { if g == nil || g.Type == nil { return "" } return *g.Type } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (g *GistFork) GetCreatedAt() Timestamp { if g == nil || g.CreatedAt == nil { return Timestamp{} } return *g.CreatedAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (g *GistFork) GetID() string { if g == nil || g.ID == nil { return "" } return *g.ID } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (g *GistFork) GetNodeID() string { if g == nil || g.NodeID == nil { return "" } return *g.NodeID } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (g *GistFork) GetUpdatedAt() Timestamp { if g == nil || g.UpdatedAt == nil { return Timestamp{} } return *g.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (g *GistFork) GetURL() string { if g == nil || g.URL == nil { return "" } return *g.URL } // GetUser returns the User field. func (g *GistFork) GetUser() *User { if g == nil { return nil } return g.User } // GetPrivateGists returns the PrivateGists field if it's non-nil, zero value otherwise. func (g *GistStats) GetPrivateGists() int { if g == nil || g.PrivateGists == nil { return 0 } return *g.PrivateGists } // GetPublicGists returns the PublicGists field if it's non-nil, zero value otherwise. func (g *GistStats) GetPublicGists() int { if g == nil || g.PublicGists == nil { return 0 } return *g.PublicGists } // GetTotalGists returns the TotalGists field if it's non-nil, zero value otherwise. func (g *GistStats) GetTotalGists() int { if g == nil || g.TotalGists == nil { return 0 } return *g.TotalGists } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (g *GitHubAppAuthorizationEvent) GetAction() string { if g == nil || g.Action == nil { return "" } return *g.Action } // GetSender returns the Sender field. func (g *GitHubAppAuthorizationEvent) GetSender() *User { if g == nil { return nil } return g.Sender } // GetName returns the Name field if it's non-nil, zero value otherwise. func (g *Gitignore) GetName() string { if g == nil || g.Name == nil { return "" } return *g.Name } // GetSource returns the Source field if it's non-nil, zero value otherwise. func (g *Gitignore) GetSource() string { if g == nil || g.Source == nil { return "" } return *g.Source } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (g *GitObject) GetSHA() string { if g == nil || g.SHA == nil { return "" } return *g.SHA } // GetType returns the Type field if it's non-nil, zero value otherwise. func (g *GitObject) GetType() string { if g == nil || g.Type == nil { return "" } return *g.Type } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (g *GitObject) GetURL() string { if g == nil || g.URL == nil { return "" } return *g.URL } // GetInstallation returns the Installation field. func (g *GollumEvent) GetInstallation() *Installation { if g == nil { return nil } return g.Installation } // GetRepo returns the Repo field. func (g *GollumEvent) GetRepo() *Repository { if g == nil { return nil } return g.Repo } // GetSender returns the Sender field. func (g *GollumEvent) GetSender() *User { if g == nil { return nil } return g.Sender } // GetEmail returns the Email field if it's non-nil, zero value otherwise. func (g *GPGEmail) GetEmail() string { if g == nil || g.Email == nil { return "" } return *g.Email } // GetVerified returns the Verified field if it's non-nil, zero value otherwise. func (g *GPGEmail) GetVerified() bool { if g == nil || g.Verified == nil { return false } return *g.Verified } // GetCanCertify returns the CanCertify field if it's non-nil, zero value otherwise. func (g *GPGKey) GetCanCertify() bool { if g == nil || g.CanCertify == nil { return false } return *g.CanCertify } // GetCanEncryptComms returns the CanEncryptComms field if it's non-nil, zero value otherwise. func (g *GPGKey) GetCanEncryptComms() bool { if g == nil || g.CanEncryptComms == nil { return false } return *g.CanEncryptComms } // GetCanEncryptStorage returns the CanEncryptStorage field if it's non-nil, zero value otherwise. func (g *GPGKey) GetCanEncryptStorage() bool { if g == nil || g.CanEncryptStorage == nil { return false } return *g.CanEncryptStorage } // GetCanSign returns the CanSign field if it's non-nil, zero value otherwise. func (g *GPGKey) GetCanSign() bool { if g == nil || g.CanSign == nil { return false } return *g.CanSign } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (g *GPGKey) GetCreatedAt() time.Time { if g == nil || g.CreatedAt == nil { return time.Time{} } return *g.CreatedAt } // GetExpiresAt returns the ExpiresAt field if it's non-nil, zero value otherwise. func (g *GPGKey) GetExpiresAt() time.Time { if g == nil || g.ExpiresAt == nil { return time.Time{} } return *g.ExpiresAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (g *GPGKey) GetID() int64 { if g == nil || g.ID == nil { return 0 } return *g.ID } // GetKeyID returns the KeyID field if it's non-nil, zero value otherwise. func (g *GPGKey) GetKeyID() string { if g == nil || g.KeyID == nil { return "" } return *g.KeyID } // GetPrimaryKeyID returns the PrimaryKeyID field if it's non-nil, zero value otherwise. func (g *GPGKey) GetPrimaryKeyID() int64 { if g == nil || g.PrimaryKeyID == nil { return 0 } return *g.PrimaryKeyID } // GetPublicKey returns the PublicKey field if it's non-nil, zero value otherwise. func (g *GPGKey) GetPublicKey() string { if g == nil || g.PublicKey == nil { return "" } return *g.PublicKey } // GetApp returns the App field. func (g *Grant) GetApp() *AuthorizationApp { if g == nil { return nil } return g.App } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (g *Grant) GetCreatedAt() Timestamp { if g == nil || g.CreatedAt == nil { return Timestamp{} } return *g.CreatedAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (g *Grant) GetID() int64 { if g == nil || g.ID == nil { return 0 } return *g.ID } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (g *Grant) GetUpdatedAt() Timestamp { if g == nil || g.UpdatedAt == nil { return Timestamp{} } return *g.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (g *Grant) GetURL() string { if g == nil || g.URL == nil { return "" } return *g.URL } // GetAuthor returns the Author field. func (h *HeadCommit) GetAuthor() *CommitAuthor { if h == nil { return nil } return h.Author } // GetCommitter returns the Committer field. func (h *HeadCommit) GetCommitter() *CommitAuthor { if h == nil { return nil } return h.Committer } // GetDistinct returns the Distinct field if it's non-nil, zero value otherwise. func (h *HeadCommit) GetDistinct() bool { if h == nil || h.Distinct == nil { return false } return *h.Distinct } // GetID returns the ID field if it's non-nil, zero value otherwise. func (h *HeadCommit) GetID() string { if h == nil || h.ID == nil { return "" } return *h.ID } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (h *HeadCommit) GetMessage() string { if h == nil || h.Message == nil { return "" } return *h.Message } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (h *HeadCommit) GetSHA() string { if h == nil || h.SHA == nil { return "" } return *h.SHA } // GetTimestamp returns the Timestamp field if it's non-nil, zero value otherwise. func (h *HeadCommit) GetTimestamp() Timestamp { if h == nil || h.Timestamp == nil { return Timestamp{} } return *h.Timestamp } // GetTreeID returns the TreeID field if it's non-nil, zero value otherwise. func (h *HeadCommit) GetTreeID() string { if h == nil || h.TreeID == nil { return "" } return *h.TreeID } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (h *HeadCommit) GetURL() string { if h == nil || h.URL == nil { return "" } return *h.URL } // GetActive returns the Active field if it's non-nil, zero value otherwise. func (h *Hook) GetActive() bool { if h == nil || h.Active == nil { return false } return *h.Active } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (h *Hook) GetCreatedAt() time.Time { if h == nil || h.CreatedAt == nil { return time.Time{} } return *h.CreatedAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (h *Hook) GetID() int64 { if h == nil || h.ID == nil { return 0 } return *h.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (h *Hook) GetName() string { if h == nil || h.Name == nil { return "" } return *h.Name } // GetPingURL returns the PingURL field if it's non-nil, zero value otherwise. func (h *Hook) GetPingURL() string { if h == nil || h.PingURL == nil { return "" } return *h.PingURL } // GetTestURL returns the TestURL field if it's non-nil, zero value otherwise. func (h *Hook) GetTestURL() string { if h == nil || h.TestURL == nil { return "" } return *h.TestURL } // GetType returns the Type field if it's non-nil, zero value otherwise. func (h *Hook) GetType() string { if h == nil || h.Type == nil { return "" } return *h.Type } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (h *Hook) GetUpdatedAt() time.Time { if h == nil || h.UpdatedAt == nil { return time.Time{} } return *h.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (h *Hook) GetURL() string { if h == nil || h.URL == nil { return "" } return *h.URL } // GetContentType returns the ContentType field if it's non-nil, zero value otherwise. func (h *HookConfig) GetContentType() string { if h == nil || h.ContentType == nil { return "" } return *h.ContentType } // GetInsecureSSL returns the InsecureSSL field if it's non-nil, zero value otherwise. func (h *HookConfig) GetInsecureSSL() string { if h == nil || h.InsecureSSL == nil { return "" } return *h.InsecureSSL } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (h *HookConfig) GetURL() string { if h == nil || h.URL == nil { return "" } return *h.URL } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (h *HookDelivery) GetAction() string { if h == nil || h.Action == nil { return "" } return *h.Action } // GetDeliveredAt returns the DeliveredAt field if it's non-nil, zero value otherwise. func (h *HookDelivery) GetDeliveredAt() Timestamp { if h == nil || h.DeliveredAt == nil { return Timestamp{} } return *h.DeliveredAt } // GetDuration returns the Duration field. func (h *HookDelivery) GetDuration() *float64 { if h == nil { return nil } return h.Duration } // GetEvent returns the Event field if it's non-nil, zero value otherwise. func (h *HookDelivery) GetEvent() string { if h == nil || h.Event == nil { return "" } return *h.Event } // GetGUID returns the GUID field if it's non-nil, zero value otherwise. func (h *HookDelivery) GetGUID() string { if h == nil || h.GUID == nil { return "" } return *h.GUID } // GetID returns the ID field if it's non-nil, zero value otherwise. func (h *HookDelivery) GetID() int64 { if h == nil || h.ID == nil { return 0 } return *h.ID } // GetInstallationID returns the InstallationID field if it's non-nil, zero value otherwise. func (h *HookDelivery) GetInstallationID() string { if h == nil || h.InstallationID == nil { return "" } return *h.InstallationID } // GetRedelivery returns the Redelivery field if it's non-nil, zero value otherwise. func (h *HookDelivery) GetRedelivery() bool { if h == nil || h.Redelivery == nil { return false } return *h.Redelivery } // GetRepositoryID returns the RepositoryID field if it's non-nil, zero value otherwise. func (h *HookDelivery) GetRepositoryID() int64 { if h == nil || h.RepositoryID == nil { return 0 } return *h.RepositoryID } // GetRequest returns the Request field. func (h *HookDelivery) GetRequest() *HookRequest { if h == nil { return nil } return h.Request } // GetResponse returns the Response field. func (h *HookDelivery) GetResponse() *HookResponse { if h == nil { return nil } return h.Response } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (h *HookDelivery) GetStatus() string { if h == nil || h.Status == nil { return "" } return *h.Status } // GetStatusCode returns the StatusCode field if it's non-nil, zero value otherwise. func (h *HookDelivery) GetStatusCode() int { if h == nil || h.StatusCode == nil { return 0 } return *h.StatusCode } // GetHeaders returns the Headers map if it's non-nil, an empty map otherwise. func (h *HookRequest) GetHeaders() map[string]string { if h == nil || h.Headers == nil { return map[string]string{} } return h.Headers } // GetRawPayload returns the RawPayload field if it's non-nil, zero value otherwise. func (h *HookRequest) GetRawPayload() json.RawMessage { if h == nil || h.RawPayload == nil { return json.RawMessage{} } return *h.RawPayload } // GetHeaders returns the Headers map if it's non-nil, an empty map otherwise. func (h *HookResponse) GetHeaders() map[string]string { if h == nil || h.Headers == nil { return map[string]string{} } return h.Headers } // GetRawPayload returns the RawPayload field if it's non-nil, zero value otherwise. func (h *HookResponse) GetRawPayload() json.RawMessage { if h == nil || h.RawPayload == nil { return json.RawMessage{} } return *h.RawPayload } // GetActiveHooks returns the ActiveHooks field if it's non-nil, zero value otherwise. func (h *HookStats) GetActiveHooks() int { if h == nil || h.ActiveHooks == nil { return 0 } return *h.ActiveHooks } // GetInactiveHooks returns the InactiveHooks field if it's non-nil, zero value otherwise. func (h *HookStats) GetInactiveHooks() int { if h == nil || h.InactiveHooks == nil { return 0 } return *h.InactiveHooks } // GetTotalHooks returns the TotalHooks field if it's non-nil, zero value otherwise. func (h *HookStats) GetTotalHooks() int { if h == nil || h.TotalHooks == nil { return 0 } return *h.TotalHooks } // GetGroupDescription returns the GroupDescription field if it's non-nil, zero value otherwise. func (i *IDPGroup) GetGroupDescription() string { if i == nil || i.GroupDescription == nil { return "" } return *i.GroupDescription } // GetGroupID returns the GroupID field if it's non-nil, zero value otherwise. func (i *IDPGroup) GetGroupID() string { if i == nil || i.GroupID == nil { return "" } return *i.GroupID } // GetGroupName returns the GroupName field if it's non-nil, zero value otherwise. func (i *IDPGroup) GetGroupName() string { if i == nil || i.GroupName == nil { return "" } return *i.GroupName } // GetAuthorsCount returns the AuthorsCount field if it's non-nil, zero value otherwise. func (i *Import) GetAuthorsCount() int { if i == nil || i.AuthorsCount == nil { return 0 } return *i.AuthorsCount } // GetAuthorsURL returns the AuthorsURL field if it's non-nil, zero value otherwise. func (i *Import) GetAuthorsURL() string { if i == nil || i.AuthorsURL == nil { return "" } return *i.AuthorsURL } // GetCommitCount returns the CommitCount field if it's non-nil, zero value otherwise. func (i *Import) GetCommitCount() int { if i == nil || i.CommitCount == nil { return 0 } return *i.CommitCount } // GetFailedStep returns the FailedStep field if it's non-nil, zero value otherwise. func (i *Import) GetFailedStep() string { if i == nil || i.FailedStep == nil { return "" } return *i.FailedStep } // GetHasLargeFiles returns the HasLargeFiles field if it's non-nil, zero value otherwise. func (i *Import) GetHasLargeFiles() bool { if i == nil || i.HasLargeFiles == nil { return false } return *i.HasLargeFiles } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (i *Import) GetHTMLURL() string { if i == nil || i.HTMLURL == nil { return "" } return *i.HTMLURL } // GetHumanName returns the HumanName field if it's non-nil, zero value otherwise. func (i *Import) GetHumanName() string { if i == nil || i.HumanName == nil { return "" } return *i.HumanName } // GetLargeFilesCount returns the LargeFilesCount field if it's non-nil, zero value otherwise. func (i *Import) GetLargeFilesCount() int { if i == nil || i.LargeFilesCount == nil { return 0 } return *i.LargeFilesCount } // GetLargeFilesSize returns the LargeFilesSize field if it's non-nil, zero value otherwise. func (i *Import) GetLargeFilesSize() int { if i == nil || i.LargeFilesSize == nil { return 0 } return *i.LargeFilesSize } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (i *Import) GetMessage() string { if i == nil || i.Message == nil { return "" } return *i.Message } // GetPercent returns the Percent field if it's non-nil, zero value otherwise. func (i *Import) GetPercent() int { if i == nil || i.Percent == nil { return 0 } return *i.Percent } // GetPushPercent returns the PushPercent field if it's non-nil, zero value otherwise. func (i *Import) GetPushPercent() int { if i == nil || i.PushPercent == nil { return 0 } return *i.PushPercent } // GetRepositoryURL returns the RepositoryURL field if it's non-nil, zero value otherwise. func (i *Import) GetRepositoryURL() string { if i == nil || i.RepositoryURL == nil { return "" } return *i.RepositoryURL } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (i *Import) GetStatus() string { if i == nil || i.Status == nil { return "" } return *i.Status } // GetStatusText returns the StatusText field if it's non-nil, zero value otherwise. func (i *Import) GetStatusText() string { if i == nil || i.StatusText == nil { return "" } return *i.StatusText } // GetTFVCProject returns the TFVCProject field if it's non-nil, zero value otherwise. func (i *Import) GetTFVCProject() string { if i == nil || i.TFVCProject == nil { return "" } return *i.TFVCProject } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (i *Import) GetURL() string { if i == nil || i.URL == nil { return "" } return *i.URL } // GetUseLFS returns the UseLFS field if it's non-nil, zero value otherwise. func (i *Import) GetUseLFS() string { if i == nil || i.UseLFS == nil { return "" } return *i.UseLFS } // GetVCS returns the VCS field if it's non-nil, zero value otherwise. func (i *Import) GetVCS() string { if i == nil || i.VCS == nil { return "" } return *i.VCS } // GetVCSPassword returns the VCSPassword field if it's non-nil, zero value otherwise. func (i *Import) GetVCSPassword() string { if i == nil || i.VCSPassword == nil { return "" } return *i.VCSPassword } // GetVCSURL returns the VCSURL field if it's non-nil, zero value otherwise. func (i *Import) GetVCSURL() string { if i == nil || i.VCSURL == nil { return "" } return *i.VCSURL } // GetVCSUsername returns the VCSUsername field if it's non-nil, zero value otherwise. func (i *Import) GetVCSUsername() string { if i == nil || i.VCSUsername == nil { return "" } return *i.VCSUsername } // GetAccessTokensURL returns the AccessTokensURL field if it's non-nil, zero value otherwise. func (i *Installation) GetAccessTokensURL() string { if i == nil || i.AccessTokensURL == nil { return "" } return *i.AccessTokensURL } // GetAccount returns the Account field. func (i *Installation) GetAccount() *User { if i == nil { return nil } return i.Account } // GetAppID returns the AppID field if it's non-nil, zero value otherwise. func (i *Installation) GetAppID() int64 { if i == nil || i.AppID == nil { return 0 } return *i.AppID } // GetAppSlug returns the AppSlug field if it's non-nil, zero value otherwise. func (i *Installation) GetAppSlug() string { if i == nil || i.AppSlug == nil { return "" } return *i.AppSlug } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (i *Installation) GetCreatedAt() Timestamp { if i == nil || i.CreatedAt == nil { return Timestamp{} } return *i.CreatedAt } // GetHasMultipleSingleFiles returns the HasMultipleSingleFiles field if it's non-nil, zero value otherwise. func (i *Installation) GetHasMultipleSingleFiles() bool { if i == nil || i.HasMultipleSingleFiles == nil { return false } return *i.HasMultipleSingleFiles } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (i *Installation) GetHTMLURL() string { if i == nil || i.HTMLURL == nil { return "" } return *i.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (i *Installation) GetID() int64 { if i == nil || i.ID == nil { return 0 } return *i.ID } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (i *Installation) GetNodeID() string { if i == nil || i.NodeID == nil { return "" } return *i.NodeID } // GetPermissions returns the Permissions field. func (i *Installation) GetPermissions() *InstallationPermissions { if i == nil { return nil } return i.Permissions } // GetRepositoriesURL returns the RepositoriesURL field if it's non-nil, zero value otherwise. func (i *Installation) GetRepositoriesURL() string { if i == nil || i.RepositoriesURL == nil { return "" } return *i.RepositoriesURL } // GetRepositorySelection returns the RepositorySelection field if it's non-nil, zero value otherwise. func (i *Installation) GetRepositorySelection() string { if i == nil || i.RepositorySelection == nil { return "" } return *i.RepositorySelection } // GetSingleFileName returns the SingleFileName field if it's non-nil, zero value otherwise. func (i *Installation) GetSingleFileName() string { if i == nil || i.SingleFileName == nil { return "" } return *i.SingleFileName } // GetSuspendedAt returns the SuspendedAt field if it's non-nil, zero value otherwise. func (i *Installation) GetSuspendedAt() Timestamp { if i == nil || i.SuspendedAt == nil { return Timestamp{} } return *i.SuspendedAt } // GetSuspendedBy returns the SuspendedBy field. func (i *Installation) GetSuspendedBy() *User { if i == nil { return nil } return i.SuspendedBy } // GetTargetID returns the TargetID field if it's non-nil, zero value otherwise. func (i *Installation) GetTargetID() int64 { if i == nil || i.TargetID == nil { return 0 } return *i.TargetID } // GetTargetType returns the TargetType field if it's non-nil, zero value otherwise. func (i *Installation) GetTargetType() string { if i == nil || i.TargetType == nil { return "" } return *i.TargetType } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (i *Installation) GetUpdatedAt() Timestamp { if i == nil || i.UpdatedAt == nil { return Timestamp{} } return *i.UpdatedAt } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (i *InstallationEvent) GetAction() string { if i == nil || i.Action == nil { return "" } return *i.Action } // GetInstallation returns the Installation field. func (i *InstallationEvent) GetInstallation() *Installation { if i == nil { return nil } return i.Installation } // GetSender returns the Sender field. func (i *InstallationEvent) GetSender() *User { if i == nil { return nil } return i.Sender } // GetActions returns the Actions field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetActions() string { if i == nil || i.Actions == nil { return "" } return *i.Actions } // GetAdministration returns the Administration field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetAdministration() string { if i == nil || i.Administration == nil { return "" } return *i.Administration } // GetBlocking returns the Blocking field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetBlocking() string { if i == nil || i.Blocking == nil { return "" } return *i.Blocking } // GetChecks returns the Checks field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetChecks() string { if i == nil || i.Checks == nil { return "" } return *i.Checks } // GetContentReferences returns the ContentReferences field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetContentReferences() string { if i == nil || i.ContentReferences == nil { return "" } return *i.ContentReferences } // GetContents returns the Contents field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetContents() string { if i == nil || i.Contents == nil { return "" } return *i.Contents } // GetDeployments returns the Deployments field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetDeployments() string { if i == nil || i.Deployments == nil { return "" } return *i.Deployments } // GetEmails returns the Emails field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetEmails() string { if i == nil || i.Emails == nil { return "" } return *i.Emails } // GetEnvironments returns the Environments field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetEnvironments() string { if i == nil || i.Environments == nil { return "" } return *i.Environments } // GetFollowers returns the Followers field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetFollowers() string { if i == nil || i.Followers == nil { return "" } return *i.Followers } // GetIssues returns the Issues field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetIssues() string { if i == nil || i.Issues == nil { return "" } return *i.Issues } // GetMembers returns the Members field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetMembers() string { if i == nil || i.Members == nil { return "" } return *i.Members } // GetMetadata returns the Metadata field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetMetadata() string { if i == nil || i.Metadata == nil { return "" } return *i.Metadata } // GetOrganizationAdministration returns the OrganizationAdministration field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetOrganizationAdministration() string { if i == nil || i.OrganizationAdministration == nil { return "" } return *i.OrganizationAdministration } // GetOrganizationHooks returns the OrganizationHooks field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetOrganizationHooks() string { if i == nil || i.OrganizationHooks == nil { return "" } return *i.OrganizationHooks } // GetOrganizationPlan returns the OrganizationPlan field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetOrganizationPlan() string { if i == nil || i.OrganizationPlan == nil { return "" } return *i.OrganizationPlan } // GetOrganizationPreReceiveHooks returns the OrganizationPreReceiveHooks field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetOrganizationPreReceiveHooks() string { if i == nil || i.OrganizationPreReceiveHooks == nil { return "" } return *i.OrganizationPreReceiveHooks } // GetOrganizationProjects returns the OrganizationProjects field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetOrganizationProjects() string { if i == nil || i.OrganizationProjects == nil { return "" } return *i.OrganizationProjects } // GetOrganizationSecrets returns the OrganizationSecrets field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetOrganizationSecrets() string { if i == nil || i.OrganizationSecrets == nil { return "" } return *i.OrganizationSecrets } // GetOrganizationSelfHostedRunners returns the OrganizationSelfHostedRunners field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetOrganizationSelfHostedRunners() string { if i == nil || i.OrganizationSelfHostedRunners == nil { return "" } return *i.OrganizationSelfHostedRunners } // GetOrganizationUserBlocking returns the OrganizationUserBlocking field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetOrganizationUserBlocking() string { if i == nil || i.OrganizationUserBlocking == nil { return "" } return *i.OrganizationUserBlocking } // GetPackages returns the Packages field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetPackages() string { if i == nil || i.Packages == nil { return "" } return *i.Packages } // GetPages returns the Pages field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetPages() string { if i == nil || i.Pages == nil { return "" } return *i.Pages } // GetPullRequests returns the PullRequests field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetPullRequests() string { if i == nil || i.PullRequests == nil { return "" } return *i.PullRequests } // GetRepositoryHooks returns the RepositoryHooks field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetRepositoryHooks() string { if i == nil || i.RepositoryHooks == nil { return "" } return *i.RepositoryHooks } // GetRepositoryPreReceiveHooks returns the RepositoryPreReceiveHooks field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetRepositoryPreReceiveHooks() string { if i == nil || i.RepositoryPreReceiveHooks == nil { return "" } return *i.RepositoryPreReceiveHooks } // GetRepositoryProjects returns the RepositoryProjects field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetRepositoryProjects() string { if i == nil || i.RepositoryProjects == nil { return "" } return *i.RepositoryProjects } // GetSecrets returns the Secrets field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetSecrets() string { if i == nil || i.Secrets == nil { return "" } return *i.Secrets } // GetSecretScanningAlerts returns the SecretScanningAlerts field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetSecretScanningAlerts() string { if i == nil || i.SecretScanningAlerts == nil { return "" } return *i.SecretScanningAlerts } // GetSecurityEvents returns the SecurityEvents field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetSecurityEvents() string { if i == nil || i.SecurityEvents == nil { return "" } return *i.SecurityEvents } // GetSingleFile returns the SingleFile field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetSingleFile() string { if i == nil || i.SingleFile == nil { return "" } return *i.SingleFile } // GetStatuses returns the Statuses field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetStatuses() string { if i == nil || i.Statuses == nil { return "" } return *i.Statuses } // GetTeamDiscussions returns the TeamDiscussions field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetTeamDiscussions() string { if i == nil || i.TeamDiscussions == nil { return "" } return *i.TeamDiscussions } // GetVulnerabilityAlerts returns the VulnerabilityAlerts field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetVulnerabilityAlerts() string { if i == nil || i.VulnerabilityAlerts == nil { return "" } return *i.VulnerabilityAlerts } // GetWorkflows returns the Workflows field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetWorkflows() string { if i == nil || i.Workflows == nil { return "" } return *i.Workflows } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (i *InstallationRepositoriesEvent) GetAction() string { if i == nil || i.Action == nil { return "" } return *i.Action } // GetInstallation returns the Installation field. func (i *InstallationRepositoriesEvent) GetInstallation() *Installation { if i == nil { return nil } return i.Installation } // GetRepositorySelection returns the RepositorySelection field if it's non-nil, zero value otherwise. func (i *InstallationRepositoriesEvent) GetRepositorySelection() string { if i == nil || i.RepositorySelection == nil { return "" } return *i.RepositorySelection } // GetSender returns the Sender field. func (i *InstallationRepositoriesEvent) GetSender() *User { if i == nil { return nil } return i.Sender } // GetExpiresAt returns the ExpiresAt field if it's non-nil, zero value otherwise. func (i *InstallationToken) GetExpiresAt() time.Time { if i == nil || i.ExpiresAt == nil { return time.Time{} } return *i.ExpiresAt } // GetPermissions returns the Permissions field. func (i *InstallationToken) GetPermissions() *InstallationPermissions { if i == nil { return nil } return i.Permissions } // GetToken returns the Token field if it's non-nil, zero value otherwise. func (i *InstallationToken) GetToken() string { if i == nil || i.Token == nil { return "" } return *i.Token } // GetPermissions returns the Permissions field. func (i *InstallationTokenOptions) GetPermissions() *InstallationPermissions { if i == nil { return nil } return i.Permissions } // GetExpiresAt returns the ExpiresAt field if it's non-nil, zero value otherwise. func (i *InteractionRestriction) GetExpiresAt() Timestamp { if i == nil || i.ExpiresAt == nil { return Timestamp{} } return *i.ExpiresAt } // GetLimit returns the Limit field if it's non-nil, zero value otherwise. func (i *InteractionRestriction) GetLimit() string { if i == nil || i.Limit == nil { return "" } return *i.Limit } // GetOrigin returns the Origin field if it's non-nil, zero value otherwise. func (i *InteractionRestriction) GetOrigin() string { if i == nil || i.Origin == nil { return "" } return *i.Origin } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (i *Invitation) GetCreatedAt() time.Time { if i == nil || i.CreatedAt == nil { return time.Time{} } return *i.CreatedAt } // GetEmail returns the Email field if it's non-nil, zero value otherwise. func (i *Invitation) GetEmail() string { if i == nil || i.Email == nil { return "" } return *i.Email } // GetFailedAt returns the FailedAt field if it's non-nil, zero value otherwise. func (i *Invitation) GetFailedAt() Timestamp { if i == nil || i.FailedAt == nil { return Timestamp{} } return *i.FailedAt } // GetFailedReason returns the FailedReason field if it's non-nil, zero value otherwise. func (i *Invitation) GetFailedReason() string { if i == nil || i.FailedReason == nil { return "" } return *i.FailedReason } // GetID returns the ID field if it's non-nil, zero value otherwise. func (i *Invitation) GetID() int64 { if i == nil || i.ID == nil { return 0 } return *i.ID } // GetInvitationTeamURL returns the InvitationTeamURL field if it's non-nil, zero value otherwise. func (i *Invitation) GetInvitationTeamURL() string { if i == nil || i.InvitationTeamURL == nil { return "" } return *i.InvitationTeamURL } // GetInviter returns the Inviter field. func (i *Invitation) GetInviter() *User { if i == nil { return nil } return i.Inviter } // GetLogin returns the Login field if it's non-nil, zero value otherwise. func (i *Invitation) GetLogin() string { if i == nil || i.Login == nil { return "" } return *i.Login } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (i *Invitation) GetNodeID() string { if i == nil || i.NodeID == nil { return "" } return *i.NodeID } // GetRole returns the Role field if it's non-nil, zero value otherwise. func (i *Invitation) GetRole() string { if i == nil || i.Role == nil { return "" } return *i.Role } // GetTeamCount returns the TeamCount field if it's non-nil, zero value otherwise. func (i *Invitation) GetTeamCount() int { if i == nil || i.TeamCount == nil { return 0 } return *i.TeamCount } // GetActiveLockReason returns the ActiveLockReason field if it's non-nil, zero value otherwise. func (i *Issue) GetActiveLockReason() string { if i == nil || i.ActiveLockReason == nil { return "" } return *i.ActiveLockReason } // GetAssignee returns the Assignee field. func (i *Issue) GetAssignee() *User { if i == nil { return nil } return i.Assignee } // GetAuthorAssociation returns the AuthorAssociation field if it's non-nil, zero value otherwise. func (i *Issue) GetAuthorAssociation() string { if i == nil || i.AuthorAssociation == nil { return "" } return *i.AuthorAssociation } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (i *Issue) GetBody() string { if i == nil || i.Body == nil { return "" } return *i.Body } // GetClosedAt returns the ClosedAt field if it's non-nil, zero value otherwise. func (i *Issue) GetClosedAt() time.Time { if i == nil || i.ClosedAt == nil { return time.Time{} } return *i.ClosedAt } // GetClosedBy returns the ClosedBy field. func (i *Issue) GetClosedBy() *User { if i == nil { return nil } return i.ClosedBy } // GetComments returns the Comments field if it's non-nil, zero value otherwise. func (i *Issue) GetComments() int { if i == nil || i.Comments == nil { return 0 } return *i.Comments } // GetCommentsURL returns the CommentsURL field if it's non-nil, zero value otherwise. func (i *Issue) GetCommentsURL() string { if i == nil || i.CommentsURL == nil { return "" } return *i.CommentsURL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (i *Issue) GetCreatedAt() time.Time { if i == nil || i.CreatedAt == nil { return time.Time{} } return *i.CreatedAt } // GetEventsURL returns the EventsURL field if it's non-nil, zero value otherwise. func (i *Issue) GetEventsURL() string { if i == nil || i.EventsURL == nil { return "" } return *i.EventsURL } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (i *Issue) GetHTMLURL() string { if i == nil || i.HTMLURL == nil { return "" } return *i.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (i *Issue) GetID() int64 { if i == nil || i.ID == nil { return 0 } return *i.ID } // GetLabelsURL returns the LabelsURL field if it's non-nil, zero value otherwise. func (i *Issue) GetLabelsURL() string { if i == nil || i.LabelsURL == nil { return "" } return *i.LabelsURL } // GetLocked returns the Locked field if it's non-nil, zero value otherwise. func (i *Issue) GetLocked() bool { if i == nil || i.Locked == nil { return false } return *i.Locked } // GetMilestone returns the Milestone field. func (i *Issue) GetMilestone() *Milestone { if i == nil { return nil } return i.Milestone } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (i *Issue) GetNodeID() string { if i == nil || i.NodeID == nil { return "" } return *i.NodeID } // GetNumber returns the Number field if it's non-nil, zero value otherwise. func (i *Issue) GetNumber() int { if i == nil || i.Number == nil { return 0 } return *i.Number } // GetPullRequestLinks returns the PullRequestLinks field. func (i *Issue) GetPullRequestLinks() *PullRequestLinks { if i == nil { return nil } return i.PullRequestLinks } // GetReactions returns the Reactions field. func (i *Issue) GetReactions() *Reactions { if i == nil { return nil } return i.Reactions } // GetRepository returns the Repository field. func (i *Issue) GetRepository() *Repository { if i == nil { return nil } return i.Repository } // GetRepositoryURL returns the RepositoryURL field if it's non-nil, zero value otherwise. func (i *Issue) GetRepositoryURL() string { if i == nil || i.RepositoryURL == nil { return "" } return *i.RepositoryURL } // GetState returns the State field if it's non-nil, zero value otherwise. func (i *Issue) GetState() string { if i == nil || i.State == nil { return "" } return *i.State } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (i *Issue) GetTitle() string { if i == nil || i.Title == nil { return "" } return *i.Title } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (i *Issue) GetUpdatedAt() time.Time { if i == nil || i.UpdatedAt == nil { return time.Time{} } return *i.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (i *Issue) GetURL() string { if i == nil || i.URL == nil { return "" } return *i.URL } // GetUser returns the User field. func (i *Issue) GetUser() *User { if i == nil { return nil } return i.User } // GetAuthorAssociation returns the AuthorAssociation field if it's non-nil, zero value otherwise. func (i *IssueComment) GetAuthorAssociation() string { if i == nil || i.AuthorAssociation == nil { return "" } return *i.AuthorAssociation } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (i *IssueComment) GetBody() string { if i == nil || i.Body == nil { return "" } return *i.Body } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (i *IssueComment) GetCreatedAt() time.Time { if i == nil || i.CreatedAt == nil { return time.Time{} } return *i.CreatedAt } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (i *IssueComment) GetHTMLURL() string { if i == nil || i.HTMLURL == nil { return "" } return *i.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (i *IssueComment) GetID() int64 { if i == nil || i.ID == nil { return 0 } return *i.ID } // GetIssueURL returns the IssueURL field if it's non-nil, zero value otherwise. func (i *IssueComment) GetIssueURL() string { if i == nil || i.IssueURL == nil { return "" } return *i.IssueURL } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (i *IssueComment) GetNodeID() string { if i == nil || i.NodeID == nil { return "" } return *i.NodeID } // GetReactions returns the Reactions field. func (i *IssueComment) GetReactions() *Reactions { if i == nil { return nil } return i.Reactions } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (i *IssueComment) GetUpdatedAt() time.Time { if i == nil || i.UpdatedAt == nil { return time.Time{} } return *i.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (i *IssueComment) GetURL() string { if i == nil || i.URL == nil { return "" } return *i.URL } // GetUser returns the User field. func (i *IssueComment) GetUser() *User { if i == nil { return nil } return i.User } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (i *IssueCommentEvent) GetAction() string { if i == nil || i.Action == nil { return "" } return *i.Action } // GetChanges returns the Changes field. func (i *IssueCommentEvent) GetChanges() *EditChange { if i == nil { return nil } return i.Changes } // GetComment returns the Comment field. func (i *IssueCommentEvent) GetComment() *IssueComment { if i == nil { return nil } return i.Comment } // GetInstallation returns the Installation field. func (i *IssueCommentEvent) GetInstallation() *Installation { if i == nil { return nil } return i.Installation } // GetIssue returns the Issue field. func (i *IssueCommentEvent) GetIssue() *Issue { if i == nil { return nil } return i.Issue } // GetRepo returns the Repo field. func (i *IssueCommentEvent) GetRepo() *Repository { if i == nil { return nil } return i.Repo } // GetSender returns the Sender field. func (i *IssueCommentEvent) GetSender() *User { if i == nil { return nil } return i.Sender } // GetActor returns the Actor field. func (i *IssueEvent) GetActor() *User { if i == nil { return nil } return i.Actor } // GetAssignee returns the Assignee field. func (i *IssueEvent) GetAssignee() *User { if i == nil { return nil } return i.Assignee } // GetAssigner returns the Assigner field. func (i *IssueEvent) GetAssigner() *User { if i == nil { return nil } return i.Assigner } // GetCommitID returns the CommitID field if it's non-nil, zero value otherwise. func (i *IssueEvent) GetCommitID() string { if i == nil || i.CommitID == nil { return "" } return *i.CommitID } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (i *IssueEvent) GetCreatedAt() time.Time { if i == nil || i.CreatedAt == nil { return time.Time{} } return *i.CreatedAt } // GetDismissedReview returns the DismissedReview field. func (i *IssueEvent) GetDismissedReview() *DismissedReview { if i == nil { return nil } return i.DismissedReview } // GetEvent returns the Event field if it's non-nil, zero value otherwise. func (i *IssueEvent) GetEvent() string { if i == nil || i.Event == nil { return "" } return *i.Event } // GetID returns the ID field if it's non-nil, zero value otherwise. func (i *IssueEvent) GetID() int64 { if i == nil || i.ID == nil { return 0 } return *i.ID } // GetIssue returns the Issue field. func (i *IssueEvent) GetIssue() *Issue { if i == nil { return nil } return i.Issue } // GetLabel returns the Label field. func (i *IssueEvent) GetLabel() *Label { if i == nil { return nil } return i.Label } // GetLockReason returns the LockReason field if it's non-nil, zero value otherwise. func (i *IssueEvent) GetLockReason() string { if i == nil || i.LockReason == nil { return "" } return *i.LockReason } // GetMilestone returns the Milestone field. func (i *IssueEvent) GetMilestone() *Milestone { if i == nil { return nil } return i.Milestone } // GetProjectCard returns the ProjectCard field. func (i *IssueEvent) GetProjectCard() *ProjectCard { if i == nil { return nil } return i.ProjectCard } // GetRename returns the Rename field. func (i *IssueEvent) GetRename() *Rename { if i == nil { return nil } return i.Rename } // GetRequestedReviewer returns the RequestedReviewer field. func (i *IssueEvent) GetRequestedReviewer() *User { if i == nil { return nil } return i.RequestedReviewer } // GetReviewRequester returns the ReviewRequester field. func (i *IssueEvent) GetReviewRequester() *User { if i == nil { return nil } return i.ReviewRequester } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (i *IssueEvent) GetURL() string { if i == nil || i.URL == nil { return "" } return *i.URL } // GetAssignee returns the Assignee field if it's non-nil, zero value otherwise. func (i *IssueImport) GetAssignee() string { if i == nil || i.Assignee == nil { return "" } return *i.Assignee } // GetClosed returns the Closed field if it's non-nil, zero value otherwise. func (i *IssueImport) GetClosed() bool { if i == nil || i.Closed == nil { return false } return *i.Closed } // GetClosedAt returns the ClosedAt field if it's non-nil, zero value otherwise. func (i *IssueImport) GetClosedAt() time.Time { if i == nil || i.ClosedAt == nil { return time.Time{} } return *i.ClosedAt } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (i *IssueImport) GetCreatedAt() time.Time { if i == nil || i.CreatedAt == nil { return time.Time{} } return *i.CreatedAt } // GetMilestone returns the Milestone field if it's non-nil, zero value otherwise. func (i *IssueImport) GetMilestone() int { if i == nil || i.Milestone == nil { return 0 } return *i.Milestone } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (i *IssueImport) GetUpdatedAt() time.Time { if i == nil || i.UpdatedAt == nil { return time.Time{} } return *i.UpdatedAt } // GetCode returns the Code field if it's non-nil, zero value otherwise. func (i *IssueImportError) GetCode() string { if i == nil || i.Code == nil { return "" } return *i.Code } // GetField returns the Field field if it's non-nil, zero value otherwise. func (i *IssueImportError) GetField() string { if i == nil || i.Field == nil { return "" } return *i.Field } // GetLocation returns the Location field if it's non-nil, zero value otherwise. func (i *IssueImportError) GetLocation() string { if i == nil || i.Location == nil { return "" } return *i.Location } // GetResource returns the Resource field if it's non-nil, zero value otherwise. func (i *IssueImportError) GetResource() string { if i == nil || i.Resource == nil { return "" } return *i.Resource } // GetValue returns the Value field if it's non-nil, zero value otherwise. func (i *IssueImportError) GetValue() string { if i == nil || i.Value == nil { return "" } return *i.Value } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (i *IssueImportResponse) GetCreatedAt() time.Time { if i == nil || i.CreatedAt == nil { return time.Time{} } return *i.CreatedAt } // GetDocumentationURL returns the DocumentationURL field if it's non-nil, zero value otherwise. func (i *IssueImportResponse) GetDocumentationURL() string { if i == nil || i.DocumentationURL == nil { return "" } return *i.DocumentationURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (i *IssueImportResponse) GetID() int { if i == nil || i.ID == nil { return 0 } return *i.ID } // GetImportIssuesURL returns the ImportIssuesURL field if it's non-nil, zero value otherwise. func (i *IssueImportResponse) GetImportIssuesURL() string { if i == nil || i.ImportIssuesURL == nil { return "" } return *i.ImportIssuesURL } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (i *IssueImportResponse) GetMessage() string { if i == nil || i.Message == nil { return "" } return *i.Message } // GetRepositoryURL returns the RepositoryURL field if it's non-nil, zero value otherwise. func (i *IssueImportResponse) GetRepositoryURL() string { if i == nil || i.RepositoryURL == nil { return "" } return *i.RepositoryURL } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (i *IssueImportResponse) GetStatus() string { if i == nil || i.Status == nil { return "" } return *i.Status } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (i *IssueImportResponse) GetUpdatedAt() time.Time { if i == nil || i.UpdatedAt == nil { return time.Time{} } return *i.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (i *IssueImportResponse) GetURL() string { if i == nil || i.URL == nil { return "" } return *i.URL } // GetDirection returns the Direction field if it's non-nil, zero value otherwise. func (i *IssueListCommentsOptions) GetDirection() string { if i == nil || i.Direction == nil { return "" } return *i.Direction } // GetSince returns the Since field if it's non-nil, zero value otherwise. func (i *IssueListCommentsOptions) GetSince() time.Time { if i == nil || i.Since == nil { return time.Time{} } return *i.Since } // GetSort returns the Sort field if it's non-nil, zero value otherwise. func (i *IssueListCommentsOptions) GetSort() string { if i == nil || i.Sort == nil { return "" } return *i.Sort } // GetAssignee returns the Assignee field if it's non-nil, zero value otherwise. func (i *IssueRequest) GetAssignee() string { if i == nil || i.Assignee == nil { return "" } return *i.Assignee } // GetAssignees returns the Assignees field if it's non-nil, zero value otherwise. func (i *IssueRequest) GetAssignees() []string { if i == nil || i.Assignees == nil { return nil } return *i.Assignees } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (i *IssueRequest) GetBody() string { if i == nil || i.Body == nil { return "" } return *i.Body } // GetLabels returns the Labels field if it's non-nil, zero value otherwise. func (i *IssueRequest) GetLabels() []string { if i == nil || i.Labels == nil { return nil } return *i.Labels } // GetMilestone returns the Milestone field if it's non-nil, zero value otherwise. func (i *IssueRequest) GetMilestone() int { if i == nil || i.Milestone == nil { return 0 } return *i.Milestone } // GetState returns the State field if it's non-nil, zero value otherwise. func (i *IssueRequest) GetState() string { if i == nil || i.State == nil { return "" } return *i.State } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (i *IssueRequest) GetTitle() string { if i == nil || i.Title == nil { return "" } return *i.Title } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (i *IssuesEvent) GetAction() string { if i == nil || i.Action == nil { return "" } return *i.Action } // GetAssignee returns the Assignee field. func (i *IssuesEvent) GetAssignee() *User { if i == nil { return nil } return i.Assignee } // GetChanges returns the Changes field. func (i *IssuesEvent) GetChanges() *EditChange { if i == nil { return nil } return i.Changes } // GetInstallation returns the Installation field. func (i *IssuesEvent) GetInstallation() *Installation { if i == nil { return nil } return i.Installation } // GetIssue returns the Issue field. func (i *IssuesEvent) GetIssue() *Issue { if i == nil { return nil } return i.Issue } // GetLabel returns the Label field. func (i *IssuesEvent) GetLabel() *Label { if i == nil { return nil } return i.Label } // GetRepo returns the Repo field. func (i *IssuesEvent) GetRepo() *Repository { if i == nil { return nil } return i.Repo } // GetSender returns the Sender field. func (i *IssuesEvent) GetSender() *User { if i == nil { return nil } return i.Sender } // GetIncompleteResults returns the IncompleteResults field if it's non-nil, zero value otherwise. func (i *IssuesSearchResult) GetIncompleteResults() bool { if i == nil || i.IncompleteResults == nil { return false } return *i.IncompleteResults } // GetTotal returns the Total field if it's non-nil, zero value otherwise. func (i *IssuesSearchResult) GetTotal() int { if i == nil || i.Total == nil { return 0 } return *i.Total } // GetClosedIssues returns the ClosedIssues field if it's non-nil, zero value otherwise. func (i *IssueStats) GetClosedIssues() int { if i == nil || i.ClosedIssues == nil { return 0 } return *i.ClosedIssues } // GetOpenIssues returns the OpenIssues field if it's non-nil, zero value otherwise. func (i *IssueStats) GetOpenIssues() int { if i == nil || i.OpenIssues == nil { return 0 } return *i.OpenIssues } // GetTotalIssues returns the TotalIssues field if it's non-nil, zero value otherwise. func (i *IssueStats) GetTotalIssues() int { if i == nil || i.TotalIssues == nil { return 0 } return *i.TotalIssues } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (j *Jobs) GetTotalCount() int { if j == nil || j.TotalCount == nil { return 0 } return *j.TotalCount } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (k *Key) GetCreatedAt() Timestamp { if k == nil || k.CreatedAt == nil { return Timestamp{} } return *k.CreatedAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (k *Key) GetID() int64 { if k == nil || k.ID == nil { return 0 } return *k.ID } // GetKey returns the Key field if it's non-nil, zero value otherwise. func (k *Key) GetKey() string { if k == nil || k.Key == nil { return "" } return *k.Key } // GetReadOnly returns the ReadOnly field if it's non-nil, zero value otherwise. func (k *Key) GetReadOnly() bool { if k == nil || k.ReadOnly == nil { return false } return *k.ReadOnly } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (k *Key) GetTitle() string { if k == nil || k.Title == nil { return "" } return *k.Title } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (k *Key) GetURL() string { if k == nil || k.URL == nil { return "" } return *k.URL } // GetVerified returns the Verified field if it's non-nil, zero value otherwise. func (k *Key) GetVerified() bool { if k == nil || k.Verified == nil { return false } return *k.Verified } // GetColor returns the Color field if it's non-nil, zero value otherwise. func (l *Label) GetColor() string { if l == nil || l.Color == nil { return "" } return *l.Color } // GetDefault returns the Default field if it's non-nil, zero value otherwise. func (l *Label) GetDefault() bool { if l == nil || l.Default == nil { return false } return *l.Default } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (l *Label) GetDescription() string { if l == nil || l.Description == nil { return "" } return *l.Description } // GetID returns the ID field if it's non-nil, zero value otherwise. func (l *Label) GetID() int64 { if l == nil || l.ID == nil { return 0 } return *l.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (l *Label) GetName() string { if l == nil || l.Name == nil { return "" } return *l.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (l *Label) GetNodeID() string { if l == nil || l.NodeID == nil { return "" } return *l.NodeID } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (l *Label) GetURL() string { if l == nil || l.URL == nil { return "" } return *l.URL } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (l *LabelEvent) GetAction() string { if l == nil || l.Action == nil { return "" } return *l.Action } // GetChanges returns the Changes field. func (l *LabelEvent) GetChanges() *EditChange { if l == nil { return nil } return l.Changes } // GetInstallation returns the Installation field. func (l *LabelEvent) GetInstallation() *Installation { if l == nil { return nil } return l.Installation } // GetLabel returns the Label field. func (l *LabelEvent) GetLabel() *Label { if l == nil { return nil } return l.Label } // GetOrg returns the Org field. func (l *LabelEvent) GetOrg() *Organization { if l == nil { return nil } return l.Org } // GetRepo returns the Repo field. func (l *LabelEvent) GetRepo() *Repository { if l == nil { return nil } return l.Repo } // GetColor returns the Color field if it's non-nil, zero value otherwise. func (l *LabelResult) GetColor() string { if l == nil || l.Color == nil { return "" } return *l.Color } // GetDefault returns the Default field if it's non-nil, zero value otherwise. func (l *LabelResult) GetDefault() bool { if l == nil || l.Default == nil { return false } return *l.Default } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (l *LabelResult) GetDescription() string { if l == nil || l.Description == nil { return "" } return *l.Description } // GetID returns the ID field if it's non-nil, zero value otherwise. func (l *LabelResult) GetID() int64 { if l == nil || l.ID == nil { return 0 } return *l.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (l *LabelResult) GetName() string { if l == nil || l.Name == nil { return "" } return *l.Name } // GetScore returns the Score field. func (l *LabelResult) GetScore() *float64 { if l == nil { return nil } return l.Score } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (l *LabelResult) GetURL() string { if l == nil || l.URL == nil { return "" } return *l.URL } // GetIncompleteResults returns the IncompleteResults field if it's non-nil, zero value otherwise. func (l *LabelsSearchResult) GetIncompleteResults() bool { if l == nil || l.IncompleteResults == nil { return false } return *l.IncompleteResults } // GetTotal returns the Total field if it's non-nil, zero value otherwise. func (l *LabelsSearchResult) GetTotal() int { if l == nil || l.Total == nil { return 0 } return *l.Total } // GetOID returns the OID field if it's non-nil, zero value otherwise. func (l *LargeFile) GetOID() string { if l == nil || l.OID == nil { return "" } return *l.OID } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (l *LargeFile) GetPath() string { if l == nil || l.Path == nil { return "" } return *l.Path } // GetRefName returns the RefName field if it's non-nil, zero value otherwise. func (l *LargeFile) GetRefName() string { if l == nil || l.RefName == nil { return "" } return *l.RefName } // GetSize returns the Size field if it's non-nil, zero value otherwise. func (l *LargeFile) GetSize() int { if l == nil || l.Size == nil { return 0 } return *l.Size } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (l *License) GetBody() string { if l == nil || l.Body == nil { return "" } return *l.Body } // GetConditions returns the Conditions field if it's non-nil, zero value otherwise. func (l *License) GetConditions() []string { if l == nil || l.Conditions == nil { return nil } return *l.Conditions } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (l *License) GetDescription() string { if l == nil || l.Description == nil { return "" } return *l.Description } // GetFeatured returns the Featured field if it's non-nil, zero value otherwise. func (l *License) GetFeatured() bool { if l == nil || l.Featured == nil { return false } return *l.Featured } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (l *License) GetHTMLURL() string { if l == nil || l.HTMLURL == nil { return "" } return *l.HTMLURL } // GetImplementation returns the Implementation field if it's non-nil, zero value otherwise. func (l *License) GetImplementation() string { if l == nil || l.Implementation == nil { return "" } return *l.Implementation } // GetKey returns the Key field if it's non-nil, zero value otherwise. func (l *License) GetKey() string { if l == nil || l.Key == nil { return "" } return *l.Key } // GetLimitations returns the Limitations field if it's non-nil, zero value otherwise. func (l *License) GetLimitations() []string { if l == nil || l.Limitations == nil { return nil } return *l.Limitations } // GetName returns the Name field if it's non-nil, zero value otherwise. func (l *License) GetName() string { if l == nil || l.Name == nil { return "" } return *l.Name } // GetPermissions returns the Permissions field if it's non-nil, zero value otherwise. func (l *License) GetPermissions() []string { if l == nil || l.Permissions == nil { return nil } return *l.Permissions } // GetSPDXID returns the SPDXID field if it's non-nil, zero value otherwise. func (l *License) GetSPDXID() string { if l == nil || l.SPDXID == nil { return "" } return *l.SPDXID } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (l *License) GetURL() string { if l == nil || l.URL == nil { return "" } return *l.URL } // GetCheckName returns the CheckName field if it's non-nil, zero value otherwise. func (l *ListCheckRunsOptions) GetCheckName() string { if l == nil || l.CheckName == nil { return "" } return *l.CheckName } // GetFilter returns the Filter field if it's non-nil, zero value otherwise. func (l *ListCheckRunsOptions) GetFilter() string { if l == nil || l.Filter == nil { return "" } return *l.Filter } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (l *ListCheckRunsOptions) GetStatus() string { if l == nil || l.Status == nil { return "" } return *l.Status } // GetTotal returns the Total field if it's non-nil, zero value otherwise. func (l *ListCheckRunsResults) GetTotal() int { if l == nil || l.Total == nil { return 0 } return *l.Total } // GetAppID returns the AppID field if it's non-nil, zero value otherwise. func (l *ListCheckSuiteOptions) GetAppID() int { if l == nil || l.AppID == nil { return 0 } return *l.AppID } // GetCheckName returns the CheckName field if it's non-nil, zero value otherwise. func (l *ListCheckSuiteOptions) GetCheckName() string { if l == nil || l.CheckName == nil { return "" } return *l.CheckName } // GetTotal returns the Total field if it's non-nil, zero value otherwise. func (l *ListCheckSuiteResults) GetTotal() int { if l == nil || l.Total == nil { return 0 } return *l.Total } // GetAffiliation returns the Affiliation field if it's non-nil, zero value otherwise. func (l *ListCollaboratorOptions) GetAffiliation() string { if l == nil || l.Affiliation == nil { return "" } return *l.Affiliation } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (l *ListRepositories) GetTotalCount() int { if l == nil || l.TotalCount == nil { return 0 } return *l.TotalCount } // GetEndColumn returns the EndColumn field if it's non-nil, zero value otherwise. func (l *Location) GetEndColumn() int { if l == nil || l.EndColumn == nil { return 0 } return *l.EndColumn } // GetEndLine returns the EndLine field if it's non-nil, zero value otherwise. func (l *Location) GetEndLine() int { if l == nil || l.EndLine == nil { return 0 } return *l.EndLine } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (l *Location) GetPath() string { if l == nil || l.Path == nil { return "" } return *l.Path } // GetStartColumn returns the StartColumn field if it's non-nil, zero value otherwise. func (l *Location) GetStartColumn() int { if l == nil || l.StartColumn == nil { return 0 } return *l.StartColumn } // GetStartLine returns the StartLine field if it's non-nil, zero value otherwise. func (l *Location) GetStartLine() int { if l == nil || l.StartLine == nil { return 0 } return *l.StartLine } // GetEffectiveDate returns the EffectiveDate field if it's non-nil, zero value otherwise. func (m *MarketplacePendingChange) GetEffectiveDate() Timestamp { if m == nil || m.EffectiveDate == nil { return Timestamp{} } return *m.EffectiveDate } // GetID returns the ID field if it's non-nil, zero value otherwise. func (m *MarketplacePendingChange) GetID() int64 { if m == nil || m.ID == nil { return 0 } return *m.ID } // GetPlan returns the Plan field. func (m *MarketplacePendingChange) GetPlan() *MarketplacePlan { if m == nil { return nil } return m.Plan } // GetUnitCount returns the UnitCount field if it's non-nil, zero value otherwise. func (m *MarketplacePendingChange) GetUnitCount() int { if m == nil || m.UnitCount == nil { return 0 } return *m.UnitCount } // GetAccountsURL returns the AccountsURL field if it's non-nil, zero value otherwise. func (m *MarketplacePlan) GetAccountsURL() string { if m == nil || m.AccountsURL == nil { return "" } return *m.AccountsURL } // GetBullets returns the Bullets field if it's non-nil, zero value otherwise. func (m *MarketplacePlan) GetBullets() []string { if m == nil || m.Bullets == nil { return nil } return *m.Bullets } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (m *MarketplacePlan) GetDescription() string { if m == nil || m.Description == nil { return "" } return *m.Description } // GetHasFreeTrial returns the HasFreeTrial field if it's non-nil, zero value otherwise. func (m *MarketplacePlan) GetHasFreeTrial() bool { if m == nil || m.HasFreeTrial == nil { return false } return *m.HasFreeTrial } // GetID returns the ID field if it's non-nil, zero value otherwise. func (m *MarketplacePlan) GetID() int64 { if m == nil || m.ID == nil { return 0 } return *m.ID } // GetMonthlyPriceInCents returns the MonthlyPriceInCents field if it's non-nil, zero value otherwise. func (m *MarketplacePlan) GetMonthlyPriceInCents() int { if m == nil || m.MonthlyPriceInCents == nil { return 0 } return *m.MonthlyPriceInCents } // GetName returns the Name field if it's non-nil, zero value otherwise. func (m *MarketplacePlan) GetName() string { if m == nil || m.Name == nil { return "" } return *m.Name } // GetNumber returns the Number field if it's non-nil, zero value otherwise. func (m *MarketplacePlan) GetNumber() int { if m == nil || m.Number == nil { return 0 } return *m.Number } // GetPriceModel returns the PriceModel field if it's non-nil, zero value otherwise. func (m *MarketplacePlan) GetPriceModel() string { if m == nil || m.PriceModel == nil { return "" } return *m.PriceModel } // GetState returns the State field if it's non-nil, zero value otherwise. func (m *MarketplacePlan) GetState() string { if m == nil || m.State == nil { return "" } return *m.State } // GetUnitName returns the UnitName field if it's non-nil, zero value otherwise. func (m *MarketplacePlan) GetUnitName() string { if m == nil || m.UnitName == nil { return "" } return *m.UnitName } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (m *MarketplacePlan) GetURL() string { if m == nil || m.URL == nil { return "" } return *m.URL } // GetYearlyPriceInCents returns the YearlyPriceInCents field if it's non-nil, zero value otherwise. func (m *MarketplacePlan) GetYearlyPriceInCents() int { if m == nil || m.YearlyPriceInCents == nil { return 0 } return *m.YearlyPriceInCents } // GetID returns the ID field if it's non-nil, zero value otherwise. func (m *MarketplacePlanAccount) GetID() int64 { if m == nil || m.ID == nil { return 0 } return *m.ID } // GetLogin returns the Login field if it's non-nil, zero value otherwise. func (m *MarketplacePlanAccount) GetLogin() string { if m == nil || m.Login == nil { return "" } return *m.Login } // GetMarketplacePendingChange returns the MarketplacePendingChange field. func (m *MarketplacePlanAccount) GetMarketplacePendingChange() *MarketplacePendingChange { if m == nil { return nil } return m.MarketplacePendingChange } // GetMarketplacePurchase returns the MarketplacePurchase field. func (m *MarketplacePlanAccount) GetMarketplacePurchase() *MarketplacePurchase { if m == nil { return nil } return m.MarketplacePurchase } // GetOrganizationBillingEmail returns the OrganizationBillingEmail field if it's non-nil, zero value otherwise. func (m *MarketplacePlanAccount) GetOrganizationBillingEmail() string { if m == nil || m.OrganizationBillingEmail == nil { return "" } return *m.OrganizationBillingEmail } // GetType returns the Type field if it's non-nil, zero value otherwise. func (m *MarketplacePlanAccount) GetType() string { if m == nil || m.Type == nil { return "" } return *m.Type } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (m *MarketplacePlanAccount) GetURL() string { if m == nil || m.URL == nil { return "" } return *m.URL } // GetBillingCycle returns the BillingCycle field if it's non-nil, zero value otherwise. func (m *MarketplacePurchase) GetBillingCycle() string { if m == nil || m.BillingCycle == nil { return "" } return *m.BillingCycle } // GetFreeTrialEndsOn returns the FreeTrialEndsOn field if it's non-nil, zero value otherwise. func (m *MarketplacePurchase) GetFreeTrialEndsOn() Timestamp { if m == nil || m.FreeTrialEndsOn == nil { return Timestamp{} } return *m.FreeTrialEndsOn } // GetNextBillingDate returns the NextBillingDate field if it's non-nil, zero value otherwise. func (m *MarketplacePurchase) GetNextBillingDate() Timestamp { if m == nil || m.NextBillingDate == nil { return Timestamp{} } return *m.NextBillingDate } // GetOnFreeTrial returns the OnFreeTrial field if it's non-nil, zero value otherwise. func (m *MarketplacePurchase) GetOnFreeTrial() bool { if m == nil || m.OnFreeTrial == nil { return false } return *m.OnFreeTrial } // GetPlan returns the Plan field. func (m *MarketplacePurchase) GetPlan() *MarketplacePlan { if m == nil { return nil } return m.Plan } // GetUnitCount returns the UnitCount field if it's non-nil, zero value otherwise. func (m *MarketplacePurchase) GetUnitCount() int { if m == nil || m.UnitCount == nil { return 0 } return *m.UnitCount } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (m *MarketplacePurchase) GetUpdatedAt() Timestamp { if m == nil || m.UpdatedAt == nil { return Timestamp{} } return *m.UpdatedAt } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (m *MarketplacePurchaseEvent) GetAction() string { if m == nil || m.Action == nil { return "" } return *m.Action } // GetEffectiveDate returns the EffectiveDate field if it's non-nil, zero value otherwise. func (m *MarketplacePurchaseEvent) GetEffectiveDate() Timestamp { if m == nil || m.EffectiveDate == nil { return Timestamp{} } return *m.EffectiveDate } // GetInstallation returns the Installation field. func (m *MarketplacePurchaseEvent) GetInstallation() *Installation { if m == nil { return nil } return m.Installation } // GetMarketplacePurchase returns the MarketplacePurchase field. func (m *MarketplacePurchaseEvent) GetMarketplacePurchase() *MarketplacePurchase { if m == nil { return nil } return m.MarketplacePurchase } // GetPreviousMarketplacePurchase returns the PreviousMarketplacePurchase field. func (m *MarketplacePurchaseEvent) GetPreviousMarketplacePurchase() *MarketplacePurchase { if m == nil { return nil } return m.PreviousMarketplacePurchase } // GetSender returns the Sender field. func (m *MarketplacePurchaseEvent) GetSender() *User { if m == nil { return nil } return m.Sender } // GetText returns the Text field if it's non-nil, zero value otherwise. func (m *Match) GetText() string { if m == nil || m.Text == nil { return "" } return *m.Text } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (m *MemberEvent) GetAction() string { if m == nil || m.Action == nil { return "" } return *m.Action } // GetInstallation returns the Installation field. func (m *MemberEvent) GetInstallation() *Installation { if m == nil { return nil } return m.Installation } // GetMember returns the Member field. func (m *MemberEvent) GetMember() *User { if m == nil { return nil } return m.Member } // GetRepo returns the Repo field. func (m *MemberEvent) GetRepo() *Repository { if m == nil { return nil } return m.Repo } // GetSender returns the Sender field. func (m *MemberEvent) GetSender() *User { if m == nil { return nil } return m.Sender } // GetOrganization returns the Organization field. func (m *Membership) GetOrganization() *Organization { if m == nil { return nil } return m.Organization } // GetOrganizationURL returns the OrganizationURL field if it's non-nil, zero value otherwise. func (m *Membership) GetOrganizationURL() string { if m == nil || m.OrganizationURL == nil { return "" } return *m.OrganizationURL } // GetRole returns the Role field if it's non-nil, zero value otherwise. func (m *Membership) GetRole() string { if m == nil || m.Role == nil { return "" } return *m.Role } // GetState returns the State field if it's non-nil, zero value otherwise. func (m *Membership) GetState() string { if m == nil || m.State == nil { return "" } return *m.State } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (m *Membership) GetURL() string { if m == nil || m.URL == nil { return "" } return *m.URL } // GetUser returns the User field. func (m *Membership) GetUser() *User { if m == nil { return nil } return m.User } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (m *MembershipEvent) GetAction() string { if m == nil || m.Action == nil { return "" } return *m.Action } // GetInstallation returns the Installation field. func (m *MembershipEvent) GetInstallation() *Installation { if m == nil { return nil } return m.Installation } // GetMember returns the Member field. func (m *MembershipEvent) GetMember() *User { if m == nil { return nil } return m.Member } // GetOrg returns the Org field. func (m *MembershipEvent) GetOrg() *Organization { if m == nil { return nil } return m.Org } // GetScope returns the Scope field if it's non-nil, zero value otherwise. func (m *MembershipEvent) GetScope() string { if m == nil || m.Scope == nil { return "" } return *m.Scope } // GetSender returns the Sender field. func (m *MembershipEvent) GetSender() *User { if m == nil { return nil } return m.Sender } // GetTeam returns the Team field. func (m *MembershipEvent) GetTeam() *Team { if m == nil { return nil } return m.Team } // GetText returns the Text field if it's non-nil, zero value otherwise. func (m *Message) GetText() string { if m == nil || m.Text == nil { return "" } return *m.Text } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (m *MetaEvent) GetAction() string { if m == nil || m.Action == nil { return "" } return *m.Action } // GetHook returns the Hook field. func (m *MetaEvent) GetHook() *Hook { if m == nil { return nil } return m.Hook } // GetHookID returns the HookID field if it's non-nil, zero value otherwise. func (m *MetaEvent) GetHookID() int64 { if m == nil || m.HookID == nil { return 0 } return *m.HookID } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (m *Metric) GetHTMLURL() string { if m == nil || m.HTMLURL == nil { return "" } return *m.HTMLURL } // GetKey returns the Key field if it's non-nil, zero value otherwise. func (m *Metric) GetKey() string { if m == nil || m.Key == nil { return "" } return *m.Key } // GetName returns the Name field if it's non-nil, zero value otherwise. func (m *Metric) GetName() string { if m == nil || m.Name == nil { return "" } return *m.Name } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (m *Metric) GetURL() string { if m == nil || m.URL == nil { return "" } return *m.URL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (m *Migration) GetCreatedAt() string { if m == nil || m.CreatedAt == nil { return "" } return *m.CreatedAt } // GetExcludeAttachments returns the ExcludeAttachments field if it's non-nil, zero value otherwise. func (m *Migration) GetExcludeAttachments() bool { if m == nil || m.ExcludeAttachments == nil { return false } return *m.ExcludeAttachments } // GetGUID returns the GUID field if it's non-nil, zero value otherwise. func (m *Migration) GetGUID() string { if m == nil || m.GUID == nil { return "" } return *m.GUID } // GetID returns the ID field if it's non-nil, zero value otherwise. func (m *Migration) GetID() int64 { if m == nil || m.ID == nil { return 0 } return *m.ID } // GetLockRepositories returns the LockRepositories field if it's non-nil, zero value otherwise. func (m *Migration) GetLockRepositories() bool { if m == nil || m.LockRepositories == nil { return false } return *m.LockRepositories } // GetState returns the State field if it's non-nil, zero value otherwise. func (m *Migration) GetState() string { if m == nil || m.State == nil { return "" } return *m.State } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (m *Migration) GetUpdatedAt() string { if m == nil || m.UpdatedAt == nil { return "" } return *m.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (m *Migration) GetURL() string { if m == nil || m.URL == nil { return "" } return *m.URL } // GetClosedAt returns the ClosedAt field if it's non-nil, zero value otherwise. func (m *Milestone) GetClosedAt() time.Time { if m == nil || m.ClosedAt == nil { return time.Time{} } return *m.ClosedAt } // GetClosedIssues returns the ClosedIssues field if it's non-nil, zero value otherwise. func (m *Milestone) GetClosedIssues() int { if m == nil || m.ClosedIssues == nil { return 0 } return *m.ClosedIssues } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (m *Milestone) GetCreatedAt() time.Time { if m == nil || m.CreatedAt == nil { return time.Time{} } return *m.CreatedAt } // GetCreator returns the Creator field. func (m *Milestone) GetCreator() *User { if m == nil { return nil } return m.Creator } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (m *Milestone) GetDescription() string { if m == nil || m.Description == nil { return "" } return *m.Description } // GetDueOn returns the DueOn field if it's non-nil, zero value otherwise. func (m *Milestone) GetDueOn() time.Time { if m == nil || m.DueOn == nil { return time.Time{} } return *m.DueOn } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (m *Milestone) GetHTMLURL() string { if m == nil || m.HTMLURL == nil { return "" } return *m.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (m *Milestone) GetID() int64 { if m == nil || m.ID == nil { return 0 } return *m.ID } // GetLabelsURL returns the LabelsURL field if it's non-nil, zero value otherwise. func (m *Milestone) GetLabelsURL() string { if m == nil || m.LabelsURL == nil { return "" } return *m.LabelsURL } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (m *Milestone) GetNodeID() string { if m == nil || m.NodeID == nil { return "" } return *m.NodeID } // GetNumber returns the Number field if it's non-nil, zero value otherwise. func (m *Milestone) GetNumber() int { if m == nil || m.Number == nil { return 0 } return *m.Number } // GetOpenIssues returns the OpenIssues field if it's non-nil, zero value otherwise. func (m *Milestone) GetOpenIssues() int { if m == nil || m.OpenIssues == nil { return 0 } return *m.OpenIssues } // GetState returns the State field if it's non-nil, zero value otherwise. func (m *Milestone) GetState() string { if m == nil || m.State == nil { return "" } return *m.State } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (m *Milestone) GetTitle() string { if m == nil || m.Title == nil { return "" } return *m.Title } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (m *Milestone) GetUpdatedAt() time.Time { if m == nil || m.UpdatedAt == nil { return time.Time{} } return *m.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (m *Milestone) GetURL() string { if m == nil || m.URL == nil { return "" } return *m.URL } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (m *MilestoneEvent) GetAction() string { if m == nil || m.Action == nil { return "" } return *m.Action } // GetChanges returns the Changes field. func (m *MilestoneEvent) GetChanges() *EditChange { if m == nil { return nil } return m.Changes } // GetInstallation returns the Installation field. func (m *MilestoneEvent) GetInstallation() *Installation { if m == nil { return nil } return m.Installation } // GetMilestone returns the Milestone field. func (m *MilestoneEvent) GetMilestone() *Milestone { if m == nil { return nil } return m.Milestone } // GetOrg returns the Org field. func (m *MilestoneEvent) GetOrg() *Organization { if m == nil { return nil } return m.Org } // GetRepo returns the Repo field. func (m *MilestoneEvent) GetRepo() *Repository { if m == nil { return nil } return m.Repo } // GetSender returns the Sender field. func (m *MilestoneEvent) GetSender() *User { if m == nil { return nil } return m.Sender } // GetClosedMilestones returns the ClosedMilestones field if it's non-nil, zero value otherwise. func (m *MilestoneStats) GetClosedMilestones() int { if m == nil || m.ClosedMilestones == nil { return 0 } return *m.ClosedMilestones } // GetOpenMilestones returns the OpenMilestones field if it's non-nil, zero value otherwise. func (m *MilestoneStats) GetOpenMilestones() int { if m == nil || m.OpenMilestones == nil { return 0 } return *m.OpenMilestones } // GetTotalMilestones returns the TotalMilestones field if it's non-nil, zero value otherwise. func (m *MilestoneStats) GetTotalMilestones() int { if m == nil || m.TotalMilestones == nil { return 0 } return *m.TotalMilestones } // GetAnalysisKey returns the AnalysisKey field if it's non-nil, zero value otherwise. func (m *MostRecentInstance) GetAnalysisKey() string { if m == nil || m.AnalysisKey == nil { return "" } return *m.AnalysisKey } // GetCommitSHA returns the CommitSHA field if it's non-nil, zero value otherwise. func (m *MostRecentInstance) GetCommitSHA() string { if m == nil || m.CommitSHA == nil { return "" } return *m.CommitSHA } // GetEnvironment returns the Environment field if it's non-nil, zero value otherwise. func (m *MostRecentInstance) GetEnvironment() string { if m == nil || m.Environment == nil { return "" } return *m.Environment } // GetLocation returns the Location field. func (m *MostRecentInstance) GetLocation() *Location { if m == nil { return nil } return m.Location } // GetMessage returns the Message field. func (m *MostRecentInstance) GetMessage() *Message { if m == nil { return nil } return m.Message } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (m *MostRecentInstance) GetRef() string { if m == nil || m.Ref == nil { return "" } return *m.Ref } // GetState returns the State field if it's non-nil, zero value otherwise. func (m *MostRecentInstance) GetState() string { if m == nil || m.State == nil { return "" } return *m.State } // GetBase returns the Base field if it's non-nil, zero value otherwise. func (n *NewPullRequest) GetBase() string { if n == nil || n.Base == nil { return "" } return *n.Base } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (n *NewPullRequest) GetBody() string { if n == nil || n.Body == nil { return "" } return *n.Body } // GetDraft returns the Draft field if it's non-nil, zero value otherwise. func (n *NewPullRequest) GetDraft() bool { if n == nil || n.Draft == nil { return false } return *n.Draft } // GetHead returns the Head field if it's non-nil, zero value otherwise. func (n *NewPullRequest) GetHead() string { if n == nil || n.Head == nil { return "" } return *n.Head } // GetIssue returns the Issue field if it's non-nil, zero value otherwise. func (n *NewPullRequest) GetIssue() int { if n == nil || n.Issue == nil { return 0 } return *n.Issue } // GetMaintainerCanModify returns the MaintainerCanModify field if it's non-nil, zero value otherwise. func (n *NewPullRequest) GetMaintainerCanModify() bool { if n == nil || n.MaintainerCanModify == nil { return false } return *n.MaintainerCanModify } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (n *NewPullRequest) GetTitle() string { if n == nil || n.Title == nil { return "" } return *n.Title } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (n *NewTeam) GetDescription() string { if n == nil || n.Description == nil { return "" } return *n.Description } // GetLDAPDN returns the LDAPDN field if it's non-nil, zero value otherwise. func (n *NewTeam) GetLDAPDN() string { if n == nil || n.LDAPDN == nil { return "" } return *n.LDAPDN } // GetParentTeamID returns the ParentTeamID field if it's non-nil, zero value otherwise. func (n *NewTeam) GetParentTeamID() int64 { if n == nil || n.ParentTeamID == nil { return 0 } return *n.ParentTeamID } // GetPermission returns the Permission field if it's non-nil, zero value otherwise. func (n *NewTeam) GetPermission() string { if n == nil || n.Permission == nil { return "" } return *n.Permission } // GetPrivacy returns the Privacy field if it's non-nil, zero value otherwise. func (n *NewTeam) GetPrivacy() string { if n == nil || n.Privacy == nil { return "" } return *n.Privacy } // GetID returns the ID field if it's non-nil, zero value otherwise. func (n *Notification) GetID() string { if n == nil || n.ID == nil { return "" } return *n.ID } // GetLastReadAt returns the LastReadAt field if it's non-nil, zero value otherwise. func (n *Notification) GetLastReadAt() time.Time { if n == nil || n.LastReadAt == nil { return time.Time{} } return *n.LastReadAt } // GetReason returns the Reason field if it's non-nil, zero value otherwise. func (n *Notification) GetReason() string { if n == nil || n.Reason == nil { return "" } return *n.Reason } // GetRepository returns the Repository field. func (n *Notification) GetRepository() *Repository { if n == nil { return nil } return n.Repository } // GetSubject returns the Subject field. func (n *Notification) GetSubject() *NotificationSubject { if n == nil { return nil } return n.Subject } // GetUnread returns the Unread field if it's non-nil, zero value otherwise. func (n *Notification) GetUnread() bool { if n == nil || n.Unread == nil { return false } return *n.Unread } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (n *Notification) GetUpdatedAt() time.Time { if n == nil || n.UpdatedAt == nil { return time.Time{} } return *n.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (n *Notification) GetURL() string { if n == nil || n.URL == nil { return "" } return *n.URL } // GetLatestCommentURL returns the LatestCommentURL field if it's non-nil, zero value otherwise. func (n *NotificationSubject) GetLatestCommentURL() string { if n == nil || n.LatestCommentURL == nil { return "" } return *n.LatestCommentURL } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (n *NotificationSubject) GetTitle() string { if n == nil || n.Title == nil { return "" } return *n.Title } // GetType returns the Type field if it's non-nil, zero value otherwise. func (n *NotificationSubject) GetType() string { if n == nil || n.Type == nil { return "" } return *n.Type } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (n *NotificationSubject) GetURL() string { if n == nil || n.URL == nil { return "" } return *n.URL } // GetClientID returns the ClientID field if it's non-nil, zero value otherwise. func (o *OAuthAPP) GetClientID() string { if o == nil || o.ClientID == nil { return "" } return *o.ClientID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (o *OAuthAPP) GetName() string { if o == nil || o.Name == nil { return "" } return *o.Name } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (o *OAuthAPP) GetURL() string { if o == nil || o.URL == nil { return "" } return *o.URL } // GetAvatarURL returns the AvatarURL field if it's non-nil, zero value otherwise. func (o *Organization) GetAvatarURL() string { if o == nil || o.AvatarURL == nil { return "" } return *o.AvatarURL } // GetBillingEmail returns the BillingEmail field if it's non-nil, zero value otherwise. func (o *Organization) GetBillingEmail() string { if o == nil || o.BillingEmail == nil { return "" } return *o.BillingEmail } // GetBlog returns the Blog field if it's non-nil, zero value otherwise. func (o *Organization) GetBlog() string { if o == nil || o.Blog == nil { return "" } return *o.Blog } // GetCollaborators returns the Collaborators field if it's non-nil, zero value otherwise. func (o *Organization) GetCollaborators() int { if o == nil || o.Collaborators == nil { return 0 } return *o.Collaborators } // GetCompany returns the Company field if it's non-nil, zero value otherwise. func (o *Organization) GetCompany() string { if o == nil || o.Company == nil { return "" } return *o.Company } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (o *Organization) GetCreatedAt() time.Time { if o == nil || o.CreatedAt == nil { return time.Time{} } return *o.CreatedAt } // GetDefaultRepoPermission returns the DefaultRepoPermission field if it's non-nil, zero value otherwise. func (o *Organization) GetDefaultRepoPermission() string { if o == nil || o.DefaultRepoPermission == nil { return "" } return *o.DefaultRepoPermission } // GetDefaultRepoSettings returns the DefaultRepoSettings field if it's non-nil, zero value otherwise. func (o *Organization) GetDefaultRepoSettings() string { if o == nil || o.DefaultRepoSettings == nil { return "" } return *o.DefaultRepoSettings } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (o *Organization) GetDescription() string { if o == nil || o.Description == nil { return "" } return *o.Description } // GetDiskUsage returns the DiskUsage field if it's non-nil, zero value otherwise. func (o *Organization) GetDiskUsage() int { if o == nil || o.DiskUsage == nil { return 0 } return *o.DiskUsage } // GetEmail returns the Email field if it's non-nil, zero value otherwise. func (o *Organization) GetEmail() string { if o == nil || o.Email == nil { return "" } return *o.Email } // GetEventsURL returns the EventsURL field if it's non-nil, zero value otherwise. func (o *Organization) GetEventsURL() string { if o == nil || o.EventsURL == nil { return "" } return *o.EventsURL } // GetFollowers returns the Followers field if it's non-nil, zero value otherwise. func (o *Organization) GetFollowers() int { if o == nil || o.Followers == nil { return 0 } return *o.Followers } // GetFollowing returns the Following field if it's non-nil, zero value otherwise. func (o *Organization) GetFollowing() int { if o == nil || o.Following == nil { return 0 } return *o.Following } // GetHasOrganizationProjects returns the HasOrganizationProjects field if it's non-nil, zero value otherwise. func (o *Organization) GetHasOrganizationProjects() bool { if o == nil || o.HasOrganizationProjects == nil { return false } return *o.HasOrganizationProjects } // GetHasRepositoryProjects returns the HasRepositoryProjects field if it's non-nil, zero value otherwise. func (o *Organization) GetHasRepositoryProjects() bool { if o == nil || o.HasRepositoryProjects == nil { return false } return *o.HasRepositoryProjects } // GetHooksURL returns the HooksURL field if it's non-nil, zero value otherwise. func (o *Organization) GetHooksURL() string { if o == nil || o.HooksURL == nil { return "" } return *o.HooksURL } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (o *Organization) GetHTMLURL() string { if o == nil || o.HTMLURL == nil { return "" } return *o.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (o *Organization) GetID() int64 { if o == nil || o.ID == nil { return 0 } return *o.ID } // GetIssuesURL returns the IssuesURL field if it's non-nil, zero value otherwise. func (o *Organization) GetIssuesURL() string { if o == nil || o.IssuesURL == nil { return "" } return *o.IssuesURL } // GetIsVerified returns the IsVerified field if it's non-nil, zero value otherwise. func (o *Organization) GetIsVerified() bool { if o == nil || o.IsVerified == nil { return false } return *o.IsVerified } // GetLocation returns the Location field if it's non-nil, zero value otherwise. func (o *Organization) GetLocation() string { if o == nil || o.Location == nil { return "" } return *o.Location } // GetLogin returns the Login field if it's non-nil, zero value otherwise. func (o *Organization) GetLogin() string { if o == nil || o.Login == nil { return "" } return *o.Login } // GetMembersAllowedRepositoryCreationType returns the MembersAllowedRepositoryCreationType field if it's non-nil, zero value otherwise. func (o *Organization) GetMembersAllowedRepositoryCreationType() string { if o == nil || o.MembersAllowedRepositoryCreationType == nil { return "" } return *o.MembersAllowedRepositoryCreationType } // GetMembersCanCreateInternalRepos returns the MembersCanCreateInternalRepos field if it's non-nil, zero value otherwise. func (o *Organization) GetMembersCanCreateInternalRepos() bool { if o == nil || o.MembersCanCreateInternalRepos == nil { return false } return *o.MembersCanCreateInternalRepos } // GetMembersCanCreatePages returns the MembersCanCreatePages field if it's non-nil, zero value otherwise. func (o *Organization) GetMembersCanCreatePages() bool { if o == nil || o.MembersCanCreatePages == nil { return false } return *o.MembersCanCreatePages } // GetMembersCanCreatePrivatePages returns the MembersCanCreatePrivatePages field if it's non-nil, zero value otherwise. func (o *Organization) GetMembersCanCreatePrivatePages() bool { if o == nil || o.MembersCanCreatePrivatePages == nil { return false } return *o.MembersCanCreatePrivatePages } // GetMembersCanCreatePrivateRepos returns the MembersCanCreatePrivateRepos field if it's non-nil, zero value otherwise. func (o *Organization) GetMembersCanCreatePrivateRepos() bool { if o == nil || o.MembersCanCreatePrivateRepos == nil { return false } return *o.MembersCanCreatePrivateRepos } // GetMembersCanCreatePublicPages returns the MembersCanCreatePublicPages field if it's non-nil, zero value otherwise. func (o *Organization) GetMembersCanCreatePublicPages() bool { if o == nil || o.MembersCanCreatePublicPages == nil { return false } return *o.MembersCanCreatePublicPages } // GetMembersCanCreatePublicRepos returns the MembersCanCreatePublicRepos field if it's non-nil, zero value otherwise. func (o *Organization) GetMembersCanCreatePublicRepos() bool { if o == nil || o.MembersCanCreatePublicRepos == nil { return false } return *o.MembersCanCreatePublicRepos } // GetMembersCanCreateRepos returns the MembersCanCreateRepos field if it's non-nil, zero value otherwise. func (o *Organization) GetMembersCanCreateRepos() bool { if o == nil || o.MembersCanCreateRepos == nil { return false } return *o.MembersCanCreateRepos } // GetMembersURL returns the MembersURL field if it's non-nil, zero value otherwise. func (o *Organization) GetMembersURL() string { if o == nil || o.MembersURL == nil { return "" } return *o.MembersURL } // GetName returns the Name field if it's non-nil, zero value otherwise. func (o *Organization) GetName() string { if o == nil || o.Name == nil { return "" } return *o.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (o *Organization) GetNodeID() string { if o == nil || o.NodeID == nil { return "" } return *o.NodeID } // GetOwnedPrivateRepos returns the OwnedPrivateRepos field if it's non-nil, zero value otherwise. func (o *Organization) GetOwnedPrivateRepos() int { if o == nil || o.OwnedPrivateRepos == nil { return 0 } return *o.OwnedPrivateRepos } // GetPlan returns the Plan field. func (o *Organization) GetPlan() *Plan { if o == nil { return nil } return o.Plan } // GetPrivateGists returns the PrivateGists field if it's non-nil, zero value otherwise. func (o *Organization) GetPrivateGists() int { if o == nil || o.PrivateGists == nil { return 0 } return *o.PrivateGists } // GetPublicGists returns the PublicGists field if it's non-nil, zero value otherwise. func (o *Organization) GetPublicGists() int { if o == nil || o.PublicGists == nil { return 0 } return *o.PublicGists } // GetPublicMembersURL returns the PublicMembersURL field if it's non-nil, zero value otherwise. func (o *Organization) GetPublicMembersURL() string { if o == nil || o.PublicMembersURL == nil { return "" } return *o.PublicMembersURL } // GetPublicRepos returns the PublicRepos field if it's non-nil, zero value otherwise. func (o *Organization) GetPublicRepos() int { if o == nil || o.PublicRepos == nil { return 0 } return *o.PublicRepos } // GetReposURL returns the ReposURL field if it's non-nil, zero value otherwise. func (o *Organization) GetReposURL() string { if o == nil || o.ReposURL == nil { return "" } return *o.ReposURL } // GetTotalPrivateRepos returns the TotalPrivateRepos field if it's non-nil, zero value otherwise. func (o *Organization) GetTotalPrivateRepos() int { if o == nil || o.TotalPrivateRepos == nil { return 0 } return *o.TotalPrivateRepos } // GetTwitterUsername returns the TwitterUsername field if it's non-nil, zero value otherwise. func (o *Organization) GetTwitterUsername() string { if o == nil || o.TwitterUsername == nil { return "" } return *o.TwitterUsername } // GetTwoFactorRequirementEnabled returns the TwoFactorRequirementEnabled field if it's non-nil, zero value otherwise. func (o *Organization) GetTwoFactorRequirementEnabled() bool { if o == nil || o.TwoFactorRequirementEnabled == nil { return false } return *o.TwoFactorRequirementEnabled } // GetType returns the Type field if it's non-nil, zero value otherwise. func (o *Organization) GetType() string { if o == nil || o.Type == nil { return "" } return *o.Type } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (o *Organization) GetUpdatedAt() time.Time { if o == nil || o.UpdatedAt == nil { return time.Time{} } return *o.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (o *Organization) GetURL() string { if o == nil || o.URL == nil { return "" } return *o.URL } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (o *OrganizationEvent) GetAction() string { if o == nil || o.Action == nil { return "" } return *o.Action } // GetInstallation returns the Installation field. func (o *OrganizationEvent) GetInstallation() *Installation { if o == nil { return nil } return o.Installation } // GetInvitation returns the Invitation field. func (o *OrganizationEvent) GetInvitation() *Invitation { if o == nil { return nil } return o.Invitation } // GetMembership returns the Membership field. func (o *OrganizationEvent) GetMembership() *Membership { if o == nil { return nil } return o.Membership } // GetOrganization returns the Organization field. func (o *OrganizationEvent) GetOrganization() *Organization { if o == nil { return nil } return o.Organization } // GetSender returns the Sender field. func (o *OrganizationEvent) GetSender() *User { if o == nil { return nil } return o.Sender } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (o *OrganizationInstallations) GetTotalCount() int { if o == nil || o.TotalCount == nil { return 0 } return *o.TotalCount } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (o *OrgBlockEvent) GetAction() string { if o == nil || o.Action == nil { return "" } return *o.Action } // GetBlockedUser returns the BlockedUser field. func (o *OrgBlockEvent) GetBlockedUser() *User { if o == nil { return nil } return o.BlockedUser } // GetInstallation returns the Installation field. func (o *OrgBlockEvent) GetInstallation() *Installation { if o == nil { return nil } return o.Installation } // GetOrganization returns the Organization field. func (o *OrgBlockEvent) GetOrganization() *Organization { if o == nil { return nil } return o.Organization } // GetSender returns the Sender field. func (o *OrgBlockEvent) GetSender() *User { if o == nil { return nil } return o.Sender } // GetDisabledOrgs returns the DisabledOrgs field if it's non-nil, zero value otherwise. func (o *OrgStats) GetDisabledOrgs() int { if o == nil || o.DisabledOrgs == nil { return 0 } return *o.DisabledOrgs } // GetTotalOrgs returns the TotalOrgs field if it's non-nil, zero value otherwise. func (o *OrgStats) GetTotalOrgs() int { if o == nil || o.TotalOrgs == nil { return 0 } return *o.TotalOrgs } // GetTotalTeamMembers returns the TotalTeamMembers field if it's non-nil, zero value otherwise. func (o *OrgStats) GetTotalTeamMembers() int { if o == nil || o.TotalTeamMembers == nil { return 0 } return *o.TotalTeamMembers } // GetTotalTeams returns the TotalTeams field if it's non-nil, zero value otherwise. func (o *OrgStats) GetTotalTeams() int { if o == nil || o.TotalTeams == nil { return 0 } return *o.TotalTeams } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (p *Package) GetCreatedAt() Timestamp { if p == nil || p.CreatedAt == nil { return Timestamp{} } return *p.CreatedAt } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (p *Package) GetHTMLURL() string { if p == nil || p.HTMLURL == nil { return "" } return *p.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *Package) GetID() int64 { if p == nil || p.ID == nil { return 0 } return *p.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (p *Package) GetName() string { if p == nil || p.Name == nil { return "" } return *p.Name } // GetOwner returns the Owner field. func (p *Package) GetOwner() *User { if p == nil { return nil } return p.Owner } // GetPackageType returns the PackageType field if it's non-nil, zero value otherwise. func (p *Package) GetPackageType() string { if p == nil || p.PackageType == nil { return "" } return *p.PackageType } // GetPackageVersion returns the PackageVersion field. func (p *Package) GetPackageVersion() *PackageVersion { if p == nil { return nil } return p.PackageVersion } // GetRegistry returns the Registry field. func (p *Package) GetRegistry() *PackageRegistry { if p == nil { return nil } return p.Registry } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (p *Package) GetUpdatedAt() Timestamp { if p == nil || p.UpdatedAt == nil { return Timestamp{} } return *p.UpdatedAt } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (p *PackageEvent) GetAction() string { if p == nil || p.Action == nil { return "" } return *p.Action } // GetOrg returns the Org field. func (p *PackageEvent) GetOrg() *Organization { if p == nil { return nil } return p.Org } // GetPackage returns the Package field. func (p *PackageEvent) GetPackage() *Package { if p == nil { return nil } return p.Package } // GetRepo returns the Repo field. func (p *PackageEvent) GetRepo() *Repository { if p == nil { return nil } return p.Repo } // GetSender returns the Sender field. func (p *PackageEvent) GetSender() *User { if p == nil { return nil } return p.Sender } // GetAuthor returns the Author field. func (p *PackageFile) GetAuthor() *User { if p == nil { return nil } return p.Author } // GetContentType returns the ContentType field if it's non-nil, zero value otherwise. func (p *PackageFile) GetContentType() string { if p == nil || p.ContentType == nil { return "" } return *p.ContentType } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (p *PackageFile) GetCreatedAt() Timestamp { if p == nil || p.CreatedAt == nil { return Timestamp{} } return *p.CreatedAt } // GetDownloadURL returns the DownloadURL field if it's non-nil, zero value otherwise. func (p *PackageFile) GetDownloadURL() string { if p == nil || p.DownloadURL == nil { return "" } return *p.DownloadURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *PackageFile) GetID() int64 { if p == nil || p.ID == nil { return 0 } return *p.ID } // GetMD5 returns the MD5 field if it's non-nil, zero value otherwise. func (p *PackageFile) GetMD5() string { if p == nil || p.MD5 == nil { return "" } return *p.MD5 } // GetName returns the Name field if it's non-nil, zero value otherwise. func (p *PackageFile) GetName() string { if p == nil || p.Name == nil { return "" } return *p.Name } // GetSHA1 returns the SHA1 field if it's non-nil, zero value otherwise. func (p *PackageFile) GetSHA1() string { if p == nil || p.SHA1 == nil { return "" } return *p.SHA1 } // GetSHA256 returns the SHA256 field if it's non-nil, zero value otherwise. func (p *PackageFile) GetSHA256() string { if p == nil || p.SHA256 == nil { return "" } return *p.SHA256 } // GetSize returns the Size field if it's non-nil, zero value otherwise. func (p *PackageFile) GetSize() int64 { if p == nil || p.Size == nil { return 0 } return *p.Size } // GetState returns the State field if it's non-nil, zero value otherwise. func (p *PackageFile) GetState() string { if p == nil || p.State == nil { return "" } return *p.State } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (p *PackageFile) GetUpdatedAt() Timestamp { if p == nil || p.UpdatedAt == nil { return Timestamp{} } return *p.UpdatedAt } // GetAboutURL returns the AboutURL field if it's non-nil, zero value otherwise. func (p *PackageRegistry) GetAboutURL() string { if p == nil || p.AboutURL == nil { return "" } return *p.AboutURL } // GetName returns the Name field if it's non-nil, zero value otherwise. func (p *PackageRegistry) GetName() string { if p == nil || p.Name == nil { return "" } return *p.Name } // GetType returns the Type field if it's non-nil, zero value otherwise. func (p *PackageRegistry) GetType() string { if p == nil || p.Type == nil { return "" } return *p.Type } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (p *PackageRegistry) GetURL() string { if p == nil || p.URL == nil { return "" } return *p.URL } // GetVendor returns the Vendor field if it's non-nil, zero value otherwise. func (p *PackageRegistry) GetVendor() string { if p == nil || p.Vendor == nil { return "" } return *p.Vendor } // GetAuthor returns the Author field. func (p *PackageRelease) GetAuthor() *User { if p == nil { return nil } return p.Author } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (p *PackageRelease) GetCreatedAt() Timestamp { if p == nil || p.CreatedAt == nil { return Timestamp{} } return *p.CreatedAt } // GetDraft returns the Draft field if it's non-nil, zero value otherwise. func (p *PackageRelease) GetDraft() bool { if p == nil || p.Draft == nil { return false } return *p.Draft } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (p *PackageRelease) GetHTMLURL() string { if p == nil || p.HTMLURL == nil { return "" } return *p.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *PackageRelease) GetID() int64 { if p == nil || p.ID == nil { return 0 } return *p.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (p *PackageRelease) GetName() string { if p == nil || p.Name == nil { return "" } return *p.Name } // GetPrerelease returns the Prerelease field if it's non-nil, zero value otherwise. func (p *PackageRelease) GetPrerelease() bool { if p == nil || p.Prerelease == nil { return false } return *p.Prerelease } // GetPublishedAt returns the PublishedAt field if it's non-nil, zero value otherwise. func (p *PackageRelease) GetPublishedAt() Timestamp { if p == nil || p.PublishedAt == nil { return Timestamp{} } return *p.PublishedAt } // GetTagName returns the TagName field if it's non-nil, zero value otherwise. func (p *PackageRelease) GetTagName() string { if p == nil || p.TagName == nil { return "" } return *p.TagName } // GetTargetCommitish returns the TargetCommitish field if it's non-nil, zero value otherwise. func (p *PackageRelease) GetTargetCommitish() string { if p == nil || p.TargetCommitish == nil { return "" } return *p.TargetCommitish } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (p *PackageRelease) GetURL() string { if p == nil || p.URL == nil { return "" } return *p.URL } // GetAuthor returns the Author field. func (p *PackageVersion) GetAuthor() *User { if p == nil { return nil } return p.Author } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetBody() string { if p == nil || p.Body == nil { return "" } return *p.Body } // GetBodyHTML returns the BodyHTML field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetBodyHTML() string { if p == nil || p.BodyHTML == nil { return "" } return *p.BodyHTML } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetCreatedAt() Timestamp { if p == nil || p.CreatedAt == nil { return Timestamp{} } return *p.CreatedAt } // GetDraft returns the Draft field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetDraft() bool { if p == nil || p.Draft == nil { return false } return *p.Draft } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetHTMLURL() string { if p == nil || p.HTMLURL == nil { return "" } return *p.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetID() int64 { if p == nil || p.ID == nil { return 0 } return *p.ID } // GetInstallationCommand returns the InstallationCommand field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetInstallationCommand() string { if p == nil || p.InstallationCommand == nil { return "" } return *p.InstallationCommand } // GetManifest returns the Manifest field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetManifest() string { if p == nil || p.Manifest == nil { return "" } return *p.Manifest } // GetPrerelease returns the Prerelease field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetPrerelease() bool { if p == nil || p.Prerelease == nil { return false } return *p.Prerelease } // GetRelease returns the Release field. func (p *PackageVersion) GetRelease() *PackageRelease { if p == nil { return nil } return p.Release } // GetSummary returns the Summary field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetSummary() string { if p == nil || p.Summary == nil { return "" } return *p.Summary } // GetTagName returns the TagName field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetTagName() string { if p == nil || p.TagName == nil { return "" } return *p.TagName } // GetTargetCommitish returns the TargetCommitish field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetTargetCommitish() string { if p == nil || p.TargetCommitish == nil { return "" } return *p.TargetCommitish } // GetTargetOID returns the TargetOID field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetTargetOID() string { if p == nil || p.TargetOID == nil { return "" } return *p.TargetOID } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetUpdatedAt() Timestamp { if p == nil || p.UpdatedAt == nil { return Timestamp{} } return *p.UpdatedAt } // GetVersion returns the Version field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetVersion() string { if p == nil || p.Version == nil { return "" } return *p.Version } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (p *Page) GetAction() string { if p == nil || p.Action == nil { return "" } return *p.Action } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (p *Page) GetHTMLURL() string { if p == nil || p.HTMLURL == nil { return "" } return *p.HTMLURL } // GetPageName returns the PageName field if it's non-nil, zero value otherwise. func (p *Page) GetPageName() string { if p == nil || p.PageName == nil { return "" } return *p.PageName } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (p *Page) GetSHA() string { if p == nil || p.SHA == nil { return "" } return *p.SHA } // GetSummary returns the Summary field if it's non-nil, zero value otherwise. func (p *Page) GetSummary() string { if p == nil || p.Summary == nil { return "" } return *p.Summary } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (p *Page) GetTitle() string { if p == nil || p.Title == nil { return "" } return *p.Title } // GetBuild returns the Build field. func (p *PageBuildEvent) GetBuild() *PagesBuild { if p == nil { return nil } return p.Build } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *PageBuildEvent) GetID() int64 { if p == nil || p.ID == nil { return 0 } return *p.ID } // GetInstallation returns the Installation field. func (p *PageBuildEvent) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // GetRepo returns the Repo field. func (p *PageBuildEvent) GetRepo() *Repository { if p == nil { return nil } return p.Repo } // GetSender returns the Sender field. func (p *PageBuildEvent) GetSender() *User { if p == nil { return nil } return p.Sender } // GetCNAME returns the CNAME field if it's non-nil, zero value otherwise. func (p *Pages) GetCNAME() string { if p == nil || p.CNAME == nil { return "" } return *p.CNAME } // GetCustom404 returns the Custom404 field if it's non-nil, zero value otherwise. func (p *Pages) GetCustom404() bool { if p == nil || p.Custom404 == nil { return false } return *p.Custom404 } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (p *Pages) GetHTMLURL() string { if p == nil || p.HTMLURL == nil { return "" } return *p.HTMLURL } // GetSource returns the Source field. func (p *Pages) GetSource() *PagesSource { if p == nil { return nil } return p.Source } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (p *Pages) GetStatus() string { if p == nil || p.Status == nil { return "" } return *p.Status } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (p *Pages) GetURL() string { if p == nil || p.URL == nil { return "" } return *p.URL } // GetCommit returns the Commit field if it's non-nil, zero value otherwise. func (p *PagesBuild) GetCommit() string { if p == nil || p.Commit == nil { return "" } return *p.Commit } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (p *PagesBuild) GetCreatedAt() Timestamp { if p == nil || p.CreatedAt == nil { return Timestamp{} } return *p.CreatedAt } // GetDuration returns the Duration field if it's non-nil, zero value otherwise. func (p *PagesBuild) GetDuration() int { if p == nil || p.Duration == nil { return 0 } return *p.Duration } // GetError returns the Error field. func (p *PagesBuild) GetError() *PagesError { if p == nil { return nil } return p.Error } // GetPusher returns the Pusher field. func (p *PagesBuild) GetPusher() *User { if p == nil { return nil } return p.Pusher } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (p *PagesBuild) GetStatus() string { if p == nil || p.Status == nil { return "" } return *p.Status } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (p *PagesBuild) GetUpdatedAt() Timestamp { if p == nil || p.UpdatedAt == nil { return Timestamp{} } return *p.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (p *PagesBuild) GetURL() string { if p == nil || p.URL == nil { return "" } return *p.URL } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (p *PagesError) GetMessage() string { if p == nil || p.Message == nil { return "" } return *p.Message } // GetBranch returns the Branch field if it's non-nil, zero value otherwise. func (p *PagesSource) GetBranch() string { if p == nil || p.Branch == nil { return "" } return *p.Branch } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (p *PagesSource) GetPath() string { if p == nil || p.Path == nil { return "" } return *p.Path } // GetTotalPages returns the TotalPages field if it's non-nil, zero value otherwise. func (p *PageStats) GetTotalPages() int { if p == nil || p.TotalPages == nil { return 0 } return *p.TotalPages } // GetCNAME returns the CNAME field if it's non-nil, zero value otherwise. func (p *PagesUpdate) GetCNAME() string { if p == nil || p.CNAME == nil { return "" } return *p.CNAME } // GetSource returns the Source field if it's non-nil, zero value otherwise. func (p *PagesUpdate) GetSource() string { if p == nil || p.Source == nil { return "" } return *p.Source } // GetHook returns the Hook field. func (p *PingEvent) GetHook() *Hook { if p == nil { return nil } return p.Hook } // GetHookID returns the HookID field if it's non-nil, zero value otherwise. func (p *PingEvent) GetHookID() int64 { if p == nil || p.HookID == nil { return 0 } return *p.HookID } // GetInstallation returns the Installation field. func (p *PingEvent) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // GetZen returns the Zen field if it's non-nil, zero value otherwise. func (p *PingEvent) GetZen() string { if p == nil || p.Zen == nil { return "" } return *p.Zen } // GetCollaborators returns the Collaborators field if it's non-nil, zero value otherwise. func (p *Plan) GetCollaborators() int { if p == nil || p.Collaborators == nil { return 0 } return *p.Collaborators } // GetFilledSeats returns the FilledSeats field if it's non-nil, zero value otherwise. func (p *Plan) GetFilledSeats() int { if p == nil || p.FilledSeats == nil { return 0 } return *p.FilledSeats } // GetName returns the Name field if it's non-nil, zero value otherwise. func (p *Plan) GetName() string { if p == nil || p.Name == nil { return "" } return *p.Name } // GetPrivateRepos returns the PrivateRepos field if it's non-nil, zero value otherwise. func (p *Plan) GetPrivateRepos() int { if p == nil || p.PrivateRepos == nil { return 0 } return *p.PrivateRepos } // GetSeats returns the Seats field if it's non-nil, zero value otherwise. func (p *Plan) GetSeats() int { if p == nil || p.Seats == nil { return 0 } return *p.Seats } // GetSpace returns the Space field if it's non-nil, zero value otherwise. func (p *Plan) GetSpace() int { if p == nil || p.Space == nil { return 0 } return *p.Space } // GetConfigURL returns the ConfigURL field if it's non-nil, zero value otherwise. func (p *PreReceiveHook) GetConfigURL() string { if p == nil || p.ConfigURL == nil { return "" } return *p.ConfigURL } // GetEnforcement returns the Enforcement field if it's non-nil, zero value otherwise. func (p *PreReceiveHook) GetEnforcement() string { if p == nil || p.Enforcement == nil { return "" } return *p.Enforcement } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *PreReceiveHook) GetID() int64 { if p == nil || p.ID == nil { return 0 } return *p.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (p *PreReceiveHook) GetName() string { if p == nil || p.Name == nil { return "" } return *p.Name } // GetHRef returns the HRef field if it's non-nil, zero value otherwise. func (p *PRLink) GetHRef() string { if p == nil || p.HRef == nil { return "" } return *p.HRef } // GetComments returns the Comments field. func (p *PRLinks) GetComments() *PRLink { if p == nil { return nil } return p.Comments } // GetCommits returns the Commits field. func (p *PRLinks) GetCommits() *PRLink { if p == nil { return nil } return p.Commits } // GetHTML returns the HTML field. func (p *PRLinks) GetHTML() *PRLink { if p == nil { return nil } return p.HTML } // GetIssue returns the Issue field. func (p *PRLinks) GetIssue() *PRLink { if p == nil { return nil } return p.Issue } // GetReviewComment returns the ReviewComment field. func (p *PRLinks) GetReviewComment() *PRLink { if p == nil { return nil } return p.ReviewComment } // GetReviewComments returns the ReviewComments field. func (p *PRLinks) GetReviewComments() *PRLink { if p == nil { return nil } return p.ReviewComments } // GetSelf returns the Self field. func (p *PRLinks) GetSelf() *PRLink { if p == nil { return nil } return p.Self } // GetStatuses returns the Statuses field. func (p *PRLinks) GetStatuses() *PRLink { if p == nil { return nil } return p.Statuses } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (p *Project) GetBody() string { if p == nil || p.Body == nil { return "" } return *p.Body } // GetColumnsURL returns the ColumnsURL field if it's non-nil, zero value otherwise. func (p *Project) GetColumnsURL() string { if p == nil || p.ColumnsURL == nil { return "" } return *p.ColumnsURL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (p *Project) GetCreatedAt() Timestamp { if p == nil || p.CreatedAt == nil { return Timestamp{} } return *p.CreatedAt } // GetCreator returns the Creator field. func (p *Project) GetCreator() *User { if p == nil { return nil } return p.Creator } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (p *Project) GetHTMLURL() string { if p == nil || p.HTMLURL == nil { return "" } return *p.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *Project) GetID() int64 { if p == nil || p.ID == nil { return 0 } return *p.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (p *Project) GetName() string { if p == nil || p.Name == nil { return "" } return *p.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (p *Project) GetNodeID() string { if p == nil || p.NodeID == nil { return "" } return *p.NodeID } // GetNumber returns the Number field if it's non-nil, zero value otherwise. func (p *Project) GetNumber() int { if p == nil || p.Number == nil { return 0 } return *p.Number } // GetOwnerURL returns the OwnerURL field if it's non-nil, zero value otherwise. func (p *Project) GetOwnerURL() string { if p == nil || p.OwnerURL == nil { return "" } return *p.OwnerURL } // GetState returns the State field if it's non-nil, zero value otherwise. func (p *Project) GetState() string { if p == nil || p.State == nil { return "" } return *p.State } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (p *Project) GetUpdatedAt() Timestamp { if p == nil || p.UpdatedAt == nil { return Timestamp{} } return *p.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (p *Project) GetURL() string { if p == nil || p.URL == nil { return "" } return *p.URL } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (p *ProjectBody) GetFrom() string { if p == nil || p.From == nil { return "" } return *p.From } // GetArchived returns the Archived field if it's non-nil, zero value otherwise. func (p *ProjectCard) GetArchived() bool { if p == nil || p.Archived == nil { return false } return *p.Archived } // GetColumnID returns the ColumnID field if it's non-nil, zero value otherwise. func (p *ProjectCard) GetColumnID() int64 { if p == nil || p.ColumnID == nil { return 0 } return *p.ColumnID } // GetColumnName returns the ColumnName field if it's non-nil, zero value otherwise. func (p *ProjectCard) GetColumnName() string { if p == nil || p.ColumnName == nil { return "" } return *p.ColumnName } // GetColumnURL returns the ColumnURL field if it's non-nil, zero value otherwise. func (p *ProjectCard) GetColumnURL() string { if p == nil || p.ColumnURL == nil { return "" } return *p.ColumnURL } // GetContentURL returns the ContentURL field if it's non-nil, zero value otherwise. func (p *ProjectCard) GetContentURL() string { if p == nil || p.ContentURL == nil { return "" } return *p.ContentURL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (p *ProjectCard) GetCreatedAt() Timestamp { if p == nil || p.CreatedAt == nil { return Timestamp{} } return *p.CreatedAt } // GetCreator returns the Creator field. func (p *ProjectCard) GetCreator() *User { if p == nil { return nil } return p.Creator } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *ProjectCard) GetID() int64 { if p == nil || p.ID == nil { return 0 } return *p.ID } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (p *ProjectCard) GetNodeID() string { if p == nil || p.NodeID == nil { return "" } return *p.NodeID } // GetNote returns the Note field if it's non-nil, zero value otherwise. func (p *ProjectCard) GetNote() string { if p == nil || p.Note == nil { return "" } return *p.Note } // GetPreviousColumnName returns the PreviousColumnName field if it's non-nil, zero value otherwise. func (p *ProjectCard) GetPreviousColumnName() string { if p == nil || p.PreviousColumnName == nil { return "" } return *p.PreviousColumnName } // GetProjectID returns the ProjectID field if it's non-nil, zero value otherwise. func (p *ProjectCard) GetProjectID() int64 { if p == nil || p.ProjectID == nil { return 0 } return *p.ProjectID } // GetProjectURL returns the ProjectURL field if it's non-nil, zero value otherwise. func (p *ProjectCard) GetProjectURL() string { if p == nil || p.ProjectURL == nil { return "" } return *p.ProjectURL } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (p *ProjectCard) GetUpdatedAt() Timestamp { if p == nil || p.UpdatedAt == nil { return Timestamp{} } return *p.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (p *ProjectCard) GetURL() string { if p == nil || p.URL == nil { return "" } return *p.URL } // GetNote returns the Note field. func (p *ProjectCardChange) GetNote() *ProjectCardNote { if p == nil { return nil } return p.Note } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (p *ProjectCardEvent) GetAction() string { if p == nil || p.Action == nil { return "" } return *p.Action } // GetAfterID returns the AfterID field if it's non-nil, zero value otherwise. func (p *ProjectCardEvent) GetAfterID() int64 { if p == nil || p.AfterID == nil { return 0 } return *p.AfterID } // GetChanges returns the Changes field. func (p *ProjectCardEvent) GetChanges() *ProjectCardChange { if p == nil { return nil } return p.Changes } // GetInstallation returns the Installation field. func (p *ProjectCardEvent) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // GetOrg returns the Org field. func (p *ProjectCardEvent) GetOrg() *Organization { if p == nil { return nil } return p.Org } // GetProjectCard returns the ProjectCard field. func (p *ProjectCardEvent) GetProjectCard() *ProjectCard { if p == nil { return nil } return p.ProjectCard } // GetRepo returns the Repo field. func (p *ProjectCardEvent) GetRepo() *Repository { if p == nil { return nil } return p.Repo } // GetSender returns the Sender field. func (p *ProjectCardEvent) GetSender() *User { if p == nil { return nil } return p.Sender } // GetArchivedState returns the ArchivedState field if it's non-nil, zero value otherwise. func (p *ProjectCardListOptions) GetArchivedState() string { if p == nil || p.ArchivedState == nil { return "" } return *p.ArchivedState } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (p *ProjectCardNote) GetFrom() string { if p == nil || p.From == nil { return "" } return *p.From } // GetArchived returns the Archived field if it's non-nil, zero value otherwise. func (p *ProjectCardOptions) GetArchived() bool { if p == nil || p.Archived == nil { return false } return *p.Archived } // GetBody returns the Body field. func (p *ProjectChange) GetBody() *ProjectBody { if p == nil { return nil } return p.Body } // GetName returns the Name field. func (p *ProjectChange) GetName() *ProjectName { if p == nil { return nil } return p.Name } // GetPermission returns the Permission field if it's non-nil, zero value otherwise. func (p *ProjectCollaboratorOptions) GetPermission() string { if p == nil || p.Permission == nil { return "" } return *p.Permission } // GetCardsURL returns the CardsURL field if it's non-nil, zero value otherwise. func (p *ProjectColumn) GetCardsURL() string { if p == nil || p.CardsURL == nil { return "" } return *p.CardsURL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (p *ProjectColumn) GetCreatedAt() Timestamp { if p == nil || p.CreatedAt == nil { return Timestamp{} } return *p.CreatedAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *ProjectColumn) GetID() int64 { if p == nil || p.ID == nil { return 0 } return *p.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (p *ProjectColumn) GetName() string { if p == nil || p.Name == nil { return "" } return *p.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (p *ProjectColumn) GetNodeID() string { if p == nil || p.NodeID == nil { return "" } return *p.NodeID } // GetProjectURL returns the ProjectURL field if it's non-nil, zero value otherwise. func (p *ProjectColumn) GetProjectURL() string { if p == nil || p.ProjectURL == nil { return "" } return *p.ProjectURL } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (p *ProjectColumn) GetUpdatedAt() Timestamp { if p == nil || p.UpdatedAt == nil { return Timestamp{} } return *p.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (p *ProjectColumn) GetURL() string { if p == nil || p.URL == nil { return "" } return *p.URL } // GetName returns the Name field. func (p *ProjectColumnChange) GetName() *ProjectColumnName { if p == nil { return nil } return p.Name } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (p *ProjectColumnEvent) GetAction() string { if p == nil || p.Action == nil { return "" } return *p.Action } // GetAfterID returns the AfterID field if it's non-nil, zero value otherwise. func (p *ProjectColumnEvent) GetAfterID() int64 { if p == nil || p.AfterID == nil { return 0 } return *p.AfterID } // GetChanges returns the Changes field. func (p *ProjectColumnEvent) GetChanges() *ProjectColumnChange { if p == nil { return nil } return p.Changes } // GetInstallation returns the Installation field. func (p *ProjectColumnEvent) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // GetOrg returns the Org field. func (p *ProjectColumnEvent) GetOrg() *Organization { if p == nil { return nil } return p.Org } // GetProjectColumn returns the ProjectColumn field. func (p *ProjectColumnEvent) GetProjectColumn() *ProjectColumn { if p == nil { return nil } return p.ProjectColumn } // GetRepo returns the Repo field. func (p *ProjectColumnEvent) GetRepo() *Repository { if p == nil { return nil } return p.Repo } // GetSender returns the Sender field. func (p *ProjectColumnEvent) GetSender() *User { if p == nil { return nil } return p.Sender } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (p *ProjectColumnName) GetFrom() string { if p == nil || p.From == nil { return "" } return *p.From } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (p *ProjectEvent) GetAction() string { if p == nil || p.Action == nil { return "" } return *p.Action } // GetChanges returns the Changes field. func (p *ProjectEvent) GetChanges() *ProjectChange { if p == nil { return nil } return p.Changes } // GetInstallation returns the Installation field. func (p *ProjectEvent) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // GetOrg returns the Org field. func (p *ProjectEvent) GetOrg() *Organization { if p == nil { return nil } return p.Org } // GetProject returns the Project field. func (p *ProjectEvent) GetProject() *Project { if p == nil { return nil } return p.Project } // GetRepo returns the Repo field. func (p *ProjectEvent) GetRepo() *Repository { if p == nil { return nil } return p.Repo } // GetSender returns the Sender field. func (p *ProjectEvent) GetSender() *User { if p == nil { return nil } return p.Sender } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (p *ProjectName) GetFrom() string { if p == nil || p.From == nil { return "" } return *p.From } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (p *ProjectOptions) GetBody() string { if p == nil || p.Body == nil { return "" } return *p.Body } // GetName returns the Name field if it's non-nil, zero value otherwise. func (p *ProjectOptions) GetName() string { if p == nil || p.Name == nil { return "" } return *p.Name } // GetOrganizationPermission returns the OrganizationPermission field if it's non-nil, zero value otherwise. func (p *ProjectOptions) GetOrganizationPermission() string { if p == nil || p.OrganizationPermission == nil { return "" } return *p.OrganizationPermission } // GetPublic returns the Public field if it's non-nil, zero value otherwise. func (p *ProjectOptions) GetPublic() bool { if p == nil || p.Public == nil { return false } return *p.Public } // GetState returns the State field if it's non-nil, zero value otherwise. func (p *ProjectOptions) GetState() string { if p == nil || p.State == nil { return "" } return *p.State } // GetPermission returns the Permission field if it's non-nil, zero value otherwise. func (p *ProjectPermissionLevel) GetPermission() string { if p == nil || p.Permission == nil { return "" } return *p.Permission } // GetUser returns the User field. func (p *ProjectPermissionLevel) GetUser() *User { if p == nil { return nil } return p.User } // GetAllowDeletions returns the AllowDeletions field. func (p *Protection) GetAllowDeletions() *AllowDeletions { if p == nil { return nil } return p.AllowDeletions } // GetAllowForcePushes returns the AllowForcePushes field. func (p *Protection) GetAllowForcePushes() *AllowForcePushes { if p == nil { return nil } return p.AllowForcePushes } // GetEnforceAdmins returns the EnforceAdmins field. func (p *Protection) GetEnforceAdmins() *AdminEnforcement { if p == nil { return nil } return p.EnforceAdmins } // GetRequiredConversationResolution returns the RequiredConversationResolution field. func (p *Protection) GetRequiredConversationResolution() *RequiredConversationResolution { if p == nil { return nil } return p.RequiredConversationResolution } // GetRequiredPullRequestReviews returns the RequiredPullRequestReviews field. func (p *Protection) GetRequiredPullRequestReviews() *PullRequestReviewsEnforcement { if p == nil { return nil } return p.RequiredPullRequestReviews } // GetRequiredStatusChecks returns the RequiredStatusChecks field. func (p *Protection) GetRequiredStatusChecks() *RequiredStatusChecks { if p == nil { return nil } return p.RequiredStatusChecks } // GetRequireLinearHistory returns the RequireLinearHistory field. func (p *Protection) GetRequireLinearHistory() *RequireLinearHistory { if p == nil { return nil } return p.RequireLinearHistory } // GetRestrictions returns the Restrictions field. func (p *Protection) GetRestrictions() *BranchRestrictions { if p == nil { return nil } return p.Restrictions } // GetAllowDeletions returns the AllowDeletions field if it's non-nil, zero value otherwise. func (p *ProtectionRequest) GetAllowDeletions() bool { if p == nil || p.AllowDeletions == nil { return false } return *p.AllowDeletions } // GetAllowForcePushes returns the AllowForcePushes field if it's non-nil, zero value otherwise. func (p *ProtectionRequest) GetAllowForcePushes() bool { if p == nil || p.AllowForcePushes == nil { return false } return *p.AllowForcePushes } // GetRequiredConversationResolution returns the RequiredConversationResolution field if it's non-nil, zero value otherwise. func (p *ProtectionRequest) GetRequiredConversationResolution() bool { if p == nil || p.RequiredConversationResolution == nil { return false } return *p.RequiredConversationResolution } // GetRequiredPullRequestReviews returns the RequiredPullRequestReviews field. func (p *ProtectionRequest) GetRequiredPullRequestReviews() *PullRequestReviewsEnforcementRequest { if p == nil { return nil } return p.RequiredPullRequestReviews } // GetRequiredStatusChecks returns the RequiredStatusChecks field. func (p *ProtectionRequest) GetRequiredStatusChecks() *RequiredStatusChecks { if p == nil { return nil } return p.RequiredStatusChecks } // GetRequireLinearHistory returns the RequireLinearHistory field if it's non-nil, zero value otherwise. func (p *ProtectionRequest) GetRequireLinearHistory() bool { if p == nil || p.RequireLinearHistory == nil { return false } return *p.RequireLinearHistory } // GetRestrictions returns the Restrictions field. func (p *ProtectionRequest) GetRestrictions() *BranchRestrictionsRequest { if p == nil { return nil } return p.Restrictions } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *ProtectionRule) GetID() int64 { if p == nil || p.ID == nil { return 0 } return *p.ID } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (p *ProtectionRule) GetNodeID() string { if p == nil || p.NodeID == nil { return "" } return *p.NodeID } // GetType returns the Type field if it's non-nil, zero value otherwise. func (p *ProtectionRule) GetType() string { if p == nil || p.Type == nil { return "" } return *p.Type } // GetWaitTimer returns the WaitTimer field if it's non-nil, zero value otherwise. func (p *ProtectionRule) GetWaitTimer() int { if p == nil || p.WaitTimer == nil { return 0 } return *p.WaitTimer } // GetInstallation returns the Installation field. func (p *PublicEvent) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // GetRepo returns the Repo field. func (p *PublicEvent) GetRepo() *Repository { if p == nil { return nil } return p.Repo } // GetSender returns the Sender field. func (p *PublicEvent) GetSender() *User { if p == nil { return nil } return p.Sender } // GetKey returns the Key field if it's non-nil, zero value otherwise. func (p *PublicKey) GetKey() string { if p == nil || p.Key == nil { return "" } return *p.Key } // GetKeyID returns the KeyID field if it's non-nil, zero value otherwise. func (p *PublicKey) GetKeyID() string { if p == nil || p.KeyID == nil { return "" } return *p.KeyID } // GetActiveLockReason returns the ActiveLockReason field if it's non-nil, zero value otherwise. func (p *PullRequest) GetActiveLockReason() string { if p == nil || p.ActiveLockReason == nil { return "" } return *p.ActiveLockReason } // GetAdditions returns the Additions field if it's non-nil, zero value otherwise. func (p *PullRequest) GetAdditions() int { if p == nil || p.Additions == nil { return 0 } return *p.Additions } // GetAssignee returns the Assignee field. func (p *PullRequest) GetAssignee() *User { if p == nil { return nil } return p.Assignee } // GetAuthorAssociation returns the AuthorAssociation field if it's non-nil, zero value otherwise. func (p *PullRequest) GetAuthorAssociation() string { if p == nil || p.AuthorAssociation == nil { return "" } return *p.AuthorAssociation } // GetAutoMerge returns the AutoMerge field. func (p *PullRequest) GetAutoMerge() *PullRequestAutoMerge { if p == nil { return nil } return p.AutoMerge } // GetBase returns the Base field. func (p *PullRequest) GetBase() *PullRequestBranch { if p == nil { return nil } return p.Base } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (p *PullRequest) GetBody() string { if p == nil || p.Body == nil { return "" } return *p.Body } // GetChangedFiles returns the ChangedFiles field if it's non-nil, zero value otherwise. func (p *PullRequest) GetChangedFiles() int { if p == nil || p.ChangedFiles == nil { return 0 } return *p.ChangedFiles } // GetClosedAt returns the ClosedAt field if it's non-nil, zero value otherwise. func (p *PullRequest) GetClosedAt() time.Time { if p == nil || p.ClosedAt == nil { return time.Time{} } return *p.ClosedAt } // GetComments returns the Comments field if it's non-nil, zero value otherwise. func (p *PullRequest) GetComments() int { if p == nil || p.Comments == nil { return 0 } return *p.Comments } // GetCommentsURL returns the CommentsURL field if it's non-nil, zero value otherwise. func (p *PullRequest) GetCommentsURL() string { if p == nil || p.CommentsURL == nil { return "" } return *p.CommentsURL } // GetCommits returns the Commits field if it's non-nil, zero value otherwise. func (p *PullRequest) GetCommits() int { if p == nil || p.Commits == nil { return 0 } return *p.Commits } // GetCommitsURL returns the CommitsURL field if it's non-nil, zero value otherwise. func (p *PullRequest) GetCommitsURL() string { if p == nil || p.CommitsURL == nil { return "" } return *p.CommitsURL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (p *PullRequest) GetCreatedAt() time.Time { if p == nil || p.CreatedAt == nil { return time.Time{} } return *p.CreatedAt } // GetDeletions returns the Deletions field if it's non-nil, zero value otherwise. func (p *PullRequest) GetDeletions() int { if p == nil || p.Deletions == nil { return 0 } return *p.Deletions } // GetDiffURL returns the DiffURL field if it's non-nil, zero value otherwise. func (p *PullRequest) GetDiffURL() string { if p == nil || p.DiffURL == nil { return "" } return *p.DiffURL } // GetDraft returns the Draft field if it's non-nil, zero value otherwise. func (p *PullRequest) GetDraft() bool { if p == nil || p.Draft == nil { return false } return *p.Draft } // GetHead returns the Head field. func (p *PullRequest) GetHead() *PullRequestBranch { if p == nil { return nil } return p.Head } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (p *PullRequest) GetHTMLURL() string { if p == nil || p.HTMLURL == nil { return "" } return *p.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *PullRequest) GetID() int64 { if p == nil || p.ID == nil { return 0 } return *p.ID } // GetIssueURL returns the IssueURL field if it's non-nil, zero value otherwise. func (p *PullRequest) GetIssueURL() string { if p == nil || p.IssueURL == nil { return "" } return *p.IssueURL } // GetLinks returns the Links field. func (p *PullRequest) GetLinks() *PRLinks { if p == nil { return nil } return p.Links } // GetLocked returns the Locked field if it's non-nil, zero value otherwise. func (p *PullRequest) GetLocked() bool { if p == nil || p.Locked == nil { return false } return *p.Locked } // GetMaintainerCanModify returns the MaintainerCanModify field if it's non-nil, zero value otherwise. func (p *PullRequest) GetMaintainerCanModify() bool { if p == nil || p.MaintainerCanModify == nil { return false } return *p.MaintainerCanModify } // GetMergeable returns the Mergeable field if it's non-nil, zero value otherwise. func (p *PullRequest) GetMergeable() bool { if p == nil || p.Mergeable == nil { return false } return *p.Mergeable } // GetMergeableState returns the MergeableState field if it's non-nil, zero value otherwise. func (p *PullRequest) GetMergeableState() string { if p == nil || p.MergeableState == nil { return "" } return *p.MergeableState } // GetMergeCommitSHA returns the MergeCommitSHA field if it's non-nil, zero value otherwise. func (p *PullRequest) GetMergeCommitSHA() string { if p == nil || p.MergeCommitSHA == nil { return "" } return *p.MergeCommitSHA } // GetMerged returns the Merged field if it's non-nil, zero value otherwise. func (p *PullRequest) GetMerged() bool { if p == nil || p.Merged == nil { return false } return *p.Merged } // GetMergedAt returns the MergedAt field if it's non-nil, zero value otherwise. func (p *PullRequest) GetMergedAt() time.Time { if p == nil || p.MergedAt == nil { return time.Time{} } return *p.MergedAt } // GetMergedBy returns the MergedBy field. func (p *PullRequest) GetMergedBy() *User { if p == nil { return nil } return p.MergedBy } // GetMilestone returns the Milestone field. func (p *PullRequest) GetMilestone() *Milestone { if p == nil { return nil } return p.Milestone } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (p *PullRequest) GetNodeID() string { if p == nil || p.NodeID == nil { return "" } return *p.NodeID } // GetNumber returns the Number field if it's non-nil, zero value otherwise. func (p *PullRequest) GetNumber() int { if p == nil || p.Number == nil { return 0 } return *p.Number } // GetPatchURL returns the PatchURL field if it's non-nil, zero value otherwise. func (p *PullRequest) GetPatchURL() string { if p == nil || p.PatchURL == nil { return "" } return *p.PatchURL } // GetRebaseable returns the Rebaseable field if it's non-nil, zero value otherwise. func (p *PullRequest) GetRebaseable() bool { if p == nil || p.Rebaseable == nil { return false } return *p.Rebaseable } // GetReviewComments returns the ReviewComments field if it's non-nil, zero value otherwise. func (p *PullRequest) GetReviewComments() int { if p == nil || p.ReviewComments == nil { return 0 } return *p.ReviewComments } // GetReviewCommentsURL returns the ReviewCommentsURL field if it's non-nil, zero value otherwise. func (p *PullRequest) GetReviewCommentsURL() string { if p == nil || p.ReviewCommentsURL == nil { return "" } return *p.ReviewCommentsURL } // GetReviewCommentURL returns the ReviewCommentURL field if it's non-nil, zero value otherwise. func (p *PullRequest) GetReviewCommentURL() string { if p == nil || p.ReviewCommentURL == nil { return "" } return *p.ReviewCommentURL } // GetState returns the State field if it's non-nil, zero value otherwise. func (p *PullRequest) GetState() string { if p == nil || p.State == nil { return "" } return *p.State } // GetStatusesURL returns the StatusesURL field if it's non-nil, zero value otherwise. func (p *PullRequest) GetStatusesURL() string { if p == nil || p.StatusesURL == nil { return "" } return *p.StatusesURL } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (p *PullRequest) GetTitle() string { if p == nil || p.Title == nil { return "" } return *p.Title } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (p *PullRequest) GetUpdatedAt() time.Time { if p == nil || p.UpdatedAt == nil { return time.Time{} } return *p.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (p *PullRequest) GetURL() string { if p == nil || p.URL == nil { return "" } return *p.URL } // GetUser returns the User field. func (p *PullRequest) GetUser() *User { if p == nil { return nil } return p.User } // GetCommitMessage returns the CommitMessage field if it's non-nil, zero value otherwise. func (p *PullRequestAutoMerge) GetCommitMessage() string { if p == nil || p.CommitMessage == nil { return "" } return *p.CommitMessage } // GetCommitTitle returns the CommitTitle field if it's non-nil, zero value otherwise. func (p *PullRequestAutoMerge) GetCommitTitle() string { if p == nil || p.CommitTitle == nil { return "" } return *p.CommitTitle } // GetEnabledBy returns the EnabledBy field. func (p *PullRequestAutoMerge) GetEnabledBy() *User { if p == nil { return nil } return p.EnabledBy } // GetMergeMethod returns the MergeMethod field if it's non-nil, zero value otherwise. func (p *PullRequestAutoMerge) GetMergeMethod() string { if p == nil || p.MergeMethod == nil { return "" } return *p.MergeMethod } // GetLabel returns the Label field if it's non-nil, zero value otherwise. func (p *PullRequestBranch) GetLabel() string { if p == nil || p.Label == nil { return "" } return *p.Label } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (p *PullRequestBranch) GetRef() string { if p == nil || p.Ref == nil { return "" } return *p.Ref } // GetRepo returns the Repo field. func (p *PullRequestBranch) GetRepo() *Repository { if p == nil { return nil } return p.Repo } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (p *PullRequestBranch) GetSHA() string { if p == nil || p.SHA == nil { return "" } return *p.SHA } // GetUser returns the User field. func (p *PullRequestBranch) GetUser() *User { if p == nil { return nil } return p.User } // GetExpectedHeadSHA returns the ExpectedHeadSHA field if it's non-nil, zero value otherwise. func (p *PullRequestBranchUpdateOptions) GetExpectedHeadSHA() string { if p == nil || p.ExpectedHeadSHA == nil { return "" } return *p.ExpectedHeadSHA } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (p *PullRequestBranchUpdateResponse) GetMessage() string { if p == nil || p.Message == nil { return "" } return *p.Message } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (p *PullRequestBranchUpdateResponse) GetURL() string { if p == nil || p.URL == nil { return "" } return *p.URL } // GetAuthorAssociation returns the AuthorAssociation field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetAuthorAssociation() string { if p == nil || p.AuthorAssociation == nil { return "" } return *p.AuthorAssociation } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetBody() string { if p == nil || p.Body == nil { return "" } return *p.Body } // GetCommitID returns the CommitID field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetCommitID() string { if p == nil || p.CommitID == nil { return "" } return *p.CommitID } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetCreatedAt() time.Time { if p == nil || p.CreatedAt == nil { return time.Time{} } return *p.CreatedAt } // GetDiffHunk returns the DiffHunk field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetDiffHunk() string { if p == nil || p.DiffHunk == nil { return "" } return *p.DiffHunk } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetHTMLURL() string { if p == nil || p.HTMLURL == nil { return "" } return *p.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetID() int64 { if p == nil || p.ID == nil { return 0 } return *p.ID } // GetInReplyTo returns the InReplyTo field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetInReplyTo() int64 { if p == nil || p.InReplyTo == nil { return 0 } return *p.InReplyTo } // GetLine returns the Line field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetLine() int { if p == nil || p.Line == nil { return 0 } return *p.Line } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetNodeID() string { if p == nil || p.NodeID == nil { return "" } return *p.NodeID } // GetOriginalCommitID returns the OriginalCommitID field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetOriginalCommitID() string { if p == nil || p.OriginalCommitID == nil { return "" } return *p.OriginalCommitID } // GetOriginalLine returns the OriginalLine field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetOriginalLine() int { if p == nil || p.OriginalLine == nil { return 0 } return *p.OriginalLine } // GetOriginalPosition returns the OriginalPosition field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetOriginalPosition() int { if p == nil || p.OriginalPosition == nil { return 0 } return *p.OriginalPosition } // GetOriginalStartLine returns the OriginalStartLine field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetOriginalStartLine() int { if p == nil || p.OriginalStartLine == nil { return 0 } return *p.OriginalStartLine } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetPath() string { if p == nil || p.Path == nil { return "" } return *p.Path } // GetPosition returns the Position field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetPosition() int { if p == nil || p.Position == nil { return 0 } return *p.Position } // GetPullRequestReviewID returns the PullRequestReviewID field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetPullRequestReviewID() int64 { if p == nil || p.PullRequestReviewID == nil { return 0 } return *p.PullRequestReviewID } // GetPullRequestURL returns the PullRequestURL field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetPullRequestURL() string { if p == nil || p.PullRequestURL == nil { return "" } return *p.PullRequestURL } // GetReactions returns the Reactions field. func (p *PullRequestComment) GetReactions() *Reactions { if p == nil { return nil } return p.Reactions } // GetSide returns the Side field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetSide() string { if p == nil || p.Side == nil { return "" } return *p.Side } // GetStartLine returns the StartLine field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetStartLine() int { if p == nil || p.StartLine == nil { return 0 } return *p.StartLine } // GetStartSide returns the StartSide field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetStartSide() string { if p == nil || p.StartSide == nil { return "" } return *p.StartSide } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetUpdatedAt() time.Time { if p == nil || p.UpdatedAt == nil { return time.Time{} } return *p.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetURL() string { if p == nil || p.URL == nil { return "" } return *p.URL } // GetUser returns the User field. func (p *PullRequestComment) GetUser() *User { if p == nil { return nil } return p.User } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (p *PullRequestEvent) GetAction() string { if p == nil || p.Action == nil { return "" } return *p.Action } // GetAfter returns the After field if it's non-nil, zero value otherwise. func (p *PullRequestEvent) GetAfter() string { if p == nil || p.After == nil { return "" } return *p.After } // GetAssignee returns the Assignee field. func (p *PullRequestEvent) GetAssignee() *User { if p == nil { return nil } return p.Assignee } // GetBefore returns the Before field if it's non-nil, zero value otherwise. func (p *PullRequestEvent) GetBefore() string { if p == nil || p.Before == nil { return "" } return *p.Before } // GetChanges returns the Changes field. func (p *PullRequestEvent) GetChanges() *EditChange { if p == nil { return nil } return p.Changes } // GetInstallation returns the Installation field. func (p *PullRequestEvent) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // GetLabel returns the Label field. func (p *PullRequestEvent) GetLabel() *Label { if p == nil { return nil } return p.Label } // GetNumber returns the Number field if it's non-nil, zero value otherwise. func (p *PullRequestEvent) GetNumber() int { if p == nil || p.Number == nil { return 0 } return *p.Number } // GetOrganization returns the Organization field. func (p *PullRequestEvent) GetOrganization() *Organization { if p == nil { return nil } return p.Organization } // GetPullRequest returns the PullRequest field. func (p *PullRequestEvent) GetPullRequest() *PullRequest { if p == nil { return nil } return p.PullRequest } // GetRepo returns the Repo field. func (p *PullRequestEvent) GetRepo() *Repository { if p == nil { return nil } return p.Repo } // GetRequestedReviewer returns the RequestedReviewer field. func (p *PullRequestEvent) GetRequestedReviewer() *User { if p == nil { return nil } return p.RequestedReviewer } // GetRequestedTeam returns the RequestedTeam field. func (p *PullRequestEvent) GetRequestedTeam() *Team { if p == nil { return nil } return p.RequestedTeam } // GetSender returns the Sender field. func (p *PullRequestEvent) GetSender() *User { if p == nil { return nil } return p.Sender } // GetDiffURL returns the DiffURL field if it's non-nil, zero value otherwise. func (p *PullRequestLinks) GetDiffURL() string { if p == nil || p.DiffURL == nil { return "" } return *p.DiffURL } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (p *PullRequestLinks) GetHTMLURL() string { if p == nil || p.HTMLURL == nil { return "" } return *p.HTMLURL } // GetPatchURL returns the PatchURL field if it's non-nil, zero value otherwise. func (p *PullRequestLinks) GetPatchURL() string { if p == nil || p.PatchURL == nil { return "" } return *p.PatchURL } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (p *PullRequestLinks) GetURL() string { if p == nil || p.URL == nil { return "" } return *p.URL } // GetMerged returns the Merged field if it's non-nil, zero value otherwise. func (p *PullRequestMergeResult) GetMerged() bool { if p == nil || p.Merged == nil { return false } return *p.Merged } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (p *PullRequestMergeResult) GetMessage() string { if p == nil || p.Message == nil { return "" } return *p.Message } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (p *PullRequestMergeResult) GetSHA() string { if p == nil || p.SHA == nil { return "" } return *p.SHA } // GetAuthorAssociation returns the AuthorAssociation field if it's non-nil, zero value otherwise. func (p *PullRequestReview) GetAuthorAssociation() string { if p == nil || p.AuthorAssociation == nil { return "" } return *p.AuthorAssociation } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (p *PullRequestReview) GetBody() string { if p == nil || p.Body == nil { return "" } return *p.Body } // GetCommitID returns the CommitID field if it's non-nil, zero value otherwise. func (p *PullRequestReview) GetCommitID() string { if p == nil || p.CommitID == nil { return "" } return *p.CommitID } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (p *PullRequestReview) GetHTMLURL() string { if p == nil || p.HTMLURL == nil { return "" } return *p.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *PullRequestReview) GetID() int64 { if p == nil || p.ID == nil { return 0 } return *p.ID } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (p *PullRequestReview) GetNodeID() string { if p == nil || p.NodeID == nil { return "" } return *p.NodeID } // GetPullRequestURL returns the PullRequestURL field if it's non-nil, zero value otherwise. func (p *PullRequestReview) GetPullRequestURL() string { if p == nil || p.PullRequestURL == nil { return "" } return *p.PullRequestURL } // GetState returns the State field if it's non-nil, zero value otherwise. func (p *PullRequestReview) GetState() string { if p == nil || p.State == nil { return "" } return *p.State } // GetSubmittedAt returns the SubmittedAt field if it's non-nil, zero value otherwise. func (p *PullRequestReview) GetSubmittedAt() time.Time { if p == nil || p.SubmittedAt == nil { return time.Time{} } return *p.SubmittedAt } // GetUser returns the User field. func (p *PullRequestReview) GetUser() *User { if p == nil { return nil } return p.User } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (p *PullRequestReviewCommentEvent) GetAction() string { if p == nil || p.Action == nil { return "" } return *p.Action } // GetChanges returns the Changes field. func (p *PullRequestReviewCommentEvent) GetChanges() *EditChange { if p == nil { return nil } return p.Changes } // GetComment returns the Comment field. func (p *PullRequestReviewCommentEvent) GetComment() *PullRequestComment { if p == nil { return nil } return p.Comment } // GetInstallation returns the Installation field. func (p *PullRequestReviewCommentEvent) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // GetPullRequest returns the PullRequest field. func (p *PullRequestReviewCommentEvent) GetPullRequest() *PullRequest { if p == nil { return nil } return p.PullRequest } // GetRepo returns the Repo field. func (p *PullRequestReviewCommentEvent) GetRepo() *Repository { if p == nil { return nil } return p.Repo } // GetSender returns the Sender field. func (p *PullRequestReviewCommentEvent) GetSender() *User { if p == nil { return nil } return p.Sender } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (p *PullRequestReviewDismissalRequest) GetMessage() string { if p == nil || p.Message == nil { return "" } return *p.Message } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (p *PullRequestReviewEvent) GetAction() string { if p == nil || p.Action == nil { return "" } return *p.Action } // GetInstallation returns the Installation field. func (p *PullRequestReviewEvent) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // GetOrganization returns the Organization field. func (p *PullRequestReviewEvent) GetOrganization() *Organization { if p == nil { return nil } return p.Organization } // GetPullRequest returns the PullRequest field. func (p *PullRequestReviewEvent) GetPullRequest() *PullRequest { if p == nil { return nil } return p.PullRequest } // GetRepo returns the Repo field. func (p *PullRequestReviewEvent) GetRepo() *Repository { if p == nil { return nil } return p.Repo } // GetReview returns the Review field. func (p *PullRequestReviewEvent) GetReview() *PullRequestReview { if p == nil { return nil } return p.Review } // GetSender returns the Sender field. func (p *PullRequestReviewEvent) GetSender() *User { if p == nil { return nil } return p.Sender } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (p *PullRequestReviewRequest) GetBody() string { if p == nil || p.Body == nil { return "" } return *p.Body } // GetCommitID returns the CommitID field if it's non-nil, zero value otherwise. func (p *PullRequestReviewRequest) GetCommitID() string { if p == nil || p.CommitID == nil { return "" } return *p.CommitID } // GetEvent returns the Event field if it's non-nil, zero value otherwise. func (p *PullRequestReviewRequest) GetEvent() string { if p == nil || p.Event == nil { return "" } return *p.Event } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (p *PullRequestReviewRequest) GetNodeID() string { if p == nil || p.NodeID == nil { return "" } return *p.NodeID } // GetDismissalRestrictions returns the DismissalRestrictions field. func (p *PullRequestReviewsEnforcement) GetDismissalRestrictions() *DismissalRestrictions { if p == nil { return nil } return p.DismissalRestrictions } // GetDismissalRestrictionsRequest returns the DismissalRestrictionsRequest field. func (p *PullRequestReviewsEnforcementRequest) GetDismissalRestrictionsRequest() *DismissalRestrictionsRequest { if p == nil { return nil } return p.DismissalRestrictionsRequest } // GetDismissalRestrictionsRequest returns the DismissalRestrictionsRequest field. func (p *PullRequestReviewsEnforcementUpdate) GetDismissalRestrictionsRequest() *DismissalRestrictionsRequest { if p == nil { return nil } return p.DismissalRestrictionsRequest } // GetDismissStaleReviews returns the DismissStaleReviews field if it's non-nil, zero value otherwise. func (p *PullRequestReviewsEnforcementUpdate) GetDismissStaleReviews() bool { if p == nil || p.DismissStaleReviews == nil { return false } return *p.DismissStaleReviews } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (p *PullRequestTargetEvent) GetAction() string { if p == nil || p.Action == nil { return "" } return *p.Action } // GetAfter returns the After field if it's non-nil, zero value otherwise. func (p *PullRequestTargetEvent) GetAfter() string { if p == nil || p.After == nil { return "" } return *p.After } // GetAssignee returns the Assignee field. func (p *PullRequestTargetEvent) GetAssignee() *User { if p == nil { return nil } return p.Assignee } // GetBefore returns the Before field if it's non-nil, zero value otherwise. func (p *PullRequestTargetEvent) GetBefore() string { if p == nil || p.Before == nil { return "" } return *p.Before } // GetChanges returns the Changes field. func (p *PullRequestTargetEvent) GetChanges() *EditChange { if p == nil { return nil } return p.Changes } // GetInstallation returns the Installation field. func (p *PullRequestTargetEvent) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // GetLabel returns the Label field. func (p *PullRequestTargetEvent) GetLabel() *Label { if p == nil { return nil } return p.Label } // GetNumber returns the Number field if it's non-nil, zero value otherwise. func (p *PullRequestTargetEvent) GetNumber() int { if p == nil || p.Number == nil { return 0 } return *p.Number } // GetOrganization returns the Organization field. func (p *PullRequestTargetEvent) GetOrganization() *Organization { if p == nil { return nil } return p.Organization } // GetPullRequest returns the PullRequest field. func (p *PullRequestTargetEvent) GetPullRequest() *PullRequest { if p == nil { return nil } return p.PullRequest } // GetRepo returns the Repo field. func (p *PullRequestTargetEvent) GetRepo() *Repository { if p == nil { return nil } return p.Repo } // GetRequestedReviewer returns the RequestedReviewer field. func (p *PullRequestTargetEvent) GetRequestedReviewer() *User { if p == nil { return nil } return p.RequestedReviewer } // GetRequestedTeam returns the RequestedTeam field. func (p *PullRequestTargetEvent) GetRequestedTeam() *Team { if p == nil { return nil } return p.RequestedTeam } // GetSender returns the Sender field. func (p *PullRequestTargetEvent) GetSender() *User { if p == nil { return nil } return p.Sender } // GetMergablePulls returns the MergablePulls field if it's non-nil, zero value otherwise. func (p *PullStats) GetMergablePulls() int { if p == nil || p.MergablePulls == nil { return 0 } return *p.MergablePulls } // GetMergedPulls returns the MergedPulls field if it's non-nil, zero value otherwise. func (p *PullStats) GetMergedPulls() int { if p == nil || p.MergedPulls == nil { return 0 } return *p.MergedPulls } // GetTotalPulls returns the TotalPulls field if it's non-nil, zero value otherwise. func (p *PullStats) GetTotalPulls() int { if p == nil || p.TotalPulls == nil { return 0 } return *p.TotalPulls } // GetUnmergablePulls returns the UnmergablePulls field if it's non-nil, zero value otherwise. func (p *PullStats) GetUnmergablePulls() int { if p == nil || p.UnmergablePulls == nil { return 0 } return *p.UnmergablePulls } // GetCommits returns the Commits field if it's non-nil, zero value otherwise. func (p *PunchCard) GetCommits() int { if p == nil || p.Commits == nil { return 0 } return *p.Commits } // GetDay returns the Day field if it's non-nil, zero value otherwise. func (p *PunchCard) GetDay() int { if p == nil || p.Day == nil { return 0 } return *p.Day } // GetHour returns the Hour field if it's non-nil, zero value otherwise. func (p *PunchCard) GetHour() int { if p == nil || p.Hour == nil { return 0 } return *p.Hour } // GetAfter returns the After field if it's non-nil, zero value otherwise. func (p *PushEvent) GetAfter() string { if p == nil || p.After == nil { return "" } return *p.After } // GetBaseRef returns the BaseRef field if it's non-nil, zero value otherwise. func (p *PushEvent) GetBaseRef() string { if p == nil || p.BaseRef == nil { return "" } return *p.BaseRef } // GetBefore returns the Before field if it's non-nil, zero value otherwise. func (p *PushEvent) GetBefore() string { if p == nil || p.Before == nil { return "" } return *p.Before } // GetCompare returns the Compare field if it's non-nil, zero value otherwise. func (p *PushEvent) GetCompare() string { if p == nil || p.Compare == nil { return "" } return *p.Compare } // GetCreated returns the Created field if it's non-nil, zero value otherwise. func (p *PushEvent) GetCreated() bool { if p == nil || p.Created == nil { return false } return *p.Created } // GetDeleted returns the Deleted field if it's non-nil, zero value otherwise. func (p *PushEvent) GetDeleted() bool { if p == nil || p.Deleted == nil { return false } return *p.Deleted } // GetDistinctSize returns the DistinctSize field if it's non-nil, zero value otherwise. func (p *PushEvent) GetDistinctSize() int { if p == nil || p.DistinctSize == nil { return 0 } return *p.DistinctSize } // GetForced returns the Forced field if it's non-nil, zero value otherwise. func (p *PushEvent) GetForced() bool { if p == nil || p.Forced == nil { return false } return *p.Forced } // GetHead returns the Head field if it's non-nil, zero value otherwise. func (p *PushEvent) GetHead() string { if p == nil || p.Head == nil { return "" } return *p.Head } // GetHeadCommit returns the HeadCommit field. func (p *PushEvent) GetHeadCommit() *HeadCommit { if p == nil { return nil } return p.HeadCommit } // GetInstallation returns the Installation field. func (p *PushEvent) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // GetPusher returns the Pusher field. func (p *PushEvent) GetPusher() *User { if p == nil { return nil } return p.Pusher } // GetPushID returns the PushID field if it's non-nil, zero value otherwise. func (p *PushEvent) GetPushID() int64 { if p == nil || p.PushID == nil { return 0 } return *p.PushID } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (p *PushEvent) GetRef() string { if p == nil || p.Ref == nil { return "" } return *p.Ref } // GetRepo returns the Repo field. func (p *PushEvent) GetRepo() *PushEventRepository { if p == nil { return nil } return p.Repo } // GetSender returns the Sender field. func (p *PushEvent) GetSender() *User { if p == nil { return nil } return p.Sender } // GetSize returns the Size field if it's non-nil, zero value otherwise. func (p *PushEvent) GetSize() int { if p == nil || p.Size == nil { return 0 } return *p.Size } // GetEmail returns the Email field if it's non-nil, zero value otherwise. func (p *PushEventRepoOwner) GetEmail() string { if p == nil || p.Email == nil { return "" } return *p.Email } // GetName returns the Name field if it's non-nil, zero value otherwise. func (p *PushEventRepoOwner) GetName() string { if p == nil || p.Name == nil { return "" } return *p.Name } // GetArchived returns the Archived field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetArchived() bool { if p == nil || p.Archived == nil { return false } return *p.Archived } // GetArchiveURL returns the ArchiveURL field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetArchiveURL() string { if p == nil || p.ArchiveURL == nil { return "" } return *p.ArchiveURL } // GetCloneURL returns the CloneURL field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetCloneURL() string { if p == nil || p.CloneURL == nil { return "" } return *p.CloneURL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetCreatedAt() Timestamp { if p == nil || p.CreatedAt == nil { return Timestamp{} } return *p.CreatedAt } // GetDefaultBranch returns the DefaultBranch field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetDefaultBranch() string { if p == nil || p.DefaultBranch == nil { return "" } return *p.DefaultBranch } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetDescription() string { if p == nil || p.Description == nil { return "" } return *p.Description } // GetDisabled returns the Disabled field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetDisabled() bool { if p == nil || p.Disabled == nil { return false } return *p.Disabled } // GetFork returns the Fork field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetFork() bool { if p == nil || p.Fork == nil { return false } return *p.Fork } // GetForksCount returns the ForksCount field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetForksCount() int { if p == nil || p.ForksCount == nil { return 0 } return *p.ForksCount } // GetFullName returns the FullName field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetFullName() string { if p == nil || p.FullName == nil { return "" } return *p.FullName } // GetGitURL returns the GitURL field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetGitURL() string { if p == nil || p.GitURL == nil { return "" } return *p.GitURL } // GetHasDownloads returns the HasDownloads field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetHasDownloads() bool { if p == nil || p.HasDownloads == nil { return false } return *p.HasDownloads } // GetHasIssues returns the HasIssues field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetHasIssues() bool { if p == nil || p.HasIssues == nil { return false } return *p.HasIssues } // GetHasPages returns the HasPages field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetHasPages() bool { if p == nil || p.HasPages == nil { return false } return *p.HasPages } // GetHasWiki returns the HasWiki field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetHasWiki() bool { if p == nil || p.HasWiki == nil { return false } return *p.HasWiki } // GetHomepage returns the Homepage field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetHomepage() string { if p == nil || p.Homepage == nil { return "" } return *p.Homepage } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetHTMLURL() string { if p == nil || p.HTMLURL == nil { return "" } return *p.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetID() int64 { if p == nil || p.ID == nil { return 0 } return *p.ID } // GetLanguage returns the Language field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetLanguage() string { if p == nil || p.Language == nil { return "" } return *p.Language } // GetMasterBranch returns the MasterBranch field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetMasterBranch() string { if p == nil || p.MasterBranch == nil { return "" } return *p.MasterBranch } // GetName returns the Name field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetName() string { if p == nil || p.Name == nil { return "" } return *p.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetNodeID() string { if p == nil || p.NodeID == nil { return "" } return *p.NodeID } // GetOpenIssuesCount returns the OpenIssuesCount field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetOpenIssuesCount() int { if p == nil || p.OpenIssuesCount == nil { return 0 } return *p.OpenIssuesCount } // GetOrganization returns the Organization field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetOrganization() string { if p == nil || p.Organization == nil { return "" } return *p.Organization } // GetOwner returns the Owner field. func (p *PushEventRepository) GetOwner() *User { if p == nil { return nil } return p.Owner } // GetPrivate returns the Private field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetPrivate() bool { if p == nil || p.Private == nil { return false } return *p.Private } // GetPullsURL returns the PullsURL field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetPullsURL() string { if p == nil || p.PullsURL == nil { return "" } return *p.PullsURL } // GetPushedAt returns the PushedAt field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetPushedAt() Timestamp { if p == nil || p.PushedAt == nil { return Timestamp{} } return *p.PushedAt } // GetSize returns the Size field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetSize() int { if p == nil || p.Size == nil { return 0 } return *p.Size } // GetSSHURL returns the SSHURL field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetSSHURL() string { if p == nil || p.SSHURL == nil { return "" } return *p.SSHURL } // GetStargazersCount returns the StargazersCount field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetStargazersCount() int { if p == nil || p.StargazersCount == nil { return 0 } return *p.StargazersCount } // GetStatusesURL returns the StatusesURL field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetStatusesURL() string { if p == nil || p.StatusesURL == nil { return "" } return *p.StatusesURL } // GetSVNURL returns the SVNURL field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetSVNURL() string { if p == nil || p.SVNURL == nil { return "" } return *p.SVNURL } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetUpdatedAt() Timestamp { if p == nil || p.UpdatedAt == nil { return Timestamp{} } return *p.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetURL() string { if p == nil || p.URL == nil { return "" } return *p.URL } // GetWatchersCount returns the WatchersCount field if it's non-nil, zero value otherwise. func (p *PushEventRepository) GetWatchersCount() int { if p == nil || p.WatchersCount == nil { return 0 } return *p.WatchersCount } // GetCore returns the Core field. func (r *RateLimits) GetCore() *Rate { if r == nil { return nil } return r.Core } // GetSearch returns the Search field. func (r *RateLimits) GetSearch() *Rate { if r == nil { return nil } return r.Search } // GetContent returns the Content field if it's non-nil, zero value otherwise. func (r *Reaction) GetContent() string { if r == nil || r.Content == nil { return "" } return *r.Content } // GetID returns the ID field if it's non-nil, zero value otherwise. func (r *Reaction) GetID() int64 { if r == nil || r.ID == nil { return 0 } return *r.ID } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (r *Reaction) GetNodeID() string { if r == nil || r.NodeID == nil { return "" } return *r.NodeID } // GetUser returns the User field. func (r *Reaction) GetUser() *User { if r == nil { return nil } return r.User } // GetConfused returns the Confused field if it's non-nil, zero value otherwise. func (r *Reactions) GetConfused() int { if r == nil || r.Confused == nil { return 0 } return *r.Confused } // GetEyes returns the Eyes field if it's non-nil, zero value otherwise. func (r *Reactions) GetEyes() int { if r == nil || r.Eyes == nil { return 0 } return *r.Eyes } // GetHeart returns the Heart field if it's non-nil, zero value otherwise. func (r *Reactions) GetHeart() int { if r == nil || r.Heart == nil { return 0 } return *r.Heart } // GetHooray returns the Hooray field if it's non-nil, zero value otherwise. func (r *Reactions) GetHooray() int { if r == nil || r.Hooray == nil { return 0 } return *r.Hooray } // GetLaugh returns the Laugh field if it's non-nil, zero value otherwise. func (r *Reactions) GetLaugh() int { if r == nil || r.Laugh == nil { return 0 } return *r.Laugh } // GetMinusOne returns the MinusOne field if it's non-nil, zero value otherwise. func (r *Reactions) GetMinusOne() int { if r == nil || r.MinusOne == nil { return 0 } return *r.MinusOne } // GetPlusOne returns the PlusOne field if it's non-nil, zero value otherwise. func (r *Reactions) GetPlusOne() int { if r == nil || r.PlusOne == nil { return 0 } return *r.PlusOne } // GetRocket returns the Rocket field if it's non-nil, zero value otherwise. func (r *Reactions) GetRocket() int { if r == nil || r.Rocket == nil { return 0 } return *r.Rocket } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (r *Reactions) GetTotalCount() int { if r == nil || r.TotalCount == nil { return 0 } return *r.TotalCount } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (r *Reactions) GetURL() string { if r == nil || r.URL == nil { return "" } return *r.URL } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (r *Reference) GetNodeID() string { if r == nil || r.NodeID == nil { return "" } return *r.NodeID } // GetObject returns the Object field. func (r *Reference) GetObject() *GitObject { if r == nil { return nil } return r.Object } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (r *Reference) GetRef() string { if r == nil || r.Ref == nil { return "" } return *r.Ref } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (r *Reference) GetURL() string { if r == nil || r.URL == nil { return "" } return *r.URL } // GetExpiresAt returns the ExpiresAt field if it's non-nil, zero value otherwise. func (r *RegistrationToken) GetExpiresAt() Timestamp { if r == nil || r.ExpiresAt == nil { return Timestamp{} } return *r.ExpiresAt } // GetToken returns the Token field if it's non-nil, zero value otherwise. func (r *RegistrationToken) GetToken() string { if r == nil || r.Token == nil { return "" } return *r.Token } // GetBrowserDownloadURL returns the BrowserDownloadURL field if it's non-nil, zero value otherwise. func (r *ReleaseAsset) GetBrowserDownloadURL() string { if r == nil || r.BrowserDownloadURL == nil { return "" } return *r.BrowserDownloadURL } // GetContentType returns the ContentType field if it's non-nil, zero value otherwise. func (r *ReleaseAsset) GetContentType() string { if r == nil || r.ContentType == nil { return "" } return *r.ContentType } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (r *ReleaseAsset) GetCreatedAt() Timestamp { if r == nil || r.CreatedAt == nil { return Timestamp{} } return *r.CreatedAt } // GetDownloadCount returns the DownloadCount field if it's non-nil, zero value otherwise. func (r *ReleaseAsset) GetDownloadCount() int { if r == nil || r.DownloadCount == nil { return 0 } return *r.DownloadCount } // GetID returns the ID field if it's non-nil, zero value otherwise. func (r *ReleaseAsset) GetID() int64 { if r == nil || r.ID == nil { return 0 } return *r.ID } // GetLabel returns the Label field if it's non-nil, zero value otherwise. func (r *ReleaseAsset) GetLabel() string { if r == nil || r.Label == nil { return "" } return *r.Label } // GetName returns the Name field if it's non-nil, zero value otherwise. func (r *ReleaseAsset) GetName() string { if r == nil || r.Name == nil { return "" } return *r.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (r *ReleaseAsset) GetNodeID() string { if r == nil || r.NodeID == nil { return "" } return *r.NodeID } // GetSize returns the Size field if it's non-nil, zero value otherwise. func (r *ReleaseAsset) GetSize() int { if r == nil || r.Size == nil { return 0 } return *r.Size } // GetState returns the State field if it's non-nil, zero value otherwise. func (r *ReleaseAsset) GetState() string { if r == nil || r.State == nil { return "" } return *r.State } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (r *ReleaseAsset) GetUpdatedAt() Timestamp { if r == nil || r.UpdatedAt == nil { return Timestamp{} } return *r.UpdatedAt } // GetUploader returns the Uploader field. func (r *ReleaseAsset) GetUploader() *User { if r == nil { return nil } return r.Uploader } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (r *ReleaseAsset) GetURL() string { if r == nil || r.URL == nil { return "" } return *r.URL } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (r *ReleaseEvent) GetAction() string { if r == nil || r.Action == nil { return "" } return *r.Action } // GetInstallation returns the Installation field. func (r *ReleaseEvent) GetInstallation() *Installation { if r == nil { return nil } return r.Installation } // GetRelease returns the Release field. func (r *ReleaseEvent) GetRelease() *RepositoryRelease { if r == nil { return nil } return r.Release } // GetRepo returns the Repo field. func (r *ReleaseEvent) GetRepo() *Repository { if r == nil { return nil } return r.Repo } // GetSender returns the Sender field. func (r *ReleaseEvent) GetSender() *User { if r == nil { return nil } return r.Sender } // GetExpiresAt returns the ExpiresAt field if it's non-nil, zero value otherwise. func (r *RemoveToken) GetExpiresAt() Timestamp { if r == nil || r.ExpiresAt == nil { return Timestamp{} } return *r.ExpiresAt } // GetToken returns the Token field if it's non-nil, zero value otherwise. func (r *RemoveToken) GetToken() string { if r == nil || r.Token == nil { return "" } return *r.Token } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (r *Rename) GetFrom() string { if r == nil || r.From == nil { return "" } return *r.From } // GetTo returns the To field if it's non-nil, zero value otherwise. func (r *Rename) GetTo() string { if r == nil || r.To == nil { return "" } return *r.To } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (r *RenameOrgResponse) GetMessage() string { if r == nil || r.Message == nil { return "" } return *r.Message } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (r *RenameOrgResponse) GetURL() string { if r == nil || r.URL == nil { return "" } return *r.URL } // GetIncompleteResults returns the IncompleteResults field if it's non-nil, zero value otherwise. func (r *RepositoriesSearchResult) GetIncompleteResults() bool { if r == nil || r.IncompleteResults == nil { return false } return *r.IncompleteResults } // GetTotal returns the Total field if it's non-nil, zero value otherwise. func (r *RepositoriesSearchResult) GetTotal() int { if r == nil || r.Total == nil { return 0 } return *r.Total } // GetAllowMergeCommit returns the AllowMergeCommit field if it's non-nil, zero value otherwise. func (r *Repository) GetAllowMergeCommit() bool { if r == nil || r.AllowMergeCommit == nil { return false } return *r.AllowMergeCommit } // GetAllowRebaseMerge returns the AllowRebaseMerge field if it's non-nil, zero value otherwise. func (r *Repository) GetAllowRebaseMerge() bool { if r == nil || r.AllowRebaseMerge == nil { return false } return *r.AllowRebaseMerge } // GetAllowSquashMerge returns the AllowSquashMerge field if it's non-nil, zero value otherwise. func (r *Repository) GetAllowSquashMerge() bool { if r == nil || r.AllowSquashMerge == nil { return false } return *r.AllowSquashMerge } // GetArchived returns the Archived field if it's non-nil, zero value otherwise. func (r *Repository) GetArchived() bool { if r == nil || r.Archived == nil { return false } return *r.Archived } // GetArchiveURL returns the ArchiveURL field if it's non-nil, zero value otherwise. func (r *Repository) GetArchiveURL() string { if r == nil || r.ArchiveURL == nil { return "" } return *r.ArchiveURL } // GetAssigneesURL returns the AssigneesURL field if it's non-nil, zero value otherwise. func (r *Repository) GetAssigneesURL() string { if r == nil || r.AssigneesURL == nil { return "" } return *r.AssigneesURL } // GetAutoInit returns the AutoInit field if it's non-nil, zero value otherwise. func (r *Repository) GetAutoInit() bool { if r == nil || r.AutoInit == nil { return false } return *r.AutoInit } // GetBlobsURL returns the BlobsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetBlobsURL() string { if r == nil || r.BlobsURL == nil { return "" } return *r.BlobsURL } // GetBranchesURL returns the BranchesURL field if it's non-nil, zero value otherwise. func (r *Repository) GetBranchesURL() string { if r == nil || r.BranchesURL == nil { return "" } return *r.BranchesURL } // GetCloneURL returns the CloneURL field if it's non-nil, zero value otherwise. func (r *Repository) GetCloneURL() string { if r == nil || r.CloneURL == nil { return "" } return *r.CloneURL } // GetCodeOfConduct returns the CodeOfConduct field. func (r *Repository) GetCodeOfConduct() *CodeOfConduct { if r == nil { return nil } return r.CodeOfConduct } // GetCollaboratorsURL returns the CollaboratorsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetCollaboratorsURL() string { if r == nil || r.CollaboratorsURL == nil { return "" } return *r.CollaboratorsURL } // GetCommentsURL returns the CommentsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetCommentsURL() string { if r == nil || r.CommentsURL == nil { return "" } return *r.CommentsURL } // GetCommitsURL returns the CommitsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetCommitsURL() string { if r == nil || r.CommitsURL == nil { return "" } return *r.CommitsURL } // GetCompareURL returns the CompareURL field if it's non-nil, zero value otherwise. func (r *Repository) GetCompareURL() string { if r == nil || r.CompareURL == nil { return "" } return *r.CompareURL } // GetContentsURL returns the ContentsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetContentsURL() string { if r == nil || r.ContentsURL == nil { return "" } return *r.ContentsURL } // GetContributorsURL returns the ContributorsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetContributorsURL() string { if r == nil || r.ContributorsURL == nil { return "" } return *r.ContributorsURL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (r *Repository) GetCreatedAt() Timestamp { if r == nil || r.CreatedAt == nil { return Timestamp{} } return *r.CreatedAt } // GetDefaultBranch returns the DefaultBranch field if it's non-nil, zero value otherwise. func (r *Repository) GetDefaultBranch() string { if r == nil || r.DefaultBranch == nil { return "" } return *r.DefaultBranch } // GetDeleteBranchOnMerge returns the DeleteBranchOnMerge field if it's non-nil, zero value otherwise. func (r *Repository) GetDeleteBranchOnMerge() bool { if r == nil || r.DeleteBranchOnMerge == nil { return false } return *r.DeleteBranchOnMerge } // GetDeploymentsURL returns the DeploymentsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetDeploymentsURL() string { if r == nil || r.DeploymentsURL == nil { return "" } return *r.DeploymentsURL } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (r *Repository) GetDescription() string { if r == nil || r.Description == nil { return "" } return *r.Description } // GetDisabled returns the Disabled field if it's non-nil, zero value otherwise. func (r *Repository) GetDisabled() bool { if r == nil || r.Disabled == nil { return false } return *r.Disabled } // GetDownloadsURL returns the DownloadsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetDownloadsURL() string { if r == nil || r.DownloadsURL == nil { return "" } return *r.DownloadsURL } // GetEventsURL returns the EventsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetEventsURL() string { if r == nil || r.EventsURL == nil { return "" } return *r.EventsURL } // GetFork returns the Fork field if it's non-nil, zero value otherwise. func (r *Repository) GetFork() bool { if r == nil || r.Fork == nil { return false } return *r.Fork } // GetForksCount returns the ForksCount field if it's non-nil, zero value otherwise. func (r *Repository) GetForksCount() int { if r == nil || r.ForksCount == nil { return 0 } return *r.ForksCount } // GetForksURL returns the ForksURL field if it's non-nil, zero value otherwise. func (r *Repository) GetForksURL() string { if r == nil || r.ForksURL == nil { return "" } return *r.ForksURL } // GetFullName returns the FullName field if it's non-nil, zero value otherwise. func (r *Repository) GetFullName() string { if r == nil || r.FullName == nil { return "" } return *r.FullName } // GetGitCommitsURL returns the GitCommitsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetGitCommitsURL() string { if r == nil || r.GitCommitsURL == nil { return "" } return *r.GitCommitsURL } // GetGitignoreTemplate returns the GitignoreTemplate field if it's non-nil, zero value otherwise. func (r *Repository) GetGitignoreTemplate() string { if r == nil || r.GitignoreTemplate == nil { return "" } return *r.GitignoreTemplate } // GetGitRefsURL returns the GitRefsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetGitRefsURL() string { if r == nil || r.GitRefsURL == nil { return "" } return *r.GitRefsURL } // GetGitTagsURL returns the GitTagsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetGitTagsURL() string { if r == nil || r.GitTagsURL == nil { return "" } return *r.GitTagsURL } // GetGitURL returns the GitURL field if it's non-nil, zero value otherwise. func (r *Repository) GetGitURL() string { if r == nil || r.GitURL == nil { return "" } return *r.GitURL } // GetHasDownloads returns the HasDownloads field if it's non-nil, zero value otherwise. func (r *Repository) GetHasDownloads() bool { if r == nil || r.HasDownloads == nil { return false } return *r.HasDownloads } // GetHasIssues returns the HasIssues field if it's non-nil, zero value otherwise. func (r *Repository) GetHasIssues() bool { if r == nil || r.HasIssues == nil { return false } return *r.HasIssues } // GetHasPages returns the HasPages field if it's non-nil, zero value otherwise. func (r *Repository) GetHasPages() bool { if r == nil || r.HasPages == nil { return false } return *r.HasPages } // GetHasProjects returns the HasProjects field if it's non-nil, zero value otherwise. func (r *Repository) GetHasProjects() bool { if r == nil || r.HasProjects == nil { return false } return *r.HasProjects } // GetHasWiki returns the HasWiki field if it's non-nil, zero value otherwise. func (r *Repository) GetHasWiki() bool { if r == nil || r.HasWiki == nil { return false } return *r.HasWiki } // GetHomepage returns the Homepage field if it's non-nil, zero value otherwise. func (r *Repository) GetHomepage() string { if r == nil || r.Homepage == nil { return "" } return *r.Homepage } // GetHooksURL returns the HooksURL field if it's non-nil, zero value otherwise. func (r *Repository) GetHooksURL() string { if r == nil || r.HooksURL == nil { return "" } return *r.HooksURL } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (r *Repository) GetHTMLURL() string { if r == nil || r.HTMLURL == nil { return "" } return *r.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (r *Repository) GetID() int64 { if r == nil || r.ID == nil { return 0 } return *r.ID } // GetIssueCommentURL returns the IssueCommentURL field if it's non-nil, zero value otherwise. func (r *Repository) GetIssueCommentURL() string { if r == nil || r.IssueCommentURL == nil { return "" } return *r.IssueCommentURL } // GetIssueEventsURL returns the IssueEventsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetIssueEventsURL() string { if r == nil || r.IssueEventsURL == nil { return "" } return *r.IssueEventsURL } // GetIssuesURL returns the IssuesURL field if it's non-nil, zero value otherwise. func (r *Repository) GetIssuesURL() string { if r == nil || r.IssuesURL == nil { return "" } return *r.IssuesURL } // GetIsTemplate returns the IsTemplate field if it's non-nil, zero value otherwise. func (r *Repository) GetIsTemplate() bool { if r == nil || r.IsTemplate == nil { return false } return *r.IsTemplate } // GetKeysURL returns the KeysURL field if it's non-nil, zero value otherwise. func (r *Repository) GetKeysURL() string { if r == nil || r.KeysURL == nil { return "" } return *r.KeysURL } // GetLabelsURL returns the LabelsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetLabelsURL() string { if r == nil || r.LabelsURL == nil { return "" } return *r.LabelsURL } // GetLanguage returns the Language field if it's non-nil, zero value otherwise. func (r *Repository) GetLanguage() string { if r == nil || r.Language == nil { return "" } return *r.Language } // GetLanguagesURL returns the LanguagesURL field if it's non-nil, zero value otherwise. func (r *Repository) GetLanguagesURL() string { if r == nil || r.LanguagesURL == nil { return "" } return *r.LanguagesURL } // GetLicense returns the License field. func (r *Repository) GetLicense() *License { if r == nil { return nil } return r.License } // GetLicenseTemplate returns the LicenseTemplate field if it's non-nil, zero value otherwise. func (r *Repository) GetLicenseTemplate() string { if r == nil || r.LicenseTemplate == nil { return "" } return *r.LicenseTemplate } // GetMasterBranch returns the MasterBranch field if it's non-nil, zero value otherwise. func (r *Repository) GetMasterBranch() string { if r == nil || r.MasterBranch == nil { return "" } return *r.MasterBranch } // GetMergesURL returns the MergesURL field if it's non-nil, zero value otherwise. func (r *Repository) GetMergesURL() string { if r == nil || r.MergesURL == nil { return "" } return *r.MergesURL } // GetMilestonesURL returns the MilestonesURL field if it's non-nil, zero value otherwise. func (r *Repository) GetMilestonesURL() string { if r == nil || r.MilestonesURL == nil { return "" } return *r.MilestonesURL } // GetMirrorURL returns the MirrorURL field if it's non-nil, zero value otherwise. func (r *Repository) GetMirrorURL() string { if r == nil || r.MirrorURL == nil { return "" } return *r.MirrorURL } // GetName returns the Name field if it's non-nil, zero value otherwise. func (r *Repository) GetName() string { if r == nil || r.Name == nil { return "" } return *r.Name } // GetNetworkCount returns the NetworkCount field if it's non-nil, zero value otherwise. func (r *Repository) GetNetworkCount() int { if r == nil || r.NetworkCount == nil { return 0 } return *r.NetworkCount } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (r *Repository) GetNodeID() string { if r == nil || r.NodeID == nil { return "" } return *r.NodeID } // GetNotificationsURL returns the NotificationsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetNotificationsURL() string { if r == nil || r.NotificationsURL == nil { return "" } return *r.NotificationsURL } // GetOpenIssues returns the OpenIssues field if it's non-nil, zero value otherwise. func (r *Repository) GetOpenIssues() int { if r == nil || r.OpenIssues == nil { return 0 } return *r.OpenIssues } // GetOpenIssuesCount returns the OpenIssuesCount field if it's non-nil, zero value otherwise. func (r *Repository) GetOpenIssuesCount() int { if r == nil || r.OpenIssuesCount == nil { return 0 } return *r.OpenIssuesCount } // GetOrganization returns the Organization field. func (r *Repository) GetOrganization() *Organization { if r == nil { return nil } return r.Organization } // GetOwner returns the Owner field. func (r *Repository) GetOwner() *User { if r == nil { return nil } return r.Owner } // GetParent returns the Parent field. func (r *Repository) GetParent() *Repository { if r == nil { return nil } return r.Parent } // GetPermissions returns the Permissions map if it's non-nil, an empty map otherwise. func (r *Repository) GetPermissions() map[string]bool { if r == nil || r.Permissions == nil { return map[string]bool{} } return r.Permissions } // GetPrivate returns the Private field if it's non-nil, zero value otherwise. func (r *Repository) GetPrivate() bool { if r == nil || r.Private == nil { return false } return *r.Private } // GetPullsURL returns the PullsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetPullsURL() string { if r == nil || r.PullsURL == nil { return "" } return *r.PullsURL } // GetPushedAt returns the PushedAt field if it's non-nil, zero value otherwise. func (r *Repository) GetPushedAt() Timestamp { if r == nil || r.PushedAt == nil { return Timestamp{} } return *r.PushedAt } // GetReleasesURL returns the ReleasesURL field if it's non-nil, zero value otherwise. func (r *Repository) GetReleasesURL() string { if r == nil || r.ReleasesURL == nil { return "" } return *r.ReleasesURL } // GetSize returns the Size field if it's non-nil, zero value otherwise. func (r *Repository) GetSize() int { if r == nil || r.Size == nil { return 0 } return *r.Size } // GetSource returns the Source field. func (r *Repository) GetSource() *Repository { if r == nil { return nil } return r.Source } // GetSSHURL returns the SSHURL field if it's non-nil, zero value otherwise. func (r *Repository) GetSSHURL() string { if r == nil || r.SSHURL == nil { return "" } return *r.SSHURL } // GetStargazersCount returns the StargazersCount field if it's non-nil, zero value otherwise. func (r *Repository) GetStargazersCount() int { if r == nil || r.StargazersCount == nil { return 0 } return *r.StargazersCount } // GetStargazersURL returns the StargazersURL field if it's non-nil, zero value otherwise. func (r *Repository) GetStargazersURL() string { if r == nil || r.StargazersURL == nil { return "" } return *r.StargazersURL } // GetStatusesURL returns the StatusesURL field if it's non-nil, zero value otherwise. func (r *Repository) GetStatusesURL() string { if r == nil || r.StatusesURL == nil { return "" } return *r.StatusesURL } // GetSubscribersCount returns the SubscribersCount field if it's non-nil, zero value otherwise. func (r *Repository) GetSubscribersCount() int { if r == nil || r.SubscribersCount == nil { return 0 } return *r.SubscribersCount } // GetSubscribersURL returns the SubscribersURL field if it's non-nil, zero value otherwise. func (r *Repository) GetSubscribersURL() string { if r == nil || r.SubscribersURL == nil { return "" } return *r.SubscribersURL } // GetSubscriptionURL returns the SubscriptionURL field if it's non-nil, zero value otherwise. func (r *Repository) GetSubscriptionURL() string { if r == nil || r.SubscriptionURL == nil { return "" } return *r.SubscriptionURL } // GetSVNURL returns the SVNURL field if it's non-nil, zero value otherwise. func (r *Repository) GetSVNURL() string { if r == nil || r.SVNURL == nil { return "" } return *r.SVNURL } // GetTagsURL returns the TagsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetTagsURL() string { if r == nil || r.TagsURL == nil { return "" } return *r.TagsURL } // GetTeamID returns the TeamID field if it's non-nil, zero value otherwise. func (r *Repository) GetTeamID() int64 { if r == nil || r.TeamID == nil { return 0 } return *r.TeamID } // GetTeamsURL returns the TeamsURL field if it's non-nil, zero value otherwise. func (r *Repository) GetTeamsURL() string { if r == nil || r.TeamsURL == nil { return "" } return *r.TeamsURL } // GetTemplateRepository returns the TemplateRepository field. func (r *Repository) GetTemplateRepository() *Repository { if r == nil { return nil } return r.TemplateRepository } // GetTreesURL returns the TreesURL field if it's non-nil, zero value otherwise. func (r *Repository) GetTreesURL() string { if r == nil || r.TreesURL == nil { return "" } return *r.TreesURL } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (r *Repository) GetUpdatedAt() Timestamp { if r == nil || r.UpdatedAt == nil { return Timestamp{} } return *r.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (r *Repository) GetURL() string { if r == nil || r.URL == nil { return "" } return *r.URL } // GetVisibility returns the Visibility field if it's non-nil, zero value otherwise. func (r *Repository) GetVisibility() string { if r == nil || r.Visibility == nil { return "" } return *r.Visibility } // GetWatchers returns the Watchers field if it's non-nil, zero value otherwise. func (r *Repository) GetWatchers() int { if r == nil || r.Watchers == nil { return 0 } return *r.Watchers } // GetWatchersCount returns the WatchersCount field if it's non-nil, zero value otherwise. func (r *Repository) GetWatchersCount() int { if r == nil || r.WatchersCount == nil { return 0 } return *r.WatchersCount } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (r *RepositoryComment) GetBody() string { if r == nil || r.Body == nil { return "" } return *r.Body } // GetCommitID returns the CommitID field if it's non-nil, zero value otherwise. func (r *RepositoryComment) GetCommitID() string { if r == nil || r.CommitID == nil { return "" } return *r.CommitID } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (r *RepositoryComment) GetCreatedAt() time.Time { if r == nil || r.CreatedAt == nil { return time.Time{} } return *r.CreatedAt } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (r *RepositoryComment) GetHTMLURL() string { if r == nil || r.HTMLURL == nil { return "" } return *r.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (r *RepositoryComment) GetID() int64 { if r == nil || r.ID == nil { return 0 } return *r.ID } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (r *RepositoryComment) GetNodeID() string { if r == nil || r.NodeID == nil { return "" } return *r.NodeID } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (r *RepositoryComment) GetPath() string { if r == nil || r.Path == nil { return "" } return *r.Path } // GetPosition returns the Position field if it's non-nil, zero value otherwise. func (r *RepositoryComment) GetPosition() int { if r == nil || r.Position == nil { return 0 } return *r.Position } // GetReactions returns the Reactions field. func (r *RepositoryComment) GetReactions() *Reactions { if r == nil { return nil } return r.Reactions } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (r *RepositoryComment) GetUpdatedAt() time.Time { if r == nil || r.UpdatedAt == nil { return time.Time{} } return *r.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (r *RepositoryComment) GetURL() string { if r == nil || r.URL == nil { return "" } return *r.URL } // GetUser returns the User field. func (r *RepositoryComment) GetUser() *User { if r == nil { return nil } return r.User } // GetAuthor returns the Author field. func (r *RepositoryCommit) GetAuthor() *User { if r == nil { return nil } return r.Author } // GetCommentsURL returns the CommentsURL field if it's non-nil, zero value otherwise. func (r *RepositoryCommit) GetCommentsURL() string { if r == nil || r.CommentsURL == nil { return "" } return *r.CommentsURL } // GetCommit returns the Commit field. func (r *RepositoryCommit) GetCommit() *Commit { if r == nil { return nil } return r.Commit } // GetCommitter returns the Committer field. func (r *RepositoryCommit) GetCommitter() *User { if r == nil { return nil } return r.Committer } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (r *RepositoryCommit) GetHTMLURL() string { if r == nil || r.HTMLURL == nil { return "" } return *r.HTMLURL } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (r *RepositoryCommit) GetNodeID() string { if r == nil || r.NodeID == nil { return "" } return *r.NodeID } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (r *RepositoryCommit) GetSHA() string { if r == nil || r.SHA == nil { return "" } return *r.SHA } // GetStats returns the Stats field. func (r *RepositoryCommit) GetStats() *CommitStats { if r == nil { return nil } return r.Stats } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (r *RepositoryCommit) GetURL() string { if r == nil || r.URL == nil { return "" } return *r.URL } // GetDownloadURL returns the DownloadURL field if it's non-nil, zero value otherwise. func (r *RepositoryContent) GetDownloadURL() string { if r == nil || r.DownloadURL == nil { return "" } return *r.DownloadURL } // GetEncoding returns the Encoding field if it's non-nil, zero value otherwise. func (r *RepositoryContent) GetEncoding() string { if r == nil || r.Encoding == nil { return "" } return *r.Encoding } // GetGitURL returns the GitURL field if it's non-nil, zero value otherwise. func (r *RepositoryContent) GetGitURL() string { if r == nil || r.GitURL == nil { return "" } return *r.GitURL } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (r *RepositoryContent) GetHTMLURL() string { if r == nil || r.HTMLURL == nil { return "" } return *r.HTMLURL } // GetName returns the Name field if it's non-nil, zero value otherwise. func (r *RepositoryContent) GetName() string { if r == nil || r.Name == nil { return "" } return *r.Name } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (r *RepositoryContent) GetPath() string { if r == nil || r.Path == nil { return "" } return *r.Path } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (r *RepositoryContent) GetSHA() string { if r == nil || r.SHA == nil { return "" } return *r.SHA } // GetSize returns the Size field if it's non-nil, zero value otherwise. func (r *RepositoryContent) GetSize() int { if r == nil || r.Size == nil { return 0 } return *r.Size } // GetTarget returns the Target field if it's non-nil, zero value otherwise. func (r *RepositoryContent) GetTarget() string { if r == nil || r.Target == nil { return "" } return *r.Target } // GetType returns the Type field if it's non-nil, zero value otherwise. func (r *RepositoryContent) GetType() string { if r == nil || r.Type == nil { return "" } return *r.Type } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (r *RepositoryContent) GetURL() string { if r == nil || r.URL == nil { return "" } return *r.URL } // GetAuthor returns the Author field. func (r *RepositoryContentFileOptions) GetAuthor() *CommitAuthor { if r == nil { return nil } return r.Author } // GetBranch returns the Branch field if it's non-nil, zero value otherwise. func (r *RepositoryContentFileOptions) GetBranch() string { if r == nil || r.Branch == nil { return "" } return *r.Branch } // GetCommitter returns the Committer field. func (r *RepositoryContentFileOptions) GetCommitter() *CommitAuthor { if r == nil { return nil } return r.Committer } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (r *RepositoryContentFileOptions) GetMessage() string { if r == nil || r.Message == nil { return "" } return *r.Message } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (r *RepositoryContentFileOptions) GetSHA() string { if r == nil || r.SHA == nil { return "" } return *r.SHA } // GetContent returns the Content field. func (r *RepositoryContentResponse) GetContent() *RepositoryContent { if r == nil { return nil } return r.Content } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (r *RepositoryDispatchEvent) GetAction() string { if r == nil || r.Action == nil { return "" } return *r.Action } // GetBranch returns the Branch field if it's non-nil, zero value otherwise. func (r *RepositoryDispatchEvent) GetBranch() string { if r == nil || r.Branch == nil { return "" } return *r.Branch } // GetInstallation returns the Installation field. func (r *RepositoryDispatchEvent) GetInstallation() *Installation { if r == nil { return nil } return r.Installation } // GetOrg returns the Org field. func (r *RepositoryDispatchEvent) GetOrg() *Organization { if r == nil { return nil } return r.Org } // GetRepo returns the Repo field. func (r *RepositoryDispatchEvent) GetRepo() *Repository { if r == nil { return nil } return r.Repo } // GetSender returns the Sender field. func (r *RepositoryDispatchEvent) GetSender() *User { if r == nil { return nil } return r.Sender } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (r *RepositoryEvent) GetAction() string { if r == nil || r.Action == nil { return "" } return *r.Action } // GetInstallation returns the Installation field. func (r *RepositoryEvent) GetInstallation() *Installation { if r == nil { return nil } return r.Installation } // GetOrg returns the Org field. func (r *RepositoryEvent) GetOrg() *Organization { if r == nil { return nil } return r.Org } // GetRepo returns the Repo field. func (r *RepositoryEvent) GetRepo() *Repository { if r == nil { return nil } return r.Repo } // GetSender returns the Sender field. func (r *RepositoryEvent) GetSender() *User { if r == nil { return nil } return r.Sender } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (r *RepositoryInvitation) GetCreatedAt() Timestamp { if r == nil || r.CreatedAt == nil { return Timestamp{} } return *r.CreatedAt } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (r *RepositoryInvitation) GetHTMLURL() string { if r == nil || r.HTMLURL == nil { return "" } return *r.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (r *RepositoryInvitation) GetID() int64 { if r == nil || r.ID == nil { return 0 } return *r.ID } // GetInvitee returns the Invitee field. func (r *RepositoryInvitation) GetInvitee() *User { if r == nil { return nil } return r.Invitee } // GetInviter returns the Inviter field. func (r *RepositoryInvitation) GetInviter() *User { if r == nil { return nil } return r.Inviter } // GetPermissions returns the Permissions field if it's non-nil, zero value otherwise. func (r *RepositoryInvitation) GetPermissions() string { if r == nil || r.Permissions == nil { return "" } return *r.Permissions } // GetRepo returns the Repo field. func (r *RepositoryInvitation) GetRepo() *Repository { if r == nil { return nil } return r.Repo } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (r *RepositoryInvitation) GetURL() string { if r == nil || r.URL == nil { return "" } return *r.URL } // GetContent returns the Content field if it's non-nil, zero value otherwise. func (r *RepositoryLicense) GetContent() string { if r == nil || r.Content == nil { return "" } return *r.Content } // GetDownloadURL returns the DownloadURL field if it's non-nil, zero value otherwise. func (r *RepositoryLicense) GetDownloadURL() string { if r == nil || r.DownloadURL == nil { return "" } return *r.DownloadURL } // GetEncoding returns the Encoding field if it's non-nil, zero value otherwise. func (r *RepositoryLicense) GetEncoding() string { if r == nil || r.Encoding == nil { return "" } return *r.Encoding } // GetGitURL returns the GitURL field if it's non-nil, zero value otherwise. func (r *RepositoryLicense) GetGitURL() string { if r == nil || r.GitURL == nil { return "" } return *r.GitURL } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (r *RepositoryLicense) GetHTMLURL() string { if r == nil || r.HTMLURL == nil { return "" } return *r.HTMLURL } // GetLicense returns the License field. func (r *RepositoryLicense) GetLicense() *License { if r == nil { return nil } return r.License } // GetName returns the Name field if it's non-nil, zero value otherwise. func (r *RepositoryLicense) GetName() string { if r == nil || r.Name == nil { return "" } return *r.Name } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (r *RepositoryLicense) GetPath() string { if r == nil || r.Path == nil { return "" } return *r.Path } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (r *RepositoryLicense) GetSHA() string { if r == nil || r.SHA == nil { return "" } return *r.SHA } // GetSize returns the Size field if it's non-nil, zero value otherwise. func (r *RepositoryLicense) GetSize() int { if r == nil || r.Size == nil { return 0 } return *r.Size } // GetType returns the Type field if it's non-nil, zero value otherwise. func (r *RepositoryLicense) GetType() string { if r == nil || r.Type == nil { return "" } return *r.Type } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (r *RepositoryLicense) GetURL() string { if r == nil || r.URL == nil { return "" } return *r.URL } // GetBase returns the Base field if it's non-nil, zero value otherwise. func (r *RepositoryMergeRequest) GetBase() string { if r == nil || r.Base == nil { return "" } return *r.Base } // GetCommitMessage returns the CommitMessage field if it's non-nil, zero value otherwise. func (r *RepositoryMergeRequest) GetCommitMessage() string { if r == nil || r.CommitMessage == nil { return "" } return *r.CommitMessage } // GetHead returns the Head field if it's non-nil, zero value otherwise. func (r *RepositoryMergeRequest) GetHead() string { if r == nil || r.Head == nil { return "" } return *r.Head } // GetPermission returns the Permission field if it's non-nil, zero value otherwise. func (r *RepositoryPermissionLevel) GetPermission() string { if r == nil || r.Permission == nil { return "" } return *r.Permission } // GetUser returns the User field. func (r *RepositoryPermissionLevel) GetUser() *User { if r == nil { return nil } return r.User } // GetAssetsURL returns the AssetsURL field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetAssetsURL() string { if r == nil || r.AssetsURL == nil { return "" } return *r.AssetsURL } // GetAuthor returns the Author field. func (r *RepositoryRelease) GetAuthor() *User { if r == nil { return nil } return r.Author } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetBody() string { if r == nil || r.Body == nil { return "" } return *r.Body } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetCreatedAt() Timestamp { if r == nil || r.CreatedAt == nil { return Timestamp{} } return *r.CreatedAt } // GetDiscussionCategoryName returns the DiscussionCategoryName field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetDiscussionCategoryName() string { if r == nil || r.DiscussionCategoryName == nil { return "" } return *r.DiscussionCategoryName } // GetDraft returns the Draft field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetDraft() bool { if r == nil || r.Draft == nil { return false } return *r.Draft } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetHTMLURL() string { if r == nil || r.HTMLURL == nil { return "" } return *r.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetID() int64 { if r == nil || r.ID == nil { return 0 } return *r.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetName() string { if r == nil || r.Name == nil { return "" } return *r.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetNodeID() string { if r == nil || r.NodeID == nil { return "" } return *r.NodeID } // GetPrerelease returns the Prerelease field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetPrerelease() bool { if r == nil || r.Prerelease == nil { return false } return *r.Prerelease } // GetPublishedAt returns the PublishedAt field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetPublishedAt() Timestamp { if r == nil || r.PublishedAt == nil { return Timestamp{} } return *r.PublishedAt } // GetTagName returns the TagName field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetTagName() string { if r == nil || r.TagName == nil { return "" } return *r.TagName } // GetTarballURL returns the TarballURL field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetTarballURL() string { if r == nil || r.TarballURL == nil { return "" } return *r.TarballURL } // GetTargetCommitish returns the TargetCommitish field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetTargetCommitish() string { if r == nil || r.TargetCommitish == nil { return "" } return *r.TargetCommitish } // GetUploadURL returns the UploadURL field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetUploadURL() string { if r == nil || r.UploadURL == nil { return "" } return *r.UploadURL } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetURL() string { if r == nil || r.URL == nil { return "" } return *r.URL } // GetZipballURL returns the ZipballURL field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetZipballURL() string { if r == nil || r.ZipballURL == nil { return "" } return *r.ZipballURL } // GetCommit returns the Commit field. func (r *RepositoryTag) GetCommit() *Commit { if r == nil { return nil } return r.Commit } // GetName returns the Name field if it's non-nil, zero value otherwise. func (r *RepositoryTag) GetName() string { if r == nil || r.Name == nil { return "" } return *r.Name } // GetTarballURL returns the TarballURL field if it's non-nil, zero value otherwise. func (r *RepositoryTag) GetTarballURL() string { if r == nil || r.TarballURL == nil { return "" } return *r.TarballURL } // GetZipballURL returns the ZipballURL field if it's non-nil, zero value otherwise. func (r *RepositoryTag) GetZipballURL() string { if r == nil || r.ZipballURL == nil { return "" } return *r.ZipballURL } // GetAffectedPackageName returns the AffectedPackageName field if it's non-nil, zero value otherwise. func (r *RepositoryVulnerabilityAlert) GetAffectedPackageName() string { if r == nil || r.AffectedPackageName == nil { return "" } return *r.AffectedPackageName } // GetAffectedRange returns the AffectedRange field if it's non-nil, zero value otherwise. func (r *RepositoryVulnerabilityAlert) GetAffectedRange() string { if r == nil || r.AffectedRange == nil { return "" } return *r.AffectedRange } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (r *RepositoryVulnerabilityAlert) GetCreatedAt() Timestamp { if r == nil || r.CreatedAt == nil { return Timestamp{} } return *r.CreatedAt } // GetDismissedAt returns the DismissedAt field if it's non-nil, zero value otherwise. func (r *RepositoryVulnerabilityAlert) GetDismissedAt() Timestamp { if r == nil || r.DismissedAt == nil { return Timestamp{} } return *r.DismissedAt } // GetDismisser returns the Dismisser field. func (r *RepositoryVulnerabilityAlert) GetDismisser() *User { if r == nil { return nil } return r.Dismisser } // GetDismissReason returns the DismissReason field if it's non-nil, zero value otherwise. func (r *RepositoryVulnerabilityAlert) GetDismissReason() string { if r == nil || r.DismissReason == nil { return "" } return *r.DismissReason } // GetExternalIdentifier returns the ExternalIdentifier field if it's non-nil, zero value otherwise. func (r *RepositoryVulnerabilityAlert) GetExternalIdentifier() string { if r == nil || r.ExternalIdentifier == nil { return "" } return *r.ExternalIdentifier } // GetExternalReference returns the ExternalReference field if it's non-nil, zero value otherwise. func (r *RepositoryVulnerabilityAlert) GetExternalReference() string { if r == nil || r.ExternalReference == nil { return "" } return *r.ExternalReference } // GetFixedIn returns the FixedIn field if it's non-nil, zero value otherwise. func (r *RepositoryVulnerabilityAlert) GetFixedIn() string { if r == nil || r.FixedIn == nil { return "" } return *r.FixedIn } // GetGitHubSecurityAdvisoryID returns the GitHubSecurityAdvisoryID field if it's non-nil, zero value otherwise. func (r *RepositoryVulnerabilityAlert) GetGitHubSecurityAdvisoryID() string { if r == nil || r.GitHubSecurityAdvisoryID == nil { return "" } return *r.GitHubSecurityAdvisoryID } // GetID returns the ID field if it's non-nil, zero value otherwise. func (r *RepositoryVulnerabilityAlert) GetID() int64 { if r == nil || r.ID == nil { return 0 } return *r.ID } // GetSeverity returns the Severity field if it's non-nil, zero value otherwise. func (r *RepositoryVulnerabilityAlert) GetSeverity() string { if r == nil || r.Severity == nil { return "" } return *r.Severity } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (r *RepositoryVulnerabilityAlertEvent) GetAction() string { if r == nil || r.Action == nil { return "" } return *r.Action } // GetAlert returns the Alert field. func (r *RepositoryVulnerabilityAlertEvent) GetAlert() *RepositoryVulnerabilityAlert { if r == nil { return nil } return r.Alert } // GetRepository returns the Repository field. func (r *RepositoryVulnerabilityAlertEvent) GetRepository() *Repository { if r == nil { return nil } return r.Repository } // GetForkRepos returns the ForkRepos field if it's non-nil, zero value otherwise. func (r *RepoStats) GetForkRepos() int { if r == nil || r.ForkRepos == nil { return 0 } return *r.ForkRepos } // GetOrgRepos returns the OrgRepos field if it's non-nil, zero value otherwise. func (r *RepoStats) GetOrgRepos() int { if r == nil || r.OrgRepos == nil { return 0 } return *r.OrgRepos } // GetRootRepos returns the RootRepos field if it's non-nil, zero value otherwise. func (r *RepoStats) GetRootRepos() int { if r == nil || r.RootRepos == nil { return 0 } return *r.RootRepos } // GetTotalPushes returns the TotalPushes field if it's non-nil, zero value otherwise. func (r *RepoStats) GetTotalPushes() int { if r == nil || r.TotalPushes == nil { return 0 } return *r.TotalPushes } // GetTotalRepos returns the TotalRepos field if it's non-nil, zero value otherwise. func (r *RepoStats) GetTotalRepos() int { if r == nil || r.TotalRepos == nil { return 0 } return *r.TotalRepos } // GetTotalWikis returns the TotalWikis field if it's non-nil, zero value otherwise. func (r *RepoStats) GetTotalWikis() int { if r == nil || r.TotalWikis == nil { return 0 } return *r.TotalWikis } // GetAvatarURL returns the AvatarURL field if it's non-nil, zero value otherwise. func (r *RepoStatus) GetAvatarURL() string { if r == nil || r.AvatarURL == nil { return "" } return *r.AvatarURL } // GetContext returns the Context field if it's non-nil, zero value otherwise. func (r *RepoStatus) GetContext() string { if r == nil || r.Context == nil { return "" } return *r.Context } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (r *RepoStatus) GetCreatedAt() time.Time { if r == nil || r.CreatedAt == nil { return time.Time{} } return *r.CreatedAt } // GetCreator returns the Creator field. func (r *RepoStatus) GetCreator() *User { if r == nil { return nil } return r.Creator } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (r *RepoStatus) GetDescription() string { if r == nil || r.Description == nil { return "" } return *r.Description } // GetID returns the ID field if it's non-nil, zero value otherwise. func (r *RepoStatus) GetID() int64 { if r == nil || r.ID == nil { return 0 } return *r.ID } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (r *RepoStatus) GetNodeID() string { if r == nil || r.NodeID == nil { return "" } return *r.NodeID } // GetState returns the State field if it's non-nil, zero value otherwise. func (r *RepoStatus) GetState() string { if r == nil || r.State == nil { return "" } return *r.State } // GetTargetURL returns the TargetURL field if it's non-nil, zero value otherwise. func (r *RepoStatus) GetTargetURL() string { if r == nil || r.TargetURL == nil { return "" } return *r.TargetURL } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (r *RepoStatus) GetUpdatedAt() time.Time { if r == nil || r.UpdatedAt == nil { return time.Time{} } return *r.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (r *RepoStatus) GetURL() string { if r == nil || r.URL == nil { return "" } return *r.URL } // GetType returns the Type field if it's non-nil, zero value otherwise. func (r *RequiredReviewer) GetType() string { if r == nil || r.Type == nil { return "" } return *r.Type } // GetStrict returns the Strict field if it's non-nil, zero value otherwise. func (r *RequiredStatusChecksRequest) GetStrict() bool { if r == nil || r.Strict == nil { return false } return *r.Strict } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (r *ReviewersRequest) GetNodeID() string { if r == nil || r.NodeID == nil { return "" } return *r.NodeID } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (r *Rule) GetDescription() string { if r == nil || r.Description == nil { return "" } return *r.Description } // GetFullDescription returns the FullDescription field if it's non-nil, zero value otherwise. func (r *Rule) GetFullDescription() string { if r == nil || r.FullDescription == nil { return "" } return *r.FullDescription } // GetHelp returns the Help field if it's non-nil, zero value otherwise. func (r *Rule) GetHelp() string { if r == nil || r.Help == nil { return "" } return *r.Help } // GetID returns the ID field if it's non-nil, zero value otherwise. func (r *Rule) GetID() string { if r == nil || r.ID == nil { return "" } return *r.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (r *Rule) GetName() string { if r == nil || r.Name == nil { return "" } return *r.Name } // GetSecuritySeverityLevel returns the SecuritySeverityLevel field if it's non-nil, zero value otherwise. func (r *Rule) GetSecuritySeverityLevel() string { if r == nil || r.SecuritySeverityLevel == nil { return "" } return *r.SecuritySeverityLevel } // GetSeverity returns the Severity field if it's non-nil, zero value otherwise. func (r *Rule) GetSeverity() string { if r == nil || r.Severity == nil { return "" } return *r.Severity } // GetBusy returns the Busy field if it's non-nil, zero value otherwise. func (r *Runner) GetBusy() bool { if r == nil || r.Busy == nil { return false } return *r.Busy } // GetID returns the ID field if it's non-nil, zero value otherwise. func (r *Runner) GetID() int64 { if r == nil || r.ID == nil { return 0 } return *r.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (r *Runner) GetName() string { if r == nil || r.Name == nil { return "" } return *r.Name } // GetOS returns the OS field if it's non-nil, zero value otherwise. func (r *Runner) GetOS() string { if r == nil || r.OS == nil { return "" } return *r.OS } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (r *Runner) GetStatus() string { if r == nil || r.Status == nil { return "" } return *r.Status } // GetArchitecture returns the Architecture field if it's non-nil, zero value otherwise. func (r *RunnerApplicationDownload) GetArchitecture() string { if r == nil || r.Architecture == nil { return "" } return *r.Architecture } // GetDownloadURL returns the DownloadURL field if it's non-nil, zero value otherwise. func (r *RunnerApplicationDownload) GetDownloadURL() string { if r == nil || r.DownloadURL == nil { return "" } return *r.DownloadURL } // GetFilename returns the Filename field if it's non-nil, zero value otherwise. func (r *RunnerApplicationDownload) GetFilename() string { if r == nil || r.Filename == nil { return "" } return *r.Filename } // GetOS returns the OS field if it's non-nil, zero value otherwise. func (r *RunnerApplicationDownload) GetOS() string { if r == nil || r.OS == nil { return "" } return *r.OS } // GetSHA256Checksum returns the SHA256Checksum field if it's non-nil, zero value otherwise. func (r *RunnerApplicationDownload) GetSHA256Checksum() string { if r == nil || r.SHA256Checksum == nil { return "" } return *r.SHA256Checksum } // GetTempDownloadToken returns the TempDownloadToken field if it's non-nil, zero value otherwise. func (r *RunnerApplicationDownload) GetTempDownloadToken() string { if r == nil || r.TempDownloadToken == nil { return "" } return *r.TempDownloadToken } // GetAllowsPublicRepositories returns the AllowsPublicRepositories field if it's non-nil, zero value otherwise. func (r *RunnerGroup) GetAllowsPublicRepositories() bool { if r == nil || r.AllowsPublicRepositories == nil { return false } return *r.AllowsPublicRepositories } // GetDefault returns the Default field if it's non-nil, zero value otherwise. func (r *RunnerGroup) GetDefault() bool { if r == nil || r.Default == nil { return false } return *r.Default } // GetID returns the ID field if it's non-nil, zero value otherwise. func (r *RunnerGroup) GetID() int64 { if r == nil || r.ID == nil { return 0 } return *r.ID } // GetInherited returns the Inherited field if it's non-nil, zero value otherwise. func (r *RunnerGroup) GetInherited() bool { if r == nil || r.Inherited == nil { return false } return *r.Inherited } // GetName returns the Name field if it's non-nil, zero value otherwise. func (r *RunnerGroup) GetName() string { if r == nil || r.Name == nil { return "" } return *r.Name } // GetRunnersURL returns the RunnersURL field if it's non-nil, zero value otherwise. func (r *RunnerGroup) GetRunnersURL() string { if r == nil || r.RunnersURL == nil { return "" } return *r.RunnersURL } // GetSelectedRepositoriesURL returns the SelectedRepositoriesURL field if it's non-nil, zero value otherwise. func (r *RunnerGroup) GetSelectedRepositoriesURL() string { if r == nil || r.SelectedRepositoriesURL == nil { return "" } return *r.SelectedRepositoriesURL } // GetVisibility returns the Visibility field if it's non-nil, zero value otherwise. func (r *RunnerGroup) GetVisibility() string { if r == nil || r.Visibility == nil { return "" } return *r.Visibility } // GetID returns the ID field if it's non-nil, zero value otherwise. func (r *RunnerLabels) GetID() int64 { if r == nil || r.ID == nil { return 0 } return *r.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (r *RunnerLabels) GetName() string { if r == nil || r.Name == nil { return "" } return *r.Name } // GetType returns the Type field if it's non-nil, zero value otherwise. func (r *RunnerLabels) GetType() string { if r == nil || r.Type == nil { return "" } return *r.Type } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (s *SelectedReposList) GetTotalCount() int { if s == nil || s.TotalCount == nil { return 0 } return *s.TotalCount } // GetName returns the Name field if it's non-nil, zero value otherwise. func (s *ServiceHook) GetName() string { if s == nil || s.Name == nil { return "" } return *s.Name } // GetEnabled returns the Enabled field if it's non-nil, zero value otherwise. func (s *SignaturesProtectedBranch) GetEnabled() bool { if s == nil || s.Enabled == nil { return false } return *s.Enabled } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (s *SignaturesProtectedBranch) GetURL() string { if s == nil || s.URL == nil { return "" } return *s.URL } // GetPayload returns the Payload field if it's non-nil, zero value otherwise. func (s *SignatureVerification) GetPayload() string { if s == nil || s.Payload == nil { return "" } return *s.Payload } // GetReason returns the Reason field if it's non-nil, zero value otherwise. func (s *SignatureVerification) GetReason() string { if s == nil || s.Reason == nil { return "" } return *s.Reason } // GetSignature returns the Signature field if it's non-nil, zero value otherwise. func (s *SignatureVerification) GetSignature() string { if s == nil || s.Signature == nil { return "" } return *s.Signature } // GetVerified returns the Verified field if it's non-nil, zero value otherwise. func (s *SignatureVerification) GetVerified() bool { if s == nil || s.Verified == nil { return false } return *s.Verified } // GetActor returns the Actor field. func (s *Source) GetActor() *User { if s == nil { return nil } return s.Actor } // GetID returns the ID field if it's non-nil, zero value otherwise. func (s *Source) GetID() int64 { if s == nil || s.ID == nil { return 0 } return *s.ID } // GetIssue returns the Issue field. func (s *Source) GetIssue() *Issue { if s == nil { return nil } return s.Issue } // GetType returns the Type field if it's non-nil, zero value otherwise. func (s *Source) GetType() string { if s == nil || s.Type == nil { return "" } return *s.Type } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (s *Source) GetURL() string { if s == nil || s.URL == nil { return "" } return *s.URL } // GetEmail returns the Email field if it's non-nil, zero value otherwise. func (s *SourceImportAuthor) GetEmail() string { if s == nil || s.Email == nil { return "" } return *s.Email } // GetID returns the ID field if it's non-nil, zero value otherwise. func (s *SourceImportAuthor) GetID() int64 { if s == nil || s.ID == nil { return 0 } return *s.ID } // GetImportURL returns the ImportURL field if it's non-nil, zero value otherwise. func (s *SourceImportAuthor) GetImportURL() string { if s == nil || s.ImportURL == nil { return "" } return *s.ImportURL } // GetName returns the Name field if it's non-nil, zero value otherwise. func (s *SourceImportAuthor) GetName() string { if s == nil || s.Name == nil { return "" } return *s.Name } // GetRemoteID returns the RemoteID field if it's non-nil, zero value otherwise. func (s *SourceImportAuthor) GetRemoteID() string { if s == nil || s.RemoteID == nil { return "" } return *s.RemoteID } // GetRemoteName returns the RemoteName field if it's non-nil, zero value otherwise. func (s *SourceImportAuthor) GetRemoteName() string { if s == nil || s.RemoteName == nil { return "" } return *s.RemoteName } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (s *SourceImportAuthor) GetURL() string { if s == nil || s.URL == nil { return "" } return *s.URL } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (s *StarEvent) GetAction() string { if s == nil || s.Action == nil { return "" } return *s.Action } // GetOrg returns the Org field. func (s *StarEvent) GetOrg() *Organization { if s == nil { return nil } return s.Org } // GetRepo returns the Repo field. func (s *StarEvent) GetRepo() *Repository { if s == nil { return nil } return s.Repo } // GetSender returns the Sender field. func (s *StarEvent) GetSender() *User { if s == nil { return nil } return s.Sender } // GetStarredAt returns the StarredAt field if it's non-nil, zero value otherwise. func (s *StarEvent) GetStarredAt() Timestamp { if s == nil || s.StarredAt == nil { return Timestamp{} } return *s.StarredAt } // GetStarredAt returns the StarredAt field if it's non-nil, zero value otherwise. func (s *Stargazer) GetStarredAt() Timestamp { if s == nil || s.StarredAt == nil { return Timestamp{} } return *s.StarredAt } // GetUser returns the User field. func (s *Stargazer) GetUser() *User { if s == nil { return nil } return s.User } // GetRepository returns the Repository field. func (s *StarredRepository) GetRepository() *Repository { if s == nil { return nil } return s.Repository } // GetStarredAt returns the StarredAt field if it's non-nil, zero value otherwise. func (s *StarredRepository) GetStarredAt() Timestamp { if s == nil || s.StarredAt == nil { return Timestamp{} } return *s.StarredAt } // GetCommit returns the Commit field. func (s *StatusEvent) GetCommit() *RepositoryCommit { if s == nil { return nil } return s.Commit } // GetContext returns the Context field if it's non-nil, zero value otherwise. func (s *StatusEvent) GetContext() string { if s == nil || s.Context == nil { return "" } return *s.Context } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (s *StatusEvent) GetCreatedAt() Timestamp { if s == nil || s.CreatedAt == nil { return Timestamp{} } return *s.CreatedAt } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (s *StatusEvent) GetDescription() string { if s == nil || s.Description == nil { return "" } return *s.Description } // GetID returns the ID field if it's non-nil, zero value otherwise. func (s *StatusEvent) GetID() int64 { if s == nil || s.ID == nil { return 0 } return *s.ID } // GetInstallation returns the Installation field. func (s *StatusEvent) GetInstallation() *Installation { if s == nil { return nil } return s.Installation } // GetName returns the Name field if it's non-nil, zero value otherwise. func (s *StatusEvent) GetName() string { if s == nil || s.Name == nil { return "" } return *s.Name } // GetRepo returns the Repo field. func (s *StatusEvent) GetRepo() *Repository { if s == nil { return nil } return s.Repo } // GetSender returns the Sender field. func (s *StatusEvent) GetSender() *User { if s == nil { return nil } return s.Sender } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (s *StatusEvent) GetSHA() string { if s == nil || s.SHA == nil { return "" } return *s.SHA } // GetState returns the State field if it's non-nil, zero value otherwise. func (s *StatusEvent) GetState() string { if s == nil || s.State == nil { return "" } return *s.State } // GetTargetURL returns the TargetURL field if it's non-nil, zero value otherwise. func (s *StatusEvent) GetTargetURL() string { if s == nil || s.TargetURL == nil { return "" } return *s.TargetURL } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (s *StatusEvent) GetUpdatedAt() Timestamp { if s == nil || s.UpdatedAt == nil { return Timestamp{} } return *s.UpdatedAt } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (s *Subscription) GetCreatedAt() Timestamp { if s == nil || s.CreatedAt == nil { return Timestamp{} } return *s.CreatedAt } // GetIgnored returns the Ignored field if it's non-nil, zero value otherwise. func (s *Subscription) GetIgnored() bool { if s == nil || s.Ignored == nil { return false } return *s.Ignored } // GetReason returns the Reason field if it's non-nil, zero value otherwise. func (s *Subscription) GetReason() string { if s == nil || s.Reason == nil { return "" } return *s.Reason } // GetRepositoryURL returns the RepositoryURL field if it's non-nil, zero value otherwise. func (s *Subscription) GetRepositoryURL() string { if s == nil || s.RepositoryURL == nil { return "" } return *s.RepositoryURL } // GetSubscribed returns the Subscribed field if it's non-nil, zero value otherwise. func (s *Subscription) GetSubscribed() bool { if s == nil || s.Subscribed == nil { return false } return *s.Subscribed } // GetThreadURL returns the ThreadURL field if it's non-nil, zero value otherwise. func (s *Subscription) GetThreadURL() string { if s == nil || s.ThreadURL == nil { return "" } return *s.ThreadURL } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (s *Subscription) GetURL() string { if s == nil || s.URL == nil { return "" } return *s.URL } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (t *Tag) GetMessage() string { if t == nil || t.Message == nil { return "" } return *t.Message } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (t *Tag) GetNodeID() string { if t == nil || t.NodeID == nil { return "" } return *t.NodeID } // GetObject returns the Object field. func (t *Tag) GetObject() *GitObject { if t == nil { return nil } return t.Object } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (t *Tag) GetSHA() string { if t == nil || t.SHA == nil { return "" } return *t.SHA } // GetTag returns the Tag field if it's non-nil, zero value otherwise. func (t *Tag) GetTag() string { if t == nil || t.Tag == nil { return "" } return *t.Tag } // GetTagger returns the Tagger field. func (t *Tag) GetTagger() *CommitAuthor { if t == nil { return nil } return t.Tagger } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (t *Tag) GetURL() string { if t == nil || t.URL == nil { return "" } return *t.URL } // GetVerification returns the Verification field. func (t *Tag) GetVerification() *SignatureVerification { if t == nil { return nil } return t.Verification } // GetCompletedAt returns the CompletedAt field if it's non-nil, zero value otherwise. func (t *TaskStep) GetCompletedAt() Timestamp { if t == nil || t.CompletedAt == nil { return Timestamp{} } return *t.CompletedAt } // GetConclusion returns the Conclusion field if it's non-nil, zero value otherwise. func (t *TaskStep) GetConclusion() string { if t == nil || t.Conclusion == nil { return "" } return *t.Conclusion } // GetName returns the Name field if it's non-nil, zero value otherwise. func (t *TaskStep) GetName() string { if t == nil || t.Name == nil { return "" } return *t.Name } // GetNumber returns the Number field if it's non-nil, zero value otherwise. func (t *TaskStep) GetNumber() int64 { if t == nil || t.Number == nil { return 0 } return *t.Number } // GetStartedAt returns the StartedAt field if it's non-nil, zero value otherwise. func (t *TaskStep) GetStartedAt() Timestamp { if t == nil || t.StartedAt == nil { return Timestamp{} } return *t.StartedAt } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (t *TaskStep) GetStatus() string { if t == nil || t.Status == nil { return "" } return *t.Status } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (t *Team) GetDescription() string { if t == nil || t.Description == nil { return "" } return *t.Description } // GetID returns the ID field if it's non-nil, zero value otherwise. func (t *Team) GetID() int64 { if t == nil || t.ID == nil { return 0 } return *t.ID } // GetLDAPDN returns the LDAPDN field if it's non-nil, zero value otherwise. func (t *Team) GetLDAPDN() string { if t == nil || t.LDAPDN == nil { return "" } return *t.LDAPDN } // GetMembersCount returns the MembersCount field if it's non-nil, zero value otherwise. func (t *Team) GetMembersCount() int { if t == nil || t.MembersCount == nil { return 0 } return *t.MembersCount } // GetMembersURL returns the MembersURL field if it's non-nil, zero value otherwise. func (t *Team) GetMembersURL() string { if t == nil || t.MembersURL == nil { return "" } return *t.MembersURL } // GetName returns the Name field if it's non-nil, zero value otherwise. func (t *Team) GetName() string { if t == nil || t.Name == nil { return "" } return *t.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (t *Team) GetNodeID() string { if t == nil || t.NodeID == nil { return "" } return *t.NodeID } // GetOrganization returns the Organization field. func (t *Team) GetOrganization() *Organization { if t == nil { return nil } return t.Organization } // GetParent returns the Parent field. func (t *Team) GetParent() *Team { if t == nil { return nil } return t.Parent } // GetPermission returns the Permission field if it's non-nil, zero value otherwise. func (t *Team) GetPermission() string { if t == nil || t.Permission == nil { return "" } return *t.Permission } // GetPermissions returns the Permissions map if it's non-nil, an empty map otherwise. func (t *Team) GetPermissions() map[string]bool { if t == nil || t.Permissions == nil { return map[string]bool{} } return t.Permissions } // GetPrivacy returns the Privacy field if it's non-nil, zero value otherwise. func (t *Team) GetPrivacy() string { if t == nil || t.Privacy == nil { return "" } return *t.Privacy } // GetReposCount returns the ReposCount field if it's non-nil, zero value otherwise. func (t *Team) GetReposCount() int { if t == nil || t.ReposCount == nil { return 0 } return *t.ReposCount } // GetRepositoriesURL returns the RepositoriesURL field if it's non-nil, zero value otherwise. func (t *Team) GetRepositoriesURL() string { if t == nil || t.RepositoriesURL == nil { return "" } return *t.RepositoriesURL } // GetSlug returns the Slug field if it's non-nil, zero value otherwise. func (t *Team) GetSlug() string { if t == nil || t.Slug == nil { return "" } return *t.Slug } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (t *Team) GetURL() string { if t == nil || t.URL == nil { return "" } return *t.URL } // GetInstallation returns the Installation field. func (t *TeamAddEvent) GetInstallation() *Installation { if t == nil { return nil } return t.Installation } // GetOrg returns the Org field. func (t *TeamAddEvent) GetOrg() *Organization { if t == nil { return nil } return t.Org } // GetRepo returns the Repo field. func (t *TeamAddEvent) GetRepo() *Repository { if t == nil { return nil } return t.Repo } // GetSender returns the Sender field. func (t *TeamAddEvent) GetSender() *User { if t == nil { return nil } return t.Sender } // GetTeam returns the Team field. func (t *TeamAddEvent) GetTeam() *Team { if t == nil { return nil } return t.Team } // GetDescription returns the Description field. func (t *TeamChange) GetDescription() *TeamDescription { if t == nil { return nil } return t.Description } // GetName returns the Name field. func (t *TeamChange) GetName() *TeamName { if t == nil { return nil } return t.Name } // GetPrivacy returns the Privacy field. func (t *TeamChange) GetPrivacy() *TeamPrivacy { if t == nil { return nil } return t.Privacy } // GetRepository returns the Repository field. func (t *TeamChange) GetRepository() *TeamRepository { if t == nil { return nil } return t.Repository } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (t *TeamDescription) GetFrom() string { if t == nil || t.From == nil { return "" } return *t.From } // GetAuthor returns the Author field. func (t *TeamDiscussion) GetAuthor() *User { if t == nil { return nil } return t.Author } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetBody() string { if t == nil || t.Body == nil { return "" } return *t.Body } // GetBodyHTML returns the BodyHTML field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetBodyHTML() string { if t == nil || t.BodyHTML == nil { return "" } return *t.BodyHTML } // GetBodyVersion returns the BodyVersion field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetBodyVersion() string { if t == nil || t.BodyVersion == nil { return "" } return *t.BodyVersion } // GetCommentsCount returns the CommentsCount field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetCommentsCount() int { if t == nil || t.CommentsCount == nil { return 0 } return *t.CommentsCount } // GetCommentsURL returns the CommentsURL field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetCommentsURL() string { if t == nil || t.CommentsURL == nil { return "" } return *t.CommentsURL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetCreatedAt() Timestamp { if t == nil || t.CreatedAt == nil { return Timestamp{} } return *t.CreatedAt } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetHTMLURL() string { if t == nil || t.HTMLURL == nil { return "" } return *t.HTMLURL } // GetLastEditedAt returns the LastEditedAt field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetLastEditedAt() Timestamp { if t == nil || t.LastEditedAt == nil { return Timestamp{} } return *t.LastEditedAt } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetNodeID() string { if t == nil || t.NodeID == nil { return "" } return *t.NodeID } // GetNumber returns the Number field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetNumber() int { if t == nil || t.Number == nil { return 0 } return *t.Number } // GetPinned returns the Pinned field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetPinned() bool { if t == nil || t.Pinned == nil { return false } return *t.Pinned } // GetPrivate returns the Private field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetPrivate() bool { if t == nil || t.Private == nil { return false } return *t.Private } // GetReactions returns the Reactions field. func (t *TeamDiscussion) GetReactions() *Reactions { if t == nil { return nil } return t.Reactions } // GetTeamURL returns the TeamURL field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetTeamURL() string { if t == nil || t.TeamURL == nil { return "" } return *t.TeamURL } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetTitle() string { if t == nil || t.Title == nil { return "" } return *t.Title } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetUpdatedAt() Timestamp { if t == nil || t.UpdatedAt == nil { return Timestamp{} } return *t.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (t *TeamDiscussion) GetURL() string { if t == nil || t.URL == nil { return "" } return *t.URL } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (t *TeamEvent) GetAction() string { if t == nil || t.Action == nil { return "" } return *t.Action } // GetChanges returns the Changes field. func (t *TeamEvent) GetChanges() *TeamChange { if t == nil { return nil } return t.Changes } // GetInstallation returns the Installation field. func (t *TeamEvent) GetInstallation() *Installation { if t == nil { return nil } return t.Installation } // GetOrg returns the Org field. func (t *TeamEvent) GetOrg() *Organization { if t == nil { return nil } return t.Org } // GetRepo returns the Repo field. func (t *TeamEvent) GetRepo() *Repository { if t == nil { return nil } return t.Repo } // GetSender returns the Sender field. func (t *TeamEvent) GetSender() *User { if t == nil { return nil } return t.Sender } // GetTeam returns the Team field. func (t *TeamEvent) GetTeam() *Team { if t == nil { return nil } return t.Team } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (t *TeamLDAPMapping) GetDescription() string { if t == nil || t.Description == nil { return "" } return *t.Description } // GetID returns the ID field if it's non-nil, zero value otherwise. func (t *TeamLDAPMapping) GetID() int64 { if t == nil || t.ID == nil { return 0 } return *t.ID } // GetLDAPDN returns the LDAPDN field if it's non-nil, zero value otherwise. func (t *TeamLDAPMapping) GetLDAPDN() string { if t == nil || t.LDAPDN == nil { return "" } return *t.LDAPDN } // GetMembersURL returns the MembersURL field if it's non-nil, zero value otherwise. func (t *TeamLDAPMapping) GetMembersURL() string { if t == nil || t.MembersURL == nil { return "" } return *t.MembersURL } // GetName returns the Name field if it's non-nil, zero value otherwise. func (t *TeamLDAPMapping) GetName() string { if t == nil || t.Name == nil { return "" } return *t.Name } // GetPermission returns the Permission field if it's non-nil, zero value otherwise. func (t *TeamLDAPMapping) GetPermission() string { if t == nil || t.Permission == nil { return "" } return *t.Permission } // GetPrivacy returns the Privacy field if it's non-nil, zero value otherwise. func (t *TeamLDAPMapping) GetPrivacy() string { if t == nil || t.Privacy == nil { return "" } return *t.Privacy } // GetRepositoriesURL returns the RepositoriesURL field if it's non-nil, zero value otherwise. func (t *TeamLDAPMapping) GetRepositoriesURL() string { if t == nil || t.RepositoriesURL == nil { return "" } return *t.RepositoriesURL } // GetSlug returns the Slug field if it's non-nil, zero value otherwise. func (t *TeamLDAPMapping) GetSlug() string { if t == nil || t.Slug == nil { return "" } return *t.Slug } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (t *TeamLDAPMapping) GetURL() string { if t == nil || t.URL == nil { return "" } return *t.URL } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (t *TeamName) GetFrom() string { if t == nil || t.From == nil { return "" } return *t.From } // GetFrom returns the From field. func (t *TeamPermissions) GetFrom() *TeamPermissionsFrom { if t == nil { return nil } return t.From } // GetAdmin returns the Admin field if it's non-nil, zero value otherwise. func (t *TeamPermissionsFrom) GetAdmin() bool { if t == nil || t.Admin == nil { return false } return *t.Admin } // GetPull returns the Pull field if it's non-nil, zero value otherwise. func (t *TeamPermissionsFrom) GetPull() bool { if t == nil || t.Pull == nil { return false } return *t.Pull } // GetPush returns the Push field if it's non-nil, zero value otherwise. func (t *TeamPermissionsFrom) GetPush() bool { if t == nil || t.Push == nil { return false } return *t.Push } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (t *TeamPrivacy) GetFrom() string { if t == nil || t.From == nil { return "" } return *t.From } // GetPermission returns the Permission field if it's non-nil, zero value otherwise. func (t *TeamProjectOptions) GetPermission() string { if t == nil || t.Permission == nil { return "" } return *t.Permission } // GetPermissions returns the Permissions field. func (t *TeamRepository) GetPermissions() *TeamPermissions { if t == nil { return nil } return t.Permissions } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (t *TemplateRepoRequest) GetDescription() string { if t == nil || t.Description == nil { return "" } return *t.Description } // GetIncludeAllBranches returns the IncludeAllBranches field if it's non-nil, zero value otherwise. func (t *TemplateRepoRequest) GetIncludeAllBranches() bool { if t == nil || t.IncludeAllBranches == nil { return false } return *t.IncludeAllBranches } // GetName returns the Name field if it's non-nil, zero value otherwise. func (t *TemplateRepoRequest) GetName() string { if t == nil || t.Name == nil { return "" } return *t.Name } // GetOwner returns the Owner field if it's non-nil, zero value otherwise. func (t *TemplateRepoRequest) GetOwner() string { if t == nil || t.Owner == nil { return "" } return *t.Owner } // GetPrivate returns the Private field if it's non-nil, zero value otherwise. func (t *TemplateRepoRequest) GetPrivate() bool { if t == nil || t.Private == nil { return false } return *t.Private } // GetFragment returns the Fragment field if it's non-nil, zero value otherwise. func (t *TextMatch) GetFragment() string { if t == nil || t.Fragment == nil { return "" } return *t.Fragment } // GetObjectType returns the ObjectType field if it's non-nil, zero value otherwise. func (t *TextMatch) GetObjectType() string { if t == nil || t.ObjectType == nil { return "" } return *t.ObjectType } // GetObjectURL returns the ObjectURL field if it's non-nil, zero value otherwise. func (t *TextMatch) GetObjectURL() string { if t == nil || t.ObjectURL == nil { return "" } return *t.ObjectURL } // GetProperty returns the Property field if it's non-nil, zero value otherwise. func (t *TextMatch) GetProperty() string { if t == nil || t.Property == nil { return "" } return *t.Property } // GetActor returns the Actor field. func (t *Timeline) GetActor() *User { if t == nil { return nil } return t.Actor } // GetAssignee returns the Assignee field. func (t *Timeline) GetAssignee() *User { if t == nil { return nil } return t.Assignee } // GetCommitID returns the CommitID field if it's non-nil, zero value otherwise. func (t *Timeline) GetCommitID() string { if t == nil || t.CommitID == nil { return "" } return *t.CommitID } // GetCommitURL returns the CommitURL field if it's non-nil, zero value otherwise. func (t *Timeline) GetCommitURL() string { if t == nil || t.CommitURL == nil { return "" } return *t.CommitURL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (t *Timeline) GetCreatedAt() time.Time { if t == nil || t.CreatedAt == nil { return time.Time{} } return *t.CreatedAt } // GetEvent returns the Event field if it's non-nil, zero value otherwise. func (t *Timeline) GetEvent() string { if t == nil || t.Event == nil { return "" } return *t.Event } // GetID returns the ID field if it's non-nil, zero value otherwise. func (t *Timeline) GetID() int64 { if t == nil || t.ID == nil { return 0 } return *t.ID } // GetLabel returns the Label field. func (t *Timeline) GetLabel() *Label { if t == nil { return nil } return t.Label } // GetMilestone returns the Milestone field. func (t *Timeline) GetMilestone() *Milestone { if t == nil { return nil } return t.Milestone } // GetProjectCard returns the ProjectCard field. func (t *Timeline) GetProjectCard() *ProjectCard { if t == nil { return nil } return t.ProjectCard } // GetRename returns the Rename field. func (t *Timeline) GetRename() *Rename { if t == nil { return nil } return t.Rename } // GetSource returns the Source field. func (t *Timeline) GetSource() *Source { if t == nil { return nil } return t.Source } // GetState returns the State field if it's non-nil, zero value otherwise. func (t *Timeline) GetState() string { if t == nil || t.State == nil { return "" } return *t.State } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (t *Timeline) GetURL() string { if t == nil || t.URL == nil { return "" } return *t.URL } // GetGUID returns the GUID field if it's non-nil, zero value otherwise. func (t *Tool) GetGUID() string { if t == nil || t.GUID == nil { return "" } return *t.GUID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (t *Tool) GetName() string { if t == nil || t.Name == nil { return "" } return *t.Name } // GetVersion returns the Version field if it's non-nil, zero value otherwise. func (t *Tool) GetVersion() string { if t == nil || t.Version == nil { return "" } return *t.Version } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (t *TopicResult) GetCreatedAt() Timestamp { if t == nil || t.CreatedAt == nil { return Timestamp{} } return *t.CreatedAt } // GetCreatedBy returns the CreatedBy field if it's non-nil, zero value otherwise. func (t *TopicResult) GetCreatedBy() string { if t == nil || t.CreatedBy == nil { return "" } return *t.CreatedBy } // GetCurated returns the Curated field if it's non-nil, zero value otherwise. func (t *TopicResult) GetCurated() bool { if t == nil || t.Curated == nil { return false } return *t.Curated } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (t *TopicResult) GetDescription() string { if t == nil || t.Description == nil { return "" } return *t.Description } // GetDisplayName returns the DisplayName field if it's non-nil, zero value otherwise. func (t *TopicResult) GetDisplayName() string { if t == nil || t.DisplayName == nil { return "" } return *t.DisplayName } // GetFeatured returns the Featured field if it's non-nil, zero value otherwise. func (t *TopicResult) GetFeatured() bool { if t == nil || t.Featured == nil { return false } return *t.Featured } // GetName returns the Name field if it's non-nil, zero value otherwise. func (t *TopicResult) GetName() string { if t == nil || t.Name == nil { return "" } return *t.Name } // GetScore returns the Score field. func (t *TopicResult) GetScore() *float64 { if t == nil { return nil } return t.Score } // GetShortDescription returns the ShortDescription field if it's non-nil, zero value otherwise. func (t *TopicResult) GetShortDescription() string { if t == nil || t.ShortDescription == nil { return "" } return *t.ShortDescription } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (t *TopicResult) GetUpdatedAt() string { if t == nil || t.UpdatedAt == nil { return "" } return *t.UpdatedAt } // GetIncompleteResults returns the IncompleteResults field if it's non-nil, zero value otherwise. func (t *TopicsSearchResult) GetIncompleteResults() bool { if t == nil || t.IncompleteResults == nil { return false } return *t.IncompleteResults } // GetTotal returns the Total field if it's non-nil, zero value otherwise. func (t *TopicsSearchResult) GetTotal() int { if t == nil || t.Total == nil { return 0 } return *t.Total } // GetCount returns the Count field if it's non-nil, zero value otherwise. func (t *TrafficClones) GetCount() int { if t == nil || t.Count == nil { return 0 } return *t.Count } // GetUniques returns the Uniques field if it's non-nil, zero value otherwise. func (t *TrafficClones) GetUniques() int { if t == nil || t.Uniques == nil { return 0 } return *t.Uniques } // GetCount returns the Count field if it's non-nil, zero value otherwise. func (t *TrafficData) GetCount() int { if t == nil || t.Count == nil { return 0 } return *t.Count } // GetTimestamp returns the Timestamp field if it's non-nil, zero value otherwise. func (t *TrafficData) GetTimestamp() Timestamp { if t == nil || t.Timestamp == nil { return Timestamp{} } return *t.Timestamp } // GetUniques returns the Uniques field if it's non-nil, zero value otherwise. func (t *TrafficData) GetUniques() int { if t == nil || t.Uniques == nil { return 0 } return *t.Uniques } // GetCount returns the Count field if it's non-nil, zero value otherwise. func (t *TrafficPath) GetCount() int { if t == nil || t.Count == nil { return 0 } return *t.Count } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (t *TrafficPath) GetPath() string { if t == nil || t.Path == nil { return "" } return *t.Path } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (t *TrafficPath) GetTitle() string { if t == nil || t.Title == nil { return "" } return *t.Title } // GetUniques returns the Uniques field if it's non-nil, zero value otherwise. func (t *TrafficPath) GetUniques() int { if t == nil || t.Uniques == nil { return 0 } return *t.Uniques } // GetCount returns the Count field if it's non-nil, zero value otherwise. func (t *TrafficReferrer) GetCount() int { if t == nil || t.Count == nil { return 0 } return *t.Count } // GetReferrer returns the Referrer field if it's non-nil, zero value otherwise. func (t *TrafficReferrer) GetReferrer() string { if t == nil || t.Referrer == nil { return "" } return *t.Referrer } // GetUniques returns the Uniques field if it's non-nil, zero value otherwise. func (t *TrafficReferrer) GetUniques() int { if t == nil || t.Uniques == nil { return 0 } return *t.Uniques } // GetCount returns the Count field if it's non-nil, zero value otherwise. func (t *TrafficViews) GetCount() int { if t == nil || t.Count == nil { return 0 } return *t.Count } // GetUniques returns the Uniques field if it's non-nil, zero value otherwise. func (t *TrafficViews) GetUniques() int { if t == nil || t.Uniques == nil { return 0 } return *t.Uniques } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (t *Tree) GetSHA() string { if t == nil || t.SHA == nil { return "" } return *t.SHA } // GetTruncated returns the Truncated field if it's non-nil, zero value otherwise. func (t *Tree) GetTruncated() bool { if t == nil || t.Truncated == nil { return false } return *t.Truncated } // GetContent returns the Content field if it's non-nil, zero value otherwise. func (t *TreeEntry) GetContent() string { if t == nil || t.Content == nil { return "" } return *t.Content } // GetMode returns the Mode field if it's non-nil, zero value otherwise. func (t *TreeEntry) GetMode() string { if t == nil || t.Mode == nil { return "" } return *t.Mode } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (t *TreeEntry) GetPath() string { if t == nil || t.Path == nil { return "" } return *t.Path } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (t *TreeEntry) GetSHA() string { if t == nil || t.SHA == nil { return "" } return *t.SHA } // GetSize returns the Size field if it's non-nil, zero value otherwise. func (t *TreeEntry) GetSize() int { if t == nil || t.Size == nil { return 0 } return *t.Size } // GetType returns the Type field if it's non-nil, zero value otherwise. func (t *TreeEntry) GetType() string { if t == nil || t.Type == nil { return "" } return *t.Type } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (t *TreeEntry) GetURL() string { if t == nil || t.URL == nil { return "" } return *t.URL } // GetCompletedAt returns the CompletedAt field if it's non-nil, zero value otherwise. func (u *UpdateCheckRunOptions) GetCompletedAt() Timestamp { if u == nil || u.CompletedAt == nil { return Timestamp{} } return *u.CompletedAt } // GetConclusion returns the Conclusion field if it's non-nil, zero value otherwise. func (u *UpdateCheckRunOptions) GetConclusion() string { if u == nil || u.Conclusion == nil { return "" } return *u.Conclusion } // GetDetailsURL returns the DetailsURL field if it's non-nil, zero value otherwise. func (u *UpdateCheckRunOptions) GetDetailsURL() string { if u == nil || u.DetailsURL == nil { return "" } return *u.DetailsURL } // GetExternalID returns the ExternalID field if it's non-nil, zero value otherwise. func (u *UpdateCheckRunOptions) GetExternalID() string { if u == nil || u.ExternalID == nil { return "" } return *u.ExternalID } // GetOutput returns the Output field. func (u *UpdateCheckRunOptions) GetOutput() *CheckRunOutput { if u == nil { return nil } return u.Output } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (u *UpdateCheckRunOptions) GetStatus() string { if u == nil || u.Status == nil { return "" } return *u.Status } // GetAllowsPublicRepositories returns the AllowsPublicRepositories field if it's non-nil, zero value otherwise. func (u *UpdateRunnerGroupRequest) GetAllowsPublicRepositories() bool { if u == nil || u.AllowsPublicRepositories == nil { return false } return *u.AllowsPublicRepositories } // GetName returns the Name field if it's non-nil, zero value otherwise. func (u *UpdateRunnerGroupRequest) GetName() string { if u == nil || u.Name == nil { return "" } return *u.Name } // GetVisibility returns the Visibility field if it's non-nil, zero value otherwise. func (u *UpdateRunnerGroupRequest) GetVisibility() string { if u == nil || u.Visibility == nil { return "" } return *u.Visibility } // GetAvatarURL returns the AvatarURL field if it's non-nil, zero value otherwise. func (u *User) GetAvatarURL() string { if u == nil || u.AvatarURL == nil { return "" } return *u.AvatarURL } // GetBio returns the Bio field if it's non-nil, zero value otherwise. func (u *User) GetBio() string { if u == nil || u.Bio == nil { return "" } return *u.Bio } // GetBlog returns the Blog field if it's non-nil, zero value otherwise. func (u *User) GetBlog() string { if u == nil || u.Blog == nil { return "" } return *u.Blog } // GetCollaborators returns the Collaborators field if it's non-nil, zero value otherwise. func (u *User) GetCollaborators() int { if u == nil || u.Collaborators == nil { return 0 } return *u.Collaborators } // GetCompany returns the Company field if it's non-nil, zero value otherwise. func (u *User) GetCompany() string { if u == nil || u.Company == nil { return "" } return *u.Company } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (u *User) GetCreatedAt() Timestamp { if u == nil || u.CreatedAt == nil { return Timestamp{} } return *u.CreatedAt } // GetDiskUsage returns the DiskUsage field if it's non-nil, zero value otherwise. func (u *User) GetDiskUsage() int { if u == nil || u.DiskUsage == nil { return 0 } return *u.DiskUsage } // GetEmail returns the Email field if it's non-nil, zero value otherwise. func (u *User) GetEmail() string { if u == nil || u.Email == nil { return "" } return *u.Email } // GetEventsURL returns the EventsURL field if it's non-nil, zero value otherwise. func (u *User) GetEventsURL() string { if u == nil || u.EventsURL == nil { return "" } return *u.EventsURL } // GetFollowers returns the Followers field if it's non-nil, zero value otherwise. func (u *User) GetFollowers() int { if u == nil || u.Followers == nil { return 0 } return *u.Followers } // GetFollowersURL returns the FollowersURL field if it's non-nil, zero value otherwise. func (u *User) GetFollowersURL() string { if u == nil || u.FollowersURL == nil { return "" } return *u.FollowersURL } // GetFollowing returns the Following field if it's non-nil, zero value otherwise. func (u *User) GetFollowing() int { if u == nil || u.Following == nil { return 0 } return *u.Following } // GetFollowingURL returns the FollowingURL field if it's non-nil, zero value otherwise. func (u *User) GetFollowingURL() string { if u == nil || u.FollowingURL == nil { return "" } return *u.FollowingURL } // GetGistsURL returns the GistsURL field if it's non-nil, zero value otherwise. func (u *User) GetGistsURL() string { if u == nil || u.GistsURL == nil { return "" } return *u.GistsURL } // GetGravatarID returns the GravatarID field if it's non-nil, zero value otherwise. func (u *User) GetGravatarID() string { if u == nil || u.GravatarID == nil { return "" } return *u.GravatarID } // GetHireable returns the Hireable field if it's non-nil, zero value otherwise. func (u *User) GetHireable() bool { if u == nil || u.Hireable == nil { return false } return *u.Hireable } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (u *User) GetHTMLURL() string { if u == nil || u.HTMLURL == nil { return "" } return *u.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (u *User) GetID() int64 { if u == nil || u.ID == nil { return 0 } return *u.ID } // GetLdapDn returns the LdapDn field if it's non-nil, zero value otherwise. func (u *User) GetLdapDn() string { if u == nil || u.LdapDn == nil { return "" } return *u.LdapDn } // GetLocation returns the Location field if it's non-nil, zero value otherwise. func (u *User) GetLocation() string { if u == nil || u.Location == nil { return "" } return *u.Location } // GetLogin returns the Login field if it's non-nil, zero value otherwise. func (u *User) GetLogin() string { if u == nil || u.Login == nil { return "" } return *u.Login } // GetName returns the Name field if it's non-nil, zero value otherwise. func (u *User) GetName() string { if u == nil || u.Name == nil { return "" } return *u.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (u *User) GetNodeID() string { if u == nil || u.NodeID == nil { return "" } return *u.NodeID } // GetOrganizationsURL returns the OrganizationsURL field if it's non-nil, zero value otherwise. func (u *User) GetOrganizationsURL() string { if u == nil || u.OrganizationsURL == nil { return "" } return *u.OrganizationsURL } // GetOwnedPrivateRepos returns the OwnedPrivateRepos field if it's non-nil, zero value otherwise. func (u *User) GetOwnedPrivateRepos() int { if u == nil || u.OwnedPrivateRepos == nil { return 0 } return *u.OwnedPrivateRepos } // GetPermissions returns the Permissions map if it's non-nil, an empty map otherwise. func (u *User) GetPermissions() map[string]bool { if u == nil || u.Permissions == nil { return map[string]bool{} } return u.Permissions } // GetPlan returns the Plan field. func (u *User) GetPlan() *Plan { if u == nil { return nil } return u.Plan } // GetPrivateGists returns the PrivateGists field if it's non-nil, zero value otherwise. func (u *User) GetPrivateGists() int { if u == nil || u.PrivateGists == nil { return 0 } return *u.PrivateGists } // GetPublicGists returns the PublicGists field if it's non-nil, zero value otherwise. func (u *User) GetPublicGists() int { if u == nil || u.PublicGists == nil { return 0 } return *u.PublicGists } // GetPublicRepos returns the PublicRepos field if it's non-nil, zero value otherwise. func (u *User) GetPublicRepos() int { if u == nil || u.PublicRepos == nil { return 0 } return *u.PublicRepos } // GetReceivedEventsURL returns the ReceivedEventsURL field if it's non-nil, zero value otherwise. func (u *User) GetReceivedEventsURL() string { if u == nil || u.ReceivedEventsURL == nil { return "" } return *u.ReceivedEventsURL } // GetReposURL returns the ReposURL field if it's non-nil, zero value otherwise. func (u *User) GetReposURL() string { if u == nil || u.ReposURL == nil { return "" } return *u.ReposURL } // GetSiteAdmin returns the SiteAdmin field if it's non-nil, zero value otherwise. func (u *User) GetSiteAdmin() bool { if u == nil || u.SiteAdmin == nil { return false } return *u.SiteAdmin } // GetStarredURL returns the StarredURL field if it's non-nil, zero value otherwise. func (u *User) GetStarredURL() string { if u == nil || u.StarredURL == nil { return "" } return *u.StarredURL } // GetSubscriptionsURL returns the SubscriptionsURL field if it's non-nil, zero value otherwise. func (u *User) GetSubscriptionsURL() string { if u == nil || u.SubscriptionsURL == nil { return "" } return *u.SubscriptionsURL } // GetSuspendedAt returns the SuspendedAt field if it's non-nil, zero value otherwise. func (u *User) GetSuspendedAt() Timestamp { if u == nil || u.SuspendedAt == nil { return Timestamp{} } return *u.SuspendedAt } // GetTotalPrivateRepos returns the TotalPrivateRepos field if it's non-nil, zero value otherwise. func (u *User) GetTotalPrivateRepos() int { if u == nil || u.TotalPrivateRepos == nil { return 0 } return *u.TotalPrivateRepos } // GetTwitterUsername returns the TwitterUsername field if it's non-nil, zero value otherwise. func (u *User) GetTwitterUsername() string { if u == nil || u.TwitterUsername == nil { return "" } return *u.TwitterUsername } // GetTwoFactorAuthentication returns the TwoFactorAuthentication field if it's non-nil, zero value otherwise. func (u *User) GetTwoFactorAuthentication() bool { if u == nil || u.TwoFactorAuthentication == nil { return false } return *u.TwoFactorAuthentication } // GetType returns the Type field if it's non-nil, zero value otherwise. func (u *User) GetType() string { if u == nil || u.Type == nil { return "" } return *u.Type } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (u *User) GetUpdatedAt() Timestamp { if u == nil || u.UpdatedAt == nil { return Timestamp{} } return *u.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (u *User) GetURL() string { if u == nil || u.URL == nil { return "" } return *u.URL } // GetApp returns the App field. func (u *UserAuthorization) GetApp() *OAuthAPP { if u == nil { return nil } return u.App } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (u *UserAuthorization) GetCreatedAt() Timestamp { if u == nil || u.CreatedAt == nil { return Timestamp{} } return *u.CreatedAt } // GetFingerprint returns the Fingerprint field if it's non-nil, zero value otherwise. func (u *UserAuthorization) GetFingerprint() string { if u == nil || u.Fingerprint == nil { return "" } return *u.Fingerprint } // GetHashedToken returns the HashedToken field if it's non-nil, zero value otherwise. func (u *UserAuthorization) GetHashedToken() string { if u == nil || u.HashedToken == nil { return "" } return *u.HashedToken } // GetID returns the ID field if it's non-nil, zero value otherwise. func (u *UserAuthorization) GetID() int64 { if u == nil || u.ID == nil { return 0 } return *u.ID } // GetNote returns the Note field if it's non-nil, zero value otherwise. func (u *UserAuthorization) GetNote() string { if u == nil || u.Note == nil { return "" } return *u.Note } // GetNoteURL returns the NoteURL field if it's non-nil, zero value otherwise. func (u *UserAuthorization) GetNoteURL() string { if u == nil || u.NoteURL == nil { return "" } return *u.NoteURL } // GetToken returns the Token field if it's non-nil, zero value otherwise. func (u *UserAuthorization) GetToken() string { if u == nil || u.Token == nil { return "" } return *u.Token } // GetTokenLastEight returns the TokenLastEight field if it's non-nil, zero value otherwise. func (u *UserAuthorization) GetTokenLastEight() string { if u == nil || u.TokenLastEight == nil { return "" } return *u.TokenLastEight } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (u *UserAuthorization) GetUpdatedAt() Timestamp { if u == nil || u.UpdatedAt == nil { return Timestamp{} } return *u.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (u *UserAuthorization) GetURL() string { if u == nil || u.URL == nil { return "" } return *u.URL } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (u *UserContext) GetMessage() string { if u == nil || u.Message == nil { return "" } return *u.Message } // GetOcticon returns the Octicon field if it's non-nil, zero value otherwise. func (u *UserContext) GetOcticon() string { if u == nil || u.Octicon == nil { return "" } return *u.Octicon } // GetEmail returns the Email field if it's non-nil, zero value otherwise. func (u *UserEmail) GetEmail() string { if u == nil || u.Email == nil { return "" } return *u.Email } // GetPrimary returns the Primary field if it's non-nil, zero value otherwise. func (u *UserEmail) GetPrimary() bool { if u == nil || u.Primary == nil { return false } return *u.Primary } // GetVerified returns the Verified field if it's non-nil, zero value otherwise. func (u *UserEmail) GetVerified() bool { if u == nil || u.Verified == nil { return false } return *u.Verified } // GetVisibility returns the Visibility field if it's non-nil, zero value otherwise. func (u *UserEmail) GetVisibility() string { if u == nil || u.Visibility == nil { return "" } return *u.Visibility } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (u *UserEvent) GetAction() string { if u == nil || u.Action == nil { return "" } return *u.Action } // GetEnterprise returns the Enterprise field. func (u *UserEvent) GetEnterprise() *Enterprise { if u == nil { return nil } return u.Enterprise } // GetSender returns the Sender field. func (u *UserEvent) GetSender() *User { if u == nil { return nil } return u.Sender } // GetUser returns the User field. func (u *UserEvent) GetUser() *User { if u == nil { return nil } return u.User } // GetAvatarURL returns the AvatarURL field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetAvatarURL() string { if u == nil || u.AvatarURL == nil { return "" } return *u.AvatarURL } // GetEventsURL returns the EventsURL field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetEventsURL() string { if u == nil || u.EventsURL == nil { return "" } return *u.EventsURL } // GetFollowersURL returns the FollowersURL field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetFollowersURL() string { if u == nil || u.FollowersURL == nil { return "" } return *u.FollowersURL } // GetFollowingURL returns the FollowingURL field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetFollowingURL() string { if u == nil || u.FollowingURL == nil { return "" } return *u.FollowingURL } // GetGistsURL returns the GistsURL field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetGistsURL() string { if u == nil || u.GistsURL == nil { return "" } return *u.GistsURL } // GetGravatarID returns the GravatarID field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetGravatarID() string { if u == nil || u.GravatarID == nil { return "" } return *u.GravatarID } // GetID returns the ID field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetID() int64 { if u == nil || u.ID == nil { return 0 } return *u.ID } // GetLDAPDN returns the LDAPDN field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetLDAPDN() string { if u == nil || u.LDAPDN == nil { return "" } return *u.LDAPDN } // GetLogin returns the Login field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetLogin() string { if u == nil || u.Login == nil { return "" } return *u.Login } // GetOrganizationsURL returns the OrganizationsURL field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetOrganizationsURL() string { if u == nil || u.OrganizationsURL == nil { return "" } return *u.OrganizationsURL } // GetReceivedEventsURL returns the ReceivedEventsURL field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetReceivedEventsURL() string { if u == nil || u.ReceivedEventsURL == nil { return "" } return *u.ReceivedEventsURL } // GetReposURL returns the ReposURL field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetReposURL() string { if u == nil || u.ReposURL == nil { return "" } return *u.ReposURL } // GetSiteAdmin returns the SiteAdmin field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetSiteAdmin() bool { if u == nil || u.SiteAdmin == nil { return false } return *u.SiteAdmin } // GetStarredURL returns the StarredURL field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetStarredURL() string { if u == nil || u.StarredURL == nil { return "" } return *u.StarredURL } // GetSubscriptionsURL returns the SubscriptionsURL field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetSubscriptionsURL() string { if u == nil || u.SubscriptionsURL == nil { return "" } return *u.SubscriptionsURL } // GetType returns the Type field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetType() string { if u == nil || u.Type == nil { return "" } return *u.Type } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (u *UserLDAPMapping) GetURL() string { if u == nil || u.URL == nil { return "" } return *u.URL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (u *UserMigration) GetCreatedAt() string { if u == nil || u.CreatedAt == nil { return "" } return *u.CreatedAt } // GetExcludeAttachments returns the ExcludeAttachments field if it's non-nil, zero value otherwise. func (u *UserMigration) GetExcludeAttachments() bool { if u == nil || u.ExcludeAttachments == nil { return false } return *u.ExcludeAttachments } // GetGUID returns the GUID field if it's non-nil, zero value otherwise. func (u *UserMigration) GetGUID() string { if u == nil || u.GUID == nil { return "" } return *u.GUID } // GetID returns the ID field if it's non-nil, zero value otherwise. func (u *UserMigration) GetID() int64 { if u == nil || u.ID == nil { return 0 } return *u.ID } // GetLockRepositories returns the LockRepositories field if it's non-nil, zero value otherwise. func (u *UserMigration) GetLockRepositories() bool { if u == nil || u.LockRepositories == nil { return false } return *u.LockRepositories } // GetState returns the State field if it's non-nil, zero value otherwise. func (u *UserMigration) GetState() string { if u == nil || u.State == nil { return "" } return *u.State } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (u *UserMigration) GetUpdatedAt() string { if u == nil || u.UpdatedAt == nil { return "" } return *u.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (u *UserMigration) GetURL() string { if u == nil || u.URL == nil { return "" } return *u.URL } // GetIncompleteResults returns the IncompleteResults field if it's non-nil, zero value otherwise. func (u *UsersSearchResult) GetIncompleteResults() bool { if u == nil || u.IncompleteResults == nil { return false } return *u.IncompleteResults } // GetTotal returns the Total field if it's non-nil, zero value otherwise. func (u *UsersSearchResult) GetTotal() int { if u == nil || u.Total == nil { return 0 } return *u.Total } // GetAdminUsers returns the AdminUsers field if it's non-nil, zero value otherwise. func (u *UserStats) GetAdminUsers() int { if u == nil || u.AdminUsers == nil { return 0 } return *u.AdminUsers } // GetSuspendedUsers returns the SuspendedUsers field if it's non-nil, zero value otherwise. func (u *UserStats) GetSuspendedUsers() int { if u == nil || u.SuspendedUsers == nil { return 0 } return *u.SuspendedUsers } // GetTotalUsers returns the TotalUsers field if it's non-nil, zero value otherwise. func (u *UserStats) GetTotalUsers() int { if u == nil || u.TotalUsers == nil { return 0 } return *u.TotalUsers } // GetReason returns the Reason field if it's non-nil, zero value otherwise. func (u *UserSuspendOptions) GetReason() string { if u == nil || u.Reason == nil { return "" } return *u.Reason } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (w *WatchEvent) GetAction() string { if w == nil || w.Action == nil { return "" } return *w.Action } // GetInstallation returns the Installation field. func (w *WatchEvent) GetInstallation() *Installation { if w == nil { return nil } return w.Installation } // GetRepo returns the Repo field. func (w *WatchEvent) GetRepo() *Repository { if w == nil { return nil } return w.Repo } // GetSender returns the Sender field. func (w *WatchEvent) GetSender() *User { if w == nil { return nil } return w.Sender } // GetEmail returns the Email field if it's non-nil, zero value otherwise. func (w *WebHookAuthor) GetEmail() string { if w == nil || w.Email == nil { return "" } return *w.Email } // GetName returns the Name field if it's non-nil, zero value otherwise. func (w *WebHookAuthor) GetName() string { if w == nil || w.Name == nil { return "" } return *w.Name } // GetUsername returns the Username field if it's non-nil, zero value otherwise. func (w *WebHookAuthor) GetUsername() string { if w == nil || w.Username == nil { return "" } return *w.Username } // GetAuthor returns the Author field. func (w *WebHookCommit) GetAuthor() *WebHookAuthor { if w == nil { return nil } return w.Author } // GetCommitter returns the Committer field. func (w *WebHookCommit) GetCommitter() *WebHookAuthor { if w == nil { return nil } return w.Committer } // GetDistinct returns the Distinct field if it's non-nil, zero value otherwise. func (w *WebHookCommit) GetDistinct() bool { if w == nil || w.Distinct == nil { return false } return *w.Distinct } // GetID returns the ID field if it's non-nil, zero value otherwise. func (w *WebHookCommit) GetID() string { if w == nil || w.ID == nil { return "" } return *w.ID } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (w *WebHookCommit) GetMessage() string { if w == nil || w.Message == nil { return "" } return *w.Message } // GetTimestamp returns the Timestamp field if it's non-nil, zero value otherwise. func (w *WebHookCommit) GetTimestamp() time.Time { if w == nil || w.Timestamp == nil { return time.Time{} } return *w.Timestamp } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (w *WebHookPayload) GetAction() string { if w == nil || w.Action == nil { return "" } return *w.Action } // GetAfter returns the After field if it's non-nil, zero value otherwise. func (w *WebHookPayload) GetAfter() string { if w == nil || w.After == nil { return "" } return *w.After } // GetBefore returns the Before field if it's non-nil, zero value otherwise. func (w *WebHookPayload) GetBefore() string { if w == nil || w.Before == nil { return "" } return *w.Before } // GetCompare returns the Compare field if it's non-nil, zero value otherwise. func (w *WebHookPayload) GetCompare() string { if w == nil || w.Compare == nil { return "" } return *w.Compare } // GetCreated returns the Created field if it's non-nil, zero value otherwise. func (w *WebHookPayload) GetCreated() bool { if w == nil || w.Created == nil { return false } return *w.Created } // GetDeleted returns the Deleted field if it's non-nil, zero value otherwise. func (w *WebHookPayload) GetDeleted() bool { if w == nil || w.Deleted == nil { return false } return *w.Deleted } // GetForced returns the Forced field if it's non-nil, zero value otherwise. func (w *WebHookPayload) GetForced() bool { if w == nil || w.Forced == nil { return false } return *w.Forced } // GetHeadCommit returns the HeadCommit field. func (w *WebHookPayload) GetHeadCommit() *WebHookCommit { if w == nil { return nil } return w.HeadCommit } // GetInstallation returns the Installation field. func (w *WebHookPayload) GetInstallation() *Installation { if w == nil { return nil } return w.Installation } // GetOrganization returns the Organization field. func (w *WebHookPayload) GetOrganization() *Organization { if w == nil { return nil } return w.Organization } // GetPusher returns the Pusher field. func (w *WebHookPayload) GetPusher() *User { if w == nil { return nil } return w.Pusher } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (w *WebHookPayload) GetRef() string { if w == nil || w.Ref == nil { return "" } return *w.Ref } // GetRepo returns the Repo field. func (w *WebHookPayload) GetRepo() *Repository { if w == nil { return nil } return w.Repo } // GetSender returns the Sender field. func (w *WebHookPayload) GetSender() *User { if w == nil { return nil } return w.Sender } // GetTotal returns the Total field if it's non-nil, zero value otherwise. func (w *WeeklyCommitActivity) GetTotal() int { if w == nil || w.Total == nil { return 0 } return *w.Total } // GetWeek returns the Week field if it's non-nil, zero value otherwise. func (w *WeeklyCommitActivity) GetWeek() Timestamp { if w == nil || w.Week == nil { return Timestamp{} } return *w.Week } // GetAdditions returns the Additions field if it's non-nil, zero value otherwise. func (w *WeeklyStats) GetAdditions() int { if w == nil || w.Additions == nil { return 0 } return *w.Additions } // GetCommits returns the Commits field if it's non-nil, zero value otherwise. func (w *WeeklyStats) GetCommits() int { if w == nil || w.Commits == nil { return 0 } return *w.Commits } // GetDeletions returns the Deletions field if it's non-nil, zero value otherwise. func (w *WeeklyStats) GetDeletions() int { if w == nil || w.Deletions == nil { return 0 } return *w.Deletions } // GetWeek returns the Week field if it's non-nil, zero value otherwise. func (w *WeeklyStats) GetWeek() Timestamp { if w == nil || w.Week == nil { return Timestamp{} } return *w.Week } // GetBadgeURL returns the BadgeURL field if it's non-nil, zero value otherwise. func (w *Workflow) GetBadgeURL() string { if w == nil || w.BadgeURL == nil { return "" } return *w.BadgeURL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (w *Workflow) GetCreatedAt() Timestamp { if w == nil || w.CreatedAt == nil { return Timestamp{} } return *w.CreatedAt } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (w *Workflow) GetHTMLURL() string { if w == nil || w.HTMLURL == nil { return "" } return *w.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (w *Workflow) GetID() int64 { if w == nil || w.ID == nil { return 0 } return *w.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (w *Workflow) GetName() string { if w == nil || w.Name == nil { return "" } return *w.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (w *Workflow) GetNodeID() string { if w == nil || w.NodeID == nil { return "" } return *w.NodeID } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (w *Workflow) GetPath() string { if w == nil || w.Path == nil { return "" } return *w.Path } // GetState returns the State field if it's non-nil, zero value otherwise. func (w *Workflow) GetState() string { if w == nil || w.State == nil { return "" } return *w.State } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (w *Workflow) GetUpdatedAt() Timestamp { if w == nil || w.UpdatedAt == nil { return Timestamp{} } return *w.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (w *Workflow) GetURL() string { if w == nil || w.URL == nil { return "" } return *w.URL } // GetTotalMS returns the TotalMS field if it's non-nil, zero value otherwise. func (w *WorkflowBill) GetTotalMS() int64 { if w == nil || w.TotalMS == nil { return 0 } return *w.TotalMS } // GetOrg returns the Org field. func (w *WorkflowDispatchEvent) GetOrg() *Organization { if w == nil { return nil } return w.Org } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (w *WorkflowDispatchEvent) GetRef() string { if w == nil || w.Ref == nil { return "" } return *w.Ref } // GetRepo returns the Repo field. func (w *WorkflowDispatchEvent) GetRepo() *Repository { if w == nil { return nil } return w.Repo } // GetSender returns the Sender field. func (w *WorkflowDispatchEvent) GetSender() *User { if w == nil { return nil } return w.Sender } // GetWorkflow returns the Workflow field if it's non-nil, zero value otherwise. func (w *WorkflowDispatchEvent) GetWorkflow() string { if w == nil || w.Workflow == nil { return "" } return *w.Workflow } // GetMacOS returns the MacOS field. func (w *WorkflowEnvironment) GetMacOS() *WorkflowBill { if w == nil { return nil } return w.MacOS } // GetUbuntu returns the Ubuntu field. func (w *WorkflowEnvironment) GetUbuntu() *WorkflowBill { if w == nil { return nil } return w.Ubuntu } // GetWindows returns the Windows field. func (w *WorkflowEnvironment) GetWindows() *WorkflowBill { if w == nil { return nil } return w.Windows } // GetCheckRunURL returns the CheckRunURL field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetCheckRunURL() string { if w == nil || w.CheckRunURL == nil { return "" } return *w.CheckRunURL } // GetCompletedAt returns the CompletedAt field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetCompletedAt() Timestamp { if w == nil || w.CompletedAt == nil { return Timestamp{} } return *w.CompletedAt } // GetConclusion returns the Conclusion field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetConclusion() string { if w == nil || w.Conclusion == nil { return "" } return *w.Conclusion } // GetHeadSHA returns the HeadSHA field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetHeadSHA() string { if w == nil || w.HeadSHA == nil { return "" } return *w.HeadSHA } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetHTMLURL() string { if w == nil || w.HTMLURL == nil { return "" } return *w.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetID() int64 { if w == nil || w.ID == nil { return 0 } return *w.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetName() string { if w == nil || w.Name == nil { return "" } return *w.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetNodeID() string { if w == nil || w.NodeID == nil { return "" } return *w.NodeID } // GetRunID returns the RunID field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetRunID() int64 { if w == nil || w.RunID == nil { return 0 } return *w.RunID } // GetRunURL returns the RunURL field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetRunURL() string { if w == nil || w.RunURL == nil { return "" } return *w.RunURL } // GetStartedAt returns the StartedAt field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetStartedAt() Timestamp { if w == nil || w.StartedAt == nil { return Timestamp{} } return *w.StartedAt } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetStatus() string { if w == nil || w.Status == nil { return "" } return *w.Status } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetURL() string { if w == nil || w.URL == nil { return "" } return *w.URL } // GetArtifactsURL returns the ArtifactsURL field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetArtifactsURL() string { if w == nil || w.ArtifactsURL == nil { return "" } return *w.ArtifactsURL } // GetCancelURL returns the CancelURL field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetCancelURL() string { if w == nil || w.CancelURL == nil { return "" } return *w.CancelURL } // GetCheckSuiteURL returns the CheckSuiteURL field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetCheckSuiteURL() string { if w == nil || w.CheckSuiteURL == nil { return "" } return *w.CheckSuiteURL } // GetConclusion returns the Conclusion field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetConclusion() string { if w == nil || w.Conclusion == nil { return "" } return *w.Conclusion } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetCreatedAt() Timestamp { if w == nil || w.CreatedAt == nil { return Timestamp{} } return *w.CreatedAt } // GetEvent returns the Event field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetEvent() string { if w == nil || w.Event == nil { return "" } return *w.Event } // GetHeadBranch returns the HeadBranch field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetHeadBranch() string { if w == nil || w.HeadBranch == nil { return "" } return *w.HeadBranch } // GetHeadCommit returns the HeadCommit field. func (w *WorkflowRun) GetHeadCommit() *HeadCommit { if w == nil { return nil } return w.HeadCommit } // GetHeadRepository returns the HeadRepository field. func (w *WorkflowRun) GetHeadRepository() *Repository { if w == nil { return nil } return w.HeadRepository } // GetHeadSHA returns the HeadSHA field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetHeadSHA() string { if w == nil || w.HeadSHA == nil { return "" } return *w.HeadSHA } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetHTMLURL() string { if w == nil || w.HTMLURL == nil { return "" } return *w.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetID() int64 { if w == nil || w.ID == nil { return 0 } return *w.ID } // GetJobsURL returns the JobsURL field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetJobsURL() string { if w == nil || w.JobsURL == nil { return "" } return *w.JobsURL } // GetLogsURL returns the LogsURL field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetLogsURL() string { if w == nil || w.LogsURL == nil { return "" } return *w.LogsURL } // GetName returns the Name field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetName() string { if w == nil || w.Name == nil { return "" } return *w.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetNodeID() string { if w == nil || w.NodeID == nil { return "" } return *w.NodeID } // GetRepository returns the Repository field. func (w *WorkflowRun) GetRepository() *Repository { if w == nil { return nil } return w.Repository } // GetRerunURL returns the RerunURL field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetRerunURL() string { if w == nil || w.RerunURL == nil { return "" } return *w.RerunURL } // GetRunNumber returns the RunNumber field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetRunNumber() int { if w == nil || w.RunNumber == nil { return 0 } return *w.RunNumber } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetStatus() string { if w == nil || w.Status == nil { return "" } return *w.Status } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetUpdatedAt() Timestamp { if w == nil || w.UpdatedAt == nil { return Timestamp{} } return *w.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetURL() string { if w == nil || w.URL == nil { return "" } return *w.URL } // GetWorkflowID returns the WorkflowID field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetWorkflowID() int64 { if w == nil || w.WorkflowID == nil { return 0 } return *w.WorkflowID } // GetWorkflowURL returns the WorkflowURL field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetWorkflowURL() string { if w == nil || w.WorkflowURL == nil { return "" } return *w.WorkflowURL } // GetJobs returns the Jobs field if it's non-nil, zero value otherwise. func (w *WorkflowRunBill) GetJobs() int { if w == nil || w.Jobs == nil { return 0 } return *w.Jobs } // GetTotalMS returns the TotalMS field if it's non-nil, zero value otherwise. func (w *WorkflowRunBill) GetTotalMS() int64 { if w == nil || w.TotalMS == nil { return 0 } return *w.TotalMS } // GetMacOS returns the MacOS field. func (w *WorkflowRunEnvironment) GetMacOS() *WorkflowRunBill { if w == nil { return nil } return w.MacOS } // GetUbuntu returns the Ubuntu field. func (w *WorkflowRunEnvironment) GetUbuntu() *WorkflowRunBill { if w == nil { return nil } return w.Ubuntu } // GetWindows returns the Windows field. func (w *WorkflowRunEnvironment) GetWindows() *WorkflowRunBill { if w == nil { return nil } return w.Windows } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (w *WorkflowRunEvent) GetAction() string { if w == nil || w.Action == nil { return "" } return *w.Action } // GetOrg returns the Org field. func (w *WorkflowRunEvent) GetOrg() *Organization { if w == nil { return nil } return w.Org } // GetRepo returns the Repo field. func (w *WorkflowRunEvent) GetRepo() *Repository { if w == nil { return nil } return w.Repo } // GetSender returns the Sender field. func (w *WorkflowRunEvent) GetSender() *User { if w == nil { return nil } return w.Sender } // GetWorkflow returns the Workflow field. func (w *WorkflowRunEvent) GetWorkflow() *Workflow { if w == nil { return nil } return w.Workflow } // GetWorkflowRun returns the WorkflowRun field. func (w *WorkflowRunEvent) GetWorkflowRun() *WorkflowRun { if w == nil { return nil } return w.WorkflowRun } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (w *WorkflowRuns) GetTotalCount() int { if w == nil || w.TotalCount == nil { return 0 } return *w.TotalCount } // GetBillable returns the Billable field. func (w *WorkflowRunUsage) GetBillable() *WorkflowRunEnvironment { if w == nil { return nil } return w.Billable } // GetRunDurationMS returns the RunDurationMS field if it's non-nil, zero value otherwise. func (w *WorkflowRunUsage) GetRunDurationMS() int64 { if w == nil || w.RunDurationMS == nil { return 0 } return *w.RunDurationMS } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (w *Workflows) GetTotalCount() int { if w == nil || w.TotalCount == nil { return 0 } return *w.TotalCount } // GetBillable returns the Billable field. func (w *WorkflowUsage) GetBillable() *WorkflowEnvironment { if w == nil { return nil } return w.Billable } go-github-38.1.0/github/github-accessors_test.go000066400000000000000000014405671410475703100216300ustar00rootroot00000000000000// Copyright 2017 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. // Code generated by gen-accessors; DO NOT EDIT. package github import ( "encoding/json" "testing" "time" ) func TestAbuseRateLimitError_GetRetryAfter(tt *testing.T) { var zeroValue time.Duration a := &AbuseRateLimitError{RetryAfter: &zeroValue} a.GetRetryAfter() a = &AbuseRateLimitError{} a.GetRetryAfter() a = nil a.GetRetryAfter() } func TestActionsAllowed_GetGithubOwnedAllowed(tt *testing.T) { var zeroValue bool a := &ActionsAllowed{GithubOwnedAllowed: &zeroValue} a.GetGithubOwnedAllowed() a = &ActionsAllowed{} a.GetGithubOwnedAllowed() a = nil a.GetGithubOwnedAllowed() } func TestActionsAllowed_GetVerifiedAllowed(tt *testing.T) { var zeroValue bool a := &ActionsAllowed{VerifiedAllowed: &zeroValue} a.GetVerifiedAllowed() a = &ActionsAllowed{} a.GetVerifiedAllowed() a = nil a.GetVerifiedAllowed() } func TestActionsPermissions_GetAllowedActions(tt *testing.T) { var zeroValue string a := &ActionsPermissions{AllowedActions: &zeroValue} a.GetAllowedActions() a = &ActionsPermissions{} a.GetAllowedActions() a = nil a.GetAllowedActions() } func TestActionsPermissions_GetEnabledRepositories(tt *testing.T) { var zeroValue string a := &ActionsPermissions{EnabledRepositories: &zeroValue} a.GetEnabledRepositories() a = &ActionsPermissions{} a.GetEnabledRepositories() a = nil a.GetEnabledRepositories() } func TestActionsPermissions_GetSelectedActionsURL(tt *testing.T) { var zeroValue string a := &ActionsPermissions{SelectedActionsURL: &zeroValue} a.GetSelectedActionsURL() a = &ActionsPermissions{} a.GetSelectedActionsURL() a = nil a.GetSelectedActionsURL() } func TestAdminEnforcement_GetURL(tt *testing.T) { var zeroValue string a := &AdminEnforcement{URL: &zeroValue} a.GetURL() a = &AdminEnforcement{} a.GetURL() a = nil a.GetURL() } func TestAdminStats_GetComments(tt *testing.T) { a := &AdminStats{} a.GetComments() a = nil a.GetComments() } func TestAdminStats_GetGists(tt *testing.T) { a := &AdminStats{} a.GetGists() a = nil a.GetGists() } func TestAdminStats_GetHooks(tt *testing.T) { a := &AdminStats{} a.GetHooks() a = nil a.GetHooks() } func TestAdminStats_GetIssues(tt *testing.T) { a := &AdminStats{} a.GetIssues() a = nil a.GetIssues() } func TestAdminStats_GetMilestones(tt *testing.T) { a := &AdminStats{} a.GetMilestones() a = nil a.GetMilestones() } func TestAdminStats_GetOrgs(tt *testing.T) { a := &AdminStats{} a.GetOrgs() a = nil a.GetOrgs() } func TestAdminStats_GetPages(tt *testing.T) { a := &AdminStats{} a.GetPages() a = nil a.GetPages() } func TestAdminStats_GetPulls(tt *testing.T) { a := &AdminStats{} a.GetPulls() a = nil a.GetPulls() } func TestAdminStats_GetRepos(tt *testing.T) { a := &AdminStats{} a.GetRepos() a = nil a.GetRepos() } func TestAdminStats_GetUsers(tt *testing.T) { a := &AdminStats{} a.GetUsers() a = nil a.GetUsers() } func TestAlert_GetClosedAt(tt *testing.T) { var zeroValue Timestamp a := &Alert{ClosedAt: &zeroValue} a.GetClosedAt() a = &Alert{} a.GetClosedAt() a = nil a.GetClosedAt() } func TestAlert_GetClosedBy(tt *testing.T) { a := &Alert{} a.GetClosedBy() a = nil a.GetClosedBy() } func TestAlert_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp a := &Alert{CreatedAt: &zeroValue} a.GetCreatedAt() a = &Alert{} a.GetCreatedAt() a = nil a.GetCreatedAt() } func TestAlert_GetDismissedAt(tt *testing.T) { var zeroValue Timestamp a := &Alert{DismissedAt: &zeroValue} a.GetDismissedAt() a = &Alert{} a.GetDismissedAt() a = nil a.GetDismissedAt() } func TestAlert_GetDismissedBy(tt *testing.T) { a := &Alert{} a.GetDismissedBy() a = nil a.GetDismissedBy() } func TestAlert_GetDismissedReason(tt *testing.T) { var zeroValue string a := &Alert{DismissedReason: &zeroValue} a.GetDismissedReason() a = &Alert{} a.GetDismissedReason() a = nil a.GetDismissedReason() } func TestAlert_GetHTMLURL(tt *testing.T) { var zeroValue string a := &Alert{HTMLURL: &zeroValue} a.GetHTMLURL() a = &Alert{} a.GetHTMLURL() a = nil a.GetHTMLURL() } func TestAlert_GetInstancesURL(tt *testing.T) { var zeroValue string a := &Alert{InstancesURL: &zeroValue} a.GetInstancesURL() a = &Alert{} a.GetInstancesURL() a = nil a.GetInstancesURL() } func TestAlert_GetMostRecentInstance(tt *testing.T) { a := &Alert{} a.GetMostRecentInstance() a = nil a.GetMostRecentInstance() } func TestAlert_GetRule(tt *testing.T) { a := &Alert{} a.GetRule() a = nil a.GetRule() } func TestAlert_GetRuleDescription(tt *testing.T) { var zeroValue string a := &Alert{RuleDescription: &zeroValue} a.GetRuleDescription() a = &Alert{} a.GetRuleDescription() a = nil a.GetRuleDescription() } func TestAlert_GetRuleID(tt *testing.T) { var zeroValue string a := &Alert{RuleID: &zeroValue} a.GetRuleID() a = &Alert{} a.GetRuleID() a = nil a.GetRuleID() } func TestAlert_GetRuleSeverity(tt *testing.T) { var zeroValue string a := &Alert{RuleSeverity: &zeroValue} a.GetRuleSeverity() a = &Alert{} a.GetRuleSeverity() a = nil a.GetRuleSeverity() } func TestAlert_GetState(tt *testing.T) { var zeroValue string a := &Alert{State: &zeroValue} a.GetState() a = &Alert{} a.GetState() a = nil a.GetState() } func TestAlert_GetTool(tt *testing.T) { a := &Alert{} a.GetTool() a = nil a.GetTool() } func TestAlert_GetURL(tt *testing.T) { var zeroValue string a := &Alert{URL: &zeroValue} a.GetURL() a = &Alert{} a.GetURL() a = nil a.GetURL() } func TestAPIMeta_GetVerifiablePasswordAuthentication(tt *testing.T) { var zeroValue bool a := &APIMeta{VerifiablePasswordAuthentication: &zeroValue} a.GetVerifiablePasswordAuthentication() a = &APIMeta{} a.GetVerifiablePasswordAuthentication() a = nil a.GetVerifiablePasswordAuthentication() } func TestApp_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp a := &App{CreatedAt: &zeroValue} a.GetCreatedAt() a = &App{} a.GetCreatedAt() a = nil a.GetCreatedAt() } func TestApp_GetDescription(tt *testing.T) { var zeroValue string a := &App{Description: &zeroValue} a.GetDescription() a = &App{} a.GetDescription() a = nil a.GetDescription() } func TestApp_GetExternalURL(tt *testing.T) { var zeroValue string a := &App{ExternalURL: &zeroValue} a.GetExternalURL() a = &App{} a.GetExternalURL() a = nil a.GetExternalURL() } func TestApp_GetHTMLURL(tt *testing.T) { var zeroValue string a := &App{HTMLURL: &zeroValue} a.GetHTMLURL() a = &App{} a.GetHTMLURL() a = nil a.GetHTMLURL() } func TestApp_GetID(tt *testing.T) { var zeroValue int64 a := &App{ID: &zeroValue} a.GetID() a = &App{} a.GetID() a = nil a.GetID() } func TestApp_GetName(tt *testing.T) { var zeroValue string a := &App{Name: &zeroValue} a.GetName() a = &App{} a.GetName() a = nil a.GetName() } func TestApp_GetNodeID(tt *testing.T) { var zeroValue string a := &App{NodeID: &zeroValue} a.GetNodeID() a = &App{} a.GetNodeID() a = nil a.GetNodeID() } func TestApp_GetOwner(tt *testing.T) { a := &App{} a.GetOwner() a = nil a.GetOwner() } func TestApp_GetPermissions(tt *testing.T) { a := &App{} a.GetPermissions() a = nil a.GetPermissions() } func TestApp_GetSlug(tt *testing.T) { var zeroValue string a := &App{Slug: &zeroValue} a.GetSlug() a = &App{} a.GetSlug() a = nil a.GetSlug() } func TestApp_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp a := &App{UpdatedAt: &zeroValue} a.GetUpdatedAt() a = &App{} a.GetUpdatedAt() a = nil a.GetUpdatedAt() } func TestAppConfig_GetClientID(tt *testing.T) { var zeroValue string a := &AppConfig{ClientID: &zeroValue} a.GetClientID() a = &AppConfig{} a.GetClientID() a = nil a.GetClientID() } func TestAppConfig_GetClientSecret(tt *testing.T) { var zeroValue string a := &AppConfig{ClientSecret: &zeroValue} a.GetClientSecret() a = &AppConfig{} a.GetClientSecret() a = nil a.GetClientSecret() } func TestAppConfig_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp a := &AppConfig{CreatedAt: &zeroValue} a.GetCreatedAt() a = &AppConfig{} a.GetCreatedAt() a = nil a.GetCreatedAt() } func TestAppConfig_GetDescription(tt *testing.T) { var zeroValue string a := &AppConfig{Description: &zeroValue} a.GetDescription() a = &AppConfig{} a.GetDescription() a = nil a.GetDescription() } func TestAppConfig_GetExternalURL(tt *testing.T) { var zeroValue string a := &AppConfig{ExternalURL: &zeroValue} a.GetExternalURL() a = &AppConfig{} a.GetExternalURL() a = nil a.GetExternalURL() } func TestAppConfig_GetHTMLURL(tt *testing.T) { var zeroValue string a := &AppConfig{HTMLURL: &zeroValue} a.GetHTMLURL() a = &AppConfig{} a.GetHTMLURL() a = nil a.GetHTMLURL() } func TestAppConfig_GetID(tt *testing.T) { var zeroValue int64 a := &AppConfig{ID: &zeroValue} a.GetID() a = &AppConfig{} a.GetID() a = nil a.GetID() } func TestAppConfig_GetName(tt *testing.T) { var zeroValue string a := &AppConfig{Name: &zeroValue} a.GetName() a = &AppConfig{} a.GetName() a = nil a.GetName() } func TestAppConfig_GetNodeID(tt *testing.T) { var zeroValue string a := &AppConfig{NodeID: &zeroValue} a.GetNodeID() a = &AppConfig{} a.GetNodeID() a = nil a.GetNodeID() } func TestAppConfig_GetOwner(tt *testing.T) { a := &AppConfig{} a.GetOwner() a = nil a.GetOwner() } func TestAppConfig_GetPEM(tt *testing.T) { var zeroValue string a := &AppConfig{PEM: &zeroValue} a.GetPEM() a = &AppConfig{} a.GetPEM() a = nil a.GetPEM() } func TestAppConfig_GetSlug(tt *testing.T) { var zeroValue string a := &AppConfig{Slug: &zeroValue} a.GetSlug() a = &AppConfig{} a.GetSlug() a = nil a.GetSlug() } func TestAppConfig_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp a := &AppConfig{UpdatedAt: &zeroValue} a.GetUpdatedAt() a = &AppConfig{} a.GetUpdatedAt() a = nil a.GetUpdatedAt() } func TestAppConfig_GetWebhookSecret(tt *testing.T) { var zeroValue string a := &AppConfig{WebhookSecret: &zeroValue} a.GetWebhookSecret() a = &AppConfig{} a.GetWebhookSecret() a = nil a.GetWebhookSecret() } func TestArtifact_GetArchiveDownloadURL(tt *testing.T) { var zeroValue string a := &Artifact{ArchiveDownloadURL: &zeroValue} a.GetArchiveDownloadURL() a = &Artifact{} a.GetArchiveDownloadURL() a = nil a.GetArchiveDownloadURL() } func TestArtifact_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp a := &Artifact{CreatedAt: &zeroValue} a.GetCreatedAt() a = &Artifact{} a.GetCreatedAt() a = nil a.GetCreatedAt() } func TestArtifact_GetExpired(tt *testing.T) { var zeroValue bool a := &Artifact{Expired: &zeroValue} a.GetExpired() a = &Artifact{} a.GetExpired() a = nil a.GetExpired() } func TestArtifact_GetExpiresAt(tt *testing.T) { var zeroValue Timestamp a := &Artifact{ExpiresAt: &zeroValue} a.GetExpiresAt() a = &Artifact{} a.GetExpiresAt() a = nil a.GetExpiresAt() } func TestArtifact_GetID(tt *testing.T) { var zeroValue int64 a := &Artifact{ID: &zeroValue} a.GetID() a = &Artifact{} a.GetID() a = nil a.GetID() } func TestArtifact_GetName(tt *testing.T) { var zeroValue string a := &Artifact{Name: &zeroValue} a.GetName() a = &Artifact{} a.GetName() a = nil a.GetName() } func TestArtifact_GetNodeID(tt *testing.T) { var zeroValue string a := &Artifact{NodeID: &zeroValue} a.GetNodeID() a = &Artifact{} a.GetNodeID() a = nil a.GetNodeID() } func TestArtifact_GetSizeInBytes(tt *testing.T) { var zeroValue int64 a := &Artifact{SizeInBytes: &zeroValue} a.GetSizeInBytes() a = &Artifact{} a.GetSizeInBytes() a = nil a.GetSizeInBytes() } func TestArtifactList_GetTotalCount(tt *testing.T) { var zeroValue int64 a := &ArtifactList{TotalCount: &zeroValue} a.GetTotalCount() a = &ArtifactList{} a.GetTotalCount() a = nil a.GetTotalCount() } func TestAttachment_GetBody(tt *testing.T) { var zeroValue string a := &Attachment{Body: &zeroValue} a.GetBody() a = &Attachment{} a.GetBody() a = nil a.GetBody() } func TestAttachment_GetID(tt *testing.T) { var zeroValue int64 a := &Attachment{ID: &zeroValue} a.GetID() a = &Attachment{} a.GetID() a = nil a.GetID() } func TestAttachment_GetTitle(tt *testing.T) { var zeroValue string a := &Attachment{Title: &zeroValue} a.GetTitle() a = &Attachment{} a.GetTitle() a = nil a.GetTitle() } func TestAuditEntry_GetAction(tt *testing.T) { var zeroValue string a := &AuditEntry{Action: &zeroValue} a.GetAction() a = &AuditEntry{} a.GetAction() a = nil a.GetAction() } func TestAuditEntry_GetActive(tt *testing.T) { var zeroValue bool a := &AuditEntry{Active: &zeroValue} a.GetActive() a = &AuditEntry{} a.GetActive() a = nil a.GetActive() } func TestAuditEntry_GetActiveWas(tt *testing.T) { var zeroValue bool a := &AuditEntry{ActiveWas: &zeroValue} a.GetActiveWas() a = &AuditEntry{} a.GetActiveWas() a = nil a.GetActiveWas() } func TestAuditEntry_GetActor(tt *testing.T) { var zeroValue string a := &AuditEntry{Actor: &zeroValue} a.GetActor() a = &AuditEntry{} a.GetActor() a = nil a.GetActor() } func TestAuditEntry_GetBlockedUser(tt *testing.T) { var zeroValue string a := &AuditEntry{BlockedUser: &zeroValue} a.GetBlockedUser() a = &AuditEntry{} a.GetBlockedUser() a = nil a.GetBlockedUser() } func TestAuditEntry_GetBusiness(tt *testing.T) { var zeroValue string a := &AuditEntry{Business: &zeroValue} a.GetBusiness() a = &AuditEntry{} a.GetBusiness() a = nil a.GetBusiness() } func TestAuditEntry_GetCancelledAt(tt *testing.T) { var zeroValue Timestamp a := &AuditEntry{CancelledAt: &zeroValue} a.GetCancelledAt() a = &AuditEntry{} a.GetCancelledAt() a = nil a.GetCancelledAt() } func TestAuditEntry_GetCompletedAt(tt *testing.T) { var zeroValue Timestamp a := &AuditEntry{CompletedAt: &zeroValue} a.GetCompletedAt() a = &AuditEntry{} a.GetCompletedAt() a = nil a.GetCompletedAt() } func TestAuditEntry_GetConclusion(tt *testing.T) { var zeroValue string a := &AuditEntry{Conclusion: &zeroValue} a.GetConclusion() a = &AuditEntry{} a.GetConclusion() a = nil a.GetConclusion() } func TestAuditEntry_GetConfig(tt *testing.T) { a := &AuditEntry{} a.GetConfig() a = nil a.GetConfig() } func TestAuditEntry_GetConfigWas(tt *testing.T) { a := &AuditEntry{} a.GetConfigWas() a = nil a.GetConfigWas() } func TestAuditEntry_GetContentType(tt *testing.T) { var zeroValue string a := &AuditEntry{ContentType: &zeroValue} a.GetContentType() a = &AuditEntry{} a.GetContentType() a = nil a.GetContentType() } func TestAuditEntry_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp a := &AuditEntry{CreatedAt: &zeroValue} a.GetCreatedAt() a = &AuditEntry{} a.GetCreatedAt() a = nil a.GetCreatedAt() } func TestAuditEntry_GetDeployKeyFingerprint(tt *testing.T) { var zeroValue string a := &AuditEntry{DeployKeyFingerprint: &zeroValue} a.GetDeployKeyFingerprint() a = &AuditEntry{} a.GetDeployKeyFingerprint() a = nil a.GetDeployKeyFingerprint() } func TestAuditEntry_GetDocumentID(tt *testing.T) { var zeroValue string a := &AuditEntry{DocumentID: &zeroValue} a.GetDocumentID() a = &AuditEntry{} a.GetDocumentID() a = nil a.GetDocumentID() } func TestAuditEntry_GetEmoji(tt *testing.T) { var zeroValue string a := &AuditEntry{Emoji: &zeroValue} a.GetEmoji() a = &AuditEntry{} a.GetEmoji() a = nil a.GetEmoji() } func TestAuditEntry_GetEnvironmentName(tt *testing.T) { var zeroValue string a := &AuditEntry{EnvironmentName: &zeroValue} a.GetEnvironmentName() a = &AuditEntry{} a.GetEnvironmentName() a = nil a.GetEnvironmentName() } func TestAuditEntry_GetEvent(tt *testing.T) { var zeroValue string a := &AuditEntry{Event: &zeroValue} a.GetEvent() a = &AuditEntry{} a.GetEvent() a = nil a.GetEvent() } func TestAuditEntry_GetExplanation(tt *testing.T) { var zeroValue string a := &AuditEntry{Explanation: &zeroValue} a.GetExplanation() a = &AuditEntry{} a.GetExplanation() a = nil a.GetExplanation() } func TestAuditEntry_GetFingerprint(tt *testing.T) { var zeroValue string a := &AuditEntry{Fingerprint: &zeroValue} a.GetFingerprint() a = &AuditEntry{} a.GetFingerprint() a = nil a.GetFingerprint() } func TestAuditEntry_GetHeadBranch(tt *testing.T) { var zeroValue string a := &AuditEntry{HeadBranch: &zeroValue} a.GetHeadBranch() a = &AuditEntry{} a.GetHeadBranch() a = nil a.GetHeadBranch() } func TestAuditEntry_GetHeadSHA(tt *testing.T) { var zeroValue string a := &AuditEntry{HeadSHA: &zeroValue} a.GetHeadSHA() a = &AuditEntry{} a.GetHeadSHA() a = nil a.GetHeadSHA() } func TestAuditEntry_GetHookID(tt *testing.T) { var zeroValue int64 a := &AuditEntry{HookID: &zeroValue} a.GetHookID() a = &AuditEntry{} a.GetHookID() a = nil a.GetHookID() } func TestAuditEntry_GetIsHostedRunner(tt *testing.T) { var zeroValue bool a := &AuditEntry{IsHostedRunner: &zeroValue} a.GetIsHostedRunner() a = &AuditEntry{} a.GetIsHostedRunner() a = nil a.GetIsHostedRunner() } func TestAuditEntry_GetJobName(tt *testing.T) { var zeroValue string a := &AuditEntry{JobName: &zeroValue} a.GetJobName() a = &AuditEntry{} a.GetJobName() a = nil a.GetJobName() } func TestAuditEntry_GetLimitedAvailability(tt *testing.T) { var zeroValue bool a := &AuditEntry{LimitedAvailability: &zeroValue} a.GetLimitedAvailability() a = &AuditEntry{} a.GetLimitedAvailability() a = nil a.GetLimitedAvailability() } func TestAuditEntry_GetMessage(tt *testing.T) { var zeroValue string a := &AuditEntry{Message: &zeroValue} a.GetMessage() a = &AuditEntry{} a.GetMessage() a = nil a.GetMessage() } func TestAuditEntry_GetName(tt *testing.T) { var zeroValue string a := &AuditEntry{Name: &zeroValue} a.GetName() a = &AuditEntry{} a.GetName() a = nil a.GetName() } func TestAuditEntry_GetOldUser(tt *testing.T) { var zeroValue string a := &AuditEntry{OldUser: &zeroValue} a.GetOldUser() a = &AuditEntry{} a.GetOldUser() a = nil a.GetOldUser() } func TestAuditEntry_GetOpenSSHPublicKey(tt *testing.T) { var zeroValue string a := &AuditEntry{OpenSSHPublicKey: &zeroValue} a.GetOpenSSHPublicKey() a = &AuditEntry{} a.GetOpenSSHPublicKey() a = nil a.GetOpenSSHPublicKey() } func TestAuditEntry_GetOrg(tt *testing.T) { var zeroValue string a := &AuditEntry{Org: &zeroValue} a.GetOrg() a = &AuditEntry{} a.GetOrg() a = nil a.GetOrg() } func TestAuditEntry_GetPreviousVisibility(tt *testing.T) { var zeroValue string a := &AuditEntry{PreviousVisibility: &zeroValue} a.GetPreviousVisibility() a = &AuditEntry{} a.GetPreviousVisibility() a = nil a.GetPreviousVisibility() } func TestAuditEntry_GetReadOnly(tt *testing.T) { var zeroValue string a := &AuditEntry{ReadOnly: &zeroValue} a.GetReadOnly() a = &AuditEntry{} a.GetReadOnly() a = nil a.GetReadOnly() } func TestAuditEntry_GetRepo(tt *testing.T) { var zeroValue string a := &AuditEntry{Repo: &zeroValue} a.GetRepo() a = &AuditEntry{} a.GetRepo() a = nil a.GetRepo() } func TestAuditEntry_GetRepository(tt *testing.T) { var zeroValue string a := &AuditEntry{Repository: &zeroValue} a.GetRepository() a = &AuditEntry{} a.GetRepository() a = nil a.GetRepository() } func TestAuditEntry_GetRepositoryPublic(tt *testing.T) { var zeroValue bool a := &AuditEntry{RepositoryPublic: &zeroValue} a.GetRepositoryPublic() a = &AuditEntry{} a.GetRepositoryPublic() a = nil a.GetRepositoryPublic() } func TestAuditEntry_GetRunnerGroupID(tt *testing.T) { var zeroValue string a := &AuditEntry{RunnerGroupID: &zeroValue} a.GetRunnerGroupID() a = &AuditEntry{} a.GetRunnerGroupID() a = nil a.GetRunnerGroupID() } func TestAuditEntry_GetRunnerGroupName(tt *testing.T) { var zeroValue string a := &AuditEntry{RunnerGroupName: &zeroValue} a.GetRunnerGroupName() a = &AuditEntry{} a.GetRunnerGroupName() a = nil a.GetRunnerGroupName() } func TestAuditEntry_GetRunnerID(tt *testing.T) { var zeroValue string a := &AuditEntry{RunnerID: &zeroValue} a.GetRunnerID() a = &AuditEntry{} a.GetRunnerID() a = nil a.GetRunnerID() } func TestAuditEntry_GetRunnerName(tt *testing.T) { var zeroValue string a := &AuditEntry{RunnerName: &zeroValue} a.GetRunnerName() a = &AuditEntry{} a.GetRunnerName() a = nil a.GetRunnerName() } func TestAuditEntry_GetSourceVersion(tt *testing.T) { var zeroValue string a := &AuditEntry{SourceVersion: &zeroValue} a.GetSourceVersion() a = &AuditEntry{} a.GetSourceVersion() a = nil a.GetSourceVersion() } func TestAuditEntry_GetStartedAt(tt *testing.T) { var zeroValue Timestamp a := &AuditEntry{StartedAt: &zeroValue} a.GetStartedAt() a = &AuditEntry{} a.GetStartedAt() a = nil a.GetStartedAt() } func TestAuditEntry_GetTargetLogin(tt *testing.T) { var zeroValue string a := &AuditEntry{TargetLogin: &zeroValue} a.GetTargetLogin() a = &AuditEntry{} a.GetTargetLogin() a = nil a.GetTargetLogin() } func TestAuditEntry_GetTargetVersion(tt *testing.T) { var zeroValue string a := &AuditEntry{TargetVersion: &zeroValue} a.GetTargetVersion() a = &AuditEntry{} a.GetTargetVersion() a = nil a.GetTargetVersion() } func TestAuditEntry_GetTeam(tt *testing.T) { var zeroValue string a := &AuditEntry{Team: &zeroValue} a.GetTeam() a = &AuditEntry{} a.GetTeam() a = nil a.GetTeam() } func TestAuditEntry_GetTimestamp(tt *testing.T) { var zeroValue Timestamp a := &AuditEntry{Timestamp: &zeroValue} a.GetTimestamp() a = &AuditEntry{} a.GetTimestamp() a = nil a.GetTimestamp() } func TestAuditEntry_GetTransportProtocol(tt *testing.T) { var zeroValue int a := &AuditEntry{TransportProtocol: &zeroValue} a.GetTransportProtocol() a = &AuditEntry{} a.GetTransportProtocol() a = nil a.GetTransportProtocol() } func TestAuditEntry_GetTransportProtocolName(tt *testing.T) { var zeroValue string a := &AuditEntry{TransportProtocolName: &zeroValue} a.GetTransportProtocolName() a = &AuditEntry{} a.GetTransportProtocolName() a = nil a.GetTransportProtocolName() } func TestAuditEntry_GetTriggerID(tt *testing.T) { var zeroValue int64 a := &AuditEntry{TriggerID: &zeroValue} a.GetTriggerID() a = &AuditEntry{} a.GetTriggerID() a = nil a.GetTriggerID() } func TestAuditEntry_GetUser(tt *testing.T) { var zeroValue string a := &AuditEntry{User: &zeroValue} a.GetUser() a = &AuditEntry{} a.GetUser() a = nil a.GetUser() } func TestAuditEntry_GetVisibility(tt *testing.T) { var zeroValue string a := &AuditEntry{Visibility: &zeroValue} a.GetVisibility() a = &AuditEntry{} a.GetVisibility() a = nil a.GetVisibility() } func TestAuditEntry_GetWorkflowID(tt *testing.T) { var zeroValue int64 a := &AuditEntry{WorkflowID: &zeroValue} a.GetWorkflowID() a = &AuditEntry{} a.GetWorkflowID() a = nil a.GetWorkflowID() } func TestAuditEntry_GetWorkflowRunID(tt *testing.T) { var zeroValue int64 a := &AuditEntry{WorkflowRunID: &zeroValue} a.GetWorkflowRunID() a = &AuditEntry{} a.GetWorkflowRunID() a = nil a.GetWorkflowRunID() } func TestAuthorization_GetApp(tt *testing.T) { a := &Authorization{} a.GetApp() a = nil a.GetApp() } func TestAuthorization_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp a := &Authorization{CreatedAt: &zeroValue} a.GetCreatedAt() a = &Authorization{} a.GetCreatedAt() a = nil a.GetCreatedAt() } func TestAuthorization_GetFingerprint(tt *testing.T) { var zeroValue string a := &Authorization{Fingerprint: &zeroValue} a.GetFingerprint() a = &Authorization{} a.GetFingerprint() a = nil a.GetFingerprint() } func TestAuthorization_GetHashedToken(tt *testing.T) { var zeroValue string a := &Authorization{HashedToken: &zeroValue} a.GetHashedToken() a = &Authorization{} a.GetHashedToken() a = nil a.GetHashedToken() } func TestAuthorization_GetID(tt *testing.T) { var zeroValue int64 a := &Authorization{ID: &zeroValue} a.GetID() a = &Authorization{} a.GetID() a = nil a.GetID() } func TestAuthorization_GetNote(tt *testing.T) { var zeroValue string a := &Authorization{Note: &zeroValue} a.GetNote() a = &Authorization{} a.GetNote() a = nil a.GetNote() } func TestAuthorization_GetNoteURL(tt *testing.T) { var zeroValue string a := &Authorization{NoteURL: &zeroValue} a.GetNoteURL() a = &Authorization{} a.GetNoteURL() a = nil a.GetNoteURL() } func TestAuthorization_GetToken(tt *testing.T) { var zeroValue string a := &Authorization{Token: &zeroValue} a.GetToken() a = &Authorization{} a.GetToken() a = nil a.GetToken() } func TestAuthorization_GetTokenLastEight(tt *testing.T) { var zeroValue string a := &Authorization{TokenLastEight: &zeroValue} a.GetTokenLastEight() a = &Authorization{} a.GetTokenLastEight() a = nil a.GetTokenLastEight() } func TestAuthorization_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp a := &Authorization{UpdatedAt: &zeroValue} a.GetUpdatedAt() a = &Authorization{} a.GetUpdatedAt() a = nil a.GetUpdatedAt() } func TestAuthorization_GetURL(tt *testing.T) { var zeroValue string a := &Authorization{URL: &zeroValue} a.GetURL() a = &Authorization{} a.GetURL() a = nil a.GetURL() } func TestAuthorization_GetUser(tt *testing.T) { a := &Authorization{} a.GetUser() a = nil a.GetUser() } func TestAuthorizationApp_GetClientID(tt *testing.T) { var zeroValue string a := &AuthorizationApp{ClientID: &zeroValue} a.GetClientID() a = &AuthorizationApp{} a.GetClientID() a = nil a.GetClientID() } func TestAuthorizationApp_GetName(tt *testing.T) { var zeroValue string a := &AuthorizationApp{Name: &zeroValue} a.GetName() a = &AuthorizationApp{} a.GetName() a = nil a.GetName() } func TestAuthorizationApp_GetURL(tt *testing.T) { var zeroValue string a := &AuthorizationApp{URL: &zeroValue} a.GetURL() a = &AuthorizationApp{} a.GetURL() a = nil a.GetURL() } func TestAuthorizationRequest_GetClientID(tt *testing.T) { var zeroValue string a := &AuthorizationRequest{ClientID: &zeroValue} a.GetClientID() a = &AuthorizationRequest{} a.GetClientID() a = nil a.GetClientID() } func TestAuthorizationRequest_GetClientSecret(tt *testing.T) { var zeroValue string a := &AuthorizationRequest{ClientSecret: &zeroValue} a.GetClientSecret() a = &AuthorizationRequest{} a.GetClientSecret() a = nil a.GetClientSecret() } func TestAuthorizationRequest_GetFingerprint(tt *testing.T) { var zeroValue string a := &AuthorizationRequest{Fingerprint: &zeroValue} a.GetFingerprint() a = &AuthorizationRequest{} a.GetFingerprint() a = nil a.GetFingerprint() } func TestAuthorizationRequest_GetNote(tt *testing.T) { var zeroValue string a := &AuthorizationRequest{Note: &zeroValue} a.GetNote() a = &AuthorizationRequest{} a.GetNote() a = nil a.GetNote() } func TestAuthorizationRequest_GetNoteURL(tt *testing.T) { var zeroValue string a := &AuthorizationRequest{NoteURL: &zeroValue} a.GetNoteURL() a = &AuthorizationRequest{} a.GetNoteURL() a = nil a.GetNoteURL() } func TestAuthorizationUpdateRequest_GetFingerprint(tt *testing.T) { var zeroValue string a := &AuthorizationUpdateRequest{Fingerprint: &zeroValue} a.GetFingerprint() a = &AuthorizationUpdateRequest{} a.GetFingerprint() a = nil a.GetFingerprint() } func TestAuthorizationUpdateRequest_GetNote(tt *testing.T) { var zeroValue string a := &AuthorizationUpdateRequest{Note: &zeroValue} a.GetNote() a = &AuthorizationUpdateRequest{} a.GetNote() a = nil a.GetNote() } func TestAuthorizationUpdateRequest_GetNoteURL(tt *testing.T) { var zeroValue string a := &AuthorizationUpdateRequest{NoteURL: &zeroValue} a.GetNoteURL() a = &AuthorizationUpdateRequest{} a.GetNoteURL() a = nil a.GetNoteURL() } func TestAutoTriggerCheck_GetAppID(tt *testing.T) { var zeroValue int64 a := &AutoTriggerCheck{AppID: &zeroValue} a.GetAppID() a = &AutoTriggerCheck{} a.GetAppID() a = nil a.GetAppID() } func TestAutoTriggerCheck_GetSetting(tt *testing.T) { var zeroValue bool a := &AutoTriggerCheck{Setting: &zeroValue} a.GetSetting() a = &AutoTriggerCheck{} a.GetSetting() a = nil a.GetSetting() } func TestBlob_GetContent(tt *testing.T) { var zeroValue string b := &Blob{Content: &zeroValue} b.GetContent() b = &Blob{} b.GetContent() b = nil b.GetContent() } func TestBlob_GetEncoding(tt *testing.T) { var zeroValue string b := &Blob{Encoding: &zeroValue} b.GetEncoding() b = &Blob{} b.GetEncoding() b = nil b.GetEncoding() } func TestBlob_GetNodeID(tt *testing.T) { var zeroValue string b := &Blob{NodeID: &zeroValue} b.GetNodeID() b = &Blob{} b.GetNodeID() b = nil b.GetNodeID() } func TestBlob_GetSHA(tt *testing.T) { var zeroValue string b := &Blob{SHA: &zeroValue} b.GetSHA() b = &Blob{} b.GetSHA() b = nil b.GetSHA() } func TestBlob_GetSize(tt *testing.T) { var zeroValue int b := &Blob{Size: &zeroValue} b.GetSize() b = &Blob{} b.GetSize() b = nil b.GetSize() } func TestBlob_GetURL(tt *testing.T) { var zeroValue string b := &Blob{URL: &zeroValue} b.GetURL() b = &Blob{} b.GetURL() b = nil b.GetURL() } func TestBranch_GetCommit(tt *testing.T) { b := &Branch{} b.GetCommit() b = nil b.GetCommit() } func TestBranch_GetName(tt *testing.T) { var zeroValue string b := &Branch{Name: &zeroValue} b.GetName() b = &Branch{} b.GetName() b = nil b.GetName() } func TestBranch_GetProtected(tt *testing.T) { var zeroValue bool b := &Branch{Protected: &zeroValue} b.GetProtected() b = &Branch{} b.GetProtected() b = nil b.GetProtected() } func TestBranchCommit_GetCommit(tt *testing.T) { b := &BranchCommit{} b.GetCommit() b = nil b.GetCommit() } func TestBranchCommit_GetName(tt *testing.T) { var zeroValue string b := &BranchCommit{Name: &zeroValue} b.GetName() b = &BranchCommit{} b.GetName() b = nil b.GetName() } func TestBranchCommit_GetProtected(tt *testing.T) { var zeroValue bool b := &BranchCommit{Protected: &zeroValue} b.GetProtected() b = &BranchCommit{} b.GetProtected() b = nil b.GetProtected() } func TestBranchListOptions_GetProtected(tt *testing.T) { var zeroValue bool b := &BranchListOptions{Protected: &zeroValue} b.GetProtected() b = &BranchListOptions{} b.GetProtected() b = nil b.GetProtected() } func TestBranchPolicy_GetCustomBranchPolicies(tt *testing.T) { var zeroValue bool b := &BranchPolicy{CustomBranchPolicies: &zeroValue} b.GetCustomBranchPolicies() b = &BranchPolicy{} b.GetCustomBranchPolicies() b = nil b.GetCustomBranchPolicies() } func TestBranchPolicy_GetProtectedBranches(tt *testing.T) { var zeroValue bool b := &BranchPolicy{ProtectedBranches: &zeroValue} b.GetProtectedBranches() b = &BranchPolicy{} b.GetProtectedBranches() b = nil b.GetProtectedBranches() } func TestCheckRun_GetApp(tt *testing.T) { c := &CheckRun{} c.GetApp() c = nil c.GetApp() } func TestCheckRun_GetCheckSuite(tt *testing.T) { c := &CheckRun{} c.GetCheckSuite() c = nil c.GetCheckSuite() } func TestCheckRun_GetCompletedAt(tt *testing.T) { var zeroValue Timestamp c := &CheckRun{CompletedAt: &zeroValue} c.GetCompletedAt() c = &CheckRun{} c.GetCompletedAt() c = nil c.GetCompletedAt() } func TestCheckRun_GetConclusion(tt *testing.T) { var zeroValue string c := &CheckRun{Conclusion: &zeroValue} c.GetConclusion() c = &CheckRun{} c.GetConclusion() c = nil c.GetConclusion() } func TestCheckRun_GetDetailsURL(tt *testing.T) { var zeroValue string c := &CheckRun{DetailsURL: &zeroValue} c.GetDetailsURL() c = &CheckRun{} c.GetDetailsURL() c = nil c.GetDetailsURL() } func TestCheckRun_GetExternalID(tt *testing.T) { var zeroValue string c := &CheckRun{ExternalID: &zeroValue} c.GetExternalID() c = &CheckRun{} c.GetExternalID() c = nil c.GetExternalID() } func TestCheckRun_GetHeadSHA(tt *testing.T) { var zeroValue string c := &CheckRun{HeadSHA: &zeroValue} c.GetHeadSHA() c = &CheckRun{} c.GetHeadSHA() c = nil c.GetHeadSHA() } func TestCheckRun_GetHTMLURL(tt *testing.T) { var zeroValue string c := &CheckRun{HTMLURL: &zeroValue} c.GetHTMLURL() c = &CheckRun{} c.GetHTMLURL() c = nil c.GetHTMLURL() } func TestCheckRun_GetID(tt *testing.T) { var zeroValue int64 c := &CheckRun{ID: &zeroValue} c.GetID() c = &CheckRun{} c.GetID() c = nil c.GetID() } func TestCheckRun_GetName(tt *testing.T) { var zeroValue string c := &CheckRun{Name: &zeroValue} c.GetName() c = &CheckRun{} c.GetName() c = nil c.GetName() } func TestCheckRun_GetNodeID(tt *testing.T) { var zeroValue string c := &CheckRun{NodeID: &zeroValue} c.GetNodeID() c = &CheckRun{} c.GetNodeID() c = nil c.GetNodeID() } func TestCheckRun_GetOutput(tt *testing.T) { c := &CheckRun{} c.GetOutput() c = nil c.GetOutput() } func TestCheckRun_GetStartedAt(tt *testing.T) { var zeroValue Timestamp c := &CheckRun{StartedAt: &zeroValue} c.GetStartedAt() c = &CheckRun{} c.GetStartedAt() c = nil c.GetStartedAt() } func TestCheckRun_GetStatus(tt *testing.T) { var zeroValue string c := &CheckRun{Status: &zeroValue} c.GetStatus() c = &CheckRun{} c.GetStatus() c = nil c.GetStatus() } func TestCheckRun_GetURL(tt *testing.T) { var zeroValue string c := &CheckRun{URL: &zeroValue} c.GetURL() c = &CheckRun{} c.GetURL() c = nil c.GetURL() } func TestCheckRunAnnotation_GetAnnotationLevel(tt *testing.T) { var zeroValue string c := &CheckRunAnnotation{AnnotationLevel: &zeroValue} c.GetAnnotationLevel() c = &CheckRunAnnotation{} c.GetAnnotationLevel() c = nil c.GetAnnotationLevel() } func TestCheckRunAnnotation_GetEndColumn(tt *testing.T) { var zeroValue int c := &CheckRunAnnotation{EndColumn: &zeroValue} c.GetEndColumn() c = &CheckRunAnnotation{} c.GetEndColumn() c = nil c.GetEndColumn() } func TestCheckRunAnnotation_GetEndLine(tt *testing.T) { var zeroValue int c := &CheckRunAnnotation{EndLine: &zeroValue} c.GetEndLine() c = &CheckRunAnnotation{} c.GetEndLine() c = nil c.GetEndLine() } func TestCheckRunAnnotation_GetMessage(tt *testing.T) { var zeroValue string c := &CheckRunAnnotation{Message: &zeroValue} c.GetMessage() c = &CheckRunAnnotation{} c.GetMessage() c = nil c.GetMessage() } func TestCheckRunAnnotation_GetPath(tt *testing.T) { var zeroValue string c := &CheckRunAnnotation{Path: &zeroValue} c.GetPath() c = &CheckRunAnnotation{} c.GetPath() c = nil c.GetPath() } func TestCheckRunAnnotation_GetRawDetails(tt *testing.T) { var zeroValue string c := &CheckRunAnnotation{RawDetails: &zeroValue} c.GetRawDetails() c = &CheckRunAnnotation{} c.GetRawDetails() c = nil c.GetRawDetails() } func TestCheckRunAnnotation_GetStartColumn(tt *testing.T) { var zeroValue int c := &CheckRunAnnotation{StartColumn: &zeroValue} c.GetStartColumn() c = &CheckRunAnnotation{} c.GetStartColumn() c = nil c.GetStartColumn() } func TestCheckRunAnnotation_GetStartLine(tt *testing.T) { var zeroValue int c := &CheckRunAnnotation{StartLine: &zeroValue} c.GetStartLine() c = &CheckRunAnnotation{} c.GetStartLine() c = nil c.GetStartLine() } func TestCheckRunAnnotation_GetTitle(tt *testing.T) { var zeroValue string c := &CheckRunAnnotation{Title: &zeroValue} c.GetTitle() c = &CheckRunAnnotation{} c.GetTitle() c = nil c.GetTitle() } func TestCheckRunEvent_GetAction(tt *testing.T) { var zeroValue string c := &CheckRunEvent{Action: &zeroValue} c.GetAction() c = &CheckRunEvent{} c.GetAction() c = nil c.GetAction() } func TestCheckRunEvent_GetCheckRun(tt *testing.T) { c := &CheckRunEvent{} c.GetCheckRun() c = nil c.GetCheckRun() } func TestCheckRunEvent_GetInstallation(tt *testing.T) { c := &CheckRunEvent{} c.GetInstallation() c = nil c.GetInstallation() } func TestCheckRunEvent_GetOrg(tt *testing.T) { c := &CheckRunEvent{} c.GetOrg() c = nil c.GetOrg() } func TestCheckRunEvent_GetRepo(tt *testing.T) { c := &CheckRunEvent{} c.GetRepo() c = nil c.GetRepo() } func TestCheckRunEvent_GetRequestedAction(tt *testing.T) { c := &CheckRunEvent{} c.GetRequestedAction() c = nil c.GetRequestedAction() } func TestCheckRunEvent_GetSender(tt *testing.T) { c := &CheckRunEvent{} c.GetSender() c = nil c.GetSender() } func TestCheckRunImage_GetAlt(tt *testing.T) { var zeroValue string c := &CheckRunImage{Alt: &zeroValue} c.GetAlt() c = &CheckRunImage{} c.GetAlt() c = nil c.GetAlt() } func TestCheckRunImage_GetCaption(tt *testing.T) { var zeroValue string c := &CheckRunImage{Caption: &zeroValue} c.GetCaption() c = &CheckRunImage{} c.GetCaption() c = nil c.GetCaption() } func TestCheckRunImage_GetImageURL(tt *testing.T) { var zeroValue string c := &CheckRunImage{ImageURL: &zeroValue} c.GetImageURL() c = &CheckRunImage{} c.GetImageURL() c = nil c.GetImageURL() } func TestCheckRunOutput_GetAnnotationsCount(tt *testing.T) { var zeroValue int c := &CheckRunOutput{AnnotationsCount: &zeroValue} c.GetAnnotationsCount() c = &CheckRunOutput{} c.GetAnnotationsCount() c = nil c.GetAnnotationsCount() } func TestCheckRunOutput_GetAnnotationsURL(tt *testing.T) { var zeroValue string c := &CheckRunOutput{AnnotationsURL: &zeroValue} c.GetAnnotationsURL() c = &CheckRunOutput{} c.GetAnnotationsURL() c = nil c.GetAnnotationsURL() } func TestCheckRunOutput_GetSummary(tt *testing.T) { var zeroValue string c := &CheckRunOutput{Summary: &zeroValue} c.GetSummary() c = &CheckRunOutput{} c.GetSummary() c = nil c.GetSummary() } func TestCheckRunOutput_GetText(tt *testing.T) { var zeroValue string c := &CheckRunOutput{Text: &zeroValue} c.GetText() c = &CheckRunOutput{} c.GetText() c = nil c.GetText() } func TestCheckRunOutput_GetTitle(tt *testing.T) { var zeroValue string c := &CheckRunOutput{Title: &zeroValue} c.GetTitle() c = &CheckRunOutput{} c.GetTitle() c = nil c.GetTitle() } func TestCheckSuite_GetAfterSHA(tt *testing.T) { var zeroValue string c := &CheckSuite{AfterSHA: &zeroValue} c.GetAfterSHA() c = &CheckSuite{} c.GetAfterSHA() c = nil c.GetAfterSHA() } func TestCheckSuite_GetApp(tt *testing.T) { c := &CheckSuite{} c.GetApp() c = nil c.GetApp() } func TestCheckSuite_GetBeforeSHA(tt *testing.T) { var zeroValue string c := &CheckSuite{BeforeSHA: &zeroValue} c.GetBeforeSHA() c = &CheckSuite{} c.GetBeforeSHA() c = nil c.GetBeforeSHA() } func TestCheckSuite_GetConclusion(tt *testing.T) { var zeroValue string c := &CheckSuite{Conclusion: &zeroValue} c.GetConclusion() c = &CheckSuite{} c.GetConclusion() c = nil c.GetConclusion() } func TestCheckSuite_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp c := &CheckSuite{CreatedAt: &zeroValue} c.GetCreatedAt() c = &CheckSuite{} c.GetCreatedAt() c = nil c.GetCreatedAt() } func TestCheckSuite_GetHeadBranch(tt *testing.T) { var zeroValue string c := &CheckSuite{HeadBranch: &zeroValue} c.GetHeadBranch() c = &CheckSuite{} c.GetHeadBranch() c = nil c.GetHeadBranch() } func TestCheckSuite_GetHeadCommit(tt *testing.T) { c := &CheckSuite{} c.GetHeadCommit() c = nil c.GetHeadCommit() } func TestCheckSuite_GetHeadSHA(tt *testing.T) { var zeroValue string c := &CheckSuite{HeadSHA: &zeroValue} c.GetHeadSHA() c = &CheckSuite{} c.GetHeadSHA() c = nil c.GetHeadSHA() } func TestCheckSuite_GetID(tt *testing.T) { var zeroValue int64 c := &CheckSuite{ID: &zeroValue} c.GetID() c = &CheckSuite{} c.GetID() c = nil c.GetID() } func TestCheckSuite_GetNodeID(tt *testing.T) { var zeroValue string c := &CheckSuite{NodeID: &zeroValue} c.GetNodeID() c = &CheckSuite{} c.GetNodeID() c = nil c.GetNodeID() } func TestCheckSuite_GetRepository(tt *testing.T) { c := &CheckSuite{} c.GetRepository() c = nil c.GetRepository() } func TestCheckSuite_GetStatus(tt *testing.T) { var zeroValue string c := &CheckSuite{Status: &zeroValue} c.GetStatus() c = &CheckSuite{} c.GetStatus() c = nil c.GetStatus() } func TestCheckSuite_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp c := &CheckSuite{UpdatedAt: &zeroValue} c.GetUpdatedAt() c = &CheckSuite{} c.GetUpdatedAt() c = nil c.GetUpdatedAt() } func TestCheckSuite_GetURL(tt *testing.T) { var zeroValue string c := &CheckSuite{URL: &zeroValue} c.GetURL() c = &CheckSuite{} c.GetURL() c = nil c.GetURL() } func TestCheckSuiteEvent_GetAction(tt *testing.T) { var zeroValue string c := &CheckSuiteEvent{Action: &zeroValue} c.GetAction() c = &CheckSuiteEvent{} c.GetAction() c = nil c.GetAction() } func TestCheckSuiteEvent_GetCheckSuite(tt *testing.T) { c := &CheckSuiteEvent{} c.GetCheckSuite() c = nil c.GetCheckSuite() } func TestCheckSuiteEvent_GetInstallation(tt *testing.T) { c := &CheckSuiteEvent{} c.GetInstallation() c = nil c.GetInstallation() } func TestCheckSuiteEvent_GetOrg(tt *testing.T) { c := &CheckSuiteEvent{} c.GetOrg() c = nil c.GetOrg() } func TestCheckSuiteEvent_GetRepo(tt *testing.T) { c := &CheckSuiteEvent{} c.GetRepo() c = nil c.GetRepo() } func TestCheckSuiteEvent_GetSender(tt *testing.T) { c := &CheckSuiteEvent{} c.GetSender() c = nil c.GetSender() } func TestCheckSuitePreferenceResults_GetPreferences(tt *testing.T) { c := &CheckSuitePreferenceResults{} c.GetPreferences() c = nil c.GetPreferences() } func TestCheckSuitePreferenceResults_GetRepository(tt *testing.T) { c := &CheckSuitePreferenceResults{} c.GetRepository() c = nil c.GetRepository() } func TestCodeOfConduct_GetBody(tt *testing.T) { var zeroValue string c := &CodeOfConduct{Body: &zeroValue} c.GetBody() c = &CodeOfConduct{} c.GetBody() c = nil c.GetBody() } func TestCodeOfConduct_GetKey(tt *testing.T) { var zeroValue string c := &CodeOfConduct{Key: &zeroValue} c.GetKey() c = &CodeOfConduct{} c.GetKey() c = nil c.GetKey() } func TestCodeOfConduct_GetName(tt *testing.T) { var zeroValue string c := &CodeOfConduct{Name: &zeroValue} c.GetName() c = &CodeOfConduct{} c.GetName() c = nil c.GetName() } func TestCodeOfConduct_GetURL(tt *testing.T) { var zeroValue string c := &CodeOfConduct{URL: &zeroValue} c.GetURL() c = &CodeOfConduct{} c.GetURL() c = nil c.GetURL() } func TestCodeResult_GetHTMLURL(tt *testing.T) { var zeroValue string c := &CodeResult{HTMLURL: &zeroValue} c.GetHTMLURL() c = &CodeResult{} c.GetHTMLURL() c = nil c.GetHTMLURL() } func TestCodeResult_GetName(tt *testing.T) { var zeroValue string c := &CodeResult{Name: &zeroValue} c.GetName() c = &CodeResult{} c.GetName() c = nil c.GetName() } func TestCodeResult_GetPath(tt *testing.T) { var zeroValue string c := &CodeResult{Path: &zeroValue} c.GetPath() c = &CodeResult{} c.GetPath() c = nil c.GetPath() } func TestCodeResult_GetRepository(tt *testing.T) { c := &CodeResult{} c.GetRepository() c = nil c.GetRepository() } func TestCodeResult_GetSHA(tt *testing.T) { var zeroValue string c := &CodeResult{SHA: &zeroValue} c.GetSHA() c = &CodeResult{} c.GetSHA() c = nil c.GetSHA() } func TestCodeSearchResult_GetIncompleteResults(tt *testing.T) { var zeroValue bool c := &CodeSearchResult{IncompleteResults: &zeroValue} c.GetIncompleteResults() c = &CodeSearchResult{} c.GetIncompleteResults() c = nil c.GetIncompleteResults() } func TestCodeSearchResult_GetTotal(tt *testing.T) { var zeroValue int c := &CodeSearchResult{Total: &zeroValue} c.GetTotal() c = &CodeSearchResult{} c.GetTotal() c = nil c.GetTotal() } func TestCollaboratorInvitation_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp c := &CollaboratorInvitation{CreatedAt: &zeroValue} c.GetCreatedAt() c = &CollaboratorInvitation{} c.GetCreatedAt() c = nil c.GetCreatedAt() } func TestCollaboratorInvitation_GetHTMLURL(tt *testing.T) { var zeroValue string c := &CollaboratorInvitation{HTMLURL: &zeroValue} c.GetHTMLURL() c = &CollaboratorInvitation{} c.GetHTMLURL() c = nil c.GetHTMLURL() } func TestCollaboratorInvitation_GetID(tt *testing.T) { var zeroValue int64 c := &CollaboratorInvitation{ID: &zeroValue} c.GetID() c = &CollaboratorInvitation{} c.GetID() c = nil c.GetID() } func TestCollaboratorInvitation_GetInvitee(tt *testing.T) { c := &CollaboratorInvitation{} c.GetInvitee() c = nil c.GetInvitee() } func TestCollaboratorInvitation_GetInviter(tt *testing.T) { c := &CollaboratorInvitation{} c.GetInviter() c = nil c.GetInviter() } func TestCollaboratorInvitation_GetPermissions(tt *testing.T) { var zeroValue string c := &CollaboratorInvitation{Permissions: &zeroValue} c.GetPermissions() c = &CollaboratorInvitation{} c.GetPermissions() c = nil c.GetPermissions() } func TestCollaboratorInvitation_GetRepo(tt *testing.T) { c := &CollaboratorInvitation{} c.GetRepo() c = nil c.GetRepo() } func TestCollaboratorInvitation_GetURL(tt *testing.T) { var zeroValue string c := &CollaboratorInvitation{URL: &zeroValue} c.GetURL() c = &CollaboratorInvitation{} c.GetURL() c = nil c.GetURL() } func TestCombinedStatus_GetCommitURL(tt *testing.T) { var zeroValue string c := &CombinedStatus{CommitURL: &zeroValue} c.GetCommitURL() c = &CombinedStatus{} c.GetCommitURL() c = nil c.GetCommitURL() } func TestCombinedStatus_GetName(tt *testing.T) { var zeroValue string c := &CombinedStatus{Name: &zeroValue} c.GetName() c = &CombinedStatus{} c.GetName() c = nil c.GetName() } func TestCombinedStatus_GetRepositoryURL(tt *testing.T) { var zeroValue string c := &CombinedStatus{RepositoryURL: &zeroValue} c.GetRepositoryURL() c = &CombinedStatus{} c.GetRepositoryURL() c = nil c.GetRepositoryURL() } func TestCombinedStatus_GetSHA(tt *testing.T) { var zeroValue string c := &CombinedStatus{SHA: &zeroValue} c.GetSHA() c = &CombinedStatus{} c.GetSHA() c = nil c.GetSHA() } func TestCombinedStatus_GetState(tt *testing.T) { var zeroValue string c := &CombinedStatus{State: &zeroValue} c.GetState() c = &CombinedStatus{} c.GetState() c = nil c.GetState() } func TestCombinedStatus_GetTotalCount(tt *testing.T) { var zeroValue int c := &CombinedStatus{TotalCount: &zeroValue} c.GetTotalCount() c = &CombinedStatus{} c.GetTotalCount() c = nil c.GetTotalCount() } func TestComment_GetCreatedAt(tt *testing.T) { var zeroValue time.Time c := &Comment{CreatedAt: &zeroValue} c.GetCreatedAt() c = &Comment{} c.GetCreatedAt() c = nil c.GetCreatedAt() } func TestCommentStats_GetTotalCommitComments(tt *testing.T) { var zeroValue int c := &CommentStats{TotalCommitComments: &zeroValue} c.GetTotalCommitComments() c = &CommentStats{} c.GetTotalCommitComments() c = nil c.GetTotalCommitComments() } func TestCommentStats_GetTotalGistComments(tt *testing.T) { var zeroValue int c := &CommentStats{TotalGistComments: &zeroValue} c.GetTotalGistComments() c = &CommentStats{} c.GetTotalGistComments() c = nil c.GetTotalGistComments() } func TestCommentStats_GetTotalIssueComments(tt *testing.T) { var zeroValue int c := &CommentStats{TotalIssueComments: &zeroValue} c.GetTotalIssueComments() c = &CommentStats{} c.GetTotalIssueComments() c = nil c.GetTotalIssueComments() } func TestCommentStats_GetTotalPullRequestComments(tt *testing.T) { var zeroValue int c := &CommentStats{TotalPullRequestComments: &zeroValue} c.GetTotalPullRequestComments() c = &CommentStats{} c.GetTotalPullRequestComments() c = nil c.GetTotalPullRequestComments() } func TestCommit_GetAuthor(tt *testing.T) { c := &Commit{} c.GetAuthor() c = nil c.GetAuthor() } func TestCommit_GetCommentCount(tt *testing.T) { var zeroValue int c := &Commit{CommentCount: &zeroValue} c.GetCommentCount() c = &Commit{} c.GetCommentCount() c = nil c.GetCommentCount() } func TestCommit_GetCommitter(tt *testing.T) { c := &Commit{} c.GetCommitter() c = nil c.GetCommitter() } func TestCommit_GetHTMLURL(tt *testing.T) { var zeroValue string c := &Commit{HTMLURL: &zeroValue} c.GetHTMLURL() c = &Commit{} c.GetHTMLURL() c = nil c.GetHTMLURL() } func TestCommit_GetMessage(tt *testing.T) { var zeroValue string c := &Commit{Message: &zeroValue} c.GetMessage() c = &Commit{} c.GetMessage() c = nil c.GetMessage() } func TestCommit_GetNodeID(tt *testing.T) { var zeroValue string c := &Commit{NodeID: &zeroValue} c.GetNodeID() c = &Commit{} c.GetNodeID() c = nil c.GetNodeID() } func TestCommit_GetSHA(tt *testing.T) { var zeroValue string c := &Commit{SHA: &zeroValue} c.GetSHA() c = &Commit{} c.GetSHA() c = nil c.GetSHA() } func TestCommit_GetStats(tt *testing.T) { c := &Commit{} c.GetStats() c = nil c.GetStats() } func TestCommit_GetTree(tt *testing.T) { c := &Commit{} c.GetTree() c = nil c.GetTree() } func TestCommit_GetURL(tt *testing.T) { var zeroValue string c := &Commit{URL: &zeroValue} c.GetURL() c = &Commit{} c.GetURL() c = nil c.GetURL() } func TestCommit_GetVerification(tt *testing.T) { c := &Commit{} c.GetVerification() c = nil c.GetVerification() } func TestCommitAuthor_GetDate(tt *testing.T) { var zeroValue time.Time c := &CommitAuthor{Date: &zeroValue} c.GetDate() c = &CommitAuthor{} c.GetDate() c = nil c.GetDate() } func TestCommitAuthor_GetEmail(tt *testing.T) { var zeroValue string c := &CommitAuthor{Email: &zeroValue} c.GetEmail() c = &CommitAuthor{} c.GetEmail() c = nil c.GetEmail() } func TestCommitAuthor_GetLogin(tt *testing.T) { var zeroValue string c := &CommitAuthor{Login: &zeroValue} c.GetLogin() c = &CommitAuthor{} c.GetLogin() c = nil c.GetLogin() } func TestCommitAuthor_GetName(tt *testing.T) { var zeroValue string c := &CommitAuthor{Name: &zeroValue} c.GetName() c = &CommitAuthor{} c.GetName() c = nil c.GetName() } func TestCommitCommentEvent_GetAction(tt *testing.T) { var zeroValue string c := &CommitCommentEvent{Action: &zeroValue} c.GetAction() c = &CommitCommentEvent{} c.GetAction() c = nil c.GetAction() } func TestCommitCommentEvent_GetComment(tt *testing.T) { c := &CommitCommentEvent{} c.GetComment() c = nil c.GetComment() } func TestCommitCommentEvent_GetInstallation(tt *testing.T) { c := &CommitCommentEvent{} c.GetInstallation() c = nil c.GetInstallation() } func TestCommitCommentEvent_GetRepo(tt *testing.T) { c := &CommitCommentEvent{} c.GetRepo() c = nil c.GetRepo() } func TestCommitCommentEvent_GetSender(tt *testing.T) { c := &CommitCommentEvent{} c.GetSender() c = nil c.GetSender() } func TestCommitFile_GetAdditions(tt *testing.T) { var zeroValue int c := &CommitFile{Additions: &zeroValue} c.GetAdditions() c = &CommitFile{} c.GetAdditions() c = nil c.GetAdditions() } func TestCommitFile_GetBlobURL(tt *testing.T) { var zeroValue string c := &CommitFile{BlobURL: &zeroValue} c.GetBlobURL() c = &CommitFile{} c.GetBlobURL() c = nil c.GetBlobURL() } func TestCommitFile_GetChanges(tt *testing.T) { var zeroValue int c := &CommitFile{Changes: &zeroValue} c.GetChanges() c = &CommitFile{} c.GetChanges() c = nil c.GetChanges() } func TestCommitFile_GetContentsURL(tt *testing.T) { var zeroValue string c := &CommitFile{ContentsURL: &zeroValue} c.GetContentsURL() c = &CommitFile{} c.GetContentsURL() c = nil c.GetContentsURL() } func TestCommitFile_GetDeletions(tt *testing.T) { var zeroValue int c := &CommitFile{Deletions: &zeroValue} c.GetDeletions() c = &CommitFile{} c.GetDeletions() c = nil c.GetDeletions() } func TestCommitFile_GetFilename(tt *testing.T) { var zeroValue string c := &CommitFile{Filename: &zeroValue} c.GetFilename() c = &CommitFile{} c.GetFilename() c = nil c.GetFilename() } func TestCommitFile_GetPatch(tt *testing.T) { var zeroValue string c := &CommitFile{Patch: &zeroValue} c.GetPatch() c = &CommitFile{} c.GetPatch() c = nil c.GetPatch() } func TestCommitFile_GetPreviousFilename(tt *testing.T) { var zeroValue string c := &CommitFile{PreviousFilename: &zeroValue} c.GetPreviousFilename() c = &CommitFile{} c.GetPreviousFilename() c = nil c.GetPreviousFilename() } func TestCommitFile_GetRawURL(tt *testing.T) { var zeroValue string c := &CommitFile{RawURL: &zeroValue} c.GetRawURL() c = &CommitFile{} c.GetRawURL() c = nil c.GetRawURL() } func TestCommitFile_GetSHA(tt *testing.T) { var zeroValue string c := &CommitFile{SHA: &zeroValue} c.GetSHA() c = &CommitFile{} c.GetSHA() c = nil c.GetSHA() } func TestCommitFile_GetStatus(tt *testing.T) { var zeroValue string c := &CommitFile{Status: &zeroValue} c.GetStatus() c = &CommitFile{} c.GetStatus() c = nil c.GetStatus() } func TestCommitResult_GetAuthor(tt *testing.T) { c := &CommitResult{} c.GetAuthor() c = nil c.GetAuthor() } func TestCommitResult_GetCommentsURL(tt *testing.T) { var zeroValue string c := &CommitResult{CommentsURL: &zeroValue} c.GetCommentsURL() c = &CommitResult{} c.GetCommentsURL() c = nil c.GetCommentsURL() } func TestCommitResult_GetCommit(tt *testing.T) { c := &CommitResult{} c.GetCommit() c = nil c.GetCommit() } func TestCommitResult_GetCommitter(tt *testing.T) { c := &CommitResult{} c.GetCommitter() c = nil c.GetCommitter() } func TestCommitResult_GetHTMLURL(tt *testing.T) { var zeroValue string c := &CommitResult{HTMLURL: &zeroValue} c.GetHTMLURL() c = &CommitResult{} c.GetHTMLURL() c = nil c.GetHTMLURL() } func TestCommitResult_GetRepository(tt *testing.T) { c := &CommitResult{} c.GetRepository() c = nil c.GetRepository() } func TestCommitResult_GetScore(tt *testing.T) { c := &CommitResult{} c.GetScore() c = nil c.GetScore() } func TestCommitResult_GetSHA(tt *testing.T) { var zeroValue string c := &CommitResult{SHA: &zeroValue} c.GetSHA() c = &CommitResult{} c.GetSHA() c = nil c.GetSHA() } func TestCommitResult_GetURL(tt *testing.T) { var zeroValue string c := &CommitResult{URL: &zeroValue} c.GetURL() c = &CommitResult{} c.GetURL() c = nil c.GetURL() } func TestCommitsComparison_GetAheadBy(tt *testing.T) { var zeroValue int c := &CommitsComparison{AheadBy: &zeroValue} c.GetAheadBy() c = &CommitsComparison{} c.GetAheadBy() c = nil c.GetAheadBy() } func TestCommitsComparison_GetBaseCommit(tt *testing.T) { c := &CommitsComparison{} c.GetBaseCommit() c = nil c.GetBaseCommit() } func TestCommitsComparison_GetBehindBy(tt *testing.T) { var zeroValue int c := &CommitsComparison{BehindBy: &zeroValue} c.GetBehindBy() c = &CommitsComparison{} c.GetBehindBy() c = nil c.GetBehindBy() } func TestCommitsComparison_GetDiffURL(tt *testing.T) { var zeroValue string c := &CommitsComparison{DiffURL: &zeroValue} c.GetDiffURL() c = &CommitsComparison{} c.GetDiffURL() c = nil c.GetDiffURL() } func TestCommitsComparison_GetHTMLURL(tt *testing.T) { var zeroValue string c := &CommitsComparison{HTMLURL: &zeroValue} c.GetHTMLURL() c = &CommitsComparison{} c.GetHTMLURL() c = nil c.GetHTMLURL() } func TestCommitsComparison_GetMergeBaseCommit(tt *testing.T) { c := &CommitsComparison{} c.GetMergeBaseCommit() c = nil c.GetMergeBaseCommit() } func TestCommitsComparison_GetPatchURL(tt *testing.T) { var zeroValue string c := &CommitsComparison{PatchURL: &zeroValue} c.GetPatchURL() c = &CommitsComparison{} c.GetPatchURL() c = nil c.GetPatchURL() } func TestCommitsComparison_GetPermalinkURL(tt *testing.T) { var zeroValue string c := &CommitsComparison{PermalinkURL: &zeroValue} c.GetPermalinkURL() c = &CommitsComparison{} c.GetPermalinkURL() c = nil c.GetPermalinkURL() } func TestCommitsComparison_GetStatus(tt *testing.T) { var zeroValue string c := &CommitsComparison{Status: &zeroValue} c.GetStatus() c = &CommitsComparison{} c.GetStatus() c = nil c.GetStatus() } func TestCommitsComparison_GetTotalCommits(tt *testing.T) { var zeroValue int c := &CommitsComparison{TotalCommits: &zeroValue} c.GetTotalCommits() c = &CommitsComparison{} c.GetTotalCommits() c = nil c.GetTotalCommits() } func TestCommitsComparison_GetURL(tt *testing.T) { var zeroValue string c := &CommitsComparison{URL: &zeroValue} c.GetURL() c = &CommitsComparison{} c.GetURL() c = nil c.GetURL() } func TestCommitsSearchResult_GetIncompleteResults(tt *testing.T) { var zeroValue bool c := &CommitsSearchResult{IncompleteResults: &zeroValue} c.GetIncompleteResults() c = &CommitsSearchResult{} c.GetIncompleteResults() c = nil c.GetIncompleteResults() } func TestCommitsSearchResult_GetTotal(tt *testing.T) { var zeroValue int c := &CommitsSearchResult{Total: &zeroValue} c.GetTotal() c = &CommitsSearchResult{} c.GetTotal() c = nil c.GetTotal() } func TestCommitStats_GetAdditions(tt *testing.T) { var zeroValue int c := &CommitStats{Additions: &zeroValue} c.GetAdditions() c = &CommitStats{} c.GetAdditions() c = nil c.GetAdditions() } func TestCommitStats_GetDeletions(tt *testing.T) { var zeroValue int c := &CommitStats{Deletions: &zeroValue} c.GetDeletions() c = &CommitStats{} c.GetDeletions() c = nil c.GetDeletions() } func TestCommitStats_GetTotal(tt *testing.T) { var zeroValue int c := &CommitStats{Total: &zeroValue} c.GetTotal() c = &CommitStats{} c.GetTotal() c = nil c.GetTotal() } func TestCommunityHealthFiles_GetCodeOfConduct(tt *testing.T) { c := &CommunityHealthFiles{} c.GetCodeOfConduct() c = nil c.GetCodeOfConduct() } func TestCommunityHealthFiles_GetContributing(tt *testing.T) { c := &CommunityHealthFiles{} c.GetContributing() c = nil c.GetContributing() } func TestCommunityHealthFiles_GetIssueTemplate(tt *testing.T) { c := &CommunityHealthFiles{} c.GetIssueTemplate() c = nil c.GetIssueTemplate() } func TestCommunityHealthFiles_GetLicense(tt *testing.T) { c := &CommunityHealthFiles{} c.GetLicense() c = nil c.GetLicense() } func TestCommunityHealthFiles_GetPullRequestTemplate(tt *testing.T) { c := &CommunityHealthFiles{} c.GetPullRequestTemplate() c = nil c.GetPullRequestTemplate() } func TestCommunityHealthFiles_GetReadme(tt *testing.T) { c := &CommunityHealthFiles{} c.GetReadme() c = nil c.GetReadme() } func TestCommunityHealthMetrics_GetFiles(tt *testing.T) { c := &CommunityHealthMetrics{} c.GetFiles() c = nil c.GetFiles() } func TestCommunityHealthMetrics_GetHealthPercentage(tt *testing.T) { var zeroValue int c := &CommunityHealthMetrics{HealthPercentage: &zeroValue} c.GetHealthPercentage() c = &CommunityHealthMetrics{} c.GetHealthPercentage() c = nil c.GetHealthPercentage() } func TestCommunityHealthMetrics_GetUpdatedAt(tt *testing.T) { var zeroValue time.Time c := &CommunityHealthMetrics{UpdatedAt: &zeroValue} c.GetUpdatedAt() c = &CommunityHealthMetrics{} c.GetUpdatedAt() c = nil c.GetUpdatedAt() } func TestContentReference_GetID(tt *testing.T) { var zeroValue int64 c := &ContentReference{ID: &zeroValue} c.GetID() c = &ContentReference{} c.GetID() c = nil c.GetID() } func TestContentReference_GetNodeID(tt *testing.T) { var zeroValue string c := &ContentReference{NodeID: &zeroValue} c.GetNodeID() c = &ContentReference{} c.GetNodeID() c = nil c.GetNodeID() } func TestContentReference_GetReference(tt *testing.T) { var zeroValue string c := &ContentReference{Reference: &zeroValue} c.GetReference() c = &ContentReference{} c.GetReference() c = nil c.GetReference() } func TestContentReferenceEvent_GetAction(tt *testing.T) { var zeroValue string c := &ContentReferenceEvent{Action: &zeroValue} c.GetAction() c = &ContentReferenceEvent{} c.GetAction() c = nil c.GetAction() } func TestContentReferenceEvent_GetContentReference(tt *testing.T) { c := &ContentReferenceEvent{} c.GetContentReference() c = nil c.GetContentReference() } func TestContentReferenceEvent_GetInstallation(tt *testing.T) { c := &ContentReferenceEvent{} c.GetInstallation() c = nil c.GetInstallation() } func TestContentReferenceEvent_GetRepo(tt *testing.T) { c := &ContentReferenceEvent{} c.GetRepo() c = nil c.GetRepo() } func TestContentReferenceEvent_GetSender(tt *testing.T) { c := &ContentReferenceEvent{} c.GetSender() c = nil c.GetSender() } func TestContributor_GetAvatarURL(tt *testing.T) { var zeroValue string c := &Contributor{AvatarURL: &zeroValue} c.GetAvatarURL() c = &Contributor{} c.GetAvatarURL() c = nil c.GetAvatarURL() } func TestContributor_GetContributions(tt *testing.T) { var zeroValue int c := &Contributor{Contributions: &zeroValue} c.GetContributions() c = &Contributor{} c.GetContributions() c = nil c.GetContributions() } func TestContributor_GetEmail(tt *testing.T) { var zeroValue string c := &Contributor{Email: &zeroValue} c.GetEmail() c = &Contributor{} c.GetEmail() c = nil c.GetEmail() } func TestContributor_GetEventsURL(tt *testing.T) { var zeroValue string c := &Contributor{EventsURL: &zeroValue} c.GetEventsURL() c = &Contributor{} c.GetEventsURL() c = nil c.GetEventsURL() } func TestContributor_GetFollowersURL(tt *testing.T) { var zeroValue string c := &Contributor{FollowersURL: &zeroValue} c.GetFollowersURL() c = &Contributor{} c.GetFollowersURL() c = nil c.GetFollowersURL() } func TestContributor_GetFollowingURL(tt *testing.T) { var zeroValue string c := &Contributor{FollowingURL: &zeroValue} c.GetFollowingURL() c = &Contributor{} c.GetFollowingURL() c = nil c.GetFollowingURL() } func TestContributor_GetGistsURL(tt *testing.T) { var zeroValue string c := &Contributor{GistsURL: &zeroValue} c.GetGistsURL() c = &Contributor{} c.GetGistsURL() c = nil c.GetGistsURL() } func TestContributor_GetGravatarID(tt *testing.T) { var zeroValue string c := &Contributor{GravatarID: &zeroValue} c.GetGravatarID() c = &Contributor{} c.GetGravatarID() c = nil c.GetGravatarID() } func TestContributor_GetHTMLURL(tt *testing.T) { var zeroValue string c := &Contributor{HTMLURL: &zeroValue} c.GetHTMLURL() c = &Contributor{} c.GetHTMLURL() c = nil c.GetHTMLURL() } func TestContributor_GetID(tt *testing.T) { var zeroValue int64 c := &Contributor{ID: &zeroValue} c.GetID() c = &Contributor{} c.GetID() c = nil c.GetID() } func TestContributor_GetLogin(tt *testing.T) { var zeroValue string c := &Contributor{Login: &zeroValue} c.GetLogin() c = &Contributor{} c.GetLogin() c = nil c.GetLogin() } func TestContributor_GetName(tt *testing.T) { var zeroValue string c := &Contributor{Name: &zeroValue} c.GetName() c = &Contributor{} c.GetName() c = nil c.GetName() } func TestContributor_GetNodeID(tt *testing.T) { var zeroValue string c := &Contributor{NodeID: &zeroValue} c.GetNodeID() c = &Contributor{} c.GetNodeID() c = nil c.GetNodeID() } func TestContributor_GetOrganizationsURL(tt *testing.T) { var zeroValue string c := &Contributor{OrganizationsURL: &zeroValue} c.GetOrganizationsURL() c = &Contributor{} c.GetOrganizationsURL() c = nil c.GetOrganizationsURL() } func TestContributor_GetReceivedEventsURL(tt *testing.T) { var zeroValue string c := &Contributor{ReceivedEventsURL: &zeroValue} c.GetReceivedEventsURL() c = &Contributor{} c.GetReceivedEventsURL() c = nil c.GetReceivedEventsURL() } func TestContributor_GetReposURL(tt *testing.T) { var zeroValue string c := &Contributor{ReposURL: &zeroValue} c.GetReposURL() c = &Contributor{} c.GetReposURL() c = nil c.GetReposURL() } func TestContributor_GetSiteAdmin(tt *testing.T) { var zeroValue bool c := &Contributor{SiteAdmin: &zeroValue} c.GetSiteAdmin() c = &Contributor{} c.GetSiteAdmin() c = nil c.GetSiteAdmin() } func TestContributor_GetStarredURL(tt *testing.T) { var zeroValue string c := &Contributor{StarredURL: &zeroValue} c.GetStarredURL() c = &Contributor{} c.GetStarredURL() c = nil c.GetStarredURL() } func TestContributor_GetSubscriptionsURL(tt *testing.T) { var zeroValue string c := &Contributor{SubscriptionsURL: &zeroValue} c.GetSubscriptionsURL() c = &Contributor{} c.GetSubscriptionsURL() c = nil c.GetSubscriptionsURL() } func TestContributor_GetType(tt *testing.T) { var zeroValue string c := &Contributor{Type: &zeroValue} c.GetType() c = &Contributor{} c.GetType() c = nil c.GetType() } func TestContributor_GetURL(tt *testing.T) { var zeroValue string c := &Contributor{URL: &zeroValue} c.GetURL() c = &Contributor{} c.GetURL() c = nil c.GetURL() } func TestContributorStats_GetAuthor(tt *testing.T) { c := &ContributorStats{} c.GetAuthor() c = nil c.GetAuthor() } func TestContributorStats_GetTotal(tt *testing.T) { var zeroValue int c := &ContributorStats{Total: &zeroValue} c.GetTotal() c = &ContributorStats{} c.GetTotal() c = nil c.GetTotal() } func TestCreateCheckRunOptions_GetCompletedAt(tt *testing.T) { var zeroValue Timestamp c := &CreateCheckRunOptions{CompletedAt: &zeroValue} c.GetCompletedAt() c = &CreateCheckRunOptions{} c.GetCompletedAt() c = nil c.GetCompletedAt() } func TestCreateCheckRunOptions_GetConclusion(tt *testing.T) { var zeroValue string c := &CreateCheckRunOptions{Conclusion: &zeroValue} c.GetConclusion() c = &CreateCheckRunOptions{} c.GetConclusion() c = nil c.GetConclusion() } func TestCreateCheckRunOptions_GetDetailsURL(tt *testing.T) { var zeroValue string c := &CreateCheckRunOptions{DetailsURL: &zeroValue} c.GetDetailsURL() c = &CreateCheckRunOptions{} c.GetDetailsURL() c = nil c.GetDetailsURL() } func TestCreateCheckRunOptions_GetExternalID(tt *testing.T) { var zeroValue string c := &CreateCheckRunOptions{ExternalID: &zeroValue} c.GetExternalID() c = &CreateCheckRunOptions{} c.GetExternalID() c = nil c.GetExternalID() } func TestCreateCheckRunOptions_GetOutput(tt *testing.T) { c := &CreateCheckRunOptions{} c.GetOutput() c = nil c.GetOutput() } func TestCreateCheckRunOptions_GetStartedAt(tt *testing.T) { var zeroValue Timestamp c := &CreateCheckRunOptions{StartedAt: &zeroValue} c.GetStartedAt() c = &CreateCheckRunOptions{} c.GetStartedAt() c = nil c.GetStartedAt() } func TestCreateCheckRunOptions_GetStatus(tt *testing.T) { var zeroValue string c := &CreateCheckRunOptions{Status: &zeroValue} c.GetStatus() c = &CreateCheckRunOptions{} c.GetStatus() c = nil c.GetStatus() } func TestCreateCheckSuiteOptions_GetHeadBranch(tt *testing.T) { var zeroValue string c := &CreateCheckSuiteOptions{HeadBranch: &zeroValue} c.GetHeadBranch() c = &CreateCheckSuiteOptions{} c.GetHeadBranch() c = nil c.GetHeadBranch() } func TestCreateEvent_GetDescription(tt *testing.T) { var zeroValue string c := &CreateEvent{Description: &zeroValue} c.GetDescription() c = &CreateEvent{} c.GetDescription() c = nil c.GetDescription() } func TestCreateEvent_GetInstallation(tt *testing.T) { c := &CreateEvent{} c.GetInstallation() c = nil c.GetInstallation() } func TestCreateEvent_GetMasterBranch(tt *testing.T) { var zeroValue string c := &CreateEvent{MasterBranch: &zeroValue} c.GetMasterBranch() c = &CreateEvent{} c.GetMasterBranch() c = nil c.GetMasterBranch() } func TestCreateEvent_GetPusherType(tt *testing.T) { var zeroValue string c := &CreateEvent{PusherType: &zeroValue} c.GetPusherType() c = &CreateEvent{} c.GetPusherType() c = nil c.GetPusherType() } func TestCreateEvent_GetRef(tt *testing.T) { var zeroValue string c := &CreateEvent{Ref: &zeroValue} c.GetRef() c = &CreateEvent{} c.GetRef() c = nil c.GetRef() } func TestCreateEvent_GetRefType(tt *testing.T) { var zeroValue string c := &CreateEvent{RefType: &zeroValue} c.GetRefType() c = &CreateEvent{} c.GetRefType() c = nil c.GetRefType() } func TestCreateEvent_GetRepo(tt *testing.T) { c := &CreateEvent{} c.GetRepo() c = nil c.GetRepo() } func TestCreateEvent_GetSender(tt *testing.T) { c := &CreateEvent{} c.GetSender() c = nil c.GetSender() } func TestCreateOrgInvitationOptions_GetEmail(tt *testing.T) { var zeroValue string c := &CreateOrgInvitationOptions{Email: &zeroValue} c.GetEmail() c = &CreateOrgInvitationOptions{} c.GetEmail() c = nil c.GetEmail() } func TestCreateOrgInvitationOptions_GetInviteeID(tt *testing.T) { var zeroValue int64 c := &CreateOrgInvitationOptions{InviteeID: &zeroValue} c.GetInviteeID() c = &CreateOrgInvitationOptions{} c.GetInviteeID() c = nil c.GetInviteeID() } func TestCreateOrgInvitationOptions_GetRole(tt *testing.T) { var zeroValue string c := &CreateOrgInvitationOptions{Role: &zeroValue} c.GetRole() c = &CreateOrgInvitationOptions{} c.GetRole() c = nil c.GetRole() } func TestCreateRunnerGroupRequest_GetAllowsPublicRepositories(tt *testing.T) { var zeroValue bool c := &CreateRunnerGroupRequest{AllowsPublicRepositories: &zeroValue} c.GetAllowsPublicRepositories() c = &CreateRunnerGroupRequest{} c.GetAllowsPublicRepositories() c = nil c.GetAllowsPublicRepositories() } func TestCreateRunnerGroupRequest_GetName(tt *testing.T) { var zeroValue string c := &CreateRunnerGroupRequest{Name: &zeroValue} c.GetName() c = &CreateRunnerGroupRequest{} c.GetName() c = nil c.GetName() } func TestCreateRunnerGroupRequest_GetVisibility(tt *testing.T) { var zeroValue string c := &CreateRunnerGroupRequest{Visibility: &zeroValue} c.GetVisibility() c = &CreateRunnerGroupRequest{} c.GetVisibility() c = nil c.GetVisibility() } func TestCreateUpdateEnvironment_GetDeploymentBranchPolicy(tt *testing.T) { c := &CreateUpdateEnvironment{} c.GetDeploymentBranchPolicy() c = nil c.GetDeploymentBranchPolicy() } func TestCreateUpdateEnvironment_GetWaitTimer(tt *testing.T) { var zeroValue int c := &CreateUpdateEnvironment{WaitTimer: &zeroValue} c.GetWaitTimer() c = &CreateUpdateEnvironment{} c.GetWaitTimer() c = nil c.GetWaitTimer() } func TestCreateUserProjectOptions_GetBody(tt *testing.T) { var zeroValue string c := &CreateUserProjectOptions{Body: &zeroValue} c.GetBody() c = &CreateUserProjectOptions{} c.GetBody() c = nil c.GetBody() } func TestDeleteEvent_GetInstallation(tt *testing.T) { d := &DeleteEvent{} d.GetInstallation() d = nil d.GetInstallation() } func TestDeleteEvent_GetPusherType(tt *testing.T) { var zeroValue string d := &DeleteEvent{PusherType: &zeroValue} d.GetPusherType() d = &DeleteEvent{} d.GetPusherType() d = nil d.GetPusherType() } func TestDeleteEvent_GetRef(tt *testing.T) { var zeroValue string d := &DeleteEvent{Ref: &zeroValue} d.GetRef() d = &DeleteEvent{} d.GetRef() d = nil d.GetRef() } func TestDeleteEvent_GetRefType(tt *testing.T) { var zeroValue string d := &DeleteEvent{RefType: &zeroValue} d.GetRefType() d = &DeleteEvent{} d.GetRefType() d = nil d.GetRefType() } func TestDeleteEvent_GetRepo(tt *testing.T) { d := &DeleteEvent{} d.GetRepo() d = nil d.GetRepo() } func TestDeleteEvent_GetSender(tt *testing.T) { d := &DeleteEvent{} d.GetSender() d = nil d.GetSender() } func TestDeployKeyEvent_GetAction(tt *testing.T) { var zeroValue string d := &DeployKeyEvent{Action: &zeroValue} d.GetAction() d = &DeployKeyEvent{} d.GetAction() d = nil d.GetAction() } func TestDeployKeyEvent_GetKey(tt *testing.T) { d := &DeployKeyEvent{} d.GetKey() d = nil d.GetKey() } func TestDeployment_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp d := &Deployment{CreatedAt: &zeroValue} d.GetCreatedAt() d = &Deployment{} d.GetCreatedAt() d = nil d.GetCreatedAt() } func TestDeployment_GetCreator(tt *testing.T) { d := &Deployment{} d.GetCreator() d = nil d.GetCreator() } func TestDeployment_GetDescription(tt *testing.T) { var zeroValue string d := &Deployment{Description: &zeroValue} d.GetDescription() d = &Deployment{} d.GetDescription() d = nil d.GetDescription() } func TestDeployment_GetEnvironment(tt *testing.T) { var zeroValue string d := &Deployment{Environment: &zeroValue} d.GetEnvironment() d = &Deployment{} d.GetEnvironment() d = nil d.GetEnvironment() } func TestDeployment_GetID(tt *testing.T) { var zeroValue int64 d := &Deployment{ID: &zeroValue} d.GetID() d = &Deployment{} d.GetID() d = nil d.GetID() } func TestDeployment_GetNodeID(tt *testing.T) { var zeroValue string d := &Deployment{NodeID: &zeroValue} d.GetNodeID() d = &Deployment{} d.GetNodeID() d = nil d.GetNodeID() } func TestDeployment_GetRef(tt *testing.T) { var zeroValue string d := &Deployment{Ref: &zeroValue} d.GetRef() d = &Deployment{} d.GetRef() d = nil d.GetRef() } func TestDeployment_GetRepositoryURL(tt *testing.T) { var zeroValue string d := &Deployment{RepositoryURL: &zeroValue} d.GetRepositoryURL() d = &Deployment{} d.GetRepositoryURL() d = nil d.GetRepositoryURL() } func TestDeployment_GetSHA(tt *testing.T) { var zeroValue string d := &Deployment{SHA: &zeroValue} d.GetSHA() d = &Deployment{} d.GetSHA() d = nil d.GetSHA() } func TestDeployment_GetStatusesURL(tt *testing.T) { var zeroValue string d := &Deployment{StatusesURL: &zeroValue} d.GetStatusesURL() d = &Deployment{} d.GetStatusesURL() d = nil d.GetStatusesURL() } func TestDeployment_GetTask(tt *testing.T) { var zeroValue string d := &Deployment{Task: &zeroValue} d.GetTask() d = &Deployment{} d.GetTask() d = nil d.GetTask() } func TestDeployment_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp d := &Deployment{UpdatedAt: &zeroValue} d.GetUpdatedAt() d = &Deployment{} d.GetUpdatedAt() d = nil d.GetUpdatedAt() } func TestDeployment_GetURL(tt *testing.T) { var zeroValue string d := &Deployment{URL: &zeroValue} d.GetURL() d = &Deployment{} d.GetURL() d = nil d.GetURL() } func TestDeploymentEvent_GetDeployment(tt *testing.T) { d := &DeploymentEvent{} d.GetDeployment() d = nil d.GetDeployment() } func TestDeploymentEvent_GetInstallation(tt *testing.T) { d := &DeploymentEvent{} d.GetInstallation() d = nil d.GetInstallation() } func TestDeploymentEvent_GetRepo(tt *testing.T) { d := &DeploymentEvent{} d.GetRepo() d = nil d.GetRepo() } func TestDeploymentEvent_GetSender(tt *testing.T) { d := &DeploymentEvent{} d.GetSender() d = nil d.GetSender() } func TestDeploymentRequest_GetAutoMerge(tt *testing.T) { var zeroValue bool d := &DeploymentRequest{AutoMerge: &zeroValue} d.GetAutoMerge() d = &DeploymentRequest{} d.GetAutoMerge() d = nil d.GetAutoMerge() } func TestDeploymentRequest_GetDescription(tt *testing.T) { var zeroValue string d := &DeploymentRequest{Description: &zeroValue} d.GetDescription() d = &DeploymentRequest{} d.GetDescription() d = nil d.GetDescription() } func TestDeploymentRequest_GetEnvironment(tt *testing.T) { var zeroValue string d := &DeploymentRequest{Environment: &zeroValue} d.GetEnvironment() d = &DeploymentRequest{} d.GetEnvironment() d = nil d.GetEnvironment() } func TestDeploymentRequest_GetProductionEnvironment(tt *testing.T) { var zeroValue bool d := &DeploymentRequest{ProductionEnvironment: &zeroValue} d.GetProductionEnvironment() d = &DeploymentRequest{} d.GetProductionEnvironment() d = nil d.GetProductionEnvironment() } func TestDeploymentRequest_GetRef(tt *testing.T) { var zeroValue string d := &DeploymentRequest{Ref: &zeroValue} d.GetRef() d = &DeploymentRequest{} d.GetRef() d = nil d.GetRef() } func TestDeploymentRequest_GetRequiredContexts(tt *testing.T) { var zeroValue []string d := &DeploymentRequest{RequiredContexts: &zeroValue} d.GetRequiredContexts() d = &DeploymentRequest{} d.GetRequiredContexts() d = nil d.GetRequiredContexts() } func TestDeploymentRequest_GetTask(tt *testing.T) { var zeroValue string d := &DeploymentRequest{Task: &zeroValue} d.GetTask() d = &DeploymentRequest{} d.GetTask() d = nil d.GetTask() } func TestDeploymentRequest_GetTransientEnvironment(tt *testing.T) { var zeroValue bool d := &DeploymentRequest{TransientEnvironment: &zeroValue} d.GetTransientEnvironment() d = &DeploymentRequest{} d.GetTransientEnvironment() d = nil d.GetTransientEnvironment() } func TestDeploymentStatus_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp d := &DeploymentStatus{CreatedAt: &zeroValue} d.GetCreatedAt() d = &DeploymentStatus{} d.GetCreatedAt() d = nil d.GetCreatedAt() } func TestDeploymentStatus_GetCreator(tt *testing.T) { d := &DeploymentStatus{} d.GetCreator() d = nil d.GetCreator() } func TestDeploymentStatus_GetDeploymentURL(tt *testing.T) { var zeroValue string d := &DeploymentStatus{DeploymentURL: &zeroValue} d.GetDeploymentURL() d = &DeploymentStatus{} d.GetDeploymentURL() d = nil d.GetDeploymentURL() } func TestDeploymentStatus_GetDescription(tt *testing.T) { var zeroValue string d := &DeploymentStatus{Description: &zeroValue} d.GetDescription() d = &DeploymentStatus{} d.GetDescription() d = nil d.GetDescription() } func TestDeploymentStatus_GetEnvironment(tt *testing.T) { var zeroValue string d := &DeploymentStatus{Environment: &zeroValue} d.GetEnvironment() d = &DeploymentStatus{} d.GetEnvironment() d = nil d.GetEnvironment() } func TestDeploymentStatus_GetEnvironmentURL(tt *testing.T) { var zeroValue string d := &DeploymentStatus{EnvironmentURL: &zeroValue} d.GetEnvironmentURL() d = &DeploymentStatus{} d.GetEnvironmentURL() d = nil d.GetEnvironmentURL() } func TestDeploymentStatus_GetID(tt *testing.T) { var zeroValue int64 d := &DeploymentStatus{ID: &zeroValue} d.GetID() d = &DeploymentStatus{} d.GetID() d = nil d.GetID() } func TestDeploymentStatus_GetLogURL(tt *testing.T) { var zeroValue string d := &DeploymentStatus{LogURL: &zeroValue} d.GetLogURL() d = &DeploymentStatus{} d.GetLogURL() d = nil d.GetLogURL() } func TestDeploymentStatus_GetNodeID(tt *testing.T) { var zeroValue string d := &DeploymentStatus{NodeID: &zeroValue} d.GetNodeID() d = &DeploymentStatus{} d.GetNodeID() d = nil d.GetNodeID() } func TestDeploymentStatus_GetRepositoryURL(tt *testing.T) { var zeroValue string d := &DeploymentStatus{RepositoryURL: &zeroValue} d.GetRepositoryURL() d = &DeploymentStatus{} d.GetRepositoryURL() d = nil d.GetRepositoryURL() } func TestDeploymentStatus_GetState(tt *testing.T) { var zeroValue string d := &DeploymentStatus{State: &zeroValue} d.GetState() d = &DeploymentStatus{} d.GetState() d = nil d.GetState() } func TestDeploymentStatus_GetTargetURL(tt *testing.T) { var zeroValue string d := &DeploymentStatus{TargetURL: &zeroValue} d.GetTargetURL() d = &DeploymentStatus{} d.GetTargetURL() d = nil d.GetTargetURL() } func TestDeploymentStatus_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp d := &DeploymentStatus{UpdatedAt: &zeroValue} d.GetUpdatedAt() d = &DeploymentStatus{} d.GetUpdatedAt() d = nil d.GetUpdatedAt() } func TestDeploymentStatus_GetURL(tt *testing.T) { var zeroValue string d := &DeploymentStatus{URL: &zeroValue} d.GetURL() d = &DeploymentStatus{} d.GetURL() d = nil d.GetURL() } func TestDeploymentStatusEvent_GetDeployment(tt *testing.T) { d := &DeploymentStatusEvent{} d.GetDeployment() d = nil d.GetDeployment() } func TestDeploymentStatusEvent_GetDeploymentStatus(tt *testing.T) { d := &DeploymentStatusEvent{} d.GetDeploymentStatus() d = nil d.GetDeploymentStatus() } func TestDeploymentStatusEvent_GetInstallation(tt *testing.T) { d := &DeploymentStatusEvent{} d.GetInstallation() d = nil d.GetInstallation() } func TestDeploymentStatusEvent_GetRepo(tt *testing.T) { d := &DeploymentStatusEvent{} d.GetRepo() d = nil d.GetRepo() } func TestDeploymentStatusEvent_GetSender(tt *testing.T) { d := &DeploymentStatusEvent{} d.GetSender() d = nil d.GetSender() } func TestDeploymentStatusRequest_GetAutoInactive(tt *testing.T) { var zeroValue bool d := &DeploymentStatusRequest{AutoInactive: &zeroValue} d.GetAutoInactive() d = &DeploymentStatusRequest{} d.GetAutoInactive() d = nil d.GetAutoInactive() } func TestDeploymentStatusRequest_GetDescription(tt *testing.T) { var zeroValue string d := &DeploymentStatusRequest{Description: &zeroValue} d.GetDescription() d = &DeploymentStatusRequest{} d.GetDescription() d = nil d.GetDescription() } func TestDeploymentStatusRequest_GetEnvironment(tt *testing.T) { var zeroValue string d := &DeploymentStatusRequest{Environment: &zeroValue} d.GetEnvironment() d = &DeploymentStatusRequest{} d.GetEnvironment() d = nil d.GetEnvironment() } func TestDeploymentStatusRequest_GetEnvironmentURL(tt *testing.T) { var zeroValue string d := &DeploymentStatusRequest{EnvironmentURL: &zeroValue} d.GetEnvironmentURL() d = &DeploymentStatusRequest{} d.GetEnvironmentURL() d = nil d.GetEnvironmentURL() } func TestDeploymentStatusRequest_GetLogURL(tt *testing.T) { var zeroValue string d := &DeploymentStatusRequest{LogURL: &zeroValue} d.GetLogURL() d = &DeploymentStatusRequest{} d.GetLogURL() d = nil d.GetLogURL() } func TestDeploymentStatusRequest_GetState(tt *testing.T) { var zeroValue string d := &DeploymentStatusRequest{State: &zeroValue} d.GetState() d = &DeploymentStatusRequest{} d.GetState() d = nil d.GetState() } func TestDiscussionComment_GetAuthor(tt *testing.T) { d := &DiscussionComment{} d.GetAuthor() d = nil d.GetAuthor() } func TestDiscussionComment_GetBody(tt *testing.T) { var zeroValue string d := &DiscussionComment{Body: &zeroValue} d.GetBody() d = &DiscussionComment{} d.GetBody() d = nil d.GetBody() } func TestDiscussionComment_GetBodyHTML(tt *testing.T) { var zeroValue string d := &DiscussionComment{BodyHTML: &zeroValue} d.GetBodyHTML() d = &DiscussionComment{} d.GetBodyHTML() d = nil d.GetBodyHTML() } func TestDiscussionComment_GetBodyVersion(tt *testing.T) { var zeroValue string d := &DiscussionComment{BodyVersion: &zeroValue} d.GetBodyVersion() d = &DiscussionComment{} d.GetBodyVersion() d = nil d.GetBodyVersion() } func TestDiscussionComment_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp d := &DiscussionComment{CreatedAt: &zeroValue} d.GetCreatedAt() d = &DiscussionComment{} d.GetCreatedAt() d = nil d.GetCreatedAt() } func TestDiscussionComment_GetDiscussionURL(tt *testing.T) { var zeroValue string d := &DiscussionComment{DiscussionURL: &zeroValue} d.GetDiscussionURL() d = &DiscussionComment{} d.GetDiscussionURL() d = nil d.GetDiscussionURL() } func TestDiscussionComment_GetHTMLURL(tt *testing.T) { var zeroValue string d := &DiscussionComment{HTMLURL: &zeroValue} d.GetHTMLURL() d = &DiscussionComment{} d.GetHTMLURL() d = nil d.GetHTMLURL() } func TestDiscussionComment_GetLastEditedAt(tt *testing.T) { var zeroValue Timestamp d := &DiscussionComment{LastEditedAt: &zeroValue} d.GetLastEditedAt() d = &DiscussionComment{} d.GetLastEditedAt() d = nil d.GetLastEditedAt() } func TestDiscussionComment_GetNodeID(tt *testing.T) { var zeroValue string d := &DiscussionComment{NodeID: &zeroValue} d.GetNodeID() d = &DiscussionComment{} d.GetNodeID() d = nil d.GetNodeID() } func TestDiscussionComment_GetNumber(tt *testing.T) { var zeroValue int d := &DiscussionComment{Number: &zeroValue} d.GetNumber() d = &DiscussionComment{} d.GetNumber() d = nil d.GetNumber() } func TestDiscussionComment_GetReactions(tt *testing.T) { d := &DiscussionComment{} d.GetReactions() d = nil d.GetReactions() } func TestDiscussionComment_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp d := &DiscussionComment{UpdatedAt: &zeroValue} d.GetUpdatedAt() d = &DiscussionComment{} d.GetUpdatedAt() d = nil d.GetUpdatedAt() } func TestDiscussionComment_GetURL(tt *testing.T) { var zeroValue string d := &DiscussionComment{URL: &zeroValue} d.GetURL() d = &DiscussionComment{} d.GetURL() d = nil d.GetURL() } func TestDismissalRestrictionsRequest_GetTeams(tt *testing.T) { var zeroValue []string d := &DismissalRestrictionsRequest{Teams: &zeroValue} d.GetTeams() d = &DismissalRestrictionsRequest{} d.GetTeams() d = nil d.GetTeams() } func TestDismissalRestrictionsRequest_GetUsers(tt *testing.T) { var zeroValue []string d := &DismissalRestrictionsRequest{Users: &zeroValue} d.GetUsers() d = &DismissalRestrictionsRequest{} d.GetUsers() d = nil d.GetUsers() } func TestDismissedReview_GetDismissalCommitID(tt *testing.T) { var zeroValue string d := &DismissedReview{DismissalCommitID: &zeroValue} d.GetDismissalCommitID() d = &DismissedReview{} d.GetDismissalCommitID() d = nil d.GetDismissalCommitID() } func TestDismissedReview_GetDismissalMessage(tt *testing.T) { var zeroValue string d := &DismissedReview{DismissalMessage: &zeroValue} d.GetDismissalMessage() d = &DismissedReview{} d.GetDismissalMessage() d = nil d.GetDismissalMessage() } func TestDismissedReview_GetReviewID(tt *testing.T) { var zeroValue int64 d := &DismissedReview{ReviewID: &zeroValue} d.GetReviewID() d = &DismissedReview{} d.GetReviewID() d = nil d.GetReviewID() } func TestDismissedReview_GetState(tt *testing.T) { var zeroValue string d := &DismissedReview{State: &zeroValue} d.GetState() d = &DismissedReview{} d.GetState() d = nil d.GetState() } func TestDispatchRequestOptions_GetClientPayload(tt *testing.T) { var zeroValue json.RawMessage d := &DispatchRequestOptions{ClientPayload: &zeroValue} d.GetClientPayload() d = &DispatchRequestOptions{} d.GetClientPayload() d = nil d.GetClientPayload() } func TestDraftReviewComment_GetBody(tt *testing.T) { var zeroValue string d := &DraftReviewComment{Body: &zeroValue} d.GetBody() d = &DraftReviewComment{} d.GetBody() d = nil d.GetBody() } func TestDraftReviewComment_GetLine(tt *testing.T) { var zeroValue int d := &DraftReviewComment{Line: &zeroValue} d.GetLine() d = &DraftReviewComment{} d.GetLine() d = nil d.GetLine() } func TestDraftReviewComment_GetPath(tt *testing.T) { var zeroValue string d := &DraftReviewComment{Path: &zeroValue} d.GetPath() d = &DraftReviewComment{} d.GetPath() d = nil d.GetPath() } func TestDraftReviewComment_GetPosition(tt *testing.T) { var zeroValue int d := &DraftReviewComment{Position: &zeroValue} d.GetPosition() d = &DraftReviewComment{} d.GetPosition() d = nil d.GetPosition() } func TestDraftReviewComment_GetSide(tt *testing.T) { var zeroValue string d := &DraftReviewComment{Side: &zeroValue} d.GetSide() d = &DraftReviewComment{} d.GetSide() d = nil d.GetSide() } func TestDraftReviewComment_GetStartLine(tt *testing.T) { var zeroValue int d := &DraftReviewComment{StartLine: &zeroValue} d.GetStartLine() d = &DraftReviewComment{} d.GetStartLine() d = nil d.GetStartLine() } func TestDraftReviewComment_GetStartSide(tt *testing.T) { var zeroValue string d := &DraftReviewComment{StartSide: &zeroValue} d.GetStartSide() d = &DraftReviewComment{} d.GetStartSide() d = nil d.GetStartSide() } func TestEditBase_GetRef(tt *testing.T) { e := &EditBase{} e.GetRef() e = nil e.GetRef() } func TestEditBase_GetSHA(tt *testing.T) { e := &EditBase{} e.GetSHA() e = nil e.GetSHA() } func TestEditBody_GetFrom(tt *testing.T) { var zeroValue string e := &EditBody{From: &zeroValue} e.GetFrom() e = &EditBody{} e.GetFrom() e = nil e.GetFrom() } func TestEditChange_GetBase(tt *testing.T) { e := &EditChange{} e.GetBase() e = nil e.GetBase() } func TestEditChange_GetBody(tt *testing.T) { e := &EditChange{} e.GetBody() e = nil e.GetBody() } func TestEditChange_GetTitle(tt *testing.T) { e := &EditChange{} e.GetTitle() e = nil e.GetTitle() } func TestEditRef_GetFrom(tt *testing.T) { var zeroValue string e := &EditRef{From: &zeroValue} e.GetFrom() e = &EditRef{} e.GetFrom() e = nil e.GetFrom() } func TestEditSHA_GetFrom(tt *testing.T) { var zeroValue string e := &EditSHA{From: &zeroValue} e.GetFrom() e = &EditSHA{} e.GetFrom() e = nil e.GetFrom() } func TestEditTitle_GetFrom(tt *testing.T) { var zeroValue string e := &EditTitle{From: &zeroValue} e.GetFrom() e = &EditTitle{} e.GetFrom() e = nil e.GetFrom() } func TestEnterprise_GetAvatarURL(tt *testing.T) { var zeroValue string e := &Enterprise{AvatarURL: &zeroValue} e.GetAvatarURL() e = &Enterprise{} e.GetAvatarURL() e = nil e.GetAvatarURL() } func TestEnterprise_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp e := &Enterprise{CreatedAt: &zeroValue} e.GetCreatedAt() e = &Enterprise{} e.GetCreatedAt() e = nil e.GetCreatedAt() } func TestEnterprise_GetDescription(tt *testing.T) { var zeroValue string e := &Enterprise{Description: &zeroValue} e.GetDescription() e = &Enterprise{} e.GetDescription() e = nil e.GetDescription() } func TestEnterprise_GetHTMLURL(tt *testing.T) { var zeroValue string e := &Enterprise{HTMLURL: &zeroValue} e.GetHTMLURL() e = &Enterprise{} e.GetHTMLURL() e = nil e.GetHTMLURL() } func TestEnterprise_GetID(tt *testing.T) { var zeroValue int e := &Enterprise{ID: &zeroValue} e.GetID() e = &Enterprise{} e.GetID() e = nil e.GetID() } func TestEnterprise_GetName(tt *testing.T) { var zeroValue string e := &Enterprise{Name: &zeroValue} e.GetName() e = &Enterprise{} e.GetName() e = nil e.GetName() } func TestEnterprise_GetNodeID(tt *testing.T) { var zeroValue string e := &Enterprise{NodeID: &zeroValue} e.GetNodeID() e = &Enterprise{} e.GetNodeID() e = nil e.GetNodeID() } func TestEnterprise_GetSlug(tt *testing.T) { var zeroValue string e := &Enterprise{Slug: &zeroValue} e.GetSlug() e = &Enterprise{} e.GetSlug() e = nil e.GetSlug() } func TestEnterprise_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp e := &Enterprise{UpdatedAt: &zeroValue} e.GetUpdatedAt() e = &Enterprise{} e.GetUpdatedAt() e = nil e.GetUpdatedAt() } func TestEnterprise_GetWebsiteURL(tt *testing.T) { var zeroValue string e := &Enterprise{WebsiteURL: &zeroValue} e.GetWebsiteURL() e = &Enterprise{} e.GetWebsiteURL() e = nil e.GetWebsiteURL() } func TestEnvironment_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp e := &Environment{CreatedAt: &zeroValue} e.GetCreatedAt() e = &Environment{} e.GetCreatedAt() e = nil e.GetCreatedAt() } func TestEnvironment_GetDeploymentBranchPolicy(tt *testing.T) { e := &Environment{} e.GetDeploymentBranchPolicy() e = nil e.GetDeploymentBranchPolicy() } func TestEnvironment_GetEnvironmentName(tt *testing.T) { var zeroValue string e := &Environment{EnvironmentName: &zeroValue} e.GetEnvironmentName() e = &Environment{} e.GetEnvironmentName() e = nil e.GetEnvironmentName() } func TestEnvironment_GetHTMLURL(tt *testing.T) { var zeroValue string e := &Environment{HTMLURL: &zeroValue} e.GetHTMLURL() e = &Environment{} e.GetHTMLURL() e = nil e.GetHTMLURL() } func TestEnvironment_GetID(tt *testing.T) { var zeroValue int64 e := &Environment{ID: &zeroValue} e.GetID() e = &Environment{} e.GetID() e = nil e.GetID() } func TestEnvironment_GetName(tt *testing.T) { var zeroValue string e := &Environment{Name: &zeroValue} e.GetName() e = &Environment{} e.GetName() e = nil e.GetName() } func TestEnvironment_GetNodeID(tt *testing.T) { var zeroValue string e := &Environment{NodeID: &zeroValue} e.GetNodeID() e = &Environment{} e.GetNodeID() e = nil e.GetNodeID() } func TestEnvironment_GetOwner(tt *testing.T) { var zeroValue string e := &Environment{Owner: &zeroValue} e.GetOwner() e = &Environment{} e.GetOwner() e = nil e.GetOwner() } func TestEnvironment_GetRepo(tt *testing.T) { var zeroValue string e := &Environment{Repo: &zeroValue} e.GetRepo() e = &Environment{} e.GetRepo() e = nil e.GetRepo() } func TestEnvironment_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp e := &Environment{UpdatedAt: &zeroValue} e.GetUpdatedAt() e = &Environment{} e.GetUpdatedAt() e = nil e.GetUpdatedAt() } func TestEnvironment_GetURL(tt *testing.T) { var zeroValue string e := &Environment{URL: &zeroValue} e.GetURL() e = &Environment{} e.GetURL() e = nil e.GetURL() } func TestEnvironment_GetWaitTimer(tt *testing.T) { var zeroValue int e := &Environment{WaitTimer: &zeroValue} e.GetWaitTimer() e = &Environment{} e.GetWaitTimer() e = nil e.GetWaitTimer() } func TestEnvResponse_GetTotalCount(tt *testing.T) { var zeroValue int e := &EnvResponse{TotalCount: &zeroValue} e.GetTotalCount() e = &EnvResponse{} e.GetTotalCount() e = nil e.GetTotalCount() } func TestEnvReviewers_GetID(tt *testing.T) { var zeroValue int64 e := &EnvReviewers{ID: &zeroValue} e.GetID() e = &EnvReviewers{} e.GetID() e = nil e.GetID() } func TestEnvReviewers_GetType(tt *testing.T) { var zeroValue string e := &EnvReviewers{Type: &zeroValue} e.GetType() e = &EnvReviewers{} e.GetType() e = nil e.GetType() } func TestErrorBlock_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp e := &ErrorBlock{CreatedAt: &zeroValue} e.GetCreatedAt() e = &ErrorBlock{} e.GetCreatedAt() e = nil e.GetCreatedAt() } func TestErrorResponse_GetBlock(tt *testing.T) { e := &ErrorResponse{} e.GetBlock() e = nil e.GetBlock() } func TestEvent_GetActor(tt *testing.T) { e := &Event{} e.GetActor() e = nil e.GetActor() } func TestEvent_GetCreatedAt(tt *testing.T) { var zeroValue time.Time e := &Event{CreatedAt: &zeroValue} e.GetCreatedAt() e = &Event{} e.GetCreatedAt() e = nil e.GetCreatedAt() } func TestEvent_GetID(tt *testing.T) { var zeroValue string e := &Event{ID: &zeroValue} e.GetID() e = &Event{} e.GetID() e = nil e.GetID() } func TestEvent_GetOrg(tt *testing.T) { e := &Event{} e.GetOrg() e = nil e.GetOrg() } func TestEvent_GetPublic(tt *testing.T) { var zeroValue bool e := &Event{Public: &zeroValue} e.GetPublic() e = &Event{} e.GetPublic() e = nil e.GetPublic() } func TestEvent_GetRawPayload(tt *testing.T) { var zeroValue json.RawMessage e := &Event{RawPayload: &zeroValue} e.GetRawPayload() e = &Event{} e.GetRawPayload() e = nil e.GetRawPayload() } func TestEvent_GetRepo(tt *testing.T) { e := &Event{} e.GetRepo() e = nil e.GetRepo() } func TestEvent_GetType(tt *testing.T) { var zeroValue string e := &Event{Type: &zeroValue} e.GetType() e = &Event{} e.GetType() e = nil e.GetType() } func TestFeedLink_GetHRef(tt *testing.T) { var zeroValue string f := &FeedLink{HRef: &zeroValue} f.GetHRef() f = &FeedLink{} f.GetHRef() f = nil f.GetHRef() } func TestFeedLink_GetType(tt *testing.T) { var zeroValue string f := &FeedLink{Type: &zeroValue} f.GetType() f = &FeedLink{} f.GetType() f = nil f.GetType() } func TestFeedLinks_GetCurrentUser(tt *testing.T) { f := &FeedLinks{} f.GetCurrentUser() f = nil f.GetCurrentUser() } func TestFeedLinks_GetCurrentUserActor(tt *testing.T) { f := &FeedLinks{} f.GetCurrentUserActor() f = nil f.GetCurrentUserActor() } func TestFeedLinks_GetCurrentUserOrganization(tt *testing.T) { f := &FeedLinks{} f.GetCurrentUserOrganization() f = nil f.GetCurrentUserOrganization() } func TestFeedLinks_GetCurrentUserPublic(tt *testing.T) { f := &FeedLinks{} f.GetCurrentUserPublic() f = nil f.GetCurrentUserPublic() } func TestFeedLinks_GetTimeline(tt *testing.T) { f := &FeedLinks{} f.GetTimeline() f = nil f.GetTimeline() } func TestFeedLinks_GetUser(tt *testing.T) { f := &FeedLinks{} f.GetUser() f = nil f.GetUser() } func TestFeeds_GetCurrentUserActorURL(tt *testing.T) { var zeroValue string f := &Feeds{CurrentUserActorURL: &zeroValue} f.GetCurrentUserActorURL() f = &Feeds{} f.GetCurrentUserActorURL() f = nil f.GetCurrentUserActorURL() } func TestFeeds_GetCurrentUserOrganizationURL(tt *testing.T) { var zeroValue string f := &Feeds{CurrentUserOrganizationURL: &zeroValue} f.GetCurrentUserOrganizationURL() f = &Feeds{} f.GetCurrentUserOrganizationURL() f = nil f.GetCurrentUserOrganizationURL() } func TestFeeds_GetCurrentUserPublicURL(tt *testing.T) { var zeroValue string f := &Feeds{CurrentUserPublicURL: &zeroValue} f.GetCurrentUserPublicURL() f = &Feeds{} f.GetCurrentUserPublicURL() f = nil f.GetCurrentUserPublicURL() } func TestFeeds_GetCurrentUserURL(tt *testing.T) { var zeroValue string f := &Feeds{CurrentUserURL: &zeroValue} f.GetCurrentUserURL() f = &Feeds{} f.GetCurrentUserURL() f = nil f.GetCurrentUserURL() } func TestFeeds_GetLinks(tt *testing.T) { f := &Feeds{} f.GetLinks() f = nil f.GetLinks() } func TestFeeds_GetTimelineURL(tt *testing.T) { var zeroValue string f := &Feeds{TimelineURL: &zeroValue} f.GetTimelineURL() f = &Feeds{} f.GetTimelineURL() f = nil f.GetTimelineURL() } func TestFeeds_GetUserURL(tt *testing.T) { var zeroValue string f := &Feeds{UserURL: &zeroValue} f.GetUserURL() f = &Feeds{} f.GetUserURL() f = nil f.GetUserURL() } func TestForkEvent_GetForkee(tt *testing.T) { f := &ForkEvent{} f.GetForkee() f = nil f.GetForkee() } func TestForkEvent_GetInstallation(tt *testing.T) { f := &ForkEvent{} f.GetInstallation() f = nil f.GetInstallation() } func TestForkEvent_GetRepo(tt *testing.T) { f := &ForkEvent{} f.GetRepo() f = nil f.GetRepo() } func TestForkEvent_GetSender(tt *testing.T) { f := &ForkEvent{} f.GetSender() f = nil f.GetSender() } func TestGetAuditLogOptions_GetInclude(tt *testing.T) { var zeroValue string g := &GetAuditLogOptions{Include: &zeroValue} g.GetInclude() g = &GetAuditLogOptions{} g.GetInclude() g = nil g.GetInclude() } func TestGetAuditLogOptions_GetOrder(tt *testing.T) { var zeroValue string g := &GetAuditLogOptions{Order: &zeroValue} g.GetOrder() g = &GetAuditLogOptions{} g.GetOrder() g = nil g.GetOrder() } func TestGetAuditLogOptions_GetPhrase(tt *testing.T) { var zeroValue string g := &GetAuditLogOptions{Phrase: &zeroValue} g.GetPhrase() g = &GetAuditLogOptions{} g.GetPhrase() g = nil g.GetPhrase() } func TestGist_GetComments(tt *testing.T) { var zeroValue int g := &Gist{Comments: &zeroValue} g.GetComments() g = &Gist{} g.GetComments() g = nil g.GetComments() } func TestGist_GetCreatedAt(tt *testing.T) { var zeroValue time.Time g := &Gist{CreatedAt: &zeroValue} g.GetCreatedAt() g = &Gist{} g.GetCreatedAt() g = nil g.GetCreatedAt() } func TestGist_GetDescription(tt *testing.T) { var zeroValue string g := &Gist{Description: &zeroValue} g.GetDescription() g = &Gist{} g.GetDescription() g = nil g.GetDescription() } func TestGist_GetFiles(tt *testing.T) { zeroValue := map[GistFilename]GistFile{} g := &Gist{Files: zeroValue} g.GetFiles() g = &Gist{} g.GetFiles() g = nil g.GetFiles() } func TestGist_GetGitPullURL(tt *testing.T) { var zeroValue string g := &Gist{GitPullURL: &zeroValue} g.GetGitPullURL() g = &Gist{} g.GetGitPullURL() g = nil g.GetGitPullURL() } func TestGist_GetGitPushURL(tt *testing.T) { var zeroValue string g := &Gist{GitPushURL: &zeroValue} g.GetGitPushURL() g = &Gist{} g.GetGitPushURL() g = nil g.GetGitPushURL() } func TestGist_GetHTMLURL(tt *testing.T) { var zeroValue string g := &Gist{HTMLURL: &zeroValue} g.GetHTMLURL() g = &Gist{} g.GetHTMLURL() g = nil g.GetHTMLURL() } func TestGist_GetID(tt *testing.T) { var zeroValue string g := &Gist{ID: &zeroValue} g.GetID() g = &Gist{} g.GetID() g = nil g.GetID() } func TestGist_GetNodeID(tt *testing.T) { var zeroValue string g := &Gist{NodeID: &zeroValue} g.GetNodeID() g = &Gist{} g.GetNodeID() g = nil g.GetNodeID() } func TestGist_GetOwner(tt *testing.T) { g := &Gist{} g.GetOwner() g = nil g.GetOwner() } func TestGist_GetPublic(tt *testing.T) { var zeroValue bool g := &Gist{Public: &zeroValue} g.GetPublic() g = &Gist{} g.GetPublic() g = nil g.GetPublic() } func TestGist_GetUpdatedAt(tt *testing.T) { var zeroValue time.Time g := &Gist{UpdatedAt: &zeroValue} g.GetUpdatedAt() g = &Gist{} g.GetUpdatedAt() g = nil g.GetUpdatedAt() } func TestGistComment_GetBody(tt *testing.T) { var zeroValue string g := &GistComment{Body: &zeroValue} g.GetBody() g = &GistComment{} g.GetBody() g = nil g.GetBody() } func TestGistComment_GetCreatedAt(tt *testing.T) { var zeroValue time.Time g := &GistComment{CreatedAt: &zeroValue} g.GetCreatedAt() g = &GistComment{} g.GetCreatedAt() g = nil g.GetCreatedAt() } func TestGistComment_GetID(tt *testing.T) { var zeroValue int64 g := &GistComment{ID: &zeroValue} g.GetID() g = &GistComment{} g.GetID() g = nil g.GetID() } func TestGistComment_GetURL(tt *testing.T) { var zeroValue string g := &GistComment{URL: &zeroValue} g.GetURL() g = &GistComment{} g.GetURL() g = nil g.GetURL() } func TestGistComment_GetUser(tt *testing.T) { g := &GistComment{} g.GetUser() g = nil g.GetUser() } func TestGistCommit_GetChangeStatus(tt *testing.T) { g := &GistCommit{} g.GetChangeStatus() g = nil g.GetChangeStatus() } func TestGistCommit_GetCommittedAt(tt *testing.T) { var zeroValue Timestamp g := &GistCommit{CommittedAt: &zeroValue} g.GetCommittedAt() g = &GistCommit{} g.GetCommittedAt() g = nil g.GetCommittedAt() } func TestGistCommit_GetNodeID(tt *testing.T) { var zeroValue string g := &GistCommit{NodeID: &zeroValue} g.GetNodeID() g = &GistCommit{} g.GetNodeID() g = nil g.GetNodeID() } func TestGistCommit_GetURL(tt *testing.T) { var zeroValue string g := &GistCommit{URL: &zeroValue} g.GetURL() g = &GistCommit{} g.GetURL() g = nil g.GetURL() } func TestGistCommit_GetUser(tt *testing.T) { g := &GistCommit{} g.GetUser() g = nil g.GetUser() } func TestGistCommit_GetVersion(tt *testing.T) { var zeroValue string g := &GistCommit{Version: &zeroValue} g.GetVersion() g = &GistCommit{} g.GetVersion() g = nil g.GetVersion() } func TestGistFile_GetContent(tt *testing.T) { var zeroValue string g := &GistFile{Content: &zeroValue} g.GetContent() g = &GistFile{} g.GetContent() g = nil g.GetContent() } func TestGistFile_GetFilename(tt *testing.T) { var zeroValue string g := &GistFile{Filename: &zeroValue} g.GetFilename() g = &GistFile{} g.GetFilename() g = nil g.GetFilename() } func TestGistFile_GetLanguage(tt *testing.T) { var zeroValue string g := &GistFile{Language: &zeroValue} g.GetLanguage() g = &GistFile{} g.GetLanguage() g = nil g.GetLanguage() } func TestGistFile_GetRawURL(tt *testing.T) { var zeroValue string g := &GistFile{RawURL: &zeroValue} g.GetRawURL() g = &GistFile{} g.GetRawURL() g = nil g.GetRawURL() } func TestGistFile_GetSize(tt *testing.T) { var zeroValue int g := &GistFile{Size: &zeroValue} g.GetSize() g = &GistFile{} g.GetSize() g = nil g.GetSize() } func TestGistFile_GetType(tt *testing.T) { var zeroValue string g := &GistFile{Type: &zeroValue} g.GetType() g = &GistFile{} g.GetType() g = nil g.GetType() } func TestGistFork_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp g := &GistFork{CreatedAt: &zeroValue} g.GetCreatedAt() g = &GistFork{} g.GetCreatedAt() g = nil g.GetCreatedAt() } func TestGistFork_GetID(tt *testing.T) { var zeroValue string g := &GistFork{ID: &zeroValue} g.GetID() g = &GistFork{} g.GetID() g = nil g.GetID() } func TestGistFork_GetNodeID(tt *testing.T) { var zeroValue string g := &GistFork{NodeID: &zeroValue} g.GetNodeID() g = &GistFork{} g.GetNodeID() g = nil g.GetNodeID() } func TestGistFork_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp g := &GistFork{UpdatedAt: &zeroValue} g.GetUpdatedAt() g = &GistFork{} g.GetUpdatedAt() g = nil g.GetUpdatedAt() } func TestGistFork_GetURL(tt *testing.T) { var zeroValue string g := &GistFork{URL: &zeroValue} g.GetURL() g = &GistFork{} g.GetURL() g = nil g.GetURL() } func TestGistFork_GetUser(tt *testing.T) { g := &GistFork{} g.GetUser() g = nil g.GetUser() } func TestGistStats_GetPrivateGists(tt *testing.T) { var zeroValue int g := &GistStats{PrivateGists: &zeroValue} g.GetPrivateGists() g = &GistStats{} g.GetPrivateGists() g = nil g.GetPrivateGists() } func TestGistStats_GetPublicGists(tt *testing.T) { var zeroValue int g := &GistStats{PublicGists: &zeroValue} g.GetPublicGists() g = &GistStats{} g.GetPublicGists() g = nil g.GetPublicGists() } func TestGistStats_GetTotalGists(tt *testing.T) { var zeroValue int g := &GistStats{TotalGists: &zeroValue} g.GetTotalGists() g = &GistStats{} g.GetTotalGists() g = nil g.GetTotalGists() } func TestGitHubAppAuthorizationEvent_GetAction(tt *testing.T) { var zeroValue string g := &GitHubAppAuthorizationEvent{Action: &zeroValue} g.GetAction() g = &GitHubAppAuthorizationEvent{} g.GetAction() g = nil g.GetAction() } func TestGitHubAppAuthorizationEvent_GetSender(tt *testing.T) { g := &GitHubAppAuthorizationEvent{} g.GetSender() g = nil g.GetSender() } func TestGitignore_GetName(tt *testing.T) { var zeroValue string g := &Gitignore{Name: &zeroValue} g.GetName() g = &Gitignore{} g.GetName() g = nil g.GetName() } func TestGitignore_GetSource(tt *testing.T) { var zeroValue string g := &Gitignore{Source: &zeroValue} g.GetSource() g = &Gitignore{} g.GetSource() g = nil g.GetSource() } func TestGitObject_GetSHA(tt *testing.T) { var zeroValue string g := &GitObject{SHA: &zeroValue} g.GetSHA() g = &GitObject{} g.GetSHA() g = nil g.GetSHA() } func TestGitObject_GetType(tt *testing.T) { var zeroValue string g := &GitObject{Type: &zeroValue} g.GetType() g = &GitObject{} g.GetType() g = nil g.GetType() } func TestGitObject_GetURL(tt *testing.T) { var zeroValue string g := &GitObject{URL: &zeroValue} g.GetURL() g = &GitObject{} g.GetURL() g = nil g.GetURL() } func TestGollumEvent_GetInstallation(tt *testing.T) { g := &GollumEvent{} g.GetInstallation() g = nil g.GetInstallation() } func TestGollumEvent_GetRepo(tt *testing.T) { g := &GollumEvent{} g.GetRepo() g = nil g.GetRepo() } func TestGollumEvent_GetSender(tt *testing.T) { g := &GollumEvent{} g.GetSender() g = nil g.GetSender() } func TestGPGEmail_GetEmail(tt *testing.T) { var zeroValue string g := &GPGEmail{Email: &zeroValue} g.GetEmail() g = &GPGEmail{} g.GetEmail() g = nil g.GetEmail() } func TestGPGEmail_GetVerified(tt *testing.T) { var zeroValue bool g := &GPGEmail{Verified: &zeroValue} g.GetVerified() g = &GPGEmail{} g.GetVerified() g = nil g.GetVerified() } func TestGPGKey_GetCanCertify(tt *testing.T) { var zeroValue bool g := &GPGKey{CanCertify: &zeroValue} g.GetCanCertify() g = &GPGKey{} g.GetCanCertify() g = nil g.GetCanCertify() } func TestGPGKey_GetCanEncryptComms(tt *testing.T) { var zeroValue bool g := &GPGKey{CanEncryptComms: &zeroValue} g.GetCanEncryptComms() g = &GPGKey{} g.GetCanEncryptComms() g = nil g.GetCanEncryptComms() } func TestGPGKey_GetCanEncryptStorage(tt *testing.T) { var zeroValue bool g := &GPGKey{CanEncryptStorage: &zeroValue} g.GetCanEncryptStorage() g = &GPGKey{} g.GetCanEncryptStorage() g = nil g.GetCanEncryptStorage() } func TestGPGKey_GetCanSign(tt *testing.T) { var zeroValue bool g := &GPGKey{CanSign: &zeroValue} g.GetCanSign() g = &GPGKey{} g.GetCanSign() g = nil g.GetCanSign() } func TestGPGKey_GetCreatedAt(tt *testing.T) { var zeroValue time.Time g := &GPGKey{CreatedAt: &zeroValue} g.GetCreatedAt() g = &GPGKey{} g.GetCreatedAt() g = nil g.GetCreatedAt() } func TestGPGKey_GetExpiresAt(tt *testing.T) { var zeroValue time.Time g := &GPGKey{ExpiresAt: &zeroValue} g.GetExpiresAt() g = &GPGKey{} g.GetExpiresAt() g = nil g.GetExpiresAt() } func TestGPGKey_GetID(tt *testing.T) { var zeroValue int64 g := &GPGKey{ID: &zeroValue} g.GetID() g = &GPGKey{} g.GetID() g = nil g.GetID() } func TestGPGKey_GetKeyID(tt *testing.T) { var zeroValue string g := &GPGKey{KeyID: &zeroValue} g.GetKeyID() g = &GPGKey{} g.GetKeyID() g = nil g.GetKeyID() } func TestGPGKey_GetPrimaryKeyID(tt *testing.T) { var zeroValue int64 g := &GPGKey{PrimaryKeyID: &zeroValue} g.GetPrimaryKeyID() g = &GPGKey{} g.GetPrimaryKeyID() g = nil g.GetPrimaryKeyID() } func TestGPGKey_GetPublicKey(tt *testing.T) { var zeroValue string g := &GPGKey{PublicKey: &zeroValue} g.GetPublicKey() g = &GPGKey{} g.GetPublicKey() g = nil g.GetPublicKey() } func TestGrant_GetApp(tt *testing.T) { g := &Grant{} g.GetApp() g = nil g.GetApp() } func TestGrant_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp g := &Grant{CreatedAt: &zeroValue} g.GetCreatedAt() g = &Grant{} g.GetCreatedAt() g = nil g.GetCreatedAt() } func TestGrant_GetID(tt *testing.T) { var zeroValue int64 g := &Grant{ID: &zeroValue} g.GetID() g = &Grant{} g.GetID() g = nil g.GetID() } func TestGrant_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp g := &Grant{UpdatedAt: &zeroValue} g.GetUpdatedAt() g = &Grant{} g.GetUpdatedAt() g = nil g.GetUpdatedAt() } func TestGrant_GetURL(tt *testing.T) { var zeroValue string g := &Grant{URL: &zeroValue} g.GetURL() g = &Grant{} g.GetURL() g = nil g.GetURL() } func TestHeadCommit_GetAuthor(tt *testing.T) { h := &HeadCommit{} h.GetAuthor() h = nil h.GetAuthor() } func TestHeadCommit_GetCommitter(tt *testing.T) { h := &HeadCommit{} h.GetCommitter() h = nil h.GetCommitter() } func TestHeadCommit_GetDistinct(tt *testing.T) { var zeroValue bool h := &HeadCommit{Distinct: &zeroValue} h.GetDistinct() h = &HeadCommit{} h.GetDistinct() h = nil h.GetDistinct() } func TestHeadCommit_GetID(tt *testing.T) { var zeroValue string h := &HeadCommit{ID: &zeroValue} h.GetID() h = &HeadCommit{} h.GetID() h = nil h.GetID() } func TestHeadCommit_GetMessage(tt *testing.T) { var zeroValue string h := &HeadCommit{Message: &zeroValue} h.GetMessage() h = &HeadCommit{} h.GetMessage() h = nil h.GetMessage() } func TestHeadCommit_GetSHA(tt *testing.T) { var zeroValue string h := &HeadCommit{SHA: &zeroValue} h.GetSHA() h = &HeadCommit{} h.GetSHA() h = nil h.GetSHA() } func TestHeadCommit_GetTimestamp(tt *testing.T) { var zeroValue Timestamp h := &HeadCommit{Timestamp: &zeroValue} h.GetTimestamp() h = &HeadCommit{} h.GetTimestamp() h = nil h.GetTimestamp() } func TestHeadCommit_GetTreeID(tt *testing.T) { var zeroValue string h := &HeadCommit{TreeID: &zeroValue} h.GetTreeID() h = &HeadCommit{} h.GetTreeID() h = nil h.GetTreeID() } func TestHeadCommit_GetURL(tt *testing.T) { var zeroValue string h := &HeadCommit{URL: &zeroValue} h.GetURL() h = &HeadCommit{} h.GetURL() h = nil h.GetURL() } func TestHook_GetActive(tt *testing.T) { var zeroValue bool h := &Hook{Active: &zeroValue} h.GetActive() h = &Hook{} h.GetActive() h = nil h.GetActive() } func TestHook_GetCreatedAt(tt *testing.T) { var zeroValue time.Time h := &Hook{CreatedAt: &zeroValue} h.GetCreatedAt() h = &Hook{} h.GetCreatedAt() h = nil h.GetCreatedAt() } func TestHook_GetID(tt *testing.T) { var zeroValue int64 h := &Hook{ID: &zeroValue} h.GetID() h = &Hook{} h.GetID() h = nil h.GetID() } func TestHook_GetName(tt *testing.T) { var zeroValue string h := &Hook{Name: &zeroValue} h.GetName() h = &Hook{} h.GetName() h = nil h.GetName() } func TestHook_GetPingURL(tt *testing.T) { var zeroValue string h := &Hook{PingURL: &zeroValue} h.GetPingURL() h = &Hook{} h.GetPingURL() h = nil h.GetPingURL() } func TestHook_GetTestURL(tt *testing.T) { var zeroValue string h := &Hook{TestURL: &zeroValue} h.GetTestURL() h = &Hook{} h.GetTestURL() h = nil h.GetTestURL() } func TestHook_GetType(tt *testing.T) { var zeroValue string h := &Hook{Type: &zeroValue} h.GetType() h = &Hook{} h.GetType() h = nil h.GetType() } func TestHook_GetUpdatedAt(tt *testing.T) { var zeroValue time.Time h := &Hook{UpdatedAt: &zeroValue} h.GetUpdatedAt() h = &Hook{} h.GetUpdatedAt() h = nil h.GetUpdatedAt() } func TestHook_GetURL(tt *testing.T) { var zeroValue string h := &Hook{URL: &zeroValue} h.GetURL() h = &Hook{} h.GetURL() h = nil h.GetURL() } func TestHookConfig_GetContentType(tt *testing.T) { var zeroValue string h := &HookConfig{ContentType: &zeroValue} h.GetContentType() h = &HookConfig{} h.GetContentType() h = nil h.GetContentType() } func TestHookConfig_GetInsecureSSL(tt *testing.T) { var zeroValue string h := &HookConfig{InsecureSSL: &zeroValue} h.GetInsecureSSL() h = &HookConfig{} h.GetInsecureSSL() h = nil h.GetInsecureSSL() } func TestHookConfig_GetURL(tt *testing.T) { var zeroValue string h := &HookConfig{URL: &zeroValue} h.GetURL() h = &HookConfig{} h.GetURL() h = nil h.GetURL() } func TestHookDelivery_GetAction(tt *testing.T) { var zeroValue string h := &HookDelivery{Action: &zeroValue} h.GetAction() h = &HookDelivery{} h.GetAction() h = nil h.GetAction() } func TestHookDelivery_GetDeliveredAt(tt *testing.T) { var zeroValue Timestamp h := &HookDelivery{DeliveredAt: &zeroValue} h.GetDeliveredAt() h = &HookDelivery{} h.GetDeliveredAt() h = nil h.GetDeliveredAt() } func TestHookDelivery_GetDuration(tt *testing.T) { h := &HookDelivery{} h.GetDuration() h = nil h.GetDuration() } func TestHookDelivery_GetEvent(tt *testing.T) { var zeroValue string h := &HookDelivery{Event: &zeroValue} h.GetEvent() h = &HookDelivery{} h.GetEvent() h = nil h.GetEvent() } func TestHookDelivery_GetGUID(tt *testing.T) { var zeroValue string h := &HookDelivery{GUID: &zeroValue} h.GetGUID() h = &HookDelivery{} h.GetGUID() h = nil h.GetGUID() } func TestHookDelivery_GetID(tt *testing.T) { var zeroValue int64 h := &HookDelivery{ID: &zeroValue} h.GetID() h = &HookDelivery{} h.GetID() h = nil h.GetID() } func TestHookDelivery_GetInstallationID(tt *testing.T) { var zeroValue string h := &HookDelivery{InstallationID: &zeroValue} h.GetInstallationID() h = &HookDelivery{} h.GetInstallationID() h = nil h.GetInstallationID() } func TestHookDelivery_GetRedelivery(tt *testing.T) { var zeroValue bool h := &HookDelivery{Redelivery: &zeroValue} h.GetRedelivery() h = &HookDelivery{} h.GetRedelivery() h = nil h.GetRedelivery() } func TestHookDelivery_GetRepositoryID(tt *testing.T) { var zeroValue int64 h := &HookDelivery{RepositoryID: &zeroValue} h.GetRepositoryID() h = &HookDelivery{} h.GetRepositoryID() h = nil h.GetRepositoryID() } func TestHookDelivery_GetRequest(tt *testing.T) { h := &HookDelivery{} h.GetRequest() h = nil h.GetRequest() } func TestHookDelivery_GetResponse(tt *testing.T) { h := &HookDelivery{} h.GetResponse() h = nil h.GetResponse() } func TestHookDelivery_GetStatus(tt *testing.T) { var zeroValue string h := &HookDelivery{Status: &zeroValue} h.GetStatus() h = &HookDelivery{} h.GetStatus() h = nil h.GetStatus() } func TestHookDelivery_GetStatusCode(tt *testing.T) { var zeroValue int h := &HookDelivery{StatusCode: &zeroValue} h.GetStatusCode() h = &HookDelivery{} h.GetStatusCode() h = nil h.GetStatusCode() } func TestHookRequest_GetHeaders(tt *testing.T) { zeroValue := map[string]string{} h := &HookRequest{Headers: zeroValue} h.GetHeaders() h = &HookRequest{} h.GetHeaders() h = nil h.GetHeaders() } func TestHookRequest_GetRawPayload(tt *testing.T) { var zeroValue json.RawMessage h := &HookRequest{RawPayload: &zeroValue} h.GetRawPayload() h = &HookRequest{} h.GetRawPayload() h = nil h.GetRawPayload() } func TestHookResponse_GetHeaders(tt *testing.T) { zeroValue := map[string]string{} h := &HookResponse{Headers: zeroValue} h.GetHeaders() h = &HookResponse{} h.GetHeaders() h = nil h.GetHeaders() } func TestHookResponse_GetRawPayload(tt *testing.T) { var zeroValue json.RawMessage h := &HookResponse{RawPayload: &zeroValue} h.GetRawPayload() h = &HookResponse{} h.GetRawPayload() h = nil h.GetRawPayload() } func TestHookStats_GetActiveHooks(tt *testing.T) { var zeroValue int h := &HookStats{ActiveHooks: &zeroValue} h.GetActiveHooks() h = &HookStats{} h.GetActiveHooks() h = nil h.GetActiveHooks() } func TestHookStats_GetInactiveHooks(tt *testing.T) { var zeroValue int h := &HookStats{InactiveHooks: &zeroValue} h.GetInactiveHooks() h = &HookStats{} h.GetInactiveHooks() h = nil h.GetInactiveHooks() } func TestHookStats_GetTotalHooks(tt *testing.T) { var zeroValue int h := &HookStats{TotalHooks: &zeroValue} h.GetTotalHooks() h = &HookStats{} h.GetTotalHooks() h = nil h.GetTotalHooks() } func TestIDPGroup_GetGroupDescription(tt *testing.T) { var zeroValue string i := &IDPGroup{GroupDescription: &zeroValue} i.GetGroupDescription() i = &IDPGroup{} i.GetGroupDescription() i = nil i.GetGroupDescription() } func TestIDPGroup_GetGroupID(tt *testing.T) { var zeroValue string i := &IDPGroup{GroupID: &zeroValue} i.GetGroupID() i = &IDPGroup{} i.GetGroupID() i = nil i.GetGroupID() } func TestIDPGroup_GetGroupName(tt *testing.T) { var zeroValue string i := &IDPGroup{GroupName: &zeroValue} i.GetGroupName() i = &IDPGroup{} i.GetGroupName() i = nil i.GetGroupName() } func TestImport_GetAuthorsCount(tt *testing.T) { var zeroValue int i := &Import{AuthorsCount: &zeroValue} i.GetAuthorsCount() i = &Import{} i.GetAuthorsCount() i = nil i.GetAuthorsCount() } func TestImport_GetAuthorsURL(tt *testing.T) { var zeroValue string i := &Import{AuthorsURL: &zeroValue} i.GetAuthorsURL() i = &Import{} i.GetAuthorsURL() i = nil i.GetAuthorsURL() } func TestImport_GetCommitCount(tt *testing.T) { var zeroValue int i := &Import{CommitCount: &zeroValue} i.GetCommitCount() i = &Import{} i.GetCommitCount() i = nil i.GetCommitCount() } func TestImport_GetFailedStep(tt *testing.T) { var zeroValue string i := &Import{FailedStep: &zeroValue} i.GetFailedStep() i = &Import{} i.GetFailedStep() i = nil i.GetFailedStep() } func TestImport_GetHasLargeFiles(tt *testing.T) { var zeroValue bool i := &Import{HasLargeFiles: &zeroValue} i.GetHasLargeFiles() i = &Import{} i.GetHasLargeFiles() i = nil i.GetHasLargeFiles() } func TestImport_GetHTMLURL(tt *testing.T) { var zeroValue string i := &Import{HTMLURL: &zeroValue} i.GetHTMLURL() i = &Import{} i.GetHTMLURL() i = nil i.GetHTMLURL() } func TestImport_GetHumanName(tt *testing.T) { var zeroValue string i := &Import{HumanName: &zeroValue} i.GetHumanName() i = &Import{} i.GetHumanName() i = nil i.GetHumanName() } func TestImport_GetLargeFilesCount(tt *testing.T) { var zeroValue int i := &Import{LargeFilesCount: &zeroValue} i.GetLargeFilesCount() i = &Import{} i.GetLargeFilesCount() i = nil i.GetLargeFilesCount() } func TestImport_GetLargeFilesSize(tt *testing.T) { var zeroValue int i := &Import{LargeFilesSize: &zeroValue} i.GetLargeFilesSize() i = &Import{} i.GetLargeFilesSize() i = nil i.GetLargeFilesSize() } func TestImport_GetMessage(tt *testing.T) { var zeroValue string i := &Import{Message: &zeroValue} i.GetMessage() i = &Import{} i.GetMessage() i = nil i.GetMessage() } func TestImport_GetPercent(tt *testing.T) { var zeroValue int i := &Import{Percent: &zeroValue} i.GetPercent() i = &Import{} i.GetPercent() i = nil i.GetPercent() } func TestImport_GetPushPercent(tt *testing.T) { var zeroValue int i := &Import{PushPercent: &zeroValue} i.GetPushPercent() i = &Import{} i.GetPushPercent() i = nil i.GetPushPercent() } func TestImport_GetRepositoryURL(tt *testing.T) { var zeroValue string i := &Import{RepositoryURL: &zeroValue} i.GetRepositoryURL() i = &Import{} i.GetRepositoryURL() i = nil i.GetRepositoryURL() } func TestImport_GetStatus(tt *testing.T) { var zeroValue string i := &Import{Status: &zeroValue} i.GetStatus() i = &Import{} i.GetStatus() i = nil i.GetStatus() } func TestImport_GetStatusText(tt *testing.T) { var zeroValue string i := &Import{StatusText: &zeroValue} i.GetStatusText() i = &Import{} i.GetStatusText() i = nil i.GetStatusText() } func TestImport_GetTFVCProject(tt *testing.T) { var zeroValue string i := &Import{TFVCProject: &zeroValue} i.GetTFVCProject() i = &Import{} i.GetTFVCProject() i = nil i.GetTFVCProject() } func TestImport_GetURL(tt *testing.T) { var zeroValue string i := &Import{URL: &zeroValue} i.GetURL() i = &Import{} i.GetURL() i = nil i.GetURL() } func TestImport_GetUseLFS(tt *testing.T) { var zeroValue string i := &Import{UseLFS: &zeroValue} i.GetUseLFS() i = &Import{} i.GetUseLFS() i = nil i.GetUseLFS() } func TestImport_GetVCS(tt *testing.T) { var zeroValue string i := &Import{VCS: &zeroValue} i.GetVCS() i = &Import{} i.GetVCS() i = nil i.GetVCS() } func TestImport_GetVCSPassword(tt *testing.T) { var zeroValue string i := &Import{VCSPassword: &zeroValue} i.GetVCSPassword() i = &Import{} i.GetVCSPassword() i = nil i.GetVCSPassword() } func TestImport_GetVCSURL(tt *testing.T) { var zeroValue string i := &Import{VCSURL: &zeroValue} i.GetVCSURL() i = &Import{} i.GetVCSURL() i = nil i.GetVCSURL() } func TestImport_GetVCSUsername(tt *testing.T) { var zeroValue string i := &Import{VCSUsername: &zeroValue} i.GetVCSUsername() i = &Import{} i.GetVCSUsername() i = nil i.GetVCSUsername() } func TestInstallation_GetAccessTokensURL(tt *testing.T) { var zeroValue string i := &Installation{AccessTokensURL: &zeroValue} i.GetAccessTokensURL() i = &Installation{} i.GetAccessTokensURL() i = nil i.GetAccessTokensURL() } func TestInstallation_GetAccount(tt *testing.T) { i := &Installation{} i.GetAccount() i = nil i.GetAccount() } func TestInstallation_GetAppID(tt *testing.T) { var zeroValue int64 i := &Installation{AppID: &zeroValue} i.GetAppID() i = &Installation{} i.GetAppID() i = nil i.GetAppID() } func TestInstallation_GetAppSlug(tt *testing.T) { var zeroValue string i := &Installation{AppSlug: &zeroValue} i.GetAppSlug() i = &Installation{} i.GetAppSlug() i = nil i.GetAppSlug() } func TestInstallation_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp i := &Installation{CreatedAt: &zeroValue} i.GetCreatedAt() i = &Installation{} i.GetCreatedAt() i = nil i.GetCreatedAt() } func TestInstallation_GetHasMultipleSingleFiles(tt *testing.T) { var zeroValue bool i := &Installation{HasMultipleSingleFiles: &zeroValue} i.GetHasMultipleSingleFiles() i = &Installation{} i.GetHasMultipleSingleFiles() i = nil i.GetHasMultipleSingleFiles() } func TestInstallation_GetHTMLURL(tt *testing.T) { var zeroValue string i := &Installation{HTMLURL: &zeroValue} i.GetHTMLURL() i = &Installation{} i.GetHTMLURL() i = nil i.GetHTMLURL() } func TestInstallation_GetID(tt *testing.T) { var zeroValue int64 i := &Installation{ID: &zeroValue} i.GetID() i = &Installation{} i.GetID() i = nil i.GetID() } func TestInstallation_GetNodeID(tt *testing.T) { var zeroValue string i := &Installation{NodeID: &zeroValue} i.GetNodeID() i = &Installation{} i.GetNodeID() i = nil i.GetNodeID() } func TestInstallation_GetPermissions(tt *testing.T) { i := &Installation{} i.GetPermissions() i = nil i.GetPermissions() } func TestInstallation_GetRepositoriesURL(tt *testing.T) { var zeroValue string i := &Installation{RepositoriesURL: &zeroValue} i.GetRepositoriesURL() i = &Installation{} i.GetRepositoriesURL() i = nil i.GetRepositoriesURL() } func TestInstallation_GetRepositorySelection(tt *testing.T) { var zeroValue string i := &Installation{RepositorySelection: &zeroValue} i.GetRepositorySelection() i = &Installation{} i.GetRepositorySelection() i = nil i.GetRepositorySelection() } func TestInstallation_GetSingleFileName(tt *testing.T) { var zeroValue string i := &Installation{SingleFileName: &zeroValue} i.GetSingleFileName() i = &Installation{} i.GetSingleFileName() i = nil i.GetSingleFileName() } func TestInstallation_GetSuspendedAt(tt *testing.T) { var zeroValue Timestamp i := &Installation{SuspendedAt: &zeroValue} i.GetSuspendedAt() i = &Installation{} i.GetSuspendedAt() i = nil i.GetSuspendedAt() } func TestInstallation_GetSuspendedBy(tt *testing.T) { i := &Installation{} i.GetSuspendedBy() i = nil i.GetSuspendedBy() } func TestInstallation_GetTargetID(tt *testing.T) { var zeroValue int64 i := &Installation{TargetID: &zeroValue} i.GetTargetID() i = &Installation{} i.GetTargetID() i = nil i.GetTargetID() } func TestInstallation_GetTargetType(tt *testing.T) { var zeroValue string i := &Installation{TargetType: &zeroValue} i.GetTargetType() i = &Installation{} i.GetTargetType() i = nil i.GetTargetType() } func TestInstallation_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp i := &Installation{UpdatedAt: &zeroValue} i.GetUpdatedAt() i = &Installation{} i.GetUpdatedAt() i = nil i.GetUpdatedAt() } func TestInstallationEvent_GetAction(tt *testing.T) { var zeroValue string i := &InstallationEvent{Action: &zeroValue} i.GetAction() i = &InstallationEvent{} i.GetAction() i = nil i.GetAction() } func TestInstallationEvent_GetInstallation(tt *testing.T) { i := &InstallationEvent{} i.GetInstallation() i = nil i.GetInstallation() } func TestInstallationEvent_GetSender(tt *testing.T) { i := &InstallationEvent{} i.GetSender() i = nil i.GetSender() } func TestInstallationPermissions_GetActions(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Actions: &zeroValue} i.GetActions() i = &InstallationPermissions{} i.GetActions() i = nil i.GetActions() } func TestInstallationPermissions_GetAdministration(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Administration: &zeroValue} i.GetAdministration() i = &InstallationPermissions{} i.GetAdministration() i = nil i.GetAdministration() } func TestInstallationPermissions_GetBlocking(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Blocking: &zeroValue} i.GetBlocking() i = &InstallationPermissions{} i.GetBlocking() i = nil i.GetBlocking() } func TestInstallationPermissions_GetChecks(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Checks: &zeroValue} i.GetChecks() i = &InstallationPermissions{} i.GetChecks() i = nil i.GetChecks() } func TestInstallationPermissions_GetContentReferences(tt *testing.T) { var zeroValue string i := &InstallationPermissions{ContentReferences: &zeroValue} i.GetContentReferences() i = &InstallationPermissions{} i.GetContentReferences() i = nil i.GetContentReferences() } func TestInstallationPermissions_GetContents(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Contents: &zeroValue} i.GetContents() i = &InstallationPermissions{} i.GetContents() i = nil i.GetContents() } func TestInstallationPermissions_GetDeployments(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Deployments: &zeroValue} i.GetDeployments() i = &InstallationPermissions{} i.GetDeployments() i = nil i.GetDeployments() } func TestInstallationPermissions_GetEmails(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Emails: &zeroValue} i.GetEmails() i = &InstallationPermissions{} i.GetEmails() i = nil i.GetEmails() } func TestInstallationPermissions_GetEnvironments(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Environments: &zeroValue} i.GetEnvironments() i = &InstallationPermissions{} i.GetEnvironments() i = nil i.GetEnvironments() } func TestInstallationPermissions_GetFollowers(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Followers: &zeroValue} i.GetFollowers() i = &InstallationPermissions{} i.GetFollowers() i = nil i.GetFollowers() } func TestInstallationPermissions_GetIssues(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Issues: &zeroValue} i.GetIssues() i = &InstallationPermissions{} i.GetIssues() i = nil i.GetIssues() } func TestInstallationPermissions_GetMembers(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Members: &zeroValue} i.GetMembers() i = &InstallationPermissions{} i.GetMembers() i = nil i.GetMembers() } func TestInstallationPermissions_GetMetadata(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Metadata: &zeroValue} i.GetMetadata() i = &InstallationPermissions{} i.GetMetadata() i = nil i.GetMetadata() } func TestInstallationPermissions_GetOrganizationAdministration(tt *testing.T) { var zeroValue string i := &InstallationPermissions{OrganizationAdministration: &zeroValue} i.GetOrganizationAdministration() i = &InstallationPermissions{} i.GetOrganizationAdministration() i = nil i.GetOrganizationAdministration() } func TestInstallationPermissions_GetOrganizationHooks(tt *testing.T) { var zeroValue string i := &InstallationPermissions{OrganizationHooks: &zeroValue} i.GetOrganizationHooks() i = &InstallationPermissions{} i.GetOrganizationHooks() i = nil i.GetOrganizationHooks() } func TestInstallationPermissions_GetOrganizationPlan(tt *testing.T) { var zeroValue string i := &InstallationPermissions{OrganizationPlan: &zeroValue} i.GetOrganizationPlan() i = &InstallationPermissions{} i.GetOrganizationPlan() i = nil i.GetOrganizationPlan() } func TestInstallationPermissions_GetOrganizationPreReceiveHooks(tt *testing.T) { var zeroValue string i := &InstallationPermissions{OrganizationPreReceiveHooks: &zeroValue} i.GetOrganizationPreReceiveHooks() i = &InstallationPermissions{} i.GetOrganizationPreReceiveHooks() i = nil i.GetOrganizationPreReceiveHooks() } func TestInstallationPermissions_GetOrganizationProjects(tt *testing.T) { var zeroValue string i := &InstallationPermissions{OrganizationProjects: &zeroValue} i.GetOrganizationProjects() i = &InstallationPermissions{} i.GetOrganizationProjects() i = nil i.GetOrganizationProjects() } func TestInstallationPermissions_GetOrganizationSecrets(tt *testing.T) { var zeroValue string i := &InstallationPermissions{OrganizationSecrets: &zeroValue} i.GetOrganizationSecrets() i = &InstallationPermissions{} i.GetOrganizationSecrets() i = nil i.GetOrganizationSecrets() } func TestInstallationPermissions_GetOrganizationSelfHostedRunners(tt *testing.T) { var zeroValue string i := &InstallationPermissions{OrganizationSelfHostedRunners: &zeroValue} i.GetOrganizationSelfHostedRunners() i = &InstallationPermissions{} i.GetOrganizationSelfHostedRunners() i = nil i.GetOrganizationSelfHostedRunners() } func TestInstallationPermissions_GetOrganizationUserBlocking(tt *testing.T) { var zeroValue string i := &InstallationPermissions{OrganizationUserBlocking: &zeroValue} i.GetOrganizationUserBlocking() i = &InstallationPermissions{} i.GetOrganizationUserBlocking() i = nil i.GetOrganizationUserBlocking() } func TestInstallationPermissions_GetPackages(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Packages: &zeroValue} i.GetPackages() i = &InstallationPermissions{} i.GetPackages() i = nil i.GetPackages() } func TestInstallationPermissions_GetPages(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Pages: &zeroValue} i.GetPages() i = &InstallationPermissions{} i.GetPages() i = nil i.GetPages() } func TestInstallationPermissions_GetPullRequests(tt *testing.T) { var zeroValue string i := &InstallationPermissions{PullRequests: &zeroValue} i.GetPullRequests() i = &InstallationPermissions{} i.GetPullRequests() i = nil i.GetPullRequests() } func TestInstallationPermissions_GetRepositoryHooks(tt *testing.T) { var zeroValue string i := &InstallationPermissions{RepositoryHooks: &zeroValue} i.GetRepositoryHooks() i = &InstallationPermissions{} i.GetRepositoryHooks() i = nil i.GetRepositoryHooks() } func TestInstallationPermissions_GetRepositoryPreReceiveHooks(tt *testing.T) { var zeroValue string i := &InstallationPermissions{RepositoryPreReceiveHooks: &zeroValue} i.GetRepositoryPreReceiveHooks() i = &InstallationPermissions{} i.GetRepositoryPreReceiveHooks() i = nil i.GetRepositoryPreReceiveHooks() } func TestInstallationPermissions_GetRepositoryProjects(tt *testing.T) { var zeroValue string i := &InstallationPermissions{RepositoryProjects: &zeroValue} i.GetRepositoryProjects() i = &InstallationPermissions{} i.GetRepositoryProjects() i = nil i.GetRepositoryProjects() } func TestInstallationPermissions_GetSecrets(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Secrets: &zeroValue} i.GetSecrets() i = &InstallationPermissions{} i.GetSecrets() i = nil i.GetSecrets() } func TestInstallationPermissions_GetSecretScanningAlerts(tt *testing.T) { var zeroValue string i := &InstallationPermissions{SecretScanningAlerts: &zeroValue} i.GetSecretScanningAlerts() i = &InstallationPermissions{} i.GetSecretScanningAlerts() i = nil i.GetSecretScanningAlerts() } func TestInstallationPermissions_GetSecurityEvents(tt *testing.T) { var zeroValue string i := &InstallationPermissions{SecurityEvents: &zeroValue} i.GetSecurityEvents() i = &InstallationPermissions{} i.GetSecurityEvents() i = nil i.GetSecurityEvents() } func TestInstallationPermissions_GetSingleFile(tt *testing.T) { var zeroValue string i := &InstallationPermissions{SingleFile: &zeroValue} i.GetSingleFile() i = &InstallationPermissions{} i.GetSingleFile() i = nil i.GetSingleFile() } func TestInstallationPermissions_GetStatuses(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Statuses: &zeroValue} i.GetStatuses() i = &InstallationPermissions{} i.GetStatuses() i = nil i.GetStatuses() } func TestInstallationPermissions_GetTeamDiscussions(tt *testing.T) { var zeroValue string i := &InstallationPermissions{TeamDiscussions: &zeroValue} i.GetTeamDiscussions() i = &InstallationPermissions{} i.GetTeamDiscussions() i = nil i.GetTeamDiscussions() } func TestInstallationPermissions_GetVulnerabilityAlerts(tt *testing.T) { var zeroValue string i := &InstallationPermissions{VulnerabilityAlerts: &zeroValue} i.GetVulnerabilityAlerts() i = &InstallationPermissions{} i.GetVulnerabilityAlerts() i = nil i.GetVulnerabilityAlerts() } func TestInstallationPermissions_GetWorkflows(tt *testing.T) { var zeroValue string i := &InstallationPermissions{Workflows: &zeroValue} i.GetWorkflows() i = &InstallationPermissions{} i.GetWorkflows() i = nil i.GetWorkflows() } func TestInstallationRepositoriesEvent_GetAction(tt *testing.T) { var zeroValue string i := &InstallationRepositoriesEvent{Action: &zeroValue} i.GetAction() i = &InstallationRepositoriesEvent{} i.GetAction() i = nil i.GetAction() } func TestInstallationRepositoriesEvent_GetInstallation(tt *testing.T) { i := &InstallationRepositoriesEvent{} i.GetInstallation() i = nil i.GetInstallation() } func TestInstallationRepositoriesEvent_GetRepositorySelection(tt *testing.T) { var zeroValue string i := &InstallationRepositoriesEvent{RepositorySelection: &zeroValue} i.GetRepositorySelection() i = &InstallationRepositoriesEvent{} i.GetRepositorySelection() i = nil i.GetRepositorySelection() } func TestInstallationRepositoriesEvent_GetSender(tt *testing.T) { i := &InstallationRepositoriesEvent{} i.GetSender() i = nil i.GetSender() } func TestInstallationToken_GetExpiresAt(tt *testing.T) { var zeroValue time.Time i := &InstallationToken{ExpiresAt: &zeroValue} i.GetExpiresAt() i = &InstallationToken{} i.GetExpiresAt() i = nil i.GetExpiresAt() } func TestInstallationToken_GetPermissions(tt *testing.T) { i := &InstallationToken{} i.GetPermissions() i = nil i.GetPermissions() } func TestInstallationToken_GetToken(tt *testing.T) { var zeroValue string i := &InstallationToken{Token: &zeroValue} i.GetToken() i = &InstallationToken{} i.GetToken() i = nil i.GetToken() } func TestInstallationTokenOptions_GetPermissions(tt *testing.T) { i := &InstallationTokenOptions{} i.GetPermissions() i = nil i.GetPermissions() } func TestInteractionRestriction_GetExpiresAt(tt *testing.T) { var zeroValue Timestamp i := &InteractionRestriction{ExpiresAt: &zeroValue} i.GetExpiresAt() i = &InteractionRestriction{} i.GetExpiresAt() i = nil i.GetExpiresAt() } func TestInteractionRestriction_GetLimit(tt *testing.T) { var zeroValue string i := &InteractionRestriction{Limit: &zeroValue} i.GetLimit() i = &InteractionRestriction{} i.GetLimit() i = nil i.GetLimit() } func TestInteractionRestriction_GetOrigin(tt *testing.T) { var zeroValue string i := &InteractionRestriction{Origin: &zeroValue} i.GetOrigin() i = &InteractionRestriction{} i.GetOrigin() i = nil i.GetOrigin() } func TestInvitation_GetCreatedAt(tt *testing.T) { var zeroValue time.Time i := &Invitation{CreatedAt: &zeroValue} i.GetCreatedAt() i = &Invitation{} i.GetCreatedAt() i = nil i.GetCreatedAt() } func TestInvitation_GetEmail(tt *testing.T) { var zeroValue string i := &Invitation{Email: &zeroValue} i.GetEmail() i = &Invitation{} i.GetEmail() i = nil i.GetEmail() } func TestInvitation_GetFailedAt(tt *testing.T) { var zeroValue Timestamp i := &Invitation{FailedAt: &zeroValue} i.GetFailedAt() i = &Invitation{} i.GetFailedAt() i = nil i.GetFailedAt() } func TestInvitation_GetFailedReason(tt *testing.T) { var zeroValue string i := &Invitation{FailedReason: &zeroValue} i.GetFailedReason() i = &Invitation{} i.GetFailedReason() i = nil i.GetFailedReason() } func TestInvitation_GetID(tt *testing.T) { var zeroValue int64 i := &Invitation{ID: &zeroValue} i.GetID() i = &Invitation{} i.GetID() i = nil i.GetID() } func TestInvitation_GetInvitationTeamURL(tt *testing.T) { var zeroValue string i := &Invitation{InvitationTeamURL: &zeroValue} i.GetInvitationTeamURL() i = &Invitation{} i.GetInvitationTeamURL() i = nil i.GetInvitationTeamURL() } func TestInvitation_GetInviter(tt *testing.T) { i := &Invitation{} i.GetInviter() i = nil i.GetInviter() } func TestInvitation_GetLogin(tt *testing.T) { var zeroValue string i := &Invitation{Login: &zeroValue} i.GetLogin() i = &Invitation{} i.GetLogin() i = nil i.GetLogin() } func TestInvitation_GetNodeID(tt *testing.T) { var zeroValue string i := &Invitation{NodeID: &zeroValue} i.GetNodeID() i = &Invitation{} i.GetNodeID() i = nil i.GetNodeID() } func TestInvitation_GetRole(tt *testing.T) { var zeroValue string i := &Invitation{Role: &zeroValue} i.GetRole() i = &Invitation{} i.GetRole() i = nil i.GetRole() } func TestInvitation_GetTeamCount(tt *testing.T) { var zeroValue int i := &Invitation{TeamCount: &zeroValue} i.GetTeamCount() i = &Invitation{} i.GetTeamCount() i = nil i.GetTeamCount() } func TestIssue_GetActiveLockReason(tt *testing.T) { var zeroValue string i := &Issue{ActiveLockReason: &zeroValue} i.GetActiveLockReason() i = &Issue{} i.GetActiveLockReason() i = nil i.GetActiveLockReason() } func TestIssue_GetAssignee(tt *testing.T) { i := &Issue{} i.GetAssignee() i = nil i.GetAssignee() } func TestIssue_GetAuthorAssociation(tt *testing.T) { var zeroValue string i := &Issue{AuthorAssociation: &zeroValue} i.GetAuthorAssociation() i = &Issue{} i.GetAuthorAssociation() i = nil i.GetAuthorAssociation() } func TestIssue_GetBody(tt *testing.T) { var zeroValue string i := &Issue{Body: &zeroValue} i.GetBody() i = &Issue{} i.GetBody() i = nil i.GetBody() } func TestIssue_GetClosedAt(tt *testing.T) { var zeroValue time.Time i := &Issue{ClosedAt: &zeroValue} i.GetClosedAt() i = &Issue{} i.GetClosedAt() i = nil i.GetClosedAt() } func TestIssue_GetClosedBy(tt *testing.T) { i := &Issue{} i.GetClosedBy() i = nil i.GetClosedBy() } func TestIssue_GetComments(tt *testing.T) { var zeroValue int i := &Issue{Comments: &zeroValue} i.GetComments() i = &Issue{} i.GetComments() i = nil i.GetComments() } func TestIssue_GetCommentsURL(tt *testing.T) { var zeroValue string i := &Issue{CommentsURL: &zeroValue} i.GetCommentsURL() i = &Issue{} i.GetCommentsURL() i = nil i.GetCommentsURL() } func TestIssue_GetCreatedAt(tt *testing.T) { var zeroValue time.Time i := &Issue{CreatedAt: &zeroValue} i.GetCreatedAt() i = &Issue{} i.GetCreatedAt() i = nil i.GetCreatedAt() } func TestIssue_GetEventsURL(tt *testing.T) { var zeroValue string i := &Issue{EventsURL: &zeroValue} i.GetEventsURL() i = &Issue{} i.GetEventsURL() i = nil i.GetEventsURL() } func TestIssue_GetHTMLURL(tt *testing.T) { var zeroValue string i := &Issue{HTMLURL: &zeroValue} i.GetHTMLURL() i = &Issue{} i.GetHTMLURL() i = nil i.GetHTMLURL() } func TestIssue_GetID(tt *testing.T) { var zeroValue int64 i := &Issue{ID: &zeroValue} i.GetID() i = &Issue{} i.GetID() i = nil i.GetID() } func TestIssue_GetLabelsURL(tt *testing.T) { var zeroValue string i := &Issue{LabelsURL: &zeroValue} i.GetLabelsURL() i = &Issue{} i.GetLabelsURL() i = nil i.GetLabelsURL() } func TestIssue_GetLocked(tt *testing.T) { var zeroValue bool i := &Issue{Locked: &zeroValue} i.GetLocked() i = &Issue{} i.GetLocked() i = nil i.GetLocked() } func TestIssue_GetMilestone(tt *testing.T) { i := &Issue{} i.GetMilestone() i = nil i.GetMilestone() } func TestIssue_GetNodeID(tt *testing.T) { var zeroValue string i := &Issue{NodeID: &zeroValue} i.GetNodeID() i = &Issue{} i.GetNodeID() i = nil i.GetNodeID() } func TestIssue_GetNumber(tt *testing.T) { var zeroValue int i := &Issue{Number: &zeroValue} i.GetNumber() i = &Issue{} i.GetNumber() i = nil i.GetNumber() } func TestIssue_GetPullRequestLinks(tt *testing.T) { i := &Issue{} i.GetPullRequestLinks() i = nil i.GetPullRequestLinks() } func TestIssue_GetReactions(tt *testing.T) { i := &Issue{} i.GetReactions() i = nil i.GetReactions() } func TestIssue_GetRepository(tt *testing.T) { i := &Issue{} i.GetRepository() i = nil i.GetRepository() } func TestIssue_GetRepositoryURL(tt *testing.T) { var zeroValue string i := &Issue{RepositoryURL: &zeroValue} i.GetRepositoryURL() i = &Issue{} i.GetRepositoryURL() i = nil i.GetRepositoryURL() } func TestIssue_GetState(tt *testing.T) { var zeroValue string i := &Issue{State: &zeroValue} i.GetState() i = &Issue{} i.GetState() i = nil i.GetState() } func TestIssue_GetTitle(tt *testing.T) { var zeroValue string i := &Issue{Title: &zeroValue} i.GetTitle() i = &Issue{} i.GetTitle() i = nil i.GetTitle() } func TestIssue_GetUpdatedAt(tt *testing.T) { var zeroValue time.Time i := &Issue{UpdatedAt: &zeroValue} i.GetUpdatedAt() i = &Issue{} i.GetUpdatedAt() i = nil i.GetUpdatedAt() } func TestIssue_GetURL(tt *testing.T) { var zeroValue string i := &Issue{URL: &zeroValue} i.GetURL() i = &Issue{} i.GetURL() i = nil i.GetURL() } func TestIssue_GetUser(tt *testing.T) { i := &Issue{} i.GetUser() i = nil i.GetUser() } func TestIssueComment_GetAuthorAssociation(tt *testing.T) { var zeroValue string i := &IssueComment{AuthorAssociation: &zeroValue} i.GetAuthorAssociation() i = &IssueComment{} i.GetAuthorAssociation() i = nil i.GetAuthorAssociation() } func TestIssueComment_GetBody(tt *testing.T) { var zeroValue string i := &IssueComment{Body: &zeroValue} i.GetBody() i = &IssueComment{} i.GetBody() i = nil i.GetBody() } func TestIssueComment_GetCreatedAt(tt *testing.T) { var zeroValue time.Time i := &IssueComment{CreatedAt: &zeroValue} i.GetCreatedAt() i = &IssueComment{} i.GetCreatedAt() i = nil i.GetCreatedAt() } func TestIssueComment_GetHTMLURL(tt *testing.T) { var zeroValue string i := &IssueComment{HTMLURL: &zeroValue} i.GetHTMLURL() i = &IssueComment{} i.GetHTMLURL() i = nil i.GetHTMLURL() } func TestIssueComment_GetID(tt *testing.T) { var zeroValue int64 i := &IssueComment{ID: &zeroValue} i.GetID() i = &IssueComment{} i.GetID() i = nil i.GetID() } func TestIssueComment_GetIssueURL(tt *testing.T) { var zeroValue string i := &IssueComment{IssueURL: &zeroValue} i.GetIssueURL() i = &IssueComment{} i.GetIssueURL() i = nil i.GetIssueURL() } func TestIssueComment_GetNodeID(tt *testing.T) { var zeroValue string i := &IssueComment{NodeID: &zeroValue} i.GetNodeID() i = &IssueComment{} i.GetNodeID() i = nil i.GetNodeID() } func TestIssueComment_GetReactions(tt *testing.T) { i := &IssueComment{} i.GetReactions() i = nil i.GetReactions() } func TestIssueComment_GetUpdatedAt(tt *testing.T) { var zeroValue time.Time i := &IssueComment{UpdatedAt: &zeroValue} i.GetUpdatedAt() i = &IssueComment{} i.GetUpdatedAt() i = nil i.GetUpdatedAt() } func TestIssueComment_GetURL(tt *testing.T) { var zeroValue string i := &IssueComment{URL: &zeroValue} i.GetURL() i = &IssueComment{} i.GetURL() i = nil i.GetURL() } func TestIssueComment_GetUser(tt *testing.T) { i := &IssueComment{} i.GetUser() i = nil i.GetUser() } func TestIssueCommentEvent_GetAction(tt *testing.T) { var zeroValue string i := &IssueCommentEvent{Action: &zeroValue} i.GetAction() i = &IssueCommentEvent{} i.GetAction() i = nil i.GetAction() } func TestIssueCommentEvent_GetChanges(tt *testing.T) { i := &IssueCommentEvent{} i.GetChanges() i = nil i.GetChanges() } func TestIssueCommentEvent_GetComment(tt *testing.T) { i := &IssueCommentEvent{} i.GetComment() i = nil i.GetComment() } func TestIssueCommentEvent_GetInstallation(tt *testing.T) { i := &IssueCommentEvent{} i.GetInstallation() i = nil i.GetInstallation() } func TestIssueCommentEvent_GetIssue(tt *testing.T) { i := &IssueCommentEvent{} i.GetIssue() i = nil i.GetIssue() } func TestIssueCommentEvent_GetRepo(tt *testing.T) { i := &IssueCommentEvent{} i.GetRepo() i = nil i.GetRepo() } func TestIssueCommentEvent_GetSender(tt *testing.T) { i := &IssueCommentEvent{} i.GetSender() i = nil i.GetSender() } func TestIssueEvent_GetActor(tt *testing.T) { i := &IssueEvent{} i.GetActor() i = nil i.GetActor() } func TestIssueEvent_GetAssignee(tt *testing.T) { i := &IssueEvent{} i.GetAssignee() i = nil i.GetAssignee() } func TestIssueEvent_GetAssigner(tt *testing.T) { i := &IssueEvent{} i.GetAssigner() i = nil i.GetAssigner() } func TestIssueEvent_GetCommitID(tt *testing.T) { var zeroValue string i := &IssueEvent{CommitID: &zeroValue} i.GetCommitID() i = &IssueEvent{} i.GetCommitID() i = nil i.GetCommitID() } func TestIssueEvent_GetCreatedAt(tt *testing.T) { var zeroValue time.Time i := &IssueEvent{CreatedAt: &zeroValue} i.GetCreatedAt() i = &IssueEvent{} i.GetCreatedAt() i = nil i.GetCreatedAt() } func TestIssueEvent_GetDismissedReview(tt *testing.T) { i := &IssueEvent{} i.GetDismissedReview() i = nil i.GetDismissedReview() } func TestIssueEvent_GetEvent(tt *testing.T) { var zeroValue string i := &IssueEvent{Event: &zeroValue} i.GetEvent() i = &IssueEvent{} i.GetEvent() i = nil i.GetEvent() } func TestIssueEvent_GetID(tt *testing.T) { var zeroValue int64 i := &IssueEvent{ID: &zeroValue} i.GetID() i = &IssueEvent{} i.GetID() i = nil i.GetID() } func TestIssueEvent_GetIssue(tt *testing.T) { i := &IssueEvent{} i.GetIssue() i = nil i.GetIssue() } func TestIssueEvent_GetLabel(tt *testing.T) { i := &IssueEvent{} i.GetLabel() i = nil i.GetLabel() } func TestIssueEvent_GetLockReason(tt *testing.T) { var zeroValue string i := &IssueEvent{LockReason: &zeroValue} i.GetLockReason() i = &IssueEvent{} i.GetLockReason() i = nil i.GetLockReason() } func TestIssueEvent_GetMilestone(tt *testing.T) { i := &IssueEvent{} i.GetMilestone() i = nil i.GetMilestone() } func TestIssueEvent_GetProjectCard(tt *testing.T) { i := &IssueEvent{} i.GetProjectCard() i = nil i.GetProjectCard() } func TestIssueEvent_GetRename(tt *testing.T) { i := &IssueEvent{} i.GetRename() i = nil i.GetRename() } func TestIssueEvent_GetRequestedReviewer(tt *testing.T) { i := &IssueEvent{} i.GetRequestedReviewer() i = nil i.GetRequestedReviewer() } func TestIssueEvent_GetReviewRequester(tt *testing.T) { i := &IssueEvent{} i.GetReviewRequester() i = nil i.GetReviewRequester() } func TestIssueEvent_GetURL(tt *testing.T) { var zeroValue string i := &IssueEvent{URL: &zeroValue} i.GetURL() i = &IssueEvent{} i.GetURL() i = nil i.GetURL() } func TestIssueImport_GetAssignee(tt *testing.T) { var zeroValue string i := &IssueImport{Assignee: &zeroValue} i.GetAssignee() i = &IssueImport{} i.GetAssignee() i = nil i.GetAssignee() } func TestIssueImport_GetClosed(tt *testing.T) { var zeroValue bool i := &IssueImport{Closed: &zeroValue} i.GetClosed() i = &IssueImport{} i.GetClosed() i = nil i.GetClosed() } func TestIssueImport_GetClosedAt(tt *testing.T) { var zeroValue time.Time i := &IssueImport{ClosedAt: &zeroValue} i.GetClosedAt() i = &IssueImport{} i.GetClosedAt() i = nil i.GetClosedAt() } func TestIssueImport_GetCreatedAt(tt *testing.T) { var zeroValue time.Time i := &IssueImport{CreatedAt: &zeroValue} i.GetCreatedAt() i = &IssueImport{} i.GetCreatedAt() i = nil i.GetCreatedAt() } func TestIssueImport_GetMilestone(tt *testing.T) { var zeroValue int i := &IssueImport{Milestone: &zeroValue} i.GetMilestone() i = &IssueImport{} i.GetMilestone() i = nil i.GetMilestone() } func TestIssueImport_GetUpdatedAt(tt *testing.T) { var zeroValue time.Time i := &IssueImport{UpdatedAt: &zeroValue} i.GetUpdatedAt() i = &IssueImport{} i.GetUpdatedAt() i = nil i.GetUpdatedAt() } func TestIssueImportError_GetCode(tt *testing.T) { var zeroValue string i := &IssueImportError{Code: &zeroValue} i.GetCode() i = &IssueImportError{} i.GetCode() i = nil i.GetCode() } func TestIssueImportError_GetField(tt *testing.T) { var zeroValue string i := &IssueImportError{Field: &zeroValue} i.GetField() i = &IssueImportError{} i.GetField() i = nil i.GetField() } func TestIssueImportError_GetLocation(tt *testing.T) { var zeroValue string i := &IssueImportError{Location: &zeroValue} i.GetLocation() i = &IssueImportError{} i.GetLocation() i = nil i.GetLocation() } func TestIssueImportError_GetResource(tt *testing.T) { var zeroValue string i := &IssueImportError{Resource: &zeroValue} i.GetResource() i = &IssueImportError{} i.GetResource() i = nil i.GetResource() } func TestIssueImportError_GetValue(tt *testing.T) { var zeroValue string i := &IssueImportError{Value: &zeroValue} i.GetValue() i = &IssueImportError{} i.GetValue() i = nil i.GetValue() } func TestIssueImportResponse_GetCreatedAt(tt *testing.T) { var zeroValue time.Time i := &IssueImportResponse{CreatedAt: &zeroValue} i.GetCreatedAt() i = &IssueImportResponse{} i.GetCreatedAt() i = nil i.GetCreatedAt() } func TestIssueImportResponse_GetDocumentationURL(tt *testing.T) { var zeroValue string i := &IssueImportResponse{DocumentationURL: &zeroValue} i.GetDocumentationURL() i = &IssueImportResponse{} i.GetDocumentationURL() i = nil i.GetDocumentationURL() } func TestIssueImportResponse_GetID(tt *testing.T) { var zeroValue int i := &IssueImportResponse{ID: &zeroValue} i.GetID() i = &IssueImportResponse{} i.GetID() i = nil i.GetID() } func TestIssueImportResponse_GetImportIssuesURL(tt *testing.T) { var zeroValue string i := &IssueImportResponse{ImportIssuesURL: &zeroValue} i.GetImportIssuesURL() i = &IssueImportResponse{} i.GetImportIssuesURL() i = nil i.GetImportIssuesURL() } func TestIssueImportResponse_GetMessage(tt *testing.T) { var zeroValue string i := &IssueImportResponse{Message: &zeroValue} i.GetMessage() i = &IssueImportResponse{} i.GetMessage() i = nil i.GetMessage() } func TestIssueImportResponse_GetRepositoryURL(tt *testing.T) { var zeroValue string i := &IssueImportResponse{RepositoryURL: &zeroValue} i.GetRepositoryURL() i = &IssueImportResponse{} i.GetRepositoryURL() i = nil i.GetRepositoryURL() } func TestIssueImportResponse_GetStatus(tt *testing.T) { var zeroValue string i := &IssueImportResponse{Status: &zeroValue} i.GetStatus() i = &IssueImportResponse{} i.GetStatus() i = nil i.GetStatus() } func TestIssueImportResponse_GetUpdatedAt(tt *testing.T) { var zeroValue time.Time i := &IssueImportResponse{UpdatedAt: &zeroValue} i.GetUpdatedAt() i = &IssueImportResponse{} i.GetUpdatedAt() i = nil i.GetUpdatedAt() } func TestIssueImportResponse_GetURL(tt *testing.T) { var zeroValue string i := &IssueImportResponse{URL: &zeroValue} i.GetURL() i = &IssueImportResponse{} i.GetURL() i = nil i.GetURL() } func TestIssueListCommentsOptions_GetDirection(tt *testing.T) { var zeroValue string i := &IssueListCommentsOptions{Direction: &zeroValue} i.GetDirection() i = &IssueListCommentsOptions{} i.GetDirection() i = nil i.GetDirection() } func TestIssueListCommentsOptions_GetSince(tt *testing.T) { var zeroValue time.Time i := &IssueListCommentsOptions{Since: &zeroValue} i.GetSince() i = &IssueListCommentsOptions{} i.GetSince() i = nil i.GetSince() } func TestIssueListCommentsOptions_GetSort(tt *testing.T) { var zeroValue string i := &IssueListCommentsOptions{Sort: &zeroValue} i.GetSort() i = &IssueListCommentsOptions{} i.GetSort() i = nil i.GetSort() } func TestIssueRequest_GetAssignee(tt *testing.T) { var zeroValue string i := &IssueRequest{Assignee: &zeroValue} i.GetAssignee() i = &IssueRequest{} i.GetAssignee() i = nil i.GetAssignee() } func TestIssueRequest_GetAssignees(tt *testing.T) { var zeroValue []string i := &IssueRequest{Assignees: &zeroValue} i.GetAssignees() i = &IssueRequest{} i.GetAssignees() i = nil i.GetAssignees() } func TestIssueRequest_GetBody(tt *testing.T) { var zeroValue string i := &IssueRequest{Body: &zeroValue} i.GetBody() i = &IssueRequest{} i.GetBody() i = nil i.GetBody() } func TestIssueRequest_GetLabels(tt *testing.T) { var zeroValue []string i := &IssueRequest{Labels: &zeroValue} i.GetLabels() i = &IssueRequest{} i.GetLabels() i = nil i.GetLabels() } func TestIssueRequest_GetMilestone(tt *testing.T) { var zeroValue int i := &IssueRequest{Milestone: &zeroValue} i.GetMilestone() i = &IssueRequest{} i.GetMilestone() i = nil i.GetMilestone() } func TestIssueRequest_GetState(tt *testing.T) { var zeroValue string i := &IssueRequest{State: &zeroValue} i.GetState() i = &IssueRequest{} i.GetState() i = nil i.GetState() } func TestIssueRequest_GetTitle(tt *testing.T) { var zeroValue string i := &IssueRequest{Title: &zeroValue} i.GetTitle() i = &IssueRequest{} i.GetTitle() i = nil i.GetTitle() } func TestIssuesEvent_GetAction(tt *testing.T) { var zeroValue string i := &IssuesEvent{Action: &zeroValue} i.GetAction() i = &IssuesEvent{} i.GetAction() i = nil i.GetAction() } func TestIssuesEvent_GetAssignee(tt *testing.T) { i := &IssuesEvent{} i.GetAssignee() i = nil i.GetAssignee() } func TestIssuesEvent_GetChanges(tt *testing.T) { i := &IssuesEvent{} i.GetChanges() i = nil i.GetChanges() } func TestIssuesEvent_GetInstallation(tt *testing.T) { i := &IssuesEvent{} i.GetInstallation() i = nil i.GetInstallation() } func TestIssuesEvent_GetIssue(tt *testing.T) { i := &IssuesEvent{} i.GetIssue() i = nil i.GetIssue() } func TestIssuesEvent_GetLabel(tt *testing.T) { i := &IssuesEvent{} i.GetLabel() i = nil i.GetLabel() } func TestIssuesEvent_GetRepo(tt *testing.T) { i := &IssuesEvent{} i.GetRepo() i = nil i.GetRepo() } func TestIssuesEvent_GetSender(tt *testing.T) { i := &IssuesEvent{} i.GetSender() i = nil i.GetSender() } func TestIssuesSearchResult_GetIncompleteResults(tt *testing.T) { var zeroValue bool i := &IssuesSearchResult{IncompleteResults: &zeroValue} i.GetIncompleteResults() i = &IssuesSearchResult{} i.GetIncompleteResults() i = nil i.GetIncompleteResults() } func TestIssuesSearchResult_GetTotal(tt *testing.T) { var zeroValue int i := &IssuesSearchResult{Total: &zeroValue} i.GetTotal() i = &IssuesSearchResult{} i.GetTotal() i = nil i.GetTotal() } func TestIssueStats_GetClosedIssues(tt *testing.T) { var zeroValue int i := &IssueStats{ClosedIssues: &zeroValue} i.GetClosedIssues() i = &IssueStats{} i.GetClosedIssues() i = nil i.GetClosedIssues() } func TestIssueStats_GetOpenIssues(tt *testing.T) { var zeroValue int i := &IssueStats{OpenIssues: &zeroValue} i.GetOpenIssues() i = &IssueStats{} i.GetOpenIssues() i = nil i.GetOpenIssues() } func TestIssueStats_GetTotalIssues(tt *testing.T) { var zeroValue int i := &IssueStats{TotalIssues: &zeroValue} i.GetTotalIssues() i = &IssueStats{} i.GetTotalIssues() i = nil i.GetTotalIssues() } func TestJobs_GetTotalCount(tt *testing.T) { var zeroValue int j := &Jobs{TotalCount: &zeroValue} j.GetTotalCount() j = &Jobs{} j.GetTotalCount() j = nil j.GetTotalCount() } func TestKey_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp k := &Key{CreatedAt: &zeroValue} k.GetCreatedAt() k = &Key{} k.GetCreatedAt() k = nil k.GetCreatedAt() } func TestKey_GetID(tt *testing.T) { var zeroValue int64 k := &Key{ID: &zeroValue} k.GetID() k = &Key{} k.GetID() k = nil k.GetID() } func TestKey_GetKey(tt *testing.T) { var zeroValue string k := &Key{Key: &zeroValue} k.GetKey() k = &Key{} k.GetKey() k = nil k.GetKey() } func TestKey_GetReadOnly(tt *testing.T) { var zeroValue bool k := &Key{ReadOnly: &zeroValue} k.GetReadOnly() k = &Key{} k.GetReadOnly() k = nil k.GetReadOnly() } func TestKey_GetTitle(tt *testing.T) { var zeroValue string k := &Key{Title: &zeroValue} k.GetTitle() k = &Key{} k.GetTitle() k = nil k.GetTitle() } func TestKey_GetURL(tt *testing.T) { var zeroValue string k := &Key{URL: &zeroValue} k.GetURL() k = &Key{} k.GetURL() k = nil k.GetURL() } func TestKey_GetVerified(tt *testing.T) { var zeroValue bool k := &Key{Verified: &zeroValue} k.GetVerified() k = &Key{} k.GetVerified() k = nil k.GetVerified() } func TestLabel_GetColor(tt *testing.T) { var zeroValue string l := &Label{Color: &zeroValue} l.GetColor() l = &Label{} l.GetColor() l = nil l.GetColor() } func TestLabel_GetDefault(tt *testing.T) { var zeroValue bool l := &Label{Default: &zeroValue} l.GetDefault() l = &Label{} l.GetDefault() l = nil l.GetDefault() } func TestLabel_GetDescription(tt *testing.T) { var zeroValue string l := &Label{Description: &zeroValue} l.GetDescription() l = &Label{} l.GetDescription() l = nil l.GetDescription() } func TestLabel_GetID(tt *testing.T) { var zeroValue int64 l := &Label{ID: &zeroValue} l.GetID() l = &Label{} l.GetID() l = nil l.GetID() } func TestLabel_GetName(tt *testing.T) { var zeroValue string l := &Label{Name: &zeroValue} l.GetName() l = &Label{} l.GetName() l = nil l.GetName() } func TestLabel_GetNodeID(tt *testing.T) { var zeroValue string l := &Label{NodeID: &zeroValue} l.GetNodeID() l = &Label{} l.GetNodeID() l = nil l.GetNodeID() } func TestLabel_GetURL(tt *testing.T) { var zeroValue string l := &Label{URL: &zeroValue} l.GetURL() l = &Label{} l.GetURL() l = nil l.GetURL() } func TestLabelEvent_GetAction(tt *testing.T) { var zeroValue string l := &LabelEvent{Action: &zeroValue} l.GetAction() l = &LabelEvent{} l.GetAction() l = nil l.GetAction() } func TestLabelEvent_GetChanges(tt *testing.T) { l := &LabelEvent{} l.GetChanges() l = nil l.GetChanges() } func TestLabelEvent_GetInstallation(tt *testing.T) { l := &LabelEvent{} l.GetInstallation() l = nil l.GetInstallation() } func TestLabelEvent_GetLabel(tt *testing.T) { l := &LabelEvent{} l.GetLabel() l = nil l.GetLabel() } func TestLabelEvent_GetOrg(tt *testing.T) { l := &LabelEvent{} l.GetOrg() l = nil l.GetOrg() } func TestLabelEvent_GetRepo(tt *testing.T) { l := &LabelEvent{} l.GetRepo() l = nil l.GetRepo() } func TestLabelResult_GetColor(tt *testing.T) { var zeroValue string l := &LabelResult{Color: &zeroValue} l.GetColor() l = &LabelResult{} l.GetColor() l = nil l.GetColor() } func TestLabelResult_GetDefault(tt *testing.T) { var zeroValue bool l := &LabelResult{Default: &zeroValue} l.GetDefault() l = &LabelResult{} l.GetDefault() l = nil l.GetDefault() } func TestLabelResult_GetDescription(tt *testing.T) { var zeroValue string l := &LabelResult{Description: &zeroValue} l.GetDescription() l = &LabelResult{} l.GetDescription() l = nil l.GetDescription() } func TestLabelResult_GetID(tt *testing.T) { var zeroValue int64 l := &LabelResult{ID: &zeroValue} l.GetID() l = &LabelResult{} l.GetID() l = nil l.GetID() } func TestLabelResult_GetName(tt *testing.T) { var zeroValue string l := &LabelResult{Name: &zeroValue} l.GetName() l = &LabelResult{} l.GetName() l = nil l.GetName() } func TestLabelResult_GetScore(tt *testing.T) { l := &LabelResult{} l.GetScore() l = nil l.GetScore() } func TestLabelResult_GetURL(tt *testing.T) { var zeroValue string l := &LabelResult{URL: &zeroValue} l.GetURL() l = &LabelResult{} l.GetURL() l = nil l.GetURL() } func TestLabelsSearchResult_GetIncompleteResults(tt *testing.T) { var zeroValue bool l := &LabelsSearchResult{IncompleteResults: &zeroValue} l.GetIncompleteResults() l = &LabelsSearchResult{} l.GetIncompleteResults() l = nil l.GetIncompleteResults() } func TestLabelsSearchResult_GetTotal(tt *testing.T) { var zeroValue int l := &LabelsSearchResult{Total: &zeroValue} l.GetTotal() l = &LabelsSearchResult{} l.GetTotal() l = nil l.GetTotal() } func TestLargeFile_GetOID(tt *testing.T) { var zeroValue string l := &LargeFile{OID: &zeroValue} l.GetOID() l = &LargeFile{} l.GetOID() l = nil l.GetOID() } func TestLargeFile_GetPath(tt *testing.T) { var zeroValue string l := &LargeFile{Path: &zeroValue} l.GetPath() l = &LargeFile{} l.GetPath() l = nil l.GetPath() } func TestLargeFile_GetRefName(tt *testing.T) { var zeroValue string l := &LargeFile{RefName: &zeroValue} l.GetRefName() l = &LargeFile{} l.GetRefName() l = nil l.GetRefName() } func TestLargeFile_GetSize(tt *testing.T) { var zeroValue int l := &LargeFile{Size: &zeroValue} l.GetSize() l = &LargeFile{} l.GetSize() l = nil l.GetSize() } func TestLicense_GetBody(tt *testing.T) { var zeroValue string l := &License{Body: &zeroValue} l.GetBody() l = &License{} l.GetBody() l = nil l.GetBody() } func TestLicense_GetConditions(tt *testing.T) { var zeroValue []string l := &License{Conditions: &zeroValue} l.GetConditions() l = &License{} l.GetConditions() l = nil l.GetConditions() } func TestLicense_GetDescription(tt *testing.T) { var zeroValue string l := &License{Description: &zeroValue} l.GetDescription() l = &License{} l.GetDescription() l = nil l.GetDescription() } func TestLicense_GetFeatured(tt *testing.T) { var zeroValue bool l := &License{Featured: &zeroValue} l.GetFeatured() l = &License{} l.GetFeatured() l = nil l.GetFeatured() } func TestLicense_GetHTMLURL(tt *testing.T) { var zeroValue string l := &License{HTMLURL: &zeroValue} l.GetHTMLURL() l = &License{} l.GetHTMLURL() l = nil l.GetHTMLURL() } func TestLicense_GetImplementation(tt *testing.T) { var zeroValue string l := &License{Implementation: &zeroValue} l.GetImplementation() l = &License{} l.GetImplementation() l = nil l.GetImplementation() } func TestLicense_GetKey(tt *testing.T) { var zeroValue string l := &License{Key: &zeroValue} l.GetKey() l = &License{} l.GetKey() l = nil l.GetKey() } func TestLicense_GetLimitations(tt *testing.T) { var zeroValue []string l := &License{Limitations: &zeroValue} l.GetLimitations() l = &License{} l.GetLimitations() l = nil l.GetLimitations() } func TestLicense_GetName(tt *testing.T) { var zeroValue string l := &License{Name: &zeroValue} l.GetName() l = &License{} l.GetName() l = nil l.GetName() } func TestLicense_GetPermissions(tt *testing.T) { var zeroValue []string l := &License{Permissions: &zeroValue} l.GetPermissions() l = &License{} l.GetPermissions() l = nil l.GetPermissions() } func TestLicense_GetSPDXID(tt *testing.T) { var zeroValue string l := &License{SPDXID: &zeroValue} l.GetSPDXID() l = &License{} l.GetSPDXID() l = nil l.GetSPDXID() } func TestLicense_GetURL(tt *testing.T) { var zeroValue string l := &License{URL: &zeroValue} l.GetURL() l = &License{} l.GetURL() l = nil l.GetURL() } func TestListCheckRunsOptions_GetCheckName(tt *testing.T) { var zeroValue string l := &ListCheckRunsOptions{CheckName: &zeroValue} l.GetCheckName() l = &ListCheckRunsOptions{} l.GetCheckName() l = nil l.GetCheckName() } func TestListCheckRunsOptions_GetFilter(tt *testing.T) { var zeroValue string l := &ListCheckRunsOptions{Filter: &zeroValue} l.GetFilter() l = &ListCheckRunsOptions{} l.GetFilter() l = nil l.GetFilter() } func TestListCheckRunsOptions_GetStatus(tt *testing.T) { var zeroValue string l := &ListCheckRunsOptions{Status: &zeroValue} l.GetStatus() l = &ListCheckRunsOptions{} l.GetStatus() l = nil l.GetStatus() } func TestListCheckRunsResults_GetTotal(tt *testing.T) { var zeroValue int l := &ListCheckRunsResults{Total: &zeroValue} l.GetTotal() l = &ListCheckRunsResults{} l.GetTotal() l = nil l.GetTotal() } func TestListCheckSuiteOptions_GetAppID(tt *testing.T) { var zeroValue int l := &ListCheckSuiteOptions{AppID: &zeroValue} l.GetAppID() l = &ListCheckSuiteOptions{} l.GetAppID() l = nil l.GetAppID() } func TestListCheckSuiteOptions_GetCheckName(tt *testing.T) { var zeroValue string l := &ListCheckSuiteOptions{CheckName: &zeroValue} l.GetCheckName() l = &ListCheckSuiteOptions{} l.GetCheckName() l = nil l.GetCheckName() } func TestListCheckSuiteResults_GetTotal(tt *testing.T) { var zeroValue int l := &ListCheckSuiteResults{Total: &zeroValue} l.GetTotal() l = &ListCheckSuiteResults{} l.GetTotal() l = nil l.GetTotal() } func TestListCollaboratorOptions_GetAffiliation(tt *testing.T) { var zeroValue string l := &ListCollaboratorOptions{Affiliation: &zeroValue} l.GetAffiliation() l = &ListCollaboratorOptions{} l.GetAffiliation() l = nil l.GetAffiliation() } func TestListRepositories_GetTotalCount(tt *testing.T) { var zeroValue int l := &ListRepositories{TotalCount: &zeroValue} l.GetTotalCount() l = &ListRepositories{} l.GetTotalCount() l = nil l.GetTotalCount() } func TestLocation_GetEndColumn(tt *testing.T) { var zeroValue int l := &Location{EndColumn: &zeroValue} l.GetEndColumn() l = &Location{} l.GetEndColumn() l = nil l.GetEndColumn() } func TestLocation_GetEndLine(tt *testing.T) { var zeroValue int l := &Location{EndLine: &zeroValue} l.GetEndLine() l = &Location{} l.GetEndLine() l = nil l.GetEndLine() } func TestLocation_GetPath(tt *testing.T) { var zeroValue string l := &Location{Path: &zeroValue} l.GetPath() l = &Location{} l.GetPath() l = nil l.GetPath() } func TestLocation_GetStartColumn(tt *testing.T) { var zeroValue int l := &Location{StartColumn: &zeroValue} l.GetStartColumn() l = &Location{} l.GetStartColumn() l = nil l.GetStartColumn() } func TestLocation_GetStartLine(tt *testing.T) { var zeroValue int l := &Location{StartLine: &zeroValue} l.GetStartLine() l = &Location{} l.GetStartLine() l = nil l.GetStartLine() } func TestMarketplacePendingChange_GetEffectiveDate(tt *testing.T) { var zeroValue Timestamp m := &MarketplacePendingChange{EffectiveDate: &zeroValue} m.GetEffectiveDate() m = &MarketplacePendingChange{} m.GetEffectiveDate() m = nil m.GetEffectiveDate() } func TestMarketplacePendingChange_GetID(tt *testing.T) { var zeroValue int64 m := &MarketplacePendingChange{ID: &zeroValue} m.GetID() m = &MarketplacePendingChange{} m.GetID() m = nil m.GetID() } func TestMarketplacePendingChange_GetPlan(tt *testing.T) { m := &MarketplacePendingChange{} m.GetPlan() m = nil m.GetPlan() } func TestMarketplacePendingChange_GetUnitCount(tt *testing.T) { var zeroValue int m := &MarketplacePendingChange{UnitCount: &zeroValue} m.GetUnitCount() m = &MarketplacePendingChange{} m.GetUnitCount() m = nil m.GetUnitCount() } func TestMarketplacePlan_GetAccountsURL(tt *testing.T) { var zeroValue string m := &MarketplacePlan{AccountsURL: &zeroValue} m.GetAccountsURL() m = &MarketplacePlan{} m.GetAccountsURL() m = nil m.GetAccountsURL() } func TestMarketplacePlan_GetBullets(tt *testing.T) { var zeroValue []string m := &MarketplacePlan{Bullets: &zeroValue} m.GetBullets() m = &MarketplacePlan{} m.GetBullets() m = nil m.GetBullets() } func TestMarketplacePlan_GetDescription(tt *testing.T) { var zeroValue string m := &MarketplacePlan{Description: &zeroValue} m.GetDescription() m = &MarketplacePlan{} m.GetDescription() m = nil m.GetDescription() } func TestMarketplacePlan_GetHasFreeTrial(tt *testing.T) { var zeroValue bool m := &MarketplacePlan{HasFreeTrial: &zeroValue} m.GetHasFreeTrial() m = &MarketplacePlan{} m.GetHasFreeTrial() m = nil m.GetHasFreeTrial() } func TestMarketplacePlan_GetID(tt *testing.T) { var zeroValue int64 m := &MarketplacePlan{ID: &zeroValue} m.GetID() m = &MarketplacePlan{} m.GetID() m = nil m.GetID() } func TestMarketplacePlan_GetMonthlyPriceInCents(tt *testing.T) { var zeroValue int m := &MarketplacePlan{MonthlyPriceInCents: &zeroValue} m.GetMonthlyPriceInCents() m = &MarketplacePlan{} m.GetMonthlyPriceInCents() m = nil m.GetMonthlyPriceInCents() } func TestMarketplacePlan_GetName(tt *testing.T) { var zeroValue string m := &MarketplacePlan{Name: &zeroValue} m.GetName() m = &MarketplacePlan{} m.GetName() m = nil m.GetName() } func TestMarketplacePlan_GetNumber(tt *testing.T) { var zeroValue int m := &MarketplacePlan{Number: &zeroValue} m.GetNumber() m = &MarketplacePlan{} m.GetNumber() m = nil m.GetNumber() } func TestMarketplacePlan_GetPriceModel(tt *testing.T) { var zeroValue string m := &MarketplacePlan{PriceModel: &zeroValue} m.GetPriceModel() m = &MarketplacePlan{} m.GetPriceModel() m = nil m.GetPriceModel() } func TestMarketplacePlan_GetState(tt *testing.T) { var zeroValue string m := &MarketplacePlan{State: &zeroValue} m.GetState() m = &MarketplacePlan{} m.GetState() m = nil m.GetState() } func TestMarketplacePlan_GetUnitName(tt *testing.T) { var zeroValue string m := &MarketplacePlan{UnitName: &zeroValue} m.GetUnitName() m = &MarketplacePlan{} m.GetUnitName() m = nil m.GetUnitName() } func TestMarketplacePlan_GetURL(tt *testing.T) { var zeroValue string m := &MarketplacePlan{URL: &zeroValue} m.GetURL() m = &MarketplacePlan{} m.GetURL() m = nil m.GetURL() } func TestMarketplacePlan_GetYearlyPriceInCents(tt *testing.T) { var zeroValue int m := &MarketplacePlan{YearlyPriceInCents: &zeroValue} m.GetYearlyPriceInCents() m = &MarketplacePlan{} m.GetYearlyPriceInCents() m = nil m.GetYearlyPriceInCents() } func TestMarketplacePlanAccount_GetID(tt *testing.T) { var zeroValue int64 m := &MarketplacePlanAccount{ID: &zeroValue} m.GetID() m = &MarketplacePlanAccount{} m.GetID() m = nil m.GetID() } func TestMarketplacePlanAccount_GetLogin(tt *testing.T) { var zeroValue string m := &MarketplacePlanAccount{Login: &zeroValue} m.GetLogin() m = &MarketplacePlanAccount{} m.GetLogin() m = nil m.GetLogin() } func TestMarketplacePlanAccount_GetMarketplacePendingChange(tt *testing.T) { m := &MarketplacePlanAccount{} m.GetMarketplacePendingChange() m = nil m.GetMarketplacePendingChange() } func TestMarketplacePlanAccount_GetMarketplacePurchase(tt *testing.T) { m := &MarketplacePlanAccount{} m.GetMarketplacePurchase() m = nil m.GetMarketplacePurchase() } func TestMarketplacePlanAccount_GetOrganizationBillingEmail(tt *testing.T) { var zeroValue string m := &MarketplacePlanAccount{OrganizationBillingEmail: &zeroValue} m.GetOrganizationBillingEmail() m = &MarketplacePlanAccount{} m.GetOrganizationBillingEmail() m = nil m.GetOrganizationBillingEmail() } func TestMarketplacePlanAccount_GetType(tt *testing.T) { var zeroValue string m := &MarketplacePlanAccount{Type: &zeroValue} m.GetType() m = &MarketplacePlanAccount{} m.GetType() m = nil m.GetType() } func TestMarketplacePlanAccount_GetURL(tt *testing.T) { var zeroValue string m := &MarketplacePlanAccount{URL: &zeroValue} m.GetURL() m = &MarketplacePlanAccount{} m.GetURL() m = nil m.GetURL() } func TestMarketplacePurchase_GetBillingCycle(tt *testing.T) { var zeroValue string m := &MarketplacePurchase{BillingCycle: &zeroValue} m.GetBillingCycle() m = &MarketplacePurchase{} m.GetBillingCycle() m = nil m.GetBillingCycle() } func TestMarketplacePurchase_GetFreeTrialEndsOn(tt *testing.T) { var zeroValue Timestamp m := &MarketplacePurchase{FreeTrialEndsOn: &zeroValue} m.GetFreeTrialEndsOn() m = &MarketplacePurchase{} m.GetFreeTrialEndsOn() m = nil m.GetFreeTrialEndsOn() } func TestMarketplacePurchase_GetNextBillingDate(tt *testing.T) { var zeroValue Timestamp m := &MarketplacePurchase{NextBillingDate: &zeroValue} m.GetNextBillingDate() m = &MarketplacePurchase{} m.GetNextBillingDate() m = nil m.GetNextBillingDate() } func TestMarketplacePurchase_GetOnFreeTrial(tt *testing.T) { var zeroValue bool m := &MarketplacePurchase{OnFreeTrial: &zeroValue} m.GetOnFreeTrial() m = &MarketplacePurchase{} m.GetOnFreeTrial() m = nil m.GetOnFreeTrial() } func TestMarketplacePurchase_GetPlan(tt *testing.T) { m := &MarketplacePurchase{} m.GetPlan() m = nil m.GetPlan() } func TestMarketplacePurchase_GetUnitCount(tt *testing.T) { var zeroValue int m := &MarketplacePurchase{UnitCount: &zeroValue} m.GetUnitCount() m = &MarketplacePurchase{} m.GetUnitCount() m = nil m.GetUnitCount() } func TestMarketplacePurchase_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp m := &MarketplacePurchase{UpdatedAt: &zeroValue} m.GetUpdatedAt() m = &MarketplacePurchase{} m.GetUpdatedAt() m = nil m.GetUpdatedAt() } func TestMarketplacePurchaseEvent_GetAction(tt *testing.T) { var zeroValue string m := &MarketplacePurchaseEvent{Action: &zeroValue} m.GetAction() m = &MarketplacePurchaseEvent{} m.GetAction() m = nil m.GetAction() } func TestMarketplacePurchaseEvent_GetEffectiveDate(tt *testing.T) { var zeroValue Timestamp m := &MarketplacePurchaseEvent{EffectiveDate: &zeroValue} m.GetEffectiveDate() m = &MarketplacePurchaseEvent{} m.GetEffectiveDate() m = nil m.GetEffectiveDate() } func TestMarketplacePurchaseEvent_GetInstallation(tt *testing.T) { m := &MarketplacePurchaseEvent{} m.GetInstallation() m = nil m.GetInstallation() } func TestMarketplacePurchaseEvent_GetMarketplacePurchase(tt *testing.T) { m := &MarketplacePurchaseEvent{} m.GetMarketplacePurchase() m = nil m.GetMarketplacePurchase() } func TestMarketplacePurchaseEvent_GetPreviousMarketplacePurchase(tt *testing.T) { m := &MarketplacePurchaseEvent{} m.GetPreviousMarketplacePurchase() m = nil m.GetPreviousMarketplacePurchase() } func TestMarketplacePurchaseEvent_GetSender(tt *testing.T) { m := &MarketplacePurchaseEvent{} m.GetSender() m = nil m.GetSender() } func TestMatch_GetText(tt *testing.T) { var zeroValue string m := &Match{Text: &zeroValue} m.GetText() m = &Match{} m.GetText() m = nil m.GetText() } func TestMemberEvent_GetAction(tt *testing.T) { var zeroValue string m := &MemberEvent{Action: &zeroValue} m.GetAction() m = &MemberEvent{} m.GetAction() m = nil m.GetAction() } func TestMemberEvent_GetInstallation(tt *testing.T) { m := &MemberEvent{} m.GetInstallation() m = nil m.GetInstallation() } func TestMemberEvent_GetMember(tt *testing.T) { m := &MemberEvent{} m.GetMember() m = nil m.GetMember() } func TestMemberEvent_GetRepo(tt *testing.T) { m := &MemberEvent{} m.GetRepo() m = nil m.GetRepo() } func TestMemberEvent_GetSender(tt *testing.T) { m := &MemberEvent{} m.GetSender() m = nil m.GetSender() } func TestMembership_GetOrganization(tt *testing.T) { m := &Membership{} m.GetOrganization() m = nil m.GetOrganization() } func TestMembership_GetOrganizationURL(tt *testing.T) { var zeroValue string m := &Membership{OrganizationURL: &zeroValue} m.GetOrganizationURL() m = &Membership{} m.GetOrganizationURL() m = nil m.GetOrganizationURL() } func TestMembership_GetRole(tt *testing.T) { var zeroValue string m := &Membership{Role: &zeroValue} m.GetRole() m = &Membership{} m.GetRole() m = nil m.GetRole() } func TestMembership_GetState(tt *testing.T) { var zeroValue string m := &Membership{State: &zeroValue} m.GetState() m = &Membership{} m.GetState() m = nil m.GetState() } func TestMembership_GetURL(tt *testing.T) { var zeroValue string m := &Membership{URL: &zeroValue} m.GetURL() m = &Membership{} m.GetURL() m = nil m.GetURL() } func TestMembership_GetUser(tt *testing.T) { m := &Membership{} m.GetUser() m = nil m.GetUser() } func TestMembershipEvent_GetAction(tt *testing.T) { var zeroValue string m := &MembershipEvent{Action: &zeroValue} m.GetAction() m = &MembershipEvent{} m.GetAction() m = nil m.GetAction() } func TestMembershipEvent_GetInstallation(tt *testing.T) { m := &MembershipEvent{} m.GetInstallation() m = nil m.GetInstallation() } func TestMembershipEvent_GetMember(tt *testing.T) { m := &MembershipEvent{} m.GetMember() m = nil m.GetMember() } func TestMembershipEvent_GetOrg(tt *testing.T) { m := &MembershipEvent{} m.GetOrg() m = nil m.GetOrg() } func TestMembershipEvent_GetScope(tt *testing.T) { var zeroValue string m := &MembershipEvent{Scope: &zeroValue} m.GetScope() m = &MembershipEvent{} m.GetScope() m = nil m.GetScope() } func TestMembershipEvent_GetSender(tt *testing.T) { m := &MembershipEvent{} m.GetSender() m = nil m.GetSender() } func TestMembershipEvent_GetTeam(tt *testing.T) { m := &MembershipEvent{} m.GetTeam() m = nil m.GetTeam() } func TestMessage_GetText(tt *testing.T) { var zeroValue string m := &Message{Text: &zeroValue} m.GetText() m = &Message{} m.GetText() m = nil m.GetText() } func TestMetaEvent_GetAction(tt *testing.T) { var zeroValue string m := &MetaEvent{Action: &zeroValue} m.GetAction() m = &MetaEvent{} m.GetAction() m = nil m.GetAction() } func TestMetaEvent_GetHook(tt *testing.T) { m := &MetaEvent{} m.GetHook() m = nil m.GetHook() } func TestMetaEvent_GetHookID(tt *testing.T) { var zeroValue int64 m := &MetaEvent{HookID: &zeroValue} m.GetHookID() m = &MetaEvent{} m.GetHookID() m = nil m.GetHookID() } func TestMetric_GetHTMLURL(tt *testing.T) { var zeroValue string m := &Metric{HTMLURL: &zeroValue} m.GetHTMLURL() m = &Metric{} m.GetHTMLURL() m = nil m.GetHTMLURL() } func TestMetric_GetKey(tt *testing.T) { var zeroValue string m := &Metric{Key: &zeroValue} m.GetKey() m = &Metric{} m.GetKey() m = nil m.GetKey() } func TestMetric_GetName(tt *testing.T) { var zeroValue string m := &Metric{Name: &zeroValue} m.GetName() m = &Metric{} m.GetName() m = nil m.GetName() } func TestMetric_GetURL(tt *testing.T) { var zeroValue string m := &Metric{URL: &zeroValue} m.GetURL() m = &Metric{} m.GetURL() m = nil m.GetURL() } func TestMigration_GetCreatedAt(tt *testing.T) { var zeroValue string m := &Migration{CreatedAt: &zeroValue} m.GetCreatedAt() m = &Migration{} m.GetCreatedAt() m = nil m.GetCreatedAt() } func TestMigration_GetExcludeAttachments(tt *testing.T) { var zeroValue bool m := &Migration{ExcludeAttachments: &zeroValue} m.GetExcludeAttachments() m = &Migration{} m.GetExcludeAttachments() m = nil m.GetExcludeAttachments() } func TestMigration_GetGUID(tt *testing.T) { var zeroValue string m := &Migration{GUID: &zeroValue} m.GetGUID() m = &Migration{} m.GetGUID() m = nil m.GetGUID() } func TestMigration_GetID(tt *testing.T) { var zeroValue int64 m := &Migration{ID: &zeroValue} m.GetID() m = &Migration{} m.GetID() m = nil m.GetID() } func TestMigration_GetLockRepositories(tt *testing.T) { var zeroValue bool m := &Migration{LockRepositories: &zeroValue} m.GetLockRepositories() m = &Migration{} m.GetLockRepositories() m = nil m.GetLockRepositories() } func TestMigration_GetState(tt *testing.T) { var zeroValue string m := &Migration{State: &zeroValue} m.GetState() m = &Migration{} m.GetState() m = nil m.GetState() } func TestMigration_GetUpdatedAt(tt *testing.T) { var zeroValue string m := &Migration{UpdatedAt: &zeroValue} m.GetUpdatedAt() m = &Migration{} m.GetUpdatedAt() m = nil m.GetUpdatedAt() } func TestMigration_GetURL(tt *testing.T) { var zeroValue string m := &Migration{URL: &zeroValue} m.GetURL() m = &Migration{} m.GetURL() m = nil m.GetURL() } func TestMilestone_GetClosedAt(tt *testing.T) { var zeroValue time.Time m := &Milestone{ClosedAt: &zeroValue} m.GetClosedAt() m = &Milestone{} m.GetClosedAt() m = nil m.GetClosedAt() } func TestMilestone_GetClosedIssues(tt *testing.T) { var zeroValue int m := &Milestone{ClosedIssues: &zeroValue} m.GetClosedIssues() m = &Milestone{} m.GetClosedIssues() m = nil m.GetClosedIssues() } func TestMilestone_GetCreatedAt(tt *testing.T) { var zeroValue time.Time m := &Milestone{CreatedAt: &zeroValue} m.GetCreatedAt() m = &Milestone{} m.GetCreatedAt() m = nil m.GetCreatedAt() } func TestMilestone_GetCreator(tt *testing.T) { m := &Milestone{} m.GetCreator() m = nil m.GetCreator() } func TestMilestone_GetDescription(tt *testing.T) { var zeroValue string m := &Milestone{Description: &zeroValue} m.GetDescription() m = &Milestone{} m.GetDescription() m = nil m.GetDescription() } func TestMilestone_GetDueOn(tt *testing.T) { var zeroValue time.Time m := &Milestone{DueOn: &zeroValue} m.GetDueOn() m = &Milestone{} m.GetDueOn() m = nil m.GetDueOn() } func TestMilestone_GetHTMLURL(tt *testing.T) { var zeroValue string m := &Milestone{HTMLURL: &zeroValue} m.GetHTMLURL() m = &Milestone{} m.GetHTMLURL() m = nil m.GetHTMLURL() } func TestMilestone_GetID(tt *testing.T) { var zeroValue int64 m := &Milestone{ID: &zeroValue} m.GetID() m = &Milestone{} m.GetID() m = nil m.GetID() } func TestMilestone_GetLabelsURL(tt *testing.T) { var zeroValue string m := &Milestone{LabelsURL: &zeroValue} m.GetLabelsURL() m = &Milestone{} m.GetLabelsURL() m = nil m.GetLabelsURL() } func TestMilestone_GetNodeID(tt *testing.T) { var zeroValue string m := &Milestone{NodeID: &zeroValue} m.GetNodeID() m = &Milestone{} m.GetNodeID() m = nil m.GetNodeID() } func TestMilestone_GetNumber(tt *testing.T) { var zeroValue int m := &Milestone{Number: &zeroValue} m.GetNumber() m = &Milestone{} m.GetNumber() m = nil m.GetNumber() } func TestMilestone_GetOpenIssues(tt *testing.T) { var zeroValue int m := &Milestone{OpenIssues: &zeroValue} m.GetOpenIssues() m = &Milestone{} m.GetOpenIssues() m = nil m.GetOpenIssues() } func TestMilestone_GetState(tt *testing.T) { var zeroValue string m := &Milestone{State: &zeroValue} m.GetState() m = &Milestone{} m.GetState() m = nil m.GetState() } func TestMilestone_GetTitle(tt *testing.T) { var zeroValue string m := &Milestone{Title: &zeroValue} m.GetTitle() m = &Milestone{} m.GetTitle() m = nil m.GetTitle() } func TestMilestone_GetUpdatedAt(tt *testing.T) { var zeroValue time.Time m := &Milestone{UpdatedAt: &zeroValue} m.GetUpdatedAt() m = &Milestone{} m.GetUpdatedAt() m = nil m.GetUpdatedAt() } func TestMilestone_GetURL(tt *testing.T) { var zeroValue string m := &Milestone{URL: &zeroValue} m.GetURL() m = &Milestone{} m.GetURL() m = nil m.GetURL() } func TestMilestoneEvent_GetAction(tt *testing.T) { var zeroValue string m := &MilestoneEvent{Action: &zeroValue} m.GetAction() m = &MilestoneEvent{} m.GetAction() m = nil m.GetAction() } func TestMilestoneEvent_GetChanges(tt *testing.T) { m := &MilestoneEvent{} m.GetChanges() m = nil m.GetChanges() } func TestMilestoneEvent_GetInstallation(tt *testing.T) { m := &MilestoneEvent{} m.GetInstallation() m = nil m.GetInstallation() } func TestMilestoneEvent_GetMilestone(tt *testing.T) { m := &MilestoneEvent{} m.GetMilestone() m = nil m.GetMilestone() } func TestMilestoneEvent_GetOrg(tt *testing.T) { m := &MilestoneEvent{} m.GetOrg() m = nil m.GetOrg() } func TestMilestoneEvent_GetRepo(tt *testing.T) { m := &MilestoneEvent{} m.GetRepo() m = nil m.GetRepo() } func TestMilestoneEvent_GetSender(tt *testing.T) { m := &MilestoneEvent{} m.GetSender() m = nil m.GetSender() } func TestMilestoneStats_GetClosedMilestones(tt *testing.T) { var zeroValue int m := &MilestoneStats{ClosedMilestones: &zeroValue} m.GetClosedMilestones() m = &MilestoneStats{} m.GetClosedMilestones() m = nil m.GetClosedMilestones() } func TestMilestoneStats_GetOpenMilestones(tt *testing.T) { var zeroValue int m := &MilestoneStats{OpenMilestones: &zeroValue} m.GetOpenMilestones() m = &MilestoneStats{} m.GetOpenMilestones() m = nil m.GetOpenMilestones() } func TestMilestoneStats_GetTotalMilestones(tt *testing.T) { var zeroValue int m := &MilestoneStats{TotalMilestones: &zeroValue} m.GetTotalMilestones() m = &MilestoneStats{} m.GetTotalMilestones() m = nil m.GetTotalMilestones() } func TestMostRecentInstance_GetAnalysisKey(tt *testing.T) { var zeroValue string m := &MostRecentInstance{AnalysisKey: &zeroValue} m.GetAnalysisKey() m = &MostRecentInstance{} m.GetAnalysisKey() m = nil m.GetAnalysisKey() } func TestMostRecentInstance_GetCommitSHA(tt *testing.T) { var zeroValue string m := &MostRecentInstance{CommitSHA: &zeroValue} m.GetCommitSHA() m = &MostRecentInstance{} m.GetCommitSHA() m = nil m.GetCommitSHA() } func TestMostRecentInstance_GetEnvironment(tt *testing.T) { var zeroValue string m := &MostRecentInstance{Environment: &zeroValue} m.GetEnvironment() m = &MostRecentInstance{} m.GetEnvironment() m = nil m.GetEnvironment() } func TestMostRecentInstance_GetLocation(tt *testing.T) { m := &MostRecentInstance{} m.GetLocation() m = nil m.GetLocation() } func TestMostRecentInstance_GetMessage(tt *testing.T) { m := &MostRecentInstance{} m.GetMessage() m = nil m.GetMessage() } func TestMostRecentInstance_GetRef(tt *testing.T) { var zeroValue string m := &MostRecentInstance{Ref: &zeroValue} m.GetRef() m = &MostRecentInstance{} m.GetRef() m = nil m.GetRef() } func TestMostRecentInstance_GetState(tt *testing.T) { var zeroValue string m := &MostRecentInstance{State: &zeroValue} m.GetState() m = &MostRecentInstance{} m.GetState() m = nil m.GetState() } func TestNewPullRequest_GetBase(tt *testing.T) { var zeroValue string n := &NewPullRequest{Base: &zeroValue} n.GetBase() n = &NewPullRequest{} n.GetBase() n = nil n.GetBase() } func TestNewPullRequest_GetBody(tt *testing.T) { var zeroValue string n := &NewPullRequest{Body: &zeroValue} n.GetBody() n = &NewPullRequest{} n.GetBody() n = nil n.GetBody() } func TestNewPullRequest_GetDraft(tt *testing.T) { var zeroValue bool n := &NewPullRequest{Draft: &zeroValue} n.GetDraft() n = &NewPullRequest{} n.GetDraft() n = nil n.GetDraft() } func TestNewPullRequest_GetHead(tt *testing.T) { var zeroValue string n := &NewPullRequest{Head: &zeroValue} n.GetHead() n = &NewPullRequest{} n.GetHead() n = nil n.GetHead() } func TestNewPullRequest_GetIssue(tt *testing.T) { var zeroValue int n := &NewPullRequest{Issue: &zeroValue} n.GetIssue() n = &NewPullRequest{} n.GetIssue() n = nil n.GetIssue() } func TestNewPullRequest_GetMaintainerCanModify(tt *testing.T) { var zeroValue bool n := &NewPullRequest{MaintainerCanModify: &zeroValue} n.GetMaintainerCanModify() n = &NewPullRequest{} n.GetMaintainerCanModify() n = nil n.GetMaintainerCanModify() } func TestNewPullRequest_GetTitle(tt *testing.T) { var zeroValue string n := &NewPullRequest{Title: &zeroValue} n.GetTitle() n = &NewPullRequest{} n.GetTitle() n = nil n.GetTitle() } func TestNewTeam_GetDescription(tt *testing.T) { var zeroValue string n := &NewTeam{Description: &zeroValue} n.GetDescription() n = &NewTeam{} n.GetDescription() n = nil n.GetDescription() } func TestNewTeam_GetLDAPDN(tt *testing.T) { var zeroValue string n := &NewTeam{LDAPDN: &zeroValue} n.GetLDAPDN() n = &NewTeam{} n.GetLDAPDN() n = nil n.GetLDAPDN() } func TestNewTeam_GetParentTeamID(tt *testing.T) { var zeroValue int64 n := &NewTeam{ParentTeamID: &zeroValue} n.GetParentTeamID() n = &NewTeam{} n.GetParentTeamID() n = nil n.GetParentTeamID() } func TestNewTeam_GetPermission(tt *testing.T) { var zeroValue string n := &NewTeam{Permission: &zeroValue} n.GetPermission() n = &NewTeam{} n.GetPermission() n = nil n.GetPermission() } func TestNewTeam_GetPrivacy(tt *testing.T) { var zeroValue string n := &NewTeam{Privacy: &zeroValue} n.GetPrivacy() n = &NewTeam{} n.GetPrivacy() n = nil n.GetPrivacy() } func TestNotification_GetID(tt *testing.T) { var zeroValue string n := &Notification{ID: &zeroValue} n.GetID() n = &Notification{} n.GetID() n = nil n.GetID() } func TestNotification_GetLastReadAt(tt *testing.T) { var zeroValue time.Time n := &Notification{LastReadAt: &zeroValue} n.GetLastReadAt() n = &Notification{} n.GetLastReadAt() n = nil n.GetLastReadAt() } func TestNotification_GetReason(tt *testing.T) { var zeroValue string n := &Notification{Reason: &zeroValue} n.GetReason() n = &Notification{} n.GetReason() n = nil n.GetReason() } func TestNotification_GetRepository(tt *testing.T) { n := &Notification{} n.GetRepository() n = nil n.GetRepository() } func TestNotification_GetSubject(tt *testing.T) { n := &Notification{} n.GetSubject() n = nil n.GetSubject() } func TestNotification_GetUnread(tt *testing.T) { var zeroValue bool n := &Notification{Unread: &zeroValue} n.GetUnread() n = &Notification{} n.GetUnread() n = nil n.GetUnread() } func TestNotification_GetUpdatedAt(tt *testing.T) { var zeroValue time.Time n := &Notification{UpdatedAt: &zeroValue} n.GetUpdatedAt() n = &Notification{} n.GetUpdatedAt() n = nil n.GetUpdatedAt() } func TestNotification_GetURL(tt *testing.T) { var zeroValue string n := &Notification{URL: &zeroValue} n.GetURL() n = &Notification{} n.GetURL() n = nil n.GetURL() } func TestNotificationSubject_GetLatestCommentURL(tt *testing.T) { var zeroValue string n := &NotificationSubject{LatestCommentURL: &zeroValue} n.GetLatestCommentURL() n = &NotificationSubject{} n.GetLatestCommentURL() n = nil n.GetLatestCommentURL() } func TestNotificationSubject_GetTitle(tt *testing.T) { var zeroValue string n := &NotificationSubject{Title: &zeroValue} n.GetTitle() n = &NotificationSubject{} n.GetTitle() n = nil n.GetTitle() } func TestNotificationSubject_GetType(tt *testing.T) { var zeroValue string n := &NotificationSubject{Type: &zeroValue} n.GetType() n = &NotificationSubject{} n.GetType() n = nil n.GetType() } func TestNotificationSubject_GetURL(tt *testing.T) { var zeroValue string n := &NotificationSubject{URL: &zeroValue} n.GetURL() n = &NotificationSubject{} n.GetURL() n = nil n.GetURL() } func TestOAuthAPP_GetClientID(tt *testing.T) { var zeroValue string o := &OAuthAPP{ClientID: &zeroValue} o.GetClientID() o = &OAuthAPP{} o.GetClientID() o = nil o.GetClientID() } func TestOAuthAPP_GetName(tt *testing.T) { var zeroValue string o := &OAuthAPP{Name: &zeroValue} o.GetName() o = &OAuthAPP{} o.GetName() o = nil o.GetName() } func TestOAuthAPP_GetURL(tt *testing.T) { var zeroValue string o := &OAuthAPP{URL: &zeroValue} o.GetURL() o = &OAuthAPP{} o.GetURL() o = nil o.GetURL() } func TestOrganization_GetAvatarURL(tt *testing.T) { var zeroValue string o := &Organization{AvatarURL: &zeroValue} o.GetAvatarURL() o = &Organization{} o.GetAvatarURL() o = nil o.GetAvatarURL() } func TestOrganization_GetBillingEmail(tt *testing.T) { var zeroValue string o := &Organization{BillingEmail: &zeroValue} o.GetBillingEmail() o = &Organization{} o.GetBillingEmail() o = nil o.GetBillingEmail() } func TestOrganization_GetBlog(tt *testing.T) { var zeroValue string o := &Organization{Blog: &zeroValue} o.GetBlog() o = &Organization{} o.GetBlog() o = nil o.GetBlog() } func TestOrganization_GetCollaborators(tt *testing.T) { var zeroValue int o := &Organization{Collaborators: &zeroValue} o.GetCollaborators() o = &Organization{} o.GetCollaborators() o = nil o.GetCollaborators() } func TestOrganization_GetCompany(tt *testing.T) { var zeroValue string o := &Organization{Company: &zeroValue} o.GetCompany() o = &Organization{} o.GetCompany() o = nil o.GetCompany() } func TestOrganization_GetCreatedAt(tt *testing.T) { var zeroValue time.Time o := &Organization{CreatedAt: &zeroValue} o.GetCreatedAt() o = &Organization{} o.GetCreatedAt() o = nil o.GetCreatedAt() } func TestOrganization_GetDefaultRepoPermission(tt *testing.T) { var zeroValue string o := &Organization{DefaultRepoPermission: &zeroValue} o.GetDefaultRepoPermission() o = &Organization{} o.GetDefaultRepoPermission() o = nil o.GetDefaultRepoPermission() } func TestOrganization_GetDefaultRepoSettings(tt *testing.T) { var zeroValue string o := &Organization{DefaultRepoSettings: &zeroValue} o.GetDefaultRepoSettings() o = &Organization{} o.GetDefaultRepoSettings() o = nil o.GetDefaultRepoSettings() } func TestOrganization_GetDescription(tt *testing.T) { var zeroValue string o := &Organization{Description: &zeroValue} o.GetDescription() o = &Organization{} o.GetDescription() o = nil o.GetDescription() } func TestOrganization_GetDiskUsage(tt *testing.T) { var zeroValue int o := &Organization{DiskUsage: &zeroValue} o.GetDiskUsage() o = &Organization{} o.GetDiskUsage() o = nil o.GetDiskUsage() } func TestOrganization_GetEmail(tt *testing.T) { var zeroValue string o := &Organization{Email: &zeroValue} o.GetEmail() o = &Organization{} o.GetEmail() o = nil o.GetEmail() } func TestOrganization_GetEventsURL(tt *testing.T) { var zeroValue string o := &Organization{EventsURL: &zeroValue} o.GetEventsURL() o = &Organization{} o.GetEventsURL() o = nil o.GetEventsURL() } func TestOrganization_GetFollowers(tt *testing.T) { var zeroValue int o := &Organization{Followers: &zeroValue} o.GetFollowers() o = &Organization{} o.GetFollowers() o = nil o.GetFollowers() } func TestOrganization_GetFollowing(tt *testing.T) { var zeroValue int o := &Organization{Following: &zeroValue} o.GetFollowing() o = &Organization{} o.GetFollowing() o = nil o.GetFollowing() } func TestOrganization_GetHasOrganizationProjects(tt *testing.T) { var zeroValue bool o := &Organization{HasOrganizationProjects: &zeroValue} o.GetHasOrganizationProjects() o = &Organization{} o.GetHasOrganizationProjects() o = nil o.GetHasOrganizationProjects() } func TestOrganization_GetHasRepositoryProjects(tt *testing.T) { var zeroValue bool o := &Organization{HasRepositoryProjects: &zeroValue} o.GetHasRepositoryProjects() o = &Organization{} o.GetHasRepositoryProjects() o = nil o.GetHasRepositoryProjects() } func TestOrganization_GetHooksURL(tt *testing.T) { var zeroValue string o := &Organization{HooksURL: &zeroValue} o.GetHooksURL() o = &Organization{} o.GetHooksURL() o = nil o.GetHooksURL() } func TestOrganization_GetHTMLURL(tt *testing.T) { var zeroValue string o := &Organization{HTMLURL: &zeroValue} o.GetHTMLURL() o = &Organization{} o.GetHTMLURL() o = nil o.GetHTMLURL() } func TestOrganization_GetID(tt *testing.T) { var zeroValue int64 o := &Organization{ID: &zeroValue} o.GetID() o = &Organization{} o.GetID() o = nil o.GetID() } func TestOrganization_GetIssuesURL(tt *testing.T) { var zeroValue string o := &Organization{IssuesURL: &zeroValue} o.GetIssuesURL() o = &Organization{} o.GetIssuesURL() o = nil o.GetIssuesURL() } func TestOrganization_GetIsVerified(tt *testing.T) { var zeroValue bool o := &Organization{IsVerified: &zeroValue} o.GetIsVerified() o = &Organization{} o.GetIsVerified() o = nil o.GetIsVerified() } func TestOrganization_GetLocation(tt *testing.T) { var zeroValue string o := &Organization{Location: &zeroValue} o.GetLocation() o = &Organization{} o.GetLocation() o = nil o.GetLocation() } func TestOrganization_GetLogin(tt *testing.T) { var zeroValue string o := &Organization{Login: &zeroValue} o.GetLogin() o = &Organization{} o.GetLogin() o = nil o.GetLogin() } func TestOrganization_GetMembersAllowedRepositoryCreationType(tt *testing.T) { var zeroValue string o := &Organization{MembersAllowedRepositoryCreationType: &zeroValue} o.GetMembersAllowedRepositoryCreationType() o = &Organization{} o.GetMembersAllowedRepositoryCreationType() o = nil o.GetMembersAllowedRepositoryCreationType() } func TestOrganization_GetMembersCanCreateInternalRepos(tt *testing.T) { var zeroValue bool o := &Organization{MembersCanCreateInternalRepos: &zeroValue} o.GetMembersCanCreateInternalRepos() o = &Organization{} o.GetMembersCanCreateInternalRepos() o = nil o.GetMembersCanCreateInternalRepos() } func TestOrganization_GetMembersCanCreatePages(tt *testing.T) { var zeroValue bool o := &Organization{MembersCanCreatePages: &zeroValue} o.GetMembersCanCreatePages() o = &Organization{} o.GetMembersCanCreatePages() o = nil o.GetMembersCanCreatePages() } func TestOrganization_GetMembersCanCreatePrivatePages(tt *testing.T) { var zeroValue bool o := &Organization{MembersCanCreatePrivatePages: &zeroValue} o.GetMembersCanCreatePrivatePages() o = &Organization{} o.GetMembersCanCreatePrivatePages() o = nil o.GetMembersCanCreatePrivatePages() } func TestOrganization_GetMembersCanCreatePrivateRepos(tt *testing.T) { var zeroValue bool o := &Organization{MembersCanCreatePrivateRepos: &zeroValue} o.GetMembersCanCreatePrivateRepos() o = &Organization{} o.GetMembersCanCreatePrivateRepos() o = nil o.GetMembersCanCreatePrivateRepos() } func TestOrganization_GetMembersCanCreatePublicPages(tt *testing.T) { var zeroValue bool o := &Organization{MembersCanCreatePublicPages: &zeroValue} o.GetMembersCanCreatePublicPages() o = &Organization{} o.GetMembersCanCreatePublicPages() o = nil o.GetMembersCanCreatePublicPages() } func TestOrganization_GetMembersCanCreatePublicRepos(tt *testing.T) { var zeroValue bool o := &Organization{MembersCanCreatePublicRepos: &zeroValue} o.GetMembersCanCreatePublicRepos() o = &Organization{} o.GetMembersCanCreatePublicRepos() o = nil o.GetMembersCanCreatePublicRepos() } func TestOrganization_GetMembersCanCreateRepos(tt *testing.T) { var zeroValue bool o := &Organization{MembersCanCreateRepos: &zeroValue} o.GetMembersCanCreateRepos() o = &Organization{} o.GetMembersCanCreateRepos() o = nil o.GetMembersCanCreateRepos() } func TestOrganization_GetMembersURL(tt *testing.T) { var zeroValue string o := &Organization{MembersURL: &zeroValue} o.GetMembersURL() o = &Organization{} o.GetMembersURL() o = nil o.GetMembersURL() } func TestOrganization_GetName(tt *testing.T) { var zeroValue string o := &Organization{Name: &zeroValue} o.GetName() o = &Organization{} o.GetName() o = nil o.GetName() } func TestOrganization_GetNodeID(tt *testing.T) { var zeroValue string o := &Organization{NodeID: &zeroValue} o.GetNodeID() o = &Organization{} o.GetNodeID() o = nil o.GetNodeID() } func TestOrganization_GetOwnedPrivateRepos(tt *testing.T) { var zeroValue int o := &Organization{OwnedPrivateRepos: &zeroValue} o.GetOwnedPrivateRepos() o = &Organization{} o.GetOwnedPrivateRepos() o = nil o.GetOwnedPrivateRepos() } func TestOrganization_GetPlan(tt *testing.T) { o := &Organization{} o.GetPlan() o = nil o.GetPlan() } func TestOrganization_GetPrivateGists(tt *testing.T) { var zeroValue int o := &Organization{PrivateGists: &zeroValue} o.GetPrivateGists() o = &Organization{} o.GetPrivateGists() o = nil o.GetPrivateGists() } func TestOrganization_GetPublicGists(tt *testing.T) { var zeroValue int o := &Organization{PublicGists: &zeroValue} o.GetPublicGists() o = &Organization{} o.GetPublicGists() o = nil o.GetPublicGists() } func TestOrganization_GetPublicMembersURL(tt *testing.T) { var zeroValue string o := &Organization{PublicMembersURL: &zeroValue} o.GetPublicMembersURL() o = &Organization{} o.GetPublicMembersURL() o = nil o.GetPublicMembersURL() } func TestOrganization_GetPublicRepos(tt *testing.T) { var zeroValue int o := &Organization{PublicRepos: &zeroValue} o.GetPublicRepos() o = &Organization{} o.GetPublicRepos() o = nil o.GetPublicRepos() } func TestOrganization_GetReposURL(tt *testing.T) { var zeroValue string o := &Organization{ReposURL: &zeroValue} o.GetReposURL() o = &Organization{} o.GetReposURL() o = nil o.GetReposURL() } func TestOrganization_GetTotalPrivateRepos(tt *testing.T) { var zeroValue int o := &Organization{TotalPrivateRepos: &zeroValue} o.GetTotalPrivateRepos() o = &Organization{} o.GetTotalPrivateRepos() o = nil o.GetTotalPrivateRepos() } func TestOrganization_GetTwitterUsername(tt *testing.T) { var zeroValue string o := &Organization{TwitterUsername: &zeroValue} o.GetTwitterUsername() o = &Organization{} o.GetTwitterUsername() o = nil o.GetTwitterUsername() } func TestOrganization_GetTwoFactorRequirementEnabled(tt *testing.T) { var zeroValue bool o := &Organization{TwoFactorRequirementEnabled: &zeroValue} o.GetTwoFactorRequirementEnabled() o = &Organization{} o.GetTwoFactorRequirementEnabled() o = nil o.GetTwoFactorRequirementEnabled() } func TestOrganization_GetType(tt *testing.T) { var zeroValue string o := &Organization{Type: &zeroValue} o.GetType() o = &Organization{} o.GetType() o = nil o.GetType() } func TestOrganization_GetUpdatedAt(tt *testing.T) { var zeroValue time.Time o := &Organization{UpdatedAt: &zeroValue} o.GetUpdatedAt() o = &Organization{} o.GetUpdatedAt() o = nil o.GetUpdatedAt() } func TestOrganization_GetURL(tt *testing.T) { var zeroValue string o := &Organization{URL: &zeroValue} o.GetURL() o = &Organization{} o.GetURL() o = nil o.GetURL() } func TestOrganizationEvent_GetAction(tt *testing.T) { var zeroValue string o := &OrganizationEvent{Action: &zeroValue} o.GetAction() o = &OrganizationEvent{} o.GetAction() o = nil o.GetAction() } func TestOrganizationEvent_GetInstallation(tt *testing.T) { o := &OrganizationEvent{} o.GetInstallation() o = nil o.GetInstallation() } func TestOrganizationEvent_GetInvitation(tt *testing.T) { o := &OrganizationEvent{} o.GetInvitation() o = nil o.GetInvitation() } func TestOrganizationEvent_GetMembership(tt *testing.T) { o := &OrganizationEvent{} o.GetMembership() o = nil o.GetMembership() } func TestOrganizationEvent_GetOrganization(tt *testing.T) { o := &OrganizationEvent{} o.GetOrganization() o = nil o.GetOrganization() } func TestOrganizationEvent_GetSender(tt *testing.T) { o := &OrganizationEvent{} o.GetSender() o = nil o.GetSender() } func TestOrganizationInstallations_GetTotalCount(tt *testing.T) { var zeroValue int o := &OrganizationInstallations{TotalCount: &zeroValue} o.GetTotalCount() o = &OrganizationInstallations{} o.GetTotalCount() o = nil o.GetTotalCount() } func TestOrgBlockEvent_GetAction(tt *testing.T) { var zeroValue string o := &OrgBlockEvent{Action: &zeroValue} o.GetAction() o = &OrgBlockEvent{} o.GetAction() o = nil o.GetAction() } func TestOrgBlockEvent_GetBlockedUser(tt *testing.T) { o := &OrgBlockEvent{} o.GetBlockedUser() o = nil o.GetBlockedUser() } func TestOrgBlockEvent_GetInstallation(tt *testing.T) { o := &OrgBlockEvent{} o.GetInstallation() o = nil o.GetInstallation() } func TestOrgBlockEvent_GetOrganization(tt *testing.T) { o := &OrgBlockEvent{} o.GetOrganization() o = nil o.GetOrganization() } func TestOrgBlockEvent_GetSender(tt *testing.T) { o := &OrgBlockEvent{} o.GetSender() o = nil o.GetSender() } func TestOrgStats_GetDisabledOrgs(tt *testing.T) { var zeroValue int o := &OrgStats{DisabledOrgs: &zeroValue} o.GetDisabledOrgs() o = &OrgStats{} o.GetDisabledOrgs() o = nil o.GetDisabledOrgs() } func TestOrgStats_GetTotalOrgs(tt *testing.T) { var zeroValue int o := &OrgStats{TotalOrgs: &zeroValue} o.GetTotalOrgs() o = &OrgStats{} o.GetTotalOrgs() o = nil o.GetTotalOrgs() } func TestOrgStats_GetTotalTeamMembers(tt *testing.T) { var zeroValue int o := &OrgStats{TotalTeamMembers: &zeroValue} o.GetTotalTeamMembers() o = &OrgStats{} o.GetTotalTeamMembers() o = nil o.GetTotalTeamMembers() } func TestOrgStats_GetTotalTeams(tt *testing.T) { var zeroValue int o := &OrgStats{TotalTeams: &zeroValue} o.GetTotalTeams() o = &OrgStats{} o.GetTotalTeams() o = nil o.GetTotalTeams() } func TestPackage_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp p := &Package{CreatedAt: &zeroValue} p.GetCreatedAt() p = &Package{} p.GetCreatedAt() p = nil p.GetCreatedAt() } func TestPackage_GetHTMLURL(tt *testing.T) { var zeroValue string p := &Package{HTMLURL: &zeroValue} p.GetHTMLURL() p = &Package{} p.GetHTMLURL() p = nil p.GetHTMLURL() } func TestPackage_GetID(tt *testing.T) { var zeroValue int64 p := &Package{ID: &zeroValue} p.GetID() p = &Package{} p.GetID() p = nil p.GetID() } func TestPackage_GetName(tt *testing.T) { var zeroValue string p := &Package{Name: &zeroValue} p.GetName() p = &Package{} p.GetName() p = nil p.GetName() } func TestPackage_GetOwner(tt *testing.T) { p := &Package{} p.GetOwner() p = nil p.GetOwner() } func TestPackage_GetPackageType(tt *testing.T) { var zeroValue string p := &Package{PackageType: &zeroValue} p.GetPackageType() p = &Package{} p.GetPackageType() p = nil p.GetPackageType() } func TestPackage_GetPackageVersion(tt *testing.T) { p := &Package{} p.GetPackageVersion() p = nil p.GetPackageVersion() } func TestPackage_GetRegistry(tt *testing.T) { p := &Package{} p.GetRegistry() p = nil p.GetRegistry() } func TestPackage_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp p := &Package{UpdatedAt: &zeroValue} p.GetUpdatedAt() p = &Package{} p.GetUpdatedAt() p = nil p.GetUpdatedAt() } func TestPackageEvent_GetAction(tt *testing.T) { var zeroValue string p := &PackageEvent{Action: &zeroValue} p.GetAction() p = &PackageEvent{} p.GetAction() p = nil p.GetAction() } func TestPackageEvent_GetOrg(tt *testing.T) { p := &PackageEvent{} p.GetOrg() p = nil p.GetOrg() } func TestPackageEvent_GetPackage(tt *testing.T) { p := &PackageEvent{} p.GetPackage() p = nil p.GetPackage() } func TestPackageEvent_GetRepo(tt *testing.T) { p := &PackageEvent{} p.GetRepo() p = nil p.GetRepo() } func TestPackageEvent_GetSender(tt *testing.T) { p := &PackageEvent{} p.GetSender() p = nil p.GetSender() } func TestPackageFile_GetAuthor(tt *testing.T) { p := &PackageFile{} p.GetAuthor() p = nil p.GetAuthor() } func TestPackageFile_GetContentType(tt *testing.T) { var zeroValue string p := &PackageFile{ContentType: &zeroValue} p.GetContentType() p = &PackageFile{} p.GetContentType() p = nil p.GetContentType() } func TestPackageFile_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp p := &PackageFile{CreatedAt: &zeroValue} p.GetCreatedAt() p = &PackageFile{} p.GetCreatedAt() p = nil p.GetCreatedAt() } func TestPackageFile_GetDownloadURL(tt *testing.T) { var zeroValue string p := &PackageFile{DownloadURL: &zeroValue} p.GetDownloadURL() p = &PackageFile{} p.GetDownloadURL() p = nil p.GetDownloadURL() } func TestPackageFile_GetID(tt *testing.T) { var zeroValue int64 p := &PackageFile{ID: &zeroValue} p.GetID() p = &PackageFile{} p.GetID() p = nil p.GetID() } func TestPackageFile_GetMD5(tt *testing.T) { var zeroValue string p := &PackageFile{MD5: &zeroValue} p.GetMD5() p = &PackageFile{} p.GetMD5() p = nil p.GetMD5() } func TestPackageFile_GetName(tt *testing.T) { var zeroValue string p := &PackageFile{Name: &zeroValue} p.GetName() p = &PackageFile{} p.GetName() p = nil p.GetName() } func TestPackageFile_GetSHA1(tt *testing.T) { var zeroValue string p := &PackageFile{SHA1: &zeroValue} p.GetSHA1() p = &PackageFile{} p.GetSHA1() p = nil p.GetSHA1() } func TestPackageFile_GetSHA256(tt *testing.T) { var zeroValue string p := &PackageFile{SHA256: &zeroValue} p.GetSHA256() p = &PackageFile{} p.GetSHA256() p = nil p.GetSHA256() } func TestPackageFile_GetSize(tt *testing.T) { var zeroValue int64 p := &PackageFile{Size: &zeroValue} p.GetSize() p = &PackageFile{} p.GetSize() p = nil p.GetSize() } func TestPackageFile_GetState(tt *testing.T) { var zeroValue string p := &PackageFile{State: &zeroValue} p.GetState() p = &PackageFile{} p.GetState() p = nil p.GetState() } func TestPackageFile_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp p := &PackageFile{UpdatedAt: &zeroValue} p.GetUpdatedAt() p = &PackageFile{} p.GetUpdatedAt() p = nil p.GetUpdatedAt() } func TestPackageRegistry_GetAboutURL(tt *testing.T) { var zeroValue string p := &PackageRegistry{AboutURL: &zeroValue} p.GetAboutURL() p = &PackageRegistry{} p.GetAboutURL() p = nil p.GetAboutURL() } func TestPackageRegistry_GetName(tt *testing.T) { var zeroValue string p := &PackageRegistry{Name: &zeroValue} p.GetName() p = &PackageRegistry{} p.GetName() p = nil p.GetName() } func TestPackageRegistry_GetType(tt *testing.T) { var zeroValue string p := &PackageRegistry{Type: &zeroValue} p.GetType() p = &PackageRegistry{} p.GetType() p = nil p.GetType() } func TestPackageRegistry_GetURL(tt *testing.T) { var zeroValue string p := &PackageRegistry{URL: &zeroValue} p.GetURL() p = &PackageRegistry{} p.GetURL() p = nil p.GetURL() } func TestPackageRegistry_GetVendor(tt *testing.T) { var zeroValue string p := &PackageRegistry{Vendor: &zeroValue} p.GetVendor() p = &PackageRegistry{} p.GetVendor() p = nil p.GetVendor() } func TestPackageRelease_GetAuthor(tt *testing.T) { p := &PackageRelease{} p.GetAuthor() p = nil p.GetAuthor() } func TestPackageRelease_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp p := &PackageRelease{CreatedAt: &zeroValue} p.GetCreatedAt() p = &PackageRelease{} p.GetCreatedAt() p = nil p.GetCreatedAt() } func TestPackageRelease_GetDraft(tt *testing.T) { var zeroValue bool p := &PackageRelease{Draft: &zeroValue} p.GetDraft() p = &PackageRelease{} p.GetDraft() p = nil p.GetDraft() } func TestPackageRelease_GetHTMLURL(tt *testing.T) { var zeroValue string p := &PackageRelease{HTMLURL: &zeroValue} p.GetHTMLURL() p = &PackageRelease{} p.GetHTMLURL() p = nil p.GetHTMLURL() } func TestPackageRelease_GetID(tt *testing.T) { var zeroValue int64 p := &PackageRelease{ID: &zeroValue} p.GetID() p = &PackageRelease{} p.GetID() p = nil p.GetID() } func TestPackageRelease_GetName(tt *testing.T) { var zeroValue string p := &PackageRelease{Name: &zeroValue} p.GetName() p = &PackageRelease{} p.GetName() p = nil p.GetName() } func TestPackageRelease_GetPrerelease(tt *testing.T) { var zeroValue bool p := &PackageRelease{Prerelease: &zeroValue} p.GetPrerelease() p = &PackageRelease{} p.GetPrerelease() p = nil p.GetPrerelease() } func TestPackageRelease_GetPublishedAt(tt *testing.T) { var zeroValue Timestamp p := &PackageRelease{PublishedAt: &zeroValue} p.GetPublishedAt() p = &PackageRelease{} p.GetPublishedAt() p = nil p.GetPublishedAt() } func TestPackageRelease_GetTagName(tt *testing.T) { var zeroValue string p := &PackageRelease{TagName: &zeroValue} p.GetTagName() p = &PackageRelease{} p.GetTagName() p = nil p.GetTagName() } func TestPackageRelease_GetTargetCommitish(tt *testing.T) { var zeroValue string p := &PackageRelease{TargetCommitish: &zeroValue} p.GetTargetCommitish() p = &PackageRelease{} p.GetTargetCommitish() p = nil p.GetTargetCommitish() } func TestPackageRelease_GetURL(tt *testing.T) { var zeroValue string p := &PackageRelease{URL: &zeroValue} p.GetURL() p = &PackageRelease{} p.GetURL() p = nil p.GetURL() } func TestPackageVersion_GetAuthor(tt *testing.T) { p := &PackageVersion{} p.GetAuthor() p = nil p.GetAuthor() } func TestPackageVersion_GetBody(tt *testing.T) { var zeroValue string p := &PackageVersion{Body: &zeroValue} p.GetBody() p = &PackageVersion{} p.GetBody() p = nil p.GetBody() } func TestPackageVersion_GetBodyHTML(tt *testing.T) { var zeroValue string p := &PackageVersion{BodyHTML: &zeroValue} p.GetBodyHTML() p = &PackageVersion{} p.GetBodyHTML() p = nil p.GetBodyHTML() } func TestPackageVersion_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp p := &PackageVersion{CreatedAt: &zeroValue} p.GetCreatedAt() p = &PackageVersion{} p.GetCreatedAt() p = nil p.GetCreatedAt() } func TestPackageVersion_GetDraft(tt *testing.T) { var zeroValue bool p := &PackageVersion{Draft: &zeroValue} p.GetDraft() p = &PackageVersion{} p.GetDraft() p = nil p.GetDraft() } func TestPackageVersion_GetHTMLURL(tt *testing.T) { var zeroValue string p := &PackageVersion{HTMLURL: &zeroValue} p.GetHTMLURL() p = &PackageVersion{} p.GetHTMLURL() p = nil p.GetHTMLURL() } func TestPackageVersion_GetID(tt *testing.T) { var zeroValue int64 p := &PackageVersion{ID: &zeroValue} p.GetID() p = &PackageVersion{} p.GetID() p = nil p.GetID() } func TestPackageVersion_GetInstallationCommand(tt *testing.T) { var zeroValue string p := &PackageVersion{InstallationCommand: &zeroValue} p.GetInstallationCommand() p = &PackageVersion{} p.GetInstallationCommand() p = nil p.GetInstallationCommand() } func TestPackageVersion_GetManifest(tt *testing.T) { var zeroValue string p := &PackageVersion{Manifest: &zeroValue} p.GetManifest() p = &PackageVersion{} p.GetManifest() p = nil p.GetManifest() } func TestPackageVersion_GetPrerelease(tt *testing.T) { var zeroValue bool p := &PackageVersion{Prerelease: &zeroValue} p.GetPrerelease() p = &PackageVersion{} p.GetPrerelease() p = nil p.GetPrerelease() } func TestPackageVersion_GetRelease(tt *testing.T) { p := &PackageVersion{} p.GetRelease() p = nil p.GetRelease() } func TestPackageVersion_GetSummary(tt *testing.T) { var zeroValue string p := &PackageVersion{Summary: &zeroValue} p.GetSummary() p = &PackageVersion{} p.GetSummary() p = nil p.GetSummary() } func TestPackageVersion_GetTagName(tt *testing.T) { var zeroValue string p := &PackageVersion{TagName: &zeroValue} p.GetTagName() p = &PackageVersion{} p.GetTagName() p = nil p.GetTagName() } func TestPackageVersion_GetTargetCommitish(tt *testing.T) { var zeroValue string p := &PackageVersion{TargetCommitish: &zeroValue} p.GetTargetCommitish() p = &PackageVersion{} p.GetTargetCommitish() p = nil p.GetTargetCommitish() } func TestPackageVersion_GetTargetOID(tt *testing.T) { var zeroValue string p := &PackageVersion{TargetOID: &zeroValue} p.GetTargetOID() p = &PackageVersion{} p.GetTargetOID() p = nil p.GetTargetOID() } func TestPackageVersion_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp p := &PackageVersion{UpdatedAt: &zeroValue} p.GetUpdatedAt() p = &PackageVersion{} p.GetUpdatedAt() p = nil p.GetUpdatedAt() } func TestPackageVersion_GetVersion(tt *testing.T) { var zeroValue string p := &PackageVersion{Version: &zeroValue} p.GetVersion() p = &PackageVersion{} p.GetVersion() p = nil p.GetVersion() } func TestPage_GetAction(tt *testing.T) { var zeroValue string p := &Page{Action: &zeroValue} p.GetAction() p = &Page{} p.GetAction() p = nil p.GetAction() } func TestPage_GetHTMLURL(tt *testing.T) { var zeroValue string p := &Page{HTMLURL: &zeroValue} p.GetHTMLURL() p = &Page{} p.GetHTMLURL() p = nil p.GetHTMLURL() } func TestPage_GetPageName(tt *testing.T) { var zeroValue string p := &Page{PageName: &zeroValue} p.GetPageName() p = &Page{} p.GetPageName() p = nil p.GetPageName() } func TestPage_GetSHA(tt *testing.T) { var zeroValue string p := &Page{SHA: &zeroValue} p.GetSHA() p = &Page{} p.GetSHA() p = nil p.GetSHA() } func TestPage_GetSummary(tt *testing.T) { var zeroValue string p := &Page{Summary: &zeroValue} p.GetSummary() p = &Page{} p.GetSummary() p = nil p.GetSummary() } func TestPage_GetTitle(tt *testing.T) { var zeroValue string p := &Page{Title: &zeroValue} p.GetTitle() p = &Page{} p.GetTitle() p = nil p.GetTitle() } func TestPageBuildEvent_GetBuild(tt *testing.T) { p := &PageBuildEvent{} p.GetBuild() p = nil p.GetBuild() } func TestPageBuildEvent_GetID(tt *testing.T) { var zeroValue int64 p := &PageBuildEvent{ID: &zeroValue} p.GetID() p = &PageBuildEvent{} p.GetID() p = nil p.GetID() } func TestPageBuildEvent_GetInstallation(tt *testing.T) { p := &PageBuildEvent{} p.GetInstallation() p = nil p.GetInstallation() } func TestPageBuildEvent_GetRepo(tt *testing.T) { p := &PageBuildEvent{} p.GetRepo() p = nil p.GetRepo() } func TestPageBuildEvent_GetSender(tt *testing.T) { p := &PageBuildEvent{} p.GetSender() p = nil p.GetSender() } func TestPages_GetCNAME(tt *testing.T) { var zeroValue string p := &Pages{CNAME: &zeroValue} p.GetCNAME() p = &Pages{} p.GetCNAME() p = nil p.GetCNAME() } func TestPages_GetCustom404(tt *testing.T) { var zeroValue bool p := &Pages{Custom404: &zeroValue} p.GetCustom404() p = &Pages{} p.GetCustom404() p = nil p.GetCustom404() } func TestPages_GetHTMLURL(tt *testing.T) { var zeroValue string p := &Pages{HTMLURL: &zeroValue} p.GetHTMLURL() p = &Pages{} p.GetHTMLURL() p = nil p.GetHTMLURL() } func TestPages_GetSource(tt *testing.T) { p := &Pages{} p.GetSource() p = nil p.GetSource() } func TestPages_GetStatus(tt *testing.T) { var zeroValue string p := &Pages{Status: &zeroValue} p.GetStatus() p = &Pages{} p.GetStatus() p = nil p.GetStatus() } func TestPages_GetURL(tt *testing.T) { var zeroValue string p := &Pages{URL: &zeroValue} p.GetURL() p = &Pages{} p.GetURL() p = nil p.GetURL() } func TestPagesBuild_GetCommit(tt *testing.T) { var zeroValue string p := &PagesBuild{Commit: &zeroValue} p.GetCommit() p = &PagesBuild{} p.GetCommit() p = nil p.GetCommit() } func TestPagesBuild_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp p := &PagesBuild{CreatedAt: &zeroValue} p.GetCreatedAt() p = &PagesBuild{} p.GetCreatedAt() p = nil p.GetCreatedAt() } func TestPagesBuild_GetDuration(tt *testing.T) { var zeroValue int p := &PagesBuild{Duration: &zeroValue} p.GetDuration() p = &PagesBuild{} p.GetDuration() p = nil p.GetDuration() } func TestPagesBuild_GetError(tt *testing.T) { p := &PagesBuild{} p.GetError() p = nil p.GetError() } func TestPagesBuild_GetPusher(tt *testing.T) { p := &PagesBuild{} p.GetPusher() p = nil p.GetPusher() } func TestPagesBuild_GetStatus(tt *testing.T) { var zeroValue string p := &PagesBuild{Status: &zeroValue} p.GetStatus() p = &PagesBuild{} p.GetStatus() p = nil p.GetStatus() } func TestPagesBuild_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp p := &PagesBuild{UpdatedAt: &zeroValue} p.GetUpdatedAt() p = &PagesBuild{} p.GetUpdatedAt() p = nil p.GetUpdatedAt() } func TestPagesBuild_GetURL(tt *testing.T) { var zeroValue string p := &PagesBuild{URL: &zeroValue} p.GetURL() p = &PagesBuild{} p.GetURL() p = nil p.GetURL() } func TestPagesError_GetMessage(tt *testing.T) { var zeroValue string p := &PagesError{Message: &zeroValue} p.GetMessage() p = &PagesError{} p.GetMessage() p = nil p.GetMessage() } func TestPagesSource_GetBranch(tt *testing.T) { var zeroValue string p := &PagesSource{Branch: &zeroValue} p.GetBranch() p = &PagesSource{} p.GetBranch() p = nil p.GetBranch() } func TestPagesSource_GetPath(tt *testing.T) { var zeroValue string p := &PagesSource{Path: &zeroValue} p.GetPath() p = &PagesSource{} p.GetPath() p = nil p.GetPath() } func TestPageStats_GetTotalPages(tt *testing.T) { var zeroValue int p := &PageStats{TotalPages: &zeroValue} p.GetTotalPages() p = &PageStats{} p.GetTotalPages() p = nil p.GetTotalPages() } func TestPagesUpdate_GetCNAME(tt *testing.T) { var zeroValue string p := &PagesUpdate{CNAME: &zeroValue} p.GetCNAME() p = &PagesUpdate{} p.GetCNAME() p = nil p.GetCNAME() } func TestPagesUpdate_GetSource(tt *testing.T) { var zeroValue string p := &PagesUpdate{Source: &zeroValue} p.GetSource() p = &PagesUpdate{} p.GetSource() p = nil p.GetSource() } func TestPingEvent_GetHook(tt *testing.T) { p := &PingEvent{} p.GetHook() p = nil p.GetHook() } func TestPingEvent_GetHookID(tt *testing.T) { var zeroValue int64 p := &PingEvent{HookID: &zeroValue} p.GetHookID() p = &PingEvent{} p.GetHookID() p = nil p.GetHookID() } func TestPingEvent_GetInstallation(tt *testing.T) { p := &PingEvent{} p.GetInstallation() p = nil p.GetInstallation() } func TestPingEvent_GetZen(tt *testing.T) { var zeroValue string p := &PingEvent{Zen: &zeroValue} p.GetZen() p = &PingEvent{} p.GetZen() p = nil p.GetZen() } func TestPlan_GetCollaborators(tt *testing.T) { var zeroValue int p := &Plan{Collaborators: &zeroValue} p.GetCollaborators() p = &Plan{} p.GetCollaborators() p = nil p.GetCollaborators() } func TestPlan_GetFilledSeats(tt *testing.T) { var zeroValue int p := &Plan{FilledSeats: &zeroValue} p.GetFilledSeats() p = &Plan{} p.GetFilledSeats() p = nil p.GetFilledSeats() } func TestPlan_GetName(tt *testing.T) { var zeroValue string p := &Plan{Name: &zeroValue} p.GetName() p = &Plan{} p.GetName() p = nil p.GetName() } func TestPlan_GetPrivateRepos(tt *testing.T) { var zeroValue int p := &Plan{PrivateRepos: &zeroValue} p.GetPrivateRepos() p = &Plan{} p.GetPrivateRepos() p = nil p.GetPrivateRepos() } func TestPlan_GetSeats(tt *testing.T) { var zeroValue int p := &Plan{Seats: &zeroValue} p.GetSeats() p = &Plan{} p.GetSeats() p = nil p.GetSeats() } func TestPlan_GetSpace(tt *testing.T) { var zeroValue int p := &Plan{Space: &zeroValue} p.GetSpace() p = &Plan{} p.GetSpace() p = nil p.GetSpace() } func TestPreReceiveHook_GetConfigURL(tt *testing.T) { var zeroValue string p := &PreReceiveHook{ConfigURL: &zeroValue} p.GetConfigURL() p = &PreReceiveHook{} p.GetConfigURL() p = nil p.GetConfigURL() } func TestPreReceiveHook_GetEnforcement(tt *testing.T) { var zeroValue string p := &PreReceiveHook{Enforcement: &zeroValue} p.GetEnforcement() p = &PreReceiveHook{} p.GetEnforcement() p = nil p.GetEnforcement() } func TestPreReceiveHook_GetID(tt *testing.T) { var zeroValue int64 p := &PreReceiveHook{ID: &zeroValue} p.GetID() p = &PreReceiveHook{} p.GetID() p = nil p.GetID() } func TestPreReceiveHook_GetName(tt *testing.T) { var zeroValue string p := &PreReceiveHook{Name: &zeroValue} p.GetName() p = &PreReceiveHook{} p.GetName() p = nil p.GetName() } func TestPRLink_GetHRef(tt *testing.T) { var zeroValue string p := &PRLink{HRef: &zeroValue} p.GetHRef() p = &PRLink{} p.GetHRef() p = nil p.GetHRef() } func TestPRLinks_GetComments(tt *testing.T) { p := &PRLinks{} p.GetComments() p = nil p.GetComments() } func TestPRLinks_GetCommits(tt *testing.T) { p := &PRLinks{} p.GetCommits() p = nil p.GetCommits() } func TestPRLinks_GetHTML(tt *testing.T) { p := &PRLinks{} p.GetHTML() p = nil p.GetHTML() } func TestPRLinks_GetIssue(tt *testing.T) { p := &PRLinks{} p.GetIssue() p = nil p.GetIssue() } func TestPRLinks_GetReviewComment(tt *testing.T) { p := &PRLinks{} p.GetReviewComment() p = nil p.GetReviewComment() } func TestPRLinks_GetReviewComments(tt *testing.T) { p := &PRLinks{} p.GetReviewComments() p = nil p.GetReviewComments() } func TestPRLinks_GetSelf(tt *testing.T) { p := &PRLinks{} p.GetSelf() p = nil p.GetSelf() } func TestPRLinks_GetStatuses(tt *testing.T) { p := &PRLinks{} p.GetStatuses() p = nil p.GetStatuses() } func TestProject_GetBody(tt *testing.T) { var zeroValue string p := &Project{Body: &zeroValue} p.GetBody() p = &Project{} p.GetBody() p = nil p.GetBody() } func TestProject_GetColumnsURL(tt *testing.T) { var zeroValue string p := &Project{ColumnsURL: &zeroValue} p.GetColumnsURL() p = &Project{} p.GetColumnsURL() p = nil p.GetColumnsURL() } func TestProject_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp p := &Project{CreatedAt: &zeroValue} p.GetCreatedAt() p = &Project{} p.GetCreatedAt() p = nil p.GetCreatedAt() } func TestProject_GetCreator(tt *testing.T) { p := &Project{} p.GetCreator() p = nil p.GetCreator() } func TestProject_GetHTMLURL(tt *testing.T) { var zeroValue string p := &Project{HTMLURL: &zeroValue} p.GetHTMLURL() p = &Project{} p.GetHTMLURL() p = nil p.GetHTMLURL() } func TestProject_GetID(tt *testing.T) { var zeroValue int64 p := &Project{ID: &zeroValue} p.GetID() p = &Project{} p.GetID() p = nil p.GetID() } func TestProject_GetName(tt *testing.T) { var zeroValue string p := &Project{Name: &zeroValue} p.GetName() p = &Project{} p.GetName() p = nil p.GetName() } func TestProject_GetNodeID(tt *testing.T) { var zeroValue string p := &Project{NodeID: &zeroValue} p.GetNodeID() p = &Project{} p.GetNodeID() p = nil p.GetNodeID() } func TestProject_GetNumber(tt *testing.T) { var zeroValue int p := &Project{Number: &zeroValue} p.GetNumber() p = &Project{} p.GetNumber() p = nil p.GetNumber() } func TestProject_GetOwnerURL(tt *testing.T) { var zeroValue string p := &Project{OwnerURL: &zeroValue} p.GetOwnerURL() p = &Project{} p.GetOwnerURL() p = nil p.GetOwnerURL() } func TestProject_GetState(tt *testing.T) { var zeroValue string p := &Project{State: &zeroValue} p.GetState() p = &Project{} p.GetState() p = nil p.GetState() } func TestProject_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp p := &Project{UpdatedAt: &zeroValue} p.GetUpdatedAt() p = &Project{} p.GetUpdatedAt() p = nil p.GetUpdatedAt() } func TestProject_GetURL(tt *testing.T) { var zeroValue string p := &Project{URL: &zeroValue} p.GetURL() p = &Project{} p.GetURL() p = nil p.GetURL() } func TestProjectBody_GetFrom(tt *testing.T) { var zeroValue string p := &ProjectBody{From: &zeroValue} p.GetFrom() p = &ProjectBody{} p.GetFrom() p = nil p.GetFrom() } func TestProjectCard_GetArchived(tt *testing.T) { var zeroValue bool p := &ProjectCard{Archived: &zeroValue} p.GetArchived() p = &ProjectCard{} p.GetArchived() p = nil p.GetArchived() } func TestProjectCard_GetColumnID(tt *testing.T) { var zeroValue int64 p := &ProjectCard{ColumnID: &zeroValue} p.GetColumnID() p = &ProjectCard{} p.GetColumnID() p = nil p.GetColumnID() } func TestProjectCard_GetColumnName(tt *testing.T) { var zeroValue string p := &ProjectCard{ColumnName: &zeroValue} p.GetColumnName() p = &ProjectCard{} p.GetColumnName() p = nil p.GetColumnName() } func TestProjectCard_GetColumnURL(tt *testing.T) { var zeroValue string p := &ProjectCard{ColumnURL: &zeroValue} p.GetColumnURL() p = &ProjectCard{} p.GetColumnURL() p = nil p.GetColumnURL() } func TestProjectCard_GetContentURL(tt *testing.T) { var zeroValue string p := &ProjectCard{ContentURL: &zeroValue} p.GetContentURL() p = &ProjectCard{} p.GetContentURL() p = nil p.GetContentURL() } func TestProjectCard_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp p := &ProjectCard{CreatedAt: &zeroValue} p.GetCreatedAt() p = &ProjectCard{} p.GetCreatedAt() p = nil p.GetCreatedAt() } func TestProjectCard_GetCreator(tt *testing.T) { p := &ProjectCard{} p.GetCreator() p = nil p.GetCreator() } func TestProjectCard_GetID(tt *testing.T) { var zeroValue int64 p := &ProjectCard{ID: &zeroValue} p.GetID() p = &ProjectCard{} p.GetID() p = nil p.GetID() } func TestProjectCard_GetNodeID(tt *testing.T) { var zeroValue string p := &ProjectCard{NodeID: &zeroValue} p.GetNodeID() p = &ProjectCard{} p.GetNodeID() p = nil p.GetNodeID() } func TestProjectCard_GetNote(tt *testing.T) { var zeroValue string p := &ProjectCard{Note: &zeroValue} p.GetNote() p = &ProjectCard{} p.GetNote() p = nil p.GetNote() } func TestProjectCard_GetPreviousColumnName(tt *testing.T) { var zeroValue string p := &ProjectCard{PreviousColumnName: &zeroValue} p.GetPreviousColumnName() p = &ProjectCard{} p.GetPreviousColumnName() p = nil p.GetPreviousColumnName() } func TestProjectCard_GetProjectID(tt *testing.T) { var zeroValue int64 p := &ProjectCard{ProjectID: &zeroValue} p.GetProjectID() p = &ProjectCard{} p.GetProjectID() p = nil p.GetProjectID() } func TestProjectCard_GetProjectURL(tt *testing.T) { var zeroValue string p := &ProjectCard{ProjectURL: &zeroValue} p.GetProjectURL() p = &ProjectCard{} p.GetProjectURL() p = nil p.GetProjectURL() } func TestProjectCard_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp p := &ProjectCard{UpdatedAt: &zeroValue} p.GetUpdatedAt() p = &ProjectCard{} p.GetUpdatedAt() p = nil p.GetUpdatedAt() } func TestProjectCard_GetURL(tt *testing.T) { var zeroValue string p := &ProjectCard{URL: &zeroValue} p.GetURL() p = &ProjectCard{} p.GetURL() p = nil p.GetURL() } func TestProjectCardChange_GetNote(tt *testing.T) { p := &ProjectCardChange{} p.GetNote() p = nil p.GetNote() } func TestProjectCardEvent_GetAction(tt *testing.T) { var zeroValue string p := &ProjectCardEvent{Action: &zeroValue} p.GetAction() p = &ProjectCardEvent{} p.GetAction() p = nil p.GetAction() } func TestProjectCardEvent_GetAfterID(tt *testing.T) { var zeroValue int64 p := &ProjectCardEvent{AfterID: &zeroValue} p.GetAfterID() p = &ProjectCardEvent{} p.GetAfterID() p = nil p.GetAfterID() } func TestProjectCardEvent_GetChanges(tt *testing.T) { p := &ProjectCardEvent{} p.GetChanges() p = nil p.GetChanges() } func TestProjectCardEvent_GetInstallation(tt *testing.T) { p := &ProjectCardEvent{} p.GetInstallation() p = nil p.GetInstallation() } func TestProjectCardEvent_GetOrg(tt *testing.T) { p := &ProjectCardEvent{} p.GetOrg() p = nil p.GetOrg() } func TestProjectCardEvent_GetProjectCard(tt *testing.T) { p := &ProjectCardEvent{} p.GetProjectCard() p = nil p.GetProjectCard() } func TestProjectCardEvent_GetRepo(tt *testing.T) { p := &ProjectCardEvent{} p.GetRepo() p = nil p.GetRepo() } func TestProjectCardEvent_GetSender(tt *testing.T) { p := &ProjectCardEvent{} p.GetSender() p = nil p.GetSender() } func TestProjectCardListOptions_GetArchivedState(tt *testing.T) { var zeroValue string p := &ProjectCardListOptions{ArchivedState: &zeroValue} p.GetArchivedState() p = &ProjectCardListOptions{} p.GetArchivedState() p = nil p.GetArchivedState() } func TestProjectCardNote_GetFrom(tt *testing.T) { var zeroValue string p := &ProjectCardNote{From: &zeroValue} p.GetFrom() p = &ProjectCardNote{} p.GetFrom() p = nil p.GetFrom() } func TestProjectCardOptions_GetArchived(tt *testing.T) { var zeroValue bool p := &ProjectCardOptions{Archived: &zeroValue} p.GetArchived() p = &ProjectCardOptions{} p.GetArchived() p = nil p.GetArchived() } func TestProjectChange_GetBody(tt *testing.T) { p := &ProjectChange{} p.GetBody() p = nil p.GetBody() } func TestProjectChange_GetName(tt *testing.T) { p := &ProjectChange{} p.GetName() p = nil p.GetName() } func TestProjectCollaboratorOptions_GetPermission(tt *testing.T) { var zeroValue string p := &ProjectCollaboratorOptions{Permission: &zeroValue} p.GetPermission() p = &ProjectCollaboratorOptions{} p.GetPermission() p = nil p.GetPermission() } func TestProjectColumn_GetCardsURL(tt *testing.T) { var zeroValue string p := &ProjectColumn{CardsURL: &zeroValue} p.GetCardsURL() p = &ProjectColumn{} p.GetCardsURL() p = nil p.GetCardsURL() } func TestProjectColumn_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp p := &ProjectColumn{CreatedAt: &zeroValue} p.GetCreatedAt() p = &ProjectColumn{} p.GetCreatedAt() p = nil p.GetCreatedAt() } func TestProjectColumn_GetID(tt *testing.T) { var zeroValue int64 p := &ProjectColumn{ID: &zeroValue} p.GetID() p = &ProjectColumn{} p.GetID() p = nil p.GetID() } func TestProjectColumn_GetName(tt *testing.T) { var zeroValue string p := &ProjectColumn{Name: &zeroValue} p.GetName() p = &ProjectColumn{} p.GetName() p = nil p.GetName() } func TestProjectColumn_GetNodeID(tt *testing.T) { var zeroValue string p := &ProjectColumn{NodeID: &zeroValue} p.GetNodeID() p = &ProjectColumn{} p.GetNodeID() p = nil p.GetNodeID() } func TestProjectColumn_GetProjectURL(tt *testing.T) { var zeroValue string p := &ProjectColumn{ProjectURL: &zeroValue} p.GetProjectURL() p = &ProjectColumn{} p.GetProjectURL() p = nil p.GetProjectURL() } func TestProjectColumn_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp p := &ProjectColumn{UpdatedAt: &zeroValue} p.GetUpdatedAt() p = &ProjectColumn{} p.GetUpdatedAt() p = nil p.GetUpdatedAt() } func TestProjectColumn_GetURL(tt *testing.T) { var zeroValue string p := &ProjectColumn{URL: &zeroValue} p.GetURL() p = &ProjectColumn{} p.GetURL() p = nil p.GetURL() } func TestProjectColumnChange_GetName(tt *testing.T) { p := &ProjectColumnChange{} p.GetName() p = nil p.GetName() } func TestProjectColumnEvent_GetAction(tt *testing.T) { var zeroValue string p := &ProjectColumnEvent{Action: &zeroValue} p.GetAction() p = &ProjectColumnEvent{} p.GetAction() p = nil p.GetAction() } func TestProjectColumnEvent_GetAfterID(tt *testing.T) { var zeroValue int64 p := &ProjectColumnEvent{AfterID: &zeroValue} p.GetAfterID() p = &ProjectColumnEvent{} p.GetAfterID() p = nil p.GetAfterID() } func TestProjectColumnEvent_GetChanges(tt *testing.T) { p := &ProjectColumnEvent{} p.GetChanges() p = nil p.GetChanges() } func TestProjectColumnEvent_GetInstallation(tt *testing.T) { p := &ProjectColumnEvent{} p.GetInstallation() p = nil p.GetInstallation() } func TestProjectColumnEvent_GetOrg(tt *testing.T) { p := &ProjectColumnEvent{} p.GetOrg() p = nil p.GetOrg() } func TestProjectColumnEvent_GetProjectColumn(tt *testing.T) { p := &ProjectColumnEvent{} p.GetProjectColumn() p = nil p.GetProjectColumn() } func TestProjectColumnEvent_GetRepo(tt *testing.T) { p := &ProjectColumnEvent{} p.GetRepo() p = nil p.GetRepo() } func TestProjectColumnEvent_GetSender(tt *testing.T) { p := &ProjectColumnEvent{} p.GetSender() p = nil p.GetSender() } func TestProjectColumnName_GetFrom(tt *testing.T) { var zeroValue string p := &ProjectColumnName{From: &zeroValue} p.GetFrom() p = &ProjectColumnName{} p.GetFrom() p = nil p.GetFrom() } func TestProjectEvent_GetAction(tt *testing.T) { var zeroValue string p := &ProjectEvent{Action: &zeroValue} p.GetAction() p = &ProjectEvent{} p.GetAction() p = nil p.GetAction() } func TestProjectEvent_GetChanges(tt *testing.T) { p := &ProjectEvent{} p.GetChanges() p = nil p.GetChanges() } func TestProjectEvent_GetInstallation(tt *testing.T) { p := &ProjectEvent{} p.GetInstallation() p = nil p.GetInstallation() } func TestProjectEvent_GetOrg(tt *testing.T) { p := &ProjectEvent{} p.GetOrg() p = nil p.GetOrg() } func TestProjectEvent_GetProject(tt *testing.T) { p := &ProjectEvent{} p.GetProject() p = nil p.GetProject() } func TestProjectEvent_GetRepo(tt *testing.T) { p := &ProjectEvent{} p.GetRepo() p = nil p.GetRepo() } func TestProjectEvent_GetSender(tt *testing.T) { p := &ProjectEvent{} p.GetSender() p = nil p.GetSender() } func TestProjectName_GetFrom(tt *testing.T) { var zeroValue string p := &ProjectName{From: &zeroValue} p.GetFrom() p = &ProjectName{} p.GetFrom() p = nil p.GetFrom() } func TestProjectOptions_GetBody(tt *testing.T) { var zeroValue string p := &ProjectOptions{Body: &zeroValue} p.GetBody() p = &ProjectOptions{} p.GetBody() p = nil p.GetBody() } func TestProjectOptions_GetName(tt *testing.T) { var zeroValue string p := &ProjectOptions{Name: &zeroValue} p.GetName() p = &ProjectOptions{} p.GetName() p = nil p.GetName() } func TestProjectOptions_GetOrganizationPermission(tt *testing.T) { var zeroValue string p := &ProjectOptions{OrganizationPermission: &zeroValue} p.GetOrganizationPermission() p = &ProjectOptions{} p.GetOrganizationPermission() p = nil p.GetOrganizationPermission() } func TestProjectOptions_GetPublic(tt *testing.T) { var zeroValue bool p := &ProjectOptions{Public: &zeroValue} p.GetPublic() p = &ProjectOptions{} p.GetPublic() p = nil p.GetPublic() } func TestProjectOptions_GetState(tt *testing.T) { var zeroValue string p := &ProjectOptions{State: &zeroValue} p.GetState() p = &ProjectOptions{} p.GetState() p = nil p.GetState() } func TestProjectPermissionLevel_GetPermission(tt *testing.T) { var zeroValue string p := &ProjectPermissionLevel{Permission: &zeroValue} p.GetPermission() p = &ProjectPermissionLevel{} p.GetPermission() p = nil p.GetPermission() } func TestProjectPermissionLevel_GetUser(tt *testing.T) { p := &ProjectPermissionLevel{} p.GetUser() p = nil p.GetUser() } func TestProtection_GetAllowDeletions(tt *testing.T) { p := &Protection{} p.GetAllowDeletions() p = nil p.GetAllowDeletions() } func TestProtection_GetAllowForcePushes(tt *testing.T) { p := &Protection{} p.GetAllowForcePushes() p = nil p.GetAllowForcePushes() } func TestProtection_GetEnforceAdmins(tt *testing.T) { p := &Protection{} p.GetEnforceAdmins() p = nil p.GetEnforceAdmins() } func TestProtection_GetRequiredConversationResolution(tt *testing.T) { p := &Protection{} p.GetRequiredConversationResolution() p = nil p.GetRequiredConversationResolution() } func TestProtection_GetRequiredPullRequestReviews(tt *testing.T) { p := &Protection{} p.GetRequiredPullRequestReviews() p = nil p.GetRequiredPullRequestReviews() } func TestProtection_GetRequiredStatusChecks(tt *testing.T) { p := &Protection{} p.GetRequiredStatusChecks() p = nil p.GetRequiredStatusChecks() } func TestProtection_GetRequireLinearHistory(tt *testing.T) { p := &Protection{} p.GetRequireLinearHistory() p = nil p.GetRequireLinearHistory() } func TestProtection_GetRestrictions(tt *testing.T) { p := &Protection{} p.GetRestrictions() p = nil p.GetRestrictions() } func TestProtectionRequest_GetAllowDeletions(tt *testing.T) { var zeroValue bool p := &ProtectionRequest{AllowDeletions: &zeroValue} p.GetAllowDeletions() p = &ProtectionRequest{} p.GetAllowDeletions() p = nil p.GetAllowDeletions() } func TestProtectionRequest_GetAllowForcePushes(tt *testing.T) { var zeroValue bool p := &ProtectionRequest{AllowForcePushes: &zeroValue} p.GetAllowForcePushes() p = &ProtectionRequest{} p.GetAllowForcePushes() p = nil p.GetAllowForcePushes() } func TestProtectionRequest_GetRequiredConversationResolution(tt *testing.T) { var zeroValue bool p := &ProtectionRequest{RequiredConversationResolution: &zeroValue} p.GetRequiredConversationResolution() p = &ProtectionRequest{} p.GetRequiredConversationResolution() p = nil p.GetRequiredConversationResolution() } func TestProtectionRequest_GetRequiredPullRequestReviews(tt *testing.T) { p := &ProtectionRequest{} p.GetRequiredPullRequestReviews() p = nil p.GetRequiredPullRequestReviews() } func TestProtectionRequest_GetRequiredStatusChecks(tt *testing.T) { p := &ProtectionRequest{} p.GetRequiredStatusChecks() p = nil p.GetRequiredStatusChecks() } func TestProtectionRequest_GetRequireLinearHistory(tt *testing.T) { var zeroValue bool p := &ProtectionRequest{RequireLinearHistory: &zeroValue} p.GetRequireLinearHistory() p = &ProtectionRequest{} p.GetRequireLinearHistory() p = nil p.GetRequireLinearHistory() } func TestProtectionRequest_GetRestrictions(tt *testing.T) { p := &ProtectionRequest{} p.GetRestrictions() p = nil p.GetRestrictions() } func TestProtectionRule_GetID(tt *testing.T) { var zeroValue int64 p := &ProtectionRule{ID: &zeroValue} p.GetID() p = &ProtectionRule{} p.GetID() p = nil p.GetID() } func TestProtectionRule_GetNodeID(tt *testing.T) { var zeroValue string p := &ProtectionRule{NodeID: &zeroValue} p.GetNodeID() p = &ProtectionRule{} p.GetNodeID() p = nil p.GetNodeID() } func TestProtectionRule_GetType(tt *testing.T) { var zeroValue string p := &ProtectionRule{Type: &zeroValue} p.GetType() p = &ProtectionRule{} p.GetType() p = nil p.GetType() } func TestProtectionRule_GetWaitTimer(tt *testing.T) { var zeroValue int p := &ProtectionRule{WaitTimer: &zeroValue} p.GetWaitTimer() p = &ProtectionRule{} p.GetWaitTimer() p = nil p.GetWaitTimer() } func TestPublicEvent_GetInstallation(tt *testing.T) { p := &PublicEvent{} p.GetInstallation() p = nil p.GetInstallation() } func TestPublicEvent_GetRepo(tt *testing.T) { p := &PublicEvent{} p.GetRepo() p = nil p.GetRepo() } func TestPublicEvent_GetSender(tt *testing.T) { p := &PublicEvent{} p.GetSender() p = nil p.GetSender() } func TestPublicKey_GetKey(tt *testing.T) { var zeroValue string p := &PublicKey{Key: &zeroValue} p.GetKey() p = &PublicKey{} p.GetKey() p = nil p.GetKey() } func TestPublicKey_GetKeyID(tt *testing.T) { var zeroValue string p := &PublicKey{KeyID: &zeroValue} p.GetKeyID() p = &PublicKey{} p.GetKeyID() p = nil p.GetKeyID() } func TestPullRequest_GetActiveLockReason(tt *testing.T) { var zeroValue string p := &PullRequest{ActiveLockReason: &zeroValue} p.GetActiveLockReason() p = &PullRequest{} p.GetActiveLockReason() p = nil p.GetActiveLockReason() } func TestPullRequest_GetAdditions(tt *testing.T) { var zeroValue int p := &PullRequest{Additions: &zeroValue} p.GetAdditions() p = &PullRequest{} p.GetAdditions() p = nil p.GetAdditions() } func TestPullRequest_GetAssignee(tt *testing.T) { p := &PullRequest{} p.GetAssignee() p = nil p.GetAssignee() } func TestPullRequest_GetAuthorAssociation(tt *testing.T) { var zeroValue string p := &PullRequest{AuthorAssociation: &zeroValue} p.GetAuthorAssociation() p = &PullRequest{} p.GetAuthorAssociation() p = nil p.GetAuthorAssociation() } func TestPullRequest_GetAutoMerge(tt *testing.T) { p := &PullRequest{} p.GetAutoMerge() p = nil p.GetAutoMerge() } func TestPullRequest_GetBase(tt *testing.T) { p := &PullRequest{} p.GetBase() p = nil p.GetBase() } func TestPullRequest_GetBody(tt *testing.T) { var zeroValue string p := &PullRequest{Body: &zeroValue} p.GetBody() p = &PullRequest{} p.GetBody() p = nil p.GetBody() } func TestPullRequest_GetChangedFiles(tt *testing.T) { var zeroValue int p := &PullRequest{ChangedFiles: &zeroValue} p.GetChangedFiles() p = &PullRequest{} p.GetChangedFiles() p = nil p.GetChangedFiles() } func TestPullRequest_GetClosedAt(tt *testing.T) { var zeroValue time.Time p := &PullRequest{ClosedAt: &zeroValue} p.GetClosedAt() p = &PullRequest{} p.GetClosedAt() p = nil p.GetClosedAt() } func TestPullRequest_GetComments(tt *testing.T) { var zeroValue int p := &PullRequest{Comments: &zeroValue} p.GetComments() p = &PullRequest{} p.GetComments() p = nil p.GetComments() } func TestPullRequest_GetCommentsURL(tt *testing.T) { var zeroValue string p := &PullRequest{CommentsURL: &zeroValue} p.GetCommentsURL() p = &PullRequest{} p.GetCommentsURL() p = nil p.GetCommentsURL() } func TestPullRequest_GetCommits(tt *testing.T) { var zeroValue int p := &PullRequest{Commits: &zeroValue} p.GetCommits() p = &PullRequest{} p.GetCommits() p = nil p.GetCommits() } func TestPullRequest_GetCommitsURL(tt *testing.T) { var zeroValue string p := &PullRequest{CommitsURL: &zeroValue} p.GetCommitsURL() p = &PullRequest{} p.GetCommitsURL() p = nil p.GetCommitsURL() } func TestPullRequest_GetCreatedAt(tt *testing.T) { var zeroValue time.Time p := &PullRequest{CreatedAt: &zeroValue} p.GetCreatedAt() p = &PullRequest{} p.GetCreatedAt() p = nil p.GetCreatedAt() } func TestPullRequest_GetDeletions(tt *testing.T) { var zeroValue int p := &PullRequest{Deletions: &zeroValue} p.GetDeletions() p = &PullRequest{} p.GetDeletions() p = nil p.GetDeletions() } func TestPullRequest_GetDiffURL(tt *testing.T) { var zeroValue string p := &PullRequest{DiffURL: &zeroValue} p.GetDiffURL() p = &PullRequest{} p.GetDiffURL() p = nil p.GetDiffURL() } func TestPullRequest_GetDraft(tt *testing.T) { var zeroValue bool p := &PullRequest{Draft: &zeroValue} p.GetDraft() p = &PullRequest{} p.GetDraft() p = nil p.GetDraft() } func TestPullRequest_GetHead(tt *testing.T) { p := &PullRequest{} p.GetHead() p = nil p.GetHead() } func TestPullRequest_GetHTMLURL(tt *testing.T) { var zeroValue string p := &PullRequest{HTMLURL: &zeroValue} p.GetHTMLURL() p = &PullRequest{} p.GetHTMLURL() p = nil p.GetHTMLURL() } func TestPullRequest_GetID(tt *testing.T) { var zeroValue int64 p := &PullRequest{ID: &zeroValue} p.GetID() p = &PullRequest{} p.GetID() p = nil p.GetID() } func TestPullRequest_GetIssueURL(tt *testing.T) { var zeroValue string p := &PullRequest{IssueURL: &zeroValue} p.GetIssueURL() p = &PullRequest{} p.GetIssueURL() p = nil p.GetIssueURL() } func TestPullRequest_GetLinks(tt *testing.T) { p := &PullRequest{} p.GetLinks() p = nil p.GetLinks() } func TestPullRequest_GetLocked(tt *testing.T) { var zeroValue bool p := &PullRequest{Locked: &zeroValue} p.GetLocked() p = &PullRequest{} p.GetLocked() p = nil p.GetLocked() } func TestPullRequest_GetMaintainerCanModify(tt *testing.T) { var zeroValue bool p := &PullRequest{MaintainerCanModify: &zeroValue} p.GetMaintainerCanModify() p = &PullRequest{} p.GetMaintainerCanModify() p = nil p.GetMaintainerCanModify() } func TestPullRequest_GetMergeable(tt *testing.T) { var zeroValue bool p := &PullRequest{Mergeable: &zeroValue} p.GetMergeable() p = &PullRequest{} p.GetMergeable() p = nil p.GetMergeable() } func TestPullRequest_GetMergeableState(tt *testing.T) { var zeroValue string p := &PullRequest{MergeableState: &zeroValue} p.GetMergeableState() p = &PullRequest{} p.GetMergeableState() p = nil p.GetMergeableState() } func TestPullRequest_GetMergeCommitSHA(tt *testing.T) { var zeroValue string p := &PullRequest{MergeCommitSHA: &zeroValue} p.GetMergeCommitSHA() p = &PullRequest{} p.GetMergeCommitSHA() p = nil p.GetMergeCommitSHA() } func TestPullRequest_GetMerged(tt *testing.T) { var zeroValue bool p := &PullRequest{Merged: &zeroValue} p.GetMerged() p = &PullRequest{} p.GetMerged() p = nil p.GetMerged() } func TestPullRequest_GetMergedAt(tt *testing.T) { var zeroValue time.Time p := &PullRequest{MergedAt: &zeroValue} p.GetMergedAt() p = &PullRequest{} p.GetMergedAt() p = nil p.GetMergedAt() } func TestPullRequest_GetMergedBy(tt *testing.T) { p := &PullRequest{} p.GetMergedBy() p = nil p.GetMergedBy() } func TestPullRequest_GetMilestone(tt *testing.T) { p := &PullRequest{} p.GetMilestone() p = nil p.GetMilestone() } func TestPullRequest_GetNodeID(tt *testing.T) { var zeroValue string p := &PullRequest{NodeID: &zeroValue} p.GetNodeID() p = &PullRequest{} p.GetNodeID() p = nil p.GetNodeID() } func TestPullRequest_GetNumber(tt *testing.T) { var zeroValue int p := &PullRequest{Number: &zeroValue} p.GetNumber() p = &PullRequest{} p.GetNumber() p = nil p.GetNumber() } func TestPullRequest_GetPatchURL(tt *testing.T) { var zeroValue string p := &PullRequest{PatchURL: &zeroValue} p.GetPatchURL() p = &PullRequest{} p.GetPatchURL() p = nil p.GetPatchURL() } func TestPullRequest_GetRebaseable(tt *testing.T) { var zeroValue bool p := &PullRequest{Rebaseable: &zeroValue} p.GetRebaseable() p = &PullRequest{} p.GetRebaseable() p = nil p.GetRebaseable() } func TestPullRequest_GetReviewComments(tt *testing.T) { var zeroValue int p := &PullRequest{ReviewComments: &zeroValue} p.GetReviewComments() p = &PullRequest{} p.GetReviewComments() p = nil p.GetReviewComments() } func TestPullRequest_GetReviewCommentsURL(tt *testing.T) { var zeroValue string p := &PullRequest{ReviewCommentsURL: &zeroValue} p.GetReviewCommentsURL() p = &PullRequest{} p.GetReviewCommentsURL() p = nil p.GetReviewCommentsURL() } func TestPullRequest_GetReviewCommentURL(tt *testing.T) { var zeroValue string p := &PullRequest{ReviewCommentURL: &zeroValue} p.GetReviewCommentURL() p = &PullRequest{} p.GetReviewCommentURL() p = nil p.GetReviewCommentURL() } func TestPullRequest_GetState(tt *testing.T) { var zeroValue string p := &PullRequest{State: &zeroValue} p.GetState() p = &PullRequest{} p.GetState() p = nil p.GetState() } func TestPullRequest_GetStatusesURL(tt *testing.T) { var zeroValue string p := &PullRequest{StatusesURL: &zeroValue} p.GetStatusesURL() p = &PullRequest{} p.GetStatusesURL() p = nil p.GetStatusesURL() } func TestPullRequest_GetTitle(tt *testing.T) { var zeroValue string p := &PullRequest{Title: &zeroValue} p.GetTitle() p = &PullRequest{} p.GetTitle() p = nil p.GetTitle() } func TestPullRequest_GetUpdatedAt(tt *testing.T) { var zeroValue time.Time p := &PullRequest{UpdatedAt: &zeroValue} p.GetUpdatedAt() p = &PullRequest{} p.GetUpdatedAt() p = nil p.GetUpdatedAt() } func TestPullRequest_GetURL(tt *testing.T) { var zeroValue string p := &PullRequest{URL: &zeroValue} p.GetURL() p = &PullRequest{} p.GetURL() p = nil p.GetURL() } func TestPullRequest_GetUser(tt *testing.T) { p := &PullRequest{} p.GetUser() p = nil p.GetUser() } func TestPullRequestAutoMerge_GetCommitMessage(tt *testing.T) { var zeroValue string p := &PullRequestAutoMerge{CommitMessage: &zeroValue} p.GetCommitMessage() p = &PullRequestAutoMerge{} p.GetCommitMessage() p = nil p.GetCommitMessage() } func TestPullRequestAutoMerge_GetCommitTitle(tt *testing.T) { var zeroValue string p := &PullRequestAutoMerge{CommitTitle: &zeroValue} p.GetCommitTitle() p = &PullRequestAutoMerge{} p.GetCommitTitle() p = nil p.GetCommitTitle() } func TestPullRequestAutoMerge_GetEnabledBy(tt *testing.T) { p := &PullRequestAutoMerge{} p.GetEnabledBy() p = nil p.GetEnabledBy() } func TestPullRequestAutoMerge_GetMergeMethod(tt *testing.T) { var zeroValue string p := &PullRequestAutoMerge{MergeMethod: &zeroValue} p.GetMergeMethod() p = &PullRequestAutoMerge{} p.GetMergeMethod() p = nil p.GetMergeMethod() } func TestPullRequestBranch_GetLabel(tt *testing.T) { var zeroValue string p := &PullRequestBranch{Label: &zeroValue} p.GetLabel() p = &PullRequestBranch{} p.GetLabel() p = nil p.GetLabel() } func TestPullRequestBranch_GetRef(tt *testing.T) { var zeroValue string p := &PullRequestBranch{Ref: &zeroValue} p.GetRef() p = &PullRequestBranch{} p.GetRef() p = nil p.GetRef() } func TestPullRequestBranch_GetRepo(tt *testing.T) { p := &PullRequestBranch{} p.GetRepo() p = nil p.GetRepo() } func TestPullRequestBranch_GetSHA(tt *testing.T) { var zeroValue string p := &PullRequestBranch{SHA: &zeroValue} p.GetSHA() p = &PullRequestBranch{} p.GetSHA() p = nil p.GetSHA() } func TestPullRequestBranch_GetUser(tt *testing.T) { p := &PullRequestBranch{} p.GetUser() p = nil p.GetUser() } func TestPullRequestBranchUpdateOptions_GetExpectedHeadSHA(tt *testing.T) { var zeroValue string p := &PullRequestBranchUpdateOptions{ExpectedHeadSHA: &zeroValue} p.GetExpectedHeadSHA() p = &PullRequestBranchUpdateOptions{} p.GetExpectedHeadSHA() p = nil p.GetExpectedHeadSHA() } func TestPullRequestBranchUpdateResponse_GetMessage(tt *testing.T) { var zeroValue string p := &PullRequestBranchUpdateResponse{Message: &zeroValue} p.GetMessage() p = &PullRequestBranchUpdateResponse{} p.GetMessage() p = nil p.GetMessage() } func TestPullRequestBranchUpdateResponse_GetURL(tt *testing.T) { var zeroValue string p := &PullRequestBranchUpdateResponse{URL: &zeroValue} p.GetURL() p = &PullRequestBranchUpdateResponse{} p.GetURL() p = nil p.GetURL() } func TestPullRequestComment_GetAuthorAssociation(tt *testing.T) { var zeroValue string p := &PullRequestComment{AuthorAssociation: &zeroValue} p.GetAuthorAssociation() p = &PullRequestComment{} p.GetAuthorAssociation() p = nil p.GetAuthorAssociation() } func TestPullRequestComment_GetBody(tt *testing.T) { var zeroValue string p := &PullRequestComment{Body: &zeroValue} p.GetBody() p = &PullRequestComment{} p.GetBody() p = nil p.GetBody() } func TestPullRequestComment_GetCommitID(tt *testing.T) { var zeroValue string p := &PullRequestComment{CommitID: &zeroValue} p.GetCommitID() p = &PullRequestComment{} p.GetCommitID() p = nil p.GetCommitID() } func TestPullRequestComment_GetCreatedAt(tt *testing.T) { var zeroValue time.Time p := &PullRequestComment{CreatedAt: &zeroValue} p.GetCreatedAt() p = &PullRequestComment{} p.GetCreatedAt() p = nil p.GetCreatedAt() } func TestPullRequestComment_GetDiffHunk(tt *testing.T) { var zeroValue string p := &PullRequestComment{DiffHunk: &zeroValue} p.GetDiffHunk() p = &PullRequestComment{} p.GetDiffHunk() p = nil p.GetDiffHunk() } func TestPullRequestComment_GetHTMLURL(tt *testing.T) { var zeroValue string p := &PullRequestComment{HTMLURL: &zeroValue} p.GetHTMLURL() p = &PullRequestComment{} p.GetHTMLURL() p = nil p.GetHTMLURL() } func TestPullRequestComment_GetID(tt *testing.T) { var zeroValue int64 p := &PullRequestComment{ID: &zeroValue} p.GetID() p = &PullRequestComment{} p.GetID() p = nil p.GetID() } func TestPullRequestComment_GetInReplyTo(tt *testing.T) { var zeroValue int64 p := &PullRequestComment{InReplyTo: &zeroValue} p.GetInReplyTo() p = &PullRequestComment{} p.GetInReplyTo() p = nil p.GetInReplyTo() } func TestPullRequestComment_GetLine(tt *testing.T) { var zeroValue int p := &PullRequestComment{Line: &zeroValue} p.GetLine() p = &PullRequestComment{} p.GetLine() p = nil p.GetLine() } func TestPullRequestComment_GetNodeID(tt *testing.T) { var zeroValue string p := &PullRequestComment{NodeID: &zeroValue} p.GetNodeID() p = &PullRequestComment{} p.GetNodeID() p = nil p.GetNodeID() } func TestPullRequestComment_GetOriginalCommitID(tt *testing.T) { var zeroValue string p := &PullRequestComment{OriginalCommitID: &zeroValue} p.GetOriginalCommitID() p = &PullRequestComment{} p.GetOriginalCommitID() p = nil p.GetOriginalCommitID() } func TestPullRequestComment_GetOriginalLine(tt *testing.T) { var zeroValue int p := &PullRequestComment{OriginalLine: &zeroValue} p.GetOriginalLine() p = &PullRequestComment{} p.GetOriginalLine() p = nil p.GetOriginalLine() } func TestPullRequestComment_GetOriginalPosition(tt *testing.T) { var zeroValue int p := &PullRequestComment{OriginalPosition: &zeroValue} p.GetOriginalPosition() p = &PullRequestComment{} p.GetOriginalPosition() p = nil p.GetOriginalPosition() } func TestPullRequestComment_GetOriginalStartLine(tt *testing.T) { var zeroValue int p := &PullRequestComment{OriginalStartLine: &zeroValue} p.GetOriginalStartLine() p = &PullRequestComment{} p.GetOriginalStartLine() p = nil p.GetOriginalStartLine() } func TestPullRequestComment_GetPath(tt *testing.T) { var zeroValue string p := &PullRequestComment{Path: &zeroValue} p.GetPath() p = &PullRequestComment{} p.GetPath() p = nil p.GetPath() } func TestPullRequestComment_GetPosition(tt *testing.T) { var zeroValue int p := &PullRequestComment{Position: &zeroValue} p.GetPosition() p = &PullRequestComment{} p.GetPosition() p = nil p.GetPosition() } func TestPullRequestComment_GetPullRequestReviewID(tt *testing.T) { var zeroValue int64 p := &PullRequestComment{PullRequestReviewID: &zeroValue} p.GetPullRequestReviewID() p = &PullRequestComment{} p.GetPullRequestReviewID() p = nil p.GetPullRequestReviewID() } func TestPullRequestComment_GetPullRequestURL(tt *testing.T) { var zeroValue string p := &PullRequestComment{PullRequestURL: &zeroValue} p.GetPullRequestURL() p = &PullRequestComment{} p.GetPullRequestURL() p = nil p.GetPullRequestURL() } func TestPullRequestComment_GetReactions(tt *testing.T) { p := &PullRequestComment{} p.GetReactions() p = nil p.GetReactions() } func TestPullRequestComment_GetSide(tt *testing.T) { var zeroValue string p := &PullRequestComment{Side: &zeroValue} p.GetSide() p = &PullRequestComment{} p.GetSide() p = nil p.GetSide() } func TestPullRequestComment_GetStartLine(tt *testing.T) { var zeroValue int p := &PullRequestComment{StartLine: &zeroValue} p.GetStartLine() p = &PullRequestComment{} p.GetStartLine() p = nil p.GetStartLine() } func TestPullRequestComment_GetStartSide(tt *testing.T) { var zeroValue string p := &PullRequestComment{StartSide: &zeroValue} p.GetStartSide() p = &PullRequestComment{} p.GetStartSide() p = nil p.GetStartSide() } func TestPullRequestComment_GetUpdatedAt(tt *testing.T) { var zeroValue time.Time p := &PullRequestComment{UpdatedAt: &zeroValue} p.GetUpdatedAt() p = &PullRequestComment{} p.GetUpdatedAt() p = nil p.GetUpdatedAt() } func TestPullRequestComment_GetURL(tt *testing.T) { var zeroValue string p := &PullRequestComment{URL: &zeroValue} p.GetURL() p = &PullRequestComment{} p.GetURL() p = nil p.GetURL() } func TestPullRequestComment_GetUser(tt *testing.T) { p := &PullRequestComment{} p.GetUser() p = nil p.GetUser() } func TestPullRequestEvent_GetAction(tt *testing.T) { var zeroValue string p := &PullRequestEvent{Action: &zeroValue} p.GetAction() p = &PullRequestEvent{} p.GetAction() p = nil p.GetAction() } func TestPullRequestEvent_GetAfter(tt *testing.T) { var zeroValue string p := &PullRequestEvent{After: &zeroValue} p.GetAfter() p = &PullRequestEvent{} p.GetAfter() p = nil p.GetAfter() } func TestPullRequestEvent_GetAssignee(tt *testing.T) { p := &PullRequestEvent{} p.GetAssignee() p = nil p.GetAssignee() } func TestPullRequestEvent_GetBefore(tt *testing.T) { var zeroValue string p := &PullRequestEvent{Before: &zeroValue} p.GetBefore() p = &PullRequestEvent{} p.GetBefore() p = nil p.GetBefore() } func TestPullRequestEvent_GetChanges(tt *testing.T) { p := &PullRequestEvent{} p.GetChanges() p = nil p.GetChanges() } func TestPullRequestEvent_GetInstallation(tt *testing.T) { p := &PullRequestEvent{} p.GetInstallation() p = nil p.GetInstallation() } func TestPullRequestEvent_GetLabel(tt *testing.T) { p := &PullRequestEvent{} p.GetLabel() p = nil p.GetLabel() } func TestPullRequestEvent_GetNumber(tt *testing.T) { var zeroValue int p := &PullRequestEvent{Number: &zeroValue} p.GetNumber() p = &PullRequestEvent{} p.GetNumber() p = nil p.GetNumber() } func TestPullRequestEvent_GetOrganization(tt *testing.T) { p := &PullRequestEvent{} p.GetOrganization() p = nil p.GetOrganization() } func TestPullRequestEvent_GetPullRequest(tt *testing.T) { p := &PullRequestEvent{} p.GetPullRequest() p = nil p.GetPullRequest() } func TestPullRequestEvent_GetRepo(tt *testing.T) { p := &PullRequestEvent{} p.GetRepo() p = nil p.GetRepo() } func TestPullRequestEvent_GetRequestedReviewer(tt *testing.T) { p := &PullRequestEvent{} p.GetRequestedReviewer() p = nil p.GetRequestedReviewer() } func TestPullRequestEvent_GetRequestedTeam(tt *testing.T) { p := &PullRequestEvent{} p.GetRequestedTeam() p = nil p.GetRequestedTeam() } func TestPullRequestEvent_GetSender(tt *testing.T) { p := &PullRequestEvent{} p.GetSender() p = nil p.GetSender() } func TestPullRequestLinks_GetDiffURL(tt *testing.T) { var zeroValue string p := &PullRequestLinks{DiffURL: &zeroValue} p.GetDiffURL() p = &PullRequestLinks{} p.GetDiffURL() p = nil p.GetDiffURL() } func TestPullRequestLinks_GetHTMLURL(tt *testing.T) { var zeroValue string p := &PullRequestLinks{HTMLURL: &zeroValue} p.GetHTMLURL() p = &PullRequestLinks{} p.GetHTMLURL() p = nil p.GetHTMLURL() } func TestPullRequestLinks_GetPatchURL(tt *testing.T) { var zeroValue string p := &PullRequestLinks{PatchURL: &zeroValue} p.GetPatchURL() p = &PullRequestLinks{} p.GetPatchURL() p = nil p.GetPatchURL() } func TestPullRequestLinks_GetURL(tt *testing.T) { var zeroValue string p := &PullRequestLinks{URL: &zeroValue} p.GetURL() p = &PullRequestLinks{} p.GetURL() p = nil p.GetURL() } func TestPullRequestMergeResult_GetMerged(tt *testing.T) { var zeroValue bool p := &PullRequestMergeResult{Merged: &zeroValue} p.GetMerged() p = &PullRequestMergeResult{} p.GetMerged() p = nil p.GetMerged() } func TestPullRequestMergeResult_GetMessage(tt *testing.T) { var zeroValue string p := &PullRequestMergeResult{Message: &zeroValue} p.GetMessage() p = &PullRequestMergeResult{} p.GetMessage() p = nil p.GetMessage() } func TestPullRequestMergeResult_GetSHA(tt *testing.T) { var zeroValue string p := &PullRequestMergeResult{SHA: &zeroValue} p.GetSHA() p = &PullRequestMergeResult{} p.GetSHA() p = nil p.GetSHA() } func TestPullRequestReview_GetAuthorAssociation(tt *testing.T) { var zeroValue string p := &PullRequestReview{AuthorAssociation: &zeroValue} p.GetAuthorAssociation() p = &PullRequestReview{} p.GetAuthorAssociation() p = nil p.GetAuthorAssociation() } func TestPullRequestReview_GetBody(tt *testing.T) { var zeroValue string p := &PullRequestReview{Body: &zeroValue} p.GetBody() p = &PullRequestReview{} p.GetBody() p = nil p.GetBody() } func TestPullRequestReview_GetCommitID(tt *testing.T) { var zeroValue string p := &PullRequestReview{CommitID: &zeroValue} p.GetCommitID() p = &PullRequestReview{} p.GetCommitID() p = nil p.GetCommitID() } func TestPullRequestReview_GetHTMLURL(tt *testing.T) { var zeroValue string p := &PullRequestReview{HTMLURL: &zeroValue} p.GetHTMLURL() p = &PullRequestReview{} p.GetHTMLURL() p = nil p.GetHTMLURL() } func TestPullRequestReview_GetID(tt *testing.T) { var zeroValue int64 p := &PullRequestReview{ID: &zeroValue} p.GetID() p = &PullRequestReview{} p.GetID() p = nil p.GetID() } func TestPullRequestReview_GetNodeID(tt *testing.T) { var zeroValue string p := &PullRequestReview{NodeID: &zeroValue} p.GetNodeID() p = &PullRequestReview{} p.GetNodeID() p = nil p.GetNodeID() } func TestPullRequestReview_GetPullRequestURL(tt *testing.T) { var zeroValue string p := &PullRequestReview{PullRequestURL: &zeroValue} p.GetPullRequestURL() p = &PullRequestReview{} p.GetPullRequestURL() p = nil p.GetPullRequestURL() } func TestPullRequestReview_GetState(tt *testing.T) { var zeroValue string p := &PullRequestReview{State: &zeroValue} p.GetState() p = &PullRequestReview{} p.GetState() p = nil p.GetState() } func TestPullRequestReview_GetSubmittedAt(tt *testing.T) { var zeroValue time.Time p := &PullRequestReview{SubmittedAt: &zeroValue} p.GetSubmittedAt() p = &PullRequestReview{} p.GetSubmittedAt() p = nil p.GetSubmittedAt() } func TestPullRequestReview_GetUser(tt *testing.T) { p := &PullRequestReview{} p.GetUser() p = nil p.GetUser() } func TestPullRequestReviewCommentEvent_GetAction(tt *testing.T) { var zeroValue string p := &PullRequestReviewCommentEvent{Action: &zeroValue} p.GetAction() p = &PullRequestReviewCommentEvent{} p.GetAction() p = nil p.GetAction() } func TestPullRequestReviewCommentEvent_GetChanges(tt *testing.T) { p := &PullRequestReviewCommentEvent{} p.GetChanges() p = nil p.GetChanges() } func TestPullRequestReviewCommentEvent_GetComment(tt *testing.T) { p := &PullRequestReviewCommentEvent{} p.GetComment() p = nil p.GetComment() } func TestPullRequestReviewCommentEvent_GetInstallation(tt *testing.T) { p := &PullRequestReviewCommentEvent{} p.GetInstallation() p = nil p.GetInstallation() } func TestPullRequestReviewCommentEvent_GetPullRequest(tt *testing.T) { p := &PullRequestReviewCommentEvent{} p.GetPullRequest() p = nil p.GetPullRequest() } func TestPullRequestReviewCommentEvent_GetRepo(tt *testing.T) { p := &PullRequestReviewCommentEvent{} p.GetRepo() p = nil p.GetRepo() } func TestPullRequestReviewCommentEvent_GetSender(tt *testing.T) { p := &PullRequestReviewCommentEvent{} p.GetSender() p = nil p.GetSender() } func TestPullRequestReviewDismissalRequest_GetMessage(tt *testing.T) { var zeroValue string p := &PullRequestReviewDismissalRequest{Message: &zeroValue} p.GetMessage() p = &PullRequestReviewDismissalRequest{} p.GetMessage() p = nil p.GetMessage() } func TestPullRequestReviewEvent_GetAction(tt *testing.T) { var zeroValue string p := &PullRequestReviewEvent{Action: &zeroValue} p.GetAction() p = &PullRequestReviewEvent{} p.GetAction() p = nil p.GetAction() } func TestPullRequestReviewEvent_GetInstallation(tt *testing.T) { p := &PullRequestReviewEvent{} p.GetInstallation() p = nil p.GetInstallation() } func TestPullRequestReviewEvent_GetOrganization(tt *testing.T) { p := &PullRequestReviewEvent{} p.GetOrganization() p = nil p.GetOrganization() } func TestPullRequestReviewEvent_GetPullRequest(tt *testing.T) { p := &PullRequestReviewEvent{} p.GetPullRequest() p = nil p.GetPullRequest() } func TestPullRequestReviewEvent_GetRepo(tt *testing.T) { p := &PullRequestReviewEvent{} p.GetRepo() p = nil p.GetRepo() } func TestPullRequestReviewEvent_GetReview(tt *testing.T) { p := &PullRequestReviewEvent{} p.GetReview() p = nil p.GetReview() } func TestPullRequestReviewEvent_GetSender(tt *testing.T) { p := &PullRequestReviewEvent{} p.GetSender() p = nil p.GetSender() } func TestPullRequestReviewRequest_GetBody(tt *testing.T) { var zeroValue string p := &PullRequestReviewRequest{Body: &zeroValue} p.GetBody() p = &PullRequestReviewRequest{} p.GetBody() p = nil p.GetBody() } func TestPullRequestReviewRequest_GetCommitID(tt *testing.T) { var zeroValue string p := &PullRequestReviewRequest{CommitID: &zeroValue} p.GetCommitID() p = &PullRequestReviewRequest{} p.GetCommitID() p = nil p.GetCommitID() } func TestPullRequestReviewRequest_GetEvent(tt *testing.T) { var zeroValue string p := &PullRequestReviewRequest{Event: &zeroValue} p.GetEvent() p = &PullRequestReviewRequest{} p.GetEvent() p = nil p.GetEvent() } func TestPullRequestReviewRequest_GetNodeID(tt *testing.T) { var zeroValue string p := &PullRequestReviewRequest{NodeID: &zeroValue} p.GetNodeID() p = &PullRequestReviewRequest{} p.GetNodeID() p = nil p.GetNodeID() } func TestPullRequestReviewsEnforcement_GetDismissalRestrictions(tt *testing.T) { p := &PullRequestReviewsEnforcement{} p.GetDismissalRestrictions() p = nil p.GetDismissalRestrictions() } func TestPullRequestReviewsEnforcementRequest_GetDismissalRestrictionsRequest(tt *testing.T) { p := &PullRequestReviewsEnforcementRequest{} p.GetDismissalRestrictionsRequest() p = nil p.GetDismissalRestrictionsRequest() } func TestPullRequestReviewsEnforcementUpdate_GetDismissalRestrictionsRequest(tt *testing.T) { p := &PullRequestReviewsEnforcementUpdate{} p.GetDismissalRestrictionsRequest() p = nil p.GetDismissalRestrictionsRequest() } func TestPullRequestReviewsEnforcementUpdate_GetDismissStaleReviews(tt *testing.T) { var zeroValue bool p := &PullRequestReviewsEnforcementUpdate{DismissStaleReviews: &zeroValue} p.GetDismissStaleReviews() p = &PullRequestReviewsEnforcementUpdate{} p.GetDismissStaleReviews() p = nil p.GetDismissStaleReviews() } func TestPullRequestTargetEvent_GetAction(tt *testing.T) { var zeroValue string p := &PullRequestTargetEvent{Action: &zeroValue} p.GetAction() p = &PullRequestTargetEvent{} p.GetAction() p = nil p.GetAction() } func TestPullRequestTargetEvent_GetAfter(tt *testing.T) { var zeroValue string p := &PullRequestTargetEvent{After: &zeroValue} p.GetAfter() p = &PullRequestTargetEvent{} p.GetAfter() p = nil p.GetAfter() } func TestPullRequestTargetEvent_GetAssignee(tt *testing.T) { p := &PullRequestTargetEvent{} p.GetAssignee() p = nil p.GetAssignee() } func TestPullRequestTargetEvent_GetBefore(tt *testing.T) { var zeroValue string p := &PullRequestTargetEvent{Before: &zeroValue} p.GetBefore() p = &PullRequestTargetEvent{} p.GetBefore() p = nil p.GetBefore() } func TestPullRequestTargetEvent_GetChanges(tt *testing.T) { p := &PullRequestTargetEvent{} p.GetChanges() p = nil p.GetChanges() } func TestPullRequestTargetEvent_GetInstallation(tt *testing.T) { p := &PullRequestTargetEvent{} p.GetInstallation() p = nil p.GetInstallation() } func TestPullRequestTargetEvent_GetLabel(tt *testing.T) { p := &PullRequestTargetEvent{} p.GetLabel() p = nil p.GetLabel() } func TestPullRequestTargetEvent_GetNumber(tt *testing.T) { var zeroValue int p := &PullRequestTargetEvent{Number: &zeroValue} p.GetNumber() p = &PullRequestTargetEvent{} p.GetNumber() p = nil p.GetNumber() } func TestPullRequestTargetEvent_GetOrganization(tt *testing.T) { p := &PullRequestTargetEvent{} p.GetOrganization() p = nil p.GetOrganization() } func TestPullRequestTargetEvent_GetPullRequest(tt *testing.T) { p := &PullRequestTargetEvent{} p.GetPullRequest() p = nil p.GetPullRequest() } func TestPullRequestTargetEvent_GetRepo(tt *testing.T) { p := &PullRequestTargetEvent{} p.GetRepo() p = nil p.GetRepo() } func TestPullRequestTargetEvent_GetRequestedReviewer(tt *testing.T) { p := &PullRequestTargetEvent{} p.GetRequestedReviewer() p = nil p.GetRequestedReviewer() } func TestPullRequestTargetEvent_GetRequestedTeam(tt *testing.T) { p := &PullRequestTargetEvent{} p.GetRequestedTeam() p = nil p.GetRequestedTeam() } func TestPullRequestTargetEvent_GetSender(tt *testing.T) { p := &PullRequestTargetEvent{} p.GetSender() p = nil p.GetSender() } func TestPullStats_GetMergablePulls(tt *testing.T) { var zeroValue int p := &PullStats{MergablePulls: &zeroValue} p.GetMergablePulls() p = &PullStats{} p.GetMergablePulls() p = nil p.GetMergablePulls() } func TestPullStats_GetMergedPulls(tt *testing.T) { var zeroValue int p := &PullStats{MergedPulls: &zeroValue} p.GetMergedPulls() p = &PullStats{} p.GetMergedPulls() p = nil p.GetMergedPulls() } func TestPullStats_GetTotalPulls(tt *testing.T) { var zeroValue int p := &PullStats{TotalPulls: &zeroValue} p.GetTotalPulls() p = &PullStats{} p.GetTotalPulls() p = nil p.GetTotalPulls() } func TestPullStats_GetUnmergablePulls(tt *testing.T) { var zeroValue int p := &PullStats{UnmergablePulls: &zeroValue} p.GetUnmergablePulls() p = &PullStats{} p.GetUnmergablePulls() p = nil p.GetUnmergablePulls() } func TestPunchCard_GetCommits(tt *testing.T) { var zeroValue int p := &PunchCard{Commits: &zeroValue} p.GetCommits() p = &PunchCard{} p.GetCommits() p = nil p.GetCommits() } func TestPunchCard_GetDay(tt *testing.T) { var zeroValue int p := &PunchCard{Day: &zeroValue} p.GetDay() p = &PunchCard{} p.GetDay() p = nil p.GetDay() } func TestPunchCard_GetHour(tt *testing.T) { var zeroValue int p := &PunchCard{Hour: &zeroValue} p.GetHour() p = &PunchCard{} p.GetHour() p = nil p.GetHour() } func TestPushEvent_GetAfter(tt *testing.T) { var zeroValue string p := &PushEvent{After: &zeroValue} p.GetAfter() p = &PushEvent{} p.GetAfter() p = nil p.GetAfter() } func TestPushEvent_GetBaseRef(tt *testing.T) { var zeroValue string p := &PushEvent{BaseRef: &zeroValue} p.GetBaseRef() p = &PushEvent{} p.GetBaseRef() p = nil p.GetBaseRef() } func TestPushEvent_GetBefore(tt *testing.T) { var zeroValue string p := &PushEvent{Before: &zeroValue} p.GetBefore() p = &PushEvent{} p.GetBefore() p = nil p.GetBefore() } func TestPushEvent_GetCompare(tt *testing.T) { var zeroValue string p := &PushEvent{Compare: &zeroValue} p.GetCompare() p = &PushEvent{} p.GetCompare() p = nil p.GetCompare() } func TestPushEvent_GetCreated(tt *testing.T) { var zeroValue bool p := &PushEvent{Created: &zeroValue} p.GetCreated() p = &PushEvent{} p.GetCreated() p = nil p.GetCreated() } func TestPushEvent_GetDeleted(tt *testing.T) { var zeroValue bool p := &PushEvent{Deleted: &zeroValue} p.GetDeleted() p = &PushEvent{} p.GetDeleted() p = nil p.GetDeleted() } func TestPushEvent_GetDistinctSize(tt *testing.T) { var zeroValue int p := &PushEvent{DistinctSize: &zeroValue} p.GetDistinctSize() p = &PushEvent{} p.GetDistinctSize() p = nil p.GetDistinctSize() } func TestPushEvent_GetForced(tt *testing.T) { var zeroValue bool p := &PushEvent{Forced: &zeroValue} p.GetForced() p = &PushEvent{} p.GetForced() p = nil p.GetForced() } func TestPushEvent_GetHead(tt *testing.T) { var zeroValue string p := &PushEvent{Head: &zeroValue} p.GetHead() p = &PushEvent{} p.GetHead() p = nil p.GetHead() } func TestPushEvent_GetHeadCommit(tt *testing.T) { p := &PushEvent{} p.GetHeadCommit() p = nil p.GetHeadCommit() } func TestPushEvent_GetInstallation(tt *testing.T) { p := &PushEvent{} p.GetInstallation() p = nil p.GetInstallation() } func TestPushEvent_GetPusher(tt *testing.T) { p := &PushEvent{} p.GetPusher() p = nil p.GetPusher() } func TestPushEvent_GetPushID(tt *testing.T) { var zeroValue int64 p := &PushEvent{PushID: &zeroValue} p.GetPushID() p = &PushEvent{} p.GetPushID() p = nil p.GetPushID() } func TestPushEvent_GetRef(tt *testing.T) { var zeroValue string p := &PushEvent{Ref: &zeroValue} p.GetRef() p = &PushEvent{} p.GetRef() p = nil p.GetRef() } func TestPushEvent_GetRepo(tt *testing.T) { p := &PushEvent{} p.GetRepo() p = nil p.GetRepo() } func TestPushEvent_GetSender(tt *testing.T) { p := &PushEvent{} p.GetSender() p = nil p.GetSender() } func TestPushEvent_GetSize(tt *testing.T) { var zeroValue int p := &PushEvent{Size: &zeroValue} p.GetSize() p = &PushEvent{} p.GetSize() p = nil p.GetSize() } func TestPushEventRepoOwner_GetEmail(tt *testing.T) { var zeroValue string p := &PushEventRepoOwner{Email: &zeroValue} p.GetEmail() p = &PushEventRepoOwner{} p.GetEmail() p = nil p.GetEmail() } func TestPushEventRepoOwner_GetName(tt *testing.T) { var zeroValue string p := &PushEventRepoOwner{Name: &zeroValue} p.GetName() p = &PushEventRepoOwner{} p.GetName() p = nil p.GetName() } func TestPushEventRepository_GetArchived(tt *testing.T) { var zeroValue bool p := &PushEventRepository{Archived: &zeroValue} p.GetArchived() p = &PushEventRepository{} p.GetArchived() p = nil p.GetArchived() } func TestPushEventRepository_GetArchiveURL(tt *testing.T) { var zeroValue string p := &PushEventRepository{ArchiveURL: &zeroValue} p.GetArchiveURL() p = &PushEventRepository{} p.GetArchiveURL() p = nil p.GetArchiveURL() } func TestPushEventRepository_GetCloneURL(tt *testing.T) { var zeroValue string p := &PushEventRepository{CloneURL: &zeroValue} p.GetCloneURL() p = &PushEventRepository{} p.GetCloneURL() p = nil p.GetCloneURL() } func TestPushEventRepository_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp p := &PushEventRepository{CreatedAt: &zeroValue} p.GetCreatedAt() p = &PushEventRepository{} p.GetCreatedAt() p = nil p.GetCreatedAt() } func TestPushEventRepository_GetDefaultBranch(tt *testing.T) { var zeroValue string p := &PushEventRepository{DefaultBranch: &zeroValue} p.GetDefaultBranch() p = &PushEventRepository{} p.GetDefaultBranch() p = nil p.GetDefaultBranch() } func TestPushEventRepository_GetDescription(tt *testing.T) { var zeroValue string p := &PushEventRepository{Description: &zeroValue} p.GetDescription() p = &PushEventRepository{} p.GetDescription() p = nil p.GetDescription() } func TestPushEventRepository_GetDisabled(tt *testing.T) { var zeroValue bool p := &PushEventRepository{Disabled: &zeroValue} p.GetDisabled() p = &PushEventRepository{} p.GetDisabled() p = nil p.GetDisabled() } func TestPushEventRepository_GetFork(tt *testing.T) { var zeroValue bool p := &PushEventRepository{Fork: &zeroValue} p.GetFork() p = &PushEventRepository{} p.GetFork() p = nil p.GetFork() } func TestPushEventRepository_GetForksCount(tt *testing.T) { var zeroValue int p := &PushEventRepository{ForksCount: &zeroValue} p.GetForksCount() p = &PushEventRepository{} p.GetForksCount() p = nil p.GetForksCount() } func TestPushEventRepository_GetFullName(tt *testing.T) { var zeroValue string p := &PushEventRepository{FullName: &zeroValue} p.GetFullName() p = &PushEventRepository{} p.GetFullName() p = nil p.GetFullName() } func TestPushEventRepository_GetGitURL(tt *testing.T) { var zeroValue string p := &PushEventRepository{GitURL: &zeroValue} p.GetGitURL() p = &PushEventRepository{} p.GetGitURL() p = nil p.GetGitURL() } func TestPushEventRepository_GetHasDownloads(tt *testing.T) { var zeroValue bool p := &PushEventRepository{HasDownloads: &zeroValue} p.GetHasDownloads() p = &PushEventRepository{} p.GetHasDownloads() p = nil p.GetHasDownloads() } func TestPushEventRepository_GetHasIssues(tt *testing.T) { var zeroValue bool p := &PushEventRepository{HasIssues: &zeroValue} p.GetHasIssues() p = &PushEventRepository{} p.GetHasIssues() p = nil p.GetHasIssues() } func TestPushEventRepository_GetHasPages(tt *testing.T) { var zeroValue bool p := &PushEventRepository{HasPages: &zeroValue} p.GetHasPages() p = &PushEventRepository{} p.GetHasPages() p = nil p.GetHasPages() } func TestPushEventRepository_GetHasWiki(tt *testing.T) { var zeroValue bool p := &PushEventRepository{HasWiki: &zeroValue} p.GetHasWiki() p = &PushEventRepository{} p.GetHasWiki() p = nil p.GetHasWiki() } func TestPushEventRepository_GetHomepage(tt *testing.T) { var zeroValue string p := &PushEventRepository{Homepage: &zeroValue} p.GetHomepage() p = &PushEventRepository{} p.GetHomepage() p = nil p.GetHomepage() } func TestPushEventRepository_GetHTMLURL(tt *testing.T) { var zeroValue string p := &PushEventRepository{HTMLURL: &zeroValue} p.GetHTMLURL() p = &PushEventRepository{} p.GetHTMLURL() p = nil p.GetHTMLURL() } func TestPushEventRepository_GetID(tt *testing.T) { var zeroValue int64 p := &PushEventRepository{ID: &zeroValue} p.GetID() p = &PushEventRepository{} p.GetID() p = nil p.GetID() } func TestPushEventRepository_GetLanguage(tt *testing.T) { var zeroValue string p := &PushEventRepository{Language: &zeroValue} p.GetLanguage() p = &PushEventRepository{} p.GetLanguage() p = nil p.GetLanguage() } func TestPushEventRepository_GetMasterBranch(tt *testing.T) { var zeroValue string p := &PushEventRepository{MasterBranch: &zeroValue} p.GetMasterBranch() p = &PushEventRepository{} p.GetMasterBranch() p = nil p.GetMasterBranch() } func TestPushEventRepository_GetName(tt *testing.T) { var zeroValue string p := &PushEventRepository{Name: &zeroValue} p.GetName() p = &PushEventRepository{} p.GetName() p = nil p.GetName() } func TestPushEventRepository_GetNodeID(tt *testing.T) { var zeroValue string p := &PushEventRepository{NodeID: &zeroValue} p.GetNodeID() p = &PushEventRepository{} p.GetNodeID() p = nil p.GetNodeID() } func TestPushEventRepository_GetOpenIssuesCount(tt *testing.T) { var zeroValue int p := &PushEventRepository{OpenIssuesCount: &zeroValue} p.GetOpenIssuesCount() p = &PushEventRepository{} p.GetOpenIssuesCount() p = nil p.GetOpenIssuesCount() } func TestPushEventRepository_GetOrganization(tt *testing.T) { var zeroValue string p := &PushEventRepository{Organization: &zeroValue} p.GetOrganization() p = &PushEventRepository{} p.GetOrganization() p = nil p.GetOrganization() } func TestPushEventRepository_GetOwner(tt *testing.T) { p := &PushEventRepository{} p.GetOwner() p = nil p.GetOwner() } func TestPushEventRepository_GetPrivate(tt *testing.T) { var zeroValue bool p := &PushEventRepository{Private: &zeroValue} p.GetPrivate() p = &PushEventRepository{} p.GetPrivate() p = nil p.GetPrivate() } func TestPushEventRepository_GetPullsURL(tt *testing.T) { var zeroValue string p := &PushEventRepository{PullsURL: &zeroValue} p.GetPullsURL() p = &PushEventRepository{} p.GetPullsURL() p = nil p.GetPullsURL() } func TestPushEventRepository_GetPushedAt(tt *testing.T) { var zeroValue Timestamp p := &PushEventRepository{PushedAt: &zeroValue} p.GetPushedAt() p = &PushEventRepository{} p.GetPushedAt() p = nil p.GetPushedAt() } func TestPushEventRepository_GetSize(tt *testing.T) { var zeroValue int p := &PushEventRepository{Size: &zeroValue} p.GetSize() p = &PushEventRepository{} p.GetSize() p = nil p.GetSize() } func TestPushEventRepository_GetSSHURL(tt *testing.T) { var zeroValue string p := &PushEventRepository{SSHURL: &zeroValue} p.GetSSHURL() p = &PushEventRepository{} p.GetSSHURL() p = nil p.GetSSHURL() } func TestPushEventRepository_GetStargazersCount(tt *testing.T) { var zeroValue int p := &PushEventRepository{StargazersCount: &zeroValue} p.GetStargazersCount() p = &PushEventRepository{} p.GetStargazersCount() p = nil p.GetStargazersCount() } func TestPushEventRepository_GetStatusesURL(tt *testing.T) { var zeroValue string p := &PushEventRepository{StatusesURL: &zeroValue} p.GetStatusesURL() p = &PushEventRepository{} p.GetStatusesURL() p = nil p.GetStatusesURL() } func TestPushEventRepository_GetSVNURL(tt *testing.T) { var zeroValue string p := &PushEventRepository{SVNURL: &zeroValue} p.GetSVNURL() p = &PushEventRepository{} p.GetSVNURL() p = nil p.GetSVNURL() } func TestPushEventRepository_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp p := &PushEventRepository{UpdatedAt: &zeroValue} p.GetUpdatedAt() p = &PushEventRepository{} p.GetUpdatedAt() p = nil p.GetUpdatedAt() } func TestPushEventRepository_GetURL(tt *testing.T) { var zeroValue string p := &PushEventRepository{URL: &zeroValue} p.GetURL() p = &PushEventRepository{} p.GetURL() p = nil p.GetURL() } func TestPushEventRepository_GetWatchersCount(tt *testing.T) { var zeroValue int p := &PushEventRepository{WatchersCount: &zeroValue} p.GetWatchersCount() p = &PushEventRepository{} p.GetWatchersCount() p = nil p.GetWatchersCount() } func TestRateLimits_GetCore(tt *testing.T) { r := &RateLimits{} r.GetCore() r = nil r.GetCore() } func TestRateLimits_GetSearch(tt *testing.T) { r := &RateLimits{} r.GetSearch() r = nil r.GetSearch() } func TestReaction_GetContent(tt *testing.T) { var zeroValue string r := &Reaction{Content: &zeroValue} r.GetContent() r = &Reaction{} r.GetContent() r = nil r.GetContent() } func TestReaction_GetID(tt *testing.T) { var zeroValue int64 r := &Reaction{ID: &zeroValue} r.GetID() r = &Reaction{} r.GetID() r = nil r.GetID() } func TestReaction_GetNodeID(tt *testing.T) { var zeroValue string r := &Reaction{NodeID: &zeroValue} r.GetNodeID() r = &Reaction{} r.GetNodeID() r = nil r.GetNodeID() } func TestReaction_GetUser(tt *testing.T) { r := &Reaction{} r.GetUser() r = nil r.GetUser() } func TestReactions_GetConfused(tt *testing.T) { var zeroValue int r := &Reactions{Confused: &zeroValue} r.GetConfused() r = &Reactions{} r.GetConfused() r = nil r.GetConfused() } func TestReactions_GetEyes(tt *testing.T) { var zeroValue int r := &Reactions{Eyes: &zeroValue} r.GetEyes() r = &Reactions{} r.GetEyes() r = nil r.GetEyes() } func TestReactions_GetHeart(tt *testing.T) { var zeroValue int r := &Reactions{Heart: &zeroValue} r.GetHeart() r = &Reactions{} r.GetHeart() r = nil r.GetHeart() } func TestReactions_GetHooray(tt *testing.T) { var zeroValue int r := &Reactions{Hooray: &zeroValue} r.GetHooray() r = &Reactions{} r.GetHooray() r = nil r.GetHooray() } func TestReactions_GetLaugh(tt *testing.T) { var zeroValue int r := &Reactions{Laugh: &zeroValue} r.GetLaugh() r = &Reactions{} r.GetLaugh() r = nil r.GetLaugh() } func TestReactions_GetMinusOne(tt *testing.T) { var zeroValue int r := &Reactions{MinusOne: &zeroValue} r.GetMinusOne() r = &Reactions{} r.GetMinusOne() r = nil r.GetMinusOne() } func TestReactions_GetPlusOne(tt *testing.T) { var zeroValue int r := &Reactions{PlusOne: &zeroValue} r.GetPlusOne() r = &Reactions{} r.GetPlusOne() r = nil r.GetPlusOne() } func TestReactions_GetRocket(tt *testing.T) { var zeroValue int r := &Reactions{Rocket: &zeroValue} r.GetRocket() r = &Reactions{} r.GetRocket() r = nil r.GetRocket() } func TestReactions_GetTotalCount(tt *testing.T) { var zeroValue int r := &Reactions{TotalCount: &zeroValue} r.GetTotalCount() r = &Reactions{} r.GetTotalCount() r = nil r.GetTotalCount() } func TestReactions_GetURL(tt *testing.T) { var zeroValue string r := &Reactions{URL: &zeroValue} r.GetURL() r = &Reactions{} r.GetURL() r = nil r.GetURL() } func TestReference_GetNodeID(tt *testing.T) { var zeroValue string r := &Reference{NodeID: &zeroValue} r.GetNodeID() r = &Reference{} r.GetNodeID() r = nil r.GetNodeID() } func TestReference_GetObject(tt *testing.T) { r := &Reference{} r.GetObject() r = nil r.GetObject() } func TestReference_GetRef(tt *testing.T) { var zeroValue string r := &Reference{Ref: &zeroValue} r.GetRef() r = &Reference{} r.GetRef() r = nil r.GetRef() } func TestReference_GetURL(tt *testing.T) { var zeroValue string r := &Reference{URL: &zeroValue} r.GetURL() r = &Reference{} r.GetURL() r = nil r.GetURL() } func TestRegistrationToken_GetExpiresAt(tt *testing.T) { var zeroValue Timestamp r := &RegistrationToken{ExpiresAt: &zeroValue} r.GetExpiresAt() r = &RegistrationToken{} r.GetExpiresAt() r = nil r.GetExpiresAt() } func TestRegistrationToken_GetToken(tt *testing.T) { var zeroValue string r := &RegistrationToken{Token: &zeroValue} r.GetToken() r = &RegistrationToken{} r.GetToken() r = nil r.GetToken() } func TestReleaseAsset_GetBrowserDownloadURL(tt *testing.T) { var zeroValue string r := &ReleaseAsset{BrowserDownloadURL: &zeroValue} r.GetBrowserDownloadURL() r = &ReleaseAsset{} r.GetBrowserDownloadURL() r = nil r.GetBrowserDownloadURL() } func TestReleaseAsset_GetContentType(tt *testing.T) { var zeroValue string r := &ReleaseAsset{ContentType: &zeroValue} r.GetContentType() r = &ReleaseAsset{} r.GetContentType() r = nil r.GetContentType() } func TestReleaseAsset_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp r := &ReleaseAsset{CreatedAt: &zeroValue} r.GetCreatedAt() r = &ReleaseAsset{} r.GetCreatedAt() r = nil r.GetCreatedAt() } func TestReleaseAsset_GetDownloadCount(tt *testing.T) { var zeroValue int r := &ReleaseAsset{DownloadCount: &zeroValue} r.GetDownloadCount() r = &ReleaseAsset{} r.GetDownloadCount() r = nil r.GetDownloadCount() } func TestReleaseAsset_GetID(tt *testing.T) { var zeroValue int64 r := &ReleaseAsset{ID: &zeroValue} r.GetID() r = &ReleaseAsset{} r.GetID() r = nil r.GetID() } func TestReleaseAsset_GetLabel(tt *testing.T) { var zeroValue string r := &ReleaseAsset{Label: &zeroValue} r.GetLabel() r = &ReleaseAsset{} r.GetLabel() r = nil r.GetLabel() } func TestReleaseAsset_GetName(tt *testing.T) { var zeroValue string r := &ReleaseAsset{Name: &zeroValue} r.GetName() r = &ReleaseAsset{} r.GetName() r = nil r.GetName() } func TestReleaseAsset_GetNodeID(tt *testing.T) { var zeroValue string r := &ReleaseAsset{NodeID: &zeroValue} r.GetNodeID() r = &ReleaseAsset{} r.GetNodeID() r = nil r.GetNodeID() } func TestReleaseAsset_GetSize(tt *testing.T) { var zeroValue int r := &ReleaseAsset{Size: &zeroValue} r.GetSize() r = &ReleaseAsset{} r.GetSize() r = nil r.GetSize() } func TestReleaseAsset_GetState(tt *testing.T) { var zeroValue string r := &ReleaseAsset{State: &zeroValue} r.GetState() r = &ReleaseAsset{} r.GetState() r = nil r.GetState() } func TestReleaseAsset_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp r := &ReleaseAsset{UpdatedAt: &zeroValue} r.GetUpdatedAt() r = &ReleaseAsset{} r.GetUpdatedAt() r = nil r.GetUpdatedAt() } func TestReleaseAsset_GetUploader(tt *testing.T) { r := &ReleaseAsset{} r.GetUploader() r = nil r.GetUploader() } func TestReleaseAsset_GetURL(tt *testing.T) { var zeroValue string r := &ReleaseAsset{URL: &zeroValue} r.GetURL() r = &ReleaseAsset{} r.GetURL() r = nil r.GetURL() } func TestReleaseEvent_GetAction(tt *testing.T) { var zeroValue string r := &ReleaseEvent{Action: &zeroValue} r.GetAction() r = &ReleaseEvent{} r.GetAction() r = nil r.GetAction() } func TestReleaseEvent_GetInstallation(tt *testing.T) { r := &ReleaseEvent{} r.GetInstallation() r = nil r.GetInstallation() } func TestReleaseEvent_GetRelease(tt *testing.T) { r := &ReleaseEvent{} r.GetRelease() r = nil r.GetRelease() } func TestReleaseEvent_GetRepo(tt *testing.T) { r := &ReleaseEvent{} r.GetRepo() r = nil r.GetRepo() } func TestReleaseEvent_GetSender(tt *testing.T) { r := &ReleaseEvent{} r.GetSender() r = nil r.GetSender() } func TestRemoveToken_GetExpiresAt(tt *testing.T) { var zeroValue Timestamp r := &RemoveToken{ExpiresAt: &zeroValue} r.GetExpiresAt() r = &RemoveToken{} r.GetExpiresAt() r = nil r.GetExpiresAt() } func TestRemoveToken_GetToken(tt *testing.T) { var zeroValue string r := &RemoveToken{Token: &zeroValue} r.GetToken() r = &RemoveToken{} r.GetToken() r = nil r.GetToken() } func TestRename_GetFrom(tt *testing.T) { var zeroValue string r := &Rename{From: &zeroValue} r.GetFrom() r = &Rename{} r.GetFrom() r = nil r.GetFrom() } func TestRename_GetTo(tt *testing.T) { var zeroValue string r := &Rename{To: &zeroValue} r.GetTo() r = &Rename{} r.GetTo() r = nil r.GetTo() } func TestRenameOrgResponse_GetMessage(tt *testing.T) { var zeroValue string r := &RenameOrgResponse{Message: &zeroValue} r.GetMessage() r = &RenameOrgResponse{} r.GetMessage() r = nil r.GetMessage() } func TestRenameOrgResponse_GetURL(tt *testing.T) { var zeroValue string r := &RenameOrgResponse{URL: &zeroValue} r.GetURL() r = &RenameOrgResponse{} r.GetURL() r = nil r.GetURL() } func TestRepositoriesSearchResult_GetIncompleteResults(tt *testing.T) { var zeroValue bool r := &RepositoriesSearchResult{IncompleteResults: &zeroValue} r.GetIncompleteResults() r = &RepositoriesSearchResult{} r.GetIncompleteResults() r = nil r.GetIncompleteResults() } func TestRepositoriesSearchResult_GetTotal(tt *testing.T) { var zeroValue int r := &RepositoriesSearchResult{Total: &zeroValue} r.GetTotal() r = &RepositoriesSearchResult{} r.GetTotal() r = nil r.GetTotal() } func TestRepository_GetAllowMergeCommit(tt *testing.T) { var zeroValue bool r := &Repository{AllowMergeCommit: &zeroValue} r.GetAllowMergeCommit() r = &Repository{} r.GetAllowMergeCommit() r = nil r.GetAllowMergeCommit() } func TestRepository_GetAllowRebaseMerge(tt *testing.T) { var zeroValue bool r := &Repository{AllowRebaseMerge: &zeroValue} r.GetAllowRebaseMerge() r = &Repository{} r.GetAllowRebaseMerge() r = nil r.GetAllowRebaseMerge() } func TestRepository_GetAllowSquashMerge(tt *testing.T) { var zeroValue bool r := &Repository{AllowSquashMerge: &zeroValue} r.GetAllowSquashMerge() r = &Repository{} r.GetAllowSquashMerge() r = nil r.GetAllowSquashMerge() } func TestRepository_GetArchived(tt *testing.T) { var zeroValue bool r := &Repository{Archived: &zeroValue} r.GetArchived() r = &Repository{} r.GetArchived() r = nil r.GetArchived() } func TestRepository_GetArchiveURL(tt *testing.T) { var zeroValue string r := &Repository{ArchiveURL: &zeroValue} r.GetArchiveURL() r = &Repository{} r.GetArchiveURL() r = nil r.GetArchiveURL() } func TestRepository_GetAssigneesURL(tt *testing.T) { var zeroValue string r := &Repository{AssigneesURL: &zeroValue} r.GetAssigneesURL() r = &Repository{} r.GetAssigneesURL() r = nil r.GetAssigneesURL() } func TestRepository_GetAutoInit(tt *testing.T) { var zeroValue bool r := &Repository{AutoInit: &zeroValue} r.GetAutoInit() r = &Repository{} r.GetAutoInit() r = nil r.GetAutoInit() } func TestRepository_GetBlobsURL(tt *testing.T) { var zeroValue string r := &Repository{BlobsURL: &zeroValue} r.GetBlobsURL() r = &Repository{} r.GetBlobsURL() r = nil r.GetBlobsURL() } func TestRepository_GetBranchesURL(tt *testing.T) { var zeroValue string r := &Repository{BranchesURL: &zeroValue} r.GetBranchesURL() r = &Repository{} r.GetBranchesURL() r = nil r.GetBranchesURL() } func TestRepository_GetCloneURL(tt *testing.T) { var zeroValue string r := &Repository{CloneURL: &zeroValue} r.GetCloneURL() r = &Repository{} r.GetCloneURL() r = nil r.GetCloneURL() } func TestRepository_GetCodeOfConduct(tt *testing.T) { r := &Repository{} r.GetCodeOfConduct() r = nil r.GetCodeOfConduct() } func TestRepository_GetCollaboratorsURL(tt *testing.T) { var zeroValue string r := &Repository{CollaboratorsURL: &zeroValue} r.GetCollaboratorsURL() r = &Repository{} r.GetCollaboratorsURL() r = nil r.GetCollaboratorsURL() } func TestRepository_GetCommentsURL(tt *testing.T) { var zeroValue string r := &Repository{CommentsURL: &zeroValue} r.GetCommentsURL() r = &Repository{} r.GetCommentsURL() r = nil r.GetCommentsURL() } func TestRepository_GetCommitsURL(tt *testing.T) { var zeroValue string r := &Repository{CommitsURL: &zeroValue} r.GetCommitsURL() r = &Repository{} r.GetCommitsURL() r = nil r.GetCommitsURL() } func TestRepository_GetCompareURL(tt *testing.T) { var zeroValue string r := &Repository{CompareURL: &zeroValue} r.GetCompareURL() r = &Repository{} r.GetCompareURL() r = nil r.GetCompareURL() } func TestRepository_GetContentsURL(tt *testing.T) { var zeroValue string r := &Repository{ContentsURL: &zeroValue} r.GetContentsURL() r = &Repository{} r.GetContentsURL() r = nil r.GetContentsURL() } func TestRepository_GetContributorsURL(tt *testing.T) { var zeroValue string r := &Repository{ContributorsURL: &zeroValue} r.GetContributorsURL() r = &Repository{} r.GetContributorsURL() r = nil r.GetContributorsURL() } func TestRepository_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp r := &Repository{CreatedAt: &zeroValue} r.GetCreatedAt() r = &Repository{} r.GetCreatedAt() r = nil r.GetCreatedAt() } func TestRepository_GetDefaultBranch(tt *testing.T) { var zeroValue string r := &Repository{DefaultBranch: &zeroValue} r.GetDefaultBranch() r = &Repository{} r.GetDefaultBranch() r = nil r.GetDefaultBranch() } func TestRepository_GetDeleteBranchOnMerge(tt *testing.T) { var zeroValue bool r := &Repository{DeleteBranchOnMerge: &zeroValue} r.GetDeleteBranchOnMerge() r = &Repository{} r.GetDeleteBranchOnMerge() r = nil r.GetDeleteBranchOnMerge() } func TestRepository_GetDeploymentsURL(tt *testing.T) { var zeroValue string r := &Repository{DeploymentsURL: &zeroValue} r.GetDeploymentsURL() r = &Repository{} r.GetDeploymentsURL() r = nil r.GetDeploymentsURL() } func TestRepository_GetDescription(tt *testing.T) { var zeroValue string r := &Repository{Description: &zeroValue} r.GetDescription() r = &Repository{} r.GetDescription() r = nil r.GetDescription() } func TestRepository_GetDisabled(tt *testing.T) { var zeroValue bool r := &Repository{Disabled: &zeroValue} r.GetDisabled() r = &Repository{} r.GetDisabled() r = nil r.GetDisabled() } func TestRepository_GetDownloadsURL(tt *testing.T) { var zeroValue string r := &Repository{DownloadsURL: &zeroValue} r.GetDownloadsURL() r = &Repository{} r.GetDownloadsURL() r = nil r.GetDownloadsURL() } func TestRepository_GetEventsURL(tt *testing.T) { var zeroValue string r := &Repository{EventsURL: &zeroValue} r.GetEventsURL() r = &Repository{} r.GetEventsURL() r = nil r.GetEventsURL() } func TestRepository_GetFork(tt *testing.T) { var zeroValue bool r := &Repository{Fork: &zeroValue} r.GetFork() r = &Repository{} r.GetFork() r = nil r.GetFork() } func TestRepository_GetForksCount(tt *testing.T) { var zeroValue int r := &Repository{ForksCount: &zeroValue} r.GetForksCount() r = &Repository{} r.GetForksCount() r = nil r.GetForksCount() } func TestRepository_GetForksURL(tt *testing.T) { var zeroValue string r := &Repository{ForksURL: &zeroValue} r.GetForksURL() r = &Repository{} r.GetForksURL() r = nil r.GetForksURL() } func TestRepository_GetFullName(tt *testing.T) { var zeroValue string r := &Repository{FullName: &zeroValue} r.GetFullName() r = &Repository{} r.GetFullName() r = nil r.GetFullName() } func TestRepository_GetGitCommitsURL(tt *testing.T) { var zeroValue string r := &Repository{GitCommitsURL: &zeroValue} r.GetGitCommitsURL() r = &Repository{} r.GetGitCommitsURL() r = nil r.GetGitCommitsURL() } func TestRepository_GetGitignoreTemplate(tt *testing.T) { var zeroValue string r := &Repository{GitignoreTemplate: &zeroValue} r.GetGitignoreTemplate() r = &Repository{} r.GetGitignoreTemplate() r = nil r.GetGitignoreTemplate() } func TestRepository_GetGitRefsURL(tt *testing.T) { var zeroValue string r := &Repository{GitRefsURL: &zeroValue} r.GetGitRefsURL() r = &Repository{} r.GetGitRefsURL() r = nil r.GetGitRefsURL() } func TestRepository_GetGitTagsURL(tt *testing.T) { var zeroValue string r := &Repository{GitTagsURL: &zeroValue} r.GetGitTagsURL() r = &Repository{} r.GetGitTagsURL() r = nil r.GetGitTagsURL() } func TestRepository_GetGitURL(tt *testing.T) { var zeroValue string r := &Repository{GitURL: &zeroValue} r.GetGitURL() r = &Repository{} r.GetGitURL() r = nil r.GetGitURL() } func TestRepository_GetHasDownloads(tt *testing.T) { var zeroValue bool r := &Repository{HasDownloads: &zeroValue} r.GetHasDownloads() r = &Repository{} r.GetHasDownloads() r = nil r.GetHasDownloads() } func TestRepository_GetHasIssues(tt *testing.T) { var zeroValue bool r := &Repository{HasIssues: &zeroValue} r.GetHasIssues() r = &Repository{} r.GetHasIssues() r = nil r.GetHasIssues() } func TestRepository_GetHasPages(tt *testing.T) { var zeroValue bool r := &Repository{HasPages: &zeroValue} r.GetHasPages() r = &Repository{} r.GetHasPages() r = nil r.GetHasPages() } func TestRepository_GetHasProjects(tt *testing.T) { var zeroValue bool r := &Repository{HasProjects: &zeroValue} r.GetHasProjects() r = &Repository{} r.GetHasProjects() r = nil r.GetHasProjects() } func TestRepository_GetHasWiki(tt *testing.T) { var zeroValue bool r := &Repository{HasWiki: &zeroValue} r.GetHasWiki() r = &Repository{} r.GetHasWiki() r = nil r.GetHasWiki() } func TestRepository_GetHomepage(tt *testing.T) { var zeroValue string r := &Repository{Homepage: &zeroValue} r.GetHomepage() r = &Repository{} r.GetHomepage() r = nil r.GetHomepage() } func TestRepository_GetHooksURL(tt *testing.T) { var zeroValue string r := &Repository{HooksURL: &zeroValue} r.GetHooksURL() r = &Repository{} r.GetHooksURL() r = nil r.GetHooksURL() } func TestRepository_GetHTMLURL(tt *testing.T) { var zeroValue string r := &Repository{HTMLURL: &zeroValue} r.GetHTMLURL() r = &Repository{} r.GetHTMLURL() r = nil r.GetHTMLURL() } func TestRepository_GetID(tt *testing.T) { var zeroValue int64 r := &Repository{ID: &zeroValue} r.GetID() r = &Repository{} r.GetID() r = nil r.GetID() } func TestRepository_GetIssueCommentURL(tt *testing.T) { var zeroValue string r := &Repository{IssueCommentURL: &zeroValue} r.GetIssueCommentURL() r = &Repository{} r.GetIssueCommentURL() r = nil r.GetIssueCommentURL() } func TestRepository_GetIssueEventsURL(tt *testing.T) { var zeroValue string r := &Repository{IssueEventsURL: &zeroValue} r.GetIssueEventsURL() r = &Repository{} r.GetIssueEventsURL() r = nil r.GetIssueEventsURL() } func TestRepository_GetIssuesURL(tt *testing.T) { var zeroValue string r := &Repository{IssuesURL: &zeroValue} r.GetIssuesURL() r = &Repository{} r.GetIssuesURL() r = nil r.GetIssuesURL() } func TestRepository_GetIsTemplate(tt *testing.T) { var zeroValue bool r := &Repository{IsTemplate: &zeroValue} r.GetIsTemplate() r = &Repository{} r.GetIsTemplate() r = nil r.GetIsTemplate() } func TestRepository_GetKeysURL(tt *testing.T) { var zeroValue string r := &Repository{KeysURL: &zeroValue} r.GetKeysURL() r = &Repository{} r.GetKeysURL() r = nil r.GetKeysURL() } func TestRepository_GetLabelsURL(tt *testing.T) { var zeroValue string r := &Repository{LabelsURL: &zeroValue} r.GetLabelsURL() r = &Repository{} r.GetLabelsURL() r = nil r.GetLabelsURL() } func TestRepository_GetLanguage(tt *testing.T) { var zeroValue string r := &Repository{Language: &zeroValue} r.GetLanguage() r = &Repository{} r.GetLanguage() r = nil r.GetLanguage() } func TestRepository_GetLanguagesURL(tt *testing.T) { var zeroValue string r := &Repository{LanguagesURL: &zeroValue} r.GetLanguagesURL() r = &Repository{} r.GetLanguagesURL() r = nil r.GetLanguagesURL() } func TestRepository_GetLicense(tt *testing.T) { r := &Repository{} r.GetLicense() r = nil r.GetLicense() } func TestRepository_GetLicenseTemplate(tt *testing.T) { var zeroValue string r := &Repository{LicenseTemplate: &zeroValue} r.GetLicenseTemplate() r = &Repository{} r.GetLicenseTemplate() r = nil r.GetLicenseTemplate() } func TestRepository_GetMasterBranch(tt *testing.T) { var zeroValue string r := &Repository{MasterBranch: &zeroValue} r.GetMasterBranch() r = &Repository{} r.GetMasterBranch() r = nil r.GetMasterBranch() } func TestRepository_GetMergesURL(tt *testing.T) { var zeroValue string r := &Repository{MergesURL: &zeroValue} r.GetMergesURL() r = &Repository{} r.GetMergesURL() r = nil r.GetMergesURL() } func TestRepository_GetMilestonesURL(tt *testing.T) { var zeroValue string r := &Repository{MilestonesURL: &zeroValue} r.GetMilestonesURL() r = &Repository{} r.GetMilestonesURL() r = nil r.GetMilestonesURL() } func TestRepository_GetMirrorURL(tt *testing.T) { var zeroValue string r := &Repository{MirrorURL: &zeroValue} r.GetMirrorURL() r = &Repository{} r.GetMirrorURL() r = nil r.GetMirrorURL() } func TestRepository_GetName(tt *testing.T) { var zeroValue string r := &Repository{Name: &zeroValue} r.GetName() r = &Repository{} r.GetName() r = nil r.GetName() } func TestRepository_GetNetworkCount(tt *testing.T) { var zeroValue int r := &Repository{NetworkCount: &zeroValue} r.GetNetworkCount() r = &Repository{} r.GetNetworkCount() r = nil r.GetNetworkCount() } func TestRepository_GetNodeID(tt *testing.T) { var zeroValue string r := &Repository{NodeID: &zeroValue} r.GetNodeID() r = &Repository{} r.GetNodeID() r = nil r.GetNodeID() } func TestRepository_GetNotificationsURL(tt *testing.T) { var zeroValue string r := &Repository{NotificationsURL: &zeroValue} r.GetNotificationsURL() r = &Repository{} r.GetNotificationsURL() r = nil r.GetNotificationsURL() } func TestRepository_GetOpenIssues(tt *testing.T) { var zeroValue int r := &Repository{OpenIssues: &zeroValue} r.GetOpenIssues() r = &Repository{} r.GetOpenIssues() r = nil r.GetOpenIssues() } func TestRepository_GetOpenIssuesCount(tt *testing.T) { var zeroValue int r := &Repository{OpenIssuesCount: &zeroValue} r.GetOpenIssuesCount() r = &Repository{} r.GetOpenIssuesCount() r = nil r.GetOpenIssuesCount() } func TestRepository_GetOrganization(tt *testing.T) { r := &Repository{} r.GetOrganization() r = nil r.GetOrganization() } func TestRepository_GetOwner(tt *testing.T) { r := &Repository{} r.GetOwner() r = nil r.GetOwner() } func TestRepository_GetParent(tt *testing.T) { r := &Repository{} r.GetParent() r = nil r.GetParent() } func TestRepository_GetPermissions(tt *testing.T) { zeroValue := map[string]bool{} r := &Repository{Permissions: zeroValue} r.GetPermissions() r = &Repository{} r.GetPermissions() r = nil r.GetPermissions() } func TestRepository_GetPrivate(tt *testing.T) { var zeroValue bool r := &Repository{Private: &zeroValue} r.GetPrivate() r = &Repository{} r.GetPrivate() r = nil r.GetPrivate() } func TestRepository_GetPullsURL(tt *testing.T) { var zeroValue string r := &Repository{PullsURL: &zeroValue} r.GetPullsURL() r = &Repository{} r.GetPullsURL() r = nil r.GetPullsURL() } func TestRepository_GetPushedAt(tt *testing.T) { var zeroValue Timestamp r := &Repository{PushedAt: &zeroValue} r.GetPushedAt() r = &Repository{} r.GetPushedAt() r = nil r.GetPushedAt() } func TestRepository_GetReleasesURL(tt *testing.T) { var zeroValue string r := &Repository{ReleasesURL: &zeroValue} r.GetReleasesURL() r = &Repository{} r.GetReleasesURL() r = nil r.GetReleasesURL() } func TestRepository_GetSize(tt *testing.T) { var zeroValue int r := &Repository{Size: &zeroValue} r.GetSize() r = &Repository{} r.GetSize() r = nil r.GetSize() } func TestRepository_GetSource(tt *testing.T) { r := &Repository{} r.GetSource() r = nil r.GetSource() } func TestRepository_GetSSHURL(tt *testing.T) { var zeroValue string r := &Repository{SSHURL: &zeroValue} r.GetSSHURL() r = &Repository{} r.GetSSHURL() r = nil r.GetSSHURL() } func TestRepository_GetStargazersCount(tt *testing.T) { var zeroValue int r := &Repository{StargazersCount: &zeroValue} r.GetStargazersCount() r = &Repository{} r.GetStargazersCount() r = nil r.GetStargazersCount() } func TestRepository_GetStargazersURL(tt *testing.T) { var zeroValue string r := &Repository{StargazersURL: &zeroValue} r.GetStargazersURL() r = &Repository{} r.GetStargazersURL() r = nil r.GetStargazersURL() } func TestRepository_GetStatusesURL(tt *testing.T) { var zeroValue string r := &Repository{StatusesURL: &zeroValue} r.GetStatusesURL() r = &Repository{} r.GetStatusesURL() r = nil r.GetStatusesURL() } func TestRepository_GetSubscribersCount(tt *testing.T) { var zeroValue int r := &Repository{SubscribersCount: &zeroValue} r.GetSubscribersCount() r = &Repository{} r.GetSubscribersCount() r = nil r.GetSubscribersCount() } func TestRepository_GetSubscribersURL(tt *testing.T) { var zeroValue string r := &Repository{SubscribersURL: &zeroValue} r.GetSubscribersURL() r = &Repository{} r.GetSubscribersURL() r = nil r.GetSubscribersURL() } func TestRepository_GetSubscriptionURL(tt *testing.T) { var zeroValue string r := &Repository{SubscriptionURL: &zeroValue} r.GetSubscriptionURL() r = &Repository{} r.GetSubscriptionURL() r = nil r.GetSubscriptionURL() } func TestRepository_GetSVNURL(tt *testing.T) { var zeroValue string r := &Repository{SVNURL: &zeroValue} r.GetSVNURL() r = &Repository{} r.GetSVNURL() r = nil r.GetSVNURL() } func TestRepository_GetTagsURL(tt *testing.T) { var zeroValue string r := &Repository{TagsURL: &zeroValue} r.GetTagsURL() r = &Repository{} r.GetTagsURL() r = nil r.GetTagsURL() } func TestRepository_GetTeamID(tt *testing.T) { var zeroValue int64 r := &Repository{TeamID: &zeroValue} r.GetTeamID() r = &Repository{} r.GetTeamID() r = nil r.GetTeamID() } func TestRepository_GetTeamsURL(tt *testing.T) { var zeroValue string r := &Repository{TeamsURL: &zeroValue} r.GetTeamsURL() r = &Repository{} r.GetTeamsURL() r = nil r.GetTeamsURL() } func TestRepository_GetTemplateRepository(tt *testing.T) { r := &Repository{} r.GetTemplateRepository() r = nil r.GetTemplateRepository() } func TestRepository_GetTreesURL(tt *testing.T) { var zeroValue string r := &Repository{TreesURL: &zeroValue} r.GetTreesURL() r = &Repository{} r.GetTreesURL() r = nil r.GetTreesURL() } func TestRepository_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp r := &Repository{UpdatedAt: &zeroValue} r.GetUpdatedAt() r = &Repository{} r.GetUpdatedAt() r = nil r.GetUpdatedAt() } func TestRepository_GetURL(tt *testing.T) { var zeroValue string r := &Repository{URL: &zeroValue} r.GetURL() r = &Repository{} r.GetURL() r = nil r.GetURL() } func TestRepository_GetVisibility(tt *testing.T) { var zeroValue string r := &Repository{Visibility: &zeroValue} r.GetVisibility() r = &Repository{} r.GetVisibility() r = nil r.GetVisibility() } func TestRepository_GetWatchers(tt *testing.T) { var zeroValue int r := &Repository{Watchers: &zeroValue} r.GetWatchers() r = &Repository{} r.GetWatchers() r = nil r.GetWatchers() } func TestRepository_GetWatchersCount(tt *testing.T) { var zeroValue int r := &Repository{WatchersCount: &zeroValue} r.GetWatchersCount() r = &Repository{} r.GetWatchersCount() r = nil r.GetWatchersCount() } func TestRepositoryComment_GetBody(tt *testing.T) { var zeroValue string r := &RepositoryComment{Body: &zeroValue} r.GetBody() r = &RepositoryComment{} r.GetBody() r = nil r.GetBody() } func TestRepositoryComment_GetCommitID(tt *testing.T) { var zeroValue string r := &RepositoryComment{CommitID: &zeroValue} r.GetCommitID() r = &RepositoryComment{} r.GetCommitID() r = nil r.GetCommitID() } func TestRepositoryComment_GetCreatedAt(tt *testing.T) { var zeroValue time.Time r := &RepositoryComment{CreatedAt: &zeroValue} r.GetCreatedAt() r = &RepositoryComment{} r.GetCreatedAt() r = nil r.GetCreatedAt() } func TestRepositoryComment_GetHTMLURL(tt *testing.T) { var zeroValue string r := &RepositoryComment{HTMLURL: &zeroValue} r.GetHTMLURL() r = &RepositoryComment{} r.GetHTMLURL() r = nil r.GetHTMLURL() } func TestRepositoryComment_GetID(tt *testing.T) { var zeroValue int64 r := &RepositoryComment{ID: &zeroValue} r.GetID() r = &RepositoryComment{} r.GetID() r = nil r.GetID() } func TestRepositoryComment_GetNodeID(tt *testing.T) { var zeroValue string r := &RepositoryComment{NodeID: &zeroValue} r.GetNodeID() r = &RepositoryComment{} r.GetNodeID() r = nil r.GetNodeID() } func TestRepositoryComment_GetPath(tt *testing.T) { var zeroValue string r := &RepositoryComment{Path: &zeroValue} r.GetPath() r = &RepositoryComment{} r.GetPath() r = nil r.GetPath() } func TestRepositoryComment_GetPosition(tt *testing.T) { var zeroValue int r := &RepositoryComment{Position: &zeroValue} r.GetPosition() r = &RepositoryComment{} r.GetPosition() r = nil r.GetPosition() } func TestRepositoryComment_GetReactions(tt *testing.T) { r := &RepositoryComment{} r.GetReactions() r = nil r.GetReactions() } func TestRepositoryComment_GetUpdatedAt(tt *testing.T) { var zeroValue time.Time r := &RepositoryComment{UpdatedAt: &zeroValue} r.GetUpdatedAt() r = &RepositoryComment{} r.GetUpdatedAt() r = nil r.GetUpdatedAt() } func TestRepositoryComment_GetURL(tt *testing.T) { var zeroValue string r := &RepositoryComment{URL: &zeroValue} r.GetURL() r = &RepositoryComment{} r.GetURL() r = nil r.GetURL() } func TestRepositoryComment_GetUser(tt *testing.T) { r := &RepositoryComment{} r.GetUser() r = nil r.GetUser() } func TestRepositoryCommit_GetAuthor(tt *testing.T) { r := &RepositoryCommit{} r.GetAuthor() r = nil r.GetAuthor() } func TestRepositoryCommit_GetCommentsURL(tt *testing.T) { var zeroValue string r := &RepositoryCommit{CommentsURL: &zeroValue} r.GetCommentsURL() r = &RepositoryCommit{} r.GetCommentsURL() r = nil r.GetCommentsURL() } func TestRepositoryCommit_GetCommit(tt *testing.T) { r := &RepositoryCommit{} r.GetCommit() r = nil r.GetCommit() } func TestRepositoryCommit_GetCommitter(tt *testing.T) { r := &RepositoryCommit{} r.GetCommitter() r = nil r.GetCommitter() } func TestRepositoryCommit_GetHTMLURL(tt *testing.T) { var zeroValue string r := &RepositoryCommit{HTMLURL: &zeroValue} r.GetHTMLURL() r = &RepositoryCommit{} r.GetHTMLURL() r = nil r.GetHTMLURL() } func TestRepositoryCommit_GetNodeID(tt *testing.T) { var zeroValue string r := &RepositoryCommit{NodeID: &zeroValue} r.GetNodeID() r = &RepositoryCommit{} r.GetNodeID() r = nil r.GetNodeID() } func TestRepositoryCommit_GetSHA(tt *testing.T) { var zeroValue string r := &RepositoryCommit{SHA: &zeroValue} r.GetSHA() r = &RepositoryCommit{} r.GetSHA() r = nil r.GetSHA() } func TestRepositoryCommit_GetStats(tt *testing.T) { r := &RepositoryCommit{} r.GetStats() r = nil r.GetStats() } func TestRepositoryCommit_GetURL(tt *testing.T) { var zeroValue string r := &RepositoryCommit{URL: &zeroValue} r.GetURL() r = &RepositoryCommit{} r.GetURL() r = nil r.GetURL() } func TestRepositoryContent_GetDownloadURL(tt *testing.T) { var zeroValue string r := &RepositoryContent{DownloadURL: &zeroValue} r.GetDownloadURL() r = &RepositoryContent{} r.GetDownloadURL() r = nil r.GetDownloadURL() } func TestRepositoryContent_GetEncoding(tt *testing.T) { var zeroValue string r := &RepositoryContent{Encoding: &zeroValue} r.GetEncoding() r = &RepositoryContent{} r.GetEncoding() r = nil r.GetEncoding() } func TestRepositoryContent_GetGitURL(tt *testing.T) { var zeroValue string r := &RepositoryContent{GitURL: &zeroValue} r.GetGitURL() r = &RepositoryContent{} r.GetGitURL() r = nil r.GetGitURL() } func TestRepositoryContent_GetHTMLURL(tt *testing.T) { var zeroValue string r := &RepositoryContent{HTMLURL: &zeroValue} r.GetHTMLURL() r = &RepositoryContent{} r.GetHTMLURL() r = nil r.GetHTMLURL() } func TestRepositoryContent_GetName(tt *testing.T) { var zeroValue string r := &RepositoryContent{Name: &zeroValue} r.GetName() r = &RepositoryContent{} r.GetName() r = nil r.GetName() } func TestRepositoryContent_GetPath(tt *testing.T) { var zeroValue string r := &RepositoryContent{Path: &zeroValue} r.GetPath() r = &RepositoryContent{} r.GetPath() r = nil r.GetPath() } func TestRepositoryContent_GetSHA(tt *testing.T) { var zeroValue string r := &RepositoryContent{SHA: &zeroValue} r.GetSHA() r = &RepositoryContent{} r.GetSHA() r = nil r.GetSHA() } func TestRepositoryContent_GetSize(tt *testing.T) { var zeroValue int r := &RepositoryContent{Size: &zeroValue} r.GetSize() r = &RepositoryContent{} r.GetSize() r = nil r.GetSize() } func TestRepositoryContent_GetTarget(tt *testing.T) { var zeroValue string r := &RepositoryContent{Target: &zeroValue} r.GetTarget() r = &RepositoryContent{} r.GetTarget() r = nil r.GetTarget() } func TestRepositoryContent_GetType(tt *testing.T) { var zeroValue string r := &RepositoryContent{Type: &zeroValue} r.GetType() r = &RepositoryContent{} r.GetType() r = nil r.GetType() } func TestRepositoryContent_GetURL(tt *testing.T) { var zeroValue string r := &RepositoryContent{URL: &zeroValue} r.GetURL() r = &RepositoryContent{} r.GetURL() r = nil r.GetURL() } func TestRepositoryContentFileOptions_GetAuthor(tt *testing.T) { r := &RepositoryContentFileOptions{} r.GetAuthor() r = nil r.GetAuthor() } func TestRepositoryContentFileOptions_GetBranch(tt *testing.T) { var zeroValue string r := &RepositoryContentFileOptions{Branch: &zeroValue} r.GetBranch() r = &RepositoryContentFileOptions{} r.GetBranch() r = nil r.GetBranch() } func TestRepositoryContentFileOptions_GetCommitter(tt *testing.T) { r := &RepositoryContentFileOptions{} r.GetCommitter() r = nil r.GetCommitter() } func TestRepositoryContentFileOptions_GetMessage(tt *testing.T) { var zeroValue string r := &RepositoryContentFileOptions{Message: &zeroValue} r.GetMessage() r = &RepositoryContentFileOptions{} r.GetMessage() r = nil r.GetMessage() } func TestRepositoryContentFileOptions_GetSHA(tt *testing.T) { var zeroValue string r := &RepositoryContentFileOptions{SHA: &zeroValue} r.GetSHA() r = &RepositoryContentFileOptions{} r.GetSHA() r = nil r.GetSHA() } func TestRepositoryContentResponse_GetContent(tt *testing.T) { r := &RepositoryContentResponse{} r.GetContent() r = nil r.GetContent() } func TestRepositoryDispatchEvent_GetAction(tt *testing.T) { var zeroValue string r := &RepositoryDispatchEvent{Action: &zeroValue} r.GetAction() r = &RepositoryDispatchEvent{} r.GetAction() r = nil r.GetAction() } func TestRepositoryDispatchEvent_GetBranch(tt *testing.T) { var zeroValue string r := &RepositoryDispatchEvent{Branch: &zeroValue} r.GetBranch() r = &RepositoryDispatchEvent{} r.GetBranch() r = nil r.GetBranch() } func TestRepositoryDispatchEvent_GetInstallation(tt *testing.T) { r := &RepositoryDispatchEvent{} r.GetInstallation() r = nil r.GetInstallation() } func TestRepositoryDispatchEvent_GetOrg(tt *testing.T) { r := &RepositoryDispatchEvent{} r.GetOrg() r = nil r.GetOrg() } func TestRepositoryDispatchEvent_GetRepo(tt *testing.T) { r := &RepositoryDispatchEvent{} r.GetRepo() r = nil r.GetRepo() } func TestRepositoryDispatchEvent_GetSender(tt *testing.T) { r := &RepositoryDispatchEvent{} r.GetSender() r = nil r.GetSender() } func TestRepositoryEvent_GetAction(tt *testing.T) { var zeroValue string r := &RepositoryEvent{Action: &zeroValue} r.GetAction() r = &RepositoryEvent{} r.GetAction() r = nil r.GetAction() } func TestRepositoryEvent_GetInstallation(tt *testing.T) { r := &RepositoryEvent{} r.GetInstallation() r = nil r.GetInstallation() } func TestRepositoryEvent_GetOrg(tt *testing.T) { r := &RepositoryEvent{} r.GetOrg() r = nil r.GetOrg() } func TestRepositoryEvent_GetRepo(tt *testing.T) { r := &RepositoryEvent{} r.GetRepo() r = nil r.GetRepo() } func TestRepositoryEvent_GetSender(tt *testing.T) { r := &RepositoryEvent{} r.GetSender() r = nil r.GetSender() } func TestRepositoryInvitation_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp r := &RepositoryInvitation{CreatedAt: &zeroValue} r.GetCreatedAt() r = &RepositoryInvitation{} r.GetCreatedAt() r = nil r.GetCreatedAt() } func TestRepositoryInvitation_GetHTMLURL(tt *testing.T) { var zeroValue string r := &RepositoryInvitation{HTMLURL: &zeroValue} r.GetHTMLURL() r = &RepositoryInvitation{} r.GetHTMLURL() r = nil r.GetHTMLURL() } func TestRepositoryInvitation_GetID(tt *testing.T) { var zeroValue int64 r := &RepositoryInvitation{ID: &zeroValue} r.GetID() r = &RepositoryInvitation{} r.GetID() r = nil r.GetID() } func TestRepositoryInvitation_GetInvitee(tt *testing.T) { r := &RepositoryInvitation{} r.GetInvitee() r = nil r.GetInvitee() } func TestRepositoryInvitation_GetInviter(tt *testing.T) { r := &RepositoryInvitation{} r.GetInviter() r = nil r.GetInviter() } func TestRepositoryInvitation_GetPermissions(tt *testing.T) { var zeroValue string r := &RepositoryInvitation{Permissions: &zeroValue} r.GetPermissions() r = &RepositoryInvitation{} r.GetPermissions() r = nil r.GetPermissions() } func TestRepositoryInvitation_GetRepo(tt *testing.T) { r := &RepositoryInvitation{} r.GetRepo() r = nil r.GetRepo() } func TestRepositoryInvitation_GetURL(tt *testing.T) { var zeroValue string r := &RepositoryInvitation{URL: &zeroValue} r.GetURL() r = &RepositoryInvitation{} r.GetURL() r = nil r.GetURL() } func TestRepositoryLicense_GetContent(tt *testing.T) { var zeroValue string r := &RepositoryLicense{Content: &zeroValue} r.GetContent() r = &RepositoryLicense{} r.GetContent() r = nil r.GetContent() } func TestRepositoryLicense_GetDownloadURL(tt *testing.T) { var zeroValue string r := &RepositoryLicense{DownloadURL: &zeroValue} r.GetDownloadURL() r = &RepositoryLicense{} r.GetDownloadURL() r = nil r.GetDownloadURL() } func TestRepositoryLicense_GetEncoding(tt *testing.T) { var zeroValue string r := &RepositoryLicense{Encoding: &zeroValue} r.GetEncoding() r = &RepositoryLicense{} r.GetEncoding() r = nil r.GetEncoding() } func TestRepositoryLicense_GetGitURL(tt *testing.T) { var zeroValue string r := &RepositoryLicense{GitURL: &zeroValue} r.GetGitURL() r = &RepositoryLicense{} r.GetGitURL() r = nil r.GetGitURL() } func TestRepositoryLicense_GetHTMLURL(tt *testing.T) { var zeroValue string r := &RepositoryLicense{HTMLURL: &zeroValue} r.GetHTMLURL() r = &RepositoryLicense{} r.GetHTMLURL() r = nil r.GetHTMLURL() } func TestRepositoryLicense_GetLicense(tt *testing.T) { r := &RepositoryLicense{} r.GetLicense() r = nil r.GetLicense() } func TestRepositoryLicense_GetName(tt *testing.T) { var zeroValue string r := &RepositoryLicense{Name: &zeroValue} r.GetName() r = &RepositoryLicense{} r.GetName() r = nil r.GetName() } func TestRepositoryLicense_GetPath(tt *testing.T) { var zeroValue string r := &RepositoryLicense{Path: &zeroValue} r.GetPath() r = &RepositoryLicense{} r.GetPath() r = nil r.GetPath() } func TestRepositoryLicense_GetSHA(tt *testing.T) { var zeroValue string r := &RepositoryLicense{SHA: &zeroValue} r.GetSHA() r = &RepositoryLicense{} r.GetSHA() r = nil r.GetSHA() } func TestRepositoryLicense_GetSize(tt *testing.T) { var zeroValue int r := &RepositoryLicense{Size: &zeroValue} r.GetSize() r = &RepositoryLicense{} r.GetSize() r = nil r.GetSize() } func TestRepositoryLicense_GetType(tt *testing.T) { var zeroValue string r := &RepositoryLicense{Type: &zeroValue} r.GetType() r = &RepositoryLicense{} r.GetType() r = nil r.GetType() } func TestRepositoryLicense_GetURL(tt *testing.T) { var zeroValue string r := &RepositoryLicense{URL: &zeroValue} r.GetURL() r = &RepositoryLicense{} r.GetURL() r = nil r.GetURL() } func TestRepositoryMergeRequest_GetBase(tt *testing.T) { var zeroValue string r := &RepositoryMergeRequest{Base: &zeroValue} r.GetBase() r = &RepositoryMergeRequest{} r.GetBase() r = nil r.GetBase() } func TestRepositoryMergeRequest_GetCommitMessage(tt *testing.T) { var zeroValue string r := &RepositoryMergeRequest{CommitMessage: &zeroValue} r.GetCommitMessage() r = &RepositoryMergeRequest{} r.GetCommitMessage() r = nil r.GetCommitMessage() } func TestRepositoryMergeRequest_GetHead(tt *testing.T) { var zeroValue string r := &RepositoryMergeRequest{Head: &zeroValue} r.GetHead() r = &RepositoryMergeRequest{} r.GetHead() r = nil r.GetHead() } func TestRepositoryPermissionLevel_GetPermission(tt *testing.T) { var zeroValue string r := &RepositoryPermissionLevel{Permission: &zeroValue} r.GetPermission() r = &RepositoryPermissionLevel{} r.GetPermission() r = nil r.GetPermission() } func TestRepositoryPermissionLevel_GetUser(tt *testing.T) { r := &RepositoryPermissionLevel{} r.GetUser() r = nil r.GetUser() } func TestRepositoryRelease_GetAssetsURL(tt *testing.T) { var zeroValue string r := &RepositoryRelease{AssetsURL: &zeroValue} r.GetAssetsURL() r = &RepositoryRelease{} r.GetAssetsURL() r = nil r.GetAssetsURL() } func TestRepositoryRelease_GetAuthor(tt *testing.T) { r := &RepositoryRelease{} r.GetAuthor() r = nil r.GetAuthor() } func TestRepositoryRelease_GetBody(tt *testing.T) { var zeroValue string r := &RepositoryRelease{Body: &zeroValue} r.GetBody() r = &RepositoryRelease{} r.GetBody() r = nil r.GetBody() } func TestRepositoryRelease_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp r := &RepositoryRelease{CreatedAt: &zeroValue} r.GetCreatedAt() r = &RepositoryRelease{} r.GetCreatedAt() r = nil r.GetCreatedAt() } func TestRepositoryRelease_GetDiscussionCategoryName(tt *testing.T) { var zeroValue string r := &RepositoryRelease{DiscussionCategoryName: &zeroValue} r.GetDiscussionCategoryName() r = &RepositoryRelease{} r.GetDiscussionCategoryName() r = nil r.GetDiscussionCategoryName() } func TestRepositoryRelease_GetDraft(tt *testing.T) { var zeroValue bool r := &RepositoryRelease{Draft: &zeroValue} r.GetDraft() r = &RepositoryRelease{} r.GetDraft() r = nil r.GetDraft() } func TestRepositoryRelease_GetHTMLURL(tt *testing.T) { var zeroValue string r := &RepositoryRelease{HTMLURL: &zeroValue} r.GetHTMLURL() r = &RepositoryRelease{} r.GetHTMLURL() r = nil r.GetHTMLURL() } func TestRepositoryRelease_GetID(tt *testing.T) { var zeroValue int64 r := &RepositoryRelease{ID: &zeroValue} r.GetID() r = &RepositoryRelease{} r.GetID() r = nil r.GetID() } func TestRepositoryRelease_GetName(tt *testing.T) { var zeroValue string r := &RepositoryRelease{Name: &zeroValue} r.GetName() r = &RepositoryRelease{} r.GetName() r = nil r.GetName() } func TestRepositoryRelease_GetNodeID(tt *testing.T) { var zeroValue string r := &RepositoryRelease{NodeID: &zeroValue} r.GetNodeID() r = &RepositoryRelease{} r.GetNodeID() r = nil r.GetNodeID() } func TestRepositoryRelease_GetPrerelease(tt *testing.T) { var zeroValue bool r := &RepositoryRelease{Prerelease: &zeroValue} r.GetPrerelease() r = &RepositoryRelease{} r.GetPrerelease() r = nil r.GetPrerelease() } func TestRepositoryRelease_GetPublishedAt(tt *testing.T) { var zeroValue Timestamp r := &RepositoryRelease{PublishedAt: &zeroValue} r.GetPublishedAt() r = &RepositoryRelease{} r.GetPublishedAt() r = nil r.GetPublishedAt() } func TestRepositoryRelease_GetTagName(tt *testing.T) { var zeroValue string r := &RepositoryRelease{TagName: &zeroValue} r.GetTagName() r = &RepositoryRelease{} r.GetTagName() r = nil r.GetTagName() } func TestRepositoryRelease_GetTarballURL(tt *testing.T) { var zeroValue string r := &RepositoryRelease{TarballURL: &zeroValue} r.GetTarballURL() r = &RepositoryRelease{} r.GetTarballURL() r = nil r.GetTarballURL() } func TestRepositoryRelease_GetTargetCommitish(tt *testing.T) { var zeroValue string r := &RepositoryRelease{TargetCommitish: &zeroValue} r.GetTargetCommitish() r = &RepositoryRelease{} r.GetTargetCommitish() r = nil r.GetTargetCommitish() } func TestRepositoryRelease_GetUploadURL(tt *testing.T) { var zeroValue string r := &RepositoryRelease{UploadURL: &zeroValue} r.GetUploadURL() r = &RepositoryRelease{} r.GetUploadURL() r = nil r.GetUploadURL() } func TestRepositoryRelease_GetURL(tt *testing.T) { var zeroValue string r := &RepositoryRelease{URL: &zeroValue} r.GetURL() r = &RepositoryRelease{} r.GetURL() r = nil r.GetURL() } func TestRepositoryRelease_GetZipballURL(tt *testing.T) { var zeroValue string r := &RepositoryRelease{ZipballURL: &zeroValue} r.GetZipballURL() r = &RepositoryRelease{} r.GetZipballURL() r = nil r.GetZipballURL() } func TestRepositoryTag_GetCommit(tt *testing.T) { r := &RepositoryTag{} r.GetCommit() r = nil r.GetCommit() } func TestRepositoryTag_GetName(tt *testing.T) { var zeroValue string r := &RepositoryTag{Name: &zeroValue} r.GetName() r = &RepositoryTag{} r.GetName() r = nil r.GetName() } func TestRepositoryTag_GetTarballURL(tt *testing.T) { var zeroValue string r := &RepositoryTag{TarballURL: &zeroValue} r.GetTarballURL() r = &RepositoryTag{} r.GetTarballURL() r = nil r.GetTarballURL() } func TestRepositoryTag_GetZipballURL(tt *testing.T) { var zeroValue string r := &RepositoryTag{ZipballURL: &zeroValue} r.GetZipballURL() r = &RepositoryTag{} r.GetZipballURL() r = nil r.GetZipballURL() } func TestRepositoryVulnerabilityAlert_GetAffectedPackageName(tt *testing.T) { var zeroValue string r := &RepositoryVulnerabilityAlert{AffectedPackageName: &zeroValue} r.GetAffectedPackageName() r = &RepositoryVulnerabilityAlert{} r.GetAffectedPackageName() r = nil r.GetAffectedPackageName() } func TestRepositoryVulnerabilityAlert_GetAffectedRange(tt *testing.T) { var zeroValue string r := &RepositoryVulnerabilityAlert{AffectedRange: &zeroValue} r.GetAffectedRange() r = &RepositoryVulnerabilityAlert{} r.GetAffectedRange() r = nil r.GetAffectedRange() } func TestRepositoryVulnerabilityAlert_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp r := &RepositoryVulnerabilityAlert{CreatedAt: &zeroValue} r.GetCreatedAt() r = &RepositoryVulnerabilityAlert{} r.GetCreatedAt() r = nil r.GetCreatedAt() } func TestRepositoryVulnerabilityAlert_GetDismissedAt(tt *testing.T) { var zeroValue Timestamp r := &RepositoryVulnerabilityAlert{DismissedAt: &zeroValue} r.GetDismissedAt() r = &RepositoryVulnerabilityAlert{} r.GetDismissedAt() r = nil r.GetDismissedAt() } func TestRepositoryVulnerabilityAlert_GetDismisser(tt *testing.T) { r := &RepositoryVulnerabilityAlert{} r.GetDismisser() r = nil r.GetDismisser() } func TestRepositoryVulnerabilityAlert_GetDismissReason(tt *testing.T) { var zeroValue string r := &RepositoryVulnerabilityAlert{DismissReason: &zeroValue} r.GetDismissReason() r = &RepositoryVulnerabilityAlert{} r.GetDismissReason() r = nil r.GetDismissReason() } func TestRepositoryVulnerabilityAlert_GetExternalIdentifier(tt *testing.T) { var zeroValue string r := &RepositoryVulnerabilityAlert{ExternalIdentifier: &zeroValue} r.GetExternalIdentifier() r = &RepositoryVulnerabilityAlert{} r.GetExternalIdentifier() r = nil r.GetExternalIdentifier() } func TestRepositoryVulnerabilityAlert_GetExternalReference(tt *testing.T) { var zeroValue string r := &RepositoryVulnerabilityAlert{ExternalReference: &zeroValue} r.GetExternalReference() r = &RepositoryVulnerabilityAlert{} r.GetExternalReference() r = nil r.GetExternalReference() } func TestRepositoryVulnerabilityAlert_GetFixedIn(tt *testing.T) { var zeroValue string r := &RepositoryVulnerabilityAlert{FixedIn: &zeroValue} r.GetFixedIn() r = &RepositoryVulnerabilityAlert{} r.GetFixedIn() r = nil r.GetFixedIn() } func TestRepositoryVulnerabilityAlert_GetGitHubSecurityAdvisoryID(tt *testing.T) { var zeroValue string r := &RepositoryVulnerabilityAlert{GitHubSecurityAdvisoryID: &zeroValue} r.GetGitHubSecurityAdvisoryID() r = &RepositoryVulnerabilityAlert{} r.GetGitHubSecurityAdvisoryID() r = nil r.GetGitHubSecurityAdvisoryID() } func TestRepositoryVulnerabilityAlert_GetID(tt *testing.T) { var zeroValue int64 r := &RepositoryVulnerabilityAlert{ID: &zeroValue} r.GetID() r = &RepositoryVulnerabilityAlert{} r.GetID() r = nil r.GetID() } func TestRepositoryVulnerabilityAlert_GetSeverity(tt *testing.T) { var zeroValue string r := &RepositoryVulnerabilityAlert{Severity: &zeroValue} r.GetSeverity() r = &RepositoryVulnerabilityAlert{} r.GetSeverity() r = nil r.GetSeverity() } func TestRepositoryVulnerabilityAlertEvent_GetAction(tt *testing.T) { var zeroValue string r := &RepositoryVulnerabilityAlertEvent{Action: &zeroValue} r.GetAction() r = &RepositoryVulnerabilityAlertEvent{} r.GetAction() r = nil r.GetAction() } func TestRepositoryVulnerabilityAlertEvent_GetAlert(tt *testing.T) { r := &RepositoryVulnerabilityAlertEvent{} r.GetAlert() r = nil r.GetAlert() } func TestRepositoryVulnerabilityAlertEvent_GetRepository(tt *testing.T) { r := &RepositoryVulnerabilityAlertEvent{} r.GetRepository() r = nil r.GetRepository() } func TestRepoStats_GetForkRepos(tt *testing.T) { var zeroValue int r := &RepoStats{ForkRepos: &zeroValue} r.GetForkRepos() r = &RepoStats{} r.GetForkRepos() r = nil r.GetForkRepos() } func TestRepoStats_GetOrgRepos(tt *testing.T) { var zeroValue int r := &RepoStats{OrgRepos: &zeroValue} r.GetOrgRepos() r = &RepoStats{} r.GetOrgRepos() r = nil r.GetOrgRepos() } func TestRepoStats_GetRootRepos(tt *testing.T) { var zeroValue int r := &RepoStats{RootRepos: &zeroValue} r.GetRootRepos() r = &RepoStats{} r.GetRootRepos() r = nil r.GetRootRepos() } func TestRepoStats_GetTotalPushes(tt *testing.T) { var zeroValue int r := &RepoStats{TotalPushes: &zeroValue} r.GetTotalPushes() r = &RepoStats{} r.GetTotalPushes() r = nil r.GetTotalPushes() } func TestRepoStats_GetTotalRepos(tt *testing.T) { var zeroValue int r := &RepoStats{TotalRepos: &zeroValue} r.GetTotalRepos() r = &RepoStats{} r.GetTotalRepos() r = nil r.GetTotalRepos() } func TestRepoStats_GetTotalWikis(tt *testing.T) { var zeroValue int r := &RepoStats{TotalWikis: &zeroValue} r.GetTotalWikis() r = &RepoStats{} r.GetTotalWikis() r = nil r.GetTotalWikis() } func TestRepoStatus_GetAvatarURL(tt *testing.T) { var zeroValue string r := &RepoStatus{AvatarURL: &zeroValue} r.GetAvatarURL() r = &RepoStatus{} r.GetAvatarURL() r = nil r.GetAvatarURL() } func TestRepoStatus_GetContext(tt *testing.T) { var zeroValue string r := &RepoStatus{Context: &zeroValue} r.GetContext() r = &RepoStatus{} r.GetContext() r = nil r.GetContext() } func TestRepoStatus_GetCreatedAt(tt *testing.T) { var zeroValue time.Time r := &RepoStatus{CreatedAt: &zeroValue} r.GetCreatedAt() r = &RepoStatus{} r.GetCreatedAt() r = nil r.GetCreatedAt() } func TestRepoStatus_GetCreator(tt *testing.T) { r := &RepoStatus{} r.GetCreator() r = nil r.GetCreator() } func TestRepoStatus_GetDescription(tt *testing.T) { var zeroValue string r := &RepoStatus{Description: &zeroValue} r.GetDescription() r = &RepoStatus{} r.GetDescription() r = nil r.GetDescription() } func TestRepoStatus_GetID(tt *testing.T) { var zeroValue int64 r := &RepoStatus{ID: &zeroValue} r.GetID() r = &RepoStatus{} r.GetID() r = nil r.GetID() } func TestRepoStatus_GetNodeID(tt *testing.T) { var zeroValue string r := &RepoStatus{NodeID: &zeroValue} r.GetNodeID() r = &RepoStatus{} r.GetNodeID() r = nil r.GetNodeID() } func TestRepoStatus_GetState(tt *testing.T) { var zeroValue string r := &RepoStatus{State: &zeroValue} r.GetState() r = &RepoStatus{} r.GetState() r = nil r.GetState() } func TestRepoStatus_GetTargetURL(tt *testing.T) { var zeroValue string r := &RepoStatus{TargetURL: &zeroValue} r.GetTargetURL() r = &RepoStatus{} r.GetTargetURL() r = nil r.GetTargetURL() } func TestRepoStatus_GetUpdatedAt(tt *testing.T) { var zeroValue time.Time r := &RepoStatus{UpdatedAt: &zeroValue} r.GetUpdatedAt() r = &RepoStatus{} r.GetUpdatedAt() r = nil r.GetUpdatedAt() } func TestRepoStatus_GetURL(tt *testing.T) { var zeroValue string r := &RepoStatus{URL: &zeroValue} r.GetURL() r = &RepoStatus{} r.GetURL() r = nil r.GetURL() } func TestRequiredReviewer_GetType(tt *testing.T) { var zeroValue string r := &RequiredReviewer{Type: &zeroValue} r.GetType() r = &RequiredReviewer{} r.GetType() r = nil r.GetType() } func TestRequiredStatusChecksRequest_GetStrict(tt *testing.T) { var zeroValue bool r := &RequiredStatusChecksRequest{Strict: &zeroValue} r.GetStrict() r = &RequiredStatusChecksRequest{} r.GetStrict() r = nil r.GetStrict() } func TestReviewersRequest_GetNodeID(tt *testing.T) { var zeroValue string r := &ReviewersRequest{NodeID: &zeroValue} r.GetNodeID() r = &ReviewersRequest{} r.GetNodeID() r = nil r.GetNodeID() } func TestRule_GetDescription(tt *testing.T) { var zeroValue string r := &Rule{Description: &zeroValue} r.GetDescription() r = &Rule{} r.GetDescription() r = nil r.GetDescription() } func TestRule_GetFullDescription(tt *testing.T) { var zeroValue string r := &Rule{FullDescription: &zeroValue} r.GetFullDescription() r = &Rule{} r.GetFullDescription() r = nil r.GetFullDescription() } func TestRule_GetHelp(tt *testing.T) { var zeroValue string r := &Rule{Help: &zeroValue} r.GetHelp() r = &Rule{} r.GetHelp() r = nil r.GetHelp() } func TestRule_GetID(tt *testing.T) { var zeroValue string r := &Rule{ID: &zeroValue} r.GetID() r = &Rule{} r.GetID() r = nil r.GetID() } func TestRule_GetName(tt *testing.T) { var zeroValue string r := &Rule{Name: &zeroValue} r.GetName() r = &Rule{} r.GetName() r = nil r.GetName() } func TestRule_GetSecuritySeverityLevel(tt *testing.T) { var zeroValue string r := &Rule{SecuritySeverityLevel: &zeroValue} r.GetSecuritySeverityLevel() r = &Rule{} r.GetSecuritySeverityLevel() r = nil r.GetSecuritySeverityLevel() } func TestRule_GetSeverity(tt *testing.T) { var zeroValue string r := &Rule{Severity: &zeroValue} r.GetSeverity() r = &Rule{} r.GetSeverity() r = nil r.GetSeverity() } func TestRunner_GetBusy(tt *testing.T) { var zeroValue bool r := &Runner{Busy: &zeroValue} r.GetBusy() r = &Runner{} r.GetBusy() r = nil r.GetBusy() } func TestRunner_GetID(tt *testing.T) { var zeroValue int64 r := &Runner{ID: &zeroValue} r.GetID() r = &Runner{} r.GetID() r = nil r.GetID() } func TestRunner_GetName(tt *testing.T) { var zeroValue string r := &Runner{Name: &zeroValue} r.GetName() r = &Runner{} r.GetName() r = nil r.GetName() } func TestRunner_GetOS(tt *testing.T) { var zeroValue string r := &Runner{OS: &zeroValue} r.GetOS() r = &Runner{} r.GetOS() r = nil r.GetOS() } func TestRunner_GetStatus(tt *testing.T) { var zeroValue string r := &Runner{Status: &zeroValue} r.GetStatus() r = &Runner{} r.GetStatus() r = nil r.GetStatus() } func TestRunnerApplicationDownload_GetArchitecture(tt *testing.T) { var zeroValue string r := &RunnerApplicationDownload{Architecture: &zeroValue} r.GetArchitecture() r = &RunnerApplicationDownload{} r.GetArchitecture() r = nil r.GetArchitecture() } func TestRunnerApplicationDownload_GetDownloadURL(tt *testing.T) { var zeroValue string r := &RunnerApplicationDownload{DownloadURL: &zeroValue} r.GetDownloadURL() r = &RunnerApplicationDownload{} r.GetDownloadURL() r = nil r.GetDownloadURL() } func TestRunnerApplicationDownload_GetFilename(tt *testing.T) { var zeroValue string r := &RunnerApplicationDownload{Filename: &zeroValue} r.GetFilename() r = &RunnerApplicationDownload{} r.GetFilename() r = nil r.GetFilename() } func TestRunnerApplicationDownload_GetOS(tt *testing.T) { var zeroValue string r := &RunnerApplicationDownload{OS: &zeroValue} r.GetOS() r = &RunnerApplicationDownload{} r.GetOS() r = nil r.GetOS() } func TestRunnerApplicationDownload_GetSHA256Checksum(tt *testing.T) { var zeroValue string r := &RunnerApplicationDownload{SHA256Checksum: &zeroValue} r.GetSHA256Checksum() r = &RunnerApplicationDownload{} r.GetSHA256Checksum() r = nil r.GetSHA256Checksum() } func TestRunnerApplicationDownload_GetTempDownloadToken(tt *testing.T) { var zeroValue string r := &RunnerApplicationDownload{TempDownloadToken: &zeroValue} r.GetTempDownloadToken() r = &RunnerApplicationDownload{} r.GetTempDownloadToken() r = nil r.GetTempDownloadToken() } func TestRunnerGroup_GetAllowsPublicRepositories(tt *testing.T) { var zeroValue bool r := &RunnerGroup{AllowsPublicRepositories: &zeroValue} r.GetAllowsPublicRepositories() r = &RunnerGroup{} r.GetAllowsPublicRepositories() r = nil r.GetAllowsPublicRepositories() } func TestRunnerGroup_GetDefault(tt *testing.T) { var zeroValue bool r := &RunnerGroup{Default: &zeroValue} r.GetDefault() r = &RunnerGroup{} r.GetDefault() r = nil r.GetDefault() } func TestRunnerGroup_GetID(tt *testing.T) { var zeroValue int64 r := &RunnerGroup{ID: &zeroValue} r.GetID() r = &RunnerGroup{} r.GetID() r = nil r.GetID() } func TestRunnerGroup_GetInherited(tt *testing.T) { var zeroValue bool r := &RunnerGroup{Inherited: &zeroValue} r.GetInherited() r = &RunnerGroup{} r.GetInherited() r = nil r.GetInherited() } func TestRunnerGroup_GetName(tt *testing.T) { var zeroValue string r := &RunnerGroup{Name: &zeroValue} r.GetName() r = &RunnerGroup{} r.GetName() r = nil r.GetName() } func TestRunnerGroup_GetRunnersURL(tt *testing.T) { var zeroValue string r := &RunnerGroup{RunnersURL: &zeroValue} r.GetRunnersURL() r = &RunnerGroup{} r.GetRunnersURL() r = nil r.GetRunnersURL() } func TestRunnerGroup_GetSelectedRepositoriesURL(tt *testing.T) { var zeroValue string r := &RunnerGroup{SelectedRepositoriesURL: &zeroValue} r.GetSelectedRepositoriesURL() r = &RunnerGroup{} r.GetSelectedRepositoriesURL() r = nil r.GetSelectedRepositoriesURL() } func TestRunnerGroup_GetVisibility(tt *testing.T) { var zeroValue string r := &RunnerGroup{Visibility: &zeroValue} r.GetVisibility() r = &RunnerGroup{} r.GetVisibility() r = nil r.GetVisibility() } func TestRunnerLabels_GetID(tt *testing.T) { var zeroValue int64 r := &RunnerLabels{ID: &zeroValue} r.GetID() r = &RunnerLabels{} r.GetID() r = nil r.GetID() } func TestRunnerLabels_GetName(tt *testing.T) { var zeroValue string r := &RunnerLabels{Name: &zeroValue} r.GetName() r = &RunnerLabels{} r.GetName() r = nil r.GetName() } func TestRunnerLabels_GetType(tt *testing.T) { var zeroValue string r := &RunnerLabels{Type: &zeroValue} r.GetType() r = &RunnerLabels{} r.GetType() r = nil r.GetType() } func TestSelectedReposList_GetTotalCount(tt *testing.T) { var zeroValue int s := &SelectedReposList{TotalCount: &zeroValue} s.GetTotalCount() s = &SelectedReposList{} s.GetTotalCount() s = nil s.GetTotalCount() } func TestServiceHook_GetName(tt *testing.T) { var zeroValue string s := &ServiceHook{Name: &zeroValue} s.GetName() s = &ServiceHook{} s.GetName() s = nil s.GetName() } func TestSignaturesProtectedBranch_GetEnabled(tt *testing.T) { var zeroValue bool s := &SignaturesProtectedBranch{Enabled: &zeroValue} s.GetEnabled() s = &SignaturesProtectedBranch{} s.GetEnabled() s = nil s.GetEnabled() } func TestSignaturesProtectedBranch_GetURL(tt *testing.T) { var zeroValue string s := &SignaturesProtectedBranch{URL: &zeroValue} s.GetURL() s = &SignaturesProtectedBranch{} s.GetURL() s = nil s.GetURL() } func TestSignatureVerification_GetPayload(tt *testing.T) { var zeroValue string s := &SignatureVerification{Payload: &zeroValue} s.GetPayload() s = &SignatureVerification{} s.GetPayload() s = nil s.GetPayload() } func TestSignatureVerification_GetReason(tt *testing.T) { var zeroValue string s := &SignatureVerification{Reason: &zeroValue} s.GetReason() s = &SignatureVerification{} s.GetReason() s = nil s.GetReason() } func TestSignatureVerification_GetSignature(tt *testing.T) { var zeroValue string s := &SignatureVerification{Signature: &zeroValue} s.GetSignature() s = &SignatureVerification{} s.GetSignature() s = nil s.GetSignature() } func TestSignatureVerification_GetVerified(tt *testing.T) { var zeroValue bool s := &SignatureVerification{Verified: &zeroValue} s.GetVerified() s = &SignatureVerification{} s.GetVerified() s = nil s.GetVerified() } func TestSource_GetActor(tt *testing.T) { s := &Source{} s.GetActor() s = nil s.GetActor() } func TestSource_GetID(tt *testing.T) { var zeroValue int64 s := &Source{ID: &zeroValue} s.GetID() s = &Source{} s.GetID() s = nil s.GetID() } func TestSource_GetIssue(tt *testing.T) { s := &Source{} s.GetIssue() s = nil s.GetIssue() } func TestSource_GetType(tt *testing.T) { var zeroValue string s := &Source{Type: &zeroValue} s.GetType() s = &Source{} s.GetType() s = nil s.GetType() } func TestSource_GetURL(tt *testing.T) { var zeroValue string s := &Source{URL: &zeroValue} s.GetURL() s = &Source{} s.GetURL() s = nil s.GetURL() } func TestSourceImportAuthor_GetEmail(tt *testing.T) { var zeroValue string s := &SourceImportAuthor{Email: &zeroValue} s.GetEmail() s = &SourceImportAuthor{} s.GetEmail() s = nil s.GetEmail() } func TestSourceImportAuthor_GetID(tt *testing.T) { var zeroValue int64 s := &SourceImportAuthor{ID: &zeroValue} s.GetID() s = &SourceImportAuthor{} s.GetID() s = nil s.GetID() } func TestSourceImportAuthor_GetImportURL(tt *testing.T) { var zeroValue string s := &SourceImportAuthor{ImportURL: &zeroValue} s.GetImportURL() s = &SourceImportAuthor{} s.GetImportURL() s = nil s.GetImportURL() } func TestSourceImportAuthor_GetName(tt *testing.T) { var zeroValue string s := &SourceImportAuthor{Name: &zeroValue} s.GetName() s = &SourceImportAuthor{} s.GetName() s = nil s.GetName() } func TestSourceImportAuthor_GetRemoteID(tt *testing.T) { var zeroValue string s := &SourceImportAuthor{RemoteID: &zeroValue} s.GetRemoteID() s = &SourceImportAuthor{} s.GetRemoteID() s = nil s.GetRemoteID() } func TestSourceImportAuthor_GetRemoteName(tt *testing.T) { var zeroValue string s := &SourceImportAuthor{RemoteName: &zeroValue} s.GetRemoteName() s = &SourceImportAuthor{} s.GetRemoteName() s = nil s.GetRemoteName() } func TestSourceImportAuthor_GetURL(tt *testing.T) { var zeroValue string s := &SourceImportAuthor{URL: &zeroValue} s.GetURL() s = &SourceImportAuthor{} s.GetURL() s = nil s.GetURL() } func TestStarEvent_GetAction(tt *testing.T) { var zeroValue string s := &StarEvent{Action: &zeroValue} s.GetAction() s = &StarEvent{} s.GetAction() s = nil s.GetAction() } func TestStarEvent_GetOrg(tt *testing.T) { s := &StarEvent{} s.GetOrg() s = nil s.GetOrg() } func TestStarEvent_GetRepo(tt *testing.T) { s := &StarEvent{} s.GetRepo() s = nil s.GetRepo() } func TestStarEvent_GetSender(tt *testing.T) { s := &StarEvent{} s.GetSender() s = nil s.GetSender() } func TestStarEvent_GetStarredAt(tt *testing.T) { var zeroValue Timestamp s := &StarEvent{StarredAt: &zeroValue} s.GetStarredAt() s = &StarEvent{} s.GetStarredAt() s = nil s.GetStarredAt() } func TestStargazer_GetStarredAt(tt *testing.T) { var zeroValue Timestamp s := &Stargazer{StarredAt: &zeroValue} s.GetStarredAt() s = &Stargazer{} s.GetStarredAt() s = nil s.GetStarredAt() } func TestStargazer_GetUser(tt *testing.T) { s := &Stargazer{} s.GetUser() s = nil s.GetUser() } func TestStarredRepository_GetRepository(tt *testing.T) { s := &StarredRepository{} s.GetRepository() s = nil s.GetRepository() } func TestStarredRepository_GetStarredAt(tt *testing.T) { var zeroValue Timestamp s := &StarredRepository{StarredAt: &zeroValue} s.GetStarredAt() s = &StarredRepository{} s.GetStarredAt() s = nil s.GetStarredAt() } func TestStatusEvent_GetCommit(tt *testing.T) { s := &StatusEvent{} s.GetCommit() s = nil s.GetCommit() } func TestStatusEvent_GetContext(tt *testing.T) { var zeroValue string s := &StatusEvent{Context: &zeroValue} s.GetContext() s = &StatusEvent{} s.GetContext() s = nil s.GetContext() } func TestStatusEvent_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp s := &StatusEvent{CreatedAt: &zeroValue} s.GetCreatedAt() s = &StatusEvent{} s.GetCreatedAt() s = nil s.GetCreatedAt() } func TestStatusEvent_GetDescription(tt *testing.T) { var zeroValue string s := &StatusEvent{Description: &zeroValue} s.GetDescription() s = &StatusEvent{} s.GetDescription() s = nil s.GetDescription() } func TestStatusEvent_GetID(tt *testing.T) { var zeroValue int64 s := &StatusEvent{ID: &zeroValue} s.GetID() s = &StatusEvent{} s.GetID() s = nil s.GetID() } func TestStatusEvent_GetInstallation(tt *testing.T) { s := &StatusEvent{} s.GetInstallation() s = nil s.GetInstallation() } func TestStatusEvent_GetName(tt *testing.T) { var zeroValue string s := &StatusEvent{Name: &zeroValue} s.GetName() s = &StatusEvent{} s.GetName() s = nil s.GetName() } func TestStatusEvent_GetRepo(tt *testing.T) { s := &StatusEvent{} s.GetRepo() s = nil s.GetRepo() } func TestStatusEvent_GetSender(tt *testing.T) { s := &StatusEvent{} s.GetSender() s = nil s.GetSender() } func TestStatusEvent_GetSHA(tt *testing.T) { var zeroValue string s := &StatusEvent{SHA: &zeroValue} s.GetSHA() s = &StatusEvent{} s.GetSHA() s = nil s.GetSHA() } func TestStatusEvent_GetState(tt *testing.T) { var zeroValue string s := &StatusEvent{State: &zeroValue} s.GetState() s = &StatusEvent{} s.GetState() s = nil s.GetState() } func TestStatusEvent_GetTargetURL(tt *testing.T) { var zeroValue string s := &StatusEvent{TargetURL: &zeroValue} s.GetTargetURL() s = &StatusEvent{} s.GetTargetURL() s = nil s.GetTargetURL() } func TestStatusEvent_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp s := &StatusEvent{UpdatedAt: &zeroValue} s.GetUpdatedAt() s = &StatusEvent{} s.GetUpdatedAt() s = nil s.GetUpdatedAt() } func TestSubscription_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp s := &Subscription{CreatedAt: &zeroValue} s.GetCreatedAt() s = &Subscription{} s.GetCreatedAt() s = nil s.GetCreatedAt() } func TestSubscription_GetIgnored(tt *testing.T) { var zeroValue bool s := &Subscription{Ignored: &zeroValue} s.GetIgnored() s = &Subscription{} s.GetIgnored() s = nil s.GetIgnored() } func TestSubscription_GetReason(tt *testing.T) { var zeroValue string s := &Subscription{Reason: &zeroValue} s.GetReason() s = &Subscription{} s.GetReason() s = nil s.GetReason() } func TestSubscription_GetRepositoryURL(tt *testing.T) { var zeroValue string s := &Subscription{RepositoryURL: &zeroValue} s.GetRepositoryURL() s = &Subscription{} s.GetRepositoryURL() s = nil s.GetRepositoryURL() } func TestSubscription_GetSubscribed(tt *testing.T) { var zeroValue bool s := &Subscription{Subscribed: &zeroValue} s.GetSubscribed() s = &Subscription{} s.GetSubscribed() s = nil s.GetSubscribed() } func TestSubscription_GetThreadURL(tt *testing.T) { var zeroValue string s := &Subscription{ThreadURL: &zeroValue} s.GetThreadURL() s = &Subscription{} s.GetThreadURL() s = nil s.GetThreadURL() } func TestSubscription_GetURL(tt *testing.T) { var zeroValue string s := &Subscription{URL: &zeroValue} s.GetURL() s = &Subscription{} s.GetURL() s = nil s.GetURL() } func TestTag_GetMessage(tt *testing.T) { var zeroValue string t := &Tag{Message: &zeroValue} t.GetMessage() t = &Tag{} t.GetMessage() t = nil t.GetMessage() } func TestTag_GetNodeID(tt *testing.T) { var zeroValue string t := &Tag{NodeID: &zeroValue} t.GetNodeID() t = &Tag{} t.GetNodeID() t = nil t.GetNodeID() } func TestTag_GetObject(tt *testing.T) { t := &Tag{} t.GetObject() t = nil t.GetObject() } func TestTag_GetSHA(tt *testing.T) { var zeroValue string t := &Tag{SHA: &zeroValue} t.GetSHA() t = &Tag{} t.GetSHA() t = nil t.GetSHA() } func TestTag_GetTag(tt *testing.T) { var zeroValue string t := &Tag{Tag: &zeroValue} t.GetTag() t = &Tag{} t.GetTag() t = nil t.GetTag() } func TestTag_GetTagger(tt *testing.T) { t := &Tag{} t.GetTagger() t = nil t.GetTagger() } func TestTag_GetURL(tt *testing.T) { var zeroValue string t := &Tag{URL: &zeroValue} t.GetURL() t = &Tag{} t.GetURL() t = nil t.GetURL() } func TestTag_GetVerification(tt *testing.T) { t := &Tag{} t.GetVerification() t = nil t.GetVerification() } func TestTaskStep_GetCompletedAt(tt *testing.T) { var zeroValue Timestamp t := &TaskStep{CompletedAt: &zeroValue} t.GetCompletedAt() t = &TaskStep{} t.GetCompletedAt() t = nil t.GetCompletedAt() } func TestTaskStep_GetConclusion(tt *testing.T) { var zeroValue string t := &TaskStep{Conclusion: &zeroValue} t.GetConclusion() t = &TaskStep{} t.GetConclusion() t = nil t.GetConclusion() } func TestTaskStep_GetName(tt *testing.T) { var zeroValue string t := &TaskStep{Name: &zeroValue} t.GetName() t = &TaskStep{} t.GetName() t = nil t.GetName() } func TestTaskStep_GetNumber(tt *testing.T) { var zeroValue int64 t := &TaskStep{Number: &zeroValue} t.GetNumber() t = &TaskStep{} t.GetNumber() t = nil t.GetNumber() } func TestTaskStep_GetStartedAt(tt *testing.T) { var zeroValue Timestamp t := &TaskStep{StartedAt: &zeroValue} t.GetStartedAt() t = &TaskStep{} t.GetStartedAt() t = nil t.GetStartedAt() } func TestTaskStep_GetStatus(tt *testing.T) { var zeroValue string t := &TaskStep{Status: &zeroValue} t.GetStatus() t = &TaskStep{} t.GetStatus() t = nil t.GetStatus() } func TestTeam_GetDescription(tt *testing.T) { var zeroValue string t := &Team{Description: &zeroValue} t.GetDescription() t = &Team{} t.GetDescription() t = nil t.GetDescription() } func TestTeam_GetID(tt *testing.T) { var zeroValue int64 t := &Team{ID: &zeroValue} t.GetID() t = &Team{} t.GetID() t = nil t.GetID() } func TestTeam_GetLDAPDN(tt *testing.T) { var zeroValue string t := &Team{LDAPDN: &zeroValue} t.GetLDAPDN() t = &Team{} t.GetLDAPDN() t = nil t.GetLDAPDN() } func TestTeam_GetMembersCount(tt *testing.T) { var zeroValue int t := &Team{MembersCount: &zeroValue} t.GetMembersCount() t = &Team{} t.GetMembersCount() t = nil t.GetMembersCount() } func TestTeam_GetMembersURL(tt *testing.T) { var zeroValue string t := &Team{MembersURL: &zeroValue} t.GetMembersURL() t = &Team{} t.GetMembersURL() t = nil t.GetMembersURL() } func TestTeam_GetName(tt *testing.T) { var zeroValue string t := &Team{Name: &zeroValue} t.GetName() t = &Team{} t.GetName() t = nil t.GetName() } func TestTeam_GetNodeID(tt *testing.T) { var zeroValue string t := &Team{NodeID: &zeroValue} t.GetNodeID() t = &Team{} t.GetNodeID() t = nil t.GetNodeID() } func TestTeam_GetOrganization(tt *testing.T) { t := &Team{} t.GetOrganization() t = nil t.GetOrganization() } func TestTeam_GetParent(tt *testing.T) { t := &Team{} t.GetParent() t = nil t.GetParent() } func TestTeam_GetPermission(tt *testing.T) { var zeroValue string t := &Team{Permission: &zeroValue} t.GetPermission() t = &Team{} t.GetPermission() t = nil t.GetPermission() } func TestTeam_GetPermissions(tt *testing.T) { zeroValue := map[string]bool{} t := &Team{Permissions: zeroValue} t.GetPermissions() t = &Team{} t.GetPermissions() t = nil t.GetPermissions() } func TestTeam_GetPrivacy(tt *testing.T) { var zeroValue string t := &Team{Privacy: &zeroValue} t.GetPrivacy() t = &Team{} t.GetPrivacy() t = nil t.GetPrivacy() } func TestTeam_GetReposCount(tt *testing.T) { var zeroValue int t := &Team{ReposCount: &zeroValue} t.GetReposCount() t = &Team{} t.GetReposCount() t = nil t.GetReposCount() } func TestTeam_GetRepositoriesURL(tt *testing.T) { var zeroValue string t := &Team{RepositoriesURL: &zeroValue} t.GetRepositoriesURL() t = &Team{} t.GetRepositoriesURL() t = nil t.GetRepositoriesURL() } func TestTeam_GetSlug(tt *testing.T) { var zeroValue string t := &Team{Slug: &zeroValue} t.GetSlug() t = &Team{} t.GetSlug() t = nil t.GetSlug() } func TestTeam_GetURL(tt *testing.T) { var zeroValue string t := &Team{URL: &zeroValue} t.GetURL() t = &Team{} t.GetURL() t = nil t.GetURL() } func TestTeamAddEvent_GetInstallation(tt *testing.T) { t := &TeamAddEvent{} t.GetInstallation() t = nil t.GetInstallation() } func TestTeamAddEvent_GetOrg(tt *testing.T) { t := &TeamAddEvent{} t.GetOrg() t = nil t.GetOrg() } func TestTeamAddEvent_GetRepo(tt *testing.T) { t := &TeamAddEvent{} t.GetRepo() t = nil t.GetRepo() } func TestTeamAddEvent_GetSender(tt *testing.T) { t := &TeamAddEvent{} t.GetSender() t = nil t.GetSender() } func TestTeamAddEvent_GetTeam(tt *testing.T) { t := &TeamAddEvent{} t.GetTeam() t = nil t.GetTeam() } func TestTeamChange_GetDescription(tt *testing.T) { t := &TeamChange{} t.GetDescription() t = nil t.GetDescription() } func TestTeamChange_GetName(tt *testing.T) { t := &TeamChange{} t.GetName() t = nil t.GetName() } func TestTeamChange_GetPrivacy(tt *testing.T) { t := &TeamChange{} t.GetPrivacy() t = nil t.GetPrivacy() } func TestTeamChange_GetRepository(tt *testing.T) { t := &TeamChange{} t.GetRepository() t = nil t.GetRepository() } func TestTeamDescription_GetFrom(tt *testing.T) { var zeroValue string t := &TeamDescription{From: &zeroValue} t.GetFrom() t = &TeamDescription{} t.GetFrom() t = nil t.GetFrom() } func TestTeamDiscussion_GetAuthor(tt *testing.T) { t := &TeamDiscussion{} t.GetAuthor() t = nil t.GetAuthor() } func TestTeamDiscussion_GetBody(tt *testing.T) { var zeroValue string t := &TeamDiscussion{Body: &zeroValue} t.GetBody() t = &TeamDiscussion{} t.GetBody() t = nil t.GetBody() } func TestTeamDiscussion_GetBodyHTML(tt *testing.T) { var zeroValue string t := &TeamDiscussion{BodyHTML: &zeroValue} t.GetBodyHTML() t = &TeamDiscussion{} t.GetBodyHTML() t = nil t.GetBodyHTML() } func TestTeamDiscussion_GetBodyVersion(tt *testing.T) { var zeroValue string t := &TeamDiscussion{BodyVersion: &zeroValue} t.GetBodyVersion() t = &TeamDiscussion{} t.GetBodyVersion() t = nil t.GetBodyVersion() } func TestTeamDiscussion_GetCommentsCount(tt *testing.T) { var zeroValue int t := &TeamDiscussion{CommentsCount: &zeroValue} t.GetCommentsCount() t = &TeamDiscussion{} t.GetCommentsCount() t = nil t.GetCommentsCount() } func TestTeamDiscussion_GetCommentsURL(tt *testing.T) { var zeroValue string t := &TeamDiscussion{CommentsURL: &zeroValue} t.GetCommentsURL() t = &TeamDiscussion{} t.GetCommentsURL() t = nil t.GetCommentsURL() } func TestTeamDiscussion_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp t := &TeamDiscussion{CreatedAt: &zeroValue} t.GetCreatedAt() t = &TeamDiscussion{} t.GetCreatedAt() t = nil t.GetCreatedAt() } func TestTeamDiscussion_GetHTMLURL(tt *testing.T) { var zeroValue string t := &TeamDiscussion{HTMLURL: &zeroValue} t.GetHTMLURL() t = &TeamDiscussion{} t.GetHTMLURL() t = nil t.GetHTMLURL() } func TestTeamDiscussion_GetLastEditedAt(tt *testing.T) { var zeroValue Timestamp t := &TeamDiscussion{LastEditedAt: &zeroValue} t.GetLastEditedAt() t = &TeamDiscussion{} t.GetLastEditedAt() t = nil t.GetLastEditedAt() } func TestTeamDiscussion_GetNodeID(tt *testing.T) { var zeroValue string t := &TeamDiscussion{NodeID: &zeroValue} t.GetNodeID() t = &TeamDiscussion{} t.GetNodeID() t = nil t.GetNodeID() } func TestTeamDiscussion_GetNumber(tt *testing.T) { var zeroValue int t := &TeamDiscussion{Number: &zeroValue} t.GetNumber() t = &TeamDiscussion{} t.GetNumber() t = nil t.GetNumber() } func TestTeamDiscussion_GetPinned(tt *testing.T) { var zeroValue bool t := &TeamDiscussion{Pinned: &zeroValue} t.GetPinned() t = &TeamDiscussion{} t.GetPinned() t = nil t.GetPinned() } func TestTeamDiscussion_GetPrivate(tt *testing.T) { var zeroValue bool t := &TeamDiscussion{Private: &zeroValue} t.GetPrivate() t = &TeamDiscussion{} t.GetPrivate() t = nil t.GetPrivate() } func TestTeamDiscussion_GetReactions(tt *testing.T) { t := &TeamDiscussion{} t.GetReactions() t = nil t.GetReactions() } func TestTeamDiscussion_GetTeamURL(tt *testing.T) { var zeroValue string t := &TeamDiscussion{TeamURL: &zeroValue} t.GetTeamURL() t = &TeamDiscussion{} t.GetTeamURL() t = nil t.GetTeamURL() } func TestTeamDiscussion_GetTitle(tt *testing.T) { var zeroValue string t := &TeamDiscussion{Title: &zeroValue} t.GetTitle() t = &TeamDiscussion{} t.GetTitle() t = nil t.GetTitle() } func TestTeamDiscussion_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp t := &TeamDiscussion{UpdatedAt: &zeroValue} t.GetUpdatedAt() t = &TeamDiscussion{} t.GetUpdatedAt() t = nil t.GetUpdatedAt() } func TestTeamDiscussion_GetURL(tt *testing.T) { var zeroValue string t := &TeamDiscussion{URL: &zeroValue} t.GetURL() t = &TeamDiscussion{} t.GetURL() t = nil t.GetURL() } func TestTeamEvent_GetAction(tt *testing.T) { var zeroValue string t := &TeamEvent{Action: &zeroValue} t.GetAction() t = &TeamEvent{} t.GetAction() t = nil t.GetAction() } func TestTeamEvent_GetChanges(tt *testing.T) { t := &TeamEvent{} t.GetChanges() t = nil t.GetChanges() } func TestTeamEvent_GetInstallation(tt *testing.T) { t := &TeamEvent{} t.GetInstallation() t = nil t.GetInstallation() } func TestTeamEvent_GetOrg(tt *testing.T) { t := &TeamEvent{} t.GetOrg() t = nil t.GetOrg() } func TestTeamEvent_GetRepo(tt *testing.T) { t := &TeamEvent{} t.GetRepo() t = nil t.GetRepo() } func TestTeamEvent_GetSender(tt *testing.T) { t := &TeamEvent{} t.GetSender() t = nil t.GetSender() } func TestTeamEvent_GetTeam(tt *testing.T) { t := &TeamEvent{} t.GetTeam() t = nil t.GetTeam() } func TestTeamLDAPMapping_GetDescription(tt *testing.T) { var zeroValue string t := &TeamLDAPMapping{Description: &zeroValue} t.GetDescription() t = &TeamLDAPMapping{} t.GetDescription() t = nil t.GetDescription() } func TestTeamLDAPMapping_GetID(tt *testing.T) { var zeroValue int64 t := &TeamLDAPMapping{ID: &zeroValue} t.GetID() t = &TeamLDAPMapping{} t.GetID() t = nil t.GetID() } func TestTeamLDAPMapping_GetLDAPDN(tt *testing.T) { var zeroValue string t := &TeamLDAPMapping{LDAPDN: &zeroValue} t.GetLDAPDN() t = &TeamLDAPMapping{} t.GetLDAPDN() t = nil t.GetLDAPDN() } func TestTeamLDAPMapping_GetMembersURL(tt *testing.T) { var zeroValue string t := &TeamLDAPMapping{MembersURL: &zeroValue} t.GetMembersURL() t = &TeamLDAPMapping{} t.GetMembersURL() t = nil t.GetMembersURL() } func TestTeamLDAPMapping_GetName(tt *testing.T) { var zeroValue string t := &TeamLDAPMapping{Name: &zeroValue} t.GetName() t = &TeamLDAPMapping{} t.GetName() t = nil t.GetName() } func TestTeamLDAPMapping_GetPermission(tt *testing.T) { var zeroValue string t := &TeamLDAPMapping{Permission: &zeroValue} t.GetPermission() t = &TeamLDAPMapping{} t.GetPermission() t = nil t.GetPermission() } func TestTeamLDAPMapping_GetPrivacy(tt *testing.T) { var zeroValue string t := &TeamLDAPMapping{Privacy: &zeroValue} t.GetPrivacy() t = &TeamLDAPMapping{} t.GetPrivacy() t = nil t.GetPrivacy() } func TestTeamLDAPMapping_GetRepositoriesURL(tt *testing.T) { var zeroValue string t := &TeamLDAPMapping{RepositoriesURL: &zeroValue} t.GetRepositoriesURL() t = &TeamLDAPMapping{} t.GetRepositoriesURL() t = nil t.GetRepositoriesURL() } func TestTeamLDAPMapping_GetSlug(tt *testing.T) { var zeroValue string t := &TeamLDAPMapping{Slug: &zeroValue} t.GetSlug() t = &TeamLDAPMapping{} t.GetSlug() t = nil t.GetSlug() } func TestTeamLDAPMapping_GetURL(tt *testing.T) { var zeroValue string t := &TeamLDAPMapping{URL: &zeroValue} t.GetURL() t = &TeamLDAPMapping{} t.GetURL() t = nil t.GetURL() } func TestTeamName_GetFrom(tt *testing.T) { var zeroValue string t := &TeamName{From: &zeroValue} t.GetFrom() t = &TeamName{} t.GetFrom() t = nil t.GetFrom() } func TestTeamPermissions_GetFrom(tt *testing.T) { t := &TeamPermissions{} t.GetFrom() t = nil t.GetFrom() } func TestTeamPermissionsFrom_GetAdmin(tt *testing.T) { var zeroValue bool t := &TeamPermissionsFrom{Admin: &zeroValue} t.GetAdmin() t = &TeamPermissionsFrom{} t.GetAdmin() t = nil t.GetAdmin() } func TestTeamPermissionsFrom_GetPull(tt *testing.T) { var zeroValue bool t := &TeamPermissionsFrom{Pull: &zeroValue} t.GetPull() t = &TeamPermissionsFrom{} t.GetPull() t = nil t.GetPull() } func TestTeamPermissionsFrom_GetPush(tt *testing.T) { var zeroValue bool t := &TeamPermissionsFrom{Push: &zeroValue} t.GetPush() t = &TeamPermissionsFrom{} t.GetPush() t = nil t.GetPush() } func TestTeamPrivacy_GetFrom(tt *testing.T) { var zeroValue string t := &TeamPrivacy{From: &zeroValue} t.GetFrom() t = &TeamPrivacy{} t.GetFrom() t = nil t.GetFrom() } func TestTeamProjectOptions_GetPermission(tt *testing.T) { var zeroValue string t := &TeamProjectOptions{Permission: &zeroValue} t.GetPermission() t = &TeamProjectOptions{} t.GetPermission() t = nil t.GetPermission() } func TestTeamRepository_GetPermissions(tt *testing.T) { t := &TeamRepository{} t.GetPermissions() t = nil t.GetPermissions() } func TestTemplateRepoRequest_GetDescription(tt *testing.T) { var zeroValue string t := &TemplateRepoRequest{Description: &zeroValue} t.GetDescription() t = &TemplateRepoRequest{} t.GetDescription() t = nil t.GetDescription() } func TestTemplateRepoRequest_GetIncludeAllBranches(tt *testing.T) { var zeroValue bool t := &TemplateRepoRequest{IncludeAllBranches: &zeroValue} t.GetIncludeAllBranches() t = &TemplateRepoRequest{} t.GetIncludeAllBranches() t = nil t.GetIncludeAllBranches() } func TestTemplateRepoRequest_GetName(tt *testing.T) { var zeroValue string t := &TemplateRepoRequest{Name: &zeroValue} t.GetName() t = &TemplateRepoRequest{} t.GetName() t = nil t.GetName() } func TestTemplateRepoRequest_GetOwner(tt *testing.T) { var zeroValue string t := &TemplateRepoRequest{Owner: &zeroValue} t.GetOwner() t = &TemplateRepoRequest{} t.GetOwner() t = nil t.GetOwner() } func TestTemplateRepoRequest_GetPrivate(tt *testing.T) { var zeroValue bool t := &TemplateRepoRequest{Private: &zeroValue} t.GetPrivate() t = &TemplateRepoRequest{} t.GetPrivate() t = nil t.GetPrivate() } func TestTextMatch_GetFragment(tt *testing.T) { var zeroValue string t := &TextMatch{Fragment: &zeroValue} t.GetFragment() t = &TextMatch{} t.GetFragment() t = nil t.GetFragment() } func TestTextMatch_GetObjectType(tt *testing.T) { var zeroValue string t := &TextMatch{ObjectType: &zeroValue} t.GetObjectType() t = &TextMatch{} t.GetObjectType() t = nil t.GetObjectType() } func TestTextMatch_GetObjectURL(tt *testing.T) { var zeroValue string t := &TextMatch{ObjectURL: &zeroValue} t.GetObjectURL() t = &TextMatch{} t.GetObjectURL() t = nil t.GetObjectURL() } func TestTextMatch_GetProperty(tt *testing.T) { var zeroValue string t := &TextMatch{Property: &zeroValue} t.GetProperty() t = &TextMatch{} t.GetProperty() t = nil t.GetProperty() } func TestTimeline_GetActor(tt *testing.T) { t := &Timeline{} t.GetActor() t = nil t.GetActor() } func TestTimeline_GetAssignee(tt *testing.T) { t := &Timeline{} t.GetAssignee() t = nil t.GetAssignee() } func TestTimeline_GetCommitID(tt *testing.T) { var zeroValue string t := &Timeline{CommitID: &zeroValue} t.GetCommitID() t = &Timeline{} t.GetCommitID() t = nil t.GetCommitID() } func TestTimeline_GetCommitURL(tt *testing.T) { var zeroValue string t := &Timeline{CommitURL: &zeroValue} t.GetCommitURL() t = &Timeline{} t.GetCommitURL() t = nil t.GetCommitURL() } func TestTimeline_GetCreatedAt(tt *testing.T) { var zeroValue time.Time t := &Timeline{CreatedAt: &zeroValue} t.GetCreatedAt() t = &Timeline{} t.GetCreatedAt() t = nil t.GetCreatedAt() } func TestTimeline_GetEvent(tt *testing.T) { var zeroValue string t := &Timeline{Event: &zeroValue} t.GetEvent() t = &Timeline{} t.GetEvent() t = nil t.GetEvent() } func TestTimeline_GetID(tt *testing.T) { var zeroValue int64 t := &Timeline{ID: &zeroValue} t.GetID() t = &Timeline{} t.GetID() t = nil t.GetID() } func TestTimeline_GetLabel(tt *testing.T) { t := &Timeline{} t.GetLabel() t = nil t.GetLabel() } func TestTimeline_GetMilestone(tt *testing.T) { t := &Timeline{} t.GetMilestone() t = nil t.GetMilestone() } func TestTimeline_GetProjectCard(tt *testing.T) { t := &Timeline{} t.GetProjectCard() t = nil t.GetProjectCard() } func TestTimeline_GetRename(tt *testing.T) { t := &Timeline{} t.GetRename() t = nil t.GetRename() } func TestTimeline_GetSource(tt *testing.T) { t := &Timeline{} t.GetSource() t = nil t.GetSource() } func TestTimeline_GetState(tt *testing.T) { var zeroValue string t := &Timeline{State: &zeroValue} t.GetState() t = &Timeline{} t.GetState() t = nil t.GetState() } func TestTimeline_GetURL(tt *testing.T) { var zeroValue string t := &Timeline{URL: &zeroValue} t.GetURL() t = &Timeline{} t.GetURL() t = nil t.GetURL() } func TestTool_GetGUID(tt *testing.T) { var zeroValue string t := &Tool{GUID: &zeroValue} t.GetGUID() t = &Tool{} t.GetGUID() t = nil t.GetGUID() } func TestTool_GetName(tt *testing.T) { var zeroValue string t := &Tool{Name: &zeroValue} t.GetName() t = &Tool{} t.GetName() t = nil t.GetName() } func TestTool_GetVersion(tt *testing.T) { var zeroValue string t := &Tool{Version: &zeroValue} t.GetVersion() t = &Tool{} t.GetVersion() t = nil t.GetVersion() } func TestTopicResult_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp t := &TopicResult{CreatedAt: &zeroValue} t.GetCreatedAt() t = &TopicResult{} t.GetCreatedAt() t = nil t.GetCreatedAt() } func TestTopicResult_GetCreatedBy(tt *testing.T) { var zeroValue string t := &TopicResult{CreatedBy: &zeroValue} t.GetCreatedBy() t = &TopicResult{} t.GetCreatedBy() t = nil t.GetCreatedBy() } func TestTopicResult_GetCurated(tt *testing.T) { var zeroValue bool t := &TopicResult{Curated: &zeroValue} t.GetCurated() t = &TopicResult{} t.GetCurated() t = nil t.GetCurated() } func TestTopicResult_GetDescription(tt *testing.T) { var zeroValue string t := &TopicResult{Description: &zeroValue} t.GetDescription() t = &TopicResult{} t.GetDescription() t = nil t.GetDescription() } func TestTopicResult_GetDisplayName(tt *testing.T) { var zeroValue string t := &TopicResult{DisplayName: &zeroValue} t.GetDisplayName() t = &TopicResult{} t.GetDisplayName() t = nil t.GetDisplayName() } func TestTopicResult_GetFeatured(tt *testing.T) { var zeroValue bool t := &TopicResult{Featured: &zeroValue} t.GetFeatured() t = &TopicResult{} t.GetFeatured() t = nil t.GetFeatured() } func TestTopicResult_GetName(tt *testing.T) { var zeroValue string t := &TopicResult{Name: &zeroValue} t.GetName() t = &TopicResult{} t.GetName() t = nil t.GetName() } func TestTopicResult_GetScore(tt *testing.T) { t := &TopicResult{} t.GetScore() t = nil t.GetScore() } func TestTopicResult_GetShortDescription(tt *testing.T) { var zeroValue string t := &TopicResult{ShortDescription: &zeroValue} t.GetShortDescription() t = &TopicResult{} t.GetShortDescription() t = nil t.GetShortDescription() } func TestTopicResult_GetUpdatedAt(tt *testing.T) { var zeroValue string t := &TopicResult{UpdatedAt: &zeroValue} t.GetUpdatedAt() t = &TopicResult{} t.GetUpdatedAt() t = nil t.GetUpdatedAt() } func TestTopicsSearchResult_GetIncompleteResults(tt *testing.T) { var zeroValue bool t := &TopicsSearchResult{IncompleteResults: &zeroValue} t.GetIncompleteResults() t = &TopicsSearchResult{} t.GetIncompleteResults() t = nil t.GetIncompleteResults() } func TestTopicsSearchResult_GetTotal(tt *testing.T) { var zeroValue int t := &TopicsSearchResult{Total: &zeroValue} t.GetTotal() t = &TopicsSearchResult{} t.GetTotal() t = nil t.GetTotal() } func TestTrafficClones_GetCount(tt *testing.T) { var zeroValue int t := &TrafficClones{Count: &zeroValue} t.GetCount() t = &TrafficClones{} t.GetCount() t = nil t.GetCount() } func TestTrafficClones_GetUniques(tt *testing.T) { var zeroValue int t := &TrafficClones{Uniques: &zeroValue} t.GetUniques() t = &TrafficClones{} t.GetUniques() t = nil t.GetUniques() } func TestTrafficData_GetCount(tt *testing.T) { var zeroValue int t := &TrafficData{Count: &zeroValue} t.GetCount() t = &TrafficData{} t.GetCount() t = nil t.GetCount() } func TestTrafficData_GetTimestamp(tt *testing.T) { var zeroValue Timestamp t := &TrafficData{Timestamp: &zeroValue} t.GetTimestamp() t = &TrafficData{} t.GetTimestamp() t = nil t.GetTimestamp() } func TestTrafficData_GetUniques(tt *testing.T) { var zeroValue int t := &TrafficData{Uniques: &zeroValue} t.GetUniques() t = &TrafficData{} t.GetUniques() t = nil t.GetUniques() } func TestTrafficPath_GetCount(tt *testing.T) { var zeroValue int t := &TrafficPath{Count: &zeroValue} t.GetCount() t = &TrafficPath{} t.GetCount() t = nil t.GetCount() } func TestTrafficPath_GetPath(tt *testing.T) { var zeroValue string t := &TrafficPath{Path: &zeroValue} t.GetPath() t = &TrafficPath{} t.GetPath() t = nil t.GetPath() } func TestTrafficPath_GetTitle(tt *testing.T) { var zeroValue string t := &TrafficPath{Title: &zeroValue} t.GetTitle() t = &TrafficPath{} t.GetTitle() t = nil t.GetTitle() } func TestTrafficPath_GetUniques(tt *testing.T) { var zeroValue int t := &TrafficPath{Uniques: &zeroValue} t.GetUniques() t = &TrafficPath{} t.GetUniques() t = nil t.GetUniques() } func TestTrafficReferrer_GetCount(tt *testing.T) { var zeroValue int t := &TrafficReferrer{Count: &zeroValue} t.GetCount() t = &TrafficReferrer{} t.GetCount() t = nil t.GetCount() } func TestTrafficReferrer_GetReferrer(tt *testing.T) { var zeroValue string t := &TrafficReferrer{Referrer: &zeroValue} t.GetReferrer() t = &TrafficReferrer{} t.GetReferrer() t = nil t.GetReferrer() } func TestTrafficReferrer_GetUniques(tt *testing.T) { var zeroValue int t := &TrafficReferrer{Uniques: &zeroValue} t.GetUniques() t = &TrafficReferrer{} t.GetUniques() t = nil t.GetUniques() } func TestTrafficViews_GetCount(tt *testing.T) { var zeroValue int t := &TrafficViews{Count: &zeroValue} t.GetCount() t = &TrafficViews{} t.GetCount() t = nil t.GetCount() } func TestTrafficViews_GetUniques(tt *testing.T) { var zeroValue int t := &TrafficViews{Uniques: &zeroValue} t.GetUniques() t = &TrafficViews{} t.GetUniques() t = nil t.GetUniques() } func TestTree_GetSHA(tt *testing.T) { var zeroValue string t := &Tree{SHA: &zeroValue} t.GetSHA() t = &Tree{} t.GetSHA() t = nil t.GetSHA() } func TestTree_GetTruncated(tt *testing.T) { var zeroValue bool t := &Tree{Truncated: &zeroValue} t.GetTruncated() t = &Tree{} t.GetTruncated() t = nil t.GetTruncated() } func TestTreeEntry_GetContent(tt *testing.T) { var zeroValue string t := &TreeEntry{Content: &zeroValue} t.GetContent() t = &TreeEntry{} t.GetContent() t = nil t.GetContent() } func TestTreeEntry_GetMode(tt *testing.T) { var zeroValue string t := &TreeEntry{Mode: &zeroValue} t.GetMode() t = &TreeEntry{} t.GetMode() t = nil t.GetMode() } func TestTreeEntry_GetPath(tt *testing.T) { var zeroValue string t := &TreeEntry{Path: &zeroValue} t.GetPath() t = &TreeEntry{} t.GetPath() t = nil t.GetPath() } func TestTreeEntry_GetSHA(tt *testing.T) { var zeroValue string t := &TreeEntry{SHA: &zeroValue} t.GetSHA() t = &TreeEntry{} t.GetSHA() t = nil t.GetSHA() } func TestTreeEntry_GetSize(tt *testing.T) { var zeroValue int t := &TreeEntry{Size: &zeroValue} t.GetSize() t = &TreeEntry{} t.GetSize() t = nil t.GetSize() } func TestTreeEntry_GetType(tt *testing.T) { var zeroValue string t := &TreeEntry{Type: &zeroValue} t.GetType() t = &TreeEntry{} t.GetType() t = nil t.GetType() } func TestTreeEntry_GetURL(tt *testing.T) { var zeroValue string t := &TreeEntry{URL: &zeroValue} t.GetURL() t = &TreeEntry{} t.GetURL() t = nil t.GetURL() } func TestUpdateCheckRunOptions_GetCompletedAt(tt *testing.T) { var zeroValue Timestamp u := &UpdateCheckRunOptions{CompletedAt: &zeroValue} u.GetCompletedAt() u = &UpdateCheckRunOptions{} u.GetCompletedAt() u = nil u.GetCompletedAt() } func TestUpdateCheckRunOptions_GetConclusion(tt *testing.T) { var zeroValue string u := &UpdateCheckRunOptions{Conclusion: &zeroValue} u.GetConclusion() u = &UpdateCheckRunOptions{} u.GetConclusion() u = nil u.GetConclusion() } func TestUpdateCheckRunOptions_GetDetailsURL(tt *testing.T) { var zeroValue string u := &UpdateCheckRunOptions{DetailsURL: &zeroValue} u.GetDetailsURL() u = &UpdateCheckRunOptions{} u.GetDetailsURL() u = nil u.GetDetailsURL() } func TestUpdateCheckRunOptions_GetExternalID(tt *testing.T) { var zeroValue string u := &UpdateCheckRunOptions{ExternalID: &zeroValue} u.GetExternalID() u = &UpdateCheckRunOptions{} u.GetExternalID() u = nil u.GetExternalID() } func TestUpdateCheckRunOptions_GetOutput(tt *testing.T) { u := &UpdateCheckRunOptions{} u.GetOutput() u = nil u.GetOutput() } func TestUpdateCheckRunOptions_GetStatus(tt *testing.T) { var zeroValue string u := &UpdateCheckRunOptions{Status: &zeroValue} u.GetStatus() u = &UpdateCheckRunOptions{} u.GetStatus() u = nil u.GetStatus() } func TestUpdateRunnerGroupRequest_GetAllowsPublicRepositories(tt *testing.T) { var zeroValue bool u := &UpdateRunnerGroupRequest{AllowsPublicRepositories: &zeroValue} u.GetAllowsPublicRepositories() u = &UpdateRunnerGroupRequest{} u.GetAllowsPublicRepositories() u = nil u.GetAllowsPublicRepositories() } func TestUpdateRunnerGroupRequest_GetName(tt *testing.T) { var zeroValue string u := &UpdateRunnerGroupRequest{Name: &zeroValue} u.GetName() u = &UpdateRunnerGroupRequest{} u.GetName() u = nil u.GetName() } func TestUpdateRunnerGroupRequest_GetVisibility(tt *testing.T) { var zeroValue string u := &UpdateRunnerGroupRequest{Visibility: &zeroValue} u.GetVisibility() u = &UpdateRunnerGroupRequest{} u.GetVisibility() u = nil u.GetVisibility() } func TestUser_GetAvatarURL(tt *testing.T) { var zeroValue string u := &User{AvatarURL: &zeroValue} u.GetAvatarURL() u = &User{} u.GetAvatarURL() u = nil u.GetAvatarURL() } func TestUser_GetBio(tt *testing.T) { var zeroValue string u := &User{Bio: &zeroValue} u.GetBio() u = &User{} u.GetBio() u = nil u.GetBio() } func TestUser_GetBlog(tt *testing.T) { var zeroValue string u := &User{Blog: &zeroValue} u.GetBlog() u = &User{} u.GetBlog() u = nil u.GetBlog() } func TestUser_GetCollaborators(tt *testing.T) { var zeroValue int u := &User{Collaborators: &zeroValue} u.GetCollaborators() u = &User{} u.GetCollaborators() u = nil u.GetCollaborators() } func TestUser_GetCompany(tt *testing.T) { var zeroValue string u := &User{Company: &zeroValue} u.GetCompany() u = &User{} u.GetCompany() u = nil u.GetCompany() } func TestUser_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp u := &User{CreatedAt: &zeroValue} u.GetCreatedAt() u = &User{} u.GetCreatedAt() u = nil u.GetCreatedAt() } func TestUser_GetDiskUsage(tt *testing.T) { var zeroValue int u := &User{DiskUsage: &zeroValue} u.GetDiskUsage() u = &User{} u.GetDiskUsage() u = nil u.GetDiskUsage() } func TestUser_GetEmail(tt *testing.T) { var zeroValue string u := &User{Email: &zeroValue} u.GetEmail() u = &User{} u.GetEmail() u = nil u.GetEmail() } func TestUser_GetEventsURL(tt *testing.T) { var zeroValue string u := &User{EventsURL: &zeroValue} u.GetEventsURL() u = &User{} u.GetEventsURL() u = nil u.GetEventsURL() } func TestUser_GetFollowers(tt *testing.T) { var zeroValue int u := &User{Followers: &zeroValue} u.GetFollowers() u = &User{} u.GetFollowers() u = nil u.GetFollowers() } func TestUser_GetFollowersURL(tt *testing.T) { var zeroValue string u := &User{FollowersURL: &zeroValue} u.GetFollowersURL() u = &User{} u.GetFollowersURL() u = nil u.GetFollowersURL() } func TestUser_GetFollowing(tt *testing.T) { var zeroValue int u := &User{Following: &zeroValue} u.GetFollowing() u = &User{} u.GetFollowing() u = nil u.GetFollowing() } func TestUser_GetFollowingURL(tt *testing.T) { var zeroValue string u := &User{FollowingURL: &zeroValue} u.GetFollowingURL() u = &User{} u.GetFollowingURL() u = nil u.GetFollowingURL() } func TestUser_GetGistsURL(tt *testing.T) { var zeroValue string u := &User{GistsURL: &zeroValue} u.GetGistsURL() u = &User{} u.GetGistsURL() u = nil u.GetGistsURL() } func TestUser_GetGravatarID(tt *testing.T) { var zeroValue string u := &User{GravatarID: &zeroValue} u.GetGravatarID() u = &User{} u.GetGravatarID() u = nil u.GetGravatarID() } func TestUser_GetHireable(tt *testing.T) { var zeroValue bool u := &User{Hireable: &zeroValue} u.GetHireable() u = &User{} u.GetHireable() u = nil u.GetHireable() } func TestUser_GetHTMLURL(tt *testing.T) { var zeroValue string u := &User{HTMLURL: &zeroValue} u.GetHTMLURL() u = &User{} u.GetHTMLURL() u = nil u.GetHTMLURL() } func TestUser_GetID(tt *testing.T) { var zeroValue int64 u := &User{ID: &zeroValue} u.GetID() u = &User{} u.GetID() u = nil u.GetID() } func TestUser_GetLdapDn(tt *testing.T) { var zeroValue string u := &User{LdapDn: &zeroValue} u.GetLdapDn() u = &User{} u.GetLdapDn() u = nil u.GetLdapDn() } func TestUser_GetLocation(tt *testing.T) { var zeroValue string u := &User{Location: &zeroValue} u.GetLocation() u = &User{} u.GetLocation() u = nil u.GetLocation() } func TestUser_GetLogin(tt *testing.T) { var zeroValue string u := &User{Login: &zeroValue} u.GetLogin() u = &User{} u.GetLogin() u = nil u.GetLogin() } func TestUser_GetName(tt *testing.T) { var zeroValue string u := &User{Name: &zeroValue} u.GetName() u = &User{} u.GetName() u = nil u.GetName() } func TestUser_GetNodeID(tt *testing.T) { var zeroValue string u := &User{NodeID: &zeroValue} u.GetNodeID() u = &User{} u.GetNodeID() u = nil u.GetNodeID() } func TestUser_GetOrganizationsURL(tt *testing.T) { var zeroValue string u := &User{OrganizationsURL: &zeroValue} u.GetOrganizationsURL() u = &User{} u.GetOrganizationsURL() u = nil u.GetOrganizationsURL() } func TestUser_GetOwnedPrivateRepos(tt *testing.T) { var zeroValue int u := &User{OwnedPrivateRepos: &zeroValue} u.GetOwnedPrivateRepos() u = &User{} u.GetOwnedPrivateRepos() u = nil u.GetOwnedPrivateRepos() } func TestUser_GetPermissions(tt *testing.T) { zeroValue := map[string]bool{} u := &User{Permissions: zeroValue} u.GetPermissions() u = &User{} u.GetPermissions() u = nil u.GetPermissions() } func TestUser_GetPlan(tt *testing.T) { u := &User{} u.GetPlan() u = nil u.GetPlan() } func TestUser_GetPrivateGists(tt *testing.T) { var zeroValue int u := &User{PrivateGists: &zeroValue} u.GetPrivateGists() u = &User{} u.GetPrivateGists() u = nil u.GetPrivateGists() } func TestUser_GetPublicGists(tt *testing.T) { var zeroValue int u := &User{PublicGists: &zeroValue} u.GetPublicGists() u = &User{} u.GetPublicGists() u = nil u.GetPublicGists() } func TestUser_GetPublicRepos(tt *testing.T) { var zeroValue int u := &User{PublicRepos: &zeroValue} u.GetPublicRepos() u = &User{} u.GetPublicRepos() u = nil u.GetPublicRepos() } func TestUser_GetReceivedEventsURL(tt *testing.T) { var zeroValue string u := &User{ReceivedEventsURL: &zeroValue} u.GetReceivedEventsURL() u = &User{} u.GetReceivedEventsURL() u = nil u.GetReceivedEventsURL() } func TestUser_GetReposURL(tt *testing.T) { var zeroValue string u := &User{ReposURL: &zeroValue} u.GetReposURL() u = &User{} u.GetReposURL() u = nil u.GetReposURL() } func TestUser_GetSiteAdmin(tt *testing.T) { var zeroValue bool u := &User{SiteAdmin: &zeroValue} u.GetSiteAdmin() u = &User{} u.GetSiteAdmin() u = nil u.GetSiteAdmin() } func TestUser_GetStarredURL(tt *testing.T) { var zeroValue string u := &User{StarredURL: &zeroValue} u.GetStarredURL() u = &User{} u.GetStarredURL() u = nil u.GetStarredURL() } func TestUser_GetSubscriptionsURL(tt *testing.T) { var zeroValue string u := &User{SubscriptionsURL: &zeroValue} u.GetSubscriptionsURL() u = &User{} u.GetSubscriptionsURL() u = nil u.GetSubscriptionsURL() } func TestUser_GetSuspendedAt(tt *testing.T) { var zeroValue Timestamp u := &User{SuspendedAt: &zeroValue} u.GetSuspendedAt() u = &User{} u.GetSuspendedAt() u = nil u.GetSuspendedAt() } func TestUser_GetTotalPrivateRepos(tt *testing.T) { var zeroValue int u := &User{TotalPrivateRepos: &zeroValue} u.GetTotalPrivateRepos() u = &User{} u.GetTotalPrivateRepos() u = nil u.GetTotalPrivateRepos() } func TestUser_GetTwitterUsername(tt *testing.T) { var zeroValue string u := &User{TwitterUsername: &zeroValue} u.GetTwitterUsername() u = &User{} u.GetTwitterUsername() u = nil u.GetTwitterUsername() } func TestUser_GetTwoFactorAuthentication(tt *testing.T) { var zeroValue bool u := &User{TwoFactorAuthentication: &zeroValue} u.GetTwoFactorAuthentication() u = &User{} u.GetTwoFactorAuthentication() u = nil u.GetTwoFactorAuthentication() } func TestUser_GetType(tt *testing.T) { var zeroValue string u := &User{Type: &zeroValue} u.GetType() u = &User{} u.GetType() u = nil u.GetType() } func TestUser_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp u := &User{UpdatedAt: &zeroValue} u.GetUpdatedAt() u = &User{} u.GetUpdatedAt() u = nil u.GetUpdatedAt() } func TestUser_GetURL(tt *testing.T) { var zeroValue string u := &User{URL: &zeroValue} u.GetURL() u = &User{} u.GetURL() u = nil u.GetURL() } func TestUserAuthorization_GetApp(tt *testing.T) { u := &UserAuthorization{} u.GetApp() u = nil u.GetApp() } func TestUserAuthorization_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp u := &UserAuthorization{CreatedAt: &zeroValue} u.GetCreatedAt() u = &UserAuthorization{} u.GetCreatedAt() u = nil u.GetCreatedAt() } func TestUserAuthorization_GetFingerprint(tt *testing.T) { var zeroValue string u := &UserAuthorization{Fingerprint: &zeroValue} u.GetFingerprint() u = &UserAuthorization{} u.GetFingerprint() u = nil u.GetFingerprint() } func TestUserAuthorization_GetHashedToken(tt *testing.T) { var zeroValue string u := &UserAuthorization{HashedToken: &zeroValue} u.GetHashedToken() u = &UserAuthorization{} u.GetHashedToken() u = nil u.GetHashedToken() } func TestUserAuthorization_GetID(tt *testing.T) { var zeroValue int64 u := &UserAuthorization{ID: &zeroValue} u.GetID() u = &UserAuthorization{} u.GetID() u = nil u.GetID() } func TestUserAuthorization_GetNote(tt *testing.T) { var zeroValue string u := &UserAuthorization{Note: &zeroValue} u.GetNote() u = &UserAuthorization{} u.GetNote() u = nil u.GetNote() } func TestUserAuthorization_GetNoteURL(tt *testing.T) { var zeroValue string u := &UserAuthorization{NoteURL: &zeroValue} u.GetNoteURL() u = &UserAuthorization{} u.GetNoteURL() u = nil u.GetNoteURL() } func TestUserAuthorization_GetToken(tt *testing.T) { var zeroValue string u := &UserAuthorization{Token: &zeroValue} u.GetToken() u = &UserAuthorization{} u.GetToken() u = nil u.GetToken() } func TestUserAuthorization_GetTokenLastEight(tt *testing.T) { var zeroValue string u := &UserAuthorization{TokenLastEight: &zeroValue} u.GetTokenLastEight() u = &UserAuthorization{} u.GetTokenLastEight() u = nil u.GetTokenLastEight() } func TestUserAuthorization_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp u := &UserAuthorization{UpdatedAt: &zeroValue} u.GetUpdatedAt() u = &UserAuthorization{} u.GetUpdatedAt() u = nil u.GetUpdatedAt() } func TestUserAuthorization_GetURL(tt *testing.T) { var zeroValue string u := &UserAuthorization{URL: &zeroValue} u.GetURL() u = &UserAuthorization{} u.GetURL() u = nil u.GetURL() } func TestUserContext_GetMessage(tt *testing.T) { var zeroValue string u := &UserContext{Message: &zeroValue} u.GetMessage() u = &UserContext{} u.GetMessage() u = nil u.GetMessage() } func TestUserContext_GetOcticon(tt *testing.T) { var zeroValue string u := &UserContext{Octicon: &zeroValue} u.GetOcticon() u = &UserContext{} u.GetOcticon() u = nil u.GetOcticon() } func TestUserEmail_GetEmail(tt *testing.T) { var zeroValue string u := &UserEmail{Email: &zeroValue} u.GetEmail() u = &UserEmail{} u.GetEmail() u = nil u.GetEmail() } func TestUserEmail_GetPrimary(tt *testing.T) { var zeroValue bool u := &UserEmail{Primary: &zeroValue} u.GetPrimary() u = &UserEmail{} u.GetPrimary() u = nil u.GetPrimary() } func TestUserEmail_GetVerified(tt *testing.T) { var zeroValue bool u := &UserEmail{Verified: &zeroValue} u.GetVerified() u = &UserEmail{} u.GetVerified() u = nil u.GetVerified() } func TestUserEmail_GetVisibility(tt *testing.T) { var zeroValue string u := &UserEmail{Visibility: &zeroValue} u.GetVisibility() u = &UserEmail{} u.GetVisibility() u = nil u.GetVisibility() } func TestUserEvent_GetAction(tt *testing.T) { var zeroValue string u := &UserEvent{Action: &zeroValue} u.GetAction() u = &UserEvent{} u.GetAction() u = nil u.GetAction() } func TestUserEvent_GetEnterprise(tt *testing.T) { u := &UserEvent{} u.GetEnterprise() u = nil u.GetEnterprise() } func TestUserEvent_GetSender(tt *testing.T) { u := &UserEvent{} u.GetSender() u = nil u.GetSender() } func TestUserEvent_GetUser(tt *testing.T) { u := &UserEvent{} u.GetUser() u = nil u.GetUser() } func TestUserLDAPMapping_GetAvatarURL(tt *testing.T) { var zeroValue string u := &UserLDAPMapping{AvatarURL: &zeroValue} u.GetAvatarURL() u = &UserLDAPMapping{} u.GetAvatarURL() u = nil u.GetAvatarURL() } func TestUserLDAPMapping_GetEventsURL(tt *testing.T) { var zeroValue string u := &UserLDAPMapping{EventsURL: &zeroValue} u.GetEventsURL() u = &UserLDAPMapping{} u.GetEventsURL() u = nil u.GetEventsURL() } func TestUserLDAPMapping_GetFollowersURL(tt *testing.T) { var zeroValue string u := &UserLDAPMapping{FollowersURL: &zeroValue} u.GetFollowersURL() u = &UserLDAPMapping{} u.GetFollowersURL() u = nil u.GetFollowersURL() } func TestUserLDAPMapping_GetFollowingURL(tt *testing.T) { var zeroValue string u := &UserLDAPMapping{FollowingURL: &zeroValue} u.GetFollowingURL() u = &UserLDAPMapping{} u.GetFollowingURL() u = nil u.GetFollowingURL() } func TestUserLDAPMapping_GetGistsURL(tt *testing.T) { var zeroValue string u := &UserLDAPMapping{GistsURL: &zeroValue} u.GetGistsURL() u = &UserLDAPMapping{} u.GetGistsURL() u = nil u.GetGistsURL() } func TestUserLDAPMapping_GetGravatarID(tt *testing.T) { var zeroValue string u := &UserLDAPMapping{GravatarID: &zeroValue} u.GetGravatarID() u = &UserLDAPMapping{} u.GetGravatarID() u = nil u.GetGravatarID() } func TestUserLDAPMapping_GetID(tt *testing.T) { var zeroValue int64 u := &UserLDAPMapping{ID: &zeroValue} u.GetID() u = &UserLDAPMapping{} u.GetID() u = nil u.GetID() } func TestUserLDAPMapping_GetLDAPDN(tt *testing.T) { var zeroValue string u := &UserLDAPMapping{LDAPDN: &zeroValue} u.GetLDAPDN() u = &UserLDAPMapping{} u.GetLDAPDN() u = nil u.GetLDAPDN() } func TestUserLDAPMapping_GetLogin(tt *testing.T) { var zeroValue string u := &UserLDAPMapping{Login: &zeroValue} u.GetLogin() u = &UserLDAPMapping{} u.GetLogin() u = nil u.GetLogin() } func TestUserLDAPMapping_GetOrganizationsURL(tt *testing.T) { var zeroValue string u := &UserLDAPMapping{OrganizationsURL: &zeroValue} u.GetOrganizationsURL() u = &UserLDAPMapping{} u.GetOrganizationsURL() u = nil u.GetOrganizationsURL() } func TestUserLDAPMapping_GetReceivedEventsURL(tt *testing.T) { var zeroValue string u := &UserLDAPMapping{ReceivedEventsURL: &zeroValue} u.GetReceivedEventsURL() u = &UserLDAPMapping{} u.GetReceivedEventsURL() u = nil u.GetReceivedEventsURL() } func TestUserLDAPMapping_GetReposURL(tt *testing.T) { var zeroValue string u := &UserLDAPMapping{ReposURL: &zeroValue} u.GetReposURL() u = &UserLDAPMapping{} u.GetReposURL() u = nil u.GetReposURL() } func TestUserLDAPMapping_GetSiteAdmin(tt *testing.T) { var zeroValue bool u := &UserLDAPMapping{SiteAdmin: &zeroValue} u.GetSiteAdmin() u = &UserLDAPMapping{} u.GetSiteAdmin() u = nil u.GetSiteAdmin() } func TestUserLDAPMapping_GetStarredURL(tt *testing.T) { var zeroValue string u := &UserLDAPMapping{StarredURL: &zeroValue} u.GetStarredURL() u = &UserLDAPMapping{} u.GetStarredURL() u = nil u.GetStarredURL() } func TestUserLDAPMapping_GetSubscriptionsURL(tt *testing.T) { var zeroValue string u := &UserLDAPMapping{SubscriptionsURL: &zeroValue} u.GetSubscriptionsURL() u = &UserLDAPMapping{} u.GetSubscriptionsURL() u = nil u.GetSubscriptionsURL() } func TestUserLDAPMapping_GetType(tt *testing.T) { var zeroValue string u := &UserLDAPMapping{Type: &zeroValue} u.GetType() u = &UserLDAPMapping{} u.GetType() u = nil u.GetType() } func TestUserLDAPMapping_GetURL(tt *testing.T) { var zeroValue string u := &UserLDAPMapping{URL: &zeroValue} u.GetURL() u = &UserLDAPMapping{} u.GetURL() u = nil u.GetURL() } func TestUserMigration_GetCreatedAt(tt *testing.T) { var zeroValue string u := &UserMigration{CreatedAt: &zeroValue} u.GetCreatedAt() u = &UserMigration{} u.GetCreatedAt() u = nil u.GetCreatedAt() } func TestUserMigration_GetExcludeAttachments(tt *testing.T) { var zeroValue bool u := &UserMigration{ExcludeAttachments: &zeroValue} u.GetExcludeAttachments() u = &UserMigration{} u.GetExcludeAttachments() u = nil u.GetExcludeAttachments() } func TestUserMigration_GetGUID(tt *testing.T) { var zeroValue string u := &UserMigration{GUID: &zeroValue} u.GetGUID() u = &UserMigration{} u.GetGUID() u = nil u.GetGUID() } func TestUserMigration_GetID(tt *testing.T) { var zeroValue int64 u := &UserMigration{ID: &zeroValue} u.GetID() u = &UserMigration{} u.GetID() u = nil u.GetID() } func TestUserMigration_GetLockRepositories(tt *testing.T) { var zeroValue bool u := &UserMigration{LockRepositories: &zeroValue} u.GetLockRepositories() u = &UserMigration{} u.GetLockRepositories() u = nil u.GetLockRepositories() } func TestUserMigration_GetState(tt *testing.T) { var zeroValue string u := &UserMigration{State: &zeroValue} u.GetState() u = &UserMigration{} u.GetState() u = nil u.GetState() } func TestUserMigration_GetUpdatedAt(tt *testing.T) { var zeroValue string u := &UserMigration{UpdatedAt: &zeroValue} u.GetUpdatedAt() u = &UserMigration{} u.GetUpdatedAt() u = nil u.GetUpdatedAt() } func TestUserMigration_GetURL(tt *testing.T) { var zeroValue string u := &UserMigration{URL: &zeroValue} u.GetURL() u = &UserMigration{} u.GetURL() u = nil u.GetURL() } func TestUsersSearchResult_GetIncompleteResults(tt *testing.T) { var zeroValue bool u := &UsersSearchResult{IncompleteResults: &zeroValue} u.GetIncompleteResults() u = &UsersSearchResult{} u.GetIncompleteResults() u = nil u.GetIncompleteResults() } func TestUsersSearchResult_GetTotal(tt *testing.T) { var zeroValue int u := &UsersSearchResult{Total: &zeroValue} u.GetTotal() u = &UsersSearchResult{} u.GetTotal() u = nil u.GetTotal() } func TestUserStats_GetAdminUsers(tt *testing.T) { var zeroValue int u := &UserStats{AdminUsers: &zeroValue} u.GetAdminUsers() u = &UserStats{} u.GetAdminUsers() u = nil u.GetAdminUsers() } func TestUserStats_GetSuspendedUsers(tt *testing.T) { var zeroValue int u := &UserStats{SuspendedUsers: &zeroValue} u.GetSuspendedUsers() u = &UserStats{} u.GetSuspendedUsers() u = nil u.GetSuspendedUsers() } func TestUserStats_GetTotalUsers(tt *testing.T) { var zeroValue int u := &UserStats{TotalUsers: &zeroValue} u.GetTotalUsers() u = &UserStats{} u.GetTotalUsers() u = nil u.GetTotalUsers() } func TestUserSuspendOptions_GetReason(tt *testing.T) { var zeroValue string u := &UserSuspendOptions{Reason: &zeroValue} u.GetReason() u = &UserSuspendOptions{} u.GetReason() u = nil u.GetReason() } func TestWatchEvent_GetAction(tt *testing.T) { var zeroValue string w := &WatchEvent{Action: &zeroValue} w.GetAction() w = &WatchEvent{} w.GetAction() w = nil w.GetAction() } func TestWatchEvent_GetInstallation(tt *testing.T) { w := &WatchEvent{} w.GetInstallation() w = nil w.GetInstallation() } func TestWatchEvent_GetRepo(tt *testing.T) { w := &WatchEvent{} w.GetRepo() w = nil w.GetRepo() } func TestWatchEvent_GetSender(tt *testing.T) { w := &WatchEvent{} w.GetSender() w = nil w.GetSender() } func TestWebHookAuthor_GetEmail(tt *testing.T) { var zeroValue string w := &WebHookAuthor{Email: &zeroValue} w.GetEmail() w = &WebHookAuthor{} w.GetEmail() w = nil w.GetEmail() } func TestWebHookAuthor_GetName(tt *testing.T) { var zeroValue string w := &WebHookAuthor{Name: &zeroValue} w.GetName() w = &WebHookAuthor{} w.GetName() w = nil w.GetName() } func TestWebHookAuthor_GetUsername(tt *testing.T) { var zeroValue string w := &WebHookAuthor{Username: &zeroValue} w.GetUsername() w = &WebHookAuthor{} w.GetUsername() w = nil w.GetUsername() } func TestWebHookCommit_GetAuthor(tt *testing.T) { w := &WebHookCommit{} w.GetAuthor() w = nil w.GetAuthor() } func TestWebHookCommit_GetCommitter(tt *testing.T) { w := &WebHookCommit{} w.GetCommitter() w = nil w.GetCommitter() } func TestWebHookCommit_GetDistinct(tt *testing.T) { var zeroValue bool w := &WebHookCommit{Distinct: &zeroValue} w.GetDistinct() w = &WebHookCommit{} w.GetDistinct() w = nil w.GetDistinct() } func TestWebHookCommit_GetID(tt *testing.T) { var zeroValue string w := &WebHookCommit{ID: &zeroValue} w.GetID() w = &WebHookCommit{} w.GetID() w = nil w.GetID() } func TestWebHookCommit_GetMessage(tt *testing.T) { var zeroValue string w := &WebHookCommit{Message: &zeroValue} w.GetMessage() w = &WebHookCommit{} w.GetMessage() w = nil w.GetMessage() } func TestWebHookCommit_GetTimestamp(tt *testing.T) { var zeroValue time.Time w := &WebHookCommit{Timestamp: &zeroValue} w.GetTimestamp() w = &WebHookCommit{} w.GetTimestamp() w = nil w.GetTimestamp() } func TestWebHookPayload_GetAction(tt *testing.T) { var zeroValue string w := &WebHookPayload{Action: &zeroValue} w.GetAction() w = &WebHookPayload{} w.GetAction() w = nil w.GetAction() } func TestWebHookPayload_GetAfter(tt *testing.T) { var zeroValue string w := &WebHookPayload{After: &zeroValue} w.GetAfter() w = &WebHookPayload{} w.GetAfter() w = nil w.GetAfter() } func TestWebHookPayload_GetBefore(tt *testing.T) { var zeroValue string w := &WebHookPayload{Before: &zeroValue} w.GetBefore() w = &WebHookPayload{} w.GetBefore() w = nil w.GetBefore() } func TestWebHookPayload_GetCompare(tt *testing.T) { var zeroValue string w := &WebHookPayload{Compare: &zeroValue} w.GetCompare() w = &WebHookPayload{} w.GetCompare() w = nil w.GetCompare() } func TestWebHookPayload_GetCreated(tt *testing.T) { var zeroValue bool w := &WebHookPayload{Created: &zeroValue} w.GetCreated() w = &WebHookPayload{} w.GetCreated() w = nil w.GetCreated() } func TestWebHookPayload_GetDeleted(tt *testing.T) { var zeroValue bool w := &WebHookPayload{Deleted: &zeroValue} w.GetDeleted() w = &WebHookPayload{} w.GetDeleted() w = nil w.GetDeleted() } func TestWebHookPayload_GetForced(tt *testing.T) { var zeroValue bool w := &WebHookPayload{Forced: &zeroValue} w.GetForced() w = &WebHookPayload{} w.GetForced() w = nil w.GetForced() } func TestWebHookPayload_GetHeadCommit(tt *testing.T) { w := &WebHookPayload{} w.GetHeadCommit() w = nil w.GetHeadCommit() } func TestWebHookPayload_GetInstallation(tt *testing.T) { w := &WebHookPayload{} w.GetInstallation() w = nil w.GetInstallation() } func TestWebHookPayload_GetOrganization(tt *testing.T) { w := &WebHookPayload{} w.GetOrganization() w = nil w.GetOrganization() } func TestWebHookPayload_GetPusher(tt *testing.T) { w := &WebHookPayload{} w.GetPusher() w = nil w.GetPusher() } func TestWebHookPayload_GetRef(tt *testing.T) { var zeroValue string w := &WebHookPayload{Ref: &zeroValue} w.GetRef() w = &WebHookPayload{} w.GetRef() w = nil w.GetRef() } func TestWebHookPayload_GetRepo(tt *testing.T) { w := &WebHookPayload{} w.GetRepo() w = nil w.GetRepo() } func TestWebHookPayload_GetSender(tt *testing.T) { w := &WebHookPayload{} w.GetSender() w = nil w.GetSender() } func TestWeeklyCommitActivity_GetTotal(tt *testing.T) { var zeroValue int w := &WeeklyCommitActivity{Total: &zeroValue} w.GetTotal() w = &WeeklyCommitActivity{} w.GetTotal() w = nil w.GetTotal() } func TestWeeklyCommitActivity_GetWeek(tt *testing.T) { var zeroValue Timestamp w := &WeeklyCommitActivity{Week: &zeroValue} w.GetWeek() w = &WeeklyCommitActivity{} w.GetWeek() w = nil w.GetWeek() } func TestWeeklyStats_GetAdditions(tt *testing.T) { var zeroValue int w := &WeeklyStats{Additions: &zeroValue} w.GetAdditions() w = &WeeklyStats{} w.GetAdditions() w = nil w.GetAdditions() } func TestWeeklyStats_GetCommits(tt *testing.T) { var zeroValue int w := &WeeklyStats{Commits: &zeroValue} w.GetCommits() w = &WeeklyStats{} w.GetCommits() w = nil w.GetCommits() } func TestWeeklyStats_GetDeletions(tt *testing.T) { var zeroValue int w := &WeeklyStats{Deletions: &zeroValue} w.GetDeletions() w = &WeeklyStats{} w.GetDeletions() w = nil w.GetDeletions() } func TestWeeklyStats_GetWeek(tt *testing.T) { var zeroValue Timestamp w := &WeeklyStats{Week: &zeroValue} w.GetWeek() w = &WeeklyStats{} w.GetWeek() w = nil w.GetWeek() } func TestWorkflow_GetBadgeURL(tt *testing.T) { var zeroValue string w := &Workflow{BadgeURL: &zeroValue} w.GetBadgeURL() w = &Workflow{} w.GetBadgeURL() w = nil w.GetBadgeURL() } func TestWorkflow_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp w := &Workflow{CreatedAt: &zeroValue} w.GetCreatedAt() w = &Workflow{} w.GetCreatedAt() w = nil w.GetCreatedAt() } func TestWorkflow_GetHTMLURL(tt *testing.T) { var zeroValue string w := &Workflow{HTMLURL: &zeroValue} w.GetHTMLURL() w = &Workflow{} w.GetHTMLURL() w = nil w.GetHTMLURL() } func TestWorkflow_GetID(tt *testing.T) { var zeroValue int64 w := &Workflow{ID: &zeroValue} w.GetID() w = &Workflow{} w.GetID() w = nil w.GetID() } func TestWorkflow_GetName(tt *testing.T) { var zeroValue string w := &Workflow{Name: &zeroValue} w.GetName() w = &Workflow{} w.GetName() w = nil w.GetName() } func TestWorkflow_GetNodeID(tt *testing.T) { var zeroValue string w := &Workflow{NodeID: &zeroValue} w.GetNodeID() w = &Workflow{} w.GetNodeID() w = nil w.GetNodeID() } func TestWorkflow_GetPath(tt *testing.T) { var zeroValue string w := &Workflow{Path: &zeroValue} w.GetPath() w = &Workflow{} w.GetPath() w = nil w.GetPath() } func TestWorkflow_GetState(tt *testing.T) { var zeroValue string w := &Workflow{State: &zeroValue} w.GetState() w = &Workflow{} w.GetState() w = nil w.GetState() } func TestWorkflow_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp w := &Workflow{UpdatedAt: &zeroValue} w.GetUpdatedAt() w = &Workflow{} w.GetUpdatedAt() w = nil w.GetUpdatedAt() } func TestWorkflow_GetURL(tt *testing.T) { var zeroValue string w := &Workflow{URL: &zeroValue} w.GetURL() w = &Workflow{} w.GetURL() w = nil w.GetURL() } func TestWorkflowBill_GetTotalMS(tt *testing.T) { var zeroValue int64 w := &WorkflowBill{TotalMS: &zeroValue} w.GetTotalMS() w = &WorkflowBill{} w.GetTotalMS() w = nil w.GetTotalMS() } func TestWorkflowDispatchEvent_GetOrg(tt *testing.T) { w := &WorkflowDispatchEvent{} w.GetOrg() w = nil w.GetOrg() } func TestWorkflowDispatchEvent_GetRef(tt *testing.T) { var zeroValue string w := &WorkflowDispatchEvent{Ref: &zeroValue} w.GetRef() w = &WorkflowDispatchEvent{} w.GetRef() w = nil w.GetRef() } func TestWorkflowDispatchEvent_GetRepo(tt *testing.T) { w := &WorkflowDispatchEvent{} w.GetRepo() w = nil w.GetRepo() } func TestWorkflowDispatchEvent_GetSender(tt *testing.T) { w := &WorkflowDispatchEvent{} w.GetSender() w = nil w.GetSender() } func TestWorkflowDispatchEvent_GetWorkflow(tt *testing.T) { var zeroValue string w := &WorkflowDispatchEvent{Workflow: &zeroValue} w.GetWorkflow() w = &WorkflowDispatchEvent{} w.GetWorkflow() w = nil w.GetWorkflow() } func TestWorkflowEnvironment_GetMacOS(tt *testing.T) { w := &WorkflowEnvironment{} w.GetMacOS() w = nil w.GetMacOS() } func TestWorkflowEnvironment_GetUbuntu(tt *testing.T) { w := &WorkflowEnvironment{} w.GetUbuntu() w = nil w.GetUbuntu() } func TestWorkflowEnvironment_GetWindows(tt *testing.T) { w := &WorkflowEnvironment{} w.GetWindows() w = nil w.GetWindows() } func TestWorkflowJob_GetCheckRunURL(tt *testing.T) { var zeroValue string w := &WorkflowJob{CheckRunURL: &zeroValue} w.GetCheckRunURL() w = &WorkflowJob{} w.GetCheckRunURL() w = nil w.GetCheckRunURL() } func TestWorkflowJob_GetCompletedAt(tt *testing.T) { var zeroValue Timestamp w := &WorkflowJob{CompletedAt: &zeroValue} w.GetCompletedAt() w = &WorkflowJob{} w.GetCompletedAt() w = nil w.GetCompletedAt() } func TestWorkflowJob_GetConclusion(tt *testing.T) { var zeroValue string w := &WorkflowJob{Conclusion: &zeroValue} w.GetConclusion() w = &WorkflowJob{} w.GetConclusion() w = nil w.GetConclusion() } func TestWorkflowJob_GetHeadSHA(tt *testing.T) { var zeroValue string w := &WorkflowJob{HeadSHA: &zeroValue} w.GetHeadSHA() w = &WorkflowJob{} w.GetHeadSHA() w = nil w.GetHeadSHA() } func TestWorkflowJob_GetHTMLURL(tt *testing.T) { var zeroValue string w := &WorkflowJob{HTMLURL: &zeroValue} w.GetHTMLURL() w = &WorkflowJob{} w.GetHTMLURL() w = nil w.GetHTMLURL() } func TestWorkflowJob_GetID(tt *testing.T) { var zeroValue int64 w := &WorkflowJob{ID: &zeroValue} w.GetID() w = &WorkflowJob{} w.GetID() w = nil w.GetID() } func TestWorkflowJob_GetName(tt *testing.T) { var zeroValue string w := &WorkflowJob{Name: &zeroValue} w.GetName() w = &WorkflowJob{} w.GetName() w = nil w.GetName() } func TestWorkflowJob_GetNodeID(tt *testing.T) { var zeroValue string w := &WorkflowJob{NodeID: &zeroValue} w.GetNodeID() w = &WorkflowJob{} w.GetNodeID() w = nil w.GetNodeID() } func TestWorkflowJob_GetRunID(tt *testing.T) { var zeroValue int64 w := &WorkflowJob{RunID: &zeroValue} w.GetRunID() w = &WorkflowJob{} w.GetRunID() w = nil w.GetRunID() } func TestWorkflowJob_GetRunURL(tt *testing.T) { var zeroValue string w := &WorkflowJob{RunURL: &zeroValue} w.GetRunURL() w = &WorkflowJob{} w.GetRunURL() w = nil w.GetRunURL() } func TestWorkflowJob_GetStartedAt(tt *testing.T) { var zeroValue Timestamp w := &WorkflowJob{StartedAt: &zeroValue} w.GetStartedAt() w = &WorkflowJob{} w.GetStartedAt() w = nil w.GetStartedAt() } func TestWorkflowJob_GetStatus(tt *testing.T) { var zeroValue string w := &WorkflowJob{Status: &zeroValue} w.GetStatus() w = &WorkflowJob{} w.GetStatus() w = nil w.GetStatus() } func TestWorkflowJob_GetURL(tt *testing.T) { var zeroValue string w := &WorkflowJob{URL: &zeroValue} w.GetURL() w = &WorkflowJob{} w.GetURL() w = nil w.GetURL() } func TestWorkflowRun_GetArtifactsURL(tt *testing.T) { var zeroValue string w := &WorkflowRun{ArtifactsURL: &zeroValue} w.GetArtifactsURL() w = &WorkflowRun{} w.GetArtifactsURL() w = nil w.GetArtifactsURL() } func TestWorkflowRun_GetCancelURL(tt *testing.T) { var zeroValue string w := &WorkflowRun{CancelURL: &zeroValue} w.GetCancelURL() w = &WorkflowRun{} w.GetCancelURL() w = nil w.GetCancelURL() } func TestWorkflowRun_GetCheckSuiteURL(tt *testing.T) { var zeroValue string w := &WorkflowRun{CheckSuiteURL: &zeroValue} w.GetCheckSuiteURL() w = &WorkflowRun{} w.GetCheckSuiteURL() w = nil w.GetCheckSuiteURL() } func TestWorkflowRun_GetConclusion(tt *testing.T) { var zeroValue string w := &WorkflowRun{Conclusion: &zeroValue} w.GetConclusion() w = &WorkflowRun{} w.GetConclusion() w = nil w.GetConclusion() } func TestWorkflowRun_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp w := &WorkflowRun{CreatedAt: &zeroValue} w.GetCreatedAt() w = &WorkflowRun{} w.GetCreatedAt() w = nil w.GetCreatedAt() } func TestWorkflowRun_GetEvent(tt *testing.T) { var zeroValue string w := &WorkflowRun{Event: &zeroValue} w.GetEvent() w = &WorkflowRun{} w.GetEvent() w = nil w.GetEvent() } func TestWorkflowRun_GetHeadBranch(tt *testing.T) { var zeroValue string w := &WorkflowRun{HeadBranch: &zeroValue} w.GetHeadBranch() w = &WorkflowRun{} w.GetHeadBranch() w = nil w.GetHeadBranch() } func TestWorkflowRun_GetHeadCommit(tt *testing.T) { w := &WorkflowRun{} w.GetHeadCommit() w = nil w.GetHeadCommit() } func TestWorkflowRun_GetHeadRepository(tt *testing.T) { w := &WorkflowRun{} w.GetHeadRepository() w = nil w.GetHeadRepository() } func TestWorkflowRun_GetHeadSHA(tt *testing.T) { var zeroValue string w := &WorkflowRun{HeadSHA: &zeroValue} w.GetHeadSHA() w = &WorkflowRun{} w.GetHeadSHA() w = nil w.GetHeadSHA() } func TestWorkflowRun_GetHTMLURL(tt *testing.T) { var zeroValue string w := &WorkflowRun{HTMLURL: &zeroValue} w.GetHTMLURL() w = &WorkflowRun{} w.GetHTMLURL() w = nil w.GetHTMLURL() } func TestWorkflowRun_GetID(tt *testing.T) { var zeroValue int64 w := &WorkflowRun{ID: &zeroValue} w.GetID() w = &WorkflowRun{} w.GetID() w = nil w.GetID() } func TestWorkflowRun_GetJobsURL(tt *testing.T) { var zeroValue string w := &WorkflowRun{JobsURL: &zeroValue} w.GetJobsURL() w = &WorkflowRun{} w.GetJobsURL() w = nil w.GetJobsURL() } func TestWorkflowRun_GetLogsURL(tt *testing.T) { var zeroValue string w := &WorkflowRun{LogsURL: &zeroValue} w.GetLogsURL() w = &WorkflowRun{} w.GetLogsURL() w = nil w.GetLogsURL() } func TestWorkflowRun_GetName(tt *testing.T) { var zeroValue string w := &WorkflowRun{Name: &zeroValue} w.GetName() w = &WorkflowRun{} w.GetName() w = nil w.GetName() } func TestWorkflowRun_GetNodeID(tt *testing.T) { var zeroValue string w := &WorkflowRun{NodeID: &zeroValue} w.GetNodeID() w = &WorkflowRun{} w.GetNodeID() w = nil w.GetNodeID() } func TestWorkflowRun_GetRepository(tt *testing.T) { w := &WorkflowRun{} w.GetRepository() w = nil w.GetRepository() } func TestWorkflowRun_GetRerunURL(tt *testing.T) { var zeroValue string w := &WorkflowRun{RerunURL: &zeroValue} w.GetRerunURL() w = &WorkflowRun{} w.GetRerunURL() w = nil w.GetRerunURL() } func TestWorkflowRun_GetRunNumber(tt *testing.T) { var zeroValue int w := &WorkflowRun{RunNumber: &zeroValue} w.GetRunNumber() w = &WorkflowRun{} w.GetRunNumber() w = nil w.GetRunNumber() } func TestWorkflowRun_GetStatus(tt *testing.T) { var zeroValue string w := &WorkflowRun{Status: &zeroValue} w.GetStatus() w = &WorkflowRun{} w.GetStatus() w = nil w.GetStatus() } func TestWorkflowRun_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp w := &WorkflowRun{UpdatedAt: &zeroValue} w.GetUpdatedAt() w = &WorkflowRun{} w.GetUpdatedAt() w = nil w.GetUpdatedAt() } func TestWorkflowRun_GetURL(tt *testing.T) { var zeroValue string w := &WorkflowRun{URL: &zeroValue} w.GetURL() w = &WorkflowRun{} w.GetURL() w = nil w.GetURL() } func TestWorkflowRun_GetWorkflowID(tt *testing.T) { var zeroValue int64 w := &WorkflowRun{WorkflowID: &zeroValue} w.GetWorkflowID() w = &WorkflowRun{} w.GetWorkflowID() w = nil w.GetWorkflowID() } func TestWorkflowRun_GetWorkflowURL(tt *testing.T) { var zeroValue string w := &WorkflowRun{WorkflowURL: &zeroValue} w.GetWorkflowURL() w = &WorkflowRun{} w.GetWorkflowURL() w = nil w.GetWorkflowURL() } func TestWorkflowRunBill_GetJobs(tt *testing.T) { var zeroValue int w := &WorkflowRunBill{Jobs: &zeroValue} w.GetJobs() w = &WorkflowRunBill{} w.GetJobs() w = nil w.GetJobs() } func TestWorkflowRunBill_GetTotalMS(tt *testing.T) { var zeroValue int64 w := &WorkflowRunBill{TotalMS: &zeroValue} w.GetTotalMS() w = &WorkflowRunBill{} w.GetTotalMS() w = nil w.GetTotalMS() } func TestWorkflowRunEnvironment_GetMacOS(tt *testing.T) { w := &WorkflowRunEnvironment{} w.GetMacOS() w = nil w.GetMacOS() } func TestWorkflowRunEnvironment_GetUbuntu(tt *testing.T) { w := &WorkflowRunEnvironment{} w.GetUbuntu() w = nil w.GetUbuntu() } func TestWorkflowRunEnvironment_GetWindows(tt *testing.T) { w := &WorkflowRunEnvironment{} w.GetWindows() w = nil w.GetWindows() } func TestWorkflowRunEvent_GetAction(tt *testing.T) { var zeroValue string w := &WorkflowRunEvent{Action: &zeroValue} w.GetAction() w = &WorkflowRunEvent{} w.GetAction() w = nil w.GetAction() } func TestWorkflowRunEvent_GetOrg(tt *testing.T) { w := &WorkflowRunEvent{} w.GetOrg() w = nil w.GetOrg() } func TestWorkflowRunEvent_GetRepo(tt *testing.T) { w := &WorkflowRunEvent{} w.GetRepo() w = nil w.GetRepo() } func TestWorkflowRunEvent_GetSender(tt *testing.T) { w := &WorkflowRunEvent{} w.GetSender() w = nil w.GetSender() } func TestWorkflowRunEvent_GetWorkflow(tt *testing.T) { w := &WorkflowRunEvent{} w.GetWorkflow() w = nil w.GetWorkflow() } func TestWorkflowRunEvent_GetWorkflowRun(tt *testing.T) { w := &WorkflowRunEvent{} w.GetWorkflowRun() w = nil w.GetWorkflowRun() } func TestWorkflowRuns_GetTotalCount(tt *testing.T) { var zeroValue int w := &WorkflowRuns{TotalCount: &zeroValue} w.GetTotalCount() w = &WorkflowRuns{} w.GetTotalCount() w = nil w.GetTotalCount() } func TestWorkflowRunUsage_GetBillable(tt *testing.T) { w := &WorkflowRunUsage{} w.GetBillable() w = nil w.GetBillable() } func TestWorkflowRunUsage_GetRunDurationMS(tt *testing.T) { var zeroValue int64 w := &WorkflowRunUsage{RunDurationMS: &zeroValue} w.GetRunDurationMS() w = &WorkflowRunUsage{} w.GetRunDurationMS() w = nil w.GetRunDurationMS() } func TestWorkflows_GetTotalCount(tt *testing.T) { var zeroValue int w := &Workflows{TotalCount: &zeroValue} w.GetTotalCount() w = &Workflows{} w.GetTotalCount() w = nil w.GetTotalCount() } func TestWorkflowUsage_GetBillable(tt *testing.T) { w := &WorkflowUsage{} w.GetBillable() w = nil w.GetBillable() } go-github-38.1.0/github/github-stringify_test.go000066400000000000000000002035071410475703100216470ustar00rootroot00000000000000// Copyright 2019 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. // Code generated by gen-stringify-tests; DO NOT EDIT. package github import ( "testing" ) func Float64(v float64) *float64 { return &v } func TestActionsAllowed_String(t *testing.T) { v := ActionsAllowed{ GithubOwnedAllowed: Bool(false), VerifiedAllowed: Bool(false), } want := `github.ActionsAllowed{GithubOwnedAllowed:false, VerifiedAllowed:false}` if got := v.String(); got != want { t.Errorf("ActionsAllowed.String = %v, want %v", got, want) } } func TestActionsPermissions_String(t *testing.T) { v := ActionsPermissions{ EnabledRepositories: String(""), AllowedActions: String(""), SelectedActionsURL: String(""), } want := `github.ActionsPermissions{EnabledRepositories:"", AllowedActions:"", SelectedActionsURL:""}` if got := v.String(); got != want { t.Errorf("ActionsPermissions.String = %v, want %v", got, want) } } func TestAdminStats_String(t *testing.T) { v := AdminStats{ Issues: &IssueStats{}, Hooks: &HookStats{}, Milestones: &MilestoneStats{}, Orgs: &OrgStats{}, Comments: &CommentStats{}, Pages: &PageStats{}, Users: &UserStats{}, Gists: &GistStats{}, Pulls: &PullStats{}, Repos: &RepoStats{}, } want := `github.AdminStats{Issues:github.IssueStats{}, Hooks:github.HookStats{}, Milestones:github.MilestoneStats{}, Orgs:github.OrgStats{}, Comments:github.CommentStats{}, Pages:github.PageStats{}, Users:github.UserStats{}, Gists:github.GistStats{}, Pulls:github.PullStats{}, Repos:github.RepoStats{}}` if got := v.String(); got != want { t.Errorf("AdminStats.String = %v, want %v", got, want) } } func TestAuthorization_String(t *testing.T) { v := Authorization{ ID: Int64(0), URL: String(""), Token: String(""), TokenLastEight: String(""), HashedToken: String(""), App: &AuthorizationApp{}, Note: String(""), NoteURL: String(""), UpdatedAt: &Timestamp{}, CreatedAt: &Timestamp{}, Fingerprint: String(""), User: &User{}, } want := `github.Authorization{ID:0, URL:"", Token:"", TokenLastEight:"", HashedToken:"", App:github.AuthorizationApp{}, Note:"", NoteURL:"", UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Fingerprint:"", User:github.User{}}` if got := v.String(); got != want { t.Errorf("Authorization.String = %v, want %v", got, want) } } func TestAuthorizationApp_String(t *testing.T) { v := AuthorizationApp{ URL: String(""), Name: String(""), ClientID: String(""), } want := `github.AuthorizationApp{URL:"", Name:"", ClientID:""}` if got := v.String(); got != want { t.Errorf("AuthorizationApp.String = %v, want %v", got, want) } } func TestAuthorizationRequest_String(t *testing.T) { v := AuthorizationRequest{ Note: String(""), NoteURL: String(""), ClientID: String(""), ClientSecret: String(""), Fingerprint: String(""), } want := `github.AuthorizationRequest{Note:"", NoteURL:"", ClientID:"", ClientSecret:"", Fingerprint:""}` if got := v.String(); got != want { t.Errorf("AuthorizationRequest.String = %v, want %v", got, want) } } func TestAuthorizationUpdateRequest_String(t *testing.T) { v := AuthorizationUpdateRequest{ Note: String(""), NoteURL: String(""), Fingerprint: String(""), } want := `github.AuthorizationUpdateRequest{Note:"", NoteURL:"", Fingerprint:""}` if got := v.String(); got != want { t.Errorf("AuthorizationUpdateRequest.String = %v, want %v", got, want) } } func TestCheckRun_String(t *testing.T) { v := CheckRun{ ID: Int64(0), NodeID: String(""), HeadSHA: String(""), ExternalID: String(""), URL: String(""), HTMLURL: String(""), DetailsURL: String(""), Status: String(""), Conclusion: String(""), StartedAt: &Timestamp{}, CompletedAt: &Timestamp{}, Output: &CheckRunOutput{}, Name: String(""), CheckSuite: &CheckSuite{}, App: &App{}, } want := `github.CheckRun{ID:0, NodeID:"", HeadSHA:"", ExternalID:"", URL:"", HTMLURL:"", DetailsURL:"", Status:"", Conclusion:"", StartedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, CompletedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Output:github.CheckRunOutput{}, Name:"", CheckSuite:github.CheckSuite{}, App:github.App{}}` if got := v.String(); got != want { t.Errorf("CheckRun.String = %v, want %v", got, want) } } func TestCheckSuite_String(t *testing.T) { v := CheckSuite{ ID: Int64(0), NodeID: String(""), HeadBranch: String(""), HeadSHA: String(""), URL: String(""), BeforeSHA: String(""), AfterSHA: String(""), Status: String(""), Conclusion: String(""), CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, App: &App{}, Repository: &Repository{}, HeadCommit: &Commit{}, } want := `github.CheckSuite{ID:0, NodeID:"", HeadBranch:"", HeadSHA:"", URL:"", BeforeSHA:"", AfterSHA:"", Status:"", Conclusion:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, App:github.App{}, Repository:github.Repository{}, HeadCommit:github.Commit{}}` if got := v.String(); got != want { t.Errorf("CheckSuite.String = %v, want %v", got, want) } } func TestCodeResult_String(t *testing.T) { v := CodeResult{ Name: String(""), Path: String(""), SHA: String(""), HTMLURL: String(""), Repository: &Repository{}, } want := `github.CodeResult{Name:"", Path:"", SHA:"", HTMLURL:"", Repository:github.Repository{}}` if got := v.String(); got != want { t.Errorf("CodeResult.String = %v, want %v", got, want) } } func TestCombinedStatus_String(t *testing.T) { v := CombinedStatus{ State: String(""), Name: String(""), SHA: String(""), TotalCount: Int(0), CommitURL: String(""), RepositoryURL: String(""), } want := `github.CombinedStatus{State:"", Name:"", SHA:"", TotalCount:0, CommitURL:"", RepositoryURL:""}` if got := v.String(); got != want { t.Errorf("CombinedStatus.String = %v, want %v", got, want) } } func TestCommentStats_String(t *testing.T) { v := CommentStats{ TotalCommitComments: Int(0), TotalGistComments: Int(0), TotalIssueComments: Int(0), TotalPullRequestComments: Int(0), } want := `github.CommentStats{TotalCommitComments:0, TotalGistComments:0, TotalIssueComments:0, TotalPullRequestComments:0}` if got := v.String(); got != want { t.Errorf("CommentStats.String = %v, want %v", got, want) } } func TestCommit_String(t *testing.T) { v := Commit{ SHA: String(""), Author: &CommitAuthor{}, Committer: &CommitAuthor{}, Message: String(""), Tree: &Tree{}, Stats: &CommitStats{}, HTMLURL: String(""), URL: String(""), Verification: &SignatureVerification{}, NodeID: String(""), CommentCount: Int(0), } want := `github.Commit{SHA:"", Author:github.CommitAuthor{}, Committer:github.CommitAuthor{}, Message:"", Tree:github.Tree{}, Stats:github.CommitStats{}, HTMLURL:"", URL:"", Verification:github.SignatureVerification{}, NodeID:"", CommentCount:0}` if got := v.String(); got != want { t.Errorf("Commit.String = %v, want %v", got, want) } } func TestCommitAuthor_String(t *testing.T) { v := CommitAuthor{ Name: String(""), Email: String(""), Login: String(""), } want := `github.CommitAuthor{Name:"", Email:"", Login:""}` if got := v.String(); got != want { t.Errorf("CommitAuthor.String = %v, want %v", got, want) } } func TestCommitFile_String(t *testing.T) { v := CommitFile{ SHA: String(""), Filename: String(""), Additions: Int(0), Deletions: Int(0), Changes: Int(0), Status: String(""), Patch: String(""), BlobURL: String(""), RawURL: String(""), ContentsURL: String(""), PreviousFilename: String(""), } want := `github.CommitFile{SHA:"", Filename:"", Additions:0, Deletions:0, Changes:0, Status:"", Patch:"", BlobURL:"", RawURL:"", ContentsURL:"", PreviousFilename:""}` if got := v.String(); got != want { t.Errorf("CommitFile.String = %v, want %v", got, want) } } func TestCommitStats_String(t *testing.T) { v := CommitStats{ Additions: Int(0), Deletions: Int(0), Total: Int(0), } want := `github.CommitStats{Additions:0, Deletions:0, Total:0}` if got := v.String(); got != want { t.Errorf("CommitStats.String = %v, want %v", got, want) } } func TestCommitsComparison_String(t *testing.T) { v := CommitsComparison{ BaseCommit: &RepositoryCommit{}, MergeBaseCommit: &RepositoryCommit{}, Status: String(""), AheadBy: Int(0), BehindBy: Int(0), TotalCommits: Int(0), HTMLURL: String(""), PermalinkURL: String(""), DiffURL: String(""), PatchURL: String(""), URL: String(""), } want := `github.CommitsComparison{BaseCommit:github.RepositoryCommit{}, MergeBaseCommit:github.RepositoryCommit{}, Status:"", AheadBy:0, BehindBy:0, TotalCommits:0, HTMLURL:"", PermalinkURL:"", DiffURL:"", PatchURL:"", URL:""}` if got := v.String(); got != want { t.Errorf("CommitsComparison.String = %v, want %v", got, want) } } func TestContributorStats_String(t *testing.T) { v := ContributorStats{ Author: &Contributor{}, Total: Int(0), } want := `github.ContributorStats{Author:github.Contributor{}, Total:0}` if got := v.String(); got != want { t.Errorf("ContributorStats.String = %v, want %v", got, want) } } func TestDiscussionComment_String(t *testing.T) { v := DiscussionComment{ Author: &User{}, Body: String(""), BodyHTML: String(""), BodyVersion: String(""), CreatedAt: &Timestamp{}, LastEditedAt: &Timestamp{}, DiscussionURL: String(""), HTMLURL: String(""), NodeID: String(""), Number: Int(0), UpdatedAt: &Timestamp{}, URL: String(""), Reactions: &Reactions{}, } want := `github.DiscussionComment{Author:github.User{}, Body:"", BodyHTML:"", BodyVersion:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, LastEditedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, DiscussionURL:"", HTMLURL:"", NodeID:"", Number:0, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, URL:"", Reactions:github.Reactions{}}` if got := v.String(); got != want { t.Errorf("DiscussionComment.String = %v, want %v", got, want) } } func TestDraftReviewComment_String(t *testing.T) { v := DraftReviewComment{ Path: String(""), Position: Int(0), Body: String(""), StartSide: String(""), Side: String(""), StartLine: Int(0), Line: Int(0), } want := `github.DraftReviewComment{Path:"", Position:0, Body:"", StartSide:"", Side:"", StartLine:0, Line:0}` if got := v.String(); got != want { t.Errorf("DraftReviewComment.String = %v, want %v", got, want) } } func TestEnterprise_String(t *testing.T) { v := Enterprise{ ID: Int(0), Slug: String(""), Name: String(""), NodeID: String(""), AvatarURL: String(""), Description: String(""), WebsiteURL: String(""), HTMLURL: String(""), CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, } want := `github.Enterprise{ID:0, Slug:"", Name:"", NodeID:"", AvatarURL:"", Description:"", WebsiteURL:"", HTMLURL:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}` if got := v.String(); got != want { t.Errorf("Enterprise.String = %v, want %v", got, want) } } func TestEvent_String(t *testing.T) { v := Event{ Type: String(""), Public: Bool(false), Repo: &Repository{}, Actor: &User{}, Org: &Organization{}, ID: String(""), } want := `github.Event{Type:"", Public:false, Repo:github.Repository{}, Actor:github.User{}, Org:github.Organization{}, ID:""}` if got := v.String(); got != want { t.Errorf("Event.String = %v, want %v", got, want) } } func TestGPGKey_String(t *testing.T) { v := GPGKey{ ID: Int64(0), PrimaryKeyID: Int64(0), KeyID: String(""), PublicKey: String(""), CanSign: Bool(false), CanEncryptComms: Bool(false), CanEncryptStorage: Bool(false), CanCertify: Bool(false), } want := `github.GPGKey{ID:0, PrimaryKeyID:0, KeyID:"", PublicKey:"", CanSign:false, CanEncryptComms:false, CanEncryptStorage:false, CanCertify:false}` if got := v.String(); got != want { t.Errorf("GPGKey.String = %v, want %v", got, want) } } func TestGist_String(t *testing.T) { v := Gist{ ID: String(""), Description: String(""), Public: Bool(false), Owner: &User{}, Comments: Int(0), HTMLURL: String(""), GitPullURL: String(""), GitPushURL: String(""), NodeID: String(""), } want := `github.Gist{ID:"", Description:"", Public:false, Owner:github.User{}, Comments:0, HTMLURL:"", GitPullURL:"", GitPushURL:"", NodeID:""}` if got := v.String(); got != want { t.Errorf("Gist.String = %v, want %v", got, want) } } func TestGistComment_String(t *testing.T) { v := GistComment{ ID: Int64(0), URL: String(""), Body: String(""), User: &User{}, } want := `github.GistComment{ID:0, URL:"", Body:"", User:github.User{}}` if got := v.String(); got != want { t.Errorf("GistComment.String = %v, want %v", got, want) } } func TestGistCommit_String(t *testing.T) { v := GistCommit{ URL: String(""), Version: String(""), User: &User{}, ChangeStatus: &CommitStats{}, CommittedAt: &Timestamp{}, NodeID: String(""), } want := `github.GistCommit{URL:"", Version:"", User:github.User{}, ChangeStatus:github.CommitStats{}, CommittedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, NodeID:""}` if got := v.String(); got != want { t.Errorf("GistCommit.String = %v, want %v", got, want) } } func TestGistFile_String(t *testing.T) { v := GistFile{ Size: Int(0), Filename: String(""), Language: String(""), Type: String(""), RawURL: String(""), Content: String(""), } want := `github.GistFile{Size:0, Filename:"", Language:"", Type:"", RawURL:"", Content:""}` if got := v.String(); got != want { t.Errorf("GistFile.String = %v, want %v", got, want) } } func TestGistFork_String(t *testing.T) { v := GistFork{ URL: String(""), User: &User{}, ID: String(""), CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, NodeID: String(""), } want := `github.GistFork{URL:"", User:github.User{}, ID:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, NodeID:""}` if got := v.String(); got != want { t.Errorf("GistFork.String = %v, want %v", got, want) } } func TestGistStats_String(t *testing.T) { v := GistStats{ TotalGists: Int(0), PrivateGists: Int(0), PublicGists: Int(0), } want := `github.GistStats{TotalGists:0, PrivateGists:0, PublicGists:0}` if got := v.String(); got != want { t.Errorf("GistStats.String = %v, want %v", got, want) } } func TestGitObject_String(t *testing.T) { v := GitObject{ Type: String(""), SHA: String(""), URL: String(""), } want := `github.GitObject{Type:"", SHA:"", URL:""}` if got := v.String(); got != want { t.Errorf("GitObject.String = %v, want %v", got, want) } } func TestGitignore_String(t *testing.T) { v := Gitignore{ Name: String(""), Source: String(""), } want := `github.Gitignore{Name:"", Source:""}` if got := v.String(); got != want { t.Errorf("Gitignore.String = %v, want %v", got, want) } } func TestGrant_String(t *testing.T) { v := Grant{ ID: Int64(0), URL: String(""), App: &AuthorizationApp{}, CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, } want := `github.Grant{ID:0, URL:"", App:github.AuthorizationApp{}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}` if got := v.String(); got != want { t.Errorf("Grant.String = %v, want %v", got, want) } } func TestHeadCommit_String(t *testing.T) { v := HeadCommit{ Message: String(""), Author: &CommitAuthor{}, URL: String(""), Distinct: Bool(false), SHA: String(""), ID: String(""), TreeID: String(""), Timestamp: &Timestamp{}, Committer: &CommitAuthor{}, } want := `github.HeadCommit{Message:"", Author:github.CommitAuthor{}, URL:"", Distinct:false, SHA:"", ID:"", TreeID:"", Timestamp:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Committer:github.CommitAuthor{}}` if got := v.String(); got != want { t.Errorf("HeadCommit.String = %v, want %v", got, want) } } func TestHook_String(t *testing.T) { v := Hook{ URL: String(""), ID: Int64(0), Type: String(""), Name: String(""), TestURL: String(""), PingURL: String(""), Active: Bool(false), } want := `github.Hook{URL:"", ID:0, Type:"", Name:"", TestURL:"", PingURL:"", Active:false}` if got := v.String(); got != want { t.Errorf("Hook.String = %v, want %v", got, want) } } func TestHookDelivery_String(t *testing.T) { v := HookDelivery{ ID: Int64(0), GUID: String(""), DeliveredAt: &Timestamp{}, Redelivery: Bool(false), Duration: Float64(0.0), Status: String(""), StatusCode: Int(0), Event: String(""), Action: String(""), InstallationID: String(""), RepositoryID: Int64(0), Request: &HookRequest{}, Response: &HookResponse{}, } want := `github.HookDelivery{ID:0, GUID:"", DeliveredAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Redelivery:false, Duration:0, Status:"", StatusCode:0, Event:"", Action:"", InstallationID:"", RepositoryID:0, Request:github.HookRequest{}, Response:github.HookResponse{}}` if got := v.String(); got != want { t.Errorf("HookDelivery.String = %v, want %v", got, want) } } func TestHookStats_String(t *testing.T) { v := HookStats{ TotalHooks: Int(0), ActiveHooks: Int(0), InactiveHooks: Int(0), } want := `github.HookStats{TotalHooks:0, ActiveHooks:0, InactiveHooks:0}` if got := v.String(); got != want { t.Errorf("HookStats.String = %v, want %v", got, want) } } func TestImport_String(t *testing.T) { v := Import{ VCSURL: String(""), VCS: String(""), VCSUsername: String(""), VCSPassword: String(""), TFVCProject: String(""), UseLFS: String(""), HasLargeFiles: Bool(false), LargeFilesSize: Int(0), LargeFilesCount: Int(0), Status: String(""), CommitCount: Int(0), StatusText: String(""), AuthorsCount: Int(0), Percent: Int(0), PushPercent: Int(0), URL: String(""), HTMLURL: String(""), AuthorsURL: String(""), RepositoryURL: String(""), Message: String(""), FailedStep: String(""), HumanName: String(""), } want := `github.Import{VCSURL:"", VCS:"", VCSUsername:"", VCSPassword:"", TFVCProject:"", UseLFS:"", HasLargeFiles:false, LargeFilesSize:0, LargeFilesCount:0, Status:"", CommitCount:0, StatusText:"", AuthorsCount:0, Percent:0, PushPercent:0, URL:"", HTMLURL:"", AuthorsURL:"", RepositoryURL:"", Message:"", FailedStep:"", HumanName:""}` if got := v.String(); got != want { t.Errorf("Import.String = %v, want %v", got, want) } } func TestInstallation_String(t *testing.T) { v := Installation{ ID: Int64(0), NodeID: String(""), AppID: Int64(0), AppSlug: String(""), TargetID: Int64(0), Account: &User{}, AccessTokensURL: String(""), RepositoriesURL: String(""), HTMLURL: String(""), TargetType: String(""), SingleFileName: String(""), RepositorySelection: String(""), Permissions: &InstallationPermissions{}, CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, HasMultipleSingleFiles: Bool(false), SuspendedBy: &User{}, SuspendedAt: &Timestamp{}, } want := `github.Installation{ID:0, NodeID:"", AppID:0, AppSlug:"", TargetID:0, Account:github.User{}, AccessTokensURL:"", RepositoriesURL:"", HTMLURL:"", TargetType:"", SingleFileName:"", RepositorySelection:"", Permissions:github.InstallationPermissions{}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, HasMultipleSingleFiles:false, SuspendedBy:github.User{}, SuspendedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}` if got := v.String(); got != want { t.Errorf("Installation.String = %v, want %v", got, want) } } func TestInvitation_String(t *testing.T) { v := Invitation{ ID: Int64(0), NodeID: String(""), Login: String(""), Email: String(""), Role: String(""), Inviter: &User{}, TeamCount: Int(0), InvitationTeamURL: String(""), FailedAt: &Timestamp{}, FailedReason: String(""), } want := `github.Invitation{ID:0, NodeID:"", Login:"", Email:"", Role:"", Inviter:github.User{}, TeamCount:0, InvitationTeamURL:"", FailedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, FailedReason:""}` if got := v.String(); got != want { t.Errorf("Invitation.String = %v, want %v", got, want) } } func TestIssue_String(t *testing.T) { v := Issue{ ID: Int64(0), Number: Int(0), State: String(""), Locked: Bool(false), Title: String(""), Body: String(""), AuthorAssociation: String(""), User: &User{}, Assignee: &User{}, Comments: Int(0), ClosedBy: &User{}, URL: String(""), HTMLURL: String(""), CommentsURL: String(""), EventsURL: String(""), LabelsURL: String(""), RepositoryURL: String(""), Milestone: &Milestone{}, PullRequestLinks: &PullRequestLinks{}, Repository: &Repository{}, Reactions: &Reactions{}, NodeID: String(""), ActiveLockReason: String(""), } want := `github.Issue{ID:0, Number:0, State:"", Locked:false, Title:"", Body:"", AuthorAssociation:"", User:github.User{}, Assignee:github.User{}, Comments:0, ClosedBy:github.User{}, URL:"", HTMLURL:"", CommentsURL:"", EventsURL:"", LabelsURL:"", RepositoryURL:"", Milestone:github.Milestone{}, PullRequestLinks:github.PullRequestLinks{}, Repository:github.Repository{}, Reactions:github.Reactions{}, NodeID:"", ActiveLockReason:""}` if got := v.String(); got != want { t.Errorf("Issue.String = %v, want %v", got, want) } } func TestIssueComment_String(t *testing.T) { v := IssueComment{ ID: Int64(0), NodeID: String(""), Body: String(""), User: &User{}, Reactions: &Reactions{}, AuthorAssociation: String(""), URL: String(""), HTMLURL: String(""), IssueURL: String(""), } want := `github.IssueComment{ID:0, NodeID:"", Body:"", User:github.User{}, Reactions:github.Reactions{}, AuthorAssociation:"", URL:"", HTMLURL:"", IssueURL:""}` if got := v.String(); got != want { t.Errorf("IssueComment.String = %v, want %v", got, want) } } func TestIssueStats_String(t *testing.T) { v := IssueStats{ TotalIssues: Int(0), OpenIssues: Int(0), ClosedIssues: Int(0), } want := `github.IssueStats{TotalIssues:0, OpenIssues:0, ClosedIssues:0}` if got := v.String(); got != want { t.Errorf("IssueStats.String = %v, want %v", got, want) } } func TestKey_String(t *testing.T) { v := Key{ ID: Int64(0), Key: String(""), URL: String(""), Title: String(""), ReadOnly: Bool(false), Verified: Bool(false), CreatedAt: &Timestamp{}, } want := `github.Key{ID:0, Key:"", URL:"", Title:"", ReadOnly:false, Verified:false, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}` if got := v.String(); got != want { t.Errorf("Key.String = %v, want %v", got, want) } } func TestLabel_String(t *testing.T) { v := Label{ ID: Int64(0), URL: String(""), Name: String(""), Color: String(""), Description: String(""), Default: Bool(false), NodeID: String(""), } want := `github.Label{ID:0, URL:"", Name:"", Color:"", Description:"", Default:false, NodeID:""}` if got := v.String(); got != want { t.Errorf("Label.String = %v, want %v", got, want) } } func TestLabelResult_String(t *testing.T) { v := LabelResult{ ID: Int64(0), URL: String(""), Name: String(""), Color: String(""), Default: Bool(false), Description: String(""), Score: Float64(0.0), } want := `github.LabelResult{ID:0, URL:"", Name:"", Color:"", Default:false, Description:"", Score:0}` if got := v.String(); got != want { t.Errorf("LabelResult.String = %v, want %v", got, want) } } func TestLargeFile_String(t *testing.T) { v := LargeFile{ RefName: String(""), Path: String(""), OID: String(""), Size: Int(0), } want := `github.LargeFile{RefName:"", Path:"", OID:"", Size:0}` if got := v.String(); got != want { t.Errorf("LargeFile.String = %v, want %v", got, want) } } func TestLicense_String(t *testing.T) { v := License{ Key: String(""), Name: String(""), URL: String(""), SPDXID: String(""), HTMLURL: String(""), Featured: Bool(false), Description: String(""), Implementation: String(""), Body: String(""), } want := `github.License{Key:"", Name:"", URL:"", SPDXID:"", HTMLURL:"", Featured:false, Description:"", Implementation:"", Body:""}` if got := v.String(); got != want { t.Errorf("License.String = %v, want %v", got, want) } } func TestMembership_String(t *testing.T) { v := Membership{ URL: String(""), State: String(""), Role: String(""), OrganizationURL: String(""), Organization: &Organization{}, User: &User{}, } want := `github.Membership{URL:"", State:"", Role:"", OrganizationURL:"", Organization:github.Organization{}, User:github.User{}}` if got := v.String(); got != want { t.Errorf("Membership.String = %v, want %v", got, want) } } func TestMigration_String(t *testing.T) { v := Migration{ ID: Int64(0), GUID: String(""), State: String(""), LockRepositories: Bool(false), ExcludeAttachments: Bool(false), URL: String(""), CreatedAt: String(""), UpdatedAt: String(""), } want := `github.Migration{ID:0, GUID:"", State:"", LockRepositories:false, ExcludeAttachments:false, URL:"", CreatedAt:"", UpdatedAt:""}` if got := v.String(); got != want { t.Errorf("Migration.String = %v, want %v", got, want) } } func TestMilestone_String(t *testing.T) { v := Milestone{ URL: String(""), HTMLURL: String(""), LabelsURL: String(""), ID: Int64(0), Number: Int(0), State: String(""), Title: String(""), Description: String(""), Creator: &User{}, OpenIssues: Int(0), ClosedIssues: Int(0), NodeID: String(""), } want := `github.Milestone{URL:"", HTMLURL:"", LabelsURL:"", ID:0, Number:0, State:"", Title:"", Description:"", Creator:github.User{}, OpenIssues:0, ClosedIssues:0, NodeID:""}` if got := v.String(); got != want { t.Errorf("Milestone.String = %v, want %v", got, want) } } func TestMilestoneStats_String(t *testing.T) { v := MilestoneStats{ TotalMilestones: Int(0), OpenMilestones: Int(0), ClosedMilestones: Int(0), } want := `github.MilestoneStats{TotalMilestones:0, OpenMilestones:0, ClosedMilestones:0}` if got := v.String(); got != want { t.Errorf("MilestoneStats.String = %v, want %v", got, want) } } func TestNewTeam_String(t *testing.T) { v := NewTeam{ Name: "", Description: String(""), ParentTeamID: Int64(0), Permission: String(""), Privacy: String(""), LDAPDN: String(""), } want := `github.NewTeam{Name:"", Description:"", ParentTeamID:0, Permission:"", Privacy:"", LDAPDN:""}` if got := v.String(); got != want { t.Errorf("NewTeam.String = %v, want %v", got, want) } } func TestOAuthAPP_String(t *testing.T) { v := OAuthAPP{ URL: String(""), Name: String(""), ClientID: String(""), } want := `github.OAuthAPP{URL:"", Name:"", ClientID:""}` if got := v.String(); got != want { t.Errorf("OAuthAPP.String = %v, want %v", got, want) } } func TestOrgStats_String(t *testing.T) { v := OrgStats{ TotalOrgs: Int(0), DisabledOrgs: Int(0), TotalTeams: Int(0), TotalTeamMembers: Int(0), } want := `github.OrgStats{TotalOrgs:0, DisabledOrgs:0, TotalTeams:0, TotalTeamMembers:0}` if got := v.String(); got != want { t.Errorf("OrgStats.String = %v, want %v", got, want) } } func TestOrganization_String(t *testing.T) { v := Organization{ Login: String(""), ID: Int64(0), NodeID: String(""), AvatarURL: String(""), HTMLURL: String(""), Name: String(""), Company: String(""), Blog: String(""), Location: String(""), Email: String(""), TwitterUsername: String(""), Description: String(""), PublicRepos: Int(0), PublicGists: Int(0), Followers: Int(0), Following: Int(0), TotalPrivateRepos: Int(0), OwnedPrivateRepos: Int(0), PrivateGists: Int(0), DiskUsage: Int(0), Collaborators: Int(0), BillingEmail: String(""), Type: String(""), Plan: &Plan{}, TwoFactorRequirementEnabled: Bool(false), IsVerified: Bool(false), HasOrganizationProjects: Bool(false), HasRepositoryProjects: Bool(false), DefaultRepoPermission: String(""), DefaultRepoSettings: String(""), MembersCanCreateRepos: Bool(false), MembersCanCreatePublicRepos: Bool(false), MembersCanCreatePrivateRepos: Bool(false), MembersCanCreateInternalRepos: Bool(false), MembersAllowedRepositoryCreationType: String(""), MembersCanCreatePages: Bool(false), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(false), URL: String(""), EventsURL: String(""), HooksURL: String(""), IssuesURL: String(""), MembersURL: String(""), PublicMembersURL: String(""), ReposURL: String(""), } want := `github.Organization{Login:"", ID:0, NodeID:"", AvatarURL:"", HTMLURL:"", Name:"", Company:"", Blog:"", Location:"", Email:"", TwitterUsername:"", Description:"", PublicRepos:0, PublicGists:0, Followers:0, Following:0, TotalPrivateRepos:0, OwnedPrivateRepos:0, PrivateGists:0, DiskUsage:0, Collaborators:0, BillingEmail:"", Type:"", Plan:github.Plan{}, TwoFactorRequirementEnabled:false, IsVerified:false, HasOrganizationProjects:false, HasRepositoryProjects:false, DefaultRepoPermission:"", DefaultRepoSettings:"", MembersCanCreateRepos:false, MembersCanCreatePublicRepos:false, MembersCanCreatePrivateRepos:false, MembersCanCreateInternalRepos:false, MembersAllowedRepositoryCreationType:"", MembersCanCreatePages:false, MembersCanCreatePublicPages:false, MembersCanCreatePrivatePages:false, URL:"", EventsURL:"", HooksURL:"", IssuesURL:"", MembersURL:"", PublicMembersURL:"", ReposURL:""}` if got := v.String(); got != want { t.Errorf("Organization.String = %v, want %v", got, want) } } func TestPackage_String(t *testing.T) { v := Package{ ID: Int64(0), Name: String(""), PackageType: String(""), HTMLURL: String(""), CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, Owner: &User{}, PackageVersion: &PackageVersion{}, Registry: &PackageRegistry{}, } want := `github.Package{ID:0, Name:"", PackageType:"", HTMLURL:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Owner:github.User{}, PackageVersion:github.PackageVersion{}, Registry:github.PackageRegistry{}}` if got := v.String(); got != want { t.Errorf("Package.String = %v, want %v", got, want) } } func TestPackageFile_String(t *testing.T) { v := PackageFile{ DownloadURL: String(""), ID: Int64(0), Name: String(""), SHA256: String(""), SHA1: String(""), MD5: String(""), ContentType: String(""), State: String(""), Author: &User{}, Size: Int64(0), CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, } want := `github.PackageFile{DownloadURL:"", ID:0, Name:"", SHA256:"", SHA1:"", MD5:"", ContentType:"", State:"", Author:github.User{}, Size:0, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}` if got := v.String(); got != want { t.Errorf("PackageFile.String = %v, want %v", got, want) } } func TestPackageRegistry_String(t *testing.T) { v := PackageRegistry{ AboutURL: String(""), Name: String(""), Type: String(""), URL: String(""), Vendor: String(""), } want := `github.PackageRegistry{AboutURL:"", Name:"", Type:"", URL:"", Vendor:""}` if got := v.String(); got != want { t.Errorf("PackageRegistry.String = %v, want %v", got, want) } } func TestPackageRelease_String(t *testing.T) { v := PackageRelease{ URL: String(""), HTMLURL: String(""), ID: Int64(0), TagName: String(""), TargetCommitish: String(""), Name: String(""), Draft: Bool(false), Author: &User{}, Prerelease: Bool(false), CreatedAt: &Timestamp{}, PublishedAt: &Timestamp{}, } want := `github.PackageRelease{URL:"", HTMLURL:"", ID:0, TagName:"", TargetCommitish:"", Name:"", Draft:false, Author:github.User{}, Prerelease:false, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, PublishedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}` if got := v.String(); got != want { t.Errorf("PackageRelease.String = %v, want %v", got, want) } } func TestPackageVersion_String(t *testing.T) { v := PackageVersion{ ID: Int64(0), Version: String(""), Summary: String(""), Body: String(""), BodyHTML: String(""), Release: &PackageRelease{}, Manifest: String(""), HTMLURL: String(""), TagName: String(""), TargetCommitish: String(""), TargetOID: String(""), Draft: Bool(false), Prerelease: Bool(false), CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, Author: &User{}, InstallationCommand: String(""), } want := `github.PackageVersion{ID:0, Version:"", Summary:"", Body:"", BodyHTML:"", Release:github.PackageRelease{}, Manifest:"", HTMLURL:"", TagName:"", TargetCommitish:"", TargetOID:"", Draft:false, Prerelease:false, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Author:github.User{}, InstallationCommand:""}` if got := v.String(); got != want { t.Errorf("PackageVersion.String = %v, want %v", got, want) } } func TestPageStats_String(t *testing.T) { v := PageStats{ TotalPages: Int(0), } want := `github.PageStats{TotalPages:0}` if got := v.String(); got != want { t.Errorf("PageStats.String = %v, want %v", got, want) } } func TestPlan_String(t *testing.T) { v := Plan{ Name: String(""), Space: Int(0), Collaborators: Int(0), PrivateRepos: Int(0), FilledSeats: Int(0), Seats: Int(0), } want := `github.Plan{Name:"", Space:0, Collaborators:0, PrivateRepos:0, FilledSeats:0, Seats:0}` if got := v.String(); got != want { t.Errorf("Plan.String = %v, want %v", got, want) } } func TestPreReceiveHook_String(t *testing.T) { v := PreReceiveHook{ ID: Int64(0), Name: String(""), Enforcement: String(""), ConfigURL: String(""), } want := `github.PreReceiveHook{ID:0, Name:"", Enforcement:"", ConfigURL:""}` if got := v.String(); got != want { t.Errorf("PreReceiveHook.String = %v, want %v", got, want) } } func TestProject_String(t *testing.T) { v := Project{ ID: Int64(0), URL: String(""), HTMLURL: String(""), ColumnsURL: String(""), OwnerURL: String(""), Name: String(""), Body: String(""), Number: Int(0), State: String(""), CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, NodeID: String(""), Creator: &User{}, } want := `github.Project{ID:0, URL:"", HTMLURL:"", ColumnsURL:"", OwnerURL:"", Name:"", Body:"", Number:0, State:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, NodeID:"", Creator:github.User{}}` if got := v.String(); got != want { t.Errorf("Project.String = %v, want %v", got, want) } } func TestPullRequest_String(t *testing.T) { v := PullRequest{ ID: Int64(0), Number: Int(0), State: String(""), Locked: Bool(false), Title: String(""), Body: String(""), User: &User{}, Draft: Bool(false), Merged: Bool(false), Mergeable: Bool(false), MergeableState: String(""), MergedBy: &User{}, MergeCommitSHA: String(""), Rebaseable: Bool(false), Comments: Int(0), Commits: Int(0), Additions: Int(0), Deletions: Int(0), ChangedFiles: Int(0), URL: String(""), HTMLURL: String(""), IssueURL: String(""), StatusesURL: String(""), DiffURL: String(""), PatchURL: String(""), CommitsURL: String(""), CommentsURL: String(""), ReviewCommentsURL: String(""), ReviewCommentURL: String(""), ReviewComments: Int(0), Assignee: &User{}, Milestone: &Milestone{}, MaintainerCanModify: Bool(false), AuthorAssociation: String(""), NodeID: String(""), AutoMerge: &PullRequestAutoMerge{}, Links: &PRLinks{}, Head: &PullRequestBranch{}, Base: &PullRequestBranch{}, ActiveLockReason: String(""), } want := `github.PullRequest{ID:0, Number:0, State:"", Locked:false, Title:"", Body:"", User:github.User{}, Draft:false, Merged:false, Mergeable:false, MergeableState:"", MergedBy:github.User{}, MergeCommitSHA:"", Rebaseable:false, Comments:0, Commits:0, Additions:0, Deletions:0, ChangedFiles:0, URL:"", HTMLURL:"", IssueURL:"", StatusesURL:"", DiffURL:"", PatchURL:"", CommitsURL:"", CommentsURL:"", ReviewCommentsURL:"", ReviewCommentURL:"", ReviewComments:0, Assignee:github.User{}, Milestone:github.Milestone{}, MaintainerCanModify:false, AuthorAssociation:"", NodeID:"", AutoMerge:github.PullRequestAutoMerge{}, Links:github.PRLinks{}, Head:github.PullRequestBranch{}, Base:github.PullRequestBranch{}, ActiveLockReason:""}` if got := v.String(); got != want { t.Errorf("PullRequest.String = %v, want %v", got, want) } } func TestPullRequestComment_String(t *testing.T) { v := PullRequestComment{ ID: Int64(0), NodeID: String(""), InReplyTo: Int64(0), Body: String(""), Path: String(""), DiffHunk: String(""), PullRequestReviewID: Int64(0), Position: Int(0), OriginalPosition: Int(0), StartLine: Int(0), Line: Int(0), OriginalLine: Int(0), OriginalStartLine: Int(0), Side: String(""), StartSide: String(""), CommitID: String(""), OriginalCommitID: String(""), User: &User{}, Reactions: &Reactions{}, AuthorAssociation: String(""), URL: String(""), HTMLURL: String(""), PullRequestURL: String(""), } want := `github.PullRequestComment{ID:0, NodeID:"", InReplyTo:0, Body:"", Path:"", DiffHunk:"", PullRequestReviewID:0, Position:0, OriginalPosition:0, StartLine:0, Line:0, OriginalLine:0, OriginalStartLine:0, Side:"", StartSide:"", CommitID:"", OriginalCommitID:"", User:github.User{}, Reactions:github.Reactions{}, AuthorAssociation:"", URL:"", HTMLURL:"", PullRequestURL:""}` if got := v.String(); got != want { t.Errorf("PullRequestComment.String = %v, want %v", got, want) } } func TestPullRequestReview_String(t *testing.T) { v := PullRequestReview{ ID: Int64(0), NodeID: String(""), User: &User{}, Body: String(""), CommitID: String(""), HTMLURL: String(""), PullRequestURL: String(""), State: String(""), AuthorAssociation: String(""), } want := `github.PullRequestReview{ID:0, NodeID:"", User:github.User{}, Body:"", CommitID:"", HTMLURL:"", PullRequestURL:"", State:"", AuthorAssociation:""}` if got := v.String(); got != want { t.Errorf("PullRequestReview.String = %v, want %v", got, want) } } func TestPullRequestReviewDismissalRequest_String(t *testing.T) { v := PullRequestReviewDismissalRequest{ Message: String(""), } want := `github.PullRequestReviewDismissalRequest{Message:""}` if got := v.String(); got != want { t.Errorf("PullRequestReviewDismissalRequest.String = %v, want %v", got, want) } } func TestPullRequestReviewRequest_String(t *testing.T) { v := PullRequestReviewRequest{ NodeID: String(""), CommitID: String(""), Body: String(""), Event: String(""), } want := `github.PullRequestReviewRequest{NodeID:"", CommitID:"", Body:"", Event:""}` if got := v.String(); got != want { t.Errorf("PullRequestReviewRequest.String = %v, want %v", got, want) } } func TestPullStats_String(t *testing.T) { v := PullStats{ TotalPulls: Int(0), MergedPulls: Int(0), MergablePulls: Int(0), UnmergablePulls: Int(0), } want := `github.PullStats{TotalPulls:0, MergedPulls:0, MergablePulls:0, UnmergablePulls:0}` if got := v.String(); got != want { t.Errorf("PullStats.String = %v, want %v", got, want) } } func TestPushEvent_String(t *testing.T) { v := PushEvent{ PushID: Int64(0), Head: String(""), Ref: String(""), Size: Int(0), Before: String(""), DistinctSize: Int(0), After: String(""), Created: Bool(false), Deleted: Bool(false), Forced: Bool(false), BaseRef: String(""), Compare: String(""), Repo: &PushEventRepository{}, HeadCommit: &HeadCommit{}, Pusher: &User{}, Sender: &User{}, Installation: &Installation{}, } want := `github.PushEvent{PushID:0, Head:"", Ref:"", Size:0, Before:"", DistinctSize:0, After:"", Created:false, Deleted:false, Forced:false, BaseRef:"", Compare:"", Repo:github.PushEventRepository{}, HeadCommit:github.HeadCommit{}, Pusher:github.User{}, Sender:github.User{}, Installation:github.Installation{}}` if got := v.String(); got != want { t.Errorf("PushEvent.String = %v, want %v", got, want) } } func TestRate_String(t *testing.T) { v := Rate{ Limit: 0, Remaining: 0, Reset: Timestamp{}, } want := `github.Rate{Limit:0, Remaining:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}` if got := v.String(); got != want { t.Errorf("Rate.String = %v, want %v", got, want) } } func TestReaction_String(t *testing.T) { v := Reaction{ ID: Int64(0), User: &User{}, NodeID: String(""), Content: String(""), } want := `github.Reaction{ID:0, User:github.User{}, NodeID:"", Content:""}` if got := v.String(); got != want { t.Errorf("Reaction.String = %v, want %v", got, want) } } func TestReference_String(t *testing.T) { v := Reference{ Ref: String(""), URL: String(""), Object: &GitObject{}, NodeID: String(""), } want := `github.Reference{Ref:"", URL:"", Object:github.GitObject{}, NodeID:""}` if got := v.String(); got != want { t.Errorf("Reference.String = %v, want %v", got, want) } } func TestReleaseAsset_String(t *testing.T) { v := ReleaseAsset{ ID: Int64(0), URL: String(""), Name: String(""), Label: String(""), State: String(""), ContentType: String(""), Size: Int(0), DownloadCount: Int(0), CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, BrowserDownloadURL: String(""), Uploader: &User{}, NodeID: String(""), } want := `github.ReleaseAsset{ID:0, URL:"", Name:"", Label:"", State:"", ContentType:"", Size:0, DownloadCount:0, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, BrowserDownloadURL:"", Uploader:github.User{}, NodeID:""}` if got := v.String(); got != want { t.Errorf("ReleaseAsset.String = %v, want %v", got, want) } } func TestRename_String(t *testing.T) { v := Rename{ From: String(""), To: String(""), } want := `github.Rename{From:"", To:""}` if got := v.String(); got != want { t.Errorf("Rename.String = %v, want %v", got, want) } } func TestRepoStats_String(t *testing.T) { v := RepoStats{ TotalRepos: Int(0), RootRepos: Int(0), ForkRepos: Int(0), OrgRepos: Int(0), TotalPushes: Int(0), TotalWikis: Int(0), } want := `github.RepoStats{TotalRepos:0, RootRepos:0, ForkRepos:0, OrgRepos:0, TotalPushes:0, TotalWikis:0}` if got := v.String(); got != want { t.Errorf("RepoStats.String = %v, want %v", got, want) } } func TestRepoStatus_String(t *testing.T) { v := RepoStatus{ ID: Int64(0), NodeID: String(""), URL: String(""), State: String(""), TargetURL: String(""), Description: String(""), Context: String(""), AvatarURL: String(""), Creator: &User{}, } want := `github.RepoStatus{ID:0, NodeID:"", URL:"", State:"", TargetURL:"", Description:"", Context:"", AvatarURL:"", Creator:github.User{}}` if got := v.String(); got != want { t.Errorf("RepoStatus.String = %v, want %v", got, want) } } func TestRepository_String(t *testing.T) { v := Repository{ ID: Int64(0), NodeID: String(""), Owner: &User{}, Name: String(""), FullName: String(""), Description: String(""), Homepage: String(""), CodeOfConduct: &CodeOfConduct{}, DefaultBranch: String(""), MasterBranch: String(""), CreatedAt: &Timestamp{}, PushedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, HTMLURL: String(""), CloneURL: String(""), GitURL: String(""), MirrorURL: String(""), SSHURL: String(""), SVNURL: String(""), Language: String(""), Fork: Bool(false), ForksCount: Int(0), NetworkCount: Int(0), OpenIssuesCount: Int(0), OpenIssues: Int(0), StargazersCount: Int(0), SubscribersCount: Int(0), WatchersCount: Int(0), Watchers: Int(0), Size: Int(0), AutoInit: Bool(false), Parent: &Repository{}, Source: &Repository{}, TemplateRepository: &Repository{}, Organization: &Organization{}, AllowRebaseMerge: Bool(false), AllowSquashMerge: Bool(false), AllowMergeCommit: Bool(false), DeleteBranchOnMerge: Bool(false), Archived: Bool(false), Disabled: Bool(false), License: &License{}, Private: Bool(false), HasIssues: Bool(false), HasWiki: Bool(false), HasPages: Bool(false), HasProjects: Bool(false), HasDownloads: Bool(false), IsTemplate: Bool(false), LicenseTemplate: String(""), GitignoreTemplate: String(""), TeamID: Int64(0), URL: String(""), ArchiveURL: String(""), AssigneesURL: String(""), BlobsURL: String(""), BranchesURL: String(""), CollaboratorsURL: String(""), CommentsURL: String(""), CommitsURL: String(""), CompareURL: String(""), ContentsURL: String(""), ContributorsURL: String(""), DeploymentsURL: String(""), DownloadsURL: String(""), EventsURL: String(""), ForksURL: String(""), GitCommitsURL: String(""), GitRefsURL: String(""), GitTagsURL: String(""), HooksURL: String(""), IssueCommentURL: String(""), IssueEventsURL: String(""), IssuesURL: String(""), KeysURL: String(""), LabelsURL: String(""), LanguagesURL: String(""), MergesURL: String(""), MilestonesURL: String(""), NotificationsURL: String(""), PullsURL: String(""), ReleasesURL: String(""), StargazersURL: String(""), StatusesURL: String(""), SubscribersURL: String(""), SubscriptionURL: String(""), TagsURL: String(""), TreesURL: String(""), TeamsURL: String(""), Visibility: String(""), } want := `github.Repository{ID:0, NodeID:"", Owner:github.User{}, Name:"", FullName:"", Description:"", Homepage:"", CodeOfConduct:github.CodeOfConduct{}, DefaultBranch:"", MasterBranch:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, PushedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, HTMLURL:"", CloneURL:"", GitURL:"", MirrorURL:"", SSHURL:"", SVNURL:"", Language:"", Fork:false, ForksCount:0, NetworkCount:0, OpenIssuesCount:0, OpenIssues:0, StargazersCount:0, SubscribersCount:0, WatchersCount:0, Watchers:0, Size:0, AutoInit:false, Parent:github.Repository{}, Source:github.Repository{}, TemplateRepository:github.Repository{}, Organization:github.Organization{}, AllowRebaseMerge:false, AllowSquashMerge:false, AllowMergeCommit:false, DeleteBranchOnMerge:false, Archived:false, Disabled:false, License:github.License{}, Private:false, HasIssues:false, HasWiki:false, HasPages:false, HasProjects:false, HasDownloads:false, IsTemplate:false, LicenseTemplate:"", GitignoreTemplate:"", TeamID:0, URL:"", ArchiveURL:"", AssigneesURL:"", BlobsURL:"", BranchesURL:"", CollaboratorsURL:"", CommentsURL:"", CommitsURL:"", CompareURL:"", ContentsURL:"", ContributorsURL:"", DeploymentsURL:"", DownloadsURL:"", EventsURL:"", ForksURL:"", GitCommitsURL:"", GitRefsURL:"", GitTagsURL:"", HooksURL:"", IssueCommentURL:"", IssueEventsURL:"", IssuesURL:"", KeysURL:"", LabelsURL:"", LanguagesURL:"", MergesURL:"", MilestonesURL:"", NotificationsURL:"", PullsURL:"", ReleasesURL:"", StargazersURL:"", StatusesURL:"", SubscribersURL:"", SubscriptionURL:"", TagsURL:"", TreesURL:"", TeamsURL:"", Visibility:""}` if got := v.String(); got != want { t.Errorf("Repository.String = %v, want %v", got, want) } } func TestRepositoryComment_String(t *testing.T) { v := RepositoryComment{ HTMLURL: String(""), URL: String(""), ID: Int64(0), NodeID: String(""), CommitID: String(""), User: &User{}, Reactions: &Reactions{}, Body: String(""), Path: String(""), Position: Int(0), } want := `github.RepositoryComment{HTMLURL:"", URL:"", ID:0, NodeID:"", CommitID:"", User:github.User{}, Reactions:github.Reactions{}, Body:"", Path:"", Position:0}` if got := v.String(); got != want { t.Errorf("RepositoryComment.String = %v, want %v", got, want) } } func TestRepositoryCommit_String(t *testing.T) { v := RepositoryCommit{ NodeID: String(""), SHA: String(""), Commit: &Commit{}, Author: &User{}, Committer: &User{}, HTMLURL: String(""), URL: String(""), CommentsURL: String(""), Stats: &CommitStats{}, } want := `github.RepositoryCommit{NodeID:"", SHA:"", Commit:github.Commit{}, Author:github.User{}, Committer:github.User{}, HTMLURL:"", URL:"", CommentsURL:"", Stats:github.CommitStats{}}` if got := v.String(); got != want { t.Errorf("RepositoryCommit.String = %v, want %v", got, want) } } func TestRepositoryContent_String(t *testing.T) { v := RepositoryContent{ Type: String(""), Target: String(""), Encoding: String(""), Size: Int(0), Name: String(""), Path: String(""), Content: String(""), SHA: String(""), URL: String(""), GitURL: String(""), HTMLURL: String(""), DownloadURL: String(""), } want := `github.RepositoryContent{Type:"", Target:"", Encoding:"", Size:0, Name:"", Path:"", Content:"", SHA:"", URL:"", GitURL:"", HTMLURL:"", DownloadURL:""}` if got := v.String(); got != want { t.Errorf("RepositoryContent.String = %v, want %v", got, want) } } func TestRepositoryLicense_String(t *testing.T) { v := RepositoryLicense{ Name: String(""), Path: String(""), SHA: String(""), Size: Int(0), URL: String(""), HTMLURL: String(""), GitURL: String(""), DownloadURL: String(""), Type: String(""), Content: String(""), Encoding: String(""), License: &License{}, } want := `github.RepositoryLicense{Name:"", Path:"", SHA:"", Size:0, URL:"", HTMLURL:"", GitURL:"", DownloadURL:"", Type:"", Content:"", Encoding:"", License:github.License{}}` if got := v.String(); got != want { t.Errorf("RepositoryLicense.String = %v, want %v", got, want) } } func TestRepositoryRelease_String(t *testing.T) { v := RepositoryRelease{ TagName: String(""), TargetCommitish: String(""), Name: String(""), Body: String(""), Draft: Bool(false), Prerelease: Bool(false), DiscussionCategoryName: String(""), ID: Int64(0), CreatedAt: &Timestamp{}, PublishedAt: &Timestamp{}, URL: String(""), HTMLURL: String(""), AssetsURL: String(""), UploadURL: String(""), ZipballURL: String(""), TarballURL: String(""), Author: &User{}, NodeID: String(""), } want := `github.RepositoryRelease{TagName:"", TargetCommitish:"", Name:"", Body:"", Draft:false, Prerelease:false, DiscussionCategoryName:"", ID:0, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, PublishedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, URL:"", HTMLURL:"", AssetsURL:"", UploadURL:"", ZipballURL:"", TarballURL:"", Author:github.User{}, NodeID:""}` if got := v.String(); got != want { t.Errorf("RepositoryRelease.String = %v, want %v", got, want) } } func TestSourceImportAuthor_String(t *testing.T) { v := SourceImportAuthor{ ID: Int64(0), RemoteID: String(""), RemoteName: String(""), Email: String(""), Name: String(""), URL: String(""), ImportURL: String(""), } want := `github.SourceImportAuthor{ID:0, RemoteID:"", RemoteName:"", Email:"", Name:"", URL:"", ImportURL:""}` if got := v.String(); got != want { t.Errorf("SourceImportAuthor.String = %v, want %v", got, want) } } func TestTeam_String(t *testing.T) { v := Team{ ID: Int64(0), NodeID: String(""), Name: String(""), Description: String(""), URL: String(""), Slug: String(""), Permission: String(""), Privacy: String(""), MembersCount: Int(0), ReposCount: Int(0), Organization: &Organization{}, MembersURL: String(""), RepositoriesURL: String(""), Parent: &Team{}, LDAPDN: String(""), } want := `github.Team{ID:0, NodeID:"", Name:"", Description:"", URL:"", Slug:"", Permission:"", Privacy:"", MembersCount:0, ReposCount:0, Organization:github.Organization{}, MembersURL:"", RepositoriesURL:"", Parent:github.Team{}, LDAPDN:""}` if got := v.String(); got != want { t.Errorf("Team.String = %v, want %v", got, want) } } func TestTeamDiscussion_String(t *testing.T) { v := TeamDiscussion{ Author: &User{}, Body: String(""), BodyHTML: String(""), BodyVersion: String(""), CommentsCount: Int(0), CommentsURL: String(""), CreatedAt: &Timestamp{}, LastEditedAt: &Timestamp{}, HTMLURL: String(""), NodeID: String(""), Number: Int(0), Pinned: Bool(false), Private: Bool(false), TeamURL: String(""), Title: String(""), UpdatedAt: &Timestamp{}, URL: String(""), Reactions: &Reactions{}, } want := `github.TeamDiscussion{Author:github.User{}, Body:"", BodyHTML:"", BodyVersion:"", CommentsCount:0, CommentsURL:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, LastEditedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, HTMLURL:"", NodeID:"", Number:0, Pinned:false, Private:false, TeamURL:"", Title:"", UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, URL:"", Reactions:github.Reactions{}}` if got := v.String(); got != want { t.Errorf("TeamDiscussion.String = %v, want %v", got, want) } } func TestTeamLDAPMapping_String(t *testing.T) { v := TeamLDAPMapping{ ID: Int64(0), LDAPDN: String(""), URL: String(""), Name: String(""), Slug: String(""), Description: String(""), Privacy: String(""), Permission: String(""), MembersURL: String(""), RepositoriesURL: String(""), } want := `github.TeamLDAPMapping{ID:0, LDAPDN:"", URL:"", Name:"", Slug:"", Description:"", Privacy:"", Permission:"", MembersURL:"", RepositoriesURL:""}` if got := v.String(); got != want { t.Errorf("TeamLDAPMapping.String = %v, want %v", got, want) } } func TestTextMatch_String(t *testing.T) { v := TextMatch{ ObjectURL: String(""), ObjectType: String(""), Property: String(""), Fragment: String(""), } want := `github.TextMatch{ObjectURL:"", ObjectType:"", Property:"", Fragment:""}` if got := v.String(); got != want { t.Errorf("TextMatch.String = %v, want %v", got, want) } } func TestTree_String(t *testing.T) { v := Tree{ SHA: String(""), Truncated: Bool(false), } want := `github.Tree{SHA:"", Truncated:false}` if got := v.String(); got != want { t.Errorf("Tree.String = %v, want %v", got, want) } } func TestTreeEntry_String(t *testing.T) { v := TreeEntry{ SHA: String(""), Path: String(""), Mode: String(""), Type: String(""), Size: Int(0), Content: String(""), URL: String(""), } want := `github.TreeEntry{SHA:"", Path:"", Mode:"", Type:"", Size:0, Content:"", URL:""}` if got := v.String(); got != want { t.Errorf("TreeEntry.String = %v, want %v", got, want) } } func TestUser_String(t *testing.T) { v := User{ Login: String(""), ID: Int64(0), NodeID: String(""), AvatarURL: String(""), HTMLURL: String(""), GravatarID: String(""), Name: String(""), Company: String(""), Blog: String(""), Location: String(""), Email: String(""), Hireable: Bool(false), Bio: String(""), TwitterUsername: String(""), PublicRepos: Int(0), PublicGists: Int(0), Followers: Int(0), Following: Int(0), CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, SuspendedAt: &Timestamp{}, Type: String(""), SiteAdmin: Bool(false), TotalPrivateRepos: Int(0), OwnedPrivateRepos: Int(0), PrivateGists: Int(0), DiskUsage: Int(0), Collaborators: Int(0), TwoFactorAuthentication: Bool(false), Plan: &Plan{}, LdapDn: String(""), URL: String(""), EventsURL: String(""), FollowingURL: String(""), FollowersURL: String(""), GistsURL: String(""), OrganizationsURL: String(""), ReceivedEventsURL: String(""), ReposURL: String(""), StarredURL: String(""), SubscriptionsURL: String(""), } want := `github.User{Login:"", ID:0, NodeID:"", AvatarURL:"", HTMLURL:"", GravatarID:"", Name:"", Company:"", Blog:"", Location:"", Email:"", Hireable:false, Bio:"", TwitterUsername:"", PublicRepos:0, PublicGists:0, Followers:0, Following:0, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, SuspendedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Type:"", SiteAdmin:false, TotalPrivateRepos:0, OwnedPrivateRepos:0, PrivateGists:0, DiskUsage:0, Collaborators:0, TwoFactorAuthentication:false, Plan:github.Plan{}, LdapDn:"", URL:"", EventsURL:"", FollowingURL:"", FollowersURL:"", GistsURL:"", OrganizationsURL:"", ReceivedEventsURL:"", ReposURL:"", StarredURL:"", SubscriptionsURL:""}` if got := v.String(); got != want { t.Errorf("User.String = %v, want %v", got, want) } } func TestUserLDAPMapping_String(t *testing.T) { v := UserLDAPMapping{ ID: Int64(0), LDAPDN: String(""), Login: String(""), AvatarURL: String(""), GravatarID: String(""), Type: String(""), SiteAdmin: Bool(false), URL: String(""), EventsURL: String(""), FollowingURL: String(""), FollowersURL: String(""), GistsURL: String(""), OrganizationsURL: String(""), ReceivedEventsURL: String(""), ReposURL: String(""), StarredURL: String(""), SubscriptionsURL: String(""), } want := `github.UserLDAPMapping{ID:0, LDAPDN:"", Login:"", AvatarURL:"", GravatarID:"", Type:"", SiteAdmin:false, URL:"", EventsURL:"", FollowingURL:"", FollowersURL:"", GistsURL:"", OrganizationsURL:"", ReceivedEventsURL:"", ReposURL:"", StarredURL:"", SubscriptionsURL:""}` if got := v.String(); got != want { t.Errorf("UserLDAPMapping.String = %v, want %v", got, want) } } func TestUserMigration_String(t *testing.T) { v := UserMigration{ ID: Int64(0), GUID: String(""), State: String(""), LockRepositories: Bool(false), ExcludeAttachments: Bool(false), URL: String(""), CreatedAt: String(""), UpdatedAt: String(""), } want := `github.UserMigration{ID:0, GUID:"", State:"", LockRepositories:false, ExcludeAttachments:false, URL:"", CreatedAt:"", UpdatedAt:""}` if got := v.String(); got != want { t.Errorf("UserMigration.String = %v, want %v", got, want) } } func TestUserStats_String(t *testing.T) { v := UserStats{ TotalUsers: Int(0), AdminUsers: Int(0), SuspendedUsers: Int(0), } want := `github.UserStats{TotalUsers:0, AdminUsers:0, SuspendedUsers:0}` if got := v.String(); got != want { t.Errorf("UserStats.String = %v, want %v", got, want) } } func TestWebHookAuthor_String(t *testing.T) { v := WebHookAuthor{ Email: String(""), Name: String(""), Username: String(""), } want := `github.WebHookAuthor{Email:"", Name:"", Username:""}` if got := v.String(); got != want { t.Errorf("WebHookAuthor.String = %v, want %v", got, want) } } func TestWebHookCommit_String(t *testing.T) { v := WebHookCommit{ Author: &WebHookAuthor{}, Committer: &WebHookAuthor{}, Distinct: Bool(false), ID: String(""), Message: String(""), } want := `github.WebHookCommit{Author:github.WebHookAuthor{}, Committer:github.WebHookAuthor{}, Distinct:false, ID:"", Message:""}` if got := v.String(); got != want { t.Errorf("WebHookCommit.String = %v, want %v", got, want) } } func TestWebHookPayload_String(t *testing.T) { v := WebHookPayload{ Action: String(""), After: String(""), Before: String(""), Compare: String(""), Created: Bool(false), Deleted: Bool(false), Forced: Bool(false), HeadCommit: &WebHookCommit{}, Installation: &Installation{}, Organization: &Organization{}, Pusher: &User{}, Ref: String(""), Repo: &Repository{}, Sender: &User{}, } want := `github.WebHookPayload{Action:"", After:"", Before:"", Compare:"", Created:false, Deleted:false, Forced:false, HeadCommit:github.WebHookCommit{}, Installation:github.Installation{}, Organization:github.Organization{}, Pusher:github.User{}, Ref:"", Repo:github.Repository{}, Sender:github.User{}}` if got := v.String(); got != want { t.Errorf("WebHookPayload.String = %v, want %v", got, want) } } func TestWeeklyCommitActivity_String(t *testing.T) { v := WeeklyCommitActivity{ Total: Int(0), Week: &Timestamp{}, } want := `github.WeeklyCommitActivity{Total:0, Week:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}` if got := v.String(); got != want { t.Errorf("WeeklyCommitActivity.String = %v, want %v", got, want) } } func TestWeeklyStats_String(t *testing.T) { v := WeeklyStats{ Week: &Timestamp{}, Additions: Int(0), Deletions: Int(0), Commits: Int(0), } want := `github.WeeklyStats{Week:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, Additions:0, Deletions:0, Commits:0}` if got := v.String(); got != want { t.Errorf("WeeklyStats.String = %v, want %v", got, want) } } go-github-38.1.0/github/github.go000066400000000000000000001232221410475703100165670ustar00rootroot00000000000000// Copyright 2013 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. //go:generate go run gen-accessors.go //go:generate go run gen-stringify-test.go package github import ( "bytes" "context" "encoding/json" "errors" "fmt" "io" "io/ioutil" "net/http" "net/url" "reflect" "strconv" "strings" "sync" "time" "github.com/google/go-querystring/query" ) const ( defaultBaseURL = "https://api.github.com/" uploadBaseURL = "https://uploads.github.com/" userAgent = "go-github" headerRateLimit = "X-RateLimit-Limit" headerRateRemaining = "X-RateLimit-Remaining" headerRateReset = "X-RateLimit-Reset" headerOTP = "X-GitHub-OTP" headerTokenExpiration = "GitHub-Authentication-Token-Expiration" mediaTypeV3 = "application/vnd.github.v3+json" defaultMediaType = "application/octet-stream" mediaTypeV3SHA = "application/vnd.github.v3.sha" mediaTypeV3Diff = "application/vnd.github.v3.diff" mediaTypeV3Patch = "application/vnd.github.v3.patch" mediaTypeOrgPermissionRepo = "application/vnd.github.v3.repository+json" mediaTypeIssueImportAPI = "application/vnd.github.golden-comet-preview+json" // Media Type values to access preview APIs // https://developer.github.com/changes/2014-12-09-new-attributes-for-stars-api/ mediaTypeStarringPreview = "application/vnd.github.v3.star+json" // https://help.github.com/enterprise/2.4/admin/guides/migrations/exporting-the-github-com-organization-s-repositories/ mediaTypeMigrationsPreview = "application/vnd.github.wyandotte-preview+json" // https://developer.github.com/changes/2016-04-06-deployment-and-deployment-status-enhancements/ mediaTypeDeploymentStatusPreview = "application/vnd.github.ant-man-preview+json" // https://developer.github.com/changes/2018-10-16-deployments-environments-states-and-auto-inactive-updates/ mediaTypeExpandDeploymentStatusPreview = "application/vnd.github.flash-preview+json" // https://developer.github.com/changes/2016-05-12-reactions-api-preview/ mediaTypeReactionsPreview = "application/vnd.github.squirrel-girl-preview" // https://developer.github.com/changes/2016-05-23-timeline-preview-api/ mediaTypeTimelinePreview = "application/vnd.github.mockingbird-preview+json" // https://developer.github.com/changes/2016-09-14-projects-api/ mediaTypeProjectsPreview = "application/vnd.github.inertia-preview+json" // https://developer.github.com/changes/2017-01-05-commit-search-api/ mediaTypeCommitSearchPreview = "application/vnd.github.cloak-preview+json" // https://developer.github.com/changes/2017-02-28-user-blocking-apis-and-webhook/ mediaTypeBlockUsersPreview = "application/vnd.github.giant-sentry-fist-preview+json" // https://developer.github.com/changes/2017-02-09-community-health/ mediaTypeRepositoryCommunityHealthMetricsPreview = "application/vnd.github.black-panther-preview+json" // https://developer.github.com/changes/2017-05-23-coc-api/ mediaTypeCodesOfConductPreview = "application/vnd.github.scarlet-witch-preview+json" // https://developer.github.com/changes/2017-07-17-update-topics-on-repositories/ mediaTypeTopicsPreview = "application/vnd.github.mercy-preview+json" // https://developer.github.com/changes/2018-03-16-protected-branches-required-approving-reviews/ mediaTypeRequiredApprovingReviewsPreview = "application/vnd.github.luke-cage-preview+json" // https://developer.github.com/enterprise/2.13/v3/repos/pre_receive_hooks/ mediaTypePreReceiveHooksPreview = "application/vnd.github.eye-scream-preview" // https://developer.github.com/changes/2018-02-22-protected-branches-required-signatures/ mediaTypeSignaturePreview = "application/vnd.github.zzzax-preview+json" // https://developer.github.com/changes/2018-09-05-project-card-events/ mediaTypeProjectCardDetailsPreview = "application/vnd.github.starfox-preview+json" // https://developer.github.com/changes/2018-12-18-interactions-preview/ mediaTypeInteractionRestrictionsPreview = "application/vnd.github.sombra-preview+json" // https://developer.github.com/changes/2019-03-14-enabling-disabling-pages/ mediaTypeEnablePagesAPIPreview = "application/vnd.github.switcheroo-preview+json" // https://developer.github.com/changes/2019-04-24-vulnerability-alerts/ mediaTypeRequiredVulnerabilityAlertsPreview = "application/vnd.github.dorian-preview+json" // https://developer.github.com/changes/2019-06-04-automated-security-fixes/ mediaTypeRequiredAutomatedSecurityFixesPreview = "application/vnd.github.london-preview+json" // https://developer.github.com/changes/2019-05-29-update-branch-api/ mediaTypeUpdatePullRequestBranchPreview = "application/vnd.github.lydian-preview+json" // https://developer.github.com/changes/2019-04-11-pulls-branches-for-commit/ mediaTypeListPullsOrBranchesForCommitPreview = "application/vnd.github.groot-preview+json" // https://docs.github.com/en/free-pro-team@latest/rest/reference/previews/#repository-creation-permissions mediaTypeMemberAllowedRepoCreationTypePreview = "application/vnd.github.surtur-preview+json" // https://docs.github.com/en/free-pro-team@latest/rest/reference/previews/#create-and-use-repository-templates mediaTypeRepositoryTemplatePreview = "application/vnd.github.baptiste-preview+json" // https://developer.github.com/changes/2019-10-03-multi-line-comments/ mediaTypeMultiLineCommentsPreview = "application/vnd.github.comfort-fade-preview+json" // https://developer.github.com/changes/2019-11-05-deprecated-passwords-and-authorizations-api/ mediaTypeOAuthAppPreview = "application/vnd.github.doctor-strange-preview+json" // https://developer.github.com/changes/2019-12-03-internal-visibility-changes/ mediaTypeRepositoryVisibilityPreview = "application/vnd.github.nebula-preview+json" // https://developer.github.com/changes/2018-12-10-content-attachments-api/ mediaTypeContentAttachmentsPreview = "application/vnd.github.corsair-preview+json" ) var errNonNilContext = errors.New("context must be non-nil") // A Client manages communication with the GitHub API. type Client struct { clientMu sync.Mutex // clientMu protects the client during calls that modify the CheckRedirect func. client *http.Client // HTTP client used to communicate with the API. // Base URL for API requests. Defaults to the public GitHub API, but can be // set to a domain endpoint to use with GitHub Enterprise. BaseURL should // always be specified with a trailing slash. BaseURL *url.URL // Base URL for uploading files. UploadURL *url.URL // User agent used when communicating with the GitHub API. UserAgent string rateMu sync.Mutex rateLimits [categories]Rate // Rate limits for the client as determined by the most recent API calls. common service // Reuse a single struct instead of allocating one for each service on the heap. // Services used for talking to different parts of the GitHub API. Actions *ActionsService Activity *ActivityService Admin *AdminService Apps *AppsService Authorizations *AuthorizationsService Billing *BillingService Checks *ChecksService CodeScanning *CodeScanningService Enterprise *EnterpriseService Gists *GistsService Git *GitService Gitignores *GitignoresService Interactions *InteractionsService IssueImport *IssueImportService Issues *IssuesService Licenses *LicensesService Marketplace *MarketplaceService Migrations *MigrationService Organizations *OrganizationsService Projects *ProjectsService PullRequests *PullRequestsService Reactions *ReactionsService Repositories *RepositoriesService Search *SearchService Teams *TeamsService Users *UsersService } type service struct { client *Client } // Client returns the http.Client used by this GitHub client. func (c *Client) Client() *http.Client { c.clientMu.Lock() defer c.clientMu.Unlock() clientCopy := *c.client return &clientCopy } // ListOptions specifies the optional parameters to various List methods that // support offset pagination. type ListOptions struct { // For paginated result sets, page of results to retrieve. Page int `url:"page,omitempty"` // For paginated result sets, the number of results to include per page. PerPage int `url:"per_page,omitempty"` } // ListCursorOptions specifies the optional parameters to various List methods that // support cursor pagination. type ListCursorOptions struct { // For paginated result sets, page of results to retrieve. Page string `url:"page,omitempty"` // For paginated result sets, the number of results to include per page. PerPage int `url:"per_page,omitempty"` // A cursor, as given in the Link header. If specified, the query only searches for events after this cursor. After string `url:"after,omitempty"` // A cursor, as given in the Link header. If specified, the query only searches for events before this cursor. Before string `url:"before,omitempty"` // A cursor, as given in the Link header. If specified, the query continues the search using this cursor. Cursor string `url:"cursor,omitempty"` } // UploadOptions specifies the parameters to methods that support uploads. type UploadOptions struct { Name string `url:"name,omitempty"` Label string `url:"label,omitempty"` MediaType string `url:"-"` } // RawType represents type of raw format of a request instead of JSON. type RawType uint8 const ( // Diff format. Diff RawType = 1 + iota // Patch format. Patch ) // RawOptions specifies parameters when user wants to get raw format of // a response instead of JSON. type RawOptions struct { Type RawType } // addOptions adds the parameters in opts as URL query parameters to s. opts // must be a struct whose fields may contain "url" tags. func addOptions(s string, opts interface{}) (string, error) { v := reflect.ValueOf(opts) if v.Kind() == reflect.Ptr && v.IsNil() { return s, nil } u, err := url.Parse(s) if err != nil { return s, err } qs, err := query.Values(opts) if err != nil { return s, err } u.RawQuery = qs.Encode() return u.String(), nil } // NewClient returns a new GitHub API client. If a nil httpClient is // provided, a new http.Client will be used. To use API methods which require // authentication, provide an http.Client that will perform the authentication // for you (such as that provided by the golang.org/x/oauth2 library). func NewClient(httpClient *http.Client) *Client { if httpClient == nil { httpClient = &http.Client{} } baseURL, _ := url.Parse(defaultBaseURL) uploadURL, _ := url.Parse(uploadBaseURL) c := &Client{client: httpClient, BaseURL: baseURL, UserAgent: userAgent, UploadURL: uploadURL} c.common.client = c c.Actions = (*ActionsService)(&c.common) c.Activity = (*ActivityService)(&c.common) c.Admin = (*AdminService)(&c.common) c.Apps = (*AppsService)(&c.common) c.Authorizations = (*AuthorizationsService)(&c.common) c.Billing = (*BillingService)(&c.common) c.Checks = (*ChecksService)(&c.common) c.CodeScanning = (*CodeScanningService)(&c.common) c.Enterprise = (*EnterpriseService)(&c.common) c.Gists = (*GistsService)(&c.common) c.Git = (*GitService)(&c.common) c.Gitignores = (*GitignoresService)(&c.common) c.Interactions = (*InteractionsService)(&c.common) c.IssueImport = (*IssueImportService)(&c.common) c.Issues = (*IssuesService)(&c.common) c.Licenses = (*LicensesService)(&c.common) c.Marketplace = &MarketplaceService{client: c} c.Migrations = (*MigrationService)(&c.common) c.Organizations = (*OrganizationsService)(&c.common) c.Projects = (*ProjectsService)(&c.common) c.PullRequests = (*PullRequestsService)(&c.common) c.Reactions = (*ReactionsService)(&c.common) c.Repositories = (*RepositoriesService)(&c.common) c.Search = (*SearchService)(&c.common) c.Teams = (*TeamsService)(&c.common) c.Users = (*UsersService)(&c.common) return c } // NewEnterpriseClient returns a new GitHub API client with provided // base URL and upload URL (often is your GitHub Enterprise hostname). // If the base URL does not have the suffix "/api/v3/", it will be added automatically. // If the upload URL does not have the suffix "/api/uploads", it will be added automatically. // If a nil httpClient is provided, a new http.Client will be used. // // Note that NewEnterpriseClient is a convenience helper only; // its behavior is equivalent to using NewClient, followed by setting // the BaseURL and UploadURL fields. // // Another important thing is that by default, the GitHub Enterprise URL format // should be http(s)://[hostname]/api/v3/ or you will always receive the 406 status code. // The upload URL format should be http(s)://[hostname]/api/uploads/. func NewEnterpriseClient(baseURL, uploadURL string, httpClient *http.Client) (*Client, error) { baseEndpoint, err := url.Parse(baseURL) if err != nil { return nil, err } if !strings.HasSuffix(baseEndpoint.Path, "/") { baseEndpoint.Path += "/" } if !strings.HasSuffix(baseEndpoint.Path, "/api/v3/") && !strings.HasPrefix(baseEndpoint.Host, "api.") && !strings.Contains(baseEndpoint.Host, ".api.") { baseEndpoint.Path += "api/v3/" } uploadEndpoint, err := url.Parse(uploadURL) if err != nil { return nil, err } if !strings.HasSuffix(uploadEndpoint.Path, "/") { uploadEndpoint.Path += "/" } if !strings.HasSuffix(uploadEndpoint.Path, "/api/uploads/") && !strings.HasPrefix(uploadEndpoint.Host, "api.") && !strings.Contains(uploadEndpoint.Host, ".api.") { uploadEndpoint.Path += "api/uploads/" } c := NewClient(httpClient) c.BaseURL = baseEndpoint c.UploadURL = uploadEndpoint return c, nil } // NewRequest creates an API request. A relative URL can be provided in urlStr, // in which case it is resolved relative to the BaseURL of the Client. // Relative URLs should always be specified without a preceding slash. If // specified, the value pointed to by body is JSON encoded and included as the // request body. func (c *Client) NewRequest(method, urlStr string, body interface{}) (*http.Request, error) { if !strings.HasSuffix(c.BaseURL.Path, "/") { return nil, fmt.Errorf("BaseURL must have a trailing slash, but %q does not", c.BaseURL) } u, err := c.BaseURL.Parse(urlStr) if err != nil { return nil, err } var buf io.ReadWriter if body != nil { buf = &bytes.Buffer{} enc := json.NewEncoder(buf) enc.SetEscapeHTML(false) err := enc.Encode(body) if err != nil { return nil, err } } req, err := http.NewRequest(method, u.String(), buf) if err != nil { return nil, err } if body != nil { req.Header.Set("Content-Type", "application/json") } req.Header.Set("Accept", mediaTypeV3) if c.UserAgent != "" { req.Header.Set("User-Agent", c.UserAgent) } return req, nil } // NewUploadRequest creates an upload request. A relative URL can be provided in // urlStr, in which case it is resolved relative to the UploadURL of the Client. // Relative URLs should always be specified without a preceding slash. func (c *Client) NewUploadRequest(urlStr string, reader io.Reader, size int64, mediaType string) (*http.Request, error) { if !strings.HasSuffix(c.UploadURL.Path, "/") { return nil, fmt.Errorf("UploadURL must have a trailing slash, but %q does not", c.UploadURL) } u, err := c.UploadURL.Parse(urlStr) if err != nil { return nil, err } req, err := http.NewRequest("POST", u.String(), reader) if err != nil { return nil, err } req.ContentLength = size if mediaType == "" { mediaType = defaultMediaType } req.Header.Set("Content-Type", mediaType) req.Header.Set("Accept", mediaTypeV3) req.Header.Set("User-Agent", c.UserAgent) return req, nil } // Response is a GitHub API response. This wraps the standard http.Response // returned from GitHub and provides convenient access to things like // pagination links. type Response struct { *http.Response // These fields provide the page values for paginating through a set of // results. Any or all of these may be set to the zero value for // responses that are not part of a paginated set, or for which there // are no additional pages. // // These fields support what is called "offset pagination" and should // be used with the ListOptions struct. NextPage int PrevPage int FirstPage int LastPage int // Additionally, some APIs support "cursor pagination" instead of offset. // This means that a token points directly to the next record which // can lead to O(1) performance compared to O(n) performance provided // by offset pagination. // // For APIs that support cursor pagination (such as // TeamsService.ListIDPGroupsInOrganization), the following field // will be populated to point to the next page. // // To use this token, set ListCursorOptions.Page to this value before // calling the endpoint again. NextPageToken string // For APIs that support cursor pagination, such as RepositoryService.ListRepositoryHookDeliveries, // the following field will be populated to point to the next page. // Set ListCursorOptions.Cursor to this value when calling the endpoint again. Cursor string // Explicitly specify the Rate type so Rate's String() receiver doesn't // propagate to Response. Rate Rate // token's expiration date TokenExpiration Timestamp } // newResponse creates a new Response for the provided http.Response. // r must not be nil. func newResponse(r *http.Response) *Response { response := &Response{Response: r} response.populatePageValues() response.Rate = parseRate(r) response.TokenExpiration = parseTokenExpiration(r) return response } // populatePageValues parses the HTTP Link response headers and populates the // various pagination link values in the Response. func (r *Response) populatePageValues() { if links, ok := r.Response.Header["Link"]; ok && len(links) > 0 { for _, link := range strings.Split(links[0], ",") { segments := strings.Split(strings.TrimSpace(link), ";") // link must at least have href and rel if len(segments) < 2 { continue } // ensure href is properly formatted if !strings.HasPrefix(segments[0], "<") || !strings.HasSuffix(segments[0], ">") { continue } // try to pull out page parameter url, err := url.Parse(segments[0][1 : len(segments[0])-1]) if err != nil { continue } q := url.Query() if cursor := q.Get("cursor"); cursor != "" { for _, segment := range segments[1:] { switch strings.TrimSpace(segment) { case `rel="next"`: r.Cursor = cursor } } continue } page := q.Get("page") if page == "" { continue } for _, segment := range segments[1:] { switch strings.TrimSpace(segment) { case `rel="next"`: if r.NextPage, err = strconv.Atoi(page); err != nil { r.NextPageToken = page } case `rel="prev"`: r.PrevPage, _ = strconv.Atoi(page) case `rel="first"`: r.FirstPage, _ = strconv.Atoi(page) case `rel="last"`: r.LastPage, _ = strconv.Atoi(page) } } } } } // parseRate parses the rate related headers. func parseRate(r *http.Response) Rate { var rate Rate if limit := r.Header.Get(headerRateLimit); limit != "" { rate.Limit, _ = strconv.Atoi(limit) } if remaining := r.Header.Get(headerRateRemaining); remaining != "" { rate.Remaining, _ = strconv.Atoi(remaining) } if reset := r.Header.Get(headerRateReset); reset != "" { if v, _ := strconv.ParseInt(reset, 10, 64); v != 0 { rate.Reset = Timestamp{time.Unix(v, 0)} } } return rate } // parseTokenExpiration parses the TokenExpiration related headers. func parseTokenExpiration(r *http.Response) Timestamp { var exp Timestamp if v := r.Header.Get(headerTokenExpiration); v != "" { if t, err := time.Parse("2006-01-02 03:04:05 MST", v); err == nil { exp = Timestamp{t.Local()} } } return exp } type requestContext uint8 const ( bypassRateLimitCheck requestContext = iota ) // BareDo sends an API request and lets you handle the api response. If an error // or API Error occurs, the error will contain more information. Otherwise you // are supposed to read and close the response's Body. If rate limit is exceeded // and reset time is in the future, BareDo returns *RateLimitError immediately // without making a network API call. // // The provided ctx must be non-nil, if it is nil an error is returned. If it is // canceled or times out, ctx.Err() will be returned. func (c *Client) BareDo(ctx context.Context, req *http.Request) (*Response, error) { if ctx == nil { return nil, errNonNilContext } req = withContext(ctx, req) rateLimitCategory := category(req.URL.Path) if bypass := ctx.Value(bypassRateLimitCheck); bypass == nil { // If we've hit rate limit, don't make further requests before Reset time. if err := c.checkRateLimitBeforeDo(req, rateLimitCategory); err != nil { return &Response{ Response: err.Response, Rate: err.Rate, }, err } } resp, err := c.client.Do(req) if err != nil { // If we got an error, and the context has been canceled, // the context's error is probably more useful. select { case <-ctx.Done(): return nil, ctx.Err() default: } // If the error type is *url.Error, sanitize its URL before returning. if e, ok := err.(*url.Error); ok { if url, err := url.Parse(e.URL); err == nil { e.URL = sanitizeURL(url).String() return nil, e } } return nil, err } response := newResponse(resp) c.rateMu.Lock() c.rateLimits[rateLimitCategory] = response.Rate c.rateMu.Unlock() err = CheckResponse(resp) if err != nil { defer resp.Body.Close() // Special case for AcceptedErrors. If an AcceptedError // has been encountered, the response's payload will be // added to the AcceptedError and returned. // // Issue #1022 aerr, ok := err.(*AcceptedError) if ok { b, readErr := ioutil.ReadAll(resp.Body) if readErr != nil { return response, readErr } aerr.Raw = b err = aerr } } return response, err } // Do sends an API request and returns the API response. The API response is // JSON decoded and stored in the value pointed to by v, or returned as an // error if an API error has occurred. If v implements the io.Writer interface, // the raw response body will be written to v, without attempting to first // decode it. If v is nil, and no error hapens, the response is returned as is. // If rate limit is exceeded and reset time is in the future, Do returns // *RateLimitError immediately without making a network API call. // // The provided ctx must be non-nil, if it is nil an error is returned. If it // is canceled or times out, ctx.Err() will be returned. func (c *Client) Do(ctx context.Context, req *http.Request, v interface{}) (*Response, error) { resp, err := c.BareDo(ctx, req) if err != nil { return resp, err } defer resp.Body.Close() switch v := v.(type) { case nil: case io.Writer: _, err = io.Copy(v, resp.Body) default: decErr := json.NewDecoder(resp.Body).Decode(v) if decErr == io.EOF { decErr = nil // ignore EOF errors caused by empty response body } if decErr != nil { err = decErr } } return resp, err } // checkRateLimitBeforeDo does not make any network calls, but uses existing knowledge from // current client state in order to quickly check if *RateLimitError can be immediately returned // from Client.Do, and if so, returns it so that Client.Do can skip making a network API call unnecessarily. // Otherwise it returns nil, and Client.Do should proceed normally. func (c *Client) checkRateLimitBeforeDo(req *http.Request, rateLimitCategory rateLimitCategory) *RateLimitError { c.rateMu.Lock() rate := c.rateLimits[rateLimitCategory] c.rateMu.Unlock() if !rate.Reset.Time.IsZero() && rate.Remaining == 0 && time.Now().Before(rate.Reset.Time) { // Create a fake response. resp := &http.Response{ Status: http.StatusText(http.StatusForbidden), StatusCode: http.StatusForbidden, Request: req, Header: make(http.Header), Body: ioutil.NopCloser(strings.NewReader("")), } return &RateLimitError{ Rate: rate, Response: resp, Message: fmt.Sprintf("API rate limit of %v still exceeded until %v, not making remote request.", rate.Limit, rate.Reset.Time), } } return nil } // compareHttpResponse returns whether two http.Response objects are equal or not. // Currently, only StatusCode is checked. This function is used when implementing the // Is(error) bool interface for the custom error types in this package. func compareHttpResponse(r1, r2 *http.Response) bool { if r1 == nil && r2 == nil { return true } if r1 != nil && r2 != nil { return r1.StatusCode == r2.StatusCode } return false } /* An ErrorResponse reports one or more errors caused by an API request. GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/#client-errors */ type ErrorResponse struct { Response *http.Response // HTTP response that caused this error Message string `json:"message"` // error message Errors []Error `json:"errors"` // more detail on individual errors // Block is only populated on certain types of errors such as code 451. Block *ErrorBlock `json:"block,omitempty"` // Most errors will also include a documentation_url field pointing // to some content that might help you resolve the error, see // https://docs.github.com/en/free-pro-team@latest/rest/reference/#client-errors DocumentationURL string `json:"documentation_url,omitempty"` } // ErrorBlock contains a further explanation for the reason of an error. // See https://developer.github.com/changes/2016-03-17-the-451-status-code-is-now-supported/ // for more information. type ErrorBlock struct { Reason string `json:"reason,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` } func (r *ErrorResponse) Error() string { return fmt.Sprintf("%v %v: %d %v %+v", r.Response.Request.Method, sanitizeURL(r.Response.Request.URL), r.Response.StatusCode, r.Message, r.Errors) } // Is returns whether the provided error equals this error. func (r *ErrorResponse) Is(target error) bool { v, ok := target.(*ErrorResponse) if !ok { return false } if r.Message != v.Message || (r.DocumentationURL != v.DocumentationURL) || !compareHttpResponse(r.Response, v.Response) { return false } // Compare Errors. if len(r.Errors) != len(v.Errors) { return false } for idx := range r.Errors { if r.Errors[idx] != v.Errors[idx] { return false } } // Compare Block. if (r.Block != nil && v.Block == nil) || (r.Block == nil && v.Block != nil) { return false } if r.Block != nil && v.Block != nil { if r.Block.Reason != v.Block.Reason { return false } if (r.Block.CreatedAt != nil && v.Block.CreatedAt == nil) || (r.Block.CreatedAt == nil && v.Block.CreatedAt != nil) { return false } if r.Block.CreatedAt != nil && v.Block.CreatedAt != nil { if *(r.Block.CreatedAt) != *(v.Block.CreatedAt) { return false } } } return true } // TwoFactorAuthError occurs when using HTTP Basic Authentication for a user // that has two-factor authentication enabled. The request can be reattempted // by providing a one-time password in the request. type TwoFactorAuthError ErrorResponse func (r *TwoFactorAuthError) Error() string { return (*ErrorResponse)(r).Error() } // RateLimitError occurs when GitHub returns 403 Forbidden response with a rate limit // remaining value of 0. type RateLimitError struct { Rate Rate // Rate specifies last known rate limit for the client Response *http.Response // HTTP response that caused this error Message string `json:"message"` // error message } func (r *RateLimitError) Error() string { return fmt.Sprintf("%v %v: %d %v %v", r.Response.Request.Method, sanitizeURL(r.Response.Request.URL), r.Response.StatusCode, r.Message, formatRateReset(time.Until(r.Rate.Reset.Time))) } // Is returns whether the provided error equals this error. func (r *RateLimitError) Is(target error) bool { v, ok := target.(*RateLimitError) if !ok { return false } return r.Rate == v.Rate && r.Message == v.Message && compareHttpResponse(r.Response, v.Response) } // AcceptedError occurs when GitHub returns 202 Accepted response with an // empty body, which means a job was scheduled on the GitHub side to process // the information needed and cache it. // Technically, 202 Accepted is not a real error, it's just used to // indicate that results are not ready yet, but should be available soon. // The request can be repeated after some time. type AcceptedError struct { // Raw contains the response body. Raw []byte } func (*AcceptedError) Error() string { return "job scheduled on GitHub side; try again later" } // Is returns whether the provided error equals this error. func (ae *AcceptedError) Is(target error) bool { v, ok := target.(*AcceptedError) if !ok { return false } return bytes.Compare(ae.Raw, v.Raw) == 0 } // AbuseRateLimitError occurs when GitHub returns 403 Forbidden response with the // "documentation_url" field value equal to "https://docs.github.com/en/free-pro-team@latest/rest/reference/#abuse-rate-limits". type AbuseRateLimitError struct { Response *http.Response // HTTP response that caused this error Message string `json:"message"` // error message // RetryAfter is provided with some abuse rate limit errors. If present, // it is the amount of time that the client should wait before retrying. // Otherwise, the client should try again later (after an unspecified amount of time). RetryAfter *time.Duration } func (r *AbuseRateLimitError) Error() string { return fmt.Sprintf("%v %v: %d %v", r.Response.Request.Method, sanitizeURL(r.Response.Request.URL), r.Response.StatusCode, r.Message) } // Is returns whether the provided error equals this error. func (r *AbuseRateLimitError) Is(target error) bool { v, ok := target.(*AbuseRateLimitError) if !ok { return false } return r.Message == v.Message && r.RetryAfter == v.RetryAfter && compareHttpResponse(r.Response, v.Response) } // sanitizeURL redacts the client_secret parameter from the URL which may be // exposed to the user. func sanitizeURL(uri *url.URL) *url.URL { if uri == nil { return nil } params := uri.Query() if len(params.Get("client_secret")) > 0 { params.Set("client_secret", "REDACTED") uri.RawQuery = params.Encode() } return uri } /* An Error reports more details on an individual error in an ErrorResponse. These are the possible validation error codes: missing: resource does not exist missing_field: a required field on a resource has not been set invalid: the formatting of a field is invalid already_exists: another resource has the same valid as this field custom: some resources return this (e.g. github.User.CreateKey()), additional information is set in the Message field of the Error GitHub error responses structure are often undocumented and inconsistent. Sometimes error is just a simple string (Issue #540). In such cases, Message represents an error message as a workaround. GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/#client-errors */ type Error struct { Resource string `json:"resource"` // resource on which the error occurred Field string `json:"field"` // field on which the error occurred Code string `json:"code"` // validation error code Message string `json:"message"` // Message describing the error. Errors with Code == "custom" will always have this set. } func (e *Error) Error() string { return fmt.Sprintf("%v error caused by %v field on %v resource", e.Code, e.Field, e.Resource) } func (e *Error) UnmarshalJSON(data []byte) error { type aliasError Error // avoid infinite recursion by using type alias. if err := json.Unmarshal(data, (*aliasError)(e)); err != nil { return json.Unmarshal(data, &e.Message) // data can be json string. } return nil } // CheckResponse checks the API response for errors, and returns them if // present. A response is considered an error if it has a status code outside // the 200 range or equal to 202 Accepted. // API error responses are expected to have response // body, and a JSON response body that maps to ErrorResponse. // // The error type will be *RateLimitError for rate limit exceeded errors, // *AcceptedError for 202 Accepted status codes, // and *TwoFactorAuthError for two-factor authentication errors. func CheckResponse(r *http.Response) error { if r.StatusCode == http.StatusAccepted { return &AcceptedError{} } if c := r.StatusCode; 200 <= c && c <= 299 { return nil } errorResponse := &ErrorResponse{Response: r} data, err := ioutil.ReadAll(r.Body) if err == nil && data != nil { json.Unmarshal(data, errorResponse) } // Re-populate error response body because GitHub error responses are often // undocumented and inconsistent. // Issue #1136, #540. r.Body = ioutil.NopCloser(bytes.NewBuffer(data)) switch { case r.StatusCode == http.StatusUnauthorized && strings.HasPrefix(r.Header.Get(headerOTP), "required"): return (*TwoFactorAuthError)(errorResponse) case r.StatusCode == http.StatusForbidden && r.Header.Get(headerRateRemaining) == "0": return &RateLimitError{ Rate: parseRate(r), Response: errorResponse.Response, Message: errorResponse.Message, } case r.StatusCode == http.StatusForbidden && strings.HasSuffix(errorResponse.DocumentationURL, "#abuse-rate-limits"): abuseRateLimitError := &AbuseRateLimitError{ Response: errorResponse.Response, Message: errorResponse.Message, } if v := r.Header["Retry-After"]; len(v) > 0 { // According to GitHub support, the "Retry-After" header value will be // an integer which represents the number of seconds that one should // wait before resuming making requests. retryAfterSeconds, _ := strconv.ParseInt(v[0], 10, 64) // Error handling is noop. retryAfter := time.Duration(retryAfterSeconds) * time.Second abuseRateLimitError.RetryAfter = &retryAfter } return abuseRateLimitError default: return errorResponse } } // parseBoolResponse determines the boolean result from a GitHub API response. // Several GitHub API methods return boolean responses indicated by the HTTP // status code in the response (true indicated by a 204, false indicated by a // 404). This helper function will determine that result and hide the 404 // error if present. Any other error will be returned through as-is. func parseBoolResponse(err error) (bool, error) { if err == nil { return true, nil } if err, ok := err.(*ErrorResponse); ok && err.Response.StatusCode == http.StatusNotFound { // Simply false. In this one case, we do not pass the error through. return false, nil } // some other real error occurred return false, err } // Rate represents the rate limit for the current client. type Rate struct { // The number of requests per hour the client is currently limited to. Limit int `json:"limit"` // The number of remaining requests the client can make this hour. Remaining int `json:"remaining"` // The time at which the current rate limit will reset. Reset Timestamp `json:"reset"` } func (r Rate) String() string { return Stringify(r) } // RateLimits represents the rate limits for the current client. type RateLimits struct { // The rate limit for non-search API requests. Unauthenticated // requests are limited to 60 per hour. Authenticated requests are // limited to 5,000 per hour. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/#rate-limiting Core *Rate `json:"core"` // The rate limit for search API requests. Unauthenticated requests // are limited to 10 requests per minutes. Authenticated requests are // limited to 30 per minute. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/search/#rate-limit Search *Rate `json:"search"` } func (r RateLimits) String() string { return Stringify(r) } type rateLimitCategory uint8 const ( coreCategory rateLimitCategory = iota searchCategory categories // An array of this length will be able to contain all rate limit categories. ) // category returns the rate limit category of the endpoint, determined by Request.URL.Path. func category(path string) rateLimitCategory { switch { default: return coreCategory case strings.HasPrefix(path, "/search/"): return searchCategory } } // RateLimits returns the rate limits for the current client. func (c *Client) RateLimits(ctx context.Context) (*RateLimits, *Response, error) { req, err := c.NewRequest("GET", "rate_limit", nil) if err != nil { return nil, nil, err } response := new(struct { Resources *RateLimits `json:"resources"` }) // This resource is not subject to rate limits. ctx = context.WithValue(ctx, bypassRateLimitCheck, true) resp, err := c.Do(ctx, req, response) if err != nil { return nil, resp, err } if response.Resources != nil { c.rateMu.Lock() if response.Resources.Core != nil { c.rateLimits[coreCategory] = *response.Resources.Core } if response.Resources.Search != nil { c.rateLimits[searchCategory] = *response.Resources.Search } c.rateMu.Unlock() } return response.Resources, resp, nil } func setCredentialsAsHeaders(req *http.Request, id, secret string) *http.Request { // To set extra headers, we must make a copy of the Request so // that we don't modify the Request we were given. This is required by the // specification of http.RoundTripper. // // Since we are going to modify only req.Header here, we only need a deep copy // of req.Header. convertedRequest := new(http.Request) *convertedRequest = *req convertedRequest.Header = make(http.Header, len(req.Header)) for k, s := range req.Header { convertedRequest.Header[k] = append([]string(nil), s...) } convertedRequest.SetBasicAuth(id, secret) return convertedRequest } /* UnauthenticatedRateLimitedTransport allows you to make unauthenticated calls that need to use a higher rate limit associated with your OAuth application. t := &github.UnauthenticatedRateLimitedTransport{ ClientID: "your app's client ID", ClientSecret: "your app's client secret", } client := github.NewClient(t.Client()) This will add the client id and secret as a base64-encoded string in the format ClientID:ClientSecret and apply it as an "Authorization": "Basic" header. See https://docs.github.com/en/free-pro-team@latest/rest/reference/#unauthenticated-rate-limited-requests for more information. */ type UnauthenticatedRateLimitedTransport struct { // ClientID is the GitHub OAuth client ID of the current application, which // can be found by selecting its entry in the list at // https://github.com/settings/applications. ClientID string // ClientSecret is the GitHub OAuth client secret of the current // application. ClientSecret string // Transport is the underlying HTTP transport to use when making requests. // It will default to http.DefaultTransport if nil. Transport http.RoundTripper } // RoundTrip implements the RoundTripper interface. func (t *UnauthenticatedRateLimitedTransport) RoundTrip(req *http.Request) (*http.Response, error) { if t.ClientID == "" { return nil, errors.New("t.ClientID is empty") } if t.ClientSecret == "" { return nil, errors.New("t.ClientSecret is empty") } req2 := setCredentialsAsHeaders(req, t.ClientID, t.ClientSecret) // Make the HTTP request. return t.transport().RoundTrip(req2) } // Client returns an *http.Client that makes requests which are subject to the // rate limit of your OAuth application. func (t *UnauthenticatedRateLimitedTransport) Client() *http.Client { return &http.Client{Transport: t} } func (t *UnauthenticatedRateLimitedTransport) transport() http.RoundTripper { if t.Transport != nil { return t.Transport } return http.DefaultTransport } // BasicAuthTransport is an http.RoundTripper that authenticates all requests // using HTTP Basic Authentication with the provided username and password. It // additionally supports users who have two-factor authentication enabled on // their GitHub account. type BasicAuthTransport struct { Username string // GitHub username Password string // GitHub password OTP string // one-time password for users with two-factor auth enabled // Transport is the underlying HTTP transport to use when making requests. // It will default to http.DefaultTransport if nil. Transport http.RoundTripper } // RoundTrip implements the RoundTripper interface. func (t *BasicAuthTransport) RoundTrip(req *http.Request) (*http.Response, error) { req2 := setCredentialsAsHeaders(req, t.Username, t.Password) if t.OTP != "" { req2.Header.Set(headerOTP, t.OTP) } return t.transport().RoundTrip(req2) } // Client returns an *http.Client that makes requests that are authenticated // using HTTP Basic Authentication. func (t *BasicAuthTransport) Client() *http.Client { return &http.Client{Transport: t} } func (t *BasicAuthTransport) transport() http.RoundTripper { if t.Transport != nil { return t.Transport } return http.DefaultTransport } // formatRateReset formats d to look like "[rate reset in 2s]" or // "[rate reset in 87m02s]" for the positive durations. And like "[rate limit was reset 87m02s ago]" // for the negative cases. func formatRateReset(d time.Duration) string { isNegative := d < 0 if isNegative { d *= -1 } secondsTotal := int(0.5 + d.Seconds()) minutes := secondsTotal / 60 seconds := secondsTotal - minutes*60 var timeString string if minutes > 0 { timeString = fmt.Sprintf("%dm%02ds", minutes, seconds) } else { timeString = fmt.Sprintf("%ds", seconds) } if isNegative { return fmt.Sprintf("[rate limit was reset %v ago]", timeString) } return fmt.Sprintf("[rate reset in %v]", timeString) } // Bool is a helper routine that allocates a new bool value // to store v and returns a pointer to it. func Bool(v bool) *bool { return &v } // Int is a helper routine that allocates a new int value // to store v and returns a pointer to it. func Int(v int) *int { return &v } // Int64 is a helper routine that allocates a new int64 value // to store v and returns a pointer to it. func Int64(v int64) *int64 { return &v } // String is a helper routine that allocates a new string value // to store v and returns a pointer to it. func String(v string) *string { return &v } go-github-38.1.0/github/github_test.go000066400000000000000000001752641410475703100176430ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "errors" "fmt" "io/ioutil" "net/http" "net/http/httptest" "net/url" "os" "path" "reflect" "strings" "testing" "time" "github.com/google/go-cmp/cmp" ) const ( // baseURLPath is a non-empty Client.BaseURL path to use during tests, // to ensure relative URLs are used for all endpoints. See issue #752. baseURLPath = "/api-v3" ) // setup sets up a test HTTP server along with a github.Client that is // configured to talk to that test server. Tests should register handlers on // mux which provide mock responses for the API method being tested. func setup() (client *Client, mux *http.ServeMux, serverURL string, teardown func()) { // mux is the HTTP request multiplexer used with the test server. mux = http.NewServeMux() // We want to ensure that tests catch mistakes where the endpoint URL is // specified as absolute rather than relative. It only makes a difference // when there's a non-empty base URL path. So, use that. See issue #752. apiHandler := http.NewServeMux() apiHandler.Handle(baseURLPath+"/", http.StripPrefix(baseURLPath, mux)) apiHandler.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { fmt.Fprintln(os.Stderr, "FAIL: Client.BaseURL path prefix is not preserved in the request URL:") fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "\t"+req.URL.String()) fmt.Fprintln(os.Stderr) fmt.Fprintln(os.Stderr, "\tDid you accidentally use an absolute endpoint URL rather than relative?") fmt.Fprintln(os.Stderr, "\tSee https://github.com/google/go-github/issues/752 for information.") http.Error(w, "Client.BaseURL path prefix is not preserved in the request URL.", http.StatusInternalServerError) }) // server is a test HTTP server used to provide mock API responses. server := httptest.NewServer(apiHandler) // client is the GitHub client being tested and is // configured to use test server. client = NewClient(nil) url, _ := url.Parse(server.URL + baseURLPath + "/") client.BaseURL = url client.UploadURL = url return client, mux, server.URL, server.Close } // openTestFile creates a new file with the given name and content for testing. // In order to ensure the exact file name, this function will create a new temp // directory, and create the file in that directory. It is the caller's // responsibility to remove the directory and its contents when no longer needed. func openTestFile(name, content string) (file *os.File, dir string, err error) { dir, err = ioutil.TempDir("", "go-github") if err != nil { return nil, dir, err } file, err = os.OpenFile(path.Join(dir, name), os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) if err != nil { return nil, dir, err } fmt.Fprint(file, content) // close and re-open the file to keep file.Stat() happy file.Close() file, err = os.Open(file.Name()) if err != nil { return nil, dir, err } return file, dir, err } func testMethod(t *testing.T, r *http.Request, want string) { t.Helper() if got := r.Method; got != want { t.Errorf("Request method: %v, want %v", got, want) } } type values map[string]string func testFormValues(t *testing.T, r *http.Request, values values) { t.Helper() want := url.Values{} for k, v := range values { want.Set(k, v) } r.ParseForm() if got := r.Form; !cmp.Equal(got, want) { t.Errorf("Request parameters: %v, want %v", got, want) } } func testHeader(t *testing.T, r *http.Request, header string, want string) { t.Helper() if got := r.Header.Get(header); got != want { t.Errorf("Header.Get(%q) returned %q, want %q", header, got, want) } } func testURLParseError(t *testing.T, err error) { t.Helper() if err == nil { t.Errorf("Expected error to be returned") } if err, ok := err.(*url.Error); !ok || err.Op != "parse" { t.Errorf("Expected URL parse error, got %+v", err) } } func testBody(t *testing.T, r *http.Request, want string) { t.Helper() b, err := ioutil.ReadAll(r.Body) if err != nil { t.Errorf("Error reading request body: %v", err) } if got := string(b); got != want { t.Errorf("request Body is %s, want %s", got, want) } } // Test whether the marshaling of v produces JSON that corresponds // to the want string. func testJSONMarshal(t *testing.T, v interface{}, want string) { t.Helper() // Unmarshal the wanted JSON, to verify its correctness, and marshal it back // to sort the keys. u := reflect.New(reflect.TypeOf(v)).Interface() if err := json.Unmarshal([]byte(want), &u); err != nil { t.Errorf("Unable to unmarshal JSON for %v: %v", want, err) } w, err := json.Marshal(u) if err != nil { t.Errorf("Unable to marshal JSON for %#v", u) } // Marshal the target value. j, err := json.Marshal(v) if err != nil { t.Errorf("Unable to marshal JSON for %#v", v) } if string(w) != string(j) { t.Errorf("json.Marshal(%q) returned %s, want %s", v, j, w) } } // Test how bad options are handled. Method f under test should // return an error. func testBadOptions(t *testing.T, methodName string, f func() error) { t.Helper() if methodName == "" { t.Error("testBadOptions: must supply method methodName") } if err := f(); err == nil { t.Errorf("bad options %v err = nil, want error", methodName) } } // Test function under NewRequest failure and then s.client.Do failure. // Method f should be a regular call that would normally succeed, but // should return an error when NewRequest or s.client.Do fails. func testNewRequestAndDoFailure(t *testing.T, methodName string, client *Client, f func() (*Response, error)) { t.Helper() if methodName == "" { t.Error("testNewRequestAndDoFailure: must supply method methodName") } client.BaseURL.Path = "" resp, err := f() if resp != nil { t.Errorf("client.BaseURL.Path='' %v resp = %#v, want nil", methodName, resp) } if err == nil { t.Errorf("client.BaseURL.Path='' %v err = nil, want error", methodName) } client.BaseURL.Path = "/api-v3/" client.rateLimits[0].Reset.Time = time.Now().Add(10 * time.Minute) resp, err = f() if bypass := resp.Request.Context().Value(bypassRateLimitCheck); bypass != nil { return } if want := http.StatusForbidden; resp == nil || resp.Response.StatusCode != want { if resp != nil { t.Errorf("rate.Reset.Time > now %v resp = %#v, want StatusCode=%v", methodName, resp.Response, want) } else { t.Errorf("rate.Reset.Time > now %v resp = nil, want StatusCode=%v", methodName, want) } } if err == nil { t.Errorf("rate.Reset.Time > now %v err = nil, want error", methodName) } } func TestNewClient(t *testing.T) { c := NewClient(nil) if got, want := c.BaseURL.String(), defaultBaseURL; got != want { t.Errorf("NewClient BaseURL is %v, want %v", got, want) } if got, want := c.UserAgent, userAgent; got != want { t.Errorf("NewClient UserAgent is %v, want %v", got, want) } c2 := NewClient(nil) if c.client == c2.client { t.Error("NewClient returned same http.Clients, but they should differ") } } func TestClient(t *testing.T) { c := NewClient(nil) c2 := c.Client() if c.client == c2 { t.Error("Client returned same http.Client, but should be different") } } func TestNewEnterpriseClient(t *testing.T) { baseURL := "https://custom-url/api/v3/" uploadURL := "https://custom-upload-url/api/uploads/" c, err := NewEnterpriseClient(baseURL, uploadURL, nil) if err != nil { t.Fatalf("NewEnterpriseClient returned unexpected error: %v", err) } if got, want := c.BaseURL.String(), baseURL; got != want { t.Errorf("NewClient BaseURL is %v, want %v", got, want) } if got, want := c.UploadURL.String(), uploadURL; got != want { t.Errorf("NewClient UploadURL is %v, want %v", got, want) } } func TestNewEnterpriseClient_addsTrailingSlashToURLs(t *testing.T) { baseURL := "https://custom-url/api/v3" uploadURL := "https://custom-upload-url/api/uploads" formattedBaseURL := baseURL + "/" formattedUploadURL := uploadURL + "/" c, err := NewEnterpriseClient(baseURL, uploadURL, nil) if err != nil { t.Fatalf("NewEnterpriseClient returned unexpected error: %v", err) } if got, want := c.BaseURL.String(), formattedBaseURL; got != want { t.Errorf("NewClient BaseURL is %v, want %v", got, want) } if got, want := c.UploadURL.String(), formattedUploadURL; got != want { t.Errorf("NewClient UploadURL is %v, want %v", got, want) } } func TestNewEnterpriseClient_addsEnterpriseSuffixToURLs(t *testing.T) { baseURL := "https://custom-url/" uploadURL := "https://custom-upload-url/" formattedBaseURL := baseURL + "api/v3/" formattedUploadURL := uploadURL + "api/uploads/" c, err := NewEnterpriseClient(baseURL, uploadURL, nil) if err != nil { t.Fatalf("NewEnterpriseClient returned unexpected error: %v", err) } if got, want := c.BaseURL.String(), formattedBaseURL; got != want { t.Errorf("NewClient BaseURL is %v, want %v", got, want) } if got, want := c.UploadURL.String(), formattedUploadURL; got != want { t.Errorf("NewClient UploadURL is %v, want %v", got, want) } } func TestNewEnterpriseClient_addsEnterpriseSuffixAndTrailingSlashToURLs(t *testing.T) { baseURL := "https://custom-url" uploadURL := "https://custom-upload-url" formattedBaseURL := baseURL + "/api/v3/" formattedUploadURL := uploadURL + "/api/uploads/" c, err := NewEnterpriseClient(baseURL, uploadURL, nil) if err != nil { t.Fatalf("NewEnterpriseClient returned unexpected error: %v", err) } if got, want := c.BaseURL.String(), formattedBaseURL; got != want { t.Errorf("NewClient BaseURL is %v, want %v", got, want) } if got, want := c.UploadURL.String(), formattedUploadURL; got != want { t.Errorf("NewClient UploadURL is %v, want %v", got, want) } } func TestNewEnterpriseClient_badBaseURL(t *testing.T) { baseURL := "bogus\nbase\nURL" uploadURL := "https://custom-upload-url/api/uploads/" if _, err := NewEnterpriseClient(baseURL, uploadURL, nil); err == nil { t.Fatal("NewEnterpriseClient returned nil, expected error") } } func TestNewEnterpriseClient_badUploadURL(t *testing.T) { baseURL := "https://custom-url/api/v3/" uploadURL := "bogus\nupload\nURL" if _, err := NewEnterpriseClient(baseURL, uploadURL, nil); err == nil { t.Fatal("NewEnterpriseClient returned nil, expected error") } } func TestNewEnterpriseClient_URLHasExistingAPIPrefix_AddTrailingSlash(t *testing.T) { baseURL := "https://api.custom-url" uploadURL := "https://api.custom-upload-url" formattedBaseURL := baseURL + "/" formattedUploadURL := uploadURL + "/" c, err := NewEnterpriseClient(baseURL, uploadURL, nil) if err != nil { t.Fatalf("NewEnterpriseClient returned unexpected error: %v", err) } if got, want := c.BaseURL.String(), formattedBaseURL; got != want { t.Errorf("NewClient BaseURL is %v, want %v", got, want) } if got, want := c.UploadURL.String(), formattedUploadURL; got != want { t.Errorf("NewClient UploadURL is %v, want %v", got, want) } } func TestNewEnterpriseClient_URLHasExistingAPIPrefixAndTrailingSlash(t *testing.T) { baseURL := "https://api.custom-url/" uploadURL := "https://api.custom-upload-url/" c, err := NewEnterpriseClient(baseURL, uploadURL, nil) if err != nil { t.Fatalf("NewEnterpriseClient returned unexpected error: %v", err) } if got, want := c.BaseURL.String(), baseURL; got != want { t.Errorf("NewClient BaseURL is %v, want %v", got, want) } if got, want := c.UploadURL.String(), uploadURL; got != want { t.Errorf("NewClient UploadURL is %v, want %v", got, want) } } func TestNewEnterpriseClient_URLHasAPISubdomain_AddTrailingSlash(t *testing.T) { baseURL := "https://catalog.api.custom-url" uploadURL := "https://catalog.api.custom-upload-url" formattedBaseURL := baseURL + "/" formattedUploadURL := uploadURL + "/" c, err := NewEnterpriseClient(baseURL, uploadURL, nil) if err != nil { t.Fatalf("NewEnterpriseClient returned unexpected error: %v", err) } if got, want := c.BaseURL.String(), formattedBaseURL; got != want { t.Errorf("NewClient BaseURL is %v, want %v", got, want) } if got, want := c.UploadURL.String(), formattedUploadURL; got != want { t.Errorf("NewClient UploadURL is %v, want %v", got, want) } } func TestNewEnterpriseClient_URLHasAPISubdomainAndTrailingSlash(t *testing.T) { baseURL := "https://catalog.api.custom-url/" uploadURL := "https://catalog.api.custom-upload-url/" c, err := NewEnterpriseClient(baseURL, uploadURL, nil) if err != nil { t.Fatalf("NewEnterpriseClient returned unexpected error: %v", err) } if got, want := c.BaseURL.String(), baseURL; got != want { t.Errorf("NewClient BaseURL is %v, want %v", got, want) } if got, want := c.UploadURL.String(), uploadURL; got != want { t.Errorf("NewClient UploadURL is %v, want %v", got, want) } } func TestNewEnterpriseClient_URLIsNotAProperAPISubdomain_addsEnterpriseSuffixAndSlash(t *testing.T) { baseURL := "https://cloud-api.custom-url" uploadURL := "https://cloud-api.custom-upload-url" formattedBaseURL := baseURL + "/api/v3/" formattedUploadURL := uploadURL + "/api/uploads/" c, err := NewEnterpriseClient(baseURL, uploadURL, nil) if err != nil { t.Fatalf("NewEnterpriseClient returned unexpected error: %v", err) } if got, want := c.BaseURL.String(), formattedBaseURL; got != want { t.Errorf("NewClient BaseURL is %v, want %v", got, want) } if got, want := c.UploadURL.String(), formattedUploadURL; got != want { t.Errorf("NewClient UploadURL is %v, want %v", got, want) } } func TestNewEnterpriseClient_URLIsNotAProperAPISubdomain_addsEnterpriseSuffix(t *testing.T) { baseURL := "https://cloud-api.custom-url/" uploadURL := "https://cloud-api.custom-upload-url/" formattedBaseURL := baseURL + "api/v3/" formattedUploadURL := uploadURL + "api/uploads/" c, err := NewEnterpriseClient(baseURL, uploadURL, nil) if err != nil { t.Fatalf("NewEnterpriseClient returned unexpected error: %v", err) } if got, want := c.BaseURL.String(), formattedBaseURL; got != want { t.Errorf("NewClient BaseURL is %v, want %v", got, want) } if got, want := c.UploadURL.String(), formattedUploadURL; got != want { t.Errorf("NewClient UploadURL is %v, want %v", got, want) } } // Ensure that length of Client.rateLimits is the same as number of fields in RateLimits struct. func TestClient_rateLimits(t *testing.T) { if got, want := len(Client{}.rateLimits), reflect.TypeOf(RateLimits{}).NumField(); got != want { t.Errorf("len(Client{}.rateLimits) is %v, want %v", got, want) } } func TestRateLimits_String(t *testing.T) { v := RateLimits{ Core: &Rate{}, Search: &Rate{}, } want := `github.RateLimits{Core:github.Rate{Limit:0, Remaining:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}, Search:github.Rate{Limit:0, Remaining:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}}` if got := v.String(); got != want { t.Errorf("RateLimits.String = %v, want %v", got, want) } } func TestNewRequest(t *testing.T) { c := NewClient(nil) inURL, outURL := "/foo", defaultBaseURL+"foo" inBody, outBody := &User{Login: String("l")}, `{"login":"l"}`+"\n" req, _ := c.NewRequest("GET", inURL, inBody) // test that relative URL was expanded if got, want := req.URL.String(), outURL; got != want { t.Errorf("NewRequest(%q) URL is %v, want %v", inURL, got, want) } // test that body was JSON encoded body, _ := ioutil.ReadAll(req.Body) if got, want := string(body), outBody; got != want { t.Errorf("NewRequest(%q) Body is %v, want %v", inBody, got, want) } // test that default user-agent is attached to the request if got, want := req.Header.Get("User-Agent"), c.UserAgent; got != want { t.Errorf("NewRequest() User-Agent is %v, want %v", got, want) } } func TestNewRequest_invalidJSON(t *testing.T) { c := NewClient(nil) type T struct { A map[interface{}]interface{} } _, err := c.NewRequest("GET", ".", &T{}) if err == nil { t.Error("Expected error to be returned.") } if err, ok := err.(*json.UnsupportedTypeError); !ok { t.Errorf("Expected a JSON error; got %#v.", err) } } func TestNewRequest_badURL(t *testing.T) { c := NewClient(nil) _, err := c.NewRequest("GET", ":", nil) testURLParseError(t, err) } func TestNewRequest_badMethod(t *testing.T) { c := NewClient(nil) if _, err := c.NewRequest("BOGUS\nMETHOD", ".", nil); err == nil { t.Fatal("NewRequest returned nil; expected error") } } // ensure that no User-Agent header is set if the client's UserAgent is empty. // This caused a problem with Google's internal http client. func TestNewRequest_emptyUserAgent(t *testing.T) { c := NewClient(nil) c.UserAgent = "" req, err := c.NewRequest("GET", ".", nil) if err != nil { t.Fatalf("NewRequest returned unexpected error: %v", err) } if _, ok := req.Header["User-Agent"]; ok { t.Fatal("constructed request contains unexpected User-Agent header") } } // If a nil body is passed to github.NewRequest, make sure that nil is also // passed to http.NewRequest. In most cases, passing an io.Reader that returns // no content is fine, since there is no difference between an HTTP request // body that is an empty string versus one that is not set at all. However in // certain cases, intermediate systems may treat these differently resulting in // subtle errors. func TestNewRequest_emptyBody(t *testing.T) { c := NewClient(nil) req, err := c.NewRequest("GET", ".", nil) if err != nil { t.Fatalf("NewRequest returned unexpected error: %v", err) } if req.Body != nil { t.Fatalf("constructed request contains a non-nil Body") } } func TestNewRequest_errorForNoTrailingSlash(t *testing.T) { tests := []struct { rawurl string wantError bool }{ {rawurl: "https://example.com/api/v3", wantError: true}, {rawurl: "https://example.com/api/v3/", wantError: false}, } c := NewClient(nil) for _, test := range tests { u, err := url.Parse(test.rawurl) if err != nil { t.Fatalf("url.Parse returned unexpected error: %v.", err) } c.BaseURL = u if _, err := c.NewRequest(http.MethodGet, "test", nil); test.wantError && err == nil { t.Fatalf("Expected error to be returned.") } else if !test.wantError && err != nil { t.Fatalf("NewRequest returned unexpected error: %v.", err) } } } func TestNewUploadRequest_badURL(t *testing.T) { c := NewClient(nil) _, err := c.NewUploadRequest(":", nil, 0, "") testURLParseError(t, err) } func TestNewUploadRequest_errorForNoTrailingSlash(t *testing.T) { tests := []struct { rawurl string wantError bool }{ {rawurl: "https://example.com/api/uploads", wantError: true}, {rawurl: "https://example.com/api/uploads/", wantError: false}, } c := NewClient(nil) for _, test := range tests { u, err := url.Parse(test.rawurl) if err != nil { t.Fatalf("url.Parse returned unexpected error: %v.", err) } c.UploadURL = u if _, err = c.NewUploadRequest("test", nil, 0, ""); test.wantError && err == nil { t.Fatalf("Expected error to be returned.") } else if !test.wantError && err != nil { t.Fatalf("NewUploadRequest returned unexpected error: %v.", err) } } } func TestResponse_populatePageValues(t *testing.T) { r := http.Response{ Header: http.Header{ "Link": {`; rel="first",` + ` ; rel="prev",` + ` ; rel="next",` + ` ; rel="last"`, }, }, } response := newResponse(&r) if got, want := response.FirstPage, 1; got != want { t.Errorf("response.FirstPage: %v, want %v", got, want) } if got, want := response.PrevPage, 2; want != got { t.Errorf("response.PrevPage: %v, want %v", got, want) } if got, want := response.NextPage, 4; want != got { t.Errorf("response.NextPage: %v, want %v", got, want) } if got, want := response.LastPage, 5; want != got { t.Errorf("response.LastPage: %v, want %v", got, want) } if got, want := response.NextPageToken, ""; want != got { t.Errorf("response.NextPageToken: %v, want %v", got, want) } } func TestResponse_cursorPagination(t *testing.T) { r := http.Response{ Header: http.Header{ "Status": {"200 OK"}, "Link": {`; rel="next"`}, }, } response := newResponse(&r) if got, want := response.FirstPage, 0; got != want { t.Errorf("response.FirstPage: %v, want %v", got, want) } if got, want := response.PrevPage, 0; want != got { t.Errorf("response.PrevPage: %v, want %v", got, want) } if got, want := response.NextPage, 0; want != got { t.Errorf("response.NextPage: %v, want %v", got, want) } if got, want := response.LastPage, 0; want != got { t.Errorf("response.LastPage: %v, want %v", got, want) } if got, want := response.NextPageToken, "url-encoded-next-page-token"; want != got { t.Errorf("response.NextPageToken: %v, want %v", got, want) } // cursor-based pagination with "cursor" param r = http.Response{ Header: http.Header{ "Link": { `; rel="next"`, }, }, } response = newResponse(&r) if got, want := response.Cursor, "v1_12345678"; got != want { t.Errorf("response.Cursor: %v, want %v", got, want) } } func TestResponse_populatePageValues_invalid(t *testing.T) { r := http.Response{ Header: http.Header{ "Link": {`,` + `; rel="first",` + `https://api.github.com/?page=2; rel="prev",` + `; rel="next",` + `; rel="last"`, }, }, } response := newResponse(&r) if got, want := response.FirstPage, 0; got != want { t.Errorf("response.FirstPage: %v, want %v", got, want) } if got, want := response.PrevPage, 0; got != want { t.Errorf("response.PrevPage: %v, want %v", got, want) } if got, want := response.NextPage, 0; got != want { t.Errorf("response.NextPage: %v, want %v", got, want) } if got, want := response.LastPage, 0; got != want { t.Errorf("response.LastPage: %v, want %v", got, want) } // more invalid URLs r = http.Response{ Header: http.Header{ "Link": {`; rel="first"`}, }, } response = newResponse(&r) if got, want := response.FirstPage, 0; got != want { t.Errorf("response.FirstPage: %v, want %v", got, want) } } func TestDo(t *testing.T) { client, mux, _, teardown := setup() defer teardown() type foo struct { A string } mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"A":"a"}`) }) req, _ := client.NewRequest("GET", ".", nil) body := new(foo) ctx := context.Background() client.Do(ctx, req, body) want := &foo{"a"} if !cmp.Equal(body, want) { t.Errorf("Response body = %v, want %v", body, want) } } func TestDo_nilContext(t *testing.T) { client, _, _, teardown := setup() defer teardown() req, _ := client.NewRequest("GET", ".", nil) _, err := client.Do(nil, req, nil) if !errors.Is(err, errNonNilContext) { t.Errorf("Expected context must be non-nil error") } } func TestDo_httpError(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.Error(w, "Bad Request", 400) }) req, _ := client.NewRequest("GET", ".", nil) ctx := context.Background() resp, err := client.Do(ctx, req, nil) if err == nil { t.Fatal("Expected HTTP 400 error, got no error.") } if resp.StatusCode != 400 { t.Errorf("Expected HTTP 400 error, got %d status code.", resp.StatusCode) } } // Test handling of an error caused by the internal http client's Do() // function. A redirect loop is pretty unlikely to occur within the GitHub // API, but does allow us to exercise the right code path. func TestDo_redirectLoop(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, baseURLPath, http.StatusFound) }) req, _ := client.NewRequest("GET", ".", nil) ctx := context.Background() _, err := client.Do(ctx, req, nil) if err == nil { t.Error("Expected error to be returned.") } if err, ok := err.(*url.Error); !ok { t.Errorf("Expected a URL error; got %#v.", err) } } // Test that an error caused by the internal http client's Do() function // does not leak the client secret. func TestDo_sanitizeURL(t *testing.T) { tp := &UnauthenticatedRateLimitedTransport{ ClientID: "id", ClientSecret: "secret", } unauthedClient := NewClient(tp.Client()) unauthedClient.BaseURL = &url.URL{Scheme: "http", Host: "127.0.0.1:0", Path: "/"} // Use port 0 on purpose to trigger a dial TCP error, expect to get "dial tcp 127.0.0.1:0: connect: can't assign requested address". req, err := unauthedClient.NewRequest("GET", ".", nil) if err != nil { t.Fatalf("NewRequest returned unexpected error: %v", err) } ctx := context.Background() _, err = unauthedClient.Do(ctx, req, nil) if err == nil { t.Fatal("Expected error to be returned.") } if strings.Contains(err.Error(), "client_secret=secret") { t.Errorf("Do error contains secret, should be redacted:\n%q", err) } } func TestDo_rateLimit(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Header().Set(headerRateLimit, "60") w.Header().Set(headerRateRemaining, "59") w.Header().Set(headerRateReset, "1372700873") }) req, _ := client.NewRequest("GET", ".", nil) ctx := context.Background() resp, err := client.Do(ctx, req, nil) if err != nil { t.Errorf("Do returned unexpected error: %v", err) } if got, want := resp.Rate.Limit, 60; got != want { t.Errorf("Client rate limit = %v, want %v", got, want) } if got, want := resp.Rate.Remaining, 59; got != want { t.Errorf("Client rate remaining = %v, want %v", got, want) } reset := time.Date(2013, time.July, 1, 17, 47, 53, 0, time.UTC) if resp.Rate.Reset.UTC() != reset { t.Errorf("Client rate reset = %v, want %v", resp.Rate.Reset, reset) } } // ensure rate limit is still parsed, even for error responses func TestDo_rateLimit_errorResponse(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Header().Set(headerRateLimit, "60") w.Header().Set(headerRateRemaining, "59") w.Header().Set(headerRateReset, "1372700873") http.Error(w, "Bad Request", 400) }) req, _ := client.NewRequest("GET", ".", nil) ctx := context.Background() resp, err := client.Do(ctx, req, nil) if err == nil { t.Error("Expected error to be returned.") } if _, ok := err.(*RateLimitError); ok { t.Errorf("Did not expect a *RateLimitError error; got %#v.", err) } if got, want := resp.Rate.Limit, 60; got != want { t.Errorf("Client rate limit = %v, want %v", got, want) } if got, want := resp.Rate.Remaining, 59; got != want { t.Errorf("Client rate remaining = %v, want %v", got, want) } reset := time.Date(2013, time.July, 1, 17, 47, 53, 0, time.UTC) if resp.Rate.Reset.UTC() != reset { t.Errorf("Client rate reset = %v, want %v", resp.Rate.Reset, reset) } } // Ensure *RateLimitError is returned when API rate limit is exceeded. func TestDo_rateLimit_rateLimitError(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Header().Set(headerRateLimit, "60") w.Header().Set(headerRateRemaining, "0") w.Header().Set(headerRateReset, "1372700873") w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(http.StatusForbidden) fmt.Fprintln(w, `{ "message": "API rate limit exceeded for xxx.xxx.xxx.xxx. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)", "documentation_url": "https://docs.github.com/en/free-pro-team@latest/rest/overview/resources-in-the-rest-api#abuse-rate-limits" }`) }) req, _ := client.NewRequest("GET", ".", nil) ctx := context.Background() _, err := client.Do(ctx, req, nil) if err == nil { t.Error("Expected error to be returned.") } rateLimitErr, ok := err.(*RateLimitError) if !ok { t.Fatalf("Expected a *RateLimitError error; got %#v.", err) } if got, want := rateLimitErr.Rate.Limit, 60; got != want { t.Errorf("rateLimitErr rate limit = %v, want %v", got, want) } if got, want := rateLimitErr.Rate.Remaining, 0; got != want { t.Errorf("rateLimitErr rate remaining = %v, want %v", got, want) } reset := time.Date(2013, time.July, 1, 17, 47, 53, 0, time.UTC) if rateLimitErr.Rate.Reset.UTC() != reset { t.Errorf("rateLimitErr rate reset = %v, want %v", rateLimitErr.Rate.Reset.UTC(), reset) } } // Ensure a network call is not made when it's known that API rate limit is still exceeded. func TestDo_rateLimit_noNetworkCall(t *testing.T) { client, mux, _, teardown := setup() defer teardown() reset := time.Now().UTC().Add(time.Minute).Round(time.Second) // Rate reset is a minute from now, with 1 second precision. mux.HandleFunc("/first", func(w http.ResponseWriter, r *http.Request) { w.Header().Set(headerRateLimit, "60") w.Header().Set(headerRateRemaining, "0") w.Header().Set(headerRateReset, fmt.Sprint(reset.Unix())) w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(http.StatusForbidden) fmt.Fprintln(w, `{ "message": "API rate limit exceeded for xxx.xxx.xxx.xxx. (But here's the good news: Authenticated requests get a higher rate limit. Check out the documentation for more details.)", "documentation_url": "https://docs.github.com/en/free-pro-team@latest/rest/overview/resources-in-the-rest-api#abuse-rate-limits" }`) }) madeNetworkCall := false mux.HandleFunc("/second", func(w http.ResponseWriter, r *http.Request) { madeNetworkCall = true }) // First request is made, and it makes the client aware of rate reset time being in the future. req, _ := client.NewRequest("GET", "first", nil) ctx := context.Background() client.Do(ctx, req, nil) // Second request should not cause a network call to be made, since client can predict a rate limit error. req, _ = client.NewRequest("GET", "second", nil) _, err := client.Do(ctx, req, nil) if madeNetworkCall { t.Fatal("Network call was made, even though rate limit is known to still be exceeded.") } if err == nil { t.Error("Expected error to be returned.") } rateLimitErr, ok := err.(*RateLimitError) if !ok { t.Fatalf("Expected a *RateLimitError error; got %#v.", err) } if got, want := rateLimitErr.Rate.Limit, 60; got != want { t.Errorf("rateLimitErr rate limit = %v, want %v", got, want) } if got, want := rateLimitErr.Rate.Remaining, 0; got != want { t.Errorf("rateLimitErr rate remaining = %v, want %v", got, want) } if rateLimitErr.Rate.Reset.UTC() != reset { t.Errorf("rateLimitErr rate reset = %v, want %v", rateLimitErr.Rate.Reset.UTC(), reset) } } // Ensure *AbuseRateLimitError is returned when the response indicates that // the client has triggered an abuse detection mechanism. func TestDo_rateLimit_abuseRateLimitError(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(http.StatusForbidden) // When the abuse rate limit error is of the "temporarily blocked from content creation" type, // there is no "Retry-After" header. fmt.Fprintln(w, `{ "message": "You have triggered an abuse detection mechanism and have been temporarily blocked from content creation. Please retry your request again later.", "documentation_url": "https://docs.github.com/en/free-pro-team@latest/rest/overview/resources-in-the-rest-api#abuse-rate-limits" }`) }) req, _ := client.NewRequest("GET", ".", nil) ctx := context.Background() _, err := client.Do(ctx, req, nil) if err == nil { t.Error("Expected error to be returned.") } abuseRateLimitErr, ok := err.(*AbuseRateLimitError) if !ok { t.Fatalf("Expected a *AbuseRateLimitError error; got %#v.", err) } if got, want := abuseRateLimitErr.RetryAfter, (*time.Duration)(nil); got != want { t.Errorf("abuseRateLimitErr RetryAfter = %v, want %v", got, want) } } // Ensure *AbuseRateLimitError is returned when the response indicates that // the client has triggered an abuse detection mechanism on GitHub Enterprise. func TestDo_rateLimit_abuseRateLimitErrorEnterprise(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(http.StatusForbidden) // When the abuse rate limit error is of the "temporarily blocked from content creation" type, // there is no "Retry-After" header. // This response returns a documentation url like the one returned for GitHub Enterprise, this // url changes between versions but follows roughly the same format. fmt.Fprintln(w, `{ "message": "You have triggered an abuse detection mechanism and have been temporarily blocked from content creation. Please retry your request again later.", "documentation_url": "https://docs.github.com/en/free-pro-team@latest/rest/overview/resources-in-the-rest-api#abuse-rate-limits" }`) }) req, _ := client.NewRequest("GET", ".", nil) ctx := context.Background() _, err := client.Do(ctx, req, nil) if err == nil { t.Error("Expected error to be returned.") } abuseRateLimitErr, ok := err.(*AbuseRateLimitError) if !ok { t.Fatalf("Expected a *AbuseRateLimitError error; got %#v.", err) } if got, want := abuseRateLimitErr.RetryAfter, (*time.Duration)(nil); got != want { t.Errorf("abuseRateLimitErr RetryAfter = %v, want %v", got, want) } } // Ensure *AbuseRateLimitError.RetryAfter is parsed correctly. func TestDo_rateLimit_abuseRateLimitError_retryAfter(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Header().Set("Retry-After", "123") // Retry after value of 123 seconds. w.WriteHeader(http.StatusForbidden) fmt.Fprintln(w, `{ "message": "You have triggered an abuse detection mechanism ...", "documentation_url": "https://docs.github.com/en/free-pro-team@latest/rest/overview/resources-in-the-rest-api#abuse-rate-limits" }`) }) req, _ := client.NewRequest("GET", ".", nil) ctx := context.Background() _, err := client.Do(ctx, req, nil) if err == nil { t.Error("Expected error to be returned.") } abuseRateLimitErr, ok := err.(*AbuseRateLimitError) if !ok { t.Fatalf("Expected a *AbuseRateLimitError error; got %#v.", err) } if abuseRateLimitErr.RetryAfter == nil { t.Fatalf("abuseRateLimitErr RetryAfter is nil, expected not-nil") } if got, want := *abuseRateLimitErr.RetryAfter, 123*time.Second; got != want { t.Errorf("abuseRateLimitErr RetryAfter = %v, want %v", got, want) } } func TestDo_noContent(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNoContent) }) var body json.RawMessage req, _ := client.NewRequest("GET", ".", nil) ctx := context.Background() _, err := client.Do(ctx, req, &body) if err != nil { t.Fatalf("Do returned unexpected error: %v", err) } } func TestSanitizeURL(t *testing.T) { tests := []struct { in, want string }{ {"/?a=b", "/?a=b"}, {"/?a=b&client_secret=secret", "/?a=b&client_secret=REDACTED"}, {"/?a=b&client_id=id&client_secret=secret", "/?a=b&client_id=id&client_secret=REDACTED"}, } for _, tt := range tests { inURL, _ := url.Parse(tt.in) want, _ := url.Parse(tt.want) if got := sanitizeURL(inURL); !cmp.Equal(got, want) { t.Errorf("sanitizeURL(%v) returned %v, want %v", tt.in, got, want) } } } func TestCheckResponse(t *testing.T) { res := &http.Response{ Request: &http.Request{}, StatusCode: http.StatusBadRequest, Body: ioutil.NopCloser(strings.NewReader(`{"message":"m", "errors": [{"resource": "r", "field": "f", "code": "c"}], "block": {"reason": "dmca", "created_at": "2016-03-17T15:39:46Z"}}`)), } err := CheckResponse(res).(*ErrorResponse) if err == nil { t.Errorf("Expected error response.") } want := &ErrorResponse{ Response: res, Message: "m", Errors: []Error{{Resource: "r", Field: "f", Code: "c"}}, Block: &ErrorBlock{ Reason: "dmca", CreatedAt: &Timestamp{time.Date(2016, time.March, 17, 15, 39, 46, 0, time.UTC)}, }, } if !errors.Is(err, want) { t.Errorf("Error = %#v, want %#v", err, want) } } func TestCheckResponse_RateLimit(t *testing.T) { res := &http.Response{ Request: &http.Request{}, StatusCode: http.StatusForbidden, Header: http.Header{}, Body: ioutil.NopCloser(strings.NewReader(`{"message":"m", "documentation_url": "url"}`)), } res.Header.Set(headerRateLimit, "60") res.Header.Set(headerRateRemaining, "0") res.Header.Set(headerRateReset, "243424") err := CheckResponse(res).(*RateLimitError) if err == nil { t.Errorf("Expected error response.") } want := &RateLimitError{ Rate: parseRate(res), Response: res, Message: "m", } if !errors.Is(err, want) { t.Errorf("Error = %#v, want %#v", err, want) } } func TestCheckResponse_AbuseRateLimit(t *testing.T) { res := &http.Response{ Request: &http.Request{}, StatusCode: http.StatusForbidden, Body: ioutil.NopCloser(strings.NewReader(`{"message":"m", "documentation_url": "docs.github.com/en/free-pro-team@latest/rest/overview/resources-in-the-rest-api#abuse-rate-limits"}`)), } err := CheckResponse(res).(*AbuseRateLimitError) if err == nil { t.Errorf("Expected error response.") } want := &AbuseRateLimitError{ Response: res, Message: "m", } if !errors.Is(err, want) { t.Errorf("Error = %#v, want %#v", err, want) } } func TestCompareHttpResponse(t *testing.T) { testcases := map[string]struct { h1 *http.Response h2 *http.Response expected bool }{ "both are nil": { expected: true, }, "both are non nil - same StatusCode": { expected: true, h1: &http.Response{StatusCode: 200}, h2: &http.Response{StatusCode: 200}, }, "both are non nil - different StatusCode": { expected: false, h1: &http.Response{StatusCode: 200}, h2: &http.Response{StatusCode: 404}, }, "one is nil, other is not": { expected: false, h2: &http.Response{}, }, } for name, tc := range testcases { t.Run(name, func(t *testing.T) { v := compareHttpResponse(tc.h1, tc.h2) if tc.expected != v { t.Errorf("Expected %t, got %t for (%#v, %#v)", tc.expected, v, tc.h1, tc.h2) } }) } } func TestErrorResponse_Is(t *testing.T) { err := &ErrorResponse{ Response: &http.Response{}, Message: "m", Errors: []Error{{Resource: "r", Field: "f", Code: "c"}}, Block: &ErrorBlock{ Reason: "r", CreatedAt: &Timestamp{time.Date(2016, time.March, 17, 15, 39, 46, 0, time.UTC)}, }, DocumentationURL: "https://github.com", } testcases := map[string]struct { wantSame bool otherError error }{ "errors are same": { wantSame: true, otherError: &ErrorResponse{ Response: &http.Response{}, Errors: []Error{{Resource: "r", Field: "f", Code: "c"}}, Message: "m", Block: &ErrorBlock{ Reason: "r", CreatedAt: &Timestamp{time.Date(2016, time.March, 17, 15, 39, 46, 0, time.UTC)}, }, DocumentationURL: "https://github.com", }, }, "errors have different values - Message": { wantSame: false, otherError: &ErrorResponse{ Response: &http.Response{}, Errors: []Error{{Resource: "r", Field: "f", Code: "c"}}, Message: "m1", Block: &ErrorBlock{ Reason: "r", CreatedAt: &Timestamp{time.Date(2016, time.March, 17, 15, 39, 46, 0, time.UTC)}, }, DocumentationURL: "https://github.com", }, }, "errors have different values - DocumentationURL": { wantSame: false, otherError: &ErrorResponse{ Response: &http.Response{}, Errors: []Error{{Resource: "r", Field: "f", Code: "c"}}, Message: "m", Block: &ErrorBlock{ Reason: "r", CreatedAt: &Timestamp{time.Date(2016, time.March, 17, 15, 39, 46, 0, time.UTC)}, }, DocumentationURL: "https://google.com", }, }, "errors have different values - Response is nil": { wantSame: false, otherError: &ErrorResponse{ Errors: []Error{{Resource: "r", Field: "f", Code: "c"}}, Message: "m", Block: &ErrorBlock{ Reason: "r", CreatedAt: &Timestamp{time.Date(2016, time.March, 17, 15, 39, 46, 0, time.UTC)}, }, DocumentationURL: "https://github.com", }, }, "errors have different values - Errors": { wantSame: false, otherError: &ErrorResponse{ Response: &http.Response{}, Errors: []Error{{Resource: "r1", Field: "f1", Code: "c1"}}, Message: "m", Block: &ErrorBlock{ Reason: "r", CreatedAt: &Timestamp{time.Date(2016, time.March, 17, 15, 39, 46, 0, time.UTC)}, }, DocumentationURL: "https://github.com", }, }, "errors have different values - Errors have different length": { wantSame: false, otherError: &ErrorResponse{ Response: &http.Response{}, Errors: []Error{}, Message: "m", Block: &ErrorBlock{ Reason: "r", CreatedAt: &Timestamp{time.Date(2016, time.March, 17, 15, 39, 46, 0, time.UTC)}, }, DocumentationURL: "https://github.com", }, }, "errors have different values - Block - one is nil, other is not": { wantSame: false, otherError: &ErrorResponse{ Response: &http.Response{}, Errors: []Error{{Resource: "r", Field: "f", Code: "c"}}, Message: "m", DocumentationURL: "https://github.com", }, }, "errors have different values - Block - different Reason": { wantSame: false, otherError: &ErrorResponse{ Response: &http.Response{}, Errors: []Error{{Resource: "r", Field: "f", Code: "c"}}, Message: "m", Block: &ErrorBlock{ Reason: "r1", CreatedAt: &Timestamp{time.Date(2016, time.March, 17, 15, 39, 46, 0, time.UTC)}, }, DocumentationURL: "https://github.com", }, }, "errors have different values - Block - different CreatedAt #1": { wantSame: false, otherError: &ErrorResponse{ Response: &http.Response{}, Errors: []Error{{Resource: "r", Field: "f", Code: "c"}}, Message: "m", Block: &ErrorBlock{ Reason: "r", CreatedAt: nil, }, DocumentationURL: "https://github.com", }, }, "errors have different values - Block - different CreatedAt #2": { wantSame: false, otherError: &ErrorResponse{ Response: &http.Response{}, Errors: []Error{{Resource: "r", Field: "f", Code: "c"}}, Message: "m", Block: &ErrorBlock{ Reason: "r", CreatedAt: &Timestamp{time.Date(2017, time.March, 17, 15, 39, 46, 0, time.UTC)}, }, DocumentationURL: "https://github.com", }, }, "errors have different types": { wantSame: false, otherError: errors.New("Github"), }, } for name, tc := range testcases { t.Run(name, func(t *testing.T) { if tc.wantSame != err.Is(tc.otherError) { t.Errorf("Error = %#v, want %#v", err, tc.otherError) } }) } } func TestRateLimitError_Is(t *testing.T) { err := &RateLimitError{ Response: &http.Response{}, Message: "Github", } testcases := map[string]struct { wantSame bool err *RateLimitError otherError error }{ "errors are same": { wantSame: true, err: err, otherError: &RateLimitError{ Response: &http.Response{}, Message: "Github", }, }, "errors are same - Response is nil": { wantSame: true, err: &RateLimitError{ Message: "Github", }, otherError: &RateLimitError{ Message: "Github", }, }, "errors have different values - Rate": { wantSame: false, err: err, otherError: &RateLimitError{ Rate: Rate{Limit: 10}, Response: &http.Response{}, Message: "Gitlab", }, }, "errors have different values - Response is nil": { wantSame: false, err: err, otherError: &RateLimitError{ Message: "Github", }, }, "errors have different values - StatusCode": { wantSame: false, err: err, otherError: &RateLimitError{ Response: &http.Response{StatusCode: 200}, Message: "Github", }, }, "errors have different types": { wantSame: false, err: err, otherError: errors.New("Github"), }, } for name, tc := range testcases { t.Run(name, func(t *testing.T) { if tc.wantSame != tc.err.Is(tc.otherError) { t.Errorf("Error = %#v, want %#v", tc.err, tc.otherError) } }) } } func TestAbuseRateLimitError_Is(t *testing.T) { t1 := 1 * time.Second t2 := 2 * time.Second err := &AbuseRateLimitError{ Response: &http.Response{}, Message: "Github", RetryAfter: &t1, } testcases := map[string]struct { wantSame bool err *AbuseRateLimitError otherError error }{ "errors are same": { wantSame: true, err: err, otherError: &AbuseRateLimitError{ Response: &http.Response{}, Message: "Github", RetryAfter: &t1, }, }, "errors are same - Response is nil": { wantSame: true, err: &AbuseRateLimitError{ Message: "Github", RetryAfter: &t1, }, otherError: &AbuseRateLimitError{ Message: "Github", RetryAfter: &t1, }, }, "errors have different values - Message": { wantSame: false, err: err, otherError: &AbuseRateLimitError{ Response: &http.Response{}, Message: "Gitlab", RetryAfter: nil, }, }, "errors have different values - RetryAfter": { wantSame: false, err: err, otherError: &AbuseRateLimitError{ Response: &http.Response{}, Message: "Github", RetryAfter: &t2, }, }, "errors have different values - Response is nil": { wantSame: false, err: err, otherError: &AbuseRateLimitError{ Message: "Github", RetryAfter: &t1, }, }, "errors have different values - StatusCode": { wantSame: false, err: err, otherError: &AbuseRateLimitError{ Response: &http.Response{StatusCode: 200}, Message: "Github", RetryAfter: &t1, }, }, "errors have different types": { wantSame: false, err: err, otherError: errors.New("Github"), }, } for name, tc := range testcases { t.Run(name, func(t *testing.T) { if tc.wantSame != tc.err.Is(tc.otherError) { t.Errorf("Error = %#v, want %#v", tc.err, tc.otherError) } }) } } func TestAcceptedError_Is(t *testing.T) { err := &AcceptedError{Raw: []byte("Github")} testcases := map[string]struct { wantSame bool otherError error }{ "errors are same": { wantSame: true, otherError: &AcceptedError{Raw: []byte("Github")}, }, "errors have different values": { wantSame: false, otherError: &AcceptedError{Raw: []byte("Gitlab")}, }, "errors have different types": { wantSame: false, otherError: errors.New("Github"), }, } for name, tc := range testcases { t.Run(name, func(t *testing.T) { if tc.wantSame != err.Is(tc.otherError) { t.Errorf("Error = %#v, want %#v", err, tc.otherError) } }) } } // ensure that we properly handle API errors that do not contain a response body func TestCheckResponse_noBody(t *testing.T) { res := &http.Response{ Request: &http.Request{}, StatusCode: http.StatusBadRequest, Body: ioutil.NopCloser(strings.NewReader("")), } err := CheckResponse(res).(*ErrorResponse) if err == nil { t.Errorf("Expected error response.") } want := &ErrorResponse{ Response: res, } if !errors.Is(err, want) { t.Errorf("Error = %#v, want %#v", err, want) } } func TestCheckResponse_unexpectedErrorStructure(t *testing.T) { httpBody := `{"message":"m", "errors": ["error 1"]}` res := &http.Response{ Request: &http.Request{}, StatusCode: http.StatusBadRequest, Body: ioutil.NopCloser(strings.NewReader(httpBody)), } err := CheckResponse(res).(*ErrorResponse) if err == nil { t.Errorf("Expected error response.") } want := &ErrorResponse{ Response: res, Message: "m", Errors: []Error{{Message: "error 1"}}, } if !errors.Is(err, want) { t.Errorf("Error = %#v, want %#v", err, want) } data, err2 := ioutil.ReadAll(err.Response.Body) if err2 != nil { t.Fatalf("failed to read response body: %v", err) } if got := string(data); got != httpBody { t.Errorf("ErrorResponse.Response.Body = %q, want %q", got, httpBody) } } func TestParseBooleanResponse_true(t *testing.T) { result, err := parseBoolResponse(nil) if err != nil { t.Errorf("parseBoolResponse returned error: %+v", err) } if want := true; result != want { t.Errorf("parseBoolResponse returned %+v, want: %+v", result, want) } } func TestParseBooleanResponse_false(t *testing.T) { v := &ErrorResponse{Response: &http.Response{StatusCode: http.StatusNotFound}} result, err := parseBoolResponse(v) if err != nil { t.Errorf("parseBoolResponse returned error: %+v", err) } if want := false; result != want { t.Errorf("parseBoolResponse returned %+v, want: %+v", result, want) } } func TestParseBooleanResponse_error(t *testing.T) { v := &ErrorResponse{Response: &http.Response{StatusCode: http.StatusBadRequest}} result, err := parseBoolResponse(v) if err == nil { t.Errorf("Expected error to be returned.") } if want := false; result != want { t.Errorf("parseBoolResponse returned %+v, want: %+v", result, want) } } func TestErrorResponse_Error(t *testing.T) { res := &http.Response{Request: &http.Request{}} err := ErrorResponse{Message: "m", Response: res} if err.Error() == "" { t.Errorf("Expected non-empty ErrorResponse.Error()") } } func TestError_Error(t *testing.T) { err := Error{} if err.Error() == "" { t.Errorf("Expected non-empty Error.Error()") } } func TestRateLimits(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/rate_limit", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"resources":{ "core": {"limit":2,"remaining":1,"reset":1372700873}, "search": {"limit":3,"remaining":2,"reset":1372700874} }}`) }) ctx := context.Background() rate, _, err := client.RateLimits(ctx) if err != nil { t.Errorf("RateLimits returned error: %v", err) } want := &RateLimits{ Core: &Rate{ Limit: 2, Remaining: 1, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 47, 53, 0, time.UTC).Local()}, }, Search: &Rate{ Limit: 3, Remaining: 2, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 47, 54, 0, time.UTC).Local()}, }, } if !cmp.Equal(rate, want) { t.Errorf("RateLimits returned %+v, want %+v", rate, want) } if got, want := client.rateLimits[coreCategory], *want.Core; got != want { t.Errorf("client.rateLimits[coreCategory] is %+v, want %+v", got, want) } if got, want := client.rateLimits[searchCategory], *want.Search; got != want { t.Errorf("client.rateLimits[searchCategory] is %+v, want %+v", got, want) } } func TestRateLimits_coverage(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() const methodName = "RateLimits" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { _, resp, err := client.RateLimits(ctx) return resp, err }) } func TestRateLimits_overQuota(t *testing.T) { client, mux, _, teardown := setup() defer teardown() client.rateLimits[coreCategory] = Rate{ Limit: 1, Remaining: 0, Reset: Timestamp{time.Now().Add(time.Hour).Local()}, } mux.HandleFunc("/rate_limit", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, `{"resources":{ "core": {"limit":2,"remaining":1,"reset":1372700873}, "search": {"limit":3,"remaining":2,"reset":1372700874} }}`) }) ctx := context.Background() rate, _, err := client.RateLimits(ctx) if err != nil { t.Errorf("RateLimits returned error: %v", err) } want := &RateLimits{ Core: &Rate{ Limit: 2, Remaining: 1, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 47, 53, 0, time.UTC).Local()}, }, Search: &Rate{ Limit: 3, Remaining: 2, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 47, 54, 0, time.UTC).Local()}, }, } if !cmp.Equal(rate, want) { t.Errorf("RateLimits returned %+v, want %+v", rate, want) } if got, want := client.rateLimits[coreCategory], *want.Core; got != want { t.Errorf("client.rateLimits[coreCategory] is %+v, want %+v", got, want) } if got, want := client.rateLimits[searchCategory], *want.Search; got != want { t.Errorf("client.rateLimits[searchCategory] is %+v, want %+v", got, want) } } func TestSetCredentialsAsHeaders(t *testing.T) { req := new(http.Request) id, secret := "id", "secret" modifiedRequest := setCredentialsAsHeaders(req, id, secret) actualID, actualSecret, ok := modifiedRequest.BasicAuth() if !ok { t.Errorf("request does not contain basic credentials") } if actualID != id { t.Errorf("id is %s, want %s", actualID, id) } if actualSecret != secret { t.Errorf("secret is %s, want %s", actualSecret, secret) } } func TestUnauthenticatedRateLimitedTransport(t *testing.T) { client, mux, _, teardown := setup() defer teardown() clientID, clientSecret := "id", "secret" mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { id, secret, ok := r.BasicAuth() if !ok { t.Errorf("request does not contain basic auth credentials") } if id != clientID { t.Errorf("request contained basic auth username %q, want %q", id, clientID) } if secret != clientSecret { t.Errorf("request contained basic auth password %q, want %q", secret, clientSecret) } }) tp := &UnauthenticatedRateLimitedTransport{ ClientID: clientID, ClientSecret: clientSecret, } unauthedClient := NewClient(tp.Client()) unauthedClient.BaseURL = client.BaseURL req, _ := unauthedClient.NewRequest("GET", ".", nil) ctx := context.Background() unauthedClient.Do(ctx, req, nil) } func TestUnauthenticatedRateLimitedTransport_missingFields(t *testing.T) { // missing ClientID tp := &UnauthenticatedRateLimitedTransport{ ClientSecret: "secret", } _, err := tp.RoundTrip(nil) if err == nil { t.Errorf("Expected error to be returned") } // missing ClientSecret tp = &UnauthenticatedRateLimitedTransport{ ClientID: "id", } _, err = tp.RoundTrip(nil) if err == nil { t.Errorf("Expected error to be returned") } } func TestUnauthenticatedRateLimitedTransport_transport(t *testing.T) { // default transport tp := &UnauthenticatedRateLimitedTransport{ ClientID: "id", ClientSecret: "secret", } if tp.transport() != http.DefaultTransport { t.Errorf("Expected http.DefaultTransport to be used.") } // custom transport tp = &UnauthenticatedRateLimitedTransport{ ClientID: "id", ClientSecret: "secret", Transport: &http.Transport{}, } if tp.transport() == http.DefaultTransport { t.Errorf("Expected custom transport to be used.") } } func TestBasicAuthTransport(t *testing.T) { client, mux, _, teardown := setup() defer teardown() username, password, otp := "u", "p", "123456" mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { u, p, ok := r.BasicAuth() if !ok { t.Errorf("request does not contain basic auth credentials") } if u != username { t.Errorf("request contained basic auth username %q, want %q", u, username) } if p != password { t.Errorf("request contained basic auth password %q, want %q", p, password) } if got, want := r.Header.Get(headerOTP), otp; got != want { t.Errorf("request contained OTP %q, want %q", got, want) } }) tp := &BasicAuthTransport{ Username: username, Password: password, OTP: otp, } basicAuthClient := NewClient(tp.Client()) basicAuthClient.BaseURL = client.BaseURL req, _ := basicAuthClient.NewRequest("GET", ".", nil) ctx := context.Background() basicAuthClient.Do(ctx, req, nil) } func TestBasicAuthTransport_transport(t *testing.T) { // default transport tp := &BasicAuthTransport{} if tp.transport() != http.DefaultTransport { t.Errorf("Expected http.DefaultTransport to be used.") } // custom transport tp = &BasicAuthTransport{ Transport: &http.Transport{}, } if tp.transport() == http.DefaultTransport { t.Errorf("Expected custom transport to be used.") } } func TestFormatRateReset(t *testing.T) { d := 120*time.Minute + 12*time.Second got := formatRateReset(d) want := "[rate reset in 120m12s]" if got != want { t.Errorf("Format is wrong. got: %v, want: %v", got, want) } d = 14*time.Minute + 2*time.Second got = formatRateReset(d) want = "[rate reset in 14m02s]" if got != want { t.Errorf("Format is wrong. got: %v, want: %v", got, want) } d = 2*time.Minute + 2*time.Second got = formatRateReset(d) want = "[rate reset in 2m02s]" if got != want { t.Errorf("Format is wrong. got: %v, want: %v", got, want) } d = 12 * time.Second got = formatRateReset(d) want = "[rate reset in 12s]" if got != want { t.Errorf("Format is wrong. got: %v, want: %v", got, want) } d = -1 * (2*time.Hour + 2*time.Second) got = formatRateReset(d) want = "[rate limit was reset 120m02s ago]" if got != want { t.Errorf("Format is wrong. got: %v, want: %v", got, want) } } func TestNestedStructAccessorNoPanic(t *testing.T) { issue := &Issue{User: nil} got := issue.GetUser().GetPlan().GetName() want := "" if got != want { t.Errorf("Issues.Get.GetUser().GetPlan().GetName() returned %+v, want %+v", got, want) } } func TestTwoFactorAuthError(t *testing.T) { u, err := url.Parse("https://example.com") if err != nil { t.Fatal(err) } e := &TwoFactorAuthError{ Response: &http.Response{ Request: &http.Request{Method: "PUT", URL: u}, StatusCode: http.StatusTooManyRequests, }, Message: "", } if got, want := e.Error(), "PUT https://example.com: 429 []"; got != want { t.Errorf("TwoFactorAuthError = %q, want %q", got, want) } } func TestRateLimitError(t *testing.T) { u, err := url.Parse("https://example.com") if err != nil { t.Fatal(err) } r := &RateLimitError{ Response: &http.Response{ Request: &http.Request{Method: "PUT", URL: u}, StatusCode: http.StatusTooManyRequests, }, Message: "", } if got, want := r.Error(), "PUT https://example.com: 429 [rate limit was reset"; !strings.Contains(got, want) { t.Errorf("RateLimitError = %q, want %q", got, want) } } func TestAcceptedError(t *testing.T) { a := &AcceptedError{} if got, want := a.Error(), "try again later"; !strings.Contains(got, want) { t.Errorf("AcceptedError = %q, want %q", got, want) } } func TestAbuseRateLimitError(t *testing.T) { u, err := url.Parse("https://example.com") if err != nil { t.Fatal(err) } r := &AbuseRateLimitError{ Response: &http.Response{ Request: &http.Request{Method: "PUT", URL: u}, StatusCode: http.StatusTooManyRequests, }, Message: "", } if got, want := r.Error(), "PUT https://example.com: 429 "; got != want { t.Errorf("AbuseRateLimitError = %q, want %q", got, want) } } func TestAddOptions_QueryValues(t *testing.T) { if _, err := addOptions("yo", ""); err == nil { t.Error("addOptions err = nil, want error") } } func TestBareDo_returnsOpenBody(t *testing.T) { client, mux, _, teardown := setup() defer teardown() expectedBody := "Hello from the other side !" mux.HandleFunc("/test-url", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, expectedBody) }) ctx := context.Background() req, err := client.NewRequest("GET", "test-url", nil) if err != nil { t.Fatalf("client.NewRequest returned error: %v", err) } resp, err := client.BareDo(ctx, req) if err != nil { t.Fatalf("client.BareDo returned error: %v", err) } got, err := ioutil.ReadAll(resp.Body) if err != nil { t.Fatalf("ioutil.ReadAll returned error: %v", err) } if string(got) != expectedBody { t.Fatalf("Expected %q, got %q", expectedBody, string(got)) } if err := resp.Body.Close(); err != nil { t.Fatalf("resp.Body.Close() returned error: %v", err) } } // roundTripperFunc creates a mock RoundTripper (transport) type roundTripperFunc func(*http.Request) (*http.Response, error) func (fn roundTripperFunc) RoundTrip(r *http.Request) (*http.Response, error) { return fn(r) } func TestErrorResponse_Marshal(t *testing.T) { testJSONMarshal(t, &ErrorResponse{}, "{}") u := &ErrorResponse{ Message: "msg", Errors: []Error{ { Resource: "res", Field: "f", Code: "c", Message: "msg", }, }, Block: &ErrorBlock{ Reason: "reason", CreatedAt: &Timestamp{referenceTime}, }, DocumentationURL: "doc", } want := `{ "message": "msg", "errors": [ { "resource": "res", "field": "f", "code": "c", "message": "msg" } ], "block": { "reason": "reason", "created_at": ` + referenceTimeStr + ` }, "documentation_url": "doc" }` testJSONMarshal(t, u, want) } func TestErrorBlock_Marshal(t *testing.T) { testJSONMarshal(t, &ErrorBlock{}, "{}") u := &ErrorBlock{ Reason: "reason", CreatedAt: &Timestamp{referenceTime}, } want := `{ "reason": "reason", "created_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } func TestRateLimitError_Marshal(t *testing.T) { testJSONMarshal(t, &RateLimitError{}, "{}") u := &RateLimitError{ Rate: Rate{ Limit: 1, Remaining: 1, Reset: Timestamp{referenceTime}, }, Message: "msg", } want := `{ "Rate": { "limit": 1, "remaining": 1, "reset": ` + referenceTimeStr + ` }, "message": "msg" }` testJSONMarshal(t, u, want) } func TestAbuseRateLimitError_Marshal(t *testing.T) { testJSONMarshal(t, &AbuseRateLimitError{}, "{}") u := &AbuseRateLimitError{ Message: "msg", } want := `{ "message": "msg" }` testJSONMarshal(t, u, want) } func TestError_Marshal(t *testing.T) { testJSONMarshal(t, &Error{}, "{}") u := &Error{ Resource: "res", Field: "field", Code: "code", Message: "msg", } want := `{ "resource": "res", "field": "field", "code": "code", "message": "msg" }` testJSONMarshal(t, u, want) } func TestRate_Marshal(t *testing.T) { testJSONMarshal(t, &Rate{}, "{}") u := &Rate{ Limit: 1, Remaining: 1, Reset: Timestamp{referenceTime}, } want := `{ "limit": 1, "remaining": 1, "reset": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } func TestRateLimits_Marshal(t *testing.T) { testJSONMarshal(t, &RateLimits{}, "{}") u := &RateLimits{ Core: &Rate{ Limit: 1, Remaining: 1, Reset: Timestamp{referenceTime}, }, Search: &Rate{ Limit: 1, Remaining: 1, Reset: Timestamp{referenceTime}, }, } want := `{ "core": { "limit": 1, "remaining": 1, "reset": ` + referenceTimeStr + ` }, "search": { "limit": 1, "remaining": 1, "reset": ` + referenceTimeStr + ` } }` testJSONMarshal(t, u, want) } func TestParseTokenExpiration(t *testing.T) { tests := []struct { header string want Timestamp }{ { header: "", want: Timestamp{}, }, { header: "this is a garbage", want: Timestamp{}, }, { header: "2021-09-03 02:34:04 UTC", want: Timestamp{time.Date(2021, time.September, 3, 2, 34, 4, 0, time.UTC)}, }, } for _, tt := range tests { res := &http.Response{ Request: &http.Request{}, Header: http.Header{}, } res.Header.Set(headerTokenExpiration, tt.header) exp := parseTokenExpiration(res) if !exp.Equal(tt.want) { t.Errorf("parseTokenExpiration returned %#v, want %#v", exp, tt.want) } } } go-github-38.1.0/github/gitignore.go000066400000000000000000000033461410475703100173000ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" ) // GitignoresService provides access to the gitignore related functions in the // GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gitignore/ type GitignoresService service // Gitignore represents a .gitignore file as returned by the GitHub API. type Gitignore struct { Name *string `json:"name,omitempty"` Source *string `json:"source,omitempty"` } func (g Gitignore) String() string { return Stringify(g) } // List all available Gitignore templates. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gitignore/#listing-available-templates func (s *GitignoresService) List(ctx context.Context) ([]string, *Response, error) { req, err := s.client.NewRequest("GET", "gitignore/templates", nil) if err != nil { return nil, nil, err } var availableTemplates []string resp, err := s.client.Do(ctx, req, &availableTemplates) if err != nil { return nil, resp, err } return availableTemplates, resp, nil } // Get a Gitignore by name. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/gitignore/#get-a-gitignore-template func (s *GitignoresService) Get(ctx context.Context, name string) (*Gitignore, *Response, error) { u := fmt.Sprintf("gitignore/templates/%v", name) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } gitignore := new(Gitignore) resp, err := s.client.Do(ctx, req, gitignore) if err != nil { return nil, resp, err } return gitignore, resp, nil } go-github-38.1.0/github/gitignore_test.go000066400000000000000000000050511410475703100203320ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestGitignoresService_List(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gitignore/templates", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `["C", "Go"]`) }) ctx := context.Background() available, _, err := client.Gitignores.List(ctx) if err != nil { t.Errorf("Gitignores.List returned error: %v", err) } want := []string{"C", "Go"} if !cmp.Equal(available, want) { t.Errorf("Gitignores.List returned %+v, want %+v", available, want) } const methodName = "List" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gitignores.List(ctx) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitignoresService_Get(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/gitignore/templates/name", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"name":"Name","source":"template source"}`) }) ctx := context.Background() gitignore, _, err := client.Gitignores.Get(ctx, "name") if err != nil { t.Errorf("Gitignores.List returned error: %v", err) } want := &Gitignore{Name: String("Name"), Source: String("template source")} if !cmp.Equal(gitignore, want) { t.Errorf("Gitignores.Get returned %+v, want %+v", gitignore, want) } const methodName = "Get" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Gitignores.Get(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Gitignores.Get(ctx, "name") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGitignoresService_Get_invalidTemplate(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Gitignores.Get(ctx, "%") testURLParseError(t, err) } func TestGitignore_Marshal(t *testing.T) { testJSONMarshal(t, &Gitignore{}, "{}") u := &Gitignore{ Name: String("name"), Source: String("source"), } want := `{ "name": "name", "source": "source" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/interactions.go000066400000000000000000000022711410475703100200070ustar00rootroot00000000000000// Copyright 2018 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 // InteractionsService handles communication with the repository and organization related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/interactions/ type InteractionsService service // InteractionRestriction represents the interaction restrictions for repository and organization. type InteractionRestriction struct { // Specifies the group of GitHub users who can // comment, open issues, or create pull requests for the given repository. // Possible values are: "existing_users", "contributors_only" and "collaborators_only". Limit *string `json:"limit,omitempty"` // Origin specifies the type of the resource to interact with. // Possible values are: "repository" and "organization". Origin *string `json:"origin,omitempty"` // ExpiresAt specifies the time after which the interaction restrictions expire. // The default expiry time is 24 hours from the time restriction is created. ExpiresAt *Timestamp `json:"expires_at,omitempty"` } go-github-38.1.0/github/interactions_orgs.go000066400000000000000000000056451410475703100210510ustar00rootroot00000000000000// Copyright 2019 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 ( "context" "fmt" ) // GetRestrictionsForOrg fetches the interaction restrictions for an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/interactions/#get-interaction-restrictions-for-an-organization func (s *InteractionsService) GetRestrictionsForOrg(ctx context.Context, organization string) (*InteractionRestriction, *Response, error) { u := fmt.Sprintf("orgs/%v/interaction-limits", organization) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeInteractionRestrictionsPreview) organizationInteractions := new(InteractionRestriction) resp, err := s.client.Do(ctx, req, organizationInteractions) if err != nil { return nil, resp, err } return organizationInteractions, resp, nil } // UpdateRestrictionsForOrg adds or updates the interaction restrictions for an organization. // // limit specifies the group of GitHub users who can comment, open issues, or create pull requests // in public repositories for the given organization. // Possible values are: "existing_users", "contributors_only", "collaborators_only". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/interactions/#set-interaction-restrictions-for-an-organization func (s *InteractionsService) UpdateRestrictionsForOrg(ctx context.Context, organization, limit string) (*InteractionRestriction, *Response, error) { u := fmt.Sprintf("orgs/%v/interaction-limits", organization) interaction := &InteractionRestriction{Limit: String(limit)} req, err := s.client.NewRequest("PUT", u, interaction) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeInteractionRestrictionsPreview) organizationInteractions := new(InteractionRestriction) resp, err := s.client.Do(ctx, req, organizationInteractions) if err != nil { return nil, resp, err } return organizationInteractions, resp, nil } // RemoveRestrictionsFromOrg removes the interaction restrictions for an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/interactions/#remove-interaction-restrictions-for-an-organization func (s *InteractionsService) RemoveRestrictionsFromOrg(ctx context.Context, organization string) (*Response, error) { u := fmt.Sprintf("orgs/%v/interaction-limits", organization) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeInteractionRestrictionsPreview) return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/interactions_orgs_test.go000066400000000000000000000075611410475703100221070ustar00rootroot00000000000000// Copyright 2019 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestInteractionsService_GetRestrictionsForOrgs(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/interaction-limits", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeInteractionRestrictionsPreview) fmt.Fprint(w, `{"origin":"organization"}`) }) ctx := context.Background() organizationInteractions, _, err := client.Interactions.GetRestrictionsForOrg(ctx, "o") if err != nil { t.Errorf("Interactions.GetRestrictionsForOrg returned error: %v", err) } want := &InteractionRestriction{Origin: String("organization")} if !cmp.Equal(organizationInteractions, want) { t.Errorf("Interactions.GetRestrictionsForOrg returned %+v, want %+v", organizationInteractions, want) } const methodName = "GetRestrictionsForOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Interactions.GetRestrictionsForOrg(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Interactions.GetRestrictionsForOrg(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestInteractionsService_UpdateRestrictionsForOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &InteractionRestriction{Limit: String("existing_users")} mux.HandleFunc("/orgs/o/interaction-limits", func(w http.ResponseWriter, r *http.Request) { v := new(InteractionRestriction) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") testHeader(t, r, "Accept", mediaTypeInteractionRestrictionsPreview) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"origin":"organization"}`) }) ctx := context.Background() organizationInteractions, _, err := client.Interactions.UpdateRestrictionsForOrg(ctx, "o", input.GetLimit()) if err != nil { t.Errorf("Interactions.UpdateRestrictionsForOrg returned error: %v", err) } want := &InteractionRestriction{Origin: String("organization")} if !cmp.Equal(organizationInteractions, want) { t.Errorf("Interactions.UpdateRestrictionsForOrg returned %+v, want %+v", organizationInteractions, want) } const methodName = "UpdateRestrictionsForOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Interactions.UpdateRestrictionsForOrg(ctx, "\n", input.GetLimit()) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Interactions.UpdateRestrictionsForOrg(ctx, "o", input.GetLimit()) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestInteractionsService_RemoveRestrictionsFromOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/interaction-limits", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeInteractionRestrictionsPreview) }) ctx := context.Background() _, err := client.Interactions.RemoveRestrictionsFromOrg(ctx, "o") if err != nil { t.Errorf("Interactions.RemoveRestrictionsFromOrg returned error: %v", err) } const methodName = "RemoveRestrictionsFromOrg" testBadOptions(t, methodName, func() (err error) { _, err = client.Interactions.RemoveRestrictionsFromOrg(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Interactions.RemoveRestrictionsFromOrg(ctx, "o") }) } go-github-38.1.0/github/interactions_repos.go000066400000000000000000000055721410475703100212260ustar00rootroot00000000000000// Copyright 2018 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 ( "context" "fmt" ) // GetRestrictionsForRepo fetches the interaction restrictions for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/interactions/#get-interaction-restrictions-for-a-repository func (s *InteractionsService) GetRestrictionsForRepo(ctx context.Context, owner, repo string) (*InteractionRestriction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/interaction-limits", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeInteractionRestrictionsPreview) repositoryInteractions := new(InteractionRestriction) resp, err := s.client.Do(ctx, req, repositoryInteractions) if err != nil { return nil, resp, err } return repositoryInteractions, resp, nil } // UpdateRestrictionsForRepo adds or updates the interaction restrictions for a repository. // // limit specifies the group of GitHub users who can comment, open issues, or create pull requests // for the given repository. // Possible values are: "existing_users", "contributors_only", "collaborators_only". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/interactions/#set-interaction-restrictions-for-a-repository func (s *InteractionsService) UpdateRestrictionsForRepo(ctx context.Context, owner, repo, limit string) (*InteractionRestriction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/interaction-limits", owner, repo) interaction := &InteractionRestriction{Limit: String(limit)} req, err := s.client.NewRequest("PUT", u, interaction) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeInteractionRestrictionsPreview) repositoryInteractions := new(InteractionRestriction) resp, err := s.client.Do(ctx, req, repositoryInteractions) if err != nil { return nil, resp, err } return repositoryInteractions, resp, nil } // RemoveRestrictionsFromRepo removes the interaction restrictions for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/interactions/#remove-interaction-restrictions-for-a-repository func (s *InteractionsService) RemoveRestrictionsFromRepo(ctx context.Context, owner, repo string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/interaction-limits", owner, repo) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeInteractionRestrictionsPreview) return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/interactions_repos_test.go000066400000000000000000000076051410475703100222640ustar00rootroot00000000000000// Copyright 2018 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestInteractionsService_GetRestrictionsForRepo(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/interaction-limits", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeInteractionRestrictionsPreview) fmt.Fprint(w, `{"origin":"repository"}`) }) ctx := context.Background() repoInteractions, _, err := client.Interactions.GetRestrictionsForRepo(ctx, "o", "r") if err != nil { t.Errorf("Interactions.GetRestrictionsForRepo returned error: %v", err) } want := &InteractionRestriction{Origin: String("repository")} if !cmp.Equal(repoInteractions, want) { t.Errorf("Interactions.GetRestrictionsForRepo returned %+v, want %+v", repoInteractions, want) } const methodName = "GetRestrictionsForRepo" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Interactions.GetRestrictionsForRepo(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Interactions.GetRestrictionsForRepo(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestInteractionsService_UpdateRestrictionsForRepo(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &InteractionRestriction{Limit: String("existing_users")} mux.HandleFunc("/repos/o/r/interaction-limits", func(w http.ResponseWriter, r *http.Request) { v := new(InteractionRestriction) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") testHeader(t, r, "Accept", mediaTypeInteractionRestrictionsPreview) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"origin":"repository"}`) }) ctx := context.Background() repoInteractions, _, err := client.Interactions.UpdateRestrictionsForRepo(ctx, "o", "r", input.GetLimit()) if err != nil { t.Errorf("Interactions.UpdateRestrictionsForRepo returned error: %v", err) } want := &InteractionRestriction{Origin: String("repository")} if !cmp.Equal(repoInteractions, want) { t.Errorf("Interactions.UpdateRestrictionsForRepo returned %+v, want %+v", repoInteractions, want) } const methodName = "UpdateRestrictionsForRepo" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Interactions.UpdateRestrictionsForRepo(ctx, "\n", "\n", input.GetLimit()) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Interactions.UpdateRestrictionsForRepo(ctx, "o", "r", input.GetLimit()) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestInteractionsService_RemoveRestrictionsFromRepo(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/interaction-limits", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeInteractionRestrictionsPreview) }) ctx := context.Background() _, err := client.Interactions.RemoveRestrictionsFromRepo(ctx, "o", "r") if err != nil { t.Errorf("Interactions.RemoveRestrictionsFromRepo returned error: %v", err) } const methodName = "RemoveRestrictionsFromRepo" testBadOptions(t, methodName, func() (err error) { _, err = client.Interactions.RemoveRestrictionsFromRepo(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Interactions.RemoveRestrictionsFromRepo(ctx, "o", "r") }) } go-github-38.1.0/github/interactions_test.go000066400000000000000000000011051410475703100210410ustar00rootroot00000000000000// Copyright 2021 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 "testing" func TestInteractionRestriction_Marshal(t *testing.T) { testJSONMarshal(t, &InteractionRestriction{}, "{}") u := &InteractionRestriction{ Limit: String("limit"), Origin: String("origin"), ExpiresAt: &Timestamp{referenceTime}, } want := `{ "limit": "limit", "origin": "origin", "expires_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/issue_import.go000066400000000000000000000115631410475703100200330ustar00rootroot00000000000000// Copyright 2020 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 ( "bytes" "context" "encoding/json" "fmt" "time" ) // IssueImportService handles communication with the issue import related // methods of the Issue Import GitHub API. type IssueImportService service // IssueImportRequest represents a request to create an issue. // // https://gist.github.com/jonmagic/5282384165e0f86ef105#supported-issue-and-comment-fields type IssueImportRequest struct { IssueImport IssueImport `json:"issue"` Comments []*Comment `json:"comments,omitempty"` } // IssueImport represents body of issue to import. type IssueImport struct { Title string `json:"title"` Body string `json:"body"` CreatedAt *time.Time `json:"created_at,omitempty"` ClosedAt *time.Time `json:"closed_at,omitempty"` UpdatedAt *time.Time `json:"updated_at,omitempty"` Assignee *string `json:"assignee,omitempty"` Milestone *int `json:"milestone,omitempty"` Closed *bool `json:"closed,omitempty"` Labels []string `json:"labels,omitempty"` } // Comment represents comments of issue to import. type Comment struct { CreatedAt *time.Time `json:"created_at,omitempty"` Body string `json:"body"` } // IssueImportResponse represents the response of an issue import create request. // // https://gist.github.com/jonmagic/5282384165e0f86ef105#import-issue-response type IssueImportResponse struct { ID *int `json:"id,omitempty"` Status *string `json:"status,omitempty"` URL *string `json:"url,omitempty"` ImportIssuesURL *string `json:"import_issues_url,omitempty"` RepositoryURL *string `json:"repository_url,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` UpdatedAt *time.Time `json:"updated_at,omitempty"` Message *string `json:"message,omitempty"` DocumentationURL *string `json:"documentation_url,omitempty"` Errors []*IssueImportError `json:"errors,omitempty"` } // IssueImportError represents errors of an issue import create request. type IssueImportError struct { Location *string `json:"location,omitempty"` Resource *string `json:"resource,omitempty"` Field *string `json:"field,omitempty"` Value *string `json:"value,omitempty"` Code *string `json:"code,omitempty"` } // Create a new imported issue on the specified repository. // // https://gist.github.com/jonmagic/5282384165e0f86ef105#start-an-issue-import func (s *IssueImportService) Create(ctx context.Context, owner, repo string, issue *IssueImportRequest) (*IssueImportResponse, *Response, error) { u := fmt.Sprintf("repos/%v/%v/import/issues", owner, repo) req, err := s.client.NewRequest("POST", u, issue) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeIssueImportAPI) i := new(IssueImportResponse) resp, err := s.client.Do(ctx, req, i) if err != nil { aerr, ok := err.(*AcceptedError) if ok { decErr := json.Unmarshal(aerr.Raw, i) if decErr != nil { err = decErr } return i, resp, nil } return nil, resp, err } return i, resp, nil } // CheckStatus checks the status of an imported issue. // // https://gist.github.com/jonmagic/5282384165e0f86ef105#import-status-request func (s *IssueImportService) CheckStatus(ctx context.Context, owner, repo string, issueID int64) (*IssueImportResponse, *Response, error) { u := fmt.Sprintf("repos/%v/%v/import/issues/%v", owner, repo, issueID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeIssueImportAPI) i := new(IssueImportResponse) resp, err := s.client.Do(ctx, req, i) if err != nil { return nil, resp, err } return i, resp, nil } // CheckStatusSince checks the status of multiple imported issues since a given date. // // https://gist.github.com/jonmagic/5282384165e0f86ef105#check-status-of-multiple-issues func (s *IssueImportService) CheckStatusSince(ctx context.Context, owner, repo string, since time.Time) ([]*IssueImportResponse, *Response, error) { u := fmt.Sprintf("repos/%v/%v/import/issues?since=%v", owner, repo, since.Format("2006-01-02")) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeIssueImportAPI) var b bytes.Buffer resp, err := s.client.Do(ctx, req, &b) if err != nil { return nil, resp, err } var i []*IssueImportResponse err = json.Unmarshal(b.Bytes(), &i) if err != nil { return nil, resp, err } return i, resp, nil } go-github-38.1.0/github/issue_import_test.go000066400000000000000000000212101410475703100210600ustar00rootroot00000000000000// Copyright 2020 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestIssueImportService_Create(t *testing.T) { client, mux, _, teardown := setup() defer teardown() createdAt := time.Date(2020, time.August, 11, 15, 30, 0, 0, time.UTC) input := &IssueImportRequest{ IssueImport: IssueImport{ Assignee: String("developer"), Body: "Dummy description", CreatedAt: &createdAt, Labels: []string{"l1", "l2"}, Milestone: Int(1), Title: "Dummy Issue", }, Comments: []*Comment{{ CreatedAt: &createdAt, Body: "Comment body", }}, } mux.HandleFunc("/repos/o/r/import/issues", func(w http.ResponseWriter, r *http.Request) { v := new(IssueImportRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeIssueImportAPI) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } w.WriteHeader(http.StatusAccepted) w.Write(issueImportResponseJSON) }) ctx := context.Background() got, _, err := client.IssueImport.Create(ctx, "o", "r", input) if err != nil { t.Errorf("Create returned error: %v", err) } want := wantIssueImportResponse if !cmp.Equal(got, want) { t.Errorf("Create = %+v, want %+v", got, want) } const methodName = "Create" testBadOptions(t, methodName, func() (err error) { _, _, err = client.IssueImport.Create(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.IssueImport.Create(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssueImportService_Create_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.IssueImport.Create(ctx, "%", "r", nil) testURLParseError(t, err) } func TestIssueImportService_CheckStatus(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/import/issues/3", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeIssueImportAPI) w.WriteHeader(http.StatusOK) w.Write(issueImportResponseJSON) }) ctx := context.Background() got, _, err := client.IssueImport.CheckStatus(ctx, "o", "r", 3) if err != nil { t.Errorf("CheckStatus returned error: %v", err) } want := wantIssueImportResponse if !cmp.Equal(got, want) { t.Errorf("CheckStatus = %+v, want %+v", got, want) } const methodName = "CheckStatus" testBadOptions(t, methodName, func() (err error) { _, _, err = client.IssueImport.CheckStatus(ctx, "\n", "\n", -3) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.IssueImport.CheckStatus(ctx, "o", "r", 3) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssueImportService_CheckStatus_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.IssueImport.CheckStatus(ctx, "%", "r", 1) testURLParseError(t, err) } func TestIssueImportService_CheckStatusSince(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/import/issues", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeIssueImportAPI) w.WriteHeader(http.StatusOK) w.Write([]byte(fmt.Sprintf("[%s]", issueImportResponseJSON))) }) ctx := context.Background() got, _, err := client.IssueImport.CheckStatusSince(ctx, "o", "r", time.Now()) if err != nil { t.Errorf("CheckStatusSince returned error: %v", err) } want := []*IssueImportResponse{wantIssueImportResponse} if !cmp.Equal(want, got) { t.Errorf("CheckStatusSince = %v, want = %v", got, want) } const methodName = "CheckStatusSince" testBadOptions(t, methodName, func() (err error) { _, _, err = client.IssueImport.CheckStatusSince(ctx, "\n", "\n", time.Now()) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.IssueImport.CheckStatusSince(ctx, "o", "r", time.Now()) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssueImportService_CheckStatusSince_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.IssueImport.CheckStatusSince(ctx, "%", "r", time.Now()) testURLParseError(t, err) } var issueImportResponseJSON = []byte(`{ "id": 3, "status": "pending", "url": "https://api.github.com/repos/o/r/import/issues/3", "import_issues_url": "https://api.github.com/repos/o/r/import/issues", "repository_url": "https://api.github.com/repos/o/r" }`) var wantIssueImportResponse = &IssueImportResponse{ ID: Int(3), Status: String("pending"), URL: String("https://api.github.com/repos/o/r/import/issues/3"), ImportIssuesURL: String("https://api.github.com/repos/o/r/import/issues"), RepositoryURL: String("https://api.github.com/repos/o/r"), } func TestIssueImportError_Marshal(t *testing.T) { testJSONMarshal(t, &IssueImportError{}, "{}") u := &IssueImportError{ Location: String("loc"), Resource: String("res"), Field: String("field"), Value: String("value"), Code: String("code"), } want := `{ "location": "loc", "resource": "res", "field": "field", "value": "value", "code": "code" }` testJSONMarshal(t, u, want) } func TestIssueImportResponse_Marshal(t *testing.T) { testJSONMarshal(t, &IssueImportResponse{}, "{}") u := &IssueImportResponse{ ID: Int(1), Status: String("status"), URL: String("url"), ImportIssuesURL: String("iiu"), RepositoryURL: String("ru"), CreatedAt: &referenceTime, UpdatedAt: &referenceTime, Message: String("msg"), DocumentationURL: String("durl"), Errors: []*IssueImportError{ { Location: String("loc"), Resource: String("res"), Field: String("field"), Value: String("value"), Code: String("code"), }, }, } want := `{ "id": 1, "status": "status", "url": "url", "import_issues_url": "iiu", "repository_url": "ru", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "message": "msg", "documentation_url": "durl", "errors": [ { "location": "loc", "resource": "res", "field": "field", "value": "value", "code": "code" } ] }` testJSONMarshal(t, u, want) } func TestComment_Marshal(t *testing.T) { testJSONMarshal(t, &Comment{}, "{}") u := &Comment{ CreatedAt: &referenceTime, Body: "body", } want := `{ "created_at": ` + referenceTimeStr + `, "body": "body" }` testJSONMarshal(t, u, want) } func TestIssueImport_Marshal(t *testing.T) { testJSONMarshal(t, &IssueImport{}, "{}") u := &IssueImport{ Title: "title", Body: "body", CreatedAt: &referenceTime, ClosedAt: &referenceTime, UpdatedAt: &referenceTime, Assignee: String("a"), Milestone: Int(1), Closed: Bool(false), Labels: []string{"l"}, } want := `{ "title": "title", "body": "body", "created_at": ` + referenceTimeStr + `, "closed_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "assignee": "a", "milestone": 1, "closed": false, "labels": [ "l" ] }` testJSONMarshal(t, u, want) } func TestIssueImportRequest_Marshal(t *testing.T) { testJSONMarshal(t, &IssueImportRequest{}, "{}") u := &IssueImportRequest{ IssueImport: IssueImport{ Title: "title", Body: "body", CreatedAt: &referenceTime, ClosedAt: &referenceTime, UpdatedAt: &referenceTime, Assignee: String("a"), Milestone: Int(1), Closed: Bool(false), Labels: []string{"l"}, }, Comments: []*Comment{ { CreatedAt: &referenceTime, Body: "body", }, }, } want := `{ "issue": { "title": "title", "body": "body", "created_at": ` + referenceTimeStr + `, "closed_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "assignee": "a", "milestone": 1, "closed": false, "labels": [ "l" ] }, "comments": [ { "created_at": ` + referenceTimeStr + `, "body": "body" } ] }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/issues.go000066400000000000000000000302341410475703100166200ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "time" ) // IssuesService handles communication with the issue related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/ type IssuesService service // Issue represents a GitHub issue on a repository. // // Note: As far as the GitHub API is concerned, every pull request is an issue, // but not every issue is a pull request. Some endpoints, events, and webhooks // may also return pull requests via this struct. If PullRequestLinks is nil, // this is an issue, and if PullRequestLinks is not nil, this is a pull request. // The IsPullRequest helper method can be used to check that. type Issue struct { ID *int64 `json:"id,omitempty"` Number *int `json:"number,omitempty"` State *string `json:"state,omitempty"` Locked *bool `json:"locked,omitempty"` Title *string `json:"title,omitempty"` Body *string `json:"body,omitempty"` AuthorAssociation *string `json:"author_association,omitempty"` User *User `json:"user,omitempty"` Labels []*Label `json:"labels,omitempty"` Assignee *User `json:"assignee,omitempty"` Comments *int `json:"comments,omitempty"` ClosedAt *time.Time `json:"closed_at,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` UpdatedAt *time.Time `json:"updated_at,omitempty"` ClosedBy *User `json:"closed_by,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` CommentsURL *string `json:"comments_url,omitempty"` EventsURL *string `json:"events_url,omitempty"` LabelsURL *string `json:"labels_url,omitempty"` RepositoryURL *string `json:"repository_url,omitempty"` Milestone *Milestone `json:"milestone,omitempty"` PullRequestLinks *PullRequestLinks `json:"pull_request,omitempty"` Repository *Repository `json:"repository,omitempty"` Reactions *Reactions `json:"reactions,omitempty"` Assignees []*User `json:"assignees,omitempty"` NodeID *string `json:"node_id,omitempty"` // TextMatches is only populated from search results that request text matches // See: search.go and https://docs.github.com/en/free-pro-team@latest/rest/reference/search/#text-match-metadata TextMatches []*TextMatch `json:"text_matches,omitempty"` // ActiveLockReason is populated only when LockReason is provided while locking the issue. // Possible values are: "off-topic", "too heated", "resolved", and "spam". ActiveLockReason *string `json:"active_lock_reason,omitempty"` } func (i Issue) String() string { return Stringify(i) } // IsPullRequest reports whether the issue is also a pull request. It uses the // method recommended by GitHub's API documentation, which is to check whether // PullRequestLinks is non-nil. func (i Issue) IsPullRequest() bool { return i.PullRequestLinks != nil } // IssueRequest represents a request to create/edit an issue. // It is separate from Issue above because otherwise Labels // and Assignee fail to serialize to the correct JSON. type IssueRequest struct { Title *string `json:"title,omitempty"` Body *string `json:"body,omitempty"` Labels *[]string `json:"labels,omitempty"` Assignee *string `json:"assignee,omitempty"` State *string `json:"state,omitempty"` Milestone *int `json:"milestone,omitempty"` Assignees *[]string `json:"assignees,omitempty"` } // IssueListOptions specifies the optional parameters to the IssuesService.List // and IssuesService.ListByOrg methods. type IssueListOptions struct { // Filter specifies which issues to list. Possible values are: assigned, // created, mentioned, subscribed, all. Default is "assigned". Filter string `url:"filter,omitempty"` // State filters issues based on their state. Possible values are: open, // closed, all. Default is "open". State string `url:"state,omitempty"` // Labels filters issues based on their label. Labels []string `url:"labels,comma,omitempty"` // Sort specifies how to sort issues. Possible values are: created, updated, // and comments. Default value is "created". Sort string `url:"sort,omitempty"` // Direction in which to sort issues. Possible values are: asc, desc. // Default is "desc". Direction string `url:"direction,omitempty"` // Since filters issues by time. Since time.Time `url:"since,omitempty"` ListOptions } // PullRequestLinks object is added to the Issue object when it's an issue included // in the IssueCommentEvent webhook payload, if the webhook is fired by a comment on a PR. type PullRequestLinks struct { URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` DiffURL *string `json:"diff_url,omitempty"` PatchURL *string `json:"patch_url,omitempty"` } // List the issues for the authenticated user. If all is true, list issues // across all the user's visible repositories including owned, member, and // organization repositories; if false, list only owned and member // repositories. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#list-user-account-issues-assigned-to-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#list-issues-assigned-to-the-authenticated-user func (s *IssuesService) List(ctx context.Context, all bool, opts *IssueListOptions) ([]*Issue, *Response, error) { var u string if all { u = "issues" } else { u = "user/issues" } return s.listIssues(ctx, u, opts) } // ListByOrg fetches the issues in the specified organization for the // authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#list-organization-issues-assigned-to-the-authenticated-user func (s *IssuesService) ListByOrg(ctx context.Context, org string, opts *IssueListOptions) ([]*Issue, *Response, error) { u := fmt.Sprintf("orgs/%v/issues", org) return s.listIssues(ctx, u, opts) } func (s *IssuesService) listIssues(ctx context.Context, u string, opts *IssueListOptions) ([]*Issue, *Response, error) { u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) var issues []*Issue resp, err := s.client.Do(ctx, req, &issues) if err != nil { return nil, resp, err } return issues, resp, nil } // IssueListByRepoOptions specifies the optional parameters to the // IssuesService.ListByRepo method. type IssueListByRepoOptions struct { // Milestone limits issues for the specified milestone. Possible values are // a milestone number, "none" for issues with no milestone, "*" for issues // with any milestone. Milestone string `url:"milestone,omitempty"` // State filters issues based on their state. Possible values are: open, // closed, all. Default is "open". State string `url:"state,omitempty"` // Assignee filters issues based on their assignee. Possible values are a // user name, "none" for issues that are not assigned, "*" for issues with // any assigned user. Assignee string `url:"assignee,omitempty"` // Creator filters issues based on their creator. Creator string `url:"creator,omitempty"` // Mentioned filters issues to those mentioned a specific user. Mentioned string `url:"mentioned,omitempty"` // Labels filters issues based on their label. Labels []string `url:"labels,omitempty,comma"` // Sort specifies how to sort issues. Possible values are: created, updated, // and comments. Default value is "created". Sort string `url:"sort,omitempty"` // Direction in which to sort issues. Possible values are: asc, desc. // Default is "desc". Direction string `url:"direction,omitempty"` // Since filters issues by time. Since time.Time `url:"since,omitempty"` ListOptions } // ListByRepo lists the issues for the specified repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#list-repository-issues func (s *IssuesService) ListByRepo(ctx context.Context, owner string, repo string, opts *IssueListByRepoOptions) ([]*Issue, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeReactionsPreview) var issues []*Issue resp, err := s.client.Do(ctx, req, &issues) if err != nil { return nil, resp, err } return issues, resp, nil } // Get a single issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#get-an-issue func (s *IssuesService) Get(ctx context.Context, owner string, repo string, number int) (*Issue, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%d", owner, repo, number) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) issue := new(Issue) resp, err := s.client.Do(ctx, req, issue) if err != nil { return nil, resp, err } return issue, resp, nil } // Create a new issue on the specified repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#create-an-issue func (s *IssuesService) Create(ctx context.Context, owner string, repo string, issue *IssueRequest) (*Issue, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues", owner, repo) req, err := s.client.NewRequest("POST", u, issue) if err != nil { return nil, nil, err } i := new(Issue) resp, err := s.client.Do(ctx, req, i) if err != nil { return nil, resp, err } return i, resp, nil } // Edit an issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#update-an-issue func (s *IssuesService) Edit(ctx context.Context, owner string, repo string, number int, issue *IssueRequest) (*Issue, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%d", owner, repo, number) req, err := s.client.NewRequest("PATCH", u, issue) if err != nil { return nil, nil, err } i := new(Issue) resp, err := s.client.Do(ctx, req, i) if err != nil { return nil, resp, err } return i, resp, nil } // LockIssueOptions specifies the optional parameters to the // IssuesService.Lock method. type LockIssueOptions struct { // LockReason specifies the reason to lock this issue. // Providing a lock reason can help make it clearer to contributors why an issue // was locked. Possible values are: "off-topic", "too heated", "resolved", and "spam". LockReason string `json:"lock_reason,omitempty"` } // Lock an issue's conversation. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#lock-an-issue func (s *IssuesService) Lock(ctx context.Context, owner string, repo string, number int, opts *LockIssueOptions) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%d/lock", owner, repo, number) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // Unlock an issue's conversation. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#unlock-an-issue func (s *IssuesService) Unlock(ctx context.Context, owner string, repo string, number int) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%d/lock", owner, repo, number) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/issues_assignees.go000066400000000000000000000055341410475703100206660ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" ) // ListAssignees fetches all available assignees (owners and collaborators) to // which issues may be assigned. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#list-assignees func (s *IssuesService) ListAssignees(ctx context.Context, owner, repo string, opts *ListOptions) ([]*User, *Response, error) { u := fmt.Sprintf("repos/%v/%v/assignees", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var assignees []*User resp, err := s.client.Do(ctx, req, &assignees) if err != nil { return nil, resp, err } return assignees, resp, nil } // IsAssignee checks if a user is an assignee for the specified repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#check-if-a-user-can-be-assigned func (s *IssuesService) IsAssignee(ctx context.Context, owner, repo, user string) (bool, *Response, error) { u := fmt.Sprintf("repos/%v/%v/assignees/%v", owner, repo, user) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return false, nil, err } resp, err := s.client.Do(ctx, req, nil) assignee, err := parseBoolResponse(err) return assignee, resp, err } // AddAssignees adds the provided GitHub users as assignees to the issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#add-assignees-to-an-issue func (s *IssuesService) AddAssignees(ctx context.Context, owner, repo string, number int, assignees []string) (*Issue, *Response, error) { users := &struct { Assignees []string `json:"assignees,omitempty"` }{Assignees: assignees} u := fmt.Sprintf("repos/%v/%v/issues/%v/assignees", owner, repo, number) req, err := s.client.NewRequest("POST", u, users) if err != nil { return nil, nil, err } issue := &Issue{} resp, err := s.client.Do(ctx, req, issue) return issue, resp, err } // RemoveAssignees removes the provided GitHub users as assignees from the issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#remove-assignees-from-an-issue func (s *IssuesService) RemoveAssignees(ctx context.Context, owner, repo string, number int, assignees []string) (*Issue, *Response, error) { users := &struct { Assignees []string `json:"assignees,omitempty"` }{Assignees: assignees} u := fmt.Sprintf("repos/%v/%v/issues/%v/assignees", owner, repo, number) req, err := s.client.NewRequest("DELETE", u, users) if err != nil { return nil, nil, err } issue := &Issue{} resp, err := s.client.Do(ctx, req, issue) return issue, resp, err } go-github-38.1.0/github/issues_assignees_test.go000066400000000000000000000156141410475703100217250ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestIssuesService_ListAssignees(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/assignees", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() assignees, _, err := client.Issues.ListAssignees(ctx, "o", "r", opt) if err != nil { t.Errorf("Issues.ListAssignees returned error: %v", err) } want := []*User{{ID: Int64(1)}} if !cmp.Equal(assignees, want) { t.Errorf("Issues.ListAssignees returned %+v, want %+v", assignees, want) } const methodName = "ListAssignees" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.ListAssignees(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.ListAssignees(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_ListAssignees_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.ListAssignees(ctx, "%", "r", nil) testURLParseError(t, err) } func TestIssuesService_IsAssignee_true(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/assignees/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") }) ctx := context.Background() assignee, _, err := client.Issues.IsAssignee(ctx, "o", "r", "u") if err != nil { t.Errorf("Issues.IsAssignee returned error: %v", err) } if want := true; assignee != want { t.Errorf("Issues.IsAssignee returned %+v, want %+v", assignee, want) } const methodName = "IsAssignee" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.IsAssignee(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.IsAssignee(ctx, "o", "r", "u") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) } return resp, err }) } func TestIssuesService_IsAssignee_false(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/assignees/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() assignee, _, err := client.Issues.IsAssignee(ctx, "o", "r", "u") if err != nil { t.Errorf("Issues.IsAssignee returned error: %v", err) } if want := false; assignee != want { t.Errorf("Issues.IsAssignee returned %+v, want %+v", assignee, want) } const methodName = "IsAssignee" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.IsAssignee(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.IsAssignee(ctx, "o", "r", "u") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) } return resp, err }) } func TestIssuesService_IsAssignee_error(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/assignees/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Error(w, "BadRequest", http.StatusBadRequest) }) ctx := context.Background() assignee, _, err := client.Issues.IsAssignee(ctx, "o", "r", "u") if err == nil { t.Errorf("Expected HTTP 400 response") } if want := false; assignee != want { t.Errorf("Issues.IsAssignee returned %+v, want %+v", assignee, want) } const methodName = "IsAssignee" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.IsAssignee(ctx, "o", "r", "u") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.IsAssignee(ctx, "o", "r", "u") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) } return resp, err }) } func TestIssuesService_IsAssignee_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.IsAssignee(ctx, "%", "r", "u") testURLParseError(t, err) } func TestIssuesService_AddAssignees(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/1/assignees", func(w http.ResponseWriter, r *http.Request) { var assignees struct { Assignees []string `json:"assignees,omitempty"` } json.NewDecoder(r.Body).Decode(&assignees) testMethod(t, r, "POST") want := []string{"user1", "user2"} if !cmp.Equal(assignees.Assignees, want) { t.Errorf("assignees = %+v, want %+v", assignees, want) } fmt.Fprint(w, `{"number":1,"assignees":[{"login":"user1"},{"login":"user2"}]}`) }) ctx := context.Background() got, _, err := client.Issues.AddAssignees(ctx, "o", "r", 1, []string{"user1", "user2"}) if err != nil { t.Errorf("Issues.AddAssignees returned error: %v", err) } want := &Issue{Number: Int(1), Assignees: []*User{{Login: String("user1")}, {Login: String("user2")}}} if !cmp.Equal(got, want) { t.Errorf("Issues.AddAssignees = %+v, want %+v", got, want) } const methodName = "AddAssignees" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.AddAssignees(ctx, "\n", "\n", -1, []string{"\n", "\n"}) return err }) } func TestIssuesService_RemoveAssignees(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/1/assignees", func(w http.ResponseWriter, r *http.Request) { var assignees struct { Assignees []string `json:"assignees,omitempty"` } json.NewDecoder(r.Body).Decode(&assignees) testMethod(t, r, "DELETE") want := []string{"user1", "user2"} if !cmp.Equal(assignees.Assignees, want) { t.Errorf("assignees = %+v, want %+v", assignees, want) } fmt.Fprint(w, `{"number":1,"assignees":[]}`) }) ctx := context.Background() got, _, err := client.Issues.RemoveAssignees(ctx, "o", "r", 1, []string{"user1", "user2"}) if err != nil { t.Errorf("Issues.RemoveAssignees returned error: %v", err) } want := &Issue{Number: Int(1), Assignees: []*User{}} if !cmp.Equal(got, want) { t.Errorf("Issues.RemoveAssignees = %+v, want %+v", got, want) } const methodName = "RemoveAssignees" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.RemoveAssignees(ctx, "\n", "\n", -1, []string{"\n", "\n"}) return err }) } go-github-38.1.0/github/issues_comments.go000066400000000000000000000124211410475703100205230ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "time" ) // IssueComment represents a comment left on an issue. type IssueComment struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Body *string `json:"body,omitempty"` User *User `json:"user,omitempty"` Reactions *Reactions `json:"reactions,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` UpdatedAt *time.Time `json:"updated_at,omitempty"` // AuthorAssociation is the comment author's relationship to the issue's repository. // Possible values are "COLLABORATOR", "CONTRIBUTOR", "FIRST_TIMER", "FIRST_TIME_CONTRIBUTOR", "MEMBER", "OWNER", or "NONE". AuthorAssociation *string `json:"author_association,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` IssueURL *string `json:"issue_url,omitempty"` } func (i IssueComment) String() string { return Stringify(i) } // IssueListCommentsOptions specifies the optional parameters to the // IssuesService.ListComments method. type IssueListCommentsOptions struct { // Sort specifies how to sort comments. Possible values are: created, updated. Sort *string `url:"sort,omitempty"` // Direction in which to sort comments. Possible values are: asc, desc. Direction *string `url:"direction,omitempty"` // Since filters comments by time. Since *time.Time `url:"since,omitempty"` ListOptions } // ListComments lists all comments on the specified issue. Specifying an issue // number of 0 will return all comments on all issues for the repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#list-issue-comments // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#list-issue-comments-for-a-repository func (s *IssuesService) ListComments(ctx context.Context, owner string, repo string, number int, opts *IssueListCommentsOptions) ([]*IssueComment, *Response, error) { var u string if number == 0 { u = fmt.Sprintf("repos/%v/%v/issues/comments", owner, repo) } else { u = fmt.Sprintf("repos/%v/%v/issues/%d/comments", owner, repo, number) } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeReactionsPreview) var comments []*IssueComment resp, err := s.client.Do(ctx, req, &comments) if err != nil { return nil, resp, err } return comments, resp, nil } // GetComment fetches the specified issue comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#get-an-issue-comment func (s *IssuesService) GetComment(ctx context.Context, owner string, repo string, commentID int64) (*IssueComment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/comments/%d", owner, repo, commentID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeReactionsPreview) comment := new(IssueComment) resp, err := s.client.Do(ctx, req, comment) if err != nil { return nil, resp, err } return comment, resp, nil } // CreateComment creates a new comment on the specified issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#create-an-issue-comment func (s *IssuesService) CreateComment(ctx context.Context, owner string, repo string, number int, comment *IssueComment) (*IssueComment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%d/comments", owner, repo, number) req, err := s.client.NewRequest("POST", u, comment) if err != nil { return nil, nil, err } c := new(IssueComment) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } // EditComment updates an issue comment. // A non-nil comment.Body must be provided. Other comment fields should be left nil. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#update-an-issue-comment func (s *IssuesService) EditComment(ctx context.Context, owner string, repo string, commentID int64, comment *IssueComment) (*IssueComment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/comments/%d", owner, repo, commentID) req, err := s.client.NewRequest("PATCH", u, comment) if err != nil { return nil, nil, err } c := new(IssueComment) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } // DeleteComment deletes an issue comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#delete-an-issue-comment func (s *IssuesService) DeleteComment(ctx context.Context, owner string, repo string, commentID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/comments/%d", owner, repo, commentID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/issues_comments_test.go000066400000000000000000000236071410475703100215720ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestIssuesService_ListComments_allIssues(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/comments", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) testFormValues(t, r, values{ "sort": "updated", "direction": "desc", "since": "2002-02-10T15:30:00Z", "page": "2", }) fmt.Fprint(w, `[{"id":1}]`) }) since := time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC) opt := &IssueListCommentsOptions{ Sort: String("updated"), Direction: String("desc"), Since: &since, ListOptions: ListOptions{Page: 2}, } ctx := context.Background() comments, _, err := client.Issues.ListComments(ctx, "o", "r", 0, opt) if err != nil { t.Errorf("Issues.ListComments returned error: %v", err) } want := []*IssueComment{{ID: Int64(1)}} if !cmp.Equal(comments, want) { t.Errorf("Issues.ListComments returned %+v, want %+v", comments, want) } const methodName = "ListComments" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.ListComments(ctx, "\n", "\n", -1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.ListComments(ctx, "o", "r", 0, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_ListComments_specificIssue(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/1/comments", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) fmt.Fprint(w, `[{"id":1}]`) }) ctx := context.Background() comments, _, err := client.Issues.ListComments(ctx, "o", "r", 1, nil) if err != nil { t.Errorf("Issues.ListComments returned error: %v", err) } want := []*IssueComment{{ID: Int64(1)}} if !cmp.Equal(comments, want) { t.Errorf("Issues.ListComments returned %+v, want %+v", comments, want) } const methodName = "ListComments" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.ListComments(ctx, "\n", "\n", -1, nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.ListComments(ctx, "o", "r", 1, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_ListComments_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.ListComments(ctx, "%", "r", 1, nil) testURLParseError(t, err) } func TestIssuesService_GetComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/comments/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() comment, _, err := client.Issues.GetComment(ctx, "o", "r", 1) if err != nil { t.Errorf("Issues.GetComment returned error: %v", err) } want := &IssueComment{ID: Int64(1)} if !cmp.Equal(comment, want) { t.Errorf("Issues.GetComment returned %+v, want %+v", comment, want) } const methodName = "GetComment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.GetComment(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.GetComment(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_GetComment_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.GetComment(ctx, "%", "r", 1) testURLParseError(t, err) } func TestIssuesService_CreateComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &IssueComment{Body: String("b")} mux.HandleFunc("/repos/o/r/issues/1/comments", func(w http.ResponseWriter, r *http.Request) { v := new(IssueComment) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() comment, _, err := client.Issues.CreateComment(ctx, "o", "r", 1, input) if err != nil { t.Errorf("Issues.CreateComment returned error: %v", err) } want := &IssueComment{ID: Int64(1)} if !cmp.Equal(comment, want) { t.Errorf("Issues.CreateComment returned %+v, want %+v", comment, want) } const methodName = "CreateComment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.CreateComment(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.CreateComment(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_CreateComment_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.CreateComment(ctx, "%", "r", 1, nil) testURLParseError(t, err) } func TestIssuesService_EditComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &IssueComment{Body: String("b")} mux.HandleFunc("/repos/o/r/issues/comments/1", func(w http.ResponseWriter, r *http.Request) { v := new(IssueComment) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() comment, _, err := client.Issues.EditComment(ctx, "o", "r", 1, input) if err != nil { t.Errorf("Issues.EditComment returned error: %v", err) } want := &IssueComment{ID: Int64(1)} if !cmp.Equal(comment, want) { t.Errorf("Issues.EditComment returned %+v, want %+v", comment, want) } const methodName = "EditComment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.EditComment(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.EditComment(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_EditComment_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.EditComment(ctx, "%", "r", 1, nil) testURLParseError(t, err) } func TestIssuesService_DeleteComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/comments/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Issues.DeleteComment(ctx, "o", "r", 1) if err != nil { t.Errorf("Issues.DeleteComments returned error: %v", err) } const methodName = "DeleteComment" testBadOptions(t, methodName, func() (err error) { _, err = client.Issues.DeleteComment(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Issues.DeleteComment(ctx, "o", "r", 1) }) } func TestIssuesService_DeleteComment_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Issues.DeleteComment(ctx, "%", "r", 1) testURLParseError(t, err) } func TestIssueComment_Marshal(t *testing.T) { testJSONMarshal(t, &IssueComment{}, "{}") u := &IssueComment{ ID: Int64(1), NodeID: String("nid"), Body: String("body"), User: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Reactions: &Reactions{TotalCount: Int(1)}, CreatedAt: &referenceTime, UpdatedAt: &referenceTime, AuthorAssociation: String("aa"), URL: String("url"), HTMLURL: String("hurl"), IssueURL: String("iurl"), } want := `{ "id": 1, "node_id": "nid", "body": "body", "user": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "reactions": { "total_count": 1 }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "author_association": "aa", "url": "url", "html_url": "hurl", "issue_url": "iurl" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/issues_events.go000066400000000000000000000135331410475703100202070ustar00rootroot00000000000000// 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 ( "context" "fmt" "time" ) // IssueEvent represents an event that occurred around an Issue or Pull Request. type IssueEvent struct { ID *int64 `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 Actor closed the issue. // If the issue was closed by commit message, CommitID holds the SHA1 hash of the commit. // // merged // The Actor merged into master a branch containing a commit mentioning the issue. // CommitID holds the SHA1 of the merge commit. // // referenced // The Actor committed to master a commit mentioning the issue in its commit message. // CommitID holds the SHA1 of the commit. // // reopened, unlocked // The Actor did that to the issue. // // locked // The Actor locked the issue. // LockReason holds the reason of locking the issue (if provided while locking). // // renamed // The Actor changed the issue title from Rename.From to Rename.To. // // mentioned // Someone unspecified @mentioned the Actor [sic] in an issue comment body. // // assigned, unassigned // The Assigner assigned the issue to or removed the assignment from the Assignee. // // labeled, unlabeled // The Actor added or removed the Label from the issue. // // milestoned, demilestoned // The Actor added or removed the issue from the Milestone. // // subscribed, unsubscribed // The Actor subscribed to or unsubscribed from notifications for an issue. // // head_ref_deleted, head_ref_restored // The pull request’s branch was deleted or restored. // // review_dismissed // The review was dismissed and `DismissedReview` will be populated below. // // review_requested, review_request_removed // The Actor requested or removed the request for a review. // RequestedReviewer and ReviewRequester will be populated below. // Event *string `json:"event,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` Issue *Issue `json:"issue,omitempty"` // Only present on certain events; see above. Assignee *User `json:"assignee,omitempty"` Assigner *User `json:"assigner,omitempty"` CommitID *string `json:"commit_id,omitempty"` Milestone *Milestone `json:"milestone,omitempty"` Label *Label `json:"label,omitempty"` Rename *Rename `json:"rename,omitempty"` LockReason *string `json:"lock_reason,omitempty"` ProjectCard *ProjectCard `json:"project_card,omitempty"` DismissedReview *DismissedReview `json:"dismissed_review,omitempty"` RequestedReviewer *User `json:"requested_reviewer,omitempty"` ReviewRequester *User `json:"review_requester,omitempty"` } // DismissedReview represents details for 'dismissed_review' events. type DismissedReview struct { // State represents the state of the dismissed review. // Possible values are: "commented", "approved", and "changes_requested". State *string `json:"state,omitempty"` ReviewID *int64 `json:"review_id,omitempty"` DismissalMessage *string `json:"dismissal_message,omitempty"` DismissalCommitID *string `json:"dismissal_commit_id,omitempty"` } // ListIssueEvents lists events for the specified issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#list-issue-events func (s *IssuesService) ListIssueEvents(ctx context.Context, owner, repo string, number int, opts *ListOptions) ([]*IssueEvent, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%v/events", owner, repo, number) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeProjectCardDetailsPreview) var events []*IssueEvent resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListRepositoryEvents lists events for the specified repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#list-issue-events-for-a-repository func (s *IssuesService) ListRepositoryEvents(ctx context.Context, owner, repo string, opts *ListOptions) ([]*IssueEvent, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/events", owner, repo) u, err := addOptions(u, opts) 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(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // GetEvent returns the specified issue event. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#get-an-issue-event func (s *IssuesService) GetEvent(ctx context.Context, owner, repo string, id int64) (*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(ctx, req, event) if err != nil { return nil, resp, err } return event, resp, nil } // Rename contains details for 'renamed' events. type Rename struct { From *string `json:"from,omitempty"` To *string `json:"to,omitempty"` } func (r Rename) String() string { return Stringify(r) } go-github-38.1.0/github/issues_events_test.go000066400000000000000000000247301410475703100212470ustar00rootroot00000000000000// 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestIssuesService_ListIssueEvents(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/1/events", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeProjectCardDetailsPreview) testFormValues(t, r, values{ "page": "1", "per_page": "2", }) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 1, PerPage: 2} ctx := context.Background() events, _, err := client.Issues.ListIssueEvents(ctx, "o", "r", 1, opt) if err != nil { t.Errorf("Issues.ListIssueEvents returned error: %v", err) } want := []*IssueEvent{{ID: Int64(1)}} if !cmp.Equal(events, want) { t.Errorf("Issues.ListIssueEvents returned %+v, want %+v", events, want) } const methodName = "ListIssueEvents" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.ListIssueEvents(ctx, "\n", "\n", -1, &ListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.ListIssueEvents(ctx, "o", "r", 1, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_ListRepositoryEvents(t *testing.T) { client, mux, _, teardown := 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} ctx := context.Background() events, _, err := client.Issues.ListRepositoryEvents(ctx, "o", "r", opt) if err != nil { t.Errorf("Issues.ListRepositoryEvents returned error: %v", err) } want := []*IssueEvent{{ID: Int64(1)}} if !cmp.Equal(events, want) { t.Errorf("Issues.ListRepositoryEvents returned %+v, want %+v", events, want) } const methodName = "ListRepositoryEvents" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.ListRepositoryEvents(ctx, "\n", "\n", &ListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.ListRepositoryEvents(ctx, "o", "r", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_GetEvent(t *testing.T) { client, mux, _, teardown := 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}`) }) ctx := context.Background() event, _, err := client.Issues.GetEvent(ctx, "o", "r", 1) if err != nil { t.Errorf("Issues.GetEvent returned error: %v", err) } want := &IssueEvent{ID: Int64(1)} if !cmp.Equal(event, want) { t.Errorf("Issues.GetEvent returned %+v, want %+v", event, want) } const methodName = "GetEvent" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.GetEvent(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.GetEvent(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRename_Marshal(t *testing.T) { testJSONMarshal(t, &Rename{}, "{}") u := &Rename{ From: String("from"), To: String("to"), } want := `{ "from": "from", "to": "to" }` testJSONMarshal(t, u, want) } func TestDismissedReview_Marshal(t *testing.T) { testJSONMarshal(t, &DismissedReview{}, "{}") u := &DismissedReview{ State: String("state"), ReviewID: Int64(1), DismissalMessage: String("dm"), DismissalCommitID: String("dcid"), } want := `{ "state": "state", "review_id": 1, "dismissal_message": "dm", "dismissal_commit_id": "dcid" }` testJSONMarshal(t, u, want) } func TestIssueEvent_Marshal(t *testing.T) { testJSONMarshal(t, &IssueEvent{}, "{}") u := &IssueEvent{ ID: Int64(1), URL: String("url"), Actor: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Event: String("event"), CreatedAt: &referenceTime, Issue: &Issue{ID: Int64(1)}, Assignee: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Assigner: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, CommitID: String("cid"), Milestone: &Milestone{ID: Int64(1)}, Label: &Label{ID: Int64(1)}, Rename: &Rename{ From: String("from"), To: String("to"), }, LockReason: String("lr"), ProjectCard: &ProjectCard{ID: Int64(1)}, DismissedReview: &DismissedReview{ State: String("state"), ReviewID: Int64(1), DismissalMessage: String("dm"), DismissalCommitID: String("dcid"), }, RequestedReviewer: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, ReviewRequester: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "id": 1, "url": "url", "actor": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "event": "event", "created_at": ` + referenceTimeStr + `, "issue": { "id": 1 }, "assignee": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "assigner": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "commit_id": "cid", "milestone": { "id": 1 }, "label": { "id": 1 }, "rename": { "from": "from", "to": "to" }, "lock_reason": "lr", "project_card": { "id": 1 }, "dismissed_review": { "state": "state", "review_id": 1, "dismissal_message": "dm", "dismissal_commit_id": "dcid" }, "requested_reviewer": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "review_requester": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" } }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/issues_labels.go000066400000000000000000000157751410475703100201570ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" ) // Label represents a GitHub label on an Issue type Label struct { ID *int64 `json:"id,omitempty"` URL *string `json:"url,omitempty"` Name *string `json:"name,omitempty"` Color *string `json:"color,omitempty"` Description *string `json:"description,omitempty"` Default *bool `json:"default,omitempty"` NodeID *string `json:"node_id,omitempty"` } func (l Label) String() string { return Stringify(l) } // ListLabels lists all labels for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#list-labels-for-a-repository func (s *IssuesService) ListLabels(ctx context.Context, owner string, repo string, opts *ListOptions) ([]*Label, *Response, error) { u := fmt.Sprintf("repos/%v/%v/labels", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var labels []*Label resp, err := s.client.Do(ctx, req, &labels) if err != nil { return nil, resp, err } return labels, resp, nil } // GetLabel gets a single label. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#get-a-label func (s *IssuesService) GetLabel(ctx context.Context, owner string, repo string, name string) (*Label, *Response, error) { u := fmt.Sprintf("repos/%v/%v/labels/%v", owner, repo, name) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } label := new(Label) resp, err := s.client.Do(ctx, req, label) if err != nil { return nil, resp, err } return label, resp, nil } // CreateLabel creates a new label on the specified repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#create-a-label func (s *IssuesService) CreateLabel(ctx context.Context, owner string, repo string, label *Label) (*Label, *Response, error) { u := fmt.Sprintf("repos/%v/%v/labels", owner, repo) req, err := s.client.NewRequest("POST", u, label) if err != nil { return nil, nil, err } l := new(Label) resp, err := s.client.Do(ctx, req, l) if err != nil { return nil, resp, err } return l, resp, nil } // EditLabel edits a label. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#update-a-label func (s *IssuesService) EditLabel(ctx context.Context, owner string, repo string, name string, label *Label) (*Label, *Response, error) { u := fmt.Sprintf("repos/%v/%v/labels/%v", owner, repo, name) req, err := s.client.NewRequest("PATCH", u, label) if err != nil { return nil, nil, err } l := new(Label) resp, err := s.client.Do(ctx, req, l) if err != nil { return nil, resp, err } return l, resp, nil } // DeleteLabel deletes a label. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#delete-a-label func (s *IssuesService) DeleteLabel(ctx context.Context, owner string, repo string, name string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/labels/%v", owner, repo, name) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListLabelsByIssue lists all labels for an issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#list-labels-for-an-issue func (s *IssuesService) ListLabelsByIssue(ctx context.Context, owner string, repo string, number int, opts *ListOptions) ([]*Label, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%d/labels", owner, repo, number) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var labels []*Label resp, err := s.client.Do(ctx, req, &labels) if err != nil { return nil, resp, err } return labels, resp, nil } // AddLabelsToIssue adds labels to an issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#add-labels-to-an-issue func (s *IssuesService) AddLabelsToIssue(ctx context.Context, owner string, repo string, number int, labels []string) ([]*Label, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%d/labels", owner, repo, number) req, err := s.client.NewRequest("POST", u, labels) if err != nil { return nil, nil, err } var l []*Label resp, err := s.client.Do(ctx, req, &l) if err != nil { return nil, resp, err } return l, resp, nil } // RemoveLabelForIssue removes a label for an issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#remove-a-label-from-an-issue func (s *IssuesService) RemoveLabelForIssue(ctx context.Context, owner string, repo string, number int, label string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%d/labels/%v", owner, repo, number, label) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ReplaceLabelsForIssue replaces all labels for an issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#set-labels-for-an-issue func (s *IssuesService) ReplaceLabelsForIssue(ctx context.Context, owner string, repo string, number int, labels []string) ([]*Label, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%d/labels", owner, repo, number) req, err := s.client.NewRequest("PUT", u, labels) if err != nil { return nil, nil, err } var l []*Label resp, err := s.client.Do(ctx, req, &l) if err != nil { return nil, resp, err } return l, resp, nil } // RemoveLabelsForIssue removes all labels for an issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#remove-all-labels-from-an-issue func (s *IssuesService) RemoveLabelsForIssue(ctx context.Context, owner string, repo string, number int) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%d/labels", owner, repo, number) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListLabelsForMilestone lists labels for every issue in a milestone. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#list-labels-for-issues-in-a-milestone func (s *IssuesService) ListLabelsForMilestone(ctx context.Context, owner string, repo string, number int, opts *ListOptions) ([]*Label, *Response, error) { u := fmt.Sprintf("repos/%v/%v/milestones/%d/labels", owner, repo, number) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var labels []*Label resp, err := s.client.Do(ctx, req, &labels) if err != nil { return nil, resp, err } return labels, resp, nil } go-github-38.1.0/github/issues_labels_test.go000066400000000000000000000355611410475703100212110ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestIssuesService_ListLabels(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/labels", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"name": "a"},{"name": "b"}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() labels, _, err := client.Issues.ListLabels(ctx, "o", "r", opt) if err != nil { t.Errorf("Issues.ListLabels returned error: %v", err) } want := []*Label{{Name: String("a")}, {Name: String("b")}} if !cmp.Equal(labels, want) { t.Errorf("Issues.ListLabels returned %+v, want %+v", labels, want) } const methodName = "ListLabels" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.ListLabels(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.ListLabels(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_ListLabels_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.ListLabels(ctx, "%", "%", nil) testURLParseError(t, err) } func TestIssuesService_GetLabel(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/labels/n", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"url":"u", "name": "n", "color": "c", "description": "d"}`) }) ctx := context.Background() label, _, err := client.Issues.GetLabel(ctx, "o", "r", "n") if err != nil { t.Errorf("Issues.GetLabel returned error: %v", err) } want := &Label{URL: String("u"), Name: String("n"), Color: String("c"), Description: String("d")} if !cmp.Equal(label, want) { t.Errorf("Issues.GetLabel returned %+v, want %+v", label, want) } const methodName = "GetLabel" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.GetLabel(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.GetLabel(ctx, "o", "r", "n") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_GetLabel_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.GetLabel(ctx, "%", "%", "%") testURLParseError(t, err) } func TestIssuesService_CreateLabel(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Label{Name: String("n")} mux.HandleFunc("/repos/o/r/labels", func(w http.ResponseWriter, r *http.Request) { v := new(Label) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"url":"u"}`) }) ctx := context.Background() label, _, err := client.Issues.CreateLabel(ctx, "o", "r", input) if err != nil { t.Errorf("Issues.CreateLabel returned error: %v", err) } want := &Label{URL: String("u")} if !cmp.Equal(label, want) { t.Errorf("Issues.CreateLabel returned %+v, want %+v", label, want) } const methodName = "CreateLabel" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.CreateLabel(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.CreateLabel(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_CreateLabel_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.CreateLabel(ctx, "%", "%", nil) testURLParseError(t, err) } func TestIssuesService_EditLabel(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Label{Name: String("z")} mux.HandleFunc("/repos/o/r/labels/n", func(w http.ResponseWriter, r *http.Request) { v := new(Label) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"url":"u"}`) }) ctx := context.Background() label, _, err := client.Issues.EditLabel(ctx, "o", "r", "n", input) if err != nil { t.Errorf("Issues.EditLabel returned error: %v", err) } want := &Label{URL: String("u")} if !cmp.Equal(label, want) { t.Errorf("Issues.EditLabel returned %+v, want %+v", label, want) } const methodName = "EditLabel" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.EditLabel(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.EditLabel(ctx, "o", "r", "n", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_EditLabel_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.EditLabel(ctx, "%", "%", "%", nil) testURLParseError(t, err) } func TestIssuesService_DeleteLabel(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/labels/n", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Issues.DeleteLabel(ctx, "o", "r", "n") if err != nil { t.Errorf("Issues.DeleteLabel returned error: %v", err) } const methodName = "DeleteLabel" testBadOptions(t, methodName, func() (err error) { _, err = client.Issues.DeleteLabel(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Issues.DeleteLabel(ctx, "o", "r", "n") }) } func TestIssuesService_DeleteLabel_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Issues.DeleteLabel(ctx, "%", "%", "%") testURLParseError(t, err) } func TestIssuesService_ListLabelsByIssue(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/1/labels", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"name":"a","id":1},{"name":"b","id":2}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() labels, _, err := client.Issues.ListLabelsByIssue(ctx, "o", "r", 1, opt) if err != nil { t.Errorf("Issues.ListLabelsByIssue returned error: %v", err) } want := []*Label{ {Name: String("a"), ID: Int64(1)}, {Name: String("b"), ID: Int64(2)}, } if !cmp.Equal(labels, want) { t.Errorf("Issues.ListLabelsByIssue returned %+v, want %+v", labels, want) } const methodName = "ListLabelsByIssue" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.ListLabelsByIssue(ctx, "\n", "\n", -1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.ListLabelsByIssue(ctx, "o", "r", 1, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_ListLabelsByIssue_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.ListLabelsByIssue(ctx, "%", "%", 1, nil) testURLParseError(t, err) } func TestIssuesService_AddLabelsToIssue(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := []string{"a", "b"} mux.HandleFunc("/repos/o/r/issues/1/labels", func(w http.ResponseWriter, r *http.Request) { var v []string json.NewDecoder(r.Body).Decode(&v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `[{"url":"u"}]`) }) ctx := context.Background() labels, _, err := client.Issues.AddLabelsToIssue(ctx, "o", "r", 1, input) if err != nil { t.Errorf("Issues.AddLabelsToIssue returned error: %v", err) } want := []*Label{{URL: String("u")}} if !cmp.Equal(labels, want) { t.Errorf("Issues.AddLabelsToIssue returned %+v, want %+v", labels, want) } const methodName = "AddLabelsToIssue" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.AddLabelsToIssue(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.AddLabelsToIssue(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_AddLabelsToIssue_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.AddLabelsToIssue(ctx, "%", "%", 1, nil) testURLParseError(t, err) } func TestIssuesService_RemoveLabelForIssue(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/1/labels/l", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Issues.RemoveLabelForIssue(ctx, "o", "r", 1, "l") if err != nil { t.Errorf("Issues.RemoveLabelForIssue returned error: %v", err) } const methodName = "RemoveLabelForIssue" testBadOptions(t, methodName, func() (err error) { _, err = client.Issues.RemoveLabelForIssue(ctx, "\n", "\n", -1, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Issues.RemoveLabelForIssue(ctx, "o", "r", 1, "l") }) } func TestIssuesService_RemoveLabelForIssue_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Issues.RemoveLabelForIssue(ctx, "%", "%", 1, "%") testURLParseError(t, err) } func TestIssuesService_ReplaceLabelsForIssue(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := []string{"a", "b"} mux.HandleFunc("/repos/o/r/issues/1/labels", func(w http.ResponseWriter, r *http.Request) { var v []string json.NewDecoder(r.Body).Decode(&v) testMethod(t, r, "PUT") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `[{"url":"u"}]`) }) ctx := context.Background() labels, _, err := client.Issues.ReplaceLabelsForIssue(ctx, "o", "r", 1, input) if err != nil { t.Errorf("Issues.ReplaceLabelsForIssue returned error: %v", err) } want := []*Label{{URL: String("u")}} if !cmp.Equal(labels, want) { t.Errorf("Issues.ReplaceLabelsForIssue returned %+v, want %+v", labels, want) } const methodName = "ReplaceLabelsForIssue" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.ReplaceLabelsForIssue(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.ReplaceLabelsForIssue(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_ReplaceLabelsForIssue_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.ReplaceLabelsForIssue(ctx, "%", "%", 1, nil) testURLParseError(t, err) } func TestIssuesService_RemoveLabelsForIssue(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/1/labels", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Issues.RemoveLabelsForIssue(ctx, "o", "r", 1) if err != nil { t.Errorf("Issues.RemoveLabelsForIssue returned error: %v", err) } const methodName = "RemoveLabelsForIssue" testBadOptions(t, methodName, func() (err error) { _, err = client.Issues.RemoveLabelsForIssue(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Issues.RemoveLabelsForIssue(ctx, "o", "r", 1) }) } func TestIssuesService_RemoveLabelsForIssue_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Issues.RemoveLabelsForIssue(ctx, "%", "%", 1) testURLParseError(t, err) } func TestIssuesService_ListLabelsForMilestone(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/milestones/1/labels", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"name": "a"},{"name": "b"}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() labels, _, err := client.Issues.ListLabelsForMilestone(ctx, "o", "r", 1, opt) if err != nil { t.Errorf("Issues.ListLabelsForMilestone returned error: %v", err) } want := []*Label{{Name: String("a")}, {Name: String("b")}} if !cmp.Equal(labels, want) { t.Errorf("Issues.ListLabelsForMilestone returned %+v, want %+v", labels, want) } const methodName = "ListLabelsForMilestone" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.ListLabelsForMilestone(ctx, "\n", "\n", -1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.ListLabelsForMilestone(ctx, "o", "r", 1, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_ListLabelsForMilestone_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.ListLabelsForMilestone(ctx, "%", "%", 1, nil) testURLParseError(t, err) } func TestLabel_Marshal(t *testing.T) { testJSONMarshal(t, &Label{}, "{}") u := &Label{ ID: Int64(1), URL: String("url"), Name: String("name"), Color: String("color"), Description: String("desc"), Default: Bool(false), NodeID: String("nid"), } want := `{ "id": 1, "url": "url", "name": "name", "color": "color", "description": "desc", "default": false, "node_id": "nid" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/issues_milestones.go000066400000000000000000000112651410475703100210650ustar00rootroot00000000000000// 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 ( "context" "fmt" "time" ) // Milestone represents a GitHub repository milestone. type Milestone struct { URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` LabelsURL *string `json:"labels_url,omitempty"` ID *int64 `json:"id,omitempty"` Number *int `json:"number,omitempty"` State *string `json:"state,omitempty"` Title *string `json:"title,omitempty"` Description *string `json:"description,omitempty"` Creator *User `json:"creator,omitempty"` OpenIssues *int `json:"open_issues,omitempty"` ClosedIssues *int `json:"closed_issues,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` UpdatedAt *time.Time `json:"updated_at,omitempty"` ClosedAt *time.Time `json:"closed_at,omitempty"` DueOn *time.Time `json:"due_on,omitempty"` NodeID *string `json:"node_id,omitempty"` } func (m Milestone) String() string { return Stringify(m) } // MilestoneListOptions specifies the optional parameters to the // IssuesService.ListMilestones method. type MilestoneListOptions struct { // State filters milestones based on their state. Possible values are: // open, closed, all. Default is "open". State string `url:"state,omitempty"` // Sort specifies how to sort milestones. Possible values are: due_on, completeness. // Default value is "due_on". Sort string `url:"sort,omitempty"` // Direction in which to sort milestones. Possible values are: asc, desc. // Default is "asc". Direction string `url:"direction,omitempty"` ListOptions } // ListMilestones lists all milestones for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#list-milestones func (s *IssuesService) ListMilestones(ctx context.Context, owner string, repo string, opts *MilestoneListOptions) ([]*Milestone, *Response, error) { u := fmt.Sprintf("repos/%v/%v/milestones", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var milestones []*Milestone resp, err := s.client.Do(ctx, req, &milestones) if err != nil { return nil, resp, err } return milestones, resp, nil } // GetMilestone gets a single milestone. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#get-a-milestone func (s *IssuesService) GetMilestone(ctx context.Context, owner string, repo string, number int) (*Milestone, *Response, error) { u := fmt.Sprintf("repos/%v/%v/milestones/%d", owner, repo, number) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } milestone := new(Milestone) resp, err := s.client.Do(ctx, req, milestone) if err != nil { return nil, resp, err } return milestone, resp, nil } // CreateMilestone creates a new milestone on the specified repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#create-a-milestone func (s *IssuesService) CreateMilestone(ctx context.Context, owner string, repo string, milestone *Milestone) (*Milestone, *Response, error) { u := fmt.Sprintf("repos/%v/%v/milestones", owner, repo) req, err := s.client.NewRequest("POST", u, milestone) if err != nil { return nil, nil, err } m := new(Milestone) resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // EditMilestone edits a milestone. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#update-a-milestone func (s *IssuesService) EditMilestone(ctx context.Context, owner string, repo string, number int, milestone *Milestone) (*Milestone, *Response, error) { u := fmt.Sprintf("repos/%v/%v/milestones/%d", owner, repo, number) req, err := s.client.NewRequest("PATCH", u, milestone) if err != nil { return nil, nil, err } m := new(Milestone) resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteMilestone deletes a milestone. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#delete-a-milestone func (s *IssuesService) DeleteMilestone(ctx context.Context, owner string, repo string, number int) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/milestones/%d", owner, repo, number) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/issues_milestones_test.go000066400000000000000000000215321410475703100221220ustar00rootroot00000000000000// 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestIssuesService_ListMilestones(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/milestones", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "state": "closed", "sort": "due_date", "direction": "asc", "page": "2", }) fmt.Fprint(w, `[{"number":1}]`) }) opt := &MilestoneListOptions{"closed", "due_date", "asc", ListOptions{Page: 2}} ctx := context.Background() milestones, _, err := client.Issues.ListMilestones(ctx, "o", "r", opt) if err != nil { t.Errorf("IssuesService.ListMilestones returned error: %v", err) } want := []*Milestone{{Number: Int(1)}} if !cmp.Equal(milestones, want) { t.Errorf("IssuesService.ListMilestones returned %+v, want %+v", milestones, want) } const methodName = "ListMilestones" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.ListMilestones(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.ListMilestones(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_ListMilestones_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.ListMilestones(ctx, "%", "r", nil) testURLParseError(t, err) } func TestIssuesService_GetMilestone(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/milestones/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"number":1}`) }) ctx := context.Background() milestone, _, err := client.Issues.GetMilestone(ctx, "o", "r", 1) if err != nil { t.Errorf("IssuesService.GetMilestone returned error: %v", err) } want := &Milestone{Number: Int(1)} if !cmp.Equal(milestone, want) { t.Errorf("IssuesService.GetMilestone returned %+v, want %+v", milestone, want) } const methodName = "GetMilestone" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.GetMilestone(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.GetMilestone(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_GetMilestone_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.GetMilestone(ctx, "%", "r", 1) testURLParseError(t, err) } func TestIssuesService_CreateMilestone(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Milestone{Title: String("t")} mux.HandleFunc("/repos/o/r/milestones", func(w http.ResponseWriter, r *http.Request) { v := new(Milestone) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"number":1}`) }) ctx := context.Background() milestone, _, err := client.Issues.CreateMilestone(ctx, "o", "r", input) if err != nil { t.Errorf("IssuesService.CreateMilestone returned error: %v", err) } want := &Milestone{Number: Int(1)} if !cmp.Equal(milestone, want) { t.Errorf("IssuesService.CreateMilestone returned %+v, want %+v", milestone, want) } const methodName = "CreateMilestone" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.CreateMilestone(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.CreateMilestone(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_CreateMilestone_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.CreateMilestone(ctx, "%", "r", nil) testURLParseError(t, err) } func TestIssuesService_EditMilestone(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Milestone{Title: String("t")} mux.HandleFunc("/repos/o/r/milestones/1", func(w http.ResponseWriter, r *http.Request) { v := new(Milestone) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"number":1}`) }) ctx := context.Background() milestone, _, err := client.Issues.EditMilestone(ctx, "o", "r", 1, input) if err != nil { t.Errorf("IssuesService.EditMilestone returned error: %v", err) } want := &Milestone{Number: Int(1)} if !cmp.Equal(milestone, want) { t.Errorf("IssuesService.EditMilestone returned %+v, want %+v", milestone, want) } const methodName = "EditMilestone" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.EditMilestone(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.EditMilestone(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_EditMilestone_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.EditMilestone(ctx, "%", "r", 1, nil) testURLParseError(t, err) } func TestIssuesService_DeleteMilestone(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/milestones/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Issues.DeleteMilestone(ctx, "o", "r", 1) if err != nil { t.Errorf("IssuesService.DeleteMilestone returned error: %v", err) } const methodName = "DeleteMilestone" testBadOptions(t, methodName, func() (err error) { _, err = client.Issues.DeleteMilestone(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Issues.DeleteMilestone(ctx, "o", "r", 1) }) } func TestIssuesService_DeleteMilestone_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Issues.DeleteMilestone(ctx, "%", "r", 1) testURLParseError(t, err) } func TestMilestone_Marshal(t *testing.T) { testJSONMarshal(t, &Milestone{}, "{}") u := &Milestone{ URL: String("url"), HTMLURL: String("hurl"), LabelsURL: String("lurl"), ID: Int64(1), Number: Int(1), State: String("state"), Title: String("title"), Description: String("desc"), Creator: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("tu"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, OpenIssues: Int(1), ClosedIssues: Int(1), CreatedAt: &referenceTime, UpdatedAt: &referenceTime, ClosedAt: &referenceTime, DueOn: &referenceTime, NodeID: String("nid"), } want := `{ "url": "url", "html_url": "hurl", "labels_url": "lurl", "id": 1, "number": 1, "state": "state", "title": "title", "description": "desc", "creator": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "tu", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "open_issues": 1, "closed_issues": 1, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "closed_at": ` + referenceTimeStr + `, "due_on": ` + referenceTimeStr + `, "node_id": "nid" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/issues_test.go000066400000000000000000000351741410475703100176670ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestIssuesService_List_all(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/issues", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) testFormValues(t, r, values{ "filter": "all", "state": "closed", "labels": "a,b", "sort": "updated", "direction": "asc", "since": "2002-02-10T15:30:00Z", "page": "1", "per_page": "2", }) fmt.Fprint(w, `[{"number":1}]`) }) opt := &IssueListOptions{ "all", "closed", []string{"a", "b"}, "updated", "asc", time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC), ListOptions{Page: 1, PerPage: 2}, } ctx := context.Background() issues, _, err := client.Issues.List(ctx, true, opt) if err != nil { t.Errorf("Issues.List returned error: %v", err) } want := []*Issue{{Number: Int(1)}} if !cmp.Equal(issues, want) { t.Errorf("Issues.List returned %+v, want %+v", issues, want) } const methodName = "List" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.List(ctx, true, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_List_owned(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/issues", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) fmt.Fprint(w, `[{"number":1}]`) }) ctx := context.Background() issues, _, err := client.Issues.List(ctx, false, nil) if err != nil { t.Errorf("Issues.List returned error: %v", err) } want := []*Issue{{Number: Int(1)}} if !cmp.Equal(issues, want) { t.Errorf("Issues.List returned %+v, want %+v", issues, want) } } func TestIssuesService_ListByOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/issues", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) fmt.Fprint(w, `[{"number":1}]`) }) ctx := context.Background() issues, _, err := client.Issues.ListByOrg(ctx, "o", nil) if err != nil { t.Errorf("Issues.ListByOrg returned error: %v", err) } want := []*Issue{{Number: Int(1)}} if !cmp.Equal(issues, want) { t.Errorf("Issues.List returned %+v, want %+v", issues, want) } const methodName = "ListByOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.ListByOrg(ctx, "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.ListByOrg(ctx, "o", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_ListByOrg_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.ListByOrg(ctx, "%", nil) testURLParseError(t, err) } func TestIssuesService_ListByRepo(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) testFormValues(t, r, values{ "milestone": "*", "state": "closed", "assignee": "a", "creator": "c", "mentioned": "m", "labels": "a,b", "sort": "updated", "direction": "asc", "since": "2002-02-10T15:30:00Z", }) fmt.Fprint(w, `[{"number":1}]`) }) opt := &IssueListByRepoOptions{ "*", "closed", "a", "c", "m", []string{"a", "b"}, "updated", "asc", time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC), ListOptions{0, 0}, } ctx := context.Background() issues, _, err := client.Issues.ListByRepo(ctx, "o", "r", opt) if err != nil { t.Errorf("Issues.ListByOrg returned error: %v", err) } want := []*Issue{{Number: Int(1)}} if !cmp.Equal(issues, want) { t.Errorf("Issues.List returned %+v, want %+v", issues, want) } const methodName = "ListByRepo" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.ListByRepo(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.ListByRepo(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_ListByRepo_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.ListByRepo(ctx, "%", "r", nil) testURLParseError(t, err) } func TestIssuesService_Get(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) fmt.Fprint(w, `{"number":1, "author_association": "MEMBER","labels": [{"url": "u", "name": "n", "color": "c"}]}`) }) ctx := context.Background() issue, _, err := client.Issues.Get(ctx, "o", "r", 1) if err != nil { t.Errorf("Issues.Get returned error: %v", err) } want := &Issue{ Number: Int(1), AuthorAssociation: String("MEMBER"), Labels: []*Label{{ URL: String("u"), Name: String("n"), Color: String("c"), }}, } if !cmp.Equal(issue, want) { t.Errorf("Issues.Get returned %+v, want %+v", issue, want) } const methodName = "Get" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.Get(ctx, "\n", "\n", 1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.Get(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_Get_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.Get(ctx, "%", "r", 1) testURLParseError(t, err) } func TestIssuesService_Create(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &IssueRequest{ Title: String("t"), Body: String("b"), Assignee: String("a"), Labels: &[]string{"l1", "l2"}, } mux.HandleFunc("/repos/o/r/issues", func(w http.ResponseWriter, r *http.Request) { v := new(IssueRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"number":1}`) }) ctx := context.Background() issue, _, err := client.Issues.Create(ctx, "o", "r", input) if err != nil { t.Errorf("Issues.Create returned error: %v", err) } want := &Issue{Number: Int(1)} if !cmp.Equal(issue, want) { t.Errorf("Issues.Create returned %+v, want %+v", issue, want) } const methodName = "Create" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.Create(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.Create(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_Create_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.Create(ctx, "%", "r", nil) testURLParseError(t, err) } func TestIssuesService_Edit(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &IssueRequest{Title: String("t")} mux.HandleFunc("/repos/o/r/issues/1", func(w http.ResponseWriter, r *http.Request) { v := new(IssueRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"number":1}`) }) ctx := context.Background() issue, _, err := client.Issues.Edit(ctx, "o", "r", 1, input) if err != nil { t.Errorf("Issues.Edit returned error: %v", err) } want := &Issue{Number: Int(1)} if !cmp.Equal(issue, want) { t.Errorf("Issues.Edit returned %+v, want %+v", issue, want) } const methodName = "Edit" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.Edit(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.Edit(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssuesService_Edit_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.Edit(ctx, "%", "r", 1, nil) testURLParseError(t, err) } func TestIssuesService_Lock(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/1/lock", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Issues.Lock(ctx, "o", "r", 1, nil); err != nil { t.Errorf("Issues.Lock returned error: %v", err) } const methodName = "Lock" testBadOptions(t, methodName, func() (err error) { _, err = client.Issues.Lock(ctx, "\n", "\n", -1, nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Issues.Lock(ctx, "o", "r", 1, nil) }) } func TestIssuesService_LockWithReason(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/1/lock", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") w.WriteHeader(http.StatusNoContent) }) opt := &LockIssueOptions{LockReason: "off-topic"} ctx := context.Background() if _, err := client.Issues.Lock(ctx, "o", "r", 1, opt); err != nil { t.Errorf("Issues.Lock returned error: %v", err) } } func TestIssuesService_Unlock(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/1/lock", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Issues.Unlock(ctx, "o", "r", 1); err != nil { t.Errorf("Issues.Unlock returned error: %v", err) } const methodName = "Unlock" testBadOptions(t, methodName, func() (err error) { _, err = client.Issues.Unlock(ctx, "\n", "\n", 1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Issues.Unlock(ctx, "o", "r", 1) }) } func TestIsPullRequest(t *testing.T) { i := new(Issue) if i.IsPullRequest() == true { t.Errorf("expected i.IsPullRequest (%v) to return false, got true", i) } i.PullRequestLinks = &PullRequestLinks{URL: String("http://example.com")} if i.IsPullRequest() == false { t.Errorf("expected i.IsPullRequest (%v) to return true, got false", i) } } func TestLockIssueOptions_Marshal(t *testing.T) { testJSONMarshal(t, &LockIssueOptions{}, "{}") u := &LockIssueOptions{ LockReason: "lr", } want := `{ "lock_reason": "lr" }` testJSONMarshal(t, u, want) } func TestPullRequestLinks_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestLinks{}, "{}") u := &PullRequestLinks{ URL: String("url"), HTMLURL: String("hurl"), DiffURL: String("durl"), PatchURL: String("purl"), } want := `{ "url": "url", "html_url": "hurl", "diff_url": "durl", "patch_url": "purl" }` testJSONMarshal(t, u, want) } func TestIssueRequest_Marshal(t *testing.T) { testJSONMarshal(t, &IssueRequest{}, "{}") u := &IssueRequest{ Title: String("url"), Body: String("url"), Labels: &[]string{"l"}, Assignee: String("url"), State: String("url"), Milestone: Int(1), Assignees: &[]string{"a"}, } want := `{ "title": "url", "body": "url", "labels": [ "l" ], "assignee": "url", "state": "url", "milestone": 1, "assignees": [ "a" ] }` testJSONMarshal(t, u, want) } func TestIssue_Marshal(t *testing.T) { testJSONMarshal(t, &Issue{}, "{}") u := &Issue{ ID: Int64(1), Number: Int(1), State: String("s"), Locked: Bool(false), Title: String("title"), Body: String("body"), AuthorAssociation: String("aa"), User: &User{ID: Int64(1)}, Labels: []*Label{{ID: Int64(1)}}, Assignee: &User{ID: Int64(1)}, Comments: Int(1), ClosedAt: &referenceTime, CreatedAt: &referenceTime, UpdatedAt: &referenceTime, ClosedBy: &User{ID: Int64(1)}, URL: String("url"), HTMLURL: String("hurl"), CommentsURL: String("curl"), EventsURL: String("eurl"), LabelsURL: String("lurl"), RepositoryURL: String("rurl"), Milestone: &Milestone{ID: Int64(1)}, PullRequestLinks: &PullRequestLinks{URL: String("url")}, Repository: &Repository{ID: Int64(1)}, Reactions: &Reactions{TotalCount: Int(1)}, Assignees: []*User{{ID: Int64(1)}}, NodeID: String("nid"), TextMatches: []*TextMatch{{ObjectURL: String("ourl")}}, ActiveLockReason: String("alr"), } want := `{ "id": 1, "number": 1, "state": "s", "locked": false, "title": "title", "body": "body", "author_association": "aa", "user": { "id": 1 }, "labels": [ { "id": 1 } ], "assignee": { "id": 1 }, "comments": 1, "closed_at": ` + referenceTimeStr + `, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "closed_by": { "id": 1 }, "url": "url", "html_url": "hurl", "comments_url": "curl", "events_url": "eurl", "labels_url": "lurl", "repository_url": "rurl", "milestone": { "id": 1 }, "pull_request": { "url": "url" }, "repository": { "id": 1 }, "reactions": { "total_count": 1 }, "assignees": [ { "id": 1 } ], "node_id": "nid", "text_matches": [ { "object_url": "ourl" } ], "active_lock_reason": "alr" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/issues_timeline.go000066400000000000000000000124331410475703100205070ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" "strings" "time" ) // Timeline represents an event that occurred around an Issue or Pull Request. // // It is similar to an IssueEvent but may contain more information. // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/timeline/ type Timeline struct { ID *int64 `json:"id,omitempty"` URL *string `json:"url,omitempty"` CommitURL *string `json:"commit_url,omitempty"` // The User object that generated the event. Actor *User `json:"actor,omitempty"` // Event identifies the actual type of Event that occurred. Possible values // are: // // assigned // The issue was assigned to the assignee. // // 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. // // commented // A comment was added to the issue. // // committed // A commit was added to the pull request's 'HEAD' branch. Only provided // for pull requests. // // cross-referenced // The issue was referenced from another issue. The 'source' attribute // contains the 'id', 'actor', and 'url' of the reference's source. // // demilestoned // The issue was removed from a milestone. // // head_ref_deleted // The pull request's branch was deleted. // // head_ref_restored // The pull request's branch was restored. // // labeled // A label was added to the issue. // // locked // The issue was locked by the actor. // // mentioned // The actor was @mentioned in an issue body. // // merged // The issue was merged by the actor. The 'commit_id' attribute is the // SHA1 of the HEAD commit that was merged. // // milestoned // The issue was added to a milestone. // // referenced // The issue was referenced from a commit message. The 'commit_id' // attribute is the commit SHA1 of where that happened. // // renamed // The issue title was changed. // // reopened // The issue was reopened by the actor. // // reviewed // The pull request was reviewed. // // subscribed // The actor subscribed to receive notifications for an issue. // // unassigned // The assignee was unassigned from the issue. // // unlabeled // A label was removed from the issue. // // unlocked // The issue was unlocked by the actor. // // unsubscribed // The actor unsubscribed to stop receiving notifications for an issue. // Event *string `json:"event,omitempty"` // The string SHA of a commit that referenced this Issue or Pull Request. CommitID *string `json:"commit_id,omitempty"` // The timestamp indicating when the event occurred. CreatedAt *time.Time `json:"created_at,omitempty"` // The Label object including `name` and `color` attributes. Only provided for // 'labeled' and 'unlabeled' events. Label *Label `json:"label,omitempty"` // The User object which was assigned to (or unassigned from) this Issue or // Pull Request. Only provided for 'assigned' and 'unassigned' events. Assignee *User `json:"assignee,omitempty"` // The Milestone object including a 'title' attribute. // Only provided for 'milestoned' and 'demilestoned' events. Milestone *Milestone `json:"milestone,omitempty"` // The 'id', 'actor', and 'url' for the source of a reference from another issue. // Only provided for 'cross-referenced' events. Source *Source `json:"source,omitempty"` // An object containing rename details including 'from' and 'to' attributes. // Only provided for 'renamed' events. Rename *Rename `json:"rename,omitempty"` ProjectCard *ProjectCard `json:"project_card,omitempty"` // The state of a submitted review. Can be one of: 'commented', // 'changes_requested' or 'approved'. // Only provided for 'reviewed' events. State *string `json:"state,omitempty"` } // Source represents a reference's source. type Source struct { ID *int64 `json:"id,omitempty"` URL *string `json:"url,omitempty"` Actor *User `json:"actor,omitempty"` Type *string `json:"type,omitempty"` Issue *Issue `json:"issue,omitempty"` } // ListIssueTimeline lists events for the specified issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/issues/#list-timeline-events-for-an-issue func (s *IssuesService) ListIssueTimeline(ctx context.Context, owner, repo string, number int, opts *ListOptions) ([]*Timeline, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%v/timeline", owner, repo, number) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. acceptHeaders := []string{mediaTypeTimelinePreview, mediaTypeProjectCardDetailsPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) var events []*Timeline resp, err := s.client.Do(ctx, req, &events) return events, resp, err } go-github-38.1.0/github/issues_timeline_test.go000066400000000000000000000132331410475703100215450ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" "net/http" "strings" "testing" "github.com/google/go-cmp/cmp" ) func TestIssuesService_ListIssueTimeline(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeTimelinePreview, mediaTypeProjectCardDetailsPreview} mux.HandleFunc("/repos/o/r/issues/1/timeline", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) testFormValues(t, r, values{ "page": "1", "per_page": "2", }) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 1, PerPage: 2} ctx := context.Background() events, _, err := client.Issues.ListIssueTimeline(ctx, "o", "r", 1, opt) if err != nil { t.Errorf("Issues.ListIssueTimeline returned error: %v", err) } want := []*Timeline{{ID: Int64(1)}} if !cmp.Equal(events, want) { t.Errorf("Issues.ListIssueTimeline = %+v, want %+v", events, want) } const methodName = "ListIssueTimeline" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.ListIssueTimeline(ctx, "\n", "\n", -1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.ListIssueTimeline(ctx, "o", "r", 1, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestSource_Marshal(t *testing.T) { testJSONMarshal(t, &Source{}, "{}") u := &Source{ ID: Int64(1), URL: String("url"), Actor: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Type: String("type"), Issue: &Issue{ID: Int64(1)}, } want := `{ "id": 1, "url": "url", "actor": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "type": "type", "issue": { "id": 1 } }` testJSONMarshal(t, u, want) } func TestTimeline_Marshal(t *testing.T) { testJSONMarshal(t, &Timeline{}, "{}") u := &Timeline{ ID: Int64(1), URL: String("url"), CommitURL: String("curl"), Actor: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Event: String("event"), CommitID: String("cid"), CreatedAt: &referenceTime, Label: &Label{ID: Int64(1)}, Assignee: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Milestone: &Milestone{ID: Int64(1)}, Source: &Source{ ID: Int64(1), URL: String("url"), Actor: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Type: String("type"), Issue: &Issue{ID: Int64(1)}, }, Rename: &Rename{ From: String("from"), To: String("to"), }, ProjectCard: &ProjectCard{ID: Int64(1)}, State: String("state"), } want := `{ "id": 1, "url": "url", "commit_url": "curl", "actor": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "event": "event", "commit_id": "cid", "created_at": ` + referenceTimeStr + `, "label": { "id": 1 }, "assignee": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "milestone": { "id": 1 }, "source": { "id": 1, "url": "url", "actor": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "type": "type", "issue": { "id": 1 } }, "rename": { "from": "from", "to": "to" }, "project_card": { "id": 1 }, "state": "state" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/licenses.go000066400000000000000000000055601410475703100171160ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" ) // LicensesService handles communication with the license related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/licenses/ type LicensesService service // RepositoryLicense represents the license for a repository. type RepositoryLicense struct { Name *string `json:"name,omitempty"` Path *string `json:"path,omitempty"` SHA *string `json:"sha,omitempty"` Size *int `json:"size,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` GitURL *string `json:"git_url,omitempty"` DownloadURL *string `json:"download_url,omitempty"` Type *string `json:"type,omitempty"` Content *string `json:"content,omitempty"` Encoding *string `json:"encoding,omitempty"` License *License `json:"license,omitempty"` } func (l RepositoryLicense) String() string { return Stringify(l) } // License represents an open source license. type License struct { Key *string `json:"key,omitempty"` Name *string `json:"name,omitempty"` URL *string `json:"url,omitempty"` SPDXID *string `json:"spdx_id,omitempty"` HTMLURL *string `json:"html_url,omitempty"` Featured *bool `json:"featured,omitempty"` Description *string `json:"description,omitempty"` Implementation *string `json:"implementation,omitempty"` Permissions *[]string `json:"permissions,omitempty"` Conditions *[]string `json:"conditions,omitempty"` Limitations *[]string `json:"limitations,omitempty"` Body *string `json:"body,omitempty"` } func (l License) String() string { return Stringify(l) } // List popular open source licenses. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/licenses/#list-all-licenses func (s *LicensesService) List(ctx context.Context) ([]*License, *Response, error) { req, err := s.client.NewRequest("GET", "licenses", nil) if err != nil { return nil, nil, err } var licenses []*License resp, err := s.client.Do(ctx, req, &licenses) if err != nil { return nil, resp, err } return licenses, resp, nil } // Get extended metadata for one license. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/licenses/#get-a-license func (s *LicensesService) Get(ctx context.Context, licenseName string) (*License, *Response, error) { u := fmt.Sprintf("licenses/%s", licenseName) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } license := new(License) resp, err := s.client.Do(ctx, req, license) if err != nil { return nil, resp, err } return license, resp, nil } go-github-38.1.0/github/licenses_test.go000066400000000000000000000110111410475703100201410ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoryLicense_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryLicense{}, "{}") rl := &RepositoryLicense{ Name: String("n"), Path: String("p"), SHA: String("s"), Size: Int(1), URL: String("u"), HTMLURL: String("h"), GitURL: String("g"), DownloadURL: String("d"), Type: String("t"), Content: String("c"), Encoding: String("e"), License: &License{ Key: String("k"), Name: String("n"), URL: String("u"), SPDXID: String("s"), HTMLURL: String("h"), Featured: Bool(true), Description: String("d"), Implementation: String("i"), Permissions: &[]string{"p"}, Conditions: &[]string{"c"}, Limitations: &[]string{"l"}, Body: String("b"), }, } want := `{ "name": "n", "path": "p", "sha": "s", "size": 1, "url": "u", "html_url": "h", "git_url": "g", "download_url": "d", "type": "t", "content": "c", "encoding": "e", "license": { "key": "k", "name": "n", "url": "u", "spdx_id": "s", "html_url": "h", "featured": true, "description": "d", "implementation": "i", "permissions": ["p"], "conditions": ["c"], "limitations": ["l"], "body": "b" } }` testJSONMarshal(t, rl, want) } func TestLicense_Marshal(t *testing.T) { testJSONMarshal(t, &License{}, "{}") l := &License{ Key: String("k"), Name: String("n"), URL: String("u"), SPDXID: String("s"), HTMLURL: String("h"), Featured: Bool(true), Description: String("d"), Implementation: String("i"), Permissions: &[]string{"p"}, Conditions: &[]string{"c"}, Limitations: &[]string{"l"}, Body: String("b"), } want := `{ "key": "k", "name": "n", "url": "u", "spdx_id": "s", "html_url": "h", "featured": true, "description": "d", "implementation": "i", "permissions": ["p"], "conditions": ["c"], "limitations": ["l"], "body": "b" }` testJSONMarshal(t, l, want) } func TestLicensesService_List(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/licenses", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"key":"mit","name":"MIT","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","featured":true}]`) }) ctx := context.Background() licenses, _, err := client.Licenses.List(ctx) if err != nil { t.Errorf("Licenses.List returned error: %v", err) } want := []*License{{ Key: String("mit"), Name: String("MIT"), SPDXID: String("MIT"), URL: String("https://api.github.com/licenses/mit"), Featured: Bool(true), }} if !cmp.Equal(licenses, want) { t.Errorf("Licenses.List returned %+v, want %+v", licenses, want) } const methodName = "List" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Licenses.List(ctx) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestLicensesService_Get(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/licenses/mit", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"key":"mit","name":"MIT"}`) }) ctx := context.Background() license, _, err := client.Licenses.Get(ctx, "mit") if err != nil { t.Errorf("Licenses.Get returned error: %v", err) } want := &License{Key: String("mit"), Name: String("MIT")} if !cmp.Equal(license, want) { t.Errorf("Licenses.Get returned %+v, want %+v", license, want) } const methodName = "Get" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Licenses.Get(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Licenses.Get(ctx, "mit") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestLicensesService_Get_invalidTemplate(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Licenses.Get(ctx, "%") testURLParseError(t, err) } go-github-38.1.0/github/messages.go000066400000000000000000000260651410475703100171230ustar00rootroot00000000000000// Copyright 2016 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. // This file provides functions for validating payloads from GitHub Webhooks. // GitHub API docs: https://developer.github.com/webhooks/securing/#validating-payloads-from-github package github import ( "crypto/hmac" "crypto/sha1" "crypto/sha256" "crypto/sha512" "encoding/hex" "encoding/json" "errors" "fmt" "hash" "io" "io/ioutil" "mime" "net/http" "net/url" "strings" ) const ( // sha1Prefix is the prefix used by GitHub before the HMAC hexdigest. sha1Prefix = "sha1" // sha256Prefix and sha512Prefix are provided for future compatibility. sha256Prefix = "sha256" sha512Prefix = "sha512" // SHA1SignatureHeader is the GitHub header key used to pass the HMAC-SHA1 hexdigest. SHA1SignatureHeader = "X-Hub-Signature" // SHA256SignatureHeader is the GitHub header key used to pass the HMAC-SHA256 hexdigest. SHA256SignatureHeader = "X-Hub-Signature-256" // EventTypeHeader is the GitHub header key used to pass the event type. EventTypeHeader = "X-Github-Event" // DeliveryIDHeader is the GitHub header key used to pass the unique ID for the webhook event. DeliveryIDHeader = "X-Github-Delivery" ) var ( // eventTypeMapping maps webhooks types to their corresponding go-github struct types. eventTypeMapping = map[string]string{ "check_run": "CheckRunEvent", "check_suite": "CheckSuiteEvent", "commit_comment": "CommitCommentEvent", "content_reference": "ContentReferenceEvent", "create": "CreateEvent", "delete": "DeleteEvent", "deploy_key": "DeployKeyEvent", "deployment": "DeploymentEvent", "deployment_status": "DeploymentStatusEvent", "fork": "ForkEvent", "github_app_authorization": "GitHubAppAuthorizationEvent", "gollum": "GollumEvent", "installation": "InstallationEvent", "installation_repositories": "InstallationRepositoriesEvent", "issue_comment": "IssueCommentEvent", "issues": "IssuesEvent", "label": "LabelEvent", "marketplace_purchase": "MarketplacePurchaseEvent", "member": "MemberEvent", "membership": "MembershipEvent", "meta": "MetaEvent", "milestone": "MilestoneEvent", "organization": "OrganizationEvent", "org_block": "OrgBlockEvent", "package": "PackageEvent", "page_build": "PageBuildEvent", "ping": "PingEvent", "project": "ProjectEvent", "project_card": "ProjectCardEvent", "project_column": "ProjectColumnEvent", "public": "PublicEvent", "pull_request": "PullRequestEvent", "pull_request_review": "PullRequestReviewEvent", "pull_request_review_comment": "PullRequestReviewCommentEvent", "pull_request_target": "PullRequestTargetEvent", "push": "PushEvent", "repository": "RepositoryEvent", "repository_dispatch": "RepositoryDispatchEvent", "repository_vulnerability_alert": "RepositoryVulnerabilityAlertEvent", "release": "ReleaseEvent", "star": "StarEvent", "status": "StatusEvent", "team": "TeamEvent", "team_add": "TeamAddEvent", "user": "UserEvent", "watch": "WatchEvent", "workflow_dispatch": "WorkflowDispatchEvent", "workflow_run": "WorkflowRunEvent", } ) // genMAC generates the HMAC signature for a message provided the secret key // and hashFunc. func genMAC(message, key []byte, hashFunc func() hash.Hash) []byte { mac := hmac.New(hashFunc, key) mac.Write(message) return mac.Sum(nil) } // checkMAC reports whether messageMAC is a valid HMAC tag for message. func checkMAC(message, messageMAC, key []byte, hashFunc func() hash.Hash) bool { expectedMAC := genMAC(message, key, hashFunc) return hmac.Equal(messageMAC, expectedMAC) } // messageMAC returns the hex-decoded HMAC tag from the signature and its // corresponding hash function. func messageMAC(signature string) ([]byte, func() hash.Hash, error) { if signature == "" { return nil, nil, errors.New("missing signature") } sigParts := strings.SplitN(signature, "=", 2) if len(sigParts) != 2 { return nil, nil, fmt.Errorf("error parsing signature %q", signature) } var hashFunc func() hash.Hash switch sigParts[0] { case sha1Prefix: hashFunc = sha1.New case sha256Prefix: hashFunc = sha256.New case sha512Prefix: hashFunc = sha512.New default: return nil, nil, fmt.Errorf("unknown hash type prefix: %q", sigParts[0]) } buf, err := hex.DecodeString(sigParts[1]) if err != nil { return nil, nil, fmt.Errorf("error decoding signature %q: %v", signature, err) } return buf, hashFunc, nil } // ValidatePayload validates an incoming GitHub Webhook event request body // and returns the (JSON) payload. // The Content-Type header of the payload can be "application/json" or "application/x-www-form-urlencoded". // If the Content-Type is neither then an error is returned. // secretToken is the GitHub Webhook secret token. // If your webhook does not contain a secret token, you can pass nil or an empty slice. // This is intended for local development purposes only and all webhooks should ideally set up a secret token. // // Example usage: // // func (s *GitHubEventMonitor) ServeHTTP(w http.ResponseWriter, r *http.Request) { // // read signature from request // signature := "" // payload, err := github.ValidatePayloadFromBody(r.Header.Get("Content-Type"), r.Body, signature, s.webhookSecretKey) // if err != nil { ... } // // Process payload... // } func ValidatePayloadFromBody(contentType string, readable io.Reader, signature string, secretToken []byte) (payload []byte, err error) { var body []byte // Raw body that GitHub uses to calculate the signature. switch contentType { case "application/json": var err error if body, err = ioutil.ReadAll(readable); err != nil { return nil, err } // If the content type is application/json, // the JSON payload is just the original body. payload = body case "application/x-www-form-urlencoded": // payloadFormParam is the name of the form parameter that the JSON payload // will be in if a webhook has its content type set to application/x-www-form-urlencoded. const payloadFormParam = "payload" var err error if body, err = ioutil.ReadAll(readable); err != nil { return nil, err } // If the content type is application/x-www-form-urlencoded, // the JSON payload will be under the "payload" form param. form, err := url.ParseQuery(string(body)) if err != nil { return nil, err } payload = []byte(form.Get(payloadFormParam)) default: return nil, fmt.Errorf("Webhook request has unsupported Content-Type %q", contentType) } // Only validate the signature if a secret token exists. This is intended for // local development only and all webhooks should ideally set up a secret token. if len(secretToken) > 0 { if err := ValidateSignature(signature, body, secretToken); err != nil { return nil, err } } return payload, nil } // ValidatePayload validates an incoming GitHub Webhook event request // and returns the (JSON) payload. // The Content-Type header of the payload can be "application/json" or "application/x-www-form-urlencoded". // If the Content-Type is neither then an error is returned. // secretToken is the GitHub Webhook secret token. // If your webhook does not contain a secret token, you can pass nil or an empty slice. // This is intended for local development purposes only and all webhooks should ideally set up a secret token. // // Example usage: // // func (s *GitHubEventMonitor) ServeHTTP(w http.ResponseWriter, r *http.Request) { // payload, err := github.ValidatePayload(r, s.webhookSecretKey) // if err != nil { ... } // // Process payload... // } // func ValidatePayload(r *http.Request, secretToken []byte) (payload []byte, err error) { signature := r.Header.Get(SHA256SignatureHeader) if signature == "" { signature = r.Header.Get(SHA1SignatureHeader) } contentType, _, err := mime.ParseMediaType(r.Header.Get("Content-Type")) if err != nil { return nil, err } return ValidatePayloadFromBody(contentType, r.Body, signature, secretToken) } // ValidateSignature validates the signature for the given payload. // signature is the GitHub hash signature delivered in the X-Hub-Signature header. // payload is the JSON payload sent by GitHub Webhooks. // secretToken is the GitHub Webhook secret token. // // GitHub API docs: https://developer.github.com/webhooks/securing/#validating-payloads-from-github func ValidateSignature(signature string, payload, secretToken []byte) error { messageMAC, hashFunc, err := messageMAC(signature) if err != nil { return err } if !checkMAC(payload, messageMAC, secretToken, hashFunc) { return errors.New("payload signature check failed") } return nil } // WebHookType returns the event type of webhook request r. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/hooks/#webhook-headers func WebHookType(r *http.Request) string { return r.Header.Get(EventTypeHeader) } // DeliveryID returns the unique delivery ID of webhook request r. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/hooks/#webhook-headers func DeliveryID(r *http.Request) string { return r.Header.Get(DeliveryIDHeader) } // ParseWebHook parses the event payload. For recognized event types, a // value of the corresponding struct type will be returned (as returned // by Event.ParsePayload()). An error will be returned for unrecognized event // types. // // Example usage: // // func (s *GitHubEventMonitor) ServeHTTP(w http.ResponseWriter, r *http.Request) { // payload, err := github.ValidatePayload(r, s.webhookSecretKey) // if err != nil { ... } // event, err := github.ParseWebHook(github.WebHookType(r), payload) // if err != nil { ... } // switch event := event.(type) { // case *github.CommitCommentEvent: // processCommitCommentEvent(event) // case *github.CreateEvent: // processCreateEvent(event) // ... // } // } // func ParseWebHook(messageType string, payload []byte) (interface{}, error) { eventType, ok := eventTypeMapping[messageType] if !ok { return nil, fmt.Errorf("unknown X-Github-Event in message: %v", messageType) } event := Event{ Type: &eventType, RawPayload: (*json.RawMessage)(&payload), } return event.ParsePayload() } go-github-38.1.0/github/messages_test.go000066400000000000000000000311421410475703100201520ustar00rootroot00000000000000// Copyright 2016 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 ( "bytes" "encoding/json" "errors" "fmt" "net/http" "net/url" "strings" "testing" "github.com/google/go-cmp/cmp" ) func TestMessageMAC_BadHashTypePrefix(t *testing.T) { const signature = "bogus1=1234567" if _, _, err := messageMAC(signature); err == nil { t.Fatal("messageMAC returned nil; wanted error") } } func TestValidatePayload(t *testing.T) { const defaultBody = `{"yo":true}` // All tests below use the default request body and signature. const defaultSignature = "sha1=126f2c800419c60137ce748d7672e77b65cf16d6" secretKey := []byte("0123456789abcdef") tests := []struct { signature string signatureHeader string eventID string event string wantEventID string wantEvent string wantPayload string }{ // The following tests generate expected errors: {}, // Missing signature {signature: "yo"}, // Missing signature prefix {signature: "sha1=yo"}, // Signature not hex string {signature: "sha1=012345"}, // Invalid signature // The following tests expect err=nil: { signature: defaultSignature, eventID: "dead-beef", event: "ping", wantEventID: "dead-beef", wantEvent: "ping", wantPayload: defaultBody, }, { signature: defaultSignature, event: "ping", wantEvent: "ping", wantPayload: defaultBody, }, { signature: "sha256=b1f8020f5b4cd42042f807dd939015c4a418bc1ff7f604dd55b0a19b5d953d9b", event: "ping", wantEvent: "ping", wantPayload: defaultBody, }, { signature: "sha256=b1f8020f5b4cd42042f807dd939015c4a418bc1ff7f604dd55b0a19b5d953d9b", signatureHeader: SHA256SignatureHeader, event: "ping", wantEvent: "ping", wantPayload: defaultBody, }, { signature: "sha512=8456767023c1195682e182a23b3f5d19150ecea598fde8cb85918f7281b16079471b1329f92b912c4d8bd7455cb159777db8f29608b20c7c87323ba65ae62e1f", event: "ping", wantEvent: "ping", wantPayload: defaultBody, }, } for _, test := range tests { buf := bytes.NewBufferString(defaultBody) req, err := http.NewRequest("GET", "http://localhost/event", buf) if err != nil { t.Fatalf("NewRequest: %v", err) } if test.signature != "" { if test.signatureHeader != "" { req.Header.Set(test.signatureHeader, test.signature) } else { req.Header.Set(SHA1SignatureHeader, test.signature) } } req.Header.Set("Content-Type", "application/json") got, err := ValidatePayload(req, secretKey) if err != nil { if test.wantPayload != "" { t.Errorf("ValidatePayload(%#v): err = %v, want nil", test, err) } continue } if string(got) != test.wantPayload { t.Errorf("ValidatePayload = %q, want %q", got, test.wantPayload) } } } func TestValidatePayload_FormGet(t *testing.T) { payload := `{"yo":true}` signature := "sha1=3374ef144403e8035423b23b02e2c9d7a4c50368" secretKey := []byte("0123456789abcdef") form := url.Values{} form.Add("payload", payload) req, err := http.NewRequest("POST", "http://localhost/event", strings.NewReader(form.Encode())) if err != nil { t.Fatalf("NewRequest: %v", err) } req.PostForm = form req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.Header.Set(SHA1SignatureHeader, signature) got, err := ValidatePayload(req, secretKey) if err != nil { t.Errorf("ValidatePayload(%#v): err = %v, want nil", payload, err) } if string(got) != payload { t.Errorf("ValidatePayload = %q, want %q", got, payload) } // check that if payload is invalid we get error req.Header.Set(SHA1SignatureHeader, "invalid signature") if _, err = ValidatePayload(req, []byte{0}); err == nil { t.Error("ValidatePayload = nil, want err") } } func TestValidatePayload_FormPost(t *testing.T) { payload := `{"yo":true}` signature := "sha1=3374ef144403e8035423b23b02e2c9d7a4c50368" secretKey := []byte("0123456789abcdef") form := url.Values{} form.Set("payload", payload) buf := bytes.NewBufferString(form.Encode()) req, err := http.NewRequest("POST", "http://localhost/event", buf) if err != nil { t.Fatalf("NewRequest: %v", err) } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.Header.Set(SHA1SignatureHeader, signature) got, err := ValidatePayload(req, secretKey) if err != nil { t.Errorf("ValidatePayload(%#v): err = %v, want nil", payload, err) } if string(got) != payload { t.Errorf("ValidatePayload = %q, want %q", got, payload) } // check that if payload is invalid we get error req.Header.Set(SHA1SignatureHeader, "invalid signature") if _, err = ValidatePayload(req, []byte{0}); err == nil { t.Error("ValidatePayload = nil, want err") } } func TestValidatePayload_InvalidContentType(t *testing.T) { req, err := http.NewRequest("POST", "http://localhost/event", nil) if err != nil { t.Fatalf("NewRequest: %v", err) } req.Header.Set("Content-Type", "invalid content type") if _, err = ValidatePayload(req, nil); err == nil { t.Error("ValidatePayload = nil, want err") } } func TestValidatePayload_NoSecretKey(t *testing.T) { payload := `{"yo":true}` form := url.Values{} form.Set("payload", payload) buf := bytes.NewBufferString(form.Encode()) req, err := http.NewRequest("POST", "http://localhost/event", buf) if err != nil { t.Fatalf("NewRequest: %v", err) } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") got, err := ValidatePayload(req, nil) if err != nil { t.Errorf("ValidatePayload(%#v): err = %v, want nil", payload, err) } if string(got) != payload { t.Errorf("ValidatePayload = %q, want %q", got, payload) } } // badReader satisfies io.Reader but always returns an error. type badReader struct{} func (b *badReader) Read(p []byte) (int, error) { return 0, errors.New("bad reader") } func (b *badReader) Close() error { return errors.New("bad reader") } func TestValidatePayload_BadRequestBody(t *testing.T) { tests := []struct { contentType string }{ {contentType: "application/json"}, {contentType: "application/x-www-form-urlencoded"}, } for i, tt := range tests { t.Run(fmt.Sprintf("test #%v", i), func(t *testing.T) { req := &http.Request{ Header: http.Header{"Content-Type": []string{tt.contentType}}, Body: &badReader{}, } if _, err := ValidatePayload(req, nil); err == nil { t.Fatal("ValidatePayload returned nil; want error") } }) } } func TestValidatePayload_InvalidContentTypeParams(t *testing.T) { req, err := http.NewRequest("POST", "http://localhost/event", nil) if err != nil { t.Fatalf("NewRequest: %v", err) } req.Header.Set("Content-Type", "application/json; charset=") if _, err = ValidatePayload(req, nil); err == nil { t.Error("ValidatePayload = nil, want err") } } func TestValidatePayload_ValidContentTypeParams(t *testing.T) { var requestBody = `{"yo":true}` buf := bytes.NewBufferString(requestBody) req, err := http.NewRequest("POST", "http://localhost/event", buf) if err != nil { t.Fatalf("NewRequest: %v", err) } req.Header.Set("Content-Type", "application/json; charset=UTF-8") _, err = ValidatePayload(req, nil) if err != nil { t.Error("ValidatePayload = nil, want err") } } func TestParseWebHook(t *testing.T) { tests := []struct { payload interface{} messageType string }{ { payload: &CheckRunEvent{}, messageType: "check_run", }, { payload: &CheckSuiteEvent{}, messageType: "check_suite", }, { payload: &CommitCommentEvent{}, messageType: "commit_comment", }, { payload: &ContentReferenceEvent{}, messageType: "content_reference", }, { payload: &CreateEvent{}, messageType: "create", }, { payload: &DeleteEvent{}, messageType: "delete", }, { payload: &DeployKeyEvent{}, messageType: "deploy_key", }, { payload: &DeploymentEvent{}, messageType: "deployment", }, { payload: &DeploymentStatusEvent{}, messageType: "deployment_status", }, { payload: &ForkEvent{}, messageType: "fork", }, { payload: &GitHubAppAuthorizationEvent{}, messageType: "github_app_authorization", }, { payload: &GollumEvent{}, messageType: "gollum", }, { payload: &InstallationEvent{}, messageType: "installation", }, { payload: &InstallationRepositoriesEvent{}, messageType: "installation_repositories", }, { payload: &IssueCommentEvent{}, messageType: "issue_comment", }, { payload: &IssuesEvent{}, messageType: "issues", }, { payload: &LabelEvent{}, messageType: "label", }, { payload: &MarketplacePurchaseEvent{}, messageType: "marketplace_purchase", }, { payload: &MemberEvent{}, messageType: "member", }, { payload: &MembershipEvent{}, messageType: "membership", }, { payload: &MetaEvent{}, messageType: "meta", }, { payload: &MilestoneEvent{}, messageType: "milestone", }, { payload: &OrganizationEvent{}, messageType: "organization", }, { payload: &OrgBlockEvent{}, messageType: "org_block", }, { payload: &PackageEvent{}, messageType: "package", }, { payload: &PageBuildEvent{}, messageType: "page_build", }, { payload: &PingEvent{}, messageType: "ping", }, { payload: &ProjectEvent{}, messageType: "project", }, { payload: &ProjectCardEvent{}, messageType: "project_card", }, { payload: &ProjectColumnEvent{}, messageType: "project_column", }, { payload: &PublicEvent{}, messageType: "public", }, { payload: &PullRequestEvent{}, messageType: "pull_request", }, { payload: &PullRequestReviewEvent{}, messageType: "pull_request_review", }, { payload: &PullRequestReviewCommentEvent{}, messageType: "pull_request_review_comment", }, { payload: &PullRequestTargetEvent{}, messageType: "pull_request_target", }, { payload: &PushEvent{}, messageType: "push", }, { payload: &ReleaseEvent{}, messageType: "release", }, { payload: &RepositoryEvent{}, messageType: "repository", }, { payload: &RepositoryVulnerabilityAlertEvent{}, messageType: "repository_vulnerability_alert", }, { payload: &StarEvent{}, messageType: "star", }, { payload: &StatusEvent{}, messageType: "status", }, { payload: &TeamEvent{}, messageType: "team", }, { payload: &TeamAddEvent{}, messageType: "team_add", }, { payload: &UserEvent{}, messageType: "user", }, { payload: &WatchEvent{}, messageType: "watch", }, { payload: &RepositoryDispatchEvent{}, messageType: "repository_dispatch", }, { payload: &WorkflowDispatchEvent{}, messageType: "workflow_dispatch", }, { payload: &WorkflowRunEvent{}, messageType: "workflow_run", }, } for _, test := range tests { p, err := json.Marshal(test.payload) if err != nil { t.Fatalf("Marshal(%#v): %v", test.payload, err) } got, err := ParseWebHook(test.messageType, p) if err != nil { t.Fatalf("ParseWebHook: %v", err) } if want := test.payload; !cmp.Equal(got, want) { t.Errorf("ParseWebHook(%#v, %#v) = %#v, want %#v", test.messageType, p, got, want) } } } func TestParseWebHook_BadMessageType(t *testing.T) { if _, err := ParseWebHook("bogus message type", []byte("{}")); err == nil { t.Fatal("ParseWebHook returned nil; wanted error") } } func TestValidatePayloadFromBody_UnableToParseBody(t *testing.T) { if _, err := ValidatePayloadFromBody("application/x-www-form-urlencoded", bytes.NewReader([]byte(`%`)), "sha1=", []byte{}); err == nil { t.Errorf("ValidatePayloadFromBody returned nil; wanted error") } } func TestValidatePayloadFromBody_UnsupportedContentType(t *testing.T) { if _, err := ValidatePayloadFromBody("invalid", bytes.NewReader([]byte(`{}`)), "sha1=", []byte{}); err == nil { t.Errorf("ValidatePayloadFromBody returned nil; wanted error") } } func TestDeliveryID(t *testing.T) { id := "8970a780-244e-11e7-91ca-da3aabcb9793" req, err := http.NewRequest("POST", "http://localhost", nil) if err != nil { t.Fatalf("DeliveryID: %v", err) } req.Header.Set("X-Github-Delivery", id) got := DeliveryID(req) if got != id { t.Errorf("DeliveryID(%#v) = %q, want %q", req, got, id) } } func TestWebHookType(t *testing.T) { want := "yo" req := &http.Request{ Header: http.Header{EventTypeHeader: []string{want}}, } if got := WebHookType(req); got != want { t.Errorf("WebHookType = %q, want %q", got, want) } } go-github-38.1.0/github/migrations.go000066400000000000000000000173541410475703100174710ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "errors" "fmt" "net/http" "strings" ) // MigrationService provides access to the migration related functions // in the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migration/ type MigrationService service // Migration represents a GitHub migration (archival). type Migration struct { ID *int64 `json:"id,omitempty"` GUID *string `json:"guid,omitempty"` // State is the current state of a migration. // Possible values are: // "pending" which means the migration hasn't started yet, // "exporting" which means the migration is in progress, // "exported" which means the migration finished successfully, or // "failed" which means the migration failed. State *string `json:"state,omitempty"` // LockRepositories indicates whether repositories are locked (to prevent // manipulation) while migrating data. LockRepositories *bool `json:"lock_repositories,omitempty"` // ExcludeAttachments indicates whether attachments should be excluded from // the migration (to reduce migration archive file size). ExcludeAttachments *bool `json:"exclude_attachments,omitempty"` URL *string `json:"url,omitempty"` CreatedAt *string `json:"created_at,omitempty"` UpdatedAt *string `json:"updated_at,omitempty"` Repositories []*Repository `json:"repositories,omitempty"` } func (m Migration) String() string { return Stringify(m) } // MigrationOptions specifies the optional parameters to Migration methods. type MigrationOptions struct { // LockRepositories indicates whether repositories should be locked (to prevent // manipulation) while migrating data. LockRepositories bool // ExcludeAttachments indicates whether attachments should be excluded from // the migration (to reduce migration archive file size). ExcludeAttachments bool } // startMigration represents the body of a StartMigration request. type startMigration struct { // Repositories is a slice of repository names to migrate. Repositories []string `json:"repositories,omitempty"` // LockRepositories indicates whether repositories should be locked (to prevent // manipulation) while migrating data. LockRepositories *bool `json:"lock_repositories,omitempty"` // ExcludeAttachments indicates whether attachments should be excluded from // the migration (to reduce migration archive file size). ExcludeAttachments *bool `json:"exclude_attachments,omitempty"` } // StartMigration starts the generation of a migration archive. // repos is a slice of repository names to migrate. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#start-an-organization-migration func (s *MigrationService) StartMigration(ctx context.Context, org string, repos []string, opts *MigrationOptions) (*Migration, *Response, error) { u := fmt.Sprintf("orgs/%v/migrations", org) body := &startMigration{Repositories: repos} if opts != nil { body.LockRepositories = Bool(opts.LockRepositories) body.ExcludeAttachments = Bool(opts.ExcludeAttachments) } req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeMigrationsPreview) m := &Migration{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // ListMigrations lists the most recent migrations. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#list-organization-migrations func (s *MigrationService) ListMigrations(ctx context.Context, org string, opts *ListOptions) ([]*Migration, *Response, error) { u := fmt.Sprintf("orgs/%v/migrations", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeMigrationsPreview) var m []*Migration resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // MigrationStatus gets the status of a specific migration archive. // id is the migration ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#get-an-organization-migration-status func (s *MigrationService) MigrationStatus(ctx context.Context, org string, id int64) (*Migration, *Response, error) { u := fmt.Sprintf("orgs/%v/migrations/%v", org, id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeMigrationsPreview) m := &Migration{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // MigrationArchiveURL fetches a migration archive URL. // id is the migration ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#download-an-organization-migration-archive func (s *MigrationService) MigrationArchiveURL(ctx context.Context, org string, id int64) (url string, err error) { u := fmt.Sprintf("orgs/%v/migrations/%v/archive", org, id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return "", err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeMigrationsPreview) s.client.clientMu.Lock() defer s.client.clientMu.Unlock() // Disable the redirect mechanism because AWS fails if the GitHub auth token is provided. var loc string saveRedirect := s.client.client.CheckRedirect s.client.client.CheckRedirect = func(req *http.Request, via []*http.Request) error { loc = req.URL.String() return errors.New("disable redirect") } defer func() { s.client.client.CheckRedirect = saveRedirect }() _, err = s.client.Do(ctx, req, nil) // expect error from disable redirect if err == nil { return "", errors.New("expected redirect, none provided") } if !strings.Contains(err.Error(), "disable redirect") { return "", err } return loc, nil } // DeleteMigration deletes a previous migration archive. // id is the migration ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#delete-an-organization-migration-archive func (s *MigrationService) DeleteMigration(ctx context.Context, org string, id int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/migrations/%v/archive", org, id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeMigrationsPreview) return s.client.Do(ctx, req, nil) } // UnlockRepo unlocks a repository that was locked for migration. // id is the migration ID. // You should unlock each migrated repository and delete them when the migration // is complete and you no longer need the source data. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#unlock-an-organization-repository func (s *MigrationService) UnlockRepo(ctx context.Context, org string, id int64, repo string) (*Response, error) { u := fmt.Sprintf("orgs/%v/migrations/%v/repos/%v/lock", org, id, repo) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeMigrationsPreview) return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/migrations_source_import.go000066400000000000000000000273131410475703100224370ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" ) // Import represents a repository import request. type Import struct { // The URL of the originating repository. VCSURL *string `json:"vcs_url,omitempty"` // The originating VCS type. Can be one of 'subversion', 'git', // 'mercurial', or 'tfvc'. Without this parameter, the import job will // take additional time to detect the VCS type before beginning the // import. This detection step will be reflected in the response. VCS *string `json:"vcs,omitempty"` // VCSUsername and VCSPassword are only used for StartImport calls that // are importing a password-protected repository. VCSUsername *string `json:"vcs_username,omitempty"` VCSPassword *string `json:"vcs_password,omitempty"` // For a tfvc import, the name of the project that is being imported. TFVCProject *string `json:"tfvc_project,omitempty"` // LFS related fields that may be preset in the Import Progress response // Describes whether the import has been opted in or out of using Git // LFS. The value can be 'opt_in', 'opt_out', or 'undecided' if no // action has been taken. UseLFS *string `json:"use_lfs,omitempty"` // Describes whether files larger than 100MB were found during the // importing step. HasLargeFiles *bool `json:"has_large_files,omitempty"` // The total size in gigabytes of files larger than 100MB found in the // originating repository. LargeFilesSize *int `json:"large_files_size,omitempty"` // The total number of files larger than 100MB found in the originating // repository. To see a list of these files, call LargeFiles. LargeFilesCount *int `json:"large_files_count,omitempty"` // Identifies the current status of an import. An import that does not // have errors will progress through these steps: // // detecting - the "detection" step of the import is in progress // because the request did not include a VCS parameter. The // import is identifying the type of source control present at // the URL. // importing - the "raw" step of the import is in progress. This is // where commit data is fetched from the original repository. // The import progress response will include CommitCount (the // total number of raw commits that will be imported) and // Percent (0 - 100, the current progress through the import). // mapping - the "rewrite" step of the import is in progress. This // is where SVN branches are converted to Git branches, and // where author updates are applied. The import progress // response does not include progress information. // pushing - the "push" step of the import is in progress. This is // where the importer updates the repository on GitHub. The // import progress response will include PushPercent, which is // the percent value reported by git push when it is "Writing // objects". // complete - the import is complete, and the repository is ready // on GitHub. // // If there are problems, you will see one of these in the status field: // // auth_failed - the import requires authentication in order to // connect to the original repository. Make an UpdateImport // request, and include VCSUsername and VCSPassword. // error - the import encountered an error. The import progress // response will include the FailedStep and an error message. // Contact GitHub support for more information. // detection_needs_auth - the importer requires authentication for // the originating repository to continue detection. Make an // UpdatImport request, and include VCSUsername and // VCSPassword. // detection_found_nothing - the importer didn't recognize any // source control at the URL. // detection_found_multiple - the importer found several projects // or repositories at the provided URL. When this is the case, // the Import Progress response will also include a // ProjectChoices field with the possible project choices as // values. Make an UpdateImport request, and include VCS and // (if applicable) TFVCProject. Status *string `json:"status,omitempty"` CommitCount *int `json:"commit_count,omitempty"` StatusText *string `json:"status_text,omitempty"` AuthorsCount *int `json:"authors_count,omitempty"` Percent *int `json:"percent,omitempty"` PushPercent *int `json:"push_percent,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` AuthorsURL *string `json:"authors_url,omitempty"` RepositoryURL *string `json:"repository_url,omitempty"` Message *string `json:"message,omitempty"` FailedStep *string `json:"failed_step,omitempty"` // Human readable display name, provided when the Import appears as // part of ProjectChoices. HumanName *string `json:"human_name,omitempty"` // When the importer finds several projects or repositories at the // provided URLs, this will identify the available choices. Call // UpdateImport with the selected Import value. ProjectChoices []*Import `json:"project_choices,omitempty"` } func (i Import) String() string { return Stringify(i) } // SourceImportAuthor identifies an author imported from a source repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migration/source_imports/#get-commit-authors type SourceImportAuthor struct { ID *int64 `json:"id,omitempty"` RemoteID *string `json:"remote_id,omitempty"` RemoteName *string `json:"remote_name,omitempty"` Email *string `json:"email,omitempty"` Name *string `json:"name,omitempty"` URL *string `json:"url,omitempty"` ImportURL *string `json:"import_url,omitempty"` } func (a SourceImportAuthor) String() string { return Stringify(a) } // LargeFile identifies a file larger than 100MB found during a repository import. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migration/source_imports/#get-large-files type LargeFile struct { RefName *string `json:"ref_name,omitempty"` Path *string `json:"path,omitempty"` OID *string `json:"oid,omitempty"` Size *int `json:"size,omitempty"` } func (f LargeFile) String() string { return Stringify(f) } // StartImport initiates a repository import. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#start-an-import func (s *MigrationService) StartImport(ctx context.Context, owner, repo string, in *Import) (*Import, *Response, error) { u := fmt.Sprintf("repos/%v/%v/import", owner, repo) req, err := s.client.NewRequest("PUT", u, in) if err != nil { return nil, nil, err } out := new(Import) resp, err := s.client.Do(ctx, req, out) if err != nil { return nil, resp, err } return out, resp, nil } // ImportProgress queries for the status and progress of an ongoing repository import. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#get-an-import-status func (s *MigrationService) ImportProgress(ctx context.Context, owner, repo string) (*Import, *Response, error) { u := fmt.Sprintf("repos/%v/%v/import", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } out := new(Import) resp, err := s.client.Do(ctx, req, out) if err != nil { return nil, resp, err } return out, resp, nil } // UpdateImport initiates a repository import. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#update-an-import func (s *MigrationService) UpdateImport(ctx context.Context, owner, repo string, in *Import) (*Import, *Response, error) { u := fmt.Sprintf("repos/%v/%v/import", owner, repo) req, err := s.client.NewRequest("PATCH", u, in) if err != nil { return nil, nil, err } out := new(Import) resp, err := s.client.Do(ctx, req, out) if err != nil { return nil, resp, err } return out, resp, nil } // CommitAuthors gets the authors mapped from the original repository. // // Each type of source control system represents authors in a different way. // For example, a Git commit author has a display name and an email address, // but a Subversion commit author just has a username. The GitHub Importer will // make the author information valid, but the author might not be correct. For // example, it will change the bare Subversion username "hubot" into something // like "hubot ". // // This method and MapCommitAuthor allow you to provide correct Git author // information. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#get-commit-authors func (s *MigrationService) CommitAuthors(ctx context.Context, owner, repo string) ([]*SourceImportAuthor, *Response, error) { u := fmt.Sprintf("repos/%v/%v/import/authors", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var authors []*SourceImportAuthor resp, err := s.client.Do(ctx, req, &authors) if err != nil { return nil, resp, err } return authors, resp, nil } // MapCommitAuthor updates an author's identity for the import. Your // application can continue updating authors any time before you push new // commits to the repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#map-a-commit-author func (s *MigrationService) MapCommitAuthor(ctx context.Context, owner, repo string, id int64, author *SourceImportAuthor) (*SourceImportAuthor, *Response, error) { u := fmt.Sprintf("repos/%v/%v/import/authors/%v", owner, repo, id) req, err := s.client.NewRequest("PATCH", u, author) if err != nil { return nil, nil, err } out := new(SourceImportAuthor) resp, err := s.client.Do(ctx, req, out) if err != nil { return nil, resp, err } return out, resp, nil } // SetLFSPreference sets whether imported repositories should use Git LFS for // files larger than 100MB. Only the UseLFS field on the provided Import is // used. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#update-git-lfs-preference func (s *MigrationService) SetLFSPreference(ctx context.Context, owner, repo string, in *Import) (*Import, *Response, error) { u := fmt.Sprintf("repos/%v/%v/import/lfs", owner, repo) req, err := s.client.NewRequest("PATCH", u, in) if err != nil { return nil, nil, err } out := new(Import) resp, err := s.client.Do(ctx, req, out) if err != nil { return nil, resp, err } return out, resp, nil } // LargeFiles lists files larger than 100MB found during the import. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#get-large-files func (s *MigrationService) LargeFiles(ctx context.Context, owner, repo string) ([]*LargeFile, *Response, error) { u := fmt.Sprintf("repos/%v/%v/import/large_files", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var files []*LargeFile resp, err := s.client.Do(ctx, req, &files) if err != nil { return nil, resp, err } return files, resp, nil } // CancelImport stops an import for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#cancel-an-import func (s *MigrationService) CancelImport(ctx context.Context, owner, repo string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/import", owner, repo) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/migrations_source_import_test.go000066400000000000000000000266611410475703100235030ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestMigrationService_StartImport(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Import{ VCS: String("git"), VCSURL: String("url"), VCSUsername: String("u"), VCSPassword: String("p"), } mux.HandleFunc("/repos/o/r/import", func(w http.ResponseWriter, r *http.Request) { v := new(Import) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } w.WriteHeader(http.StatusCreated) fmt.Fprint(w, `{"status":"importing"}`) }) ctx := context.Background() got, _, err := client.Migrations.StartImport(ctx, "o", "r", input) if err != nil { t.Errorf("StartImport returned error: %v", err) } want := &Import{Status: String("importing")} if !cmp.Equal(got, want) { t.Errorf("StartImport = %+v, want %+v", got, want) } const methodName = "StartImport" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Migrations.StartImport(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Migrations.StartImport(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMigrationService_ImportProgress(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/import", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"status":"complete"}`) }) ctx := context.Background() got, _, err := client.Migrations.ImportProgress(ctx, "o", "r") if err != nil { t.Errorf("ImportProgress returned error: %v", err) } want := &Import{Status: String("complete")} if !cmp.Equal(got, want) { t.Errorf("ImportProgress = %+v, want %+v", got, want) } const methodName = "ImportProgress" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Migrations.ImportProgress(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Migrations.ImportProgress(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMigrationService_UpdateImport(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Import{ VCS: String("git"), VCSURL: String("url"), VCSUsername: String("u"), VCSPassword: String("p"), } mux.HandleFunc("/repos/o/r/import", func(w http.ResponseWriter, r *http.Request) { v := new(Import) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } w.WriteHeader(http.StatusCreated) fmt.Fprint(w, `{"status":"importing"}`) }) ctx := context.Background() got, _, err := client.Migrations.UpdateImport(ctx, "o", "r", input) if err != nil { t.Errorf("UpdateImport returned error: %v", err) } want := &Import{Status: String("importing")} if !cmp.Equal(got, want) { t.Errorf("UpdateImport = %+v, want %+v", got, want) } const methodName = "UpdateImport" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Migrations.UpdateImport(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Migrations.UpdateImport(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMigrationService_CommitAuthors(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/import/authors", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":1,"name":"a"},{"id":2,"name":"b"}]`) }) ctx := context.Background() got, _, err := client.Migrations.CommitAuthors(ctx, "o", "r") if err != nil { t.Errorf("CommitAuthors returned error: %v", err) } want := []*SourceImportAuthor{ {ID: Int64(1), Name: String("a")}, {ID: Int64(2), Name: String("b")}, } if !cmp.Equal(got, want) { t.Errorf("CommitAuthors = %+v, want %+v", got, want) } const methodName = "CommitAuthors" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Migrations.CommitAuthors(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Migrations.CommitAuthors(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMigrationService_MapCommitAuthor(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &SourceImportAuthor{Name: String("n"), Email: String("e")} mux.HandleFunc("/repos/o/r/import/authors/1", func(w http.ResponseWriter, r *http.Request) { v := new(SourceImportAuthor) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id": 1}`) }) ctx := context.Background() got, _, err := client.Migrations.MapCommitAuthor(ctx, "o", "r", 1, input) if err != nil { t.Errorf("MapCommitAuthor returned error: %v", err) } want := &SourceImportAuthor{ID: Int64(1)} if !cmp.Equal(got, want) { t.Errorf("MapCommitAuthor = %+v, want %+v", got, want) } const methodName = "MapCommitAuthor" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Migrations.MapCommitAuthor(ctx, "\n", "\n", 1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Migrations.MapCommitAuthor(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMigrationService_SetLFSPreference(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Import{UseLFS: String("opt_in")} mux.HandleFunc("/repos/o/r/import/lfs", func(w http.ResponseWriter, r *http.Request) { v := new(Import) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } w.WriteHeader(http.StatusCreated) fmt.Fprint(w, `{"status":"importing"}`) }) ctx := context.Background() got, _, err := client.Migrations.SetLFSPreference(ctx, "o", "r", input) if err != nil { t.Errorf("SetLFSPreference returned error: %v", err) } want := &Import{Status: String("importing")} if !cmp.Equal(got, want) { t.Errorf("SetLFSPreference = %+v, want %+v", got, want) } const methodName = "SetLFSPreference" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Migrations.SetLFSPreference(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Migrations.SetLFSPreference(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMigrationService_LargeFiles(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/import/large_files", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"oid":"a"},{"oid":"b"}]`) }) ctx := context.Background() got, _, err := client.Migrations.LargeFiles(ctx, "o", "r") if err != nil { t.Errorf("LargeFiles returned error: %v", err) } want := []*LargeFile{ {OID: String("a")}, {OID: String("b")}, } if !cmp.Equal(got, want) { t.Errorf("LargeFiles = %+v, want %+v", got, want) } const methodName = "LargeFiles" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Migrations.LargeFiles(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Migrations.LargeFiles(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMigrationService_CancelImport(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/import", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Migrations.CancelImport(ctx, "o", "r") if err != nil { t.Errorf("CancelImport returned error: %v", err) } const methodName = "CancelImport" testBadOptions(t, methodName, func() (err error) { _, err = client.Migrations.CancelImport(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Migrations.CancelImport(ctx, "o", "r") }) } func TestLargeFile_Marshal(t *testing.T) { testJSONMarshal(t, &LargeFile{}, "{}") u := &LargeFile{ RefName: String("rn"), Path: String("p"), OID: String("oid"), Size: Int(1), } want := `{ "ref_name": "rn", "path": "p", "oid": "oid", "size": 1 }` testJSONMarshal(t, u, want) } func TestSourceImportAuthor_Marshal(t *testing.T) { testJSONMarshal(t, &SourceImportAuthor{}, "{}") u := &SourceImportAuthor{ ID: Int64(1), RemoteID: String("rid"), RemoteName: String("rn"), Email: String("e"), Name: String("n"), URL: String("url"), ImportURL: String("iurl"), } want := `{ "id": 1, "remote_id": "rid", "remote_name": "rn", "email": "e", "name": "n", "url": "url", "import_url": "iurl" }` testJSONMarshal(t, u, want) } func TestImport_Marshal(t *testing.T) { testJSONMarshal(t, &Import{}, "{}") u := &Import{ VCSURL: String("vcsurl"), VCS: String("vcs"), VCSUsername: String("vcsusr"), VCSPassword: String("vcspass"), TFVCProject: String("tfvcp"), UseLFS: String("uselfs"), HasLargeFiles: Bool(false), LargeFilesSize: Int(1), LargeFilesCount: Int(1), Status: String("status"), CommitCount: Int(1), StatusText: String("statustxt"), AuthorsCount: Int(1), Percent: Int(1), PushPercent: Int(1), URL: String("url"), HTMLURL: String("hurl"), AuthorsURL: String("aurl"), RepositoryURL: String("rurl"), Message: String("msg"), FailedStep: String("fs"), HumanName: String("hn"), ProjectChoices: []*Import{{VCSURL: String("vcsurl")}}, } want := `{ "vcs_url": "vcsurl", "vcs": "vcs", "vcs_username": "vcsusr", "vcs_password": "vcspass", "tfvc_project": "tfvcp", "use_lfs": "uselfs", "has_large_files": false, "large_files_size": 1, "large_files_count": 1, "status": "status", "commit_count": 1, "status_text": "statustxt", "authors_count": 1, "percent": 1, "push_percent": 1, "url": "url", "html_url": "hurl", "authors_url": "aurl", "repository_url": "rurl", "message": "msg", "failed_step": "fs", "human_name": "hn", "project_choices": [ { "vcs_url": "vcsurl" } ] }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/migrations_test.go000066400000000000000000000206051410475703100205210ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" "net/http" "strings" "testing" "github.com/google/go-cmp/cmp" ) func TestMigrationService_StartMigration(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/migrations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeMigrationsPreview) w.WriteHeader(http.StatusCreated) w.Write(migrationJSON) }) opt := &MigrationOptions{ LockRepositories: true, ExcludeAttachments: false, } ctx := context.Background() got, _, err := client.Migrations.StartMigration(ctx, "o", []string{"r"}, opt) if err != nil { t.Errorf("StartMigration returned error: %v", err) } if want := wantMigration; !cmp.Equal(got, want) { t.Errorf("StartMigration = %+v, want %+v", got, want) } const methodName = "StartMigration" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Migrations.StartMigration(ctx, "\n", []string{"\n"}, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Migrations.StartMigration(ctx, "o", []string{"r"}, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMigrationService_ListMigrations(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/migrations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeMigrationsPreview) w.WriteHeader(http.StatusOK) w.Write([]byte(fmt.Sprintf("[%s]", migrationJSON))) }) ctx := context.Background() got, _, err := client.Migrations.ListMigrations(ctx, "o", &ListOptions{Page: 1, PerPage: 2}) if err != nil { t.Errorf("ListMigrations returned error: %v", err) } if want := []*Migration{wantMigration}; !cmp.Equal(got, want) { t.Errorf("ListMigrations = %+v, want %+v", got, want) } const methodName = "ListMigrations" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Migrations.ListMigrations(ctx, "\n", &ListOptions{Page: 1, PerPage: 2}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Migrations.ListMigrations(ctx, "o", &ListOptions{Page: 1, PerPage: 2}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMigrationService_MigrationStatus(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/migrations/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeMigrationsPreview) w.WriteHeader(http.StatusOK) w.Write(migrationJSON) }) ctx := context.Background() got, _, err := client.Migrations.MigrationStatus(ctx, "o", 1) if err != nil { t.Errorf("MigrationStatus returned error: %v", err) } if want := wantMigration; !cmp.Equal(got, want) { t.Errorf("MigrationStatus = %+v, want %+v", got, want) } const methodName = "MigrationStatus" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Migrations.MigrationStatus(ctx, "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Migrations.MigrationStatus(ctx, "o", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMigrationService_MigrationArchiveURL(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/migrations/1/archive", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeMigrationsPreview) http.Redirect(w, r, "/yo", http.StatusFound) }) mux.HandleFunc("/yo", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusOK) w.Write([]byte("0123456789abcdef")) }) ctx := context.Background() got, err := client.Migrations.MigrationArchiveURL(ctx, "o", 1) if err != nil { t.Errorf("MigrationStatus returned error: %v", err) } if want := "/yo"; !strings.HasSuffix(got, want) { t.Errorf("MigrationArchiveURL = %+v, want %+v", got, want) } const methodName = "MigrationArchiveURL" testBadOptions(t, methodName, func() (err error) { _, err = client.Migrations.MigrationArchiveURL(ctx, "\n", -1) return err }) } func TestMigrationService_DeleteMigration(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/migrations/1/archive", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeMigrationsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Migrations.DeleteMigration(ctx, "o", 1); err != nil { t.Errorf("DeleteMigration returned error: %v", err) } const methodName = "DeleteMigration" testBadOptions(t, methodName, func() (err error) { _, err = client.Migrations.DeleteMigration(ctx, "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Migrations.DeleteMigration(ctx, "o", 1) }) } func TestMigrationService_UnlockRepo(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/migrations/1/repos/r/lock", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeMigrationsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Migrations.UnlockRepo(ctx, "o", 1, "r"); err != nil { t.Errorf("UnlockRepo returned error: %v", err) } const methodName = "UnlockRepo" testBadOptions(t, methodName, func() (err error) { _, err = client.Migrations.UnlockRepo(ctx, "\n", -1, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Migrations.UnlockRepo(ctx, "o", 1, "r") }) } var migrationJSON = []byte(`{ "id": 79, "guid": "0b989ba4-242f-11e5-81e1-c7b6966d2516", "state": "pending", "lock_repositories": true, "exclude_attachments": false, "url": "https://api.github.com/orgs/octo-org/migrations/79", "created_at": "2015-07-06T15:33:38-07:00", "updated_at": "2015-07-06T15:33:38-07:00", "repositories": [ { "id": 1296269, "name": "Hello-World", "full_name": "octocat/Hello-World", "description": "This your first repo!" } ] }`) var wantMigration = &Migration{ ID: Int64(79), GUID: String("0b989ba4-242f-11e5-81e1-c7b6966d2516"), State: String("pending"), LockRepositories: Bool(true), ExcludeAttachments: Bool(false), URL: String("https://api.github.com/orgs/octo-org/migrations/79"), CreatedAt: String("2015-07-06T15:33:38-07:00"), UpdatedAt: String("2015-07-06T15:33:38-07:00"), Repositories: []*Repository{ { ID: Int64(1296269), Name: String("Hello-World"), FullName: String("octocat/Hello-World"), Description: String("This your first repo!"), }, }, } func TestMigration_Marshal(t *testing.T) { testJSONMarshal(t, &Migration{}, "{}") u := &Migration{ ID: Int64(1), GUID: String("guid"), State: String("state"), LockRepositories: Bool(false), ExcludeAttachments: Bool(false), URL: String("url"), CreatedAt: String("ca"), UpdatedAt: String("ua"), Repositories: []*Repository{{ID: Int64(1)}}, } want := `{ "id": 1, "guid": "guid", "state": "state", "lock_repositories": false, "exclude_attachments": false, "url": "url", "created_at": "ca", "updated_at": "ua", "repositories": [ { "id": 1 } ] }` testJSONMarshal(t, u, want) } func TestStartMigration_Marshal(t *testing.T) { testJSONMarshal(t, &startMigration{}, "{}") u := &startMigration{ Repositories: []string{"r"}, LockRepositories: Bool(false), ExcludeAttachments: Bool(false), } want := `{ "repositories": [ "r" ], "lock_repositories": false, "exclude_attachments": false }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/migrations_user.go000066400000000000000000000162211410475703100205170ustar00rootroot00000000000000// Copyright 2018 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 ( "context" "errors" "fmt" "net/http" ) // UserMigration represents a GitHub migration (archival). type UserMigration struct { ID *int64 `json:"id,omitempty"` GUID *string `json:"guid,omitempty"` // State is the current state of a migration. // Possible values are: // "pending" which means the migration hasn't started yet, // "exporting" which means the migration is in progress, // "exported" which means the migration finished successfully, or // "failed" which means the migration failed. State *string `json:"state,omitempty"` // LockRepositories indicates whether repositories are locked (to prevent // manipulation) while migrating data. LockRepositories *bool `json:"lock_repositories,omitempty"` // ExcludeAttachments indicates whether attachments should be excluded from // the migration (to reduce migration archive file size). ExcludeAttachments *bool `json:"exclude_attachments,omitempty"` URL *string `json:"url,omitempty"` CreatedAt *string `json:"created_at,omitempty"` UpdatedAt *string `json:"updated_at,omitempty"` Repositories []*Repository `json:"repositories,omitempty"` } func (m UserMigration) String() string { return Stringify(m) } // UserMigrationOptions specifies the optional parameters to Migration methods. type UserMigrationOptions struct { // LockRepositories indicates whether repositories should be locked (to prevent // manipulation) while migrating data. LockRepositories bool // ExcludeAttachments indicates whether attachments should be excluded from // the migration (to reduce migration archive file size). ExcludeAttachments bool } // startUserMigration represents the body of a StartMigration request. type startUserMigration struct { // Repositories is a slice of repository names to migrate. Repositories []string `json:"repositories,omitempty"` // LockRepositories indicates whether repositories should be locked (to prevent // manipulation) while migrating data. LockRepositories *bool `json:"lock_repositories,omitempty"` // ExcludeAttachments indicates whether attachments should be excluded from // the migration (to reduce migration archive file size). ExcludeAttachments *bool `json:"exclude_attachments,omitempty"` } // StartUserMigration starts the generation of a migration archive. // repos is a slice of repository names to migrate. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#start-a-user-migration func (s *MigrationService) StartUserMigration(ctx context.Context, repos []string, opts *UserMigrationOptions) (*UserMigration, *Response, error) { u := "user/migrations" body := &startUserMigration{Repositories: repos} if opts != nil { body.LockRepositories = Bool(opts.LockRepositories) body.ExcludeAttachments = Bool(opts.ExcludeAttachments) } req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeMigrationsPreview) m := &UserMigration{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // ListUserMigrations lists the most recent migrations. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#list-user-migrations func (s *MigrationService) ListUserMigrations(ctx context.Context) ([]*UserMigration, *Response, error) { u := "user/migrations" req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeMigrationsPreview) var m []*UserMigration resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // UserMigrationStatus gets the status of a specific migration archive. // id is the migration ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#get-a-user-migration-status func (s *MigrationService) UserMigrationStatus(ctx context.Context, id int64) (*UserMigration, *Response, error) { u := fmt.Sprintf("user/migrations/%v", id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeMigrationsPreview) m := &UserMigration{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // UserMigrationArchiveURL gets the URL for a specific migration archive. // id is the migration ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#download-a-user-migration-archive func (s *MigrationService) UserMigrationArchiveURL(ctx context.Context, id int64) (string, error) { url := fmt.Sprintf("user/migrations/%v/archive", id) req, err := s.client.NewRequest("GET", url, nil) if err != nil { return "", err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeMigrationsPreview) m := &UserMigration{} var loc string originalRedirect := s.client.client.CheckRedirect s.client.client.CheckRedirect = func(req *http.Request, via []*http.Request) error { loc = req.URL.String() return http.ErrUseLastResponse } defer func() { s.client.client.CheckRedirect = originalRedirect }() resp, err := s.client.Do(ctx, req, m) if err == nil { return "", errors.New("expected redirect, none provided") } loc = resp.Header.Get("Location") return loc, nil } // DeleteUserMigration will delete a previous migration archive. // id is the migration ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#delete-a-user-migration-archive func (s *MigrationService) DeleteUserMigration(ctx context.Context, id int64) (*Response, error) { url := fmt.Sprintf("user/migrations/%v/archive", id) req, err := s.client.NewRequest("DELETE", url, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeMigrationsPreview) return s.client.Do(ctx, req, nil) } // UnlockUserRepo will unlock a repo that was locked for migration. // id is migration ID. // You should unlock each migrated repository and delete them when the migration // is complete and you no longer need the source data. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/migrations/#unlock-a-user-repository func (s *MigrationService) UnlockUserRepo(ctx context.Context, id int64, repo string) (*Response, error) { url := fmt.Sprintf("user/migrations/%v/repos/%v/lock", id, repo) req, err := s.client.NewRequest("DELETE", url, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeMigrationsPreview) return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/migrations_user_test.go000066400000000000000000000201641410475703100215570ustar00rootroot00000000000000// Copyright 2018 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 ( "context" "fmt" "net/http" "strings" "testing" "github.com/google/go-cmp/cmp" ) func TestMigrationService_StartUserMigration(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/migrations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeMigrationsPreview) w.WriteHeader(http.StatusCreated) w.Write(userMigrationJSON) }) opt := &UserMigrationOptions{ LockRepositories: true, ExcludeAttachments: false, } ctx := context.Background() got, _, err := client.Migrations.StartUserMigration(ctx, []string{"r"}, opt) if err != nil { t.Errorf("StartUserMigration returned error: %v", err) } want := wantUserMigration if !cmp.Equal(want, got) { t.Errorf("StartUserMigration = %v, want = %v", got, want) } const methodName = "StartUserMigration" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Migrations.StartUserMigration(ctx, []string{"r"}, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMigrationService_ListUserMigrations(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/migrations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeMigrationsPreview) w.WriteHeader(http.StatusOK) w.Write([]byte(fmt.Sprintf("[%s]", userMigrationJSON))) }) ctx := context.Background() got, _, err := client.Migrations.ListUserMigrations(ctx) if err != nil { t.Errorf("ListUserMigrations returned error %v", err) } want := []*UserMigration{wantUserMigration} if !cmp.Equal(want, got) { t.Errorf("ListUserMigrations = %v, want = %v", got, want) } const methodName = "ListUserMigrations" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Migrations.ListUserMigrations(ctx) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMigrationService_UserMigrationStatus(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/migrations/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeMigrationsPreview) w.WriteHeader(http.StatusOK) w.Write(userMigrationJSON) }) ctx := context.Background() got, _, err := client.Migrations.UserMigrationStatus(ctx, 1) if err != nil { t.Errorf("UserMigrationStatus returned error %v", err) } want := wantUserMigration if !cmp.Equal(want, got) { t.Errorf("UserMigrationStatus = %v, want = %v", got, want) } const methodName = "UserMigrationStatus" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Migrations.UserMigrationStatus(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMigrationService_UserMigrationArchiveURL(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/migrations/1/archive", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeMigrationsPreview) http.Redirect(w, r, "/go-github", http.StatusFound) }) mux.HandleFunc("/go-github", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusOK) }) ctx := context.Background() got, err := client.Migrations.UserMigrationArchiveURL(ctx, 1) if err != nil { t.Errorf("UserMigrationArchiveURL returned error %v", err) } want := "/go-github" if !strings.HasSuffix(got, want) { t.Errorf("UserMigrationArchiveURL = %v, want = %v", got, want) } } func TestMigrationService_DeleteUserMigration(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/migrations/1/archive", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeMigrationsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() got, err := client.Migrations.DeleteUserMigration(ctx, 1) if err != nil { t.Errorf("DeleteUserMigration returned error %v", err) } if got.StatusCode != http.StatusNoContent { t.Errorf("DeleteUserMigration returned status = %v, want = %v", got.StatusCode, http.StatusNoContent) } const methodName = "DeleteUserMigration" testBadOptions(t, methodName, func() (err error) { _, err = client.Migrations.DeleteUserMigration(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Migrations.DeleteUserMigration(ctx, 1) }) } func TestMigrationService_UnlockUserRepo(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/migrations/1/repos/r/lock", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeMigrationsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() got, err := client.Migrations.UnlockUserRepo(ctx, 1, "r") if err != nil { t.Errorf("UnlockUserRepo returned error %v", err) } if got.StatusCode != http.StatusNoContent { t.Errorf("UnlockUserRepo returned status = %v, want = %v", got.StatusCode, http.StatusNoContent) } const methodName = "UnlockUserRepo" testBadOptions(t, methodName, func() (err error) { _, err = client.Migrations.UnlockUserRepo(ctx, -1, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Migrations.UnlockUserRepo(ctx, 1, "r") }) } var userMigrationJSON = []byte(`{ "id": 79, "guid": "0b989ba4-242f-11e5-81e1-c7b6966d2516", "state": "pending", "lock_repositories": true, "exclude_attachments": false, "url": "https://api.github.com/orgs/octo-org/migrations/79", "created_at": "2015-07-06T15:33:38-07:00", "updated_at": "2015-07-06T15:33:38-07:00", "repositories": [ { "id": 1296269, "name": "Hello-World", "full_name": "octocat/Hello-World", "description": "This your first repo!" } ] }`) var wantUserMigration = &UserMigration{ ID: Int64(79), GUID: String("0b989ba4-242f-11e5-81e1-c7b6966d2516"), State: String("pending"), LockRepositories: Bool(true), ExcludeAttachments: Bool(false), URL: String("https://api.github.com/orgs/octo-org/migrations/79"), CreatedAt: String("2015-07-06T15:33:38-07:00"), UpdatedAt: String("2015-07-06T15:33:38-07:00"), Repositories: []*Repository{ { ID: Int64(1296269), Name: String("Hello-World"), FullName: String("octocat/Hello-World"), Description: String("This your first repo!"), }, }, } func TestUserMigration_Marshal(t *testing.T) { testJSONMarshal(t, &UserMigration{}, "{}") u := &UserMigration{ ID: Int64(1), GUID: String("guid"), State: String("state"), LockRepositories: Bool(false), ExcludeAttachments: Bool(false), URL: String("url"), CreatedAt: String("ca"), UpdatedAt: String("ua"), Repositories: []*Repository{{ID: Int64(1)}}, } want := `{ "id": 1, "guid": "guid", "state": "state", "lock_repositories": false, "exclude_attachments": false, "url": "url", "created_at": "ca", "updated_at": "ua", "repositories": [ { "id": 1 } ] }` testJSONMarshal(t, u, want) } func TestStartUserMigration_Marshal(t *testing.T) { testJSONMarshal(t, &startUserMigration{}, "{}") u := &startUserMigration{ Repositories: []string{"r"}, LockRepositories: Bool(false), ExcludeAttachments: Bool(false), } want := `{ "repositories": [ "r" ], "lock_repositories": false, "exclude_attachments": false }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/misc.go000066400000000000000000000170661410475703100162500ustar00rootroot00000000000000// 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 ( "bytes" "context" "fmt" "net/url" ) // MarkdownOptions specifies optional parameters to the Markdown method. type MarkdownOptions struct { // Mode identifies the rendering mode. Possible values are: // markdown - render a document as plain Markdown, just like // README files are rendered. // // gfm - to render a document as user-content, e.g. like user // comments or issues are rendered. In GFM mode, hard line breaks are // always taken into account, and issue and user mentions are linked // accordingly. // // Default is "markdown". Mode string // Context identifies the repository context. Only taken into account // when rendering as "gfm". Context string } type markdownRequest struct { Text *string `json:"text,omitempty"` Mode *string `json:"mode,omitempty"` Context *string `json:"context,omitempty"` } // Markdown renders an arbitrary Markdown document. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/markdown/ func (c *Client) Markdown(ctx context.Context, text string, opts *MarkdownOptions) (string, *Response, error) { request := &markdownRequest{Text: String(text)} if opts != nil { if opts.Mode != "" { request.Mode = String(opts.Mode) } if opts.Context != "" { request.Context = String(opts.Context) } } req, err := c.NewRequest("POST", "markdown", request) if err != nil { return "", nil, err } buf := new(bytes.Buffer) resp, err := c.Do(ctx, req, buf) if err != nil { return "", resp, err } return buf.String(), resp, nil } // ListEmojis returns the emojis available to use on GitHub. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/emojis/ func (c *Client) ListEmojis(ctx context.Context) (map[string]string, *Response, error) { req, err := c.NewRequest("GET", "emojis", nil) if err != nil { return nil, nil, err } var emoji map[string]string resp, err := c.Do(ctx, req, &emoji) if err != nil { return nil, resp, err } return emoji, resp, nil } // CodeOfConduct represents a code of conduct. type CodeOfConduct struct { Name *string `json:"name,omitempty"` Key *string `json:"key,omitempty"` URL *string `json:"url,omitempty"` Body *string `json:"body,omitempty"` } func (c *CodeOfConduct) String() string { return Stringify(c) } // ListCodesOfConduct returns all codes of conduct. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/codes_of_conduct/#list-all-codes-of-conduct func (c *Client) ListCodesOfConduct(ctx context.Context) ([]*CodeOfConduct, *Response, error) { req, err := c.NewRequest("GET", "codes_of_conduct", nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeCodesOfConductPreview) var cs []*CodeOfConduct resp, err := c.Do(ctx, req, &cs) if err != nil { return nil, resp, err } return cs, resp, nil } // GetCodeOfConduct returns an individual code of conduct. // // https://docs.github.com/en/free-pro-team@latest/rest/reference/codes_of_conduct/#get-an-individual-code-of-conduct func (c *Client) GetCodeOfConduct(ctx context.Context, key string) (*CodeOfConduct, *Response, error) { u := fmt.Sprintf("codes_of_conduct/%s", key) req, err := c.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeCodesOfConductPreview) coc := new(CodeOfConduct) resp, err := c.Do(ctx, req, coc) if err != nil { return nil, resp, err } return coc, resp, nil } // APIMeta represents metadata about the GitHub API. type APIMeta struct { // An Array of IP addresses in CIDR format specifying the addresses // that incoming service hooks will originate from on GitHub.com. Hooks []string `json:"hooks,omitempty"` // An Array of IP addresses in CIDR format specifying the Git servers // for GitHub.com. Git []string `json:"git,omitempty"` // Whether authentication with username and password is supported. // (GitHub Enterprise instances using CAS or OAuth for authentication // will return false. Features like Basic Authentication with a // username and password, sudo mode, and two-factor authentication are // not supported on these servers.) VerifiablePasswordAuthentication *bool `json:"verifiable_password_authentication,omitempty"` // An array of IP addresses in CIDR format specifying the addresses // which serve GitHub Pages websites. Pages []string `json:"pages,omitempty"` // An Array of IP addresses specifying the addresses that source imports // will originate from on GitHub.com. Importer []string `json:"importer,omitempty"` // An array of IP addresses in CIDR format specifying the IP addresses // GitHub Actions will originate from. Actions []string `json:"actions,omitempty"` // An array of IP addresses in CIDR format specifying the IP addresses // Dependabot will originate from. Dependabot []string `json:"dependabot,omitempty"` } // APIMeta returns information about GitHub.com, the service. Or, if you access // this endpoint on your organization’s GitHub Enterprise installation, this // endpoint provides information about that installation. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/meta#get-github-meta-information func (c *Client) APIMeta(ctx context.Context) (*APIMeta, *Response, error) { req, err := c.NewRequest("GET", "meta", nil) if err != nil { return nil, nil, err } meta := new(APIMeta) resp, err := c.Do(ctx, req, meta) if err != nil { return nil, resp, err } return meta, resp, nil } // Octocat returns an ASCII art octocat with the specified message in a speech // bubble. If message is empty, a random zen phrase is used. func (c *Client) Octocat(ctx context.Context, message string) (string, *Response, error) { u := "octocat" if message != "" { u = fmt.Sprintf("%s?s=%s", u, url.QueryEscape(message)) } req, err := c.NewRequest("GET", u, nil) if err != nil { return "", nil, err } buf := new(bytes.Buffer) resp, err := c.Do(ctx, req, buf) if err != nil { return "", resp, err } return buf.String(), resp, nil } // Zen returns a random line from The Zen of GitHub. // // see also: http://warpspire.com/posts/taste/ func (c *Client) Zen(ctx context.Context) (string, *Response, error) { req, err := c.NewRequest("GET", "zen", nil) if err != nil { return "", nil, err } buf := new(bytes.Buffer) resp, err := c.Do(ctx, req, buf) if err != nil { return "", resp, err } return buf.String(), resp, nil } // ServiceHook represents a hook that has configuration settings, a list of // available events, and default events. type ServiceHook struct { Name *string `json:"name,omitempty"` Events []string `json:"events,omitempty"` SupportedEvents []string `json:"supported_events,omitempty"` Schema [][]string `json:"schema,omitempty"` } func (s *ServiceHook) String() string { return Stringify(s) } // ListServiceHooks lists all of the available service hooks. // // GitHub API docs: https://developer.github.com/webhooks/#services func (c *Client) ListServiceHooks(ctx context.Context) ([]*ServiceHook, *Response, error) { u := "hooks" req, err := c.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var hooks []*ServiceHook resp, err := c.Do(ctx, req, &hooks) if err != nil { return nil, resp, err } return hooks, resp, nil } go-github-38.1.0/github/misc_test.go000066400000000000000000000234051410475703100173010ustar00rootroot00000000000000// 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestMarkdown(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &markdownRequest{ Text: String("# text #"), Mode: String("gfm"), Context: String("google/go-github"), } mux.HandleFunc("/markdown", func(w http.ResponseWriter, r *http.Request) { v := new(markdownRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `

text

`) }) ctx := context.Background() md, _, err := client.Markdown(ctx, "# text #", &MarkdownOptions{ Mode: "gfm", Context: "google/go-github", }) if err != nil { t.Errorf("Markdown returned error: %v", err) } if want := "

text

"; want != md { t.Errorf("Markdown returned %+v, want %+v", md, want) } const methodName = "Markdown" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Markdown(ctx, "# text #", &MarkdownOptions{ Mode: "gfm", Context: "google/go-github", }) if got != "" { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestListEmojis(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/emojis", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"+1": "+1.png"}`) }) ctx := context.Background() emoji, _, err := client.ListEmojis(ctx) if err != nil { t.Errorf("ListEmojis returned error: %v", err) } want := map[string]string{"+1": "+1.png"} if !cmp.Equal(want, emoji) { t.Errorf("ListEmojis returned %+v, want %+v", emoji, want) } const methodName = "ListEmojis" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.ListEmojis(ctx) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestListCodesOfConduct(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/codes_of_conduct", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeCodesOfConductPreview) fmt.Fprint(w, `[{ "key": "key", "name": "name", "url": "url"} ]`) }) ctx := context.Background() cs, _, err := client.ListCodesOfConduct(ctx) if err != nil { t.Errorf("ListCodesOfConduct returned error: %v", err) } want := []*CodeOfConduct{ { Key: String("key"), Name: String("name"), URL: String("url"), }} if !cmp.Equal(want, cs) { t.Errorf("ListCodesOfConduct returned %+v, want %+v", cs, want) } const methodName = "ListCodesOfConduct" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.ListCodesOfConduct(ctx) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGetCodeOfConduct(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/codes_of_conduct/k", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeCodesOfConductPreview) fmt.Fprint(w, `{ "key": "key", "name": "name", "url": "url", "body": "body"}`, ) }) ctx := context.Background() coc, _, err := client.GetCodeOfConduct(ctx, "k") if err != nil { t.Errorf("ListCodesOfConduct returned error: %v", err) } want := &CodeOfConduct{ Key: String("key"), Name: String("name"), URL: String("url"), Body: String("body"), } if !cmp.Equal(want, coc) { t.Errorf("GetCodeOfConductByKey returned %+v, want %+v", coc, want) } const methodName = "GetCodeOfConduct" testBadOptions(t, methodName, func() (err error) { _, _, err = client.GetCodeOfConduct(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.GetCodeOfConduct(ctx, "k") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAPIMeta_Marshal(t *testing.T) { testJSONMarshal(t, &APIMeta{}, "{}") a := &APIMeta{ Hooks: []string{"h"}, Git: []string{"g"}, VerifiablePasswordAuthentication: Bool(true), Pages: []string{"p"}, Importer: []string{"i"}, Actions: []string{"a"}, Dependabot: []string{"d"}, } want := `{ "hooks":["h"], "git":["g"], "verifiable_password_authentication":true, "pages":["p"], "importer":["i"], "actions":["a"], "dependabot":["d"] }` testJSONMarshal(t, a, want) } func TestAPIMeta(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/meta", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"hooks":["h"], "git":["g"], "pages":["p"], "importer":["i"], "actions":["a"], "dependabot":["d"], "verifiable_password_authentication": true}`) }) ctx := context.Background() meta, _, err := client.APIMeta(ctx) if err != nil { t.Errorf("APIMeta returned error: %v", err) } want := &APIMeta{ Hooks: []string{"h"}, Git: []string{"g"}, Pages: []string{"p"}, Importer: []string{"i"}, Actions: []string{"a"}, Dependabot: []string{"d"}, VerifiablePasswordAuthentication: Bool(true), } if !cmp.Equal(want, meta) { t.Errorf("APIMeta returned %+v, want %+v", meta, want) } const methodName = "APIMeta" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.APIMeta(ctx) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOctocat(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := "input" output := "sample text" mux.HandleFunc("/octocat", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"s": input}) w.Header().Set("Content-Type", "application/octocat-stream") fmt.Fprint(w, output) }) ctx := context.Background() got, _, err := client.Octocat(ctx, input) if err != nil { t.Errorf("Octocat returned error: %v", err) } if want := output; got != want { t.Errorf("Octocat returned %+v, want %+v", got, want) } const methodName = "Octocat" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Octocat(ctx, input) if got != "" { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestZen(t *testing.T) { client, mux, _, teardown := setup() defer teardown() output := "sample text" mux.HandleFunc("/zen", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.Header().Set("Content-Type", "text/plain;charset=utf-8") fmt.Fprint(w, output) }) ctx := context.Background() got, _, err := client.Zen(ctx) if err != nil { t.Errorf("Zen returned error: %v", err) } if want := output; got != want { t.Errorf("Zen returned %+v, want %+v", got, want) } const methodName = "Zen" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Zen(ctx) if got != "" { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestListServiceHooks(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/hooks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{ "name":"n", "events":["e"], "supported_events":["s"], "schema":[ ["a", "b"] ] }]`) }) ctx := context.Background() hooks, _, err := client.ListServiceHooks(ctx) if err != nil { t.Errorf("ListServiceHooks returned error: %v", err) } want := []*ServiceHook{{ Name: String("n"), Events: []string{"e"}, SupportedEvents: []string{"s"}, Schema: [][]string{{"a", "b"}}, }} if !cmp.Equal(hooks, want) { t.Errorf("ListServiceHooks returned %+v, want %+v", hooks, want) } const methodName = "ListServiceHooks" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.ListServiceHooks(ctx) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMarkdownRequest_Marshal(t *testing.T) { testJSONMarshal(t, &markdownRequest{}, "{}") a := &markdownRequest{ Text: String("txt"), Mode: String("mode"), Context: String("ctx"), } want := `{ "text": "txt", "mode": "mode", "context": "ctx" }` testJSONMarshal(t, a, want) } func TestCodeOfConduct_Marshal(t *testing.T) { testJSONMarshal(t, &CodeOfConduct{}, "{}") a := &CodeOfConduct{ Name: String("name"), Key: String("key"), URL: String("url"), Body: String("body"), } want := `{ "name": "name", "key": "key", "url": "url", "body": "body" }` testJSONMarshal(t, a, want) } func TestServiceHook_Marshal(t *testing.T) { testJSONMarshal(t, &ServiceHook{}, "{}") a := &ServiceHook{ Name: String("name"), Events: []string{"e"}, SupportedEvents: []string{"se"}, Schema: [][]string{{"g"}}, } want := `{ "name": "name", "events": [ "e" ], "supported_events": [ "se" ], "schema": [ [ "g" ] ] }` testJSONMarshal(t, a, want) } go-github-38.1.0/github/orgs.go000066400000000000000000000251171410475703100162630ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "time" ) // OrganizationsService provides access to the organization related functions // in the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/ type OrganizationsService service // Organization represents a GitHub organization account. type Organization struct { Login *string `json:"login,omitempty"` ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` AvatarURL *string `json:"avatar_url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` Name *string `json:"name,omitempty"` Company *string `json:"company,omitempty"` Blog *string `json:"blog,omitempty"` Location *string `json:"location,omitempty"` Email *string `json:"email,omitempty"` TwitterUsername *string `json:"twitter_username,omitempty"` Description *string `json:"description,omitempty"` PublicRepos *int `json:"public_repos,omitempty"` PublicGists *int `json:"public_gists,omitempty"` Followers *int `json:"followers,omitempty"` Following *int `json:"following,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` UpdatedAt *time.Time `json:"updated_at,omitempty"` TotalPrivateRepos *int `json:"total_private_repos,omitempty"` OwnedPrivateRepos *int `json:"owned_private_repos,omitempty"` PrivateGists *int `json:"private_gists,omitempty"` DiskUsage *int `json:"disk_usage,omitempty"` Collaborators *int `json:"collaborators,omitempty"` BillingEmail *string `json:"billing_email,omitempty"` Type *string `json:"type,omitempty"` Plan *Plan `json:"plan,omitempty"` TwoFactorRequirementEnabled *bool `json:"two_factor_requirement_enabled,omitempty"` IsVerified *bool `json:"is_verified,omitempty"` HasOrganizationProjects *bool `json:"has_organization_projects,omitempty"` HasRepositoryProjects *bool `json:"has_repository_projects,omitempty"` // DefaultRepoPermission can be one of: "read", "write", "admin", or "none". (Default: "read"). // It is only used in OrganizationsService.Edit. DefaultRepoPermission *string `json:"default_repository_permission,omitempty"` // DefaultRepoSettings can be one of: "read", "write", "admin", or "none". (Default: "read"). // It is only used in OrganizationsService.Get. DefaultRepoSettings *string `json:"default_repository_settings,omitempty"` // MembersCanCreateRepos default value is true and is only used in Organizations.Edit. MembersCanCreateRepos *bool `json:"members_can_create_repositories,omitempty"` // https://developer.github.com/changes/2019-12-03-internal-visibility-changes/#rest-v3-api MembersCanCreatePublicRepos *bool `json:"members_can_create_public_repositories,omitempty"` MembersCanCreatePrivateRepos *bool `json:"members_can_create_private_repositories,omitempty"` MembersCanCreateInternalRepos *bool `json:"members_can_create_internal_repositories,omitempty"` // MembersAllowedRepositoryCreationType denotes if organization members can create repositories // and the type of repositories they can create. Possible values are: "all", "private", or "none". // // Deprecated: Use MembersCanCreatePublicRepos, MembersCanCreatePrivateRepos, MembersCanCreateInternalRepos // instead. The new fields overrides the existing MembersAllowedRepositoryCreationType during 'edit' // operation and does not consider 'internal' repositories during 'get' operation MembersAllowedRepositoryCreationType *string `json:"members_allowed_repository_creation_type,omitempty"` // MembersCanCreatePages toggles whether organization members can create GitHub Pages sites. MembersCanCreatePages *bool `json:"members_can_create_pages,omitempty"` // MembersCanCreatePublicPages toggles whether organization members can create public GitHub Pages sites. MembersCanCreatePublicPages *bool `json:"members_can_create_public_pages,omitempty"` // MembersCanCreatePrivatePages toggles whether organization members can create private GitHub Pages sites. MembersCanCreatePrivatePages *bool `json:"members_can_create_private_pages,omitempty"` // API URLs URL *string `json:"url,omitempty"` EventsURL *string `json:"events_url,omitempty"` HooksURL *string `json:"hooks_url,omitempty"` IssuesURL *string `json:"issues_url,omitempty"` MembersURL *string `json:"members_url,omitempty"` PublicMembersURL *string `json:"public_members_url,omitempty"` ReposURL *string `json:"repos_url,omitempty"` } // OrganizationInstallations represents GitHub app installations for an organization. type OrganizationInstallations struct { TotalCount *int `json:"total_count,omitempty"` Installations []*Installation `json:"installations,omitempty"` } func (o Organization) String() string { return Stringify(o) } // Plan represents the payment plan for an account. See plans at https://github.com/plans. type Plan struct { Name *string `json:"name,omitempty"` Space *int `json:"space,omitempty"` Collaborators *int `json:"collaborators,omitempty"` PrivateRepos *int `json:"private_repos,omitempty"` FilledSeats *int `json:"filled_seats,omitempty"` Seats *int `json:"seats,omitempty"` } func (p Plan) String() string { return Stringify(p) } // OrganizationsListOptions specifies the optional parameters to the // OrganizationsService.ListAll method. type OrganizationsListOptions struct { // Since filters Organizations by ID. Since int64 `url:"since,omitempty"` // Note: Pagination is powered exclusively by the Since parameter, // ListOptions.Page has no effect. // ListOptions.PerPage controls an undocumented GitHub API parameter. ListOptions } // ListAll lists all organizations, in the order that they were created on GitHub. // // Note: Pagination is powered exclusively by the since parameter. To continue // listing the next set of organizations, use the ID of the last-returned organization // as the opts.Since parameter for the next call. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#list-organizations func (s *OrganizationsService) ListAll(ctx context.Context, opts *OrganizationsListOptions) ([]*Organization, *Response, error) { u, err := addOptions("organizations", opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } orgs := []*Organization{} resp, err := s.client.Do(ctx, req, &orgs) if err != nil { return nil, resp, err } return orgs, resp, nil } // List the organizations for a user. Passing the empty string will list // organizations for the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#list-organizations-for-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#list-organizations-for-a-user func (s *OrganizationsService) List(ctx context.Context, user string, opts *ListOptions) ([]*Organization, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/orgs", user) } else { u = "user/orgs" } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var orgs []*Organization resp, err := s.client.Do(ctx, req, &orgs) if err != nil { return nil, resp, err } return orgs, resp, nil } // Get fetches an organization by name. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#get-an-organization func (s *OrganizationsService) Get(ctx context.Context, org string) (*Organization, *Response, error) { u := fmt.Sprintf("orgs/%v", org) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeMemberAllowedRepoCreationTypePreview) organization := new(Organization) resp, err := s.client.Do(ctx, req, organization) if err != nil { return nil, resp, err } return organization, resp, nil } // GetByID fetches an organization. // // Note: GetByID uses the undocumented GitHub API endpoint /organizations/:id. func (s *OrganizationsService) GetByID(ctx context.Context, id int64) (*Organization, *Response, error) { u := fmt.Sprintf("organizations/%d", id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } organization := new(Organization) resp, err := s.client.Do(ctx, req, organization) if err != nil { return nil, resp, err } return organization, resp, nil } // Edit an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#update-an-organization func (s *OrganizationsService) Edit(ctx context.Context, name string, org *Organization) (*Organization, *Response, error) { u := fmt.Sprintf("orgs/%v", name) req, err := s.client.NewRequest("PATCH", u, org) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeMemberAllowedRepoCreationTypePreview) o := new(Organization) resp, err := s.client.Do(ctx, req, o) if err != nil { return nil, resp, err } return o, resp, nil } // ListInstallations lists installations for an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#list-app-installations-for-an-organization func (s *OrganizationsService) ListInstallations(ctx context.Context, org string, opts *ListOptions) (*OrganizationInstallations, *Response, error) { u := fmt.Sprintf("orgs/%v/installations", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } result := new(OrganizationInstallations) resp, err := s.client.Do(ctx, req, result) if err != nil { return nil, resp, err } return result, resp, nil } go-github-38.1.0/github/orgs_actions_allowed.go000066400000000000000000000036441410475703100215130ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "fmt" ) // ActionsAllowed represents selected actions that are allowed in an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#get-allowed-actions-for-an-organization type ActionsAllowed struct { GithubOwnedAllowed *bool `json:"github_owned_allowed,omitempty"` VerifiedAllowed *bool `json:"verified_allowed,omitempty"` PatternsAllowed []string `json:"patterns_allowed,omitempty"` } func (a ActionsAllowed) String() string { return Stringify(a) } // GetActionsAllowed gets the actions that are allowed in an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#get-allowed-actions-for-an-organization func (s *OrganizationsService) GetActionsAllowed(ctx context.Context, org string) (*ActionsAllowed, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/permissions/selected-actions", org) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } actionsAllowed := new(ActionsAllowed) resp, err := s.client.Do(ctx, req, actionsAllowed) if err != nil { return nil, resp, err } return actionsAllowed, resp, nil } // EditActionsAllowed sets the actions that are allowed in an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#set-allowed-actions-for-an-organization func (s *OrganizationsService) EditActionsAllowed(ctx context.Context, org string, actionsAllowed ActionsAllowed) (*ActionsAllowed, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/permissions/selected-actions", org) req, err := s.client.NewRequest("PUT", u, actionsAllowed) if err != nil { return nil, nil, err } p := new(ActionsAllowed) resp, err := s.client.Do(ctx, req, p) return p, resp, err } go-github-38.1.0/github/orgs_actions_allowed_test.go000066400000000000000000000067071410475703100225550ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestOrganizationsService_GetActionsAllowed(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/permissions/selected-actions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"github_owned_allowed":true, "verified_allowed":false, "patterns_allowed":["a/b"]}`) }) ctx := context.Background() org, _, err := client.Organizations.GetActionsAllowed(ctx, "o") if err != nil { t.Errorf("Organizations.GetActionsAllowed returned error: %v", err) } want := &ActionsAllowed{GithubOwnedAllowed: Bool(true), VerifiedAllowed: Bool(false), PatternsAllowed: []string{"a/b"}} if !cmp.Equal(org, want) { t.Errorf("Organizations.GetActionsAllowed returned %+v, want %+v", org, want) } const methodName = "GetActionsAllowed" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.GetActionsAllowed(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.GetActionsAllowed(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_EditActionsAllowed(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ActionsAllowed{GithubOwnedAllowed: Bool(true), VerifiedAllowed: Bool(false), PatternsAllowed: []string{"a/b"}} mux.HandleFunc("/orgs/o/actions/permissions/selected-actions", func(w http.ResponseWriter, r *http.Request) { v := new(ActionsAllowed) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"github_owned_allowed":true, "verified_allowed":false, "patterns_allowed":["a/b"]}`) }) ctx := context.Background() org, _, err := client.Organizations.EditActionsAllowed(ctx, "o", *input) if err != nil { t.Errorf("Organizations.EditActionsAllowed returned error: %v", err) } want := &ActionsAllowed{GithubOwnedAllowed: Bool(true), VerifiedAllowed: Bool(false), PatternsAllowed: []string{"a/b"}} if !cmp.Equal(org, want) { t.Errorf("Organizations.EditActionsAllowed returned %+v, want %+v", org, want) } const methodName = "EditActionsAllowed" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.EditActionsAllowed(ctx, "\n", *input) return err }) } func TestActionsAllowed_Marshal(t *testing.T) { testJSONMarshal(t, &ActionsAllowed{}, "{}") u := &ActionsAllowed{ GithubOwnedAllowed: Bool(false), VerifiedAllowed: Bool(false), PatternsAllowed: []string{"s"}, } want := `{ "github_owned_allowed": false, "verified_allowed": false, "patterns_allowed": [ "s" ] }` testJSONMarshal(t, u, want) } func TestActionsPermissions_Marshal(t *testing.T) { testJSONMarshal(t, &ActionsPermissions{}, "{}") u := &ActionsPermissions{ EnabledRepositories: String("e"), AllowedActions: String("a"), SelectedActionsURL: String("sau"), } want := `{ "enabled_repositories": "e", "allowed_actions": "a", "selected_actions_url": "sau" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/orgs_actions_permissions.go000066400000000000000000000040071410475703100224310ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "fmt" ) // ActionsPermissions represents a policy for repositories and allowed actions in an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#permissions type ActionsPermissions struct { EnabledRepositories *string `json:"enabled_repositories,omitempty"` AllowedActions *string `json:"allowed_actions,omitempty"` SelectedActionsURL *string `json:"selected_actions_url,omitempty"` } func (a ActionsPermissions) String() string { return Stringify(a) } // GetActionsPermissions gets the GitHub Actions permissions policy for repositories and allowed actions in an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#get-github-actions-permissions-for-an-organization func (s *OrganizationsService) GetActionsPermissions(ctx context.Context, org string) (*ActionsPermissions, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/permissions", org) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } permissions := new(ActionsPermissions) resp, err := s.client.Do(ctx, req, permissions) if err != nil { return nil, resp, err } return permissions, resp, nil } // EditActionsPermissions sets the permissions policy for repositories and allowed actions in an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/actions#set-github-actions-permissions-for-an-organization func (s *OrganizationsService) EditActionsPermissions(ctx context.Context, org string, actionsPermissions ActionsPermissions) (*ActionsPermissions, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/permissions", org) req, err := s.client.NewRequest("PUT", u, actionsPermissions) if err != nil { return nil, nil, err } p := new(ActionsPermissions) resp, err := s.client.Do(ctx, req, p) return p, resp, err } go-github-38.1.0/github/orgs_actions_permissions_test.go000066400000000000000000000051731410475703100234750ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestOrganizationsService_GetActionsPermissions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/permissions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"enabled_repositories": "all", "allowed_actions": "all"}`) }) ctx := context.Background() org, _, err := client.Organizations.GetActionsPermissions(ctx, "o") if err != nil { t.Errorf("Organizations.GetActionsPermissions returned error: %v", err) } want := &ActionsPermissions{EnabledRepositories: String("all"), AllowedActions: String("all")} if !cmp.Equal(org, want) { t.Errorf("Organizations.GetActionsPermissions returned %+v, want %+v", org, want) } const methodName = "GetActionsPermissions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.GetActionsPermissions(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.GetActionsPermissions(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_EditActionsPermissions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ActionsPermissions{EnabledRepositories: String("all"), AllowedActions: String("selected")} mux.HandleFunc("/orgs/o/actions/permissions", func(w http.ResponseWriter, r *http.Request) { v := new(ActionsPermissions) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"enabled_repositories": "all", "allowed_actions": "selected"}`) }) ctx := context.Background() org, _, err := client.Organizations.EditActionsPermissions(ctx, "o", *input) if err != nil { t.Errorf("Organizations.EditActionsPermissions returned error: %v", err) } want := &ActionsPermissions{EnabledRepositories: String("all"), AllowedActions: String("selected")} if !cmp.Equal(org, want) { t.Errorf("Organizations.EditActionsPermissions returned %+v, want %+v", org, want) } const methodName = "EditActionsPermissions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.EditActionsPermissions(ctx, "\n", *input) return err }) } go-github-38.1.0/github/orgs_audit_log.go000066400000000000000000000141571410475703100203140ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "fmt" ) // GetAuditLogOptions sets up optional parameters to query audit-log endpoint. type GetAuditLogOptions struct { Phrase *string `json:"phrase,omitempty"` // A search phrase. (Optional.) Include *string `json:"include,omitempty"` // Event type includes. Can be one of "web", "git", "all". Default: "web". (Optional.) Order *string `json:"order,omitempty"` // The order of audit log events. Can be one of "asc" or "desc". Default: "desc". (Optional.) ListCursorOptions } // HookConfig describes metadata about a webhook configuration. type HookConfig struct { ContentType *string `json:"content_type,omitempty"` InsecureSSL *string `json:"insecure_ssl,omitempty"` URL *string `json:"url,omitempty"` } // AuditEntry describes the fields that may be represented by various audit-log "action" entries. // For a list of actions see - https://docs.github.com/en/github/setting-up-and-managing-organizations-and-teams/reviewing-the-audit-log-for-your-organization#audit-log-actions type AuditEntry struct { Action *string `json:"action,omitempty"` // The name of the action that was performed, for example `user.login` or `repo.create`. Active *bool `json:"active,omitempty"` ActiveWas *bool `json:"active_was,omitempty"` Actor *string `json:"actor,omitempty"` // The actor who performed the action. BlockedUser *string `json:"blocked_user,omitempty"` Business *string `json:"business,omitempty"` CancelledAt *Timestamp `json:"cancelled_at,omitempty"` CompletedAt *Timestamp `json:"completed_at,omitempty"` Conclusion *string `json:"conclusion,omitempty"` Config *HookConfig `json:"config,omitempty"` ConfigWas *HookConfig `json:"config_was,omitempty"` ContentType *string `json:"content_type,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` DeployKeyFingerprint *string `json:"deploy_key_fingerprint,omitempty"` DocumentID *string `json:"_document_id,omitempty"` Emoji *string `json:"emoji,omitempty"` EnvironmentName *string `json:"environment_name,omitempty"` Event *string `json:"event,omitempty"` Events []string `json:"events,omitempty"` EventsWere []string `json:"events_were,omitempty"` Explanation *string `json:"explanation,omitempty"` Fingerprint *string `json:"fingerprint,omitempty"` HeadBranch *string `json:"head_branch,omitempty"` HeadSHA *string `json:"head_sha,omitempty"` HookID *int64 `json:"hook_id,omitempty"` IsHostedRunner *bool `json:"is_hosted_runner,omitempty"` JobName *string `json:"job_name,omitempty"` LimitedAvailability *bool `json:"limited_availability,omitempty"` Message *string `json:"message,omitempty"` Name *string `json:"name,omitempty"` OldUser *string `json:"old_user,omitempty"` OpenSSHPublicKey *string `json:"openssh_public_key,omitempty"` Org *string `json:"org,omitempty"` PreviousVisibility *string `json:"previous_visibility,omitempty"` ReadOnly *string `json:"read_only,omitempty"` Repo *string `json:"repo,omitempty"` Repository *string `json:"repository,omitempty"` RepositoryPublic *bool `json:"repository_public,omitempty"` RunnerGroupID *string `json:"runner_group_id,omitempty"` RunnerGroupName *string `json:"runner_group_name,omitempty"` RunnerID *string `json:"runner_id,omitempty"` RunnerLabels []string `json:"runner_labels,omitempty"` RunnerName *string `json:"runner_name,omitempty"` SecretsPassed []string `json:"secrets_passed,omitempty"` SourceVersion *string `json:"source_version,omitempty"` StartedAt *Timestamp `json:"started_at,omitempty"` TargetLogin *string `json:"target_login,omitempty"` TargetVersion *string `json:"target_version,omitempty"` Team *string `json:"team,omitempty"` Timestamp *Timestamp `json:"@timestamp,omitempty"` // The time the audit log event occurred, given as a [Unix timestamp](http://en.wikipedia.org/wiki/Unix_time). TransportProtocolName *string `json:"transport_protocol_name,omitempty"` // A human readable name for the protocol (for example, HTTP or SSH) used to transfer Git data. TransportProtocol *int `json:"transport_protocol,omitempty"` // The type of protocol (for example, HTTP=1 or SSH=2) used to transfer Git data. TriggerID *int64 `json:"trigger_id,omitempty"` User *string `json:"user,omitempty"` // The user that was affected by the action performed (if available). Visibility *string `json:"visibility,omitempty"` // The repository visibility, for example `public` or `private`. WorkflowID *int64 `json:"workflow_id,omitempty"` WorkflowRunID *int64 `json:"workflow_run_id,omitempty"` } // GetAuditLog gets the audit-log entries for an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/orgs#get-the-audit-log-for-an-organization func (s *OrganizationsService) GetAuditLog(ctx context.Context, org string, opts *GetAuditLogOptions) ([]*AuditEntry, *Response, error) { u := fmt.Sprintf("orgs/%v/audit-log", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var auditEntries []*AuditEntry resp, err := s.client.Do(ctx, req, &auditEntries) if err != nil { return nil, resp, err } return auditEntries, resp, nil } go-github-38.1.0/github/orgs_audit_log_test.go000066400000000000000000000200201410475703100213350ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestOrganizationService_GetAuditLog(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/audit-log", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[ { "active": true, "workflow_id": 123456, "head_branch": "master", "org": "o", "trigger_id": null, "repo": "o/blue-crayon-1", "created_at": 1615077308538, "head_sha": "5acdeadbeef64d1a62388e901e5cdc9358644b37", "conclusion": "success", "actor": "testactor", "completed_at": "2021-03-07T00:35:08.000Z", "@timestamp": 1615077308538, "name": "Code scanning - action", "action": "workflows.completed_workflow_run", "started_at": "2021-03-07T00:33:04.000Z", "event": "schedule", "workflow_run_id": 628312345, "_document_id": "beeZYapIUe-wKg5-beadb33", "config": { "content_type": "json", "insecure_ssl": "0", "url": "https://example.com/deadbeef-new-hook" }, "events": ["code_scanning_alert"] }]`) }) ctx := context.Background() getOpts := GetAuditLogOptions{ Include: String("all"), Phrase: String("action:workflows"), Order: String("asc"), } auditEntries, _, err := client.Organizations.GetAuditLog(ctx, "o", &getOpts) if err != nil { t.Errorf("Organizations.GetAuditLog returned error: %v", err) } startedAt, _ := time.Parse(time.RFC3339, "2021-03-07T00:33:04.000Z") completedAt, _ := time.Parse(time.RFC3339, "2021-03-07T00:35:08.000Z") timestamp := time.Unix(0, 1615077308538*1e6) want := []*AuditEntry{ { Timestamp: &Timestamp{timestamp}, DocumentID: String("beeZYapIUe-wKg5-beadb33"), Action: String("workflows.completed_workflow_run"), Actor: String("testactor"), Active: Bool(true), CompletedAt: &Timestamp{completedAt}, Conclusion: String("success"), CreatedAt: &Timestamp{timestamp}, Event: String("schedule"), HeadBranch: String("master"), HeadSHA: String("5acdeadbeef64d1a62388e901e5cdc9358644b37"), Name: String("Code scanning - action"), Org: String("o"), Repo: String("o/blue-crayon-1"), StartedAt: &Timestamp{startedAt}, WorkflowID: Int64(123456), WorkflowRunID: Int64(628312345), Events: []string{"code_scanning_alert"}, Config: &HookConfig{ ContentType: String("json"), InsecureSSL: String("0"), URL: String("https://example.com/deadbeef-new-hook"), }, }, } if !cmp.Equal(auditEntries, want) { t.Errorf("Organizations.GetAuditLog return \ngot: %+v,\nwant:%+v", auditEntries, want) } const methodName = "GetAuditLog" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.GetAuditLog(ctx, "\n", &getOpts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.GetAuditLog(ctx, "o", &GetAuditLogOptions{}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestGetAuditLogOptions_Marshal(t *testing.T) { testJSONMarshal(t, &GetAuditLogOptions{}, "{}") u := &GetAuditLogOptions{ Phrase: String("p"), Include: String("i"), Order: String("o"), ListCursorOptions: ListCursorOptions{ Page: "p", PerPage: 1, After: "a", Before: "b", }, } want := `{ "phrase": "p", "include": "i", "order": "o", "Page": "p", "PerPage": 1, "After": "a", "Before": "b" }` testJSONMarshal(t, u, want) } func TestHookConfig_Marshal(t *testing.T) { testJSONMarshal(t, &HookConfig{}, "{}") u := &HookConfig{ ContentType: String("ct"), InsecureSSL: String("ct"), URL: String("url"), } want := `{ "content_type": "ct", "insecure_ssl": "ct", "url": "url" }` testJSONMarshal(t, u, want) } func TestAuditEntry_Marshal(t *testing.T) { testJSONMarshal(t, &AuditEntry{}, "{}") u := &AuditEntry{ Action: String("a"), Active: Bool(false), ActiveWas: Bool(false), Actor: String("ac"), BlockedUser: String("bu"), Business: String("b"), CancelledAt: &Timestamp{referenceTime}, CompletedAt: &Timestamp{referenceTime}, Conclusion: String("c"), Config: &HookConfig{URL: String("s")}, ConfigWas: &HookConfig{URL: String("s")}, ContentType: String("ct"), CreatedAt: &Timestamp{referenceTime}, DeployKeyFingerprint: String("dkf"), DocumentID: String("did"), Emoji: String("e"), EnvironmentName: String("en"), Event: String("e"), Events: []string{"s"}, EventsWere: []string{"s"}, Explanation: String("e"), Fingerprint: String("f"), HeadBranch: String("hb"), HeadSHA: String("hsha"), HookID: Int64(1), IsHostedRunner: Bool(false), JobName: String("jn"), LimitedAvailability: Bool(false), Message: String("m"), Name: String("n"), OldUser: String("ou"), OpenSSHPublicKey: String("osshpk"), Org: String("o"), PreviousVisibility: String("pv"), ReadOnly: String("ro"), Repo: String("r"), Repository: String("repo"), RepositoryPublic: Bool(false), RunnerGroupID: String("rgid"), RunnerGroupName: String("rgn"), RunnerID: String("rid"), RunnerLabels: []string{"s"}, RunnerName: String("rn"), SecretsPassed: []string{"s"}, SourceVersion: String("sv"), StartedAt: &Timestamp{referenceTime}, TargetLogin: String("tl"), TargetVersion: String("tv"), Team: String("t"), Timestamp: &Timestamp{referenceTime}, TransportProtocolName: String("tpn"), TransportProtocol: Int(1), TriggerID: Int64(1), User: String("u"), Visibility: String("v"), WorkflowID: Int64(1), WorkflowRunID: Int64(1), } want := `{ "action": "a", "active": false, "active_was": false, "actor": "ac", "blocked_user": "bu", "business": "b", "cancelled_at": ` + referenceTimeStr + `, "completed_at": ` + referenceTimeStr + `, "conclusion": "c", "config": { "url": "s" }, "config_was": { "url": "s" }, "content_type": "ct", "created_at": ` + referenceTimeStr + `, "deploy_key_fingerprint": "dkf", "_document_id": "did", "emoji": "e", "environment_name": "en", "event": "e", "events": [ "s" ], "events_were": [ "s" ], "explanation": "e", "fingerprint": "f", "head_branch": "hb", "head_sha": "hsha", "hook_id": 1, "is_hosted_runner": false, "job_name": "jn", "limited_availability": false, "message": "m", "name": "n", "old_user": "ou", "openssh_public_key": "osshpk", "org": "o", "previous_visibility": "pv", "read_only": "ro", "repo": "r", "repository": "repo", "repository_public": false, "runner_group_id": "rgid", "runner_group_name": "rgn", "runner_id": "rid", "runner_labels": [ "s" ], "runner_name": "rn", "secrets_passed": [ "s" ], "source_version": "sv", "started_at": ` + referenceTimeStr + `, "target_login": "tl", "target_version": "tv", "team": "t", "@timestamp": ` + referenceTimeStr + `, "transport_protocol_name": "tpn", "transport_protocol": 1, "trigger_id": 1, "user": "u", "visibility": "v", "workflow_id": 1, "workflow_run_id": 1 }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/orgs_hooks.go000066400000000000000000000067531410475703100174730ustar00rootroot00000000000000// Copyright 2015 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 ( "context" "fmt" ) // ListHooks lists all Hooks for the specified organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#list-organization-webhooks func (s *OrganizationsService) ListHooks(ctx context.Context, org string, opts *ListOptions) ([]*Hook, *Response, error) { u := fmt.Sprintf("orgs/%v/hooks", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var hooks []*Hook resp, err := s.client.Do(ctx, req, &hooks) if err != nil { return nil, resp, err } return hooks, resp, nil } // GetHook returns a single specified Hook. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#get-an-organization-webhook func (s *OrganizationsService) GetHook(ctx context.Context, org string, id int64) (*Hook, *Response, error) { u := fmt.Sprintf("orgs/%v/hooks/%d", org, id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } hook := new(Hook) resp, err := s.client.Do(ctx, req, hook) return hook, resp, err } // CreateHook creates a Hook for the specified org. // Config is a required field. // // Note that only a subset of the hook fields are used and hook must // not be nil. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#create-an-organization-webhook func (s *OrganizationsService) CreateHook(ctx context.Context, org string, hook *Hook) (*Hook, *Response, error) { u := fmt.Sprintf("orgs/%v/hooks", org) hookReq := &createHookRequest{ Name: "web", Events: hook.Events, Active: hook.Active, Config: hook.Config, } req, err := s.client.NewRequest("POST", u, hookReq) if err != nil { return nil, nil, err } h := new(Hook) resp, err := s.client.Do(ctx, req, h) if err != nil { return nil, resp, err } return h, resp, nil } // EditHook updates a specified Hook. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#update-an-organization-webhook func (s *OrganizationsService) EditHook(ctx context.Context, org string, id int64, hook *Hook) (*Hook, *Response, error) { u := fmt.Sprintf("orgs/%v/hooks/%d", org, id) req, err := s.client.NewRequest("PATCH", u, hook) if err != nil { return nil, nil, err } h := new(Hook) resp, err := s.client.Do(ctx, req, h) return h, resp, err } // PingHook triggers a 'ping' event to be sent to the Hook. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#ping-an-organization-webhook func (s *OrganizationsService) PingHook(ctx context.Context, org string, id int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/hooks/%d/pings", org, id) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DeleteHook deletes a specified Hook. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#delete-an-organization-webhook func (s *OrganizationsService) DeleteHook(ctx context.Context, org string, id int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/hooks/%d", org, id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/orgs_hooks_deliveries.go000066400000000000000000000031151410475703100216730ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "fmt" ) // ListHookDeliveries lists webhook deliveries for a webhook configured in an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/orgs#list-deliveries-for-an-organization-webhook func (s *OrganizationsService) ListHookDeliveries(ctx context.Context, org string, id int64, opts *ListCursorOptions) ([]*HookDelivery, *Response, error) { u := fmt.Sprintf("orgs/%v/hooks/%v/deliveries", org, id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } deliveries := []*HookDelivery{} resp, err := s.client.Do(ctx, req, &deliveries) if err != nil { return nil, resp, err } return deliveries, resp, nil } // GetHookDelivery returns a delivery for a webhook configured in an organization. // // GitHub API docs: https://docs.github.com/en/rest/reference/orgs#get-a-webhook-delivery-for-an-organization-webhook func (s *OrganizationsService) GetHookDelivery(ctx context.Context, owner string, hookID, deliveryID int64) (*HookDelivery, *Response, error) { u := fmt.Sprintf("orgs/%v/hooks/%v/deliveries/%v", owner, hookID, deliveryID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } h := new(HookDelivery) resp, err := s.client.Do(ctx, req, h) if err != nil { return nil, resp, err } return h, resp, nil } go-github-38.1.0/github/orgs_hooks_deliveries_test.go000066400000000000000000000060141410475703100227330ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestOrganizationsService_ListHookDeliveries(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/hooks/1/deliveries", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"cursor": "v1_12077215967"}) fmt.Fprint(w, `[{"id":1}, {"id":2}]`) }) opt := &ListCursorOptions{Cursor: "v1_12077215967"} ctx := context.Background() hooks, _, err := client.Organizations.ListHookDeliveries(ctx, "o", 1, opt) if err != nil { t.Errorf("Organizations.ListHookDeliveries returned error: %v", err) } want := []*HookDelivery{{ID: Int64(1)}, {ID: Int64(2)}} if d := cmp.Diff(hooks, want); d != "" { t.Errorf("Organizations.ListHooks want (-), got (+):\n%s", d) } const methodName = "ListHookDeliveries" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListHookDeliveries(ctx, "\n", -1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListHookDeliveries(ctx, "o", 1, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_ListHookDeliveries_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.ListHookDeliveries(ctx, "%", 1, nil) testURLParseError(t, err) } func TestOrganizationsService_GetHookDelivery(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/hooks/1/deliveries/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() hook, _, err := client.Organizations.GetHookDelivery(ctx, "o", 1, 1) if err != nil { t.Errorf("Organizations.GetHookDelivery returned error: %v", err) } want := &HookDelivery{ID: Int64(1)} if !cmp.Equal(hook, want) { t.Errorf("Organizations.GetHookDelivery returned %+v, want %+v", hook, want) } const methodName = "GetHookDelivery" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.GetHookDelivery(ctx, "\n", -1, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.GetHookDelivery(ctx, "o", 1, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_GetHookDelivery_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.GetHookDelivery(ctx, "%", 1, 1) testURLParseError(t, err) } go-github-38.1.0/github/orgs_hooks_test.go000066400000000000000000000146761410475703100205350ustar00rootroot00000000000000// Copyright 2015 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestOrganizationsService_ListHooks(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/hooks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}, {"id":2}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() hooks, _, err := client.Organizations.ListHooks(ctx, "o", opt) if err != nil { t.Errorf("Organizations.ListHooks returned error: %v", err) } want := []*Hook{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(hooks, want) { t.Errorf("Organizations.ListHooks returned %+v, want %+v", hooks, want) } const methodName = "ListHooks" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListHooks(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListHooks(ctx, "o", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_ListHooks_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.ListHooks(ctx, "%", nil) testURLParseError(t, err) } func TestOrganizationsService_CreateHook(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Hook{CreatedAt: &referenceTime} mux.HandleFunc("/orgs/o/hooks", func(w http.ResponseWriter, r *http.Request) { v := new(createHookRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") want := &createHookRequest{Name: "web"} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() hook, _, err := client.Organizations.CreateHook(ctx, "o", input) if err != nil { t.Errorf("Organizations.CreateHook returned error: %v", err) } want := &Hook{ID: Int64(1)} if !cmp.Equal(hook, want) { t.Errorf("Organizations.CreateHook returned %+v, want %+v", hook, want) } const methodName = "CreateHook" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.CreateHook(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.CreateHook(ctx, "o", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_GetHook(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/hooks/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() hook, _, err := client.Organizations.GetHook(ctx, "o", 1) if err != nil { t.Errorf("Organizations.GetHook returned error: %v", err) } want := &Hook{ID: Int64(1)} if !cmp.Equal(hook, want) { t.Errorf("Organizations.GetHook returned %+v, want %+v", hook, want) } const methodName = "GetHook" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.GetHook(ctx, "\n", -1) return err }) } func TestOrganizationsService_GetHook_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.GetHook(ctx, "%", 1) testURLParseError(t, err) } func TestOrganizationsService_EditHook(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Hook{} mux.HandleFunc("/orgs/o/hooks/1", func(w http.ResponseWriter, r *http.Request) { v := new(Hook) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() hook, _, err := client.Organizations.EditHook(ctx, "o", 1, input) if err != nil { t.Errorf("Organizations.EditHook returned error: %v", err) } want := &Hook{ID: Int64(1)} if !cmp.Equal(hook, want) { t.Errorf("Organizations.EditHook returned %+v, want %+v", hook, want) } const methodName = "EditHook" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.EditHook(ctx, "\n", -1, input) return err }) } func TestOrganizationsService_EditHook_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.EditHook(ctx, "%", 1, nil) testURLParseError(t, err) } func TestOrganizationsService_PingHook(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/hooks/1/pings", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") }) ctx := context.Background() _, err := client.Organizations.PingHook(ctx, "o", 1) if err != nil { t.Errorf("Organizations.PingHook returned error: %v", err) } const methodName = "PingHook" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.PingHook(ctx, "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.PingHook(ctx, "o", 1) }) } func TestOrganizationsService_DeleteHook(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/hooks/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Organizations.DeleteHook(ctx, "o", 1) if err != nil { t.Errorf("Organizations.DeleteHook returned error: %v", err) } const methodName = "DeleteHook" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.DeleteHook(ctx, "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.DeleteHook(ctx, "o", 1) }) } func TestOrganizationsService_DeleteHook_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Organizations.DeleteHook(ctx, "%", 1) testURLParseError(t, err) } go-github-38.1.0/github/orgs_members.go000066400000000000000000000326571410475703100200040ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" ) // Membership represents the status of a user's membership in an organization or team. type Membership struct { URL *string `json:"url,omitempty"` // State is the user's status within the organization or team. // Possible values are: "active", "pending" State *string `json:"state,omitempty"` // Role identifies the user's role within the organization or team. // Possible values for organization membership: // member - non-owner organization member // admin - organization owner // // Possible values for team membership are: // member - a normal member of the team // maintainer - a team maintainer. Able to add/remove other team // members, promote other team members to team // maintainer, and edit the team’s name and description Role *string `json:"role,omitempty"` // For organization membership, the API URL of the organization. OrganizationURL *string `json:"organization_url,omitempty"` // For organization membership, the organization the membership is for. Organization *Organization `json:"organization,omitempty"` // For organization membership, the user the membership is for. User *User `json:"user,omitempty"` } func (m Membership) String() string { return Stringify(m) } // ListMembersOptions specifies optional parameters to the // OrganizationsService.ListMembers method. type ListMembersOptions struct { // If true (or if the authenticated user is not an owner of the // organization), list only publicly visible members. PublicOnly bool `url:"-"` // Filter members returned in the list. Possible values are: // 2fa_disabled, all. Default is "all". Filter string `url:"filter,omitempty"` // Role filters members returned by their role in the organization. // Possible values are: // all - all members of the organization, regardless of role // admin - organization owners // member - non-owner organization members // // Default is "all". Role string `url:"role,omitempty"` ListOptions } // ListMembers lists the members for an organization. If the authenticated // user is an owner of the organization, this will return both concealed and // public members, otherwise it will only return public members. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#list-organization-members // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#list-public-organization-members func (s *OrganizationsService) ListMembers(ctx context.Context, org string, opts *ListMembersOptions) ([]*User, *Response, error) { var u string if opts != nil && opts.PublicOnly { u = fmt.Sprintf("orgs/%v/public_members", org) } else { u = fmt.Sprintf("orgs/%v/members", org) } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var members []*User resp, err := s.client.Do(ctx, req, &members) if err != nil { return nil, resp, err } return members, resp, nil } // IsMember checks if a user is a member of an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#check-organization-membership-for-a-user func (s *OrganizationsService) IsMember(ctx context.Context, org, user string) (bool, *Response, error) { u := fmt.Sprintf("orgs/%v/members/%v", org, user) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return false, nil, err } resp, err := s.client.Do(ctx, req, nil) member, err := parseBoolResponse(err) return member, resp, err } // IsPublicMember checks if a user is a public member of an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#check-public-organization-membership-for-a-user func (s *OrganizationsService) IsPublicMember(ctx context.Context, org, user string) (bool, *Response, error) { u := fmt.Sprintf("orgs/%v/public_members/%v", org, user) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return false, nil, err } resp, err := s.client.Do(ctx, req, nil) member, err := parseBoolResponse(err) return member, resp, err } // RemoveMember removes a user from all teams of an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#remove-an-organization-member func (s *OrganizationsService) RemoveMember(ctx context.Context, org, user string) (*Response, error) { u := fmt.Sprintf("orgs/%v/members/%v", org, user) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // PublicizeMembership publicizes a user's membership in an organization. (A // user cannot publicize the membership for another user.) // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#set-public-organization-membership-for-the-authenticated-user func (s *OrganizationsService) PublicizeMembership(ctx context.Context, org, user string) (*Response, error) { u := fmt.Sprintf("orgs/%v/public_members/%v", org, user) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ConcealMembership conceals a user's membership in an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#remove-public-organization-membership-for-the-authenticated-user func (s *OrganizationsService) ConcealMembership(ctx context.Context, org, user string) (*Response, error) { u := fmt.Sprintf("orgs/%v/public_members/%v", org, user) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListOrgMembershipsOptions specifies optional parameters to the // OrganizationsService.ListOrgMemberships method. type ListOrgMembershipsOptions struct { // Filter memberships to include only those with the specified state. // Possible values are: "active", "pending". State string `url:"state,omitempty"` ListOptions } // ListOrgMemberships lists the organization memberships for the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#list-organization-memberships-for-the-authenticated-user func (s *OrganizationsService) ListOrgMemberships(ctx context.Context, opts *ListOrgMembershipsOptions) ([]*Membership, *Response, error) { u := "user/memberships/orgs" u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var memberships []*Membership resp, err := s.client.Do(ctx, req, &memberships) if err != nil { return nil, resp, err } return memberships, resp, nil } // GetOrgMembership gets the membership for a user in a specified organization. // Passing an empty string for user will get the membership for the // authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#get-an-organization-membership-for-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#get-organization-membership-for-a-user func (s *OrganizationsService) GetOrgMembership(ctx context.Context, user, org string) (*Membership, *Response, error) { var u string if user != "" { u = fmt.Sprintf("orgs/%v/memberships/%v", org, user) } else { u = fmt.Sprintf("user/memberships/orgs/%v", org) } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } membership := new(Membership) resp, err := s.client.Do(ctx, req, membership) if err != nil { return nil, resp, err } return membership, resp, nil } // EditOrgMembership edits the membership for user in specified organization. // Passing an empty string for user will edit the membership for the // authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#update-an-organization-membership-for-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#set-organization-membership-for-a-user func (s *OrganizationsService) EditOrgMembership(ctx context.Context, user, org string, membership *Membership) (*Membership, *Response, error) { var u, method string if user != "" { u = fmt.Sprintf("orgs/%v/memberships/%v", org, user) method = "PUT" } else { u = fmt.Sprintf("user/memberships/orgs/%v", org) method = "PATCH" } req, err := s.client.NewRequest(method, u, membership) if err != nil { return nil, nil, err } m := new(Membership) resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // RemoveOrgMembership removes user from the specified organization. If the // user has been invited to the organization, this will cancel their invitation. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#remove-organization-membership-for-a-user func (s *OrganizationsService) RemoveOrgMembership(ctx context.Context, user, org string) (*Response, error) { u := fmt.Sprintf("orgs/%v/memberships/%v", org, user) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListPendingOrgInvitations returns a list of pending invitations. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#list-pending-organization-invitations func (s *OrganizationsService) ListPendingOrgInvitations(ctx context.Context, org string, opts *ListOptions) ([]*Invitation, *Response, error) { u := fmt.Sprintf("orgs/%v/invitations", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var pendingInvitations []*Invitation resp, err := s.client.Do(ctx, req, &pendingInvitations) if err != nil { return nil, resp, err } return pendingInvitations, resp, nil } // CreateOrgInvitationOptions specifies the parameters to the OrganizationService.Invite // method. type CreateOrgInvitationOptions struct { // GitHub user ID for the person you are inviting. Not required if you provide Email. InviteeID *int64 `json:"invitee_id,omitempty"` // Email address of the person you are inviting, which can be an existing GitHub user. // Not required if you provide InviteeID Email *string `json:"email,omitempty"` // Specify role for new member. Can be one of: // * admin - Organization owners with full administrative rights to the // organization and complete access to all repositories and teams. // * direct_member - Non-owner organization members with ability to see // other members and join teams by invitation. // * billing_manager - Non-owner organization members with ability to // manage the billing settings of your organization. // Default is "direct_member". Role *string `json:"role"` TeamID []int64 `json:"team_ids"` } // CreateOrgInvitation invites people to an organization by using their GitHub user ID or their email address. // In order to create invitations in an organization, // the authenticated user must be an organization owner. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#create-an-organization-invitation func (s *OrganizationsService) CreateOrgInvitation(ctx context.Context, org string, opts *CreateOrgInvitationOptions) (*Invitation, *Response, error) { u := fmt.Sprintf("orgs/%v/invitations", org) req, err := s.client.NewRequest("POST", u, opts) if err != nil { return nil, nil, err } var invitation *Invitation resp, err := s.client.Do(ctx, req, &invitation) if err != nil { return nil, resp, err } return invitation, resp, nil } // ListOrgInvitationTeams lists all teams associated with an invitation. In order to see invitations in an organization, // the authenticated user must be an organization owner. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#list-organization-invitation-teams func (s *OrganizationsService) ListOrgInvitationTeams(ctx context.Context, org, invitationID string, opts *ListOptions) ([]*Team, *Response, error) { u := fmt.Sprintf("orgs/%v/invitations/%v/teams", org, invitationID) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var orgInvitationTeams []*Team resp, err := s.client.Do(ctx, req, &orgInvitationTeams) if err != nil { return nil, resp, err } return orgInvitationTeams, resp, nil } // ListFailedOrgInvitations returns a list of failed inviatations. // // GitHub API docs: https://docs.github.com/en/rest/reference/orgs#list-failed-organization-invitations func (s *OrganizationsService) ListFailedOrgInvitations(ctx context.Context, org string, opts *ListOptions) ([]*Invitation, *Response, error) { u := fmt.Sprintf("orgs/%v/failed_invitations", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var failedInvitations []*Invitation resp, err := s.client.Do(ctx, req, &failedInvitations) if err != nil { return nil, resp, err } return failedInvitations, resp, nil } go-github-38.1.0/github/orgs_members_test.go000066400000000000000000000747661410475703100210520ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestOrganizationsService_ListMembers(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/members", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "filter": "2fa_disabled", "role": "admin", "page": "2", }) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListMembersOptions{ PublicOnly: false, Filter: "2fa_disabled", Role: "admin", ListOptions: ListOptions{Page: 2}, } ctx := context.Background() members, _, err := client.Organizations.ListMembers(ctx, "o", opt) if err != nil { t.Errorf("Organizations.ListMembers returned error: %v", err) } want := []*User{{ID: Int64(1)}} if !cmp.Equal(members, want) { t.Errorf("Organizations.ListMembers returned %+v, want %+v", members, want) } const methodName = "ListMembers" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListMembers(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListMembers(ctx, "o", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_ListMembers_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.ListMembers(ctx, "%", nil) testURLParseError(t, err) } func TestOrganizationsService_ListMembers_public(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/public_members", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListMembersOptions{PublicOnly: true} ctx := context.Background() members, _, err := client.Organizations.ListMembers(ctx, "o", opt) if err != nil { t.Errorf("Organizations.ListMembers returned error: %v", err) } want := []*User{{ID: Int64(1)}} if !cmp.Equal(members, want) { t.Errorf("Organizations.ListMembers returned %+v, want %+v", members, want) } } func TestOrganizationsService_IsMember(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/members/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() member, _, err := client.Organizations.IsMember(ctx, "o", "u") if err != nil { t.Errorf("Organizations.IsMember returned error: %v", err) } if want := true; member != want { t.Errorf("Organizations.IsMember returned %+v, want %+v", member, want) } const methodName = "IsMember" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.IsMember(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.IsMember(ctx, "o", "u") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } // ensure that a 404 response is interpreted as "false" and not an error func TestOrganizationsService_IsMember_notMember(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/members/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() member, _, err := client.Organizations.IsMember(ctx, "o", "u") if err != nil { t.Errorf("Organizations.IsMember returned error: %+v", err) } if want := false; member != want { t.Errorf("Organizations.IsMember returned %+v, want %+v", member, want) } } // ensure that a 400 response is interpreted as an actual error, and not simply // as "false" like the above case of a 404 func TestOrganizationsService_IsMember_error(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/members/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Error(w, "BadRequest", http.StatusBadRequest) }) ctx := context.Background() member, _, err := client.Organizations.IsMember(ctx, "o", "u") if err == nil { t.Errorf("Expected HTTP 400 response") } if want := false; member != want { t.Errorf("Organizations.IsMember returned %+v, want %+v", member, want) } } func TestOrganizationsService_IsMember_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.IsMember(ctx, "%", "u") testURLParseError(t, err) } func TestOrganizationsService_IsPublicMember(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/public_members/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() member, _, err := client.Organizations.IsPublicMember(ctx, "o", "u") if err != nil { t.Errorf("Organizations.IsPublicMember returned error: %v", err) } if want := true; member != want { t.Errorf("Organizations.IsPublicMember returned %+v, want %+v", member, want) } const methodName = "IsPublicMember" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.IsPublicMember(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.IsPublicMember(ctx, "o", "u") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } // ensure that a 404 response is interpreted as "false" and not an error func TestOrganizationsService_IsPublicMember_notMember(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/public_members/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() member, _, err := client.Organizations.IsPublicMember(ctx, "o", "u") if err != nil { t.Errorf("Organizations.IsPublicMember returned error: %v", err) } if want := false; member != want { t.Errorf("Organizations.IsPublicMember returned %+v, want %+v", member, want) } } // ensure that a 400 response is interpreted as an actual error, and not simply // as "false" like the above case of a 404 func TestOrganizationsService_IsPublicMember_error(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/public_members/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Error(w, "BadRequest", http.StatusBadRequest) }) ctx := context.Background() member, _, err := client.Organizations.IsPublicMember(ctx, "o", "u") if err == nil { t.Errorf("Expected HTTP 400 response") } if want := false; member != want { t.Errorf("Organizations.IsPublicMember returned %+v, want %+v", member, want) } } func TestOrganizationsService_IsPublicMember_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.IsPublicMember(ctx, "%", "u") testURLParseError(t, err) } func TestOrganizationsService_RemoveMember(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/members/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Organizations.RemoveMember(ctx, "o", "u") if err != nil { t.Errorf("Organizations.RemoveMember returned error: %v", err) } const methodName = "RemoveMember" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.RemoveMember(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.RemoveMember(ctx, "o", "u") }) } func TestOrganizationsService_RemoveMember_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Organizations.RemoveMember(ctx, "%", "u") testURLParseError(t, err) } func TestOrganizationsService_PublicizeMembership(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/public_members/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") }) ctx := context.Background() _, err := client.Organizations.PublicizeMembership(ctx, "o", "u") if err != nil { t.Errorf("Organizations.PublicizeMembership returned error: %v", err) } const methodName = "PublicizeMembership" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.PublicizeMembership(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.PublicizeMembership(ctx, "o", "u") }) } func TestOrganizationsService_ConcealMembership(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/public_members/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Organizations.ConcealMembership(ctx, "o", "u") if err != nil { t.Errorf("Organizations.ConcealMembership returned error: %v", err) } const methodName = "ConcealMembership" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.ConcealMembership(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.ConcealMembership(ctx, "o", "u") }) } func TestOrganizationsService_ListOrgMemberships(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/memberships/orgs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "state": "active", "page": "2", }) fmt.Fprint(w, `[{"url":"u"}]`) }) opt := &ListOrgMembershipsOptions{ State: "active", ListOptions: ListOptions{Page: 2}, } ctx := context.Background() memberships, _, err := client.Organizations.ListOrgMemberships(ctx, opt) if err != nil { t.Errorf("Organizations.ListOrgMemberships returned error: %v", err) } want := []*Membership{{URL: String("u")}} if !cmp.Equal(memberships, want) { t.Errorf("Organizations.ListOrgMemberships returned %+v, want %+v", memberships, want) } const methodName = "ListOrgMemberships" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListOrgMemberships(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_GetOrgMembership_AuthenticatedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/memberships/orgs/o", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"url":"u"}`) }) ctx := context.Background() membership, _, err := client.Organizations.GetOrgMembership(ctx, "", "o") if err != nil { t.Errorf("Organizations.GetOrgMembership returned error: %v", err) } want := &Membership{URL: String("u")} if !cmp.Equal(membership, want) { t.Errorf("Organizations.GetOrgMembership returned %+v, want %+v", membership, want) } const methodName = "GetOrgMembership" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.GetOrgMembership(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.GetOrgMembership(ctx, "", "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_GetOrgMembership_SpecifiedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/memberships/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"url":"u"}`) }) ctx := context.Background() membership, _, err := client.Organizations.GetOrgMembership(ctx, "u", "o") if err != nil { t.Errorf("Organizations.GetOrgMembership returned error: %v", err) } want := &Membership{URL: String("u")} if !cmp.Equal(membership, want) { t.Errorf("Organizations.GetOrgMembership returned %+v, want %+v", membership, want) } } func TestOrganizationsService_EditOrgMembership_AuthenticatedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Membership{State: String("active")} mux.HandleFunc("/user/memberships/orgs/o", func(w http.ResponseWriter, r *http.Request) { v := new(Membership) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"url":"u"}`) }) ctx := context.Background() membership, _, err := client.Organizations.EditOrgMembership(ctx, "", "o", input) if err != nil { t.Errorf("Organizations.EditOrgMembership returned error: %v", err) } want := &Membership{URL: String("u")} if !cmp.Equal(membership, want) { t.Errorf("Organizations.EditOrgMembership returned %+v, want %+v", membership, want) } const methodName = "EditOrgMembership" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.EditOrgMembership(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.EditOrgMembership(ctx, "", "o", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_EditOrgMembership_SpecifiedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Membership{State: String("active")} mux.HandleFunc("/orgs/o/memberships/u", func(w http.ResponseWriter, r *http.Request) { v := new(Membership) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"url":"u"}`) }) ctx := context.Background() membership, _, err := client.Organizations.EditOrgMembership(ctx, "u", "o", input) if err != nil { t.Errorf("Organizations.EditOrgMembership returned error: %v", err) } want := &Membership{URL: String("u")} if !cmp.Equal(membership, want) { t.Errorf("Organizations.EditOrgMembership returned %+v, want %+v", membership, want) } } func TestOrganizationsService_RemoveOrgMembership(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/memberships/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Organizations.RemoveOrgMembership(ctx, "u", "o") if err != nil { t.Errorf("Organizations.RemoveOrgMembership returned error: %v", err) } const methodName = "RemoveOrgMembership" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.RemoveOrgMembership(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.RemoveOrgMembership(ctx, "u", "o") }) } func TestOrganizationsService_ListPendingOrgInvitations(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/invitations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "1"}) fmt.Fprint(w, `[ { "id": 1, "login": "monalisa", "email": "octocat@github.com", "role": "direct_member", "created_at": "2017-01-21T00:00:00Z", "inviter": { "login": "other_user", "id": 1, "avatar_url": "https://github.com/images/error/other_user_happy.gif", "gravatar_id": "", "url": "https://api.github.com/users/other_user", "html_url": "https://github.com/other_user", "followers_url": "https://api.github.com/users/other_user/followers", "following_url": "https://api.github.com/users/other_user/following/other_user", "gists_url": "https://api.github.com/users/other_user/gists/gist_id", "starred_url": "https://api.github.com/users/other_user/starred/owner/repo", "subscriptions_url": "https://api.github.com/users/other_user/subscriptions", "organizations_url": "https://api.github.com/users/other_user/orgs", "repos_url": "https://api.github.com/users/other_user/repos", "events_url": "https://api.github.com/users/other_user/events/privacy", "received_events_url": "https://api.github.com/users/other_user/received_events/privacy", "type": "User", "site_admin": false }, "team_count": 2, "invitation_team_url": "https://api.github.com/organizations/2/invitations/1/teams" } ]`) }) opt := &ListOptions{Page: 1} ctx := context.Background() invitations, _, err := client.Organizations.ListPendingOrgInvitations(ctx, "o", opt) if err != nil { t.Errorf("Organizations.ListPendingOrgInvitations returned error: %v", err) } createdAt := time.Date(2017, time.January, 21, 0, 0, 0, 0, time.UTC) want := []*Invitation{ { ID: Int64(1), Login: String("monalisa"), Email: String("octocat@github.com"), Role: String("direct_member"), CreatedAt: &createdAt, Inviter: &User{ Login: String("other_user"), ID: Int64(1), AvatarURL: String("https://github.com/images/error/other_user_happy.gif"), GravatarID: String(""), URL: String("https://api.github.com/users/other_user"), HTMLURL: String("https://github.com/other_user"), FollowersURL: String("https://api.github.com/users/other_user/followers"), FollowingURL: String("https://api.github.com/users/other_user/following/other_user"), GistsURL: String("https://api.github.com/users/other_user/gists/gist_id"), StarredURL: String("https://api.github.com/users/other_user/starred/owner/repo"), SubscriptionsURL: String("https://api.github.com/users/other_user/subscriptions"), OrganizationsURL: String("https://api.github.com/users/other_user/orgs"), ReposURL: String("https://api.github.com/users/other_user/repos"), EventsURL: String("https://api.github.com/users/other_user/events/privacy"), ReceivedEventsURL: String("https://api.github.com/users/other_user/received_events/privacy"), Type: String("User"), SiteAdmin: Bool(false), }, TeamCount: Int(2), InvitationTeamURL: String("https://api.github.com/organizations/2/invitations/1/teams"), }} if !cmp.Equal(invitations, want) { t.Errorf("Organizations.ListPendingOrgInvitations returned %+v, want %+v", invitations, want) } const methodName = "ListPendingOrgInvitations" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListPendingOrgInvitations(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListPendingOrgInvitations(ctx, "o", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_CreateOrgInvitation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &CreateOrgInvitationOptions{ Email: String("octocat@github.com"), Role: String("direct_member"), TeamID: []int64{ 12, 26, }, } mux.HandleFunc("/orgs/o/invitations", func(w http.ResponseWriter, r *http.Request) { v := new(CreateOrgInvitationOptions) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprintln(w, `{"email": "octocat@github.com"}`) }) ctx := context.Background() invitations, _, err := client.Organizations.CreateOrgInvitation(ctx, "o", input) if err != nil { t.Errorf("Organizations.CreateOrgInvitation returned error: %v", err) } want := &Invitation{Email: String("octocat@github.com")} if !cmp.Equal(invitations, want) { t.Errorf("Organizations.ListPendingOrgInvitations returned %+v, want %+v", invitations, want) } const methodName = "CreateOrgInvitation" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.CreateOrgInvitation(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.CreateOrgInvitation(ctx, "o", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_ListOrgInvitationTeams(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/invitations/22/teams", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "1"}) fmt.Fprint(w, `[ { "id": 1, "url": "https://api.github.com/teams/1", "name": "Justice League", "slug": "justice-league", "description": "A great team.", "privacy": "closed", "permission": "admin", "members_url": "https://api.github.com/teams/1/members{/member}", "repositories_url": "https://api.github.com/teams/1/repos" } ]`) }) opt := &ListOptions{Page: 1} ctx := context.Background() invitations, _, err := client.Organizations.ListOrgInvitationTeams(ctx, "o", "22", opt) if err != nil { t.Errorf("Organizations.ListOrgInvitationTeams returned error: %v", err) } want := []*Team{ { ID: Int64(1), URL: String("https://api.github.com/teams/1"), Name: String("Justice League"), Slug: String("justice-league"), Description: String("A great team."), Privacy: String("closed"), Permission: String("admin"), MembersURL: String("https://api.github.com/teams/1/members{/member}"), RepositoriesURL: String("https://api.github.com/teams/1/repos"), }, } if !cmp.Equal(invitations, want) { t.Errorf("Organizations.ListOrgInvitationTeams returned %+v, want %+v", invitations, want) } const methodName = "ListOrgInvitationTeams" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListOrgInvitationTeams(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListOrgInvitationTeams(ctx, "o", "22", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_ListFailedOrgInvitations(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/failed_invitations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2", "per_page": "1"}) fmt.Fprint(w, `[ { "id":1, "login":"monalisa", "node_id":"MDQ6VXNlcjE=", "email":"octocat@github.com", "role":"direct_member", "created_at":"2016-11-30T06:46:10Z", "failed_at":"2017-01-02T01:10:00Z", "failed_reason":"the reason", "inviter":{ "login":"other_user", "id":1, "node_id":"MDQ6VXNlcjE=", "avatar_url":"https://github.com/images/error/other_user_happy.gif", "gravatar_id":"", "url":"https://api.github.com/users/other_user", "html_url":"https://github.com/other_user", "followers_url":"https://api.github.com/users/other_user/followers", "following_url":"https://api.github.com/users/other_user/following{/other_user}", "gists_url":"https://api.github.com/users/other_user/gists{/gist_id}", "starred_url":"https://api.github.com/users/other_user/starred{/owner}{/repo}", "subscriptions_url":"https://api.github.com/users/other_user/subscriptions", "organizations_url":"https://api.github.com/users/other_user/orgs", "repos_url":"https://api.github.com/users/other_user/repos", "events_url":"https://api.github.com/users/other_user/events{/privacy}", "received_events_url":"https://api.github.com/users/other_user/received_events", "type":"User", "site_admin":false }, "team_count":2, "invitation_team_url":"https://api.github.com/organizations/2/invitations/1/teams" } ]`) }) opts := &ListOptions{Page: 2, PerPage: 1} ctx := context.Background() failedInvitations, _, err := client.Organizations.ListFailedOrgInvitations(ctx, "o", opts) if err != nil { t.Errorf("Organizations.ListFailedOrgInvitations returned error: %v", err) } createdAt := time.Date(2016, time.November, 30, 6, 46, 10, 0, time.UTC) want := []*Invitation{ { ID: Int64(1), Login: String("monalisa"), NodeID: String("MDQ6VXNlcjE="), Email: String("octocat@github.com"), Role: String("direct_member"), FailedAt: &Timestamp{time.Date(2017, time.January, 2, 1, 10, 0, 0, time.UTC)}, FailedReason: String("the reason"), CreatedAt: &createdAt, Inviter: &User{ Login: String("other_user"), ID: Int64(1), NodeID: String("MDQ6VXNlcjE="), AvatarURL: String("https://github.com/images/error/other_user_happy.gif"), GravatarID: String(""), URL: String("https://api.github.com/users/other_user"), HTMLURL: String("https://github.com/other_user"), FollowersURL: String("https://api.github.com/users/other_user/followers"), FollowingURL: String("https://api.github.com/users/other_user/following{/other_user}"), GistsURL: String("https://api.github.com/users/other_user/gists{/gist_id}"), StarredURL: String("https://api.github.com/users/other_user/starred{/owner}{/repo}"), SubscriptionsURL: String("https://api.github.com/users/other_user/subscriptions"), OrganizationsURL: String("https://api.github.com/users/other_user/orgs"), ReposURL: String("https://api.github.com/users/other_user/repos"), EventsURL: String("https://api.github.com/users/other_user/events{/privacy}"), ReceivedEventsURL: String("https://api.github.com/users/other_user/received_events"), Type: String("User"), SiteAdmin: Bool(false), }, TeamCount: Int(2), InvitationTeamURL: String("https://api.github.com/organizations/2/invitations/1/teams"), }, } if !cmp.Equal(failedInvitations, want) { t.Errorf("Organizations.ListFailedOrgInvitations returned %+v, want %+v", failedInvitations, want) } const methodName = "ListFailedOrgInvitations" testBadOptions(t, methodName, func() error { _, _, err := client.Organizations.ListFailedOrgInvitations(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListFailedOrgInvitations(ctx, "o", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMembership_Marshal(t *testing.T) { testJSONMarshal(t, &Membership{}, "{}") u := &Membership{ URL: String("url"), State: String("state"), Role: String("email"), OrganizationURL: String("orgurl"), Organization: &Organization{ BillingEmail: String("be"), Blog: String("b"), Company: String("c"), Email: String("e"), TwitterUsername: String("tu"), Location: String("loc"), Name: String("n"), Description: String("d"), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("drp"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("marct"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), }, User: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, } want := `{ "url": "url", "state": "state", "role": "email", "organization_url": "orgurl", "organization": { "name": "n", "company": "c", "blog": "b", "location": "loc", "email": "e", "twitter_username": "tu", "description": "d", "billing_email": "be", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "drp", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "marct", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true }, "user": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" } }` testJSONMarshal(t, u, want) } func TestCreateOrgInvitationOptions_Marshal(t *testing.T) { testJSONMarshal(t, &CreateOrgInvitationOptions{}, "{}") u := &CreateOrgInvitationOptions{ InviteeID: Int64(1), Email: String("email"), Role: String("role"), TeamID: []int64{1}, } want := `{ "invitee_id": 1, "email": "email", "role": "role", "team_ids": [ 1 ] }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/orgs_outside_collaborators.go000066400000000000000000000056551410475703100227520ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "fmt" ) // ListOutsideCollaboratorsOptions specifies optional parameters to the // OrganizationsService.ListOutsideCollaborators method. type ListOutsideCollaboratorsOptions struct { // Filter outside collaborators returned in the list. Possible values are: // 2fa_disabled, all. Default is "all". Filter string `url:"filter,omitempty"` ListOptions } // ListOutsideCollaborators lists outside collaborators of organization's repositories. // This will only work if the authenticated // user is an owner of the organization. // // Warning: The API may change without advance notice during the preview period. // Preview features are not supported for production use. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#list-outside-collaborators-for-an-organization func (s *OrganizationsService) ListOutsideCollaborators(ctx context.Context, org string, opts *ListOutsideCollaboratorsOptions) ([]*User, *Response, error) { u := fmt.Sprintf("orgs/%v/outside_collaborators", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var members []*User resp, err := s.client.Do(ctx, req, &members) if err != nil { return nil, resp, err } return members, resp, nil } // RemoveOutsideCollaborator removes a user from the list of outside collaborators; // consequently, removing them from all the organization's repositories. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#remove-outside-collaborator-from-an-organization func (s *OrganizationsService) RemoveOutsideCollaborator(ctx context.Context, org string, user string) (*Response, error) { u := fmt.Sprintf("orgs/%v/outside_collaborators/%v", org, user) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ConvertMemberToOutsideCollaborator reduces the permission level of a member of the // organization to that of an outside collaborator. Therefore, they will only // have access to the repositories that their current team membership allows. // Responses for converting a non-member or the last owner to an outside collaborator // are listed in GitHub API docs. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#convert-an-organization-member-to-outside-collaborator func (s *OrganizationsService) ConvertMemberToOutsideCollaborator(ctx context.Context, org string, user string) (*Response, error) { u := fmt.Sprintf("orgs/%v/outside_collaborators/%v", org, user) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/orgs_outside_collaborators_test.go000066400000000000000000000131651410475703100240040ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestOrganizationsService_ListOutsideCollaborators(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/outside_collaborators", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "filter": "2fa_disabled", "page": "2", }) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOutsideCollaboratorsOptions{ Filter: "2fa_disabled", ListOptions: ListOptions{Page: 2}, } ctx := context.Background() members, _, err := client.Organizations.ListOutsideCollaborators(ctx, "o", opt) if err != nil { t.Errorf("Organizations.ListOutsideCollaborators returned error: %v", err) } want := []*User{{ID: Int64(1)}} if !cmp.Equal(members, want) { t.Errorf("Organizations.ListOutsideCollaborators returned %+v, want %+v", members, want) } const methodName = "ListOutsideCollaborators" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListOutsideCollaborators(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListOutsideCollaborators(ctx, "o", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_ListOutsideCollaborators_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.ListOutsideCollaborators(ctx, "%", nil) testURLParseError(t, err) } func TestOrganizationsService_RemoveOutsideCollaborator(t *testing.T) { client, mux, _, teardown := setup() defer teardown() handler := func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") } mux.HandleFunc("/orgs/o/outside_collaborators/u", handler) ctx := context.Background() _, err := client.Organizations.RemoveOutsideCollaborator(ctx, "o", "u") if err != nil { t.Errorf("Organizations.RemoveOutsideCollaborator returned error: %v", err) } const methodName = "RemoveOutsideCollaborator" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.RemoveOutsideCollaborator(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.RemoveOutsideCollaborator(ctx, "o", "u") }) } func TestOrganizationsService_RemoveOutsideCollaborator_NonMember(t *testing.T) { client, mux, _, teardown := setup() defer teardown() handler := func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNotFound) } mux.HandleFunc("/orgs/o/outside_collaborators/u", handler) ctx := context.Background() _, err := client.Organizations.RemoveOutsideCollaborator(ctx, "o", "u") if err, ok := err.(*ErrorResponse); !ok { t.Errorf("Organizations.RemoveOutsideCollaborator did not return an error") } else if err.Response.StatusCode != http.StatusNotFound { t.Errorf("Organizations.RemoveOutsideCollaborator did not return 404 status code") } } func TestOrganizationsService_RemoveOutsideCollaborator_Member(t *testing.T) { client, mux, _, teardown := setup() defer teardown() handler := func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusUnprocessableEntity) } mux.HandleFunc("/orgs/o/outside_collaborators/u", handler) ctx := context.Background() _, err := client.Organizations.RemoveOutsideCollaborator(ctx, "o", "u") if err, ok := err.(*ErrorResponse); !ok { t.Errorf("Organizations.RemoveOutsideCollaborator did not return an error") } else if err.Response.StatusCode != http.StatusUnprocessableEntity { t.Errorf("Organizations.RemoveOutsideCollaborator did not return 422 status code") } } func TestOrganizationsService_ConvertMemberToOutsideCollaborator(t *testing.T) { client, mux, _, teardown := setup() defer teardown() handler := func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") } mux.HandleFunc("/orgs/o/outside_collaborators/u", handler) ctx := context.Background() _, err := client.Organizations.ConvertMemberToOutsideCollaborator(ctx, "o", "u") if err != nil { t.Errorf("Organizations.ConvertMemberToOutsideCollaborator returned error: %v", err) } const methodName = "ConvertMemberToOutsideCollaborator" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.ConvertMemberToOutsideCollaborator(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.ConvertMemberToOutsideCollaborator(ctx, "o", "u") }) } func TestOrganizationsService_ConvertMemberToOutsideCollaborator_NonMemberOrLastOwner(t *testing.T) { client, mux, _, teardown := setup() defer teardown() handler := func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") w.WriteHeader(http.StatusForbidden) } mux.HandleFunc("/orgs/o/outside_collaborators/u", handler) ctx := context.Background() _, err := client.Organizations.ConvertMemberToOutsideCollaborator(ctx, "o", "u") if err, ok := err.(*ErrorResponse); !ok { t.Errorf("Organizations.ConvertMemberToOutsideCollaborator did not return an error") } else if err.Response.StatusCode != http.StatusForbidden { t.Errorf("Organizations.ConvertMemberToOutsideCollaborator did not return 403 status code") } } go-github-38.1.0/github/orgs_projects.go000066400000000000000000000033161410475703100201710ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "fmt" ) // ListProjects lists the projects for an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#list-organization-projects func (s *OrganizationsService) ListProjects(ctx context.Context, org string, opts *ProjectListOptions) ([]*Project, *Response, error) { u := fmt.Sprintf("orgs/%v/projects", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeProjectsPreview) var projects []*Project resp, err := s.client.Do(ctx, req, &projects) if err != nil { return nil, resp, err } return projects, resp, nil } // CreateProject creates a GitHub Project for the specified organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#create-an-organization-project func (s *OrganizationsService) CreateProject(ctx context.Context, org string, opts *ProjectOptions) (*Project, *Response, error) { u := fmt.Sprintf("orgs/%v/projects", org) req, err := s.client.NewRequest("POST", u, opts) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeProjectsPreview) project := &Project{} resp, err := s.client.Do(ctx, req, project) if err != nil { return nil, resp, err } return project, resp, nil } go-github-38.1.0/github/orgs_projects_test.go000066400000000000000000000054531410475703100212340ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestOrganizationsService_ListProjects(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/projects", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeProjectsPreview) testFormValues(t, r, values{"state": "open", "page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ProjectListOptions{State: "open", ListOptions: ListOptions{Page: 2}} ctx := context.Background() projects, _, err := client.Organizations.ListProjects(ctx, "o", opt) if err != nil { t.Errorf("Organizations.ListProjects returned error: %v", err) } want := []*Project{{ID: Int64(1)}} if !cmp.Equal(projects, want) { t.Errorf("Organizations.ListProjects returned %+v, want %+v", projects, want) } const methodName = "ListProjects" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListProjects(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListProjects(ctx, "o", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_CreateProject(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ProjectOptions{Name: String("Project Name"), Body: String("Project body.")} mux.HandleFunc("/orgs/o/projects", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeProjectsPreview) v := &ProjectOptions{} json.NewDecoder(r.Body).Decode(v) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() project, _, err := client.Organizations.CreateProject(ctx, "o", input) if err != nil { t.Errorf("Organizations.CreateProject returned error: %v", err) } want := &Project{ID: Int64(1)} if !cmp.Equal(project, want) { t.Errorf("Organizations.CreateProject returned %+v, want %+v", project, want) } const methodName = "CreateProject" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.CreateProject(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.CreateProject(ctx, "o", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-38.1.0/github/orgs_test.go000066400000000000000000000321461410475703100173220ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestOrganization_Marshal(t *testing.T) { testJSONMarshal(t, &Organization{}, "{}") o := &Organization{ BillingEmail: String("support@github.com"), Blog: String("https://github.com/blog"), Company: String("GitHub"), Email: String("support@github.com"), TwitterUsername: String("github"), Location: String("San Francisco"), Name: String("github"), Description: String("GitHub, the company."), IsVerified: Bool(true), HasOrganizationProjects: Bool(true), HasRepositoryProjects: Bool(true), DefaultRepoPermission: String("read"), MembersCanCreateRepos: Bool(true), MembersCanCreateInternalRepos: Bool(true), MembersCanCreatePrivateRepos: Bool(true), MembersCanCreatePublicRepos: Bool(false), MembersAllowedRepositoryCreationType: String("all"), MembersCanCreatePages: Bool(true), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(true), } want := ` { "billing_email": "support@github.com", "blog": "https://github.com/blog", "company": "GitHub", "email": "support@github.com", "twitter_username": "github", "location": "San Francisco", "name": "github", "description": "GitHub, the company.", "is_verified": true, "has_organization_projects": true, "has_repository_projects": true, "default_repository_permission": "read", "members_can_create_repositories": true, "members_can_create_public_repositories": false, "members_can_create_private_repositories": true, "members_can_create_internal_repositories": true, "members_allowed_repository_creation_type": "all", "members_can_create_pages": true, "members_can_create_public_pages": false, "members_can_create_private_pages": true } ` testJSONMarshal(t, o, want) } func TestOrganizationsService_ListAll(t *testing.T) { client, mux, _, teardown := setup() defer teardown() since := int64(1342004) mux.HandleFunc("/organizations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"since": "1342004"}) fmt.Fprint(w, `[{"id":4314092}]`) }) opt := &OrganizationsListOptions{Since: since} ctx := context.Background() orgs, _, err := client.Organizations.ListAll(ctx, opt) if err != nil { t.Errorf("Organizations.ListAll returned error: %v", err) } want := []*Organization{{ID: Int64(4314092)}} if !cmp.Equal(orgs, want) { t.Errorf("Organizations.ListAll returned %+v, want %+v", orgs, want) } const methodName = "ListAll" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListAll(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_List_authenticatedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/orgs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":1},{"id":2}]`) }) ctx := context.Background() orgs, _, err := client.Organizations.List(ctx, "", nil) if err != nil { t.Errorf("Organizations.List returned error: %v", err) } want := []*Organization{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(orgs, want) { t.Errorf("Organizations.List returned %+v, want %+v", orgs, want) } const methodName = "List" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.List(ctx, "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.List(ctx, "", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_List_specifiedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/orgs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1},{"id":2}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() orgs, _, err := client.Organizations.List(ctx, "u", opt) if err != nil { t.Errorf("Organizations.List returned error: %v", err) } want := []*Organization{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(orgs, want) { t.Errorf("Organizations.List returned %+v, want %+v", orgs, want) } const methodName = "List" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.List(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.List(ctx, "u", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_List_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.List(ctx, "%", nil) testURLParseError(t, err) } func TestOrganizationsService_Get(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeMemberAllowedRepoCreationTypePreview) fmt.Fprint(w, `{"id":1, "login":"l", "url":"u", "avatar_url": "a", "location":"l"}`) }) ctx := context.Background() org, _, err := client.Organizations.Get(ctx, "o") if err != nil { t.Errorf("Organizations.Get returned error: %v", err) } want := &Organization{ID: Int64(1), Login: String("l"), URL: String("u"), AvatarURL: String("a"), Location: String("l")} if !cmp.Equal(org, want) { t.Errorf("Organizations.Get returned %+v, want %+v", org, want) } const methodName = "Get" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.Get(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.Get(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_Get_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.Get(ctx, "%") testURLParseError(t, err) } func TestOrganizationsService_GetByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "login":"l", "url":"u", "avatar_url": "a", "location":"l"}`) }) ctx := context.Background() org, _, err := client.Organizations.GetByID(ctx, 1) if err != nil { t.Fatalf("Organizations.GetByID returned error: %v", err) } want := &Organization{ID: Int64(1), Login: String("l"), URL: String("u"), AvatarURL: String("a"), Location: String("l")} if !cmp.Equal(org, want) { t.Errorf("Organizations.GetByID returned %+v, want %+v", org, want) } const methodName = "GetByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.GetByID(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.GetByID(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_Edit(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Organization{Login: String("l")} mux.HandleFunc("/orgs/o", func(w http.ResponseWriter, r *http.Request) { v := new(Organization) json.NewDecoder(r.Body).Decode(v) testHeader(t, r, "Accept", mediaTypeMemberAllowedRepoCreationTypePreview) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() org, _, err := client.Organizations.Edit(ctx, "o", input) if err != nil { t.Errorf("Organizations.Edit returned error: %v", err) } want := &Organization{ID: Int64(1)} if !cmp.Equal(org, want) { t.Errorf("Organizations.Edit returned %+v, want %+v", org, want) } const methodName = "Edit" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.Edit(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.Edit(ctx, "o", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_Edit_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.Edit(ctx, "%", nil) testURLParseError(t, err) } func TestOrganizationsService_ListInstallations(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/installations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"total_count": 1, "installations": [{ "id": 1, "app_id": 5}]}`) }) ctx := context.Background() apps, _, err := client.Organizations.ListInstallations(ctx, "o", nil) if err != nil { t.Errorf("Organizations.ListInstallations returned error: %v", err) } want := &OrganizationInstallations{TotalCount: Int(1), Installations: []*Installation{{ID: Int64(1), AppID: Int64(5)}}} if !cmp.Equal(apps, want) { t.Errorf("Organizations.ListInstallations returned %+v, want %+v", apps, want) } const methodName = "ListInstallations" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListInstallations(ctx, "\no", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListInstallations(ctx, "o", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_ListInstallations_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.ListInstallations(ctx, "%", nil) testURLParseError(t, err) } func TestOrganizationsService_ListInstallations_withListOptions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/installations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `{"total_count": 2, "installations": [{ "id": 2, "app_id": 10}]}`) }) ctx := context.Background() apps, _, err := client.Organizations.ListInstallations(ctx, "o", &ListOptions{Page: 2}) if err != nil { t.Errorf("Organizations.ListInstallations returned error: %v", err) } want := &OrganizationInstallations{TotalCount: Int(2), Installations: []*Installation{{ID: Int64(2), AppID: Int64(10)}}} if !cmp.Equal(apps, want) { t.Errorf("Organizations.ListInstallations returned %+v, want %+v", apps, want) } // Test ListOptions failure _, _, err = client.Organizations.ListInstallations(ctx, "%", &ListOptions{}) if err == nil { t.Error("Organizations.ListInstallations returned error: nil") } const methodName = "ListInstallations" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListInstallations(ctx, "\n", &ListOptions{Page: 2}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListInstallations(ctx, "o", &ListOptions{Page: 2}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationInstallations_Marshal(t *testing.T) { testJSONMarshal(t, &OrganizationInstallations{}, "{}") o := &OrganizationInstallations{ TotalCount: Int(1), Installations: []*Installation{{ID: Int64(1)}}, } want := `{ "total_count": 1, "installations": [ { "id": 1 } ] }` testJSONMarshal(t, o, want) } func TestPlan_Marshal(t *testing.T) { testJSONMarshal(t, &Plan{}, "{}") o := &Plan{ Name: String("name"), Space: Int(1), Collaborators: Int(1), PrivateRepos: Int(1), FilledSeats: Int(1), Seats: Int(1), } want := `{ "name": "name", "space": 1, "collaborators": 1, "private_repos": 1, "filled_seats": 1, "seats": 1 }` testJSONMarshal(t, o, want) } go-github-38.1.0/github/orgs_users_blocking.go000066400000000000000000000055661410475703100213620ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "fmt" ) // ListBlockedUsers lists all the users blocked by an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#list-users-blocked-by-an-organization func (s *OrganizationsService) ListBlockedUsers(ctx context.Context, org string, opts *ListOptions) ([]*User, *Response, error) { u := fmt.Sprintf("orgs/%v/blocks", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeBlockUsersPreview) var blockedUsers []*User resp, err := s.client.Do(ctx, req, &blockedUsers) if err != nil { return nil, resp, err } return blockedUsers, resp, nil } // IsBlocked reports whether specified user is blocked from an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#check-if-a-user-is-blocked-by-an-organization func (s *OrganizationsService) IsBlocked(ctx context.Context, org string, user string) (bool, *Response, error) { u := fmt.Sprintf("orgs/%v/blocks/%v", org, user) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return false, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeBlockUsersPreview) resp, err := s.client.Do(ctx, req, nil) isBlocked, err := parseBoolResponse(err) return isBlocked, resp, err } // BlockUser blocks specified user from an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#block-a-user-from-an-organization func (s *OrganizationsService) BlockUser(ctx context.Context, org string, user string) (*Response, error) { u := fmt.Sprintf("orgs/%v/blocks/%v", org, user) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeBlockUsersPreview) return s.client.Do(ctx, req, nil) } // UnblockUser unblocks specified user from an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/orgs/#unblock-a-user-from-an-organization func (s *OrganizationsService) UnblockUser(ctx context.Context, org string, user string) (*Response, error) { u := fmt.Sprintf("orgs/%v/blocks/%v", org, user) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeBlockUsersPreview) return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/orgs_users_blocking_test.go000066400000000000000000000100731410475703100224060ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestOrganizationsService_ListBlockedUsers(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/blocks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeBlockUsersPreview) testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{ "login": "octocat" }]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() blockedUsers, _, err := client.Organizations.ListBlockedUsers(ctx, "o", opt) if err != nil { t.Errorf("Organizations.ListBlockedUsers returned error: %v", err) } want := []*User{{Login: String("octocat")}} if !cmp.Equal(blockedUsers, want) { t.Errorf("Organizations.ListBlockedUsers returned %+v, want %+v", blockedUsers, want) } const methodName = "ListBlockedUsers" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListBlockedUsers(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListBlockedUsers(ctx, "o", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_IsBlocked(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/blocks/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeBlockUsersPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() isBlocked, _, err := client.Organizations.IsBlocked(ctx, "o", "u") if err != nil { t.Errorf("Organizations.IsBlocked returned error: %v", err) } if want := true; isBlocked != want { t.Errorf("Organizations.IsBlocked returned %+v, want %+v", isBlocked, want) } const methodName = "IsBlocked" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.IsBlocked(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.IsBlocked(ctx, "o", "u") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_BlockUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/blocks/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Accept", mediaTypeBlockUsersPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Organizations.BlockUser(ctx, "o", "u") if err != nil { t.Errorf("Organizations.BlockUser returned error: %v", err) } const methodName = "BlockUser" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.BlockUser(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.BlockUser(ctx, "o", "u") }) } func TestOrganizationsService_UnblockUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/blocks/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeBlockUsersPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Organizations.UnblockUser(ctx, "o", "u") if err != nil { t.Errorf("Organizations.UnblockUser returned error: %v", err) } const methodName = "UnblockUser" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.UnblockUser(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.UnblockUser(ctx, "o", "u") }) } go-github-38.1.0/github/packages.go000066400000000000000000000100201410475703100170520ustar00rootroot00000000000000// Copyright 2020 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 // Package represents a GitHub package. type Package struct { ID *int64 `json:"id,omitempty"` Name *string `json:"name,omitempty"` PackageType *string `json:"package_type,omitempty"` HTMLURL *string `json:"html_url,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` Owner *User `json:"owner,omitempty"` PackageVersion *PackageVersion `json:"package_version,omitempty"` Registry *PackageRegistry `json:"registry,omitempty"` } func (p Package) String() string { return Stringify(p) } // PackageVersion represents a GitHub package version. type PackageVersion struct { ID *int64 `json:"id,omitempty"` Version *string `json:"version,omitempty"` Summary *string `json:"summary,omitempty"` Body *string `json:"body,omitempty"` BodyHTML *string `json:"body_html,omitempty"` Release *PackageRelease `json:"release,omitempty"` Manifest *string `json:"manifest,omitempty"` HTMLURL *string `json:"html_url,omitempty"` TagName *string `json:"tag_name,omitempty"` TargetCommitish *string `json:"target_commitish,omitempty"` TargetOID *string `json:"target_oid,omitempty"` Draft *bool `json:"draft,omitempty"` Prerelease *bool `json:"prerelease,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` PackageFiles []*PackageFile `json:"package_files,omitempty"` Author *User `json:"author,omitempty"` InstallationCommand *string `json:"installation_command,omitempty"` } func (pv PackageVersion) String() string { return Stringify(pv) } // PackageRelease represents a GitHub package version release. type PackageRelease struct { URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` ID *int64 `json:"id,omitempty"` TagName *string `json:"tag_name,omitempty"` TargetCommitish *string `json:"target_commitish,omitempty"` Name *string `json:"name,omitempty"` Draft *bool `json:"draft,omitempty"` Author *User `json:"author,omitempty"` Prerelease *bool `json:"prerelease,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` PublishedAt *Timestamp `json:"published_at,omitempty"` } func (r PackageRelease) String() string { return Stringify(r) } // PackageFile represents a GitHub package version release file. type PackageFile struct { DownloadURL *string `json:"download_url,omitempty"` ID *int64 `json:"id,omitempty"` Name *string `json:"name,omitempty"` SHA256 *string `json:"sha256,omitempty"` SHA1 *string `json:"sha1,omitempty"` MD5 *string `json:"md5,omitempty"` ContentType *string `json:"content_type,omitempty"` State *string `json:"state,omitempty"` Author *User `json:"author,omitempty"` Size *int64 `json:"size,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` } func (pf PackageFile) String() string { return Stringify(pf) } // PackageRegistry represents a GitHub package registry. type PackageRegistry struct { AboutURL *string `json:"about_url,omitempty"` Name *string `json:"name,omitempty"` Type *string `json:"type,omitempty"` URL *string `json:"url,omitempty"` Vendor *string `json:"vendor,omitempty"` } func (r PackageRegistry) String() string { return Stringify(r) } go-github-38.1.0/github/packages_test.go000066400000000000000000000417451410475703100201330ustar00rootroot00000000000000// Copyright 2021 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 "testing" func TestPackageRegistry_Marshal(t *testing.T) { testJSONMarshal(t, &PackageRegistry{}, "{}") o := &PackageRegistry{ AboutURL: String("aurl"), Name: String("name"), Type: String("type"), URL: String("url"), Vendor: String("vendor"), } want := `{ "about_url": "aurl", "name": "name", "type": "type", "url": "url", "vendor": "vendor" }` testJSONMarshal(t, o, want) } func TestPackageFile_Marshal(t *testing.T) { testJSONMarshal(t, &PackageFile{}, "{}") o := &PackageFile{ DownloadURL: String("durl"), ID: Int64(1), Name: String("name"), SHA256: String("sha256"), SHA1: String("sha1"), MD5: String("md5"), ContentType: String("ct"), State: String("state"), Author: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Size: Int64(1), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, } want := `{ "download_url": "durl", "id": 1, "name": "name", "sha256": "sha256", "sha1": "sha1", "md5": "md5", "content_type": "ct", "state": "state", "author": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "size": 1, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, o, want) } func TestPackageRelease_Marshal(t *testing.T) { testJSONMarshal(t, &PackageRelease{}, "{}") o := &PackageRelease{ URL: String("url"), HTMLURL: String("hurl"), ID: Int64(1), TagName: String("tn"), TargetCommitish: String("tcs"), Name: String("name"), Draft: Bool(true), Author: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Prerelease: Bool(true), CreatedAt: &Timestamp{referenceTime}, PublishedAt: &Timestamp{referenceTime}, } want := `{ "url": "url", "html_url": "hurl", "id": 1, "tag_name": "tn", "target_commitish": "tcs", "name": "name", "draft": true, "author": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "prerelease": true, "created_at": ` + referenceTimeStr + `, "published_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, o, want) } func TestPackageVersion_Marshal(t *testing.T) { testJSONMarshal(t, &PackageVersion{}, "{}") o := &PackageVersion{ ID: Int64(1), Version: String("ver"), Summary: String("sum"), Body: String("body"), BodyHTML: String("btnhtml"), Release: &PackageRelease{ URL: String("url"), HTMLURL: String("hurl"), ID: Int64(1), TagName: String("tn"), TargetCommitish: String("tcs"), Name: String("name"), Draft: Bool(true), Author: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Prerelease: Bool(true), CreatedAt: &Timestamp{referenceTime}, PublishedAt: &Timestamp{referenceTime}, }, Manifest: String("mani"), HTMLURL: String("hurl"), TagName: String("tn"), TargetCommitish: String("tcs"), TargetOID: String("tid"), Draft: Bool(true), Prerelease: Bool(true), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, PackageFiles: []*PackageFile{ { DownloadURL: String("durl"), ID: Int64(1), Name: String("name"), SHA256: String("sha256"), SHA1: String("sha1"), MD5: String("md5"), ContentType: String("ct"), State: String("state"), Author: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Size: Int64(1), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, }, }, Author: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, InstallationCommand: String("ic"), } want := `{ "id": 1, "version": "ver", "summary": "sum", "body": "body", "body_html": "btnhtml", "release": { "url": "url", "html_url": "hurl", "id": 1, "tag_name": "tn", "target_commitish": "tcs", "name": "name", "draft": true, "author": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "prerelease": true, "created_at": ` + referenceTimeStr + `, "published_at": ` + referenceTimeStr + ` }, "manifest": "mani", "html_url": "hurl", "tag_name": "tn", "target_commitish": "tcs", "target_oid": "tid", "draft": true, "prerelease": true, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "package_files": [ { "download_url": "durl", "id": 1, "name": "name", "sha256": "sha256", "sha1": "sha1", "md5": "md5", "content_type": "ct", "state": "state", "author": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "size": 1, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` } ], "author": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "installation_command": "ic" }` testJSONMarshal(t, o, want) } func TestPackage_Marshal(t *testing.T) { testJSONMarshal(t, &Package{}, "{}") o := &Package{ ID: Int64(1), Name: String("name"), PackageType: String("pt"), HTMLURL: String("hurl"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, Owner: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, PackageVersion: &PackageVersion{ ID: Int64(1), Version: String("ver"), Summary: String("sum"), Body: String("body"), BodyHTML: String("btnhtml"), Release: &PackageRelease{ URL: String("url"), HTMLURL: String("hurl"), ID: Int64(1), TagName: String("tn"), TargetCommitish: String("tcs"), Name: String("name"), Draft: Bool(true), Author: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Prerelease: Bool(true), CreatedAt: &Timestamp{referenceTime}, PublishedAt: &Timestamp{referenceTime}, }, Manifest: String("mani"), HTMLURL: String("hurl"), TagName: String("tn"), TargetCommitish: String("tcs"), TargetOID: String("tid"), Draft: Bool(true), Prerelease: Bool(true), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, PackageFiles: []*PackageFile{ { DownloadURL: String("durl"), ID: Int64(1), Name: String("name"), SHA256: String("sha256"), SHA1: String("sha1"), MD5: String("md5"), ContentType: String("ct"), State: String("state"), Author: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Size: Int64(1), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, }, }, Author: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, InstallationCommand: String("ic"), }, Registry: &PackageRegistry{ AboutURL: String("aurl"), Name: String("name"), Type: String("type"), URL: String("url"), Vendor: String("vendor"), }, } want := `{ "id": 1, "name": "name", "package_type": "pt", "html_url": "hurl", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "owner": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "package_version": { "id": 1, "version": "ver", "summary": "sum", "body": "body", "body_html": "btnhtml", "release": { "url": "url", "html_url": "hurl", "id": 1, "tag_name": "tn", "target_commitish": "tcs", "name": "name", "draft": true, "author": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "prerelease": true, "created_at": ` + referenceTimeStr + `, "published_at": ` + referenceTimeStr + ` }, "manifest": "mani", "html_url": "hurl", "tag_name": "tn", "target_commitish": "tcs", "target_oid": "tid", "draft": true, "prerelease": true, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "package_files": [ { "download_url": "durl", "id": 1, "name": "name", "sha256": "sha256", "sha1": "sha1", "md5": "md5", "content_type": "ct", "state": "state", "author": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "size": 1, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` } ], "author": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "installation_command": "ic" }, "registry": { "about_url": "aurl", "name": "name", "type": "type", "url": "url", "vendor": "vendor" } }` testJSONMarshal(t, o, want) } go-github-38.1.0/github/projects.go000066400000000000000000000524341410475703100171440ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" ) // ProjectsService provides access to the projects functions in the // GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/ type ProjectsService service // Project represents a GitHub Project. type Project struct { ID *int64 `json:"id,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` ColumnsURL *string `json:"columns_url,omitempty"` OwnerURL *string `json:"owner_url,omitempty"` Name *string `json:"name,omitempty"` Body *string `json:"body,omitempty"` Number *int `json:"number,omitempty"` State *string `json:"state,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` NodeID *string `json:"node_id,omitempty"` // The User object that generated the project. Creator *User `json:"creator,omitempty"` } func (p Project) String() string { return Stringify(p) } // GetProject gets a GitHub Project for a repo. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#get-a-project func (s *ProjectsService) GetProject(ctx context.Context, id int64) (*Project, *Response, error) { u := fmt.Sprintf("projects/%v", id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeProjectsPreview) project := &Project{} resp, err := s.client.Do(ctx, req, project) if err != nil { return nil, resp, err } return project, resp, nil } // ProjectOptions specifies the parameters to the // RepositoriesService.CreateProject and // ProjectsService.UpdateProject methods. type ProjectOptions struct { // The name of the project. (Required for creation; optional for update.) Name *string `json:"name,omitempty"` // The body of the project. (Optional.) Body *string `json:"body,omitempty"` // The following field(s) are only applicable for update. // They should be left with zero values for creation. // State of the project. Either "open" or "closed". (Optional.) State *string `json:"state,omitempty"` // The permission level that all members of the project's organization // will have on this project. // Setting the organization permission is only available // for organization projects. (Optional.) OrganizationPermission *string `json:"organization_permission,omitempty"` // Sets visibility of the project within the organization. // Setting visibility is only available // for organization projects.(Optional.) Public *bool `json:"public,omitempty"` } // UpdateProject updates a repository project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#update-a-project func (s *ProjectsService) UpdateProject(ctx context.Context, id int64, opts *ProjectOptions) (*Project, *Response, error) { u := fmt.Sprintf("projects/%v", id) req, err := s.client.NewRequest("PATCH", u, opts) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeProjectsPreview) project := &Project{} resp, err := s.client.Do(ctx, req, project) if err != nil { return nil, resp, err } return project, resp, nil } // DeleteProject deletes a GitHub Project from a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#delete-a-project func (s *ProjectsService) DeleteProject(ctx context.Context, id int64) (*Response, error) { u := fmt.Sprintf("projects/%v", id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeProjectsPreview) return s.client.Do(ctx, req, nil) } // ProjectColumn represents a column of a GitHub Project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/projects/ type ProjectColumn struct { ID *int64 `json:"id,omitempty"` Name *string `json:"name,omitempty"` URL *string `json:"url,omitempty"` ProjectURL *string `json:"project_url,omitempty"` CardsURL *string `json:"cards_url,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` NodeID *string `json:"node_id,omitempty"` } // ListProjectColumns lists the columns of a GitHub Project for a repo. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#list-project-columns func (s *ProjectsService) ListProjectColumns(ctx context.Context, projectID int64, opts *ListOptions) ([]*ProjectColumn, *Response, error) { u := fmt.Sprintf("projects/%v/columns", projectID) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeProjectsPreview) columns := []*ProjectColumn{} resp, err := s.client.Do(ctx, req, &columns) if err != nil { return nil, resp, err } return columns, resp, nil } // GetProjectColumn gets a column of a GitHub Project for a repo. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#get-a-project-column func (s *ProjectsService) GetProjectColumn(ctx context.Context, id int64) (*ProjectColumn, *Response, error) { u := fmt.Sprintf("projects/columns/%v", id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeProjectsPreview) column := &ProjectColumn{} resp, err := s.client.Do(ctx, req, column) if err != nil { return nil, resp, err } return column, resp, nil } // ProjectColumnOptions specifies the parameters to the // ProjectsService.CreateProjectColumn and // ProjectsService.UpdateProjectColumn methods. type ProjectColumnOptions struct { // The name of the project column. (Required for creation and update.) Name string `json:"name"` } // CreateProjectColumn creates a column for the specified (by number) project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#create-a-project-column func (s *ProjectsService) CreateProjectColumn(ctx context.Context, projectID int64, opts *ProjectColumnOptions) (*ProjectColumn, *Response, error) { u := fmt.Sprintf("projects/%v/columns", projectID) req, err := s.client.NewRequest("POST", u, opts) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeProjectsPreview) column := &ProjectColumn{} resp, err := s.client.Do(ctx, req, column) if err != nil { return nil, resp, err } return column, resp, nil } // UpdateProjectColumn updates a column of a GitHub Project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#update-an-existing-project-column func (s *ProjectsService) UpdateProjectColumn(ctx context.Context, columnID int64, opts *ProjectColumnOptions) (*ProjectColumn, *Response, error) { u := fmt.Sprintf("projects/columns/%v", columnID) req, err := s.client.NewRequest("PATCH", u, opts) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeProjectsPreview) column := &ProjectColumn{} resp, err := s.client.Do(ctx, req, column) if err != nil { return nil, resp, err } return column, resp, nil } // DeleteProjectColumn deletes a column from a GitHub Project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#delete-a-project-column func (s *ProjectsService) DeleteProjectColumn(ctx context.Context, columnID int64) (*Response, error) { u := fmt.Sprintf("projects/columns/%v", columnID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeProjectsPreview) return s.client.Do(ctx, req, nil) } // ProjectColumnMoveOptions specifies the parameters to the // ProjectsService.MoveProjectColumn method. type ProjectColumnMoveOptions struct { // Position can be one of "first", "last", or "after:", where // is the ID of a column in the same project. (Required.) Position string `json:"position"` } // MoveProjectColumn moves a column within a GitHub Project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#move-a-project-column func (s *ProjectsService) MoveProjectColumn(ctx context.Context, columnID int64, opts *ProjectColumnMoveOptions) (*Response, error) { u := fmt.Sprintf("projects/columns/%v/moves", columnID) req, err := s.client.NewRequest("POST", u, opts) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeProjectsPreview) return s.client.Do(ctx, req, nil) } // ProjectCard represents a card in a column of a GitHub Project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/cards/#get-a-project-card type ProjectCard struct { URL *string `json:"url,omitempty"` ColumnURL *string `json:"column_url,omitempty"` ContentURL *string `json:"content_url,omitempty"` ID *int64 `json:"id,omitempty"` Note *string `json:"note,omitempty"` Creator *User `json:"creator,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` NodeID *string `json:"node_id,omitempty"` Archived *bool `json:"archived,omitempty"` // The following fields are only populated by Webhook events. ColumnID *int64 `json:"column_id,omitempty"` // The following fields are only populated by Events API. ProjectID *int64 `json:"project_id,omitempty"` ProjectURL *string `json:"project_url,omitempty"` ColumnName *string `json:"column_name,omitempty"` PreviousColumnName *string `json:"previous_column_name,omitempty"` // Populated in "moved_columns_in_project" event deliveries. } // ProjectCardListOptions specifies the optional parameters to the // ProjectsService.ListProjectCards method. type ProjectCardListOptions struct { // ArchivedState is used to list all, archived, or not_archived project cards. // Defaults to not_archived when you omit this parameter. ArchivedState *string `url:"archived_state,omitempty"` ListOptions } // ListProjectCards lists the cards in a column of a GitHub Project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#list-project-cards func (s *ProjectsService) ListProjectCards(ctx context.Context, columnID int64, opts *ProjectCardListOptions) ([]*ProjectCard, *Response, error) { u := fmt.Sprintf("projects/columns/%v/cards", columnID) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeProjectsPreview) cards := []*ProjectCard{} resp, err := s.client.Do(ctx, req, &cards) if err != nil { return nil, resp, err } return cards, resp, nil } // GetProjectCard gets a card in a column of a GitHub Project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#get-a-project-card func (s *ProjectsService) GetProjectCard(ctx context.Context, cardID int64) (*ProjectCard, *Response, error) { u := fmt.Sprintf("projects/columns/cards/%v", cardID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeProjectsPreview) card := &ProjectCard{} resp, err := s.client.Do(ctx, req, card) if err != nil { return nil, resp, err } return card, resp, nil } // ProjectCardOptions specifies the parameters to the // ProjectsService.CreateProjectCard and // ProjectsService.UpdateProjectCard methods. type ProjectCardOptions struct { // The note of the card. Note and ContentID are mutually exclusive. Note string `json:"note,omitempty"` // The ID (not Number) of the Issue to associate with this card. // Note and ContentID are mutually exclusive. ContentID int64 `json:"content_id,omitempty"` // The type of content to associate with this card. Possible values are: "Issue" and "PullRequest". ContentType string `json:"content_type,omitempty"` // Use true to archive a project card. // Specify false if you need to restore a previously archived project card. Archived *bool `json:"archived,omitempty"` } // CreateProjectCard creates a card in the specified column of a GitHub Project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#create-a-project-card func (s *ProjectsService) CreateProjectCard(ctx context.Context, columnID int64, opts *ProjectCardOptions) (*ProjectCard, *Response, error) { u := fmt.Sprintf("projects/columns/%v/cards", columnID) req, err := s.client.NewRequest("POST", u, opts) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeProjectsPreview) card := &ProjectCard{} resp, err := s.client.Do(ctx, req, card) if err != nil { return nil, resp, err } return card, resp, nil } // UpdateProjectCard updates a card of a GitHub Project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#update-an-existing-project-card func (s *ProjectsService) UpdateProjectCard(ctx context.Context, cardID int64, opts *ProjectCardOptions) (*ProjectCard, *Response, error) { u := fmt.Sprintf("projects/columns/cards/%v", cardID) req, err := s.client.NewRequest("PATCH", u, opts) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeProjectsPreview) card := &ProjectCard{} resp, err := s.client.Do(ctx, req, card) if err != nil { return nil, resp, err } return card, resp, nil } // DeleteProjectCard deletes a card from a GitHub Project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#delete-a-project-card func (s *ProjectsService) DeleteProjectCard(ctx context.Context, cardID int64) (*Response, error) { u := fmt.Sprintf("projects/columns/cards/%v", cardID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeProjectsPreview) return s.client.Do(ctx, req, nil) } // ProjectCardMoveOptions specifies the parameters to the // ProjectsService.MoveProjectCard method. type ProjectCardMoveOptions struct { // Position can be one of "top", "bottom", or "after:", where // is the ID of a card in the same project. Position string `json:"position"` // ColumnID is the ID of a column in the same project. Note that ColumnID // is required when using Position "after:" when that card is in // another column; otherwise it is optional. ColumnID int64 `json:"column_id,omitempty"` } // MoveProjectCard moves a card within a GitHub Project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#move-a-project-card func (s *ProjectsService) MoveProjectCard(ctx context.Context, cardID int64, opts *ProjectCardMoveOptions) (*Response, error) { u := fmt.Sprintf("projects/columns/cards/%v/moves", cardID) req, err := s.client.NewRequest("POST", u, opts) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeProjectsPreview) return s.client.Do(ctx, req, nil) } // ProjectCollaboratorOptions specifies the optional parameters to the // ProjectsService.AddProjectCollaborator method. type ProjectCollaboratorOptions struct { // Permission specifies the permission to grant to the collaborator. // Possible values are: // "read" - can read, but not write to or administer this project. // "write" - can read and write, but not administer this project. // "admin" - can read, write and administer this project. // // Default value is "write" Permission *string `json:"permission,omitempty"` } // AddProjectCollaborator adds a collaborator to an organization project and sets // their permission level. You must be an organization owner or a project admin to add a collaborator. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#add-project-collaborator func (s *ProjectsService) AddProjectCollaborator(ctx context.Context, id int64, username string, opts *ProjectCollaboratorOptions) (*Response, error) { u := fmt.Sprintf("projects/%v/collaborators/%v", id, username) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeProjectsPreview) return s.client.Do(ctx, req, nil) } // RemoveProjectCollaborator removes a collaborator from an organization project. // You must be an organization owner or a project admin to remove a collaborator. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#remove-user-as-a-collaborator func (s *ProjectsService) RemoveProjectCollaborator(ctx context.Context, id int64, username string) (*Response, error) { u := fmt.Sprintf("projects/%v/collaborators/%v", id, username) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeProjectsPreview) return s.client.Do(ctx, req, nil) } // ListCollaboratorOptions specifies the optional parameters to the // ProjectsService.ListProjectCollaborators method. type ListCollaboratorOptions struct { // Affiliation specifies how collaborators should be filtered by their affiliation. // Possible values are: // "outside" - All outside collaborators of an organization-owned repository // "direct" - All collaborators with permissions to an organization-owned repository, // regardless of organization membership status // "all" - All collaborators the authenticated user can see // // Default value is "all". Affiliation *string `url:"affiliation,omitempty"` ListOptions } // ListProjectCollaborators lists the collaborators for an organization project. For a project, // the list of collaborators includes outside collaborators, organization members that are direct // collaborators, organization members with access through team memberships, organization members // with access through default organization permissions, and organization owners. You must be an // organization owner or a project admin to list collaborators. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#list-project-collaborators func (s *ProjectsService) ListProjectCollaborators(ctx context.Context, id int64, opts *ListCollaboratorOptions) ([]*User, *Response, error) { u := fmt.Sprintf("projects/%v/collaborators", id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeProjectsPreview) var users []*User resp, err := s.client.Do(ctx, req, &users) if err != nil { return nil, resp, err } return users, resp, nil } // ProjectPermissionLevel represents the permission level an organization // member has for a given project. type ProjectPermissionLevel struct { // Possible values: "admin", "write", "read", "none" Permission *string `json:"permission,omitempty"` User *User `json:"user,omitempty"` } // ReviewProjectCollaboratorPermission returns the collaborator's permission level for an organization // project. Possible values for the permission key: "admin", "write", "read", "none". // You must be an organization owner or a project admin to review a user's permission level. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#get-project-permission-for-a-user func (s *ProjectsService) ReviewProjectCollaboratorPermission(ctx context.Context, id int64, username string) (*ProjectPermissionLevel, *Response, error) { u := fmt.Sprintf("projects/%v/collaborators/%v/permission", id, username) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeProjectsPreview) ppl := new(ProjectPermissionLevel) resp, err := s.client.Do(ctx, req, ppl) if err != nil { return nil, resp, err } return ppl, resp, nil } go-github-38.1.0/github/projects_test.go000066400000000000000000000727371410475703100202130ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "encoding/json" "fmt" "net/http" "strings" "testing" "github.com/google/go-cmp/cmp" ) func TestProject_Marshal(t *testing.T) { testJSONMarshal(t, &Project{}, "{}") u := &Project{ ID: Int64(1), URL: String("u"), HTMLURL: String("h"), ColumnsURL: String("c"), OwnerURL: String("o"), Name: String("n"), Body: String("b"), Number: Int(1), State: String("s"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, NodeID: String("n"), Creator: &User{ Login: String("l"), ID: Int64(1), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, URL: String("u"), }, } want := `{ "id": 1, "url": "u", "html_url": "h", "columns_url": "c", "owner_url": "o", "name": "n", "body": "b", "number": 1, "state": "s", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "node_id": "n", "creator": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "url": "u" } }` testJSONMarshal(t, u, want) } func TestProjectsService_UpdateProject(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ProjectOptions{ Name: String("Project Name"), Body: String("Project body."), State: String("open"), Public: Bool(true), OrganizationPermission: String("read"), } mux.HandleFunc("/projects/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") testHeader(t, r, "Accept", mediaTypeProjectsPreview) v := &ProjectOptions{} json.NewDecoder(r.Body).Decode(v) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() project, _, err := client.Projects.UpdateProject(ctx, 1, input) if err != nil { t.Errorf("Projects.UpdateProject returned error: %v", err) } want := &Project{ID: Int64(1)} if !cmp.Equal(project, want) { t.Errorf("Projects.UpdateProject returned %+v, want %+v", project, want) } const methodName = "UpdateProject" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Projects.UpdateProject(ctx, -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Projects.UpdateProject(ctx, 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestProjectsService_GetProject(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/projects/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeProjectsPreview) fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() project, _, err := client.Projects.GetProject(ctx, 1) if err != nil { t.Errorf("Projects.GetProject returned error: %v", err) } want := &Project{ID: Int64(1)} if !cmp.Equal(project, want) { t.Errorf("Projects.GetProject returned %+v, want %+v", project, want) } const methodName = "GetProject" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Projects.GetProject(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Projects.GetProject(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestProjectsService_DeleteProject(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/projects/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeProjectsPreview) }) ctx := context.Background() _, err := client.Projects.DeleteProject(ctx, 1) if err != nil { t.Errorf("Projects.DeleteProject returned error: %v", err) } const methodName = "DeleteProject" testBadOptions(t, methodName, func() (err error) { _, err = client.Projects.DeleteProject(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Projects.DeleteProject(ctx, 1) }) } func TestProjectsService_ListProjectColumns(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeProjectsPreview} mux.HandleFunc("/projects/1/columns", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() columns, _, err := client.Projects.ListProjectColumns(ctx, 1, opt) if err != nil { t.Errorf("Projects.ListProjectColumns returned error: %v", err) } want := []*ProjectColumn{{ID: Int64(1)}} if !cmp.Equal(columns, want) { t.Errorf("Projects.ListProjectColumns returned %+v, want %+v", columns, want) } const methodName = "ListProjectColumns" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Projects.ListProjectColumns(ctx, -1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Projects.ListProjectColumns(ctx, 1, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestProjectsService_GetProjectColumn(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/projects/columns/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeProjectsPreview) fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() column, _, err := client.Projects.GetProjectColumn(ctx, 1) if err != nil { t.Errorf("Projects.GetProjectColumn returned error: %v", err) } want := &ProjectColumn{ID: Int64(1)} if !cmp.Equal(column, want) { t.Errorf("Projects.GetProjectColumn returned %+v, want %+v", column, want) } const methodName = "GetProjectColumn" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Projects.GetProjectColumn(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Projects.GetProjectColumn(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestProjectsService_CreateProjectColumn(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ProjectColumnOptions{Name: "Column Name"} mux.HandleFunc("/projects/1/columns", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeProjectsPreview) v := &ProjectColumnOptions{} json.NewDecoder(r.Body).Decode(v) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() column, _, err := client.Projects.CreateProjectColumn(ctx, 1, input) if err != nil { t.Errorf("Projects.CreateProjectColumn returned error: %v", err) } want := &ProjectColumn{ID: Int64(1)} if !cmp.Equal(column, want) { t.Errorf("Projects.CreateProjectColumn returned %+v, want %+v", column, want) } const methodName = "CreateProjectColumn" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Projects.CreateProjectColumn(ctx, -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Projects.CreateProjectColumn(ctx, 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestProjectsService_UpdateProjectColumn(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ProjectColumnOptions{Name: "Column Name"} mux.HandleFunc("/projects/columns/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") testHeader(t, r, "Accept", mediaTypeProjectsPreview) v := &ProjectColumnOptions{} json.NewDecoder(r.Body).Decode(v) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() column, _, err := client.Projects.UpdateProjectColumn(ctx, 1, input) if err != nil { t.Errorf("Projects.UpdateProjectColumn returned error: %v", err) } want := &ProjectColumn{ID: Int64(1)} if !cmp.Equal(column, want) { t.Errorf("Projects.UpdateProjectColumn returned %+v, want %+v", column, want) } const methodName = "UpdateProjectColumn" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Projects.UpdateProjectColumn(ctx, -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Projects.UpdateProjectColumn(ctx, 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestProjectsService_DeleteProjectColumn(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/projects/columns/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeProjectsPreview) }) ctx := context.Background() _, err := client.Projects.DeleteProjectColumn(ctx, 1) if err != nil { t.Errorf("Projects.DeleteProjectColumn returned error: %v", err) } const methodName = "DeleteProjectColumn" testBadOptions(t, methodName, func() (err error) { _, err = client.Projects.DeleteProjectColumn(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Projects.DeleteProjectColumn(ctx, 1) }) } func TestProjectsService_MoveProjectColumn(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ProjectColumnMoveOptions{Position: "after:12345"} mux.HandleFunc("/projects/columns/1/moves", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeProjectsPreview) v := &ProjectColumnMoveOptions{} json.NewDecoder(r.Body).Decode(v) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } }) ctx := context.Background() _, err := client.Projects.MoveProjectColumn(ctx, 1, input) if err != nil { t.Errorf("Projects.MoveProjectColumn returned error: %v", err) } const methodName = "MoveProjectColumn" testBadOptions(t, methodName, func() (err error) { _, err = client.Projects.MoveProjectColumn(ctx, -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Projects.MoveProjectColumn(ctx, 1, input) }) } func TestProjectsService_ListProjectCards(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/projects/columns/1/cards", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeProjectsPreview) testFormValues(t, r, values{ "archived_state": "all", "page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ProjectCardListOptions{ ArchivedState: String("all"), ListOptions: ListOptions{Page: 2}} ctx := context.Background() cards, _, err := client.Projects.ListProjectCards(ctx, 1, opt) if err != nil { t.Errorf("Projects.ListProjectCards returned error: %v", err) } want := []*ProjectCard{{ID: Int64(1)}} if !cmp.Equal(cards, want) { t.Errorf("Projects.ListProjectCards returned %+v, want %+v", cards, want) } const methodName = "ListProjectCards" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Projects.ListProjectCards(ctx, -1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Projects.ListProjectCards(ctx, 1, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestProjectsService_GetProjectCard(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/projects/columns/cards/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeProjectsPreview) fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() card, _, err := client.Projects.GetProjectCard(ctx, 1) if err != nil { t.Errorf("Projects.GetProjectCard returned error: %v", err) } want := &ProjectCard{ID: Int64(1)} if !cmp.Equal(card, want) { t.Errorf("Projects.GetProjectCard returned %+v, want %+v", card, want) } const methodName = "GetProjectCard" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Projects.GetProjectCard(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Projects.GetProjectCard(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestProjectsService_CreateProjectCard(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ProjectCardOptions{ ContentID: 12345, ContentType: "Issue", } mux.HandleFunc("/projects/columns/1/cards", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeProjectsPreview) v := &ProjectCardOptions{} json.NewDecoder(r.Body).Decode(v) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() card, _, err := client.Projects.CreateProjectCard(ctx, 1, input) if err != nil { t.Errorf("Projects.CreateProjectCard returned error: %v", err) } want := &ProjectCard{ID: Int64(1)} if !cmp.Equal(card, want) { t.Errorf("Projects.CreateProjectCard returned %+v, want %+v", card, want) } const methodName = "CreateProjectCard" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Projects.CreateProjectCard(ctx, -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Projects.CreateProjectCard(ctx, 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestProjectsService_UpdateProjectCard(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ProjectCardOptions{ ContentID: 12345, ContentType: "Issue", } mux.HandleFunc("/projects/columns/cards/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") testHeader(t, r, "Accept", mediaTypeProjectsPreview) v := &ProjectCardOptions{} json.NewDecoder(r.Body).Decode(v) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1, "archived":false}`) }) ctx := context.Background() card, _, err := client.Projects.UpdateProjectCard(ctx, 1, input) if err != nil { t.Errorf("Projects.UpdateProjectCard returned error: %v", err) } want := &ProjectCard{ID: Int64(1), Archived: Bool(false)} if !cmp.Equal(card, want) { t.Errorf("Projects.UpdateProjectCard returned %+v, want %+v", card, want) } const methodName = "UpdateProjectCard" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Projects.UpdateProjectCard(ctx, -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Projects.UpdateProjectCard(ctx, 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestProjectsService_DeleteProjectCard(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/projects/columns/cards/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeProjectsPreview) }) ctx := context.Background() _, err := client.Projects.DeleteProjectCard(ctx, 1) if err != nil { t.Errorf("Projects.DeleteProjectCard returned error: %v", err) } const methodName = "DeleteProjectCard" testBadOptions(t, methodName, func() (err error) { _, err = client.Projects.DeleteProjectCard(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Projects.DeleteProjectCard(ctx, 1) }) } func TestProjectsService_MoveProjectCard(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ProjectCardMoveOptions{Position: "after:12345"} mux.HandleFunc("/projects/columns/cards/1/moves", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeProjectsPreview) v := &ProjectCardMoveOptions{} json.NewDecoder(r.Body).Decode(v) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } }) ctx := context.Background() _, err := client.Projects.MoveProjectCard(ctx, 1, input) if err != nil { t.Errorf("Projects.MoveProjectCard returned error: %v", err) } const methodName = "MoveProjectCard" testBadOptions(t, methodName, func() (err error) { _, err = client.Projects.MoveProjectCard(ctx, -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Projects.MoveProjectCard(ctx, 1, input) }) } func TestProjectsService_AddProjectCollaborator(t *testing.T) { client, mux, _, teardown := setup() defer teardown() opt := &ProjectCollaboratorOptions{ Permission: String("admin"), } mux.HandleFunc("/projects/1/collaborators/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Accept", mediaTypeProjectsPreview) v := &ProjectCollaboratorOptions{} json.NewDecoder(r.Body).Decode(v) if !cmp.Equal(v, opt) { t.Errorf("Request body = %+v, want %+v", v, opt) } w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Projects.AddProjectCollaborator(ctx, 1, "u", opt) if err != nil { t.Errorf("Projects.AddProjectCollaborator returned error: %v", err) } const methodName = "AddProjectCollaborator" testBadOptions(t, methodName, func() (err error) { _, err = client.Projects.AddProjectCollaborator(ctx, -1, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Projects.AddProjectCollaborator(ctx, 1, "u", opt) }) } func TestProjectsService_AddCollaborator_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Projects.AddProjectCollaborator(ctx, 1, "%", nil) testURLParseError(t, err) } func TestProjectsService_RemoveCollaborator(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/projects/1/collaborators/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeProjectsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Projects.RemoveProjectCollaborator(ctx, 1, "u") if err != nil { t.Errorf("Projects.RemoveProjectCollaborator returned error: %v", err) } const methodName = "RemoveProjectCollaborator" testBadOptions(t, methodName, func() (err error) { _, err = client.Projects.RemoveProjectCollaborator(ctx, -1, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Projects.RemoveProjectCollaborator(ctx, 1, "u") }) } func TestProjectsService_RemoveCollaborator_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Projects.RemoveProjectCollaborator(ctx, 1, "%") testURLParseError(t, err) } func TestProjectsService_ListCollaborators(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/projects/1/collaborators", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeProjectsPreview) testFormValues(t, r, values{"page": "2"}) fmt.Fprintf(w, `[{"id":1}, {"id":2}]`) }) opt := &ListCollaboratorOptions{ ListOptions: ListOptions{Page: 2}, } ctx := context.Background() users, _, err := client.Projects.ListProjectCollaborators(ctx, 1, opt) if err != nil { t.Errorf("Projects.ListProjectCollaborators returned error: %v", err) } want := []*User{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(users, want) { t.Errorf("Projects.ListProjectCollaborators returned %+v, want %+v", users, want) } const methodName = "ListProjectCollaborators" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Projects.ListProjectCollaborators(ctx, -1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Projects.ListProjectCollaborators(ctx, 1, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestProjectsService_ListCollaborators_withAffiliation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/projects/1/collaborators", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeProjectsPreview) testFormValues(t, r, values{"affiliation": "all", "page": "2"}) fmt.Fprintf(w, `[{"id":1}, {"id":2}]`) }) opt := &ListCollaboratorOptions{ ListOptions: ListOptions{Page: 2}, Affiliation: String("all"), } ctx := context.Background() users, _, err := client.Projects.ListProjectCollaborators(ctx, 1, opt) if err != nil { t.Errorf("Projects.ListProjectCollaborators returned error: %v", err) } want := []*User{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(users, want) { t.Errorf("Projects.ListProjectCollaborators returned %+v, want %+v", users, want) } } func TestProjectsService_ReviewProjectCollaboratorPermission(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/projects/1/collaborators/u/permission", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeProjectsPreview) fmt.Fprintf(w, `{"permission":"admin","user":{"login":"u"}}`) }) ctx := context.Background() ppl, _, err := client.Projects.ReviewProjectCollaboratorPermission(ctx, 1, "u") if err != nil { t.Errorf("Projects.ReviewProjectCollaboratorPermission returned error: %v", err) } want := &ProjectPermissionLevel{ Permission: String("admin"), User: &User{ Login: String("u"), }, } if !cmp.Equal(ppl, want) { t.Errorf("Projects.ReviewProjectCollaboratorPermission returned %+v, want %+v", ppl, want) } const methodName = "ReviewProjectCollaboratorPermission" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Projects.ReviewProjectCollaboratorPermission(ctx, -1, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Projects.ReviewProjectCollaboratorPermission(ctx, 1, "u") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestProjectOptions_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectOptions{}, "{}") u := &ProjectOptions{ Name: String("name"), Body: String("body"), State: String("state"), OrganizationPermission: String("op"), Public: Bool(true), } want := `{ "name": "name", "body": "body", "state": "state", "organization_permission": "op", "public": true }` testJSONMarshal(t, u, want) } func TestProjectColumn_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectColumn{}, "{}") u := &ProjectColumn{ ID: Int64(1), Name: String("name"), URL: String("url"), ProjectURL: String("purl"), CardsURL: String("curl"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, NodeID: String("onidp"), } want := `{ "id": 1, "name": "name", "url": "url", "project_url": "purl", "cards_url": "curl", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "node_id": "onidp" }` testJSONMarshal(t, u, want) } func TestProjectColumnOptions_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectColumnOptions{}, "{}") u := &ProjectColumnOptions{ Name: "name", } want := `{ "name": "name" }` testJSONMarshal(t, u, want) } func TestProjectColumnMoveOptions_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectColumnMoveOptions{}, "{}") u := &ProjectColumnMoveOptions{ Position: "pos", } want := `{ "position": "pos" }` testJSONMarshal(t, u, want) } func TestProjectCard_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectCard{}, "{}") u := &ProjectCard{ URL: String("url"), ColumnURL: String("curl"), ContentURL: String("conurl"), ID: Int64(1), Note: String("note"), Creator: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, NodeID: String("nid"), Archived: Bool(true), ColumnID: Int64(1), ProjectID: Int64(1), ProjectURL: String("purl"), ColumnName: String("cn"), PreviousColumnName: String("pcn"), } want := `{ "url": "url", "column_url": "curl", "content_url": "conurl", "id": 1, "note": "note", "creator": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "node_id": "nid", "archived": true, "column_id": 1, "project_id": 1, "project_url": "purl", "column_name": "cn", "previous_column_name": "pcn" }` testJSONMarshal(t, u, want) } func TestProjectCardOptions_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectCardOptions{}, "{}") u := &ProjectCardOptions{ Note: "note", ContentID: 1, ContentType: "ct", Archived: Bool(false), } want := `{ "note": "note", "content_id": 1, "content_type": "ct", "archived": false }` testJSONMarshal(t, u, want) } func TestProjectCardMoveOptions_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectCardMoveOptions{}, "{}") u := &ProjectCardMoveOptions{ Position: "pos", ColumnID: 1, } want := `{ "position": "pos", "column_id": 1 }` testJSONMarshal(t, u, want) } func TestProjectCollaboratorOptions_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectCollaboratorOptions{}, "{}") u := &ProjectCollaboratorOptions{ Permission: String("per"), } want := `{ "permission": "per" }` testJSONMarshal(t, u, want) } func TestProjectPermissionLevel_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectPermissionLevel{}, "{}") u := &ProjectPermissionLevel{ Permission: String("per"), User: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "permission": "per", "user": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" } }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/pulls.go000066400000000000000000000437721410475703100164570ustar00rootroot00000000000000// Copyright 2013 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 ( "bytes" "context" "fmt" "time" ) // PullRequestsService handles communication with the pull request related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/ type PullRequestsService service // PullRequestAutoMerge represents the "auto_merge" response for a PullRequest. type PullRequestAutoMerge struct { EnabledBy *User `json:"enabled_by,omitempty"` MergeMethod *string `json:"merge_method,omitempty"` CommitTitle *string `json:"commit_title,omitempty"` CommitMessage *string `json:"commit_message,omitempty"` } // PullRequest represents a GitHub pull request on a repository. type PullRequest struct { ID *int64 `json:"id,omitempty"` Number *int `json:"number,omitempty"` State *string `json:"state,omitempty"` Locked *bool `json:"locked,omitempty"` Title *string `json:"title,omitempty"` Body *string `json:"body,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` UpdatedAt *time.Time `json:"updated_at,omitempty"` ClosedAt *time.Time `json:"closed_at,omitempty"` MergedAt *time.Time `json:"merged_at,omitempty"` Labels []*Label `json:"labels,omitempty"` User *User `json:"user,omitempty"` Draft *bool `json:"draft,omitempty"` Merged *bool `json:"merged,omitempty"` Mergeable *bool `json:"mergeable,omitempty"` MergeableState *string `json:"mergeable_state,omitempty"` MergedBy *User `json:"merged_by,omitempty"` MergeCommitSHA *string `json:"merge_commit_sha,omitempty"` Rebaseable *bool `json:"rebaseable,omitempty"` Comments *int `json:"comments,omitempty"` Commits *int `json:"commits,omitempty"` Additions *int `json:"additions,omitempty"` Deletions *int `json:"deletions,omitempty"` ChangedFiles *int `json:"changed_files,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` IssueURL *string `json:"issue_url,omitempty"` StatusesURL *string `json:"statuses_url,omitempty"` DiffURL *string `json:"diff_url,omitempty"` PatchURL *string `json:"patch_url,omitempty"` CommitsURL *string `json:"commits_url,omitempty"` CommentsURL *string `json:"comments_url,omitempty"` ReviewCommentsURL *string `json:"review_comments_url,omitempty"` ReviewCommentURL *string `json:"review_comment_url,omitempty"` ReviewComments *int `json:"review_comments,omitempty"` Assignee *User `json:"assignee,omitempty"` Assignees []*User `json:"assignees,omitempty"` Milestone *Milestone `json:"milestone,omitempty"` MaintainerCanModify *bool `json:"maintainer_can_modify,omitempty"` AuthorAssociation *string `json:"author_association,omitempty"` NodeID *string `json:"node_id,omitempty"` RequestedReviewers []*User `json:"requested_reviewers,omitempty"` AutoMerge *PullRequestAutoMerge `json:"auto_merge,omitempty"` // RequestedTeams is populated as part of the PullRequestEvent. // See, https://docs.github.com/en/developers/webhooks-and-events/github-event-types#pullrequestevent for an example. RequestedTeams []*Team `json:"requested_teams,omitempty"` Links *PRLinks `json:"_links,omitempty"` Head *PullRequestBranch `json:"head,omitempty"` Base *PullRequestBranch `json:"base,omitempty"` // ActiveLockReason is populated only when LockReason is provided while locking the pull request. // Possible values are: "off-topic", "too heated", "resolved", and "spam". ActiveLockReason *string `json:"active_lock_reason,omitempty"` } func (p PullRequest) String() string { return Stringify(p) } // PRLink represents a single link object from GitHub pull request _links. type PRLink struct { HRef *string `json:"href,omitempty"` } // PRLinks represents the "_links" object in a GitHub pull request. type PRLinks struct { Self *PRLink `json:"self,omitempty"` HTML *PRLink `json:"html,omitempty"` Issue *PRLink `json:"issue,omitempty"` Comments *PRLink `json:"comments,omitempty"` ReviewComments *PRLink `json:"review_comments,omitempty"` ReviewComment *PRLink `json:"review_comment,omitempty"` Commits *PRLink `json:"commits,omitempty"` Statuses *PRLink `json:"statuses,omitempty"` } // PullRequestBranch represents a base or head branch in a GitHub pull request. type PullRequestBranch struct { Label *string `json:"label,omitempty"` Ref *string `json:"ref,omitempty"` SHA *string `json:"sha,omitempty"` Repo *Repository `json:"repo,omitempty"` User *User `json:"user,omitempty"` } // PullRequestListOptions specifies the optional parameters to the // PullRequestsService.List method. type PullRequestListOptions struct { // State filters pull requests based on their state. Possible values are: // open, closed, all. Default is "open". State string `url:"state,omitempty"` // Head filters pull requests by head user and branch name in the format of: // "user:ref-name". Head string `url:"head,omitempty"` // Base filters pull requests by base branch name. Base string `url:"base,omitempty"` // Sort specifies how to sort pull requests. Possible values are: created, // updated, popularity, long-running. Default is "created". Sort string `url:"sort,omitempty"` // Direction in which to sort pull requests. Possible values are: asc, desc. // If Sort is "created" or not specified, Default is "desc", otherwise Default // is "asc" Direction string `url:"direction,omitempty"` ListOptions } // List the pull requests for the specified repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#list-pull-requests func (s *PullRequestsService) List(ctx context.Context, owner string, repo string, opts *PullRequestListOptions) ([]*PullRequest, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var pulls []*PullRequest resp, err := s.client.Do(ctx, req, &pulls) if err != nil { return nil, resp, err } return pulls, resp, nil } // ListPullRequestsWithCommit returns pull requests associated with a commit SHA. // // The results will include open and closed pull requests. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-pull-requests-associated-with-a-commit func (s *PullRequestsService) ListPullRequestsWithCommit(ctx context.Context, owner, repo, sha string, opts *PullRequestListOptions) ([]*PullRequest, *Response, error) { u := fmt.Sprintf("repos/%v/%v/commits/%v/pulls", owner, repo, sha) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeListPullsOrBranchesForCommitPreview) var pulls []*PullRequest resp, err := s.client.Do(ctx, req, &pulls) if err != nil { return nil, resp, err } return pulls, resp, nil } // Get a single pull request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#get-a-pull-request func (s *PullRequestsService) Get(ctx context.Context, owner string, repo string, number int) (*PullRequest, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d", owner, repo, number) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } pull := new(PullRequest) resp, err := s.client.Do(ctx, req, pull) if err != nil { return nil, resp, err } return pull, resp, nil } // GetRaw gets a single pull request in raw (diff or patch) format. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#get-a-pull-request func (s *PullRequestsService) GetRaw(ctx context.Context, owner string, repo string, number int, opts RawOptions) (string, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d", owner, repo, number) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return "", nil, err } switch opts.Type { case Diff: req.Header.Set("Accept", mediaTypeV3Diff) case Patch: req.Header.Set("Accept", mediaTypeV3Patch) default: return "", nil, fmt.Errorf("unsupported raw type %d", opts.Type) } var buf bytes.Buffer resp, err := s.client.Do(ctx, req, &buf) if err != nil { return "", resp, err } return buf.String(), resp, nil } // NewPullRequest represents a new pull request to be created. type NewPullRequest struct { Title *string `json:"title,omitempty"` Head *string `json:"head,omitempty"` Base *string `json:"base,omitempty"` Body *string `json:"body,omitempty"` Issue *int `json:"issue,omitempty"` MaintainerCanModify *bool `json:"maintainer_can_modify,omitempty"` Draft *bool `json:"draft,omitempty"` } // Create a new pull request on the specified repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#create-a-pull-request func (s *PullRequestsService) Create(ctx context.Context, owner string, repo string, pull *NewPullRequest) (*PullRequest, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls", owner, repo) req, err := s.client.NewRequest("POST", u, pull) if err != nil { return nil, nil, err } p := new(PullRequest) resp, err := s.client.Do(ctx, req, p) if err != nil { return nil, resp, err } return p, resp, nil } // PullRequestBranchUpdateOptions specifies the optional parameters to the // PullRequestsService.UpdateBranch method. type PullRequestBranchUpdateOptions struct { // ExpectedHeadSHA specifies the most recent commit on the pull request's branch. // Default value is the SHA of the pull request's current HEAD ref. ExpectedHeadSHA *string `json:"expected_head_sha,omitempty"` } // PullRequestBranchUpdateResponse specifies the response of pull request branch update. type PullRequestBranchUpdateResponse struct { Message *string `json:"message,omitempty"` URL *string `json:"url,omitempty"` } // UpdateBranch updates the pull request branch with latest upstream changes. // // This method might return an AcceptedError and a status code of // 202. This is because this is the status that GitHub returns to signify that // it has now scheduled the update of the pull request branch in a background task. // A follow up request, after a delay of a second or so, should result // in a successful request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#update-a-pull-request-branch func (s *PullRequestsService) UpdateBranch(ctx context.Context, owner, repo string, number int, opts *PullRequestBranchUpdateOptions) (*PullRequestBranchUpdateResponse, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d/update-branch", owner, repo, number) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeUpdatePullRequestBranchPreview) p := new(PullRequestBranchUpdateResponse) resp, err := s.client.Do(ctx, req, p) if err != nil { return nil, resp, err } return p, resp, nil } type pullRequestUpdate struct { Title *string `json:"title,omitempty"` Body *string `json:"body,omitempty"` State *string `json:"state,omitempty"` Base *string `json:"base,omitempty"` MaintainerCanModify *bool `json:"maintainer_can_modify,omitempty"` } // Edit a pull request. // pull must not be nil. // // The following fields are editable: Title, Body, State, Base.Ref and MaintainerCanModify. // Base.Ref updates the base branch of the pull request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#update-a-pull-request func (s *PullRequestsService) Edit(ctx context.Context, owner string, repo string, number int, pull *PullRequest) (*PullRequest, *Response, error) { if pull == nil { return nil, nil, fmt.Errorf("pull must be provided") } u := fmt.Sprintf("repos/%v/%v/pulls/%d", owner, repo, number) update := &pullRequestUpdate{ Title: pull.Title, Body: pull.Body, State: pull.State, MaintainerCanModify: pull.MaintainerCanModify, } // avoid updating the base branch when closing the Pull Request // - otherwise the GitHub API server returns a "Validation Failed" error: // "Cannot change base branch of closed pull request". if pull.Base != nil && pull.GetState() != "closed" { update.Base = pull.Base.Ref } req, err := s.client.NewRequest("PATCH", u, update) if err != nil { return nil, nil, err } p := new(PullRequest) resp, err := s.client.Do(ctx, req, p) if err != nil { return nil, resp, err } return p, resp, nil } // ListCommits lists the commits in a pull request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#list-commits-on-a-pull-request func (s *PullRequestsService) ListCommits(ctx context.Context, owner string, repo string, number int, opts *ListOptions) ([]*RepositoryCommit, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d/commits", owner, repo, number) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var commits []*RepositoryCommit resp, err := s.client.Do(ctx, req, &commits) if err != nil { return nil, resp, err } return commits, resp, nil } // ListFiles lists the files in a pull request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#list-pull-requests-files func (s *PullRequestsService) ListFiles(ctx context.Context, owner string, repo string, number int, opts *ListOptions) ([]*CommitFile, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d/files", owner, repo, number) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var commitFiles []*CommitFile resp, err := s.client.Do(ctx, req, &commitFiles) if err != nil { return nil, resp, err } return commitFiles, resp, nil } // IsMerged checks if a pull request has been merged. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#check-if-a-pull-request-has-been-merged func (s *PullRequestsService) IsMerged(ctx context.Context, owner string, repo string, number int) (bool, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d/merge", owner, repo, number) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return false, nil, err } resp, err := s.client.Do(ctx, req, nil) merged, err := parseBoolResponse(err) return merged, resp, err } // PullRequestMergeResult represents the result of merging a pull request. type PullRequestMergeResult struct { SHA *string `json:"sha,omitempty"` Merged *bool `json:"merged,omitempty"` Message *string `json:"message,omitempty"` } // PullRequestOptions lets you define how a pull request will be merged. type PullRequestOptions struct { CommitTitle string // Title for the automatic commit message. (Optional.) SHA string // SHA that pull request head must match to allow merge. (Optional.) // The merge method to use. Possible values include: "merge", "squash", and "rebase" with the default being merge. (Optional.) MergeMethod string // If false, an empty string commit message will use the default commit message. If true, an empty string commit message will be used. DontDefaultIfBlank bool } type pullRequestMergeRequest struct { CommitMessage *string `json:"commit_message,omitempty"` CommitTitle string `json:"commit_title,omitempty"` MergeMethod string `json:"merge_method,omitempty"` SHA string `json:"sha,omitempty"` } // Merge a pull request. // commitMessage is an extra detail to append to automatic commit message. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#merge-a-pull-request func (s *PullRequestsService) Merge(ctx context.Context, owner string, repo string, number int, commitMessage string, options *PullRequestOptions) (*PullRequestMergeResult, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d/merge", owner, repo, number) pullRequestBody := &pullRequestMergeRequest{} if commitMessage != "" { pullRequestBody.CommitMessage = &commitMessage } if options != nil { pullRequestBody.CommitTitle = options.CommitTitle pullRequestBody.MergeMethod = options.MergeMethod pullRequestBody.SHA = options.SHA if options.DontDefaultIfBlank && commitMessage == "" { pullRequestBody.CommitMessage = &commitMessage } } req, err := s.client.NewRequest("PUT", u, pullRequestBody) if err != nil { return nil, nil, err } mergeResult := new(PullRequestMergeResult) resp, err := s.client.Do(ctx, req, mergeResult) if err != nil { return nil, resp, err } return mergeResult, resp, nil } go-github-38.1.0/github/pulls_comments.go000066400000000000000000000173551410475703100203620ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "strings" "time" ) // PullRequestComment represents a comment left on a pull request. type PullRequestComment struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` InReplyTo *int64 `json:"in_reply_to_id,omitempty"` Body *string `json:"body,omitempty"` Path *string `json:"path,omitempty"` DiffHunk *string `json:"diff_hunk,omitempty"` PullRequestReviewID *int64 `json:"pull_request_review_id,omitempty"` Position *int `json:"position,omitempty"` OriginalPosition *int `json:"original_position,omitempty"` StartLine *int `json:"start_line,omitempty"` Line *int `json:"line,omitempty"` OriginalLine *int `json:"original_line,omitempty"` OriginalStartLine *int `json:"original_start_line,omitempty"` Side *string `json:"side,omitempty"` StartSide *string `json:"start_side,omitempty"` CommitID *string `json:"commit_id,omitempty"` OriginalCommitID *string `json:"original_commit_id,omitempty"` User *User `json:"user,omitempty"` Reactions *Reactions `json:"reactions,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` UpdatedAt *time.Time `json:"updated_at,omitempty"` // AuthorAssociation is the comment author's relationship to the pull request's repository. // Possible values are "COLLABORATOR", "CONTRIBUTOR", "FIRST_TIMER", "FIRST_TIME_CONTRIBUTOR", "MEMBER", "OWNER", or "NONE". AuthorAssociation *string `json:"author_association,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` PullRequestURL *string `json:"pull_request_url,omitempty"` } func (p PullRequestComment) String() string { return Stringify(p) } // PullRequestListCommentsOptions specifies the optional parameters to the // PullRequestsService.ListComments method. type PullRequestListCommentsOptions struct { // Sort specifies how to sort comments. Possible values are: created, updated. Sort string `url:"sort,omitempty"` // Direction in which to sort comments. Possible values are: asc, desc. Direction string `url:"direction,omitempty"` // Since filters comments by time. Since time.Time `url:"since,omitempty"` ListOptions } // ListComments lists all comments on the specified pull request. Specifying a // pull request number of 0 will return all comments on all pull requests for // the repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#list-review-comments-on-a-pull-request // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#list-review-comments-in-a-repository func (s *PullRequestsService) ListComments(ctx context.Context, owner, repo string, number int, opts *PullRequestListCommentsOptions) ([]*PullRequestComment, *Response, error) { var u string if number == 0 { u = fmt.Sprintf("repos/%v/%v/pulls/comments", owner, repo) } else { u = fmt.Sprintf("repos/%v/%v/pulls/%d/comments", owner, repo, number) } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. acceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeMultiLineCommentsPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) var comments []*PullRequestComment resp, err := s.client.Do(ctx, req, &comments) if err != nil { return nil, resp, err } return comments, resp, nil } // GetComment fetches the specified pull request comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#get-a-review-comment-for-a-pull-request func (s *PullRequestsService) GetComment(ctx context.Context, owner, repo string, commentID int64) (*PullRequestComment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/comments/%d", owner, repo, commentID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. acceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeMultiLineCommentsPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) comment := new(PullRequestComment) resp, err := s.client.Do(ctx, req, comment) if err != nil { return nil, resp, err } return comment, resp, nil } // CreateComment creates a new comment on the specified pull request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#create-a-review-comment-for-a-pull-request func (s *PullRequestsService) CreateComment(ctx context.Context, owner, repo string, number int, comment *PullRequestComment) (*PullRequestComment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d/comments", owner, repo, number) req, err := s.client.NewRequest("POST", u, comment) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when their respective API fully launches. acceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeMultiLineCommentsPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) c := new(PullRequestComment) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } // CreateCommentInReplyTo creates a new comment as a reply to an existing pull request comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#create-a-review-comment-for-a-pull-request func (s *PullRequestsService) CreateCommentInReplyTo(ctx context.Context, owner, repo string, number int, body string, commentID int64) (*PullRequestComment, *Response, error) { comment := &struct { Body string `json:"body,omitempty"` InReplyTo int64 `json:"in_reply_to,omitempty"` }{ Body: body, InReplyTo: commentID, } u := fmt.Sprintf("repos/%v/%v/pulls/%d/comments", owner, repo, number) req, err := s.client.NewRequest("POST", u, comment) if err != nil { return nil, nil, err } c := new(PullRequestComment) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } // EditComment updates a pull request comment. // A non-nil comment.Body must be provided. Other comment fields should be left nil. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#update-a-review-comment-for-a-pull-request func (s *PullRequestsService) EditComment(ctx context.Context, owner, repo string, commentID int64, comment *PullRequestComment) (*PullRequestComment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/comments/%d", owner, repo, commentID) req, err := s.client.NewRequest("PATCH", u, comment) if err != nil { return nil, nil, err } c := new(PullRequestComment) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } // DeleteComment deletes a pull request comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#delete-a-review-comment-for-a-pull-request func (s *PullRequestsService) DeleteComment(ctx context.Context, owner, repo string, commentID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/comments/%d", owner, repo, commentID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/pulls_comments_test.go000066400000000000000000000314601410475703100214120ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "strings" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestPullComments_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestComment{}, "{}") createdAt := time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC) updatedAt := time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC) reactions := &Reactions{ TotalCount: Int(1), PlusOne: Int(1), MinusOne: Int(0), Laugh: Int(0), Confused: Int(0), Heart: Int(0), Hooray: Int(0), Rocket: Int(0), Eyes: Int(0), URL: String("u"), } u := &PullRequestComment{ ID: Int64(10), InReplyTo: Int64(8), Body: String("Test comment"), Path: String("file1.txt"), DiffHunk: String("@@ -16,33 +16,40 @@ fmt.Println()"), PullRequestReviewID: Int64(42), Position: Int(1), OriginalPosition: Int(4), StartLine: Int(2), Line: Int(3), OriginalLine: Int(2), OriginalStartLine: Int(2), Side: String("RIGHT"), StartSide: String("LEFT"), CommitID: String("ab"), OriginalCommitID: String("9c"), User: &User{ Login: String("ll"), ID: Int64(123), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, URL: String("u"), }, Reactions: reactions, CreatedAt: &createdAt, UpdatedAt: &updatedAt, URL: String("pullrequestcommentUrl"), HTMLURL: String("pullrequestcommentHTMLUrl"), PullRequestURL: String("pullrequestcommentPullRequestURL"), } want := `{ "id": 10, "in_reply_to_id": 8, "body": "Test comment", "path": "file1.txt", "diff_hunk": "@@ -16,33 +16,40 @@ fmt.Println()", "pull_request_review_id": 42, "position": 1, "original_position": 4, "start_line": 2, "line": 3, "original_line": 2, "original_start_line": 2, "side": "RIGHT", "start_side": "LEFT", "commit_id": "ab", "original_commit_id": "9c", "user": { "login": "ll", "id": 123, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "url": "u" }, "reactions": { "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "confused": 0, "heart": 0, "hooray": 0, "rocket": 0, "eyes": 0, "url": "u" }, "created_at": "2002-02-10T15:30:00Z", "updated_at": "2002-02-10T15:30:00Z", "url": "pullrequestcommentUrl", "html_url": "pullrequestcommentHTMLUrl", "pull_request_url": "pullrequestcommentPullRequestURL" }` testJSONMarshal(t, u, want) } func TestPullRequestsService_ListComments_allPulls(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeMultiLineCommentsPreview} mux.HandleFunc("/repos/o/r/pulls/comments", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) testFormValues(t, r, values{ "sort": "updated", "direction": "desc", "since": "2002-02-10T15:30:00Z", "page": "2", }) fmt.Fprint(w, `[{"id":1}]`) }) opt := &PullRequestListCommentsOptions{ Sort: "updated", Direction: "desc", Since: time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC), ListOptions: ListOptions{Page: 2}, } ctx := context.Background() pulls, _, err := client.PullRequests.ListComments(ctx, "o", "r", 0, opt) if err != nil { t.Errorf("PullRequests.ListComments returned error: %v", err) } want := []*PullRequestComment{{ID: Int64(1)}} if !cmp.Equal(pulls, want) { t.Errorf("PullRequests.ListComments returned %+v, want %+v", pulls, want) } const methodName = "ListComments" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.ListComments(ctx, "\n", "\n", -1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.ListComments(ctx, "o", "r", 0, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_ListComments_specificPull(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeMultiLineCommentsPreview} mux.HandleFunc("/repos/o/r/pulls/1/comments", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) fmt.Fprint(w, `[{"id":1, "pull_request_review_id":42}]`) }) ctx := context.Background() pulls, _, err := client.PullRequests.ListComments(ctx, "o", "r", 1, nil) if err != nil { t.Errorf("PullRequests.ListComments returned error: %v", err) } want := []*PullRequestComment{{ID: Int64(1), PullRequestReviewID: Int64(42)}} if !cmp.Equal(pulls, want) { t.Errorf("PullRequests.ListComments returned %+v, want %+v", pulls, want) } } func TestPullRequestsService_ListComments_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.ListComments(ctx, "%", "r", 1, nil) testURLParseError(t, err) } func TestPullRequestsService_GetComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeMultiLineCommentsPreview} mux.HandleFunc("/repos/o/r/pulls/comments/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() comment, _, err := client.PullRequests.GetComment(ctx, "o", "r", 1) if err != nil { t.Errorf("PullRequests.GetComment returned error: %v", err) } want := &PullRequestComment{ID: Int64(1)} if !cmp.Equal(comment, want) { t.Errorf("PullRequests.GetComment returned %+v, want %+v", comment, want) } const methodName = "GetComment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.GetComment(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.GetComment(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_GetComment_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.GetComment(ctx, "%", "r", 1) testURLParseError(t, err) } func TestPullRequestsService_CreateComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &PullRequestComment{Body: String("b")} wantAcceptHeaders := []string{mediaTypeReactionsPreview, mediaTypeMultiLineCommentsPreview} mux.HandleFunc("/repos/o/r/pulls/1/comments", func(w http.ResponseWriter, r *http.Request) { v := new(PullRequestComment) json.NewDecoder(r.Body).Decode(v) // TODO: remove custom Accept header assertion when the API fully launches. testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() comment, _, err := client.PullRequests.CreateComment(ctx, "o", "r", 1, input) if err != nil { t.Errorf("PullRequests.CreateComment returned error: %v", err) } want := &PullRequestComment{ID: Int64(1)} if !cmp.Equal(comment, want) { t.Errorf("PullRequests.CreateComment returned %+v, want %+v", comment, want) } const methodName = "CreateComment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.CreateComment(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.CreateComment(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_CreateComment_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.CreateComment(ctx, "%", "r", 1, nil) testURLParseError(t, err) } func TestPullRequestsService_CreateCommentInReplyTo(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &PullRequestComment{Body: String("b")} mux.HandleFunc("/repos/o/r/pulls/1/comments", func(w http.ResponseWriter, r *http.Request) { v := new(PullRequestComment) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() comment, _, err := client.PullRequests.CreateCommentInReplyTo(ctx, "o", "r", 1, "b", 2) if err != nil { t.Errorf("PullRequests.CreateCommentInReplyTo returned error: %v", err) } want := &PullRequestComment{ID: Int64(1)} if !cmp.Equal(comment, want) { t.Errorf("PullRequests.CreateCommentInReplyTo returned %+v, want %+v", comment, want) } const methodName = "CreateCommentInReplyTo" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.CreateCommentInReplyTo(ctx, "\n", "\n", -1, "\n", -2) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.CreateCommentInReplyTo(ctx, "o", "r", 1, "b", 2) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_EditComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &PullRequestComment{Body: String("b")} mux.HandleFunc("/repos/o/r/pulls/comments/1", func(w http.ResponseWriter, r *http.Request) { v := new(PullRequestComment) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() comment, _, err := client.PullRequests.EditComment(ctx, "o", "r", 1, input) if err != nil { t.Errorf("PullRequests.EditComment returned error: %v", err) } want := &PullRequestComment{ID: Int64(1)} if !cmp.Equal(comment, want) { t.Errorf("PullRequests.EditComment returned %+v, want %+v", comment, want) } const methodName = "EditComment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.EditComment(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.EditComment(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_EditComment_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.EditComment(ctx, "%", "r", 1, nil) testURLParseError(t, err) } func TestPullRequestsService_DeleteComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/comments/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.PullRequests.DeleteComment(ctx, "o", "r", 1) if err != nil { t.Errorf("PullRequests.DeleteComment returned error: %v", err) } const methodName = "DeleteComment" testBadOptions(t, methodName, func() (err error) { _, err = client.PullRequests.DeleteComment(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.PullRequests.DeleteComment(ctx, "o", "r", 1) }) } func TestPullRequestsService_DeleteComment_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.PullRequests.DeleteComment(ctx, "%", "r", 1) testURLParseError(t, err) } go-github-38.1.0/github/pulls_reviewers.go000066400000000000000000000053111410475703100205350ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "fmt" ) // ReviewersRequest specifies users and teams for a pull request review request. type ReviewersRequest struct { NodeID *string `json:"node_id,omitempty"` Reviewers []string `json:"reviewers,omitempty"` TeamReviewers []string `json:"team_reviewers,omitempty"` } // Reviewers represents reviewers of a pull request. type Reviewers struct { Users []*User `json:"users,omitempty"` Teams []*Team `json:"teams,omitempty"` } // RequestReviewers creates a review request for the provided reviewers for the specified pull request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#request-reviewers-for-a-pull-request func (s *PullRequestsService) RequestReviewers(ctx context.Context, owner, repo string, number int, reviewers ReviewersRequest) (*PullRequest, *Response, error) { u := fmt.Sprintf("repos/%s/%s/pulls/%d/requested_reviewers", owner, repo, number) req, err := s.client.NewRequest("POST", u, &reviewers) if err != nil { return nil, nil, err } r := new(PullRequest) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // ListReviewers lists reviewers whose reviews have been requested on the specified pull request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#list-requested-reviewers-for-a-pull-request func (s *PullRequestsService) ListReviewers(ctx context.Context, owner, repo string, number int, opts *ListOptions) (*Reviewers, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d/requested_reviewers", owner, repo, number) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } reviewers := new(Reviewers) resp, err := s.client.Do(ctx, req, reviewers) if err != nil { return nil, resp, err } return reviewers, resp, nil } // RemoveReviewers removes the review request for the provided reviewers for the specified pull request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#remove-requested-reviewers-from-a-pull-request func (s *PullRequestsService) RemoveReviewers(ctx context.Context, owner, repo string, number int, reviewers ReviewersRequest) (*Response, error) { u := fmt.Sprintf("repos/%s/%s/pulls/%d/requested_reviewers", owner, repo, number) req, err := s.client.NewRequest("DELETE", u, &reviewers) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/pulls_reviewers_test.go000066400000000000000000000152331410475703100216000ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestReviewersRequest_Marshal(t *testing.T) { testJSONMarshal(t, &ReviewersRequest{}, "{}") u := &ReviewersRequest{ NodeID: String("n"), Reviewers: []string{"r"}, TeamReviewers: []string{"t"}, } want := `{ "node_id": "n", "reviewers": [ "r" ], "team_reviewers" : [ "t" ] }` testJSONMarshal(t, u, want) } func TestReviewers_Marshal(t *testing.T) { testJSONMarshal(t, &Reviewers{}, "{}") u := &Reviewers{ Users: []*User{{ Login: String("l"), ID: Int64(1), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, URL: String("u"), }}, Teams: []*Team{{ ID: Int64(1), NodeID: String("node"), Name: String("n"), Description: String("d"), URL: String("u"), Slug: String("s"), Permission: String("p"), Privacy: String("priv"), MembersCount: Int(1), ReposCount: Int(1), Organization: nil, MembersURL: String("m"), RepositoriesURL: String("r"), Parent: nil, LDAPDN: String("l"), }}, } want := `{ "users" : [ { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "url": "u" } ], "teams" : [ { "id": 1, "node_id": "node", "name": "n", "description": "d", "url": "u", "slug": "s", "permission": "p", "privacy": "priv", "members_count": 1, "repos_count": 1, "members_url": "m", "repositories_url": "r", "ldap_dn": "l" } ] }` testJSONMarshal(t, u, want) } func TestRequestReviewers(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1/requested_reviewers", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testBody(t, r, `{"reviewers":["octocat","googlebot"],"team_reviewers":["justice-league","injustice-league"]}`+"\n") fmt.Fprint(w, `{"number":1}`) }) // This returns a PR, unmarshalling of which is tested elsewhere ctx := context.Background() got, _, err := client.PullRequests.RequestReviewers(ctx, "o", "r", 1, ReviewersRequest{Reviewers: []string{"octocat", "googlebot"}, TeamReviewers: []string{"justice-league", "injustice-league"}}) if err != nil { t.Errorf("PullRequests.RequestReviewers returned error: %v", err) } want := &PullRequest{Number: Int(1)} if !cmp.Equal(got, want) { t.Errorf("PullRequests.RequestReviewers returned %+v, want %+v", got, want) } const methodName = "RequestReviewers" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.RequestReviewers(ctx, "o", "r", 1, ReviewersRequest{Reviewers: []string{"octocat", "googlebot"}, TeamReviewers: []string{"justice-league", "injustice-league"}}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRemoveReviewers(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1/requested_reviewers", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testBody(t, r, `{"reviewers":["octocat","googlebot"],"team_reviewers":["justice-league"]}`+"\n") }) ctx := context.Background() _, err := client.PullRequests.RemoveReviewers(ctx, "o", "r", 1, ReviewersRequest{Reviewers: []string{"octocat", "googlebot"}, TeamReviewers: []string{"justice-league"}}) if err != nil { t.Errorf("PullRequests.RemoveReviewers returned error: %v", err) } const methodName = "RemoveReviewers" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.PullRequests.RemoveReviewers(ctx, "o", "r", 1, ReviewersRequest{Reviewers: []string{"octocat", "googlebot"}, TeamReviewers: []string{"justice-league"}}) }) } func TestListReviewers(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1/requested_reviewers", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"users":[{"login":"octocat","id":1}],"teams":[{"id":1,"name":"Justice League"}]}`) }) ctx := context.Background() got, _, err := client.PullRequests.ListReviewers(ctx, "o", "r", 1, nil) if err != nil { t.Errorf("PullRequests.ListReviewers returned error: %v", err) } want := &Reviewers{ Users: []*User{ { Login: String("octocat"), ID: Int64(1), }, }, Teams: []*Team{ { ID: Int64(1), Name: String("Justice League"), }, }, } if !cmp.Equal(got, want) { t.Errorf("PullRequests.ListReviewers returned %+v, want %+v", got, want) } const methodName = "ListReviewers" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.ListReviewers(ctx, "o", "r", 1, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestListReviewers_withOptions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1/requested_reviewers", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `{}`) }) ctx := context.Background() _, _, err := client.PullRequests.ListReviewers(ctx, "o", "r", 1, &ListOptions{Page: 2}) if err != nil { t.Errorf("PullRequests.ListReviewers returned error: %v", err) } const methodName = "ListReviewers" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.ListReviewers(ctx, "\n", "\n", 1, &ListOptions{Page: 2}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.ListReviewers(ctx, "o", "r", 1, &ListOptions{Page: 2}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-38.1.0/github/pulls_reviews.go000066400000000000000000000270721410475703100202160ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "errors" "fmt" "time" ) var ErrMixedCommentStyles = errors.New("cannot use both position and side/line form comments") // PullRequestReview represents a review of a pull request. type PullRequestReview struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` User *User `json:"user,omitempty"` Body *string `json:"body,omitempty"` SubmittedAt *time.Time `json:"submitted_at,omitempty"` CommitID *string `json:"commit_id,omitempty"` HTMLURL *string `json:"html_url,omitempty"` PullRequestURL *string `json:"pull_request_url,omitempty"` State *string `json:"state,omitempty"` // AuthorAssociation is the comment author's relationship to the issue's repository. // Possible values are "COLLABORATOR", "CONTRIBUTOR", "FIRST_TIMER", "FIRST_TIME_CONTRIBUTOR", "MEMBER", "OWNER", or "NONE". AuthorAssociation *string `json:"author_association,omitempty"` } func (p PullRequestReview) String() string { return Stringify(p) } // DraftReviewComment represents a comment part of the review. type DraftReviewComment struct { Path *string `json:"path,omitempty"` Position *int `json:"position,omitempty"` Body *string `json:"body,omitempty"` // The new comfort-fade-preview fields StartSide *string `json:"start_side,omitempty"` Side *string `json:"side,omitempty"` StartLine *int `json:"start_line,omitempty"` Line *int `json:"line,omitempty"` } func (c DraftReviewComment) String() string { return Stringify(c) } // PullRequestReviewRequest represents a request to create a review. type PullRequestReviewRequest struct { NodeID *string `json:"node_id,omitempty"` CommitID *string `json:"commit_id,omitempty"` Body *string `json:"body,omitempty"` Event *string `json:"event,omitempty"` Comments []*DraftReviewComment `json:"comments,omitempty"` } func (r PullRequestReviewRequest) String() string { return Stringify(r) } func (r *PullRequestReviewRequest) isComfortFadePreview() (bool, error) { var isCF *bool for _, comment := range r.Comments { if comment == nil { continue } hasPos := comment.Position != nil hasComfortFade := (comment.StartSide != nil) || (comment.Side != nil) || (comment.StartLine != nil) || (comment.Line != nil) switch { case hasPos && hasComfortFade: return false, ErrMixedCommentStyles case hasPos && isCF != nil && *isCF: return false, ErrMixedCommentStyles case hasComfortFade && isCF != nil && !*isCF: return false, ErrMixedCommentStyles } isCF = &hasComfortFade } if isCF != nil { return *isCF, nil } return false, nil } // PullRequestReviewDismissalRequest represents a request to dismiss a review. type PullRequestReviewDismissalRequest struct { Message *string `json:"message,omitempty"` } func (r PullRequestReviewDismissalRequest) String() string { return Stringify(r) } // ListReviews lists all reviews on the specified pull request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#list-reviews-for-a-pull-request func (s *PullRequestsService) ListReviews(ctx context.Context, owner, repo string, number int, opts *ListOptions) ([]*PullRequestReview, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews", owner, repo, number) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var reviews []*PullRequestReview resp, err := s.client.Do(ctx, req, &reviews) if err != nil { return nil, resp, err } return reviews, resp, nil } // GetReview fetches the specified pull request review. // // TODO: Follow up with GitHub support about an issue with this method's // returned error format and remove this comment once it's fixed. // Read more about it here - https://github.com/google/go-github/issues/540 // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#get-a-review-for-a-pull-request func (s *PullRequestsService) GetReview(ctx context.Context, owner, repo string, number int, reviewID int64) (*PullRequestReview, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d", owner, repo, number, reviewID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } review := new(PullRequestReview) resp, err := s.client.Do(ctx, req, review) if err != nil { return nil, resp, err } return review, resp, nil } // DeletePendingReview deletes the specified pull request pending review. // // TODO: Follow up with GitHub support about an issue with this method's // returned error format and remove this comment once it's fixed. // Read more about it here - https://github.com/google/go-github/issues/540 // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#delete-a-pending-review-for-a-pull-request func (s *PullRequestsService) DeletePendingReview(ctx context.Context, owner, repo string, number int, reviewID int64) (*PullRequestReview, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d", owner, repo, number, reviewID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, nil, err } review := new(PullRequestReview) resp, err := s.client.Do(ctx, req, review) if err != nil { return nil, resp, err } return review, resp, nil } // ListReviewComments lists all the comments for the specified review. // // TODO: Follow up with GitHub support about an issue with this method's // returned error format and remove this comment once it's fixed. // Read more about it here - https://github.com/google/go-github/issues/540 // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#list-comments-for-a-pull-request-review func (s *PullRequestsService) ListReviewComments(ctx context.Context, owner, repo string, number int, reviewID int64, opts *ListOptions) ([]*PullRequestComment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d/comments", owner, repo, number, reviewID) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var comments []*PullRequestComment resp, err := s.client.Do(ctx, req, &comments) if err != nil { return nil, resp, err } return comments, resp, nil } // CreateReview creates a new review on the specified pull request. // // TODO: Follow up with GitHub support about an issue with this method's // returned error format and remove this comment once it's fixed. // Read more about it here - https://github.com/google/go-github/issues/540 // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#create-a-review-for-a-pull-request // // In order to use multi-line comments, you must use the "comfort fade" preview. // This replaces the use of the "Position" field in comments with 4 new fields: // [Start]Side, and [Start]Line. // These new fields must be used for ALL comments (including single-line), // with the following restrictions (empirically observed, so subject to change). // // For single-line "comfort fade" comments, you must use: // // Path: &path, // as before // Body: &body, // as before // Side: &"RIGHT" (or "LEFT") // Line: &123, // NOT THE SAME AS POSITION, this is an actual line number. // // If StartSide or StartLine is used with single-line comments, a 422 is returned. // // For multi-line "comfort fade" comments, you must use: // // Path: &path, // as before // Body: &body, // as before // StartSide: &"RIGHT" (or "LEFT") // Side: &"RIGHT" (or "LEFT") // StartLine: &120, // Line: &125, // // Suggested edits are made by commenting on the lines to replace, and including the // suggested edit in a block like this (it may be surrounded in non-suggestion markdown): // // ```suggestion // Use this instead. // It is waaaaaay better. // ``` func (s *PullRequestsService) CreateReview(ctx context.Context, owner, repo string, number int, review *PullRequestReviewRequest) (*PullRequestReview, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews", owner, repo, number) req, err := s.client.NewRequest("POST", u, review) if err != nil { return nil, nil, err } // Detect which style of review comment is being used. if isCF, err := review.isComfortFadePreview(); err != nil { return nil, nil, err } else if isCF { // If the review comments are using the comfort fade preview fields, // then pass the comfort fade header. req.Header.Set("Accept", mediaTypeMultiLineCommentsPreview) } r := new(PullRequestReview) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // UpdateReview updates the review summary on the specified pull request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#update-a-review-for-a-pull-request func (s *PullRequestsService) UpdateReview(ctx context.Context, owner, repo string, number int, reviewID int64, body string) (*PullRequestReview, *Response, error) { opts := &struct { Body string `json:"body"` }{Body: body} u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d", owner, repo, number, reviewID) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, nil, err } review := &PullRequestReview{} resp, err := s.client.Do(ctx, req, review) if err != nil { return nil, resp, err } return review, resp, nil } // SubmitReview submits a specified review on the specified pull request. // // TODO: Follow up with GitHub support about an issue with this method's // returned error format and remove this comment once it's fixed. // Read more about it here - https://github.com/google/go-github/issues/540 // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#submit-a-review-for-a-pull-request func (s *PullRequestsService) SubmitReview(ctx context.Context, owner, repo string, number int, reviewID int64, review *PullRequestReviewRequest) (*PullRequestReview, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d/events", owner, repo, number, reviewID) req, err := s.client.NewRequest("POST", u, review) if err != nil { return nil, nil, err } r := new(PullRequestReview) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // DismissReview dismisses a specified review on the specified pull request. // // TODO: Follow up with GitHub support about an issue with this method's // returned error format and remove this comment once it's fixed. // Read more about it here - https://github.com/google/go-github/issues/540 // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/pulls/#dismiss-a-review-for-a-pull-request func (s *PullRequestsService) DismissReview(ctx context.Context, owner, repo string, number int, reviewID int64, review *PullRequestReviewDismissalRequest) (*PullRequestReview, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/%d/reviews/%d/dismissals", owner, repo, number, reviewID) req, err := s.client.NewRequest("PUT", u, review) if err != nil { return nil, nil, err } r := new(PullRequestReview) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } go-github-38.1.0/github/pulls_reviews_test.go000066400000000000000000000477321410475703100212620ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestPullRequestsService_ListReviews(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1/reviews", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[{"id":1},{"id":2}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() reviews, _, err := client.PullRequests.ListReviews(ctx, "o", "r", 1, opt) if err != nil { t.Errorf("PullRequests.ListReviews returned error: %v", err) } want := []*PullRequestReview{ {ID: Int64(1)}, {ID: Int64(2)}, } if !cmp.Equal(reviews, want) { t.Errorf("PullRequests.ListReviews returned %+v, want %+v", reviews, want) } const methodName = "ListReviews" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.ListReviews(ctx, "\n", "\n", -1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.ListReviews(ctx, "o", "r", 1, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_ListReviews_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.ListReviews(ctx, "%", "r", 1, nil) testURLParseError(t, err) } func TestPullRequestsService_GetReview(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1/reviews/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() review, _, err := client.PullRequests.GetReview(ctx, "o", "r", 1, 1) if err != nil { t.Errorf("PullRequests.GetReview returned error: %v", err) } want := &PullRequestReview{ID: Int64(1)} if !cmp.Equal(review, want) { t.Errorf("PullRequests.GetReview returned %+v, want %+v", review, want) } const methodName = "GetReview" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.GetReview(ctx, "\n", "\n", -1, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.GetReview(ctx, "o", "r", 1, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_GetReview_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.GetReview(ctx, "%", "r", 1, 1) testURLParseError(t, err) } func TestPullRequestsService_DeletePendingReview(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1/reviews/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() review, _, err := client.PullRequests.DeletePendingReview(ctx, "o", "r", 1, 1) if err != nil { t.Errorf("PullRequests.DeletePendingReview returned error: %v", err) } want := &PullRequestReview{ID: Int64(1)} if !cmp.Equal(review, want) { t.Errorf("PullRequests.DeletePendingReview returned %+v, want %+v", review, want) } const methodName = "DeletePendingReview" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.DeletePendingReview(ctx, "\n", "\n", -1, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.DeletePendingReview(ctx, "o", "r", 1, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_DeletePendingReview_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.DeletePendingReview(ctx, "%", "r", 1, 1) testURLParseError(t, err) } func TestPullRequestsService_ListReviewComments(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1/reviews/1/comments", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":1},{"id":2}]`) }) ctx := context.Background() comments, _, err := client.PullRequests.ListReviewComments(ctx, "o", "r", 1, 1, nil) if err != nil { t.Errorf("PullRequests.ListReviewComments returned error: %v", err) } want := []*PullRequestComment{ {ID: Int64(1)}, {ID: Int64(2)}, } if !cmp.Equal(comments, want) { t.Errorf("PullRequests.ListReviewComments returned %+v, want %+v", comments, want) } const methodName = "ListReviewComments" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.ListReviewComments(ctx, "\n", "\n", -1, -1, nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.ListReviewComments(ctx, "o", "r", 1, 1, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_ListReviewComments_withOptions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1/reviews/1/comments", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[]`) }) ctx := context.Background() _, _, err := client.PullRequests.ListReviewComments(ctx, "o", "r", 1, 1, &ListOptions{Page: 2}) if err != nil { t.Errorf("PullRequests.ListReviewComments returned error: %v", err) } const methodName = "ListReviewComments" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.ListReviewComments(ctx, "\n", "\n", -1, -1, &ListOptions{Page: 2}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.ListReviewComments(ctx, "o", "r", 1, 1, &ListOptions{Page: 2}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestReviewRequest_isComfortFadePreview(t *testing.T) { path := "path/to/file.go" body := "this is a comment body" left, right := "LEFT", "RIGHT" pos1, pos2, pos3 := 1, 2, 3 line1, line2, line3 := 11, 22, 33 tests := []struct { name string review *PullRequestReviewRequest wantErr error wantBool bool }{{ name: "empty review", review: &PullRequestReviewRequest{}, wantBool: false, }, { name: "nil comment", review: &PullRequestReviewRequest{Comments: []*DraftReviewComment{nil}}, wantBool: false, }, { name: "old-style review", review: &PullRequestReviewRequest{ Comments: []*DraftReviewComment{{ Path: &path, Body: &body, Position: &pos1, }, { Path: &path, Body: &body, Position: &pos2, }, { Path: &path, Body: &body, Position: &pos3, }}, }, wantBool: false, }, { name: "new-style review", review: &PullRequestReviewRequest{ Comments: []*DraftReviewComment{{ Path: &path, Body: &body, Side: &right, Line: &line1, }, { Path: &path, Body: &body, Side: &left, Line: &line2, }, { Path: &path, Body: &body, Side: &right, Line: &line3, }}, }, wantBool: true, }, { name: "blended comment", review: &PullRequestReviewRequest{ Comments: []*DraftReviewComment{{ Path: &path, Body: &body, Position: &pos1, // can't have both styles. Side: &right, Line: &line1, }}, }, wantErr: ErrMixedCommentStyles, }, { name: "position then line", review: &PullRequestReviewRequest{ Comments: []*DraftReviewComment{{ Path: &path, Body: &body, Position: &pos1, }, { Path: &path, Body: &body, Side: &right, Line: &line1, }}, }, wantErr: ErrMixedCommentStyles, }, { name: "line then position", review: &PullRequestReviewRequest{ Comments: []*DraftReviewComment{{ Path: &path, Body: &body, Side: &right, Line: &line1, }, { Path: &path, Body: &body, Position: &pos1, }}, }, wantErr: ErrMixedCommentStyles, }} for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { gotBool, gotErr := tc.review.isComfortFadePreview() if tc.wantErr != nil { if gotErr != tc.wantErr { t.Errorf("isComfortFadePreview() = %v, wanted %v", gotErr, tc.wantErr) } } else { if gotBool != tc.wantBool { t.Errorf("isComfortFadePreview() = %v, wanted %v", gotBool, tc.wantBool) } } }) } } func TestPullRequestsService_ListReviewComments_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.ListReviewComments(ctx, "%", "r", 1, 1, nil) testURLParseError(t, err) } func TestPullRequestsService_CreateReview(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &PullRequestReviewRequest{ CommitID: String("commit_id"), Body: String("b"), Event: String("APPROVE"), } mux.HandleFunc("/repos/o/r/pulls/1/reviews", func(w http.ResponseWriter, r *http.Request) { v := new(PullRequestReviewRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() review, _, err := client.PullRequests.CreateReview(ctx, "o", "r", 1, input) if err != nil { t.Errorf("PullRequests.CreateReview returned error: %v", err) } want := &PullRequestReview{ID: Int64(1)} if !cmp.Equal(review, want) { t.Errorf("PullRequests.CreateReview returned %+v, want %+v", review, want) } const methodName = "CreateReview" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.CreateReview(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.CreateReview(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_CreateReview_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.CreateReview(ctx, "%", "r", 1, &PullRequestReviewRequest{}) testURLParseError(t, err) } func TestPullRequestsService_CreateReview_badReview(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() path := "path/to/file.go" body := "this is a comment body" right := "RIGHT" pos1 := 1 line1 := 11 badReview := &PullRequestReviewRequest{ Comments: []*DraftReviewComment{{ Path: &path, Body: &body, Side: &right, Line: &line1, }, { Path: &path, Body: &body, Position: &pos1, }}} _, _, err := client.PullRequests.CreateReview(ctx, "o", "r", 1, badReview) if err == nil { t.Errorf("CreateReview badReview err = nil, want err") } } func TestPullRequestsService_CreateReview_addHeader(t *testing.T) { client, mux, _, teardown := setup() defer teardown() path := "path/to/file.go" body := "this is a comment body" left, right := "LEFT", "RIGHT" line1, line2, line3 := 11, 22, 33 input := &PullRequestReviewRequest{ Comments: []*DraftReviewComment{{ Path: &path, Body: &body, Side: &right, Line: &line1, }, { Path: &path, Body: &body, Side: &left, Line: &line2, }, { Path: &path, Body: &body, Side: &right, Line: &line3, }}, } mux.HandleFunc("/repos/o/r/pulls/1/reviews", func(w http.ResponseWriter, r *http.Request) { v := new(PullRequestReviewRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() _, _, err := client.PullRequests.CreateReview(ctx, "o", "r", 1, input) if err != nil { t.Errorf("CreateReview addHeader err = %v, want nil", err) } } func TestPullRequestsService_UpdateReview(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1/reviews/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") fmt.Fprintf(w, `{"id":1}`) }) ctx := context.Background() got, _, err := client.PullRequests.UpdateReview(ctx, "o", "r", 1, 1, "updated_body") if err != nil { t.Errorf("PullRequests.UpdateReview returned error: %v", err) } want := &PullRequestReview{ID: Int64(1)} if !cmp.Equal(got, want) { t.Errorf("PullRequests.UpdateReview = %+v, want %+v", got, want) } const methodName = "UpdateReview" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.UpdateReview(ctx, "\n", "\n", -1, -1, "updated_body") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.UpdateReview(ctx, "o", "r", 1, 1, "updated_body") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_SubmitReview(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &PullRequestReviewRequest{ Body: String("b"), Event: String("APPROVE"), } mux.HandleFunc("/repos/o/r/pulls/1/reviews/1/events", func(w http.ResponseWriter, r *http.Request) { v := new(PullRequestReviewRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() review, _, err := client.PullRequests.SubmitReview(ctx, "o", "r", 1, 1, input) if err != nil { t.Errorf("PullRequests.SubmitReview returned error: %v", err) } want := &PullRequestReview{ID: Int64(1)} if !cmp.Equal(review, want) { t.Errorf("PullRequests.SubmitReview returned %+v, want %+v", review, want) } const methodName = "SubmitReview" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.SubmitReview(ctx, "\n", "\n", -1, -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.SubmitReview(ctx, "o", "r", 1, 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_SubmitReview_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.SubmitReview(ctx, "%", "r", 1, 1, &PullRequestReviewRequest{}) testURLParseError(t, err) } func TestPullRequestsService_DismissReview(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &PullRequestReviewDismissalRequest{Message: String("m")} mux.HandleFunc("/repos/o/r/pulls/1/reviews/1/dismissals", func(w http.ResponseWriter, r *http.Request) { v := new(PullRequestReviewDismissalRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() review, _, err := client.PullRequests.DismissReview(ctx, "o", "r", 1, 1, input) if err != nil { t.Errorf("PullRequests.DismissReview returned error: %v", err) } want := &PullRequestReview{ID: Int64(1)} if !cmp.Equal(review, want) { t.Errorf("PullRequests.DismissReview returned %+v, want %+v", review, want) } const methodName = "ListReviews" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.DismissReview(ctx, "\n", "\n", -1, -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.DismissReview(ctx, "o", "r", 1, 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_DismissReview_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.DismissReview(ctx, "%", "r", 1, 1, &PullRequestReviewDismissalRequest{}) testURLParseError(t, err) } func TestPullRequestReviewDismissalRequest_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestReviewDismissalRequest{}, "{}") u := &PullRequestReviewDismissalRequest{ Message: String("msg"), } want := `{ "message": "msg" }` testJSONMarshal(t, u, want) } func TestDraftReviewComment_Marshal(t *testing.T) { testJSONMarshal(t, &DraftReviewComment{}, "{}") u := &DraftReviewComment{ Path: String("path"), Position: Int(1), Body: String("body"), StartSide: String("ss"), Side: String("side"), StartLine: Int(1), Line: Int(1), } want := `{ "path": "path", "position": 1, "body": "body", "start_side": "ss", "side": "side", "start_line": 1, "line": 1 }` testJSONMarshal(t, u, want) } func TestPullRequestReviewRequest_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestReviewRequest{}, "{}") u := &PullRequestReviewRequest{ NodeID: String("nodeid"), CommitID: String("cid"), Body: String("body"), Event: String("event"), Comments: []*DraftReviewComment{ { Path: String("path"), Position: Int(1), Body: String("body"), StartSide: String("ss"), Side: String("side"), StartLine: Int(1), Line: Int(1), }, }, } want := `{ "node_id": "nodeid", "commit_id": "cid", "body": "body", "event": "event", "comments": [ { "path": "path", "position": 1, "body": "body", "start_side": "ss", "side": "side", "start_line": 1, "line": 1 } ] }` testJSONMarshal(t, u, want) } func TestPullRequestReview_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestReview{}, "{}") u := &PullRequestReview{ ID: Int64(1), NodeID: String("nid"), User: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Body: String("body"), SubmittedAt: &referenceTime, CommitID: String("cid"), HTMLURL: String("hurl"), PullRequestURL: String("prurl"), State: String("state"), AuthorAssociation: String("aa"), } want := `{ "id": 1, "node_id": "nid", "user": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "body": "body", "submitted_at": ` + referenceTimeStr + `, "commit_id": "cid", "html_url": "hurl", "pull_request_url": "prurl", "state": "state", "author_association": "aa" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/pulls_test.go000066400000000000000000001216561410475703100175140ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "io" "net/http" "strings" "testing" "github.com/google/go-cmp/cmp" ) func TestPullRequestsService_List(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "state": "closed", "head": "h", "base": "b", "sort": "created", "direction": "desc", "page": "2", }) fmt.Fprint(w, `[{"number":1}]`) }) opts := &PullRequestListOptions{"closed", "h", "b", "created", "desc", ListOptions{Page: 2}} ctx := context.Background() pulls, _, err := client.PullRequests.List(ctx, "o", "r", opts) if err != nil { t.Errorf("PullRequests.List returned error: %v", err) } want := []*PullRequest{{Number: Int(1)}} if !cmp.Equal(pulls, want) { t.Errorf("PullRequests.List returned %+v, want %+v", pulls, want) } const methodName = "List" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.List(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.List(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_ListPullRequestsWithCommit(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/commits/sha/pulls", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeListPullsOrBranchesForCommitPreview) testFormValues(t, r, values{ "state": "closed", "head": "h", "base": "b", "sort": "created", "direction": "desc", "page": "2", }) fmt.Fprint(w, `[{"number":1}]`) }) opts := &PullRequestListOptions{"closed", "h", "b", "created", "desc", ListOptions{Page: 2}} ctx := context.Background() pulls, _, err := client.PullRequests.ListPullRequestsWithCommit(ctx, "o", "r", "sha", opts) if err != nil { t.Errorf("PullRequests.ListPullRequestsWithCommit returned error: %v", err) } want := []*PullRequest{{Number: Int(1)}} if !cmp.Equal(pulls, want) { t.Errorf("PullRequests.ListPullRequestsWithCommit returned %+v, want %+v", pulls, want) } const methodName = "ListPullRequestsWithCommit" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.ListPullRequestsWithCommit(ctx, "\n", "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.ListPullRequestsWithCommit(ctx, "o", "r", "sha", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_List_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.List(ctx, "%", "r", nil) testURLParseError(t, err) } func TestPullRequestsService_Get(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"number":1}`) }) ctx := context.Background() pull, _, err := client.PullRequests.Get(ctx, "o", "r", 1) if err != nil { t.Errorf("PullRequests.Get returned error: %v", err) } want := &PullRequest{Number: Int(1)} if !cmp.Equal(pull, want) { t.Errorf("PullRequests.Get returned %+v, want %+v", pull, want) } const methodName = "Get" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.Get(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.Get(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_GetRaw_diff(t *testing.T) { client, mux, _, teardown := setup() defer teardown() const rawStr = "@@diff content" mux.HandleFunc("/repos/o/r/pulls/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeV3Diff) fmt.Fprint(w, rawStr) }) ctx := context.Background() got, _, err := client.PullRequests.GetRaw(ctx, "o", "r", 1, RawOptions{Diff}) if err != nil { t.Fatalf("PullRequests.GetRaw returned error: %v", err) } want := rawStr if got != want { t.Errorf("PullRequests.GetRaw returned %s want %s", got, want) } const methodName = "GetRaw" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.GetRaw(ctx, "\n", "\n", -1, RawOptions{Diff}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.GetRaw(ctx, "o", "r", 1, RawOptions{Diff}) if got != "" { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_GetRaw_patch(t *testing.T) { client, mux, _, teardown := setup() defer teardown() const rawStr = "@@patch content" mux.HandleFunc("/repos/o/r/pulls/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeV3Patch) fmt.Fprint(w, rawStr) }) ctx := context.Background() got, _, err := client.PullRequests.GetRaw(ctx, "o", "r", 1, RawOptions{Patch}) if err != nil { t.Fatalf("PullRequests.GetRaw returned error: %v", err) } want := rawStr if got != want { t.Errorf("PullRequests.GetRaw returned %s want %s", got, want) } } func TestPullRequestsService_GetRaw_invalid(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.GetRaw(ctx, "o", "r", 1, RawOptions{100}) if err == nil { t.Fatal("PullRequests.GetRaw should return error") } if !strings.Contains(err.Error(), "unsupported raw type") { t.Error("PullRequests.GetRaw should return unsupported raw type error") } } func TestPullRequestsService_Get_links(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "number":1, "_links":{ "self":{"href":"https://api.github.com/repos/octocat/Hello-World/pulls/1347"}, "html":{"href":"https://github.com/octocat/Hello-World/pull/1347"}, "issue":{"href":"https://api.github.com/repos/octocat/Hello-World/issues/1347"}, "comments":{"href":"https://api.github.com/repos/octocat/Hello-World/issues/1347/comments"}, "review_comments":{"href":"https://api.github.com/repos/octocat/Hello-World/pulls/1347/comments"}, "review_comment":{"href":"https://api.github.com/repos/octocat/Hello-World/pulls/comments{/number}"}, "commits":{"href":"https://api.github.com/repos/octocat/Hello-World/pulls/1347/commits"}, "statuses":{"href":"https://api.github.com/repos/octocat/Hello-World/statuses/6dcb09b5b57875f334f61aebed695e2e4193db5e"} } }`) }) ctx := context.Background() pull, _, err := client.PullRequests.Get(ctx, "o", "r", 1) if err != nil { t.Errorf("PullRequests.Get returned error: %v", err) } want := &PullRequest{ Number: Int(1), Links: &PRLinks{ Self: &PRLink{ HRef: String("https://api.github.com/repos/octocat/Hello-World/pulls/1347"), }, HTML: &PRLink{ HRef: String("https://github.com/octocat/Hello-World/pull/1347"), }, Issue: &PRLink{ HRef: String("https://api.github.com/repos/octocat/Hello-World/issues/1347"), }, Comments: &PRLink{ HRef: String("https://api.github.com/repos/octocat/Hello-World/issues/1347/comments"), }, ReviewComments: &PRLink{ HRef: String("https://api.github.com/repos/octocat/Hello-World/pulls/1347/comments"), }, ReviewComment: &PRLink{ HRef: String("https://api.github.com/repos/octocat/Hello-World/pulls/comments{/number}"), }, Commits: &PRLink{ HRef: String("https://api.github.com/repos/octocat/Hello-World/pulls/1347/commits"), }, Statuses: &PRLink{ HRef: String("https://api.github.com/repos/octocat/Hello-World/statuses/6dcb09b5b57875f334f61aebed695e2e4193db5e"), }, }, } if !cmp.Equal(pull, want) { t.Errorf("PullRequests.Get returned %+v, want %+v", pull, want) } } func TestPullRequestsService_Get_headAndBase(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"number":1,"head":{"ref":"r2","repo":{"id":2}},"base":{"ref":"r1","repo":{"id":1}}}`) }) ctx := context.Background() pull, _, err := client.PullRequests.Get(ctx, "o", "r", 1) if err != nil { t.Errorf("PullRequests.Get returned error: %v", err) } want := &PullRequest{ Number: Int(1), Head: &PullRequestBranch{ Ref: String("r2"), Repo: &Repository{ID: Int64(2)}, }, Base: &PullRequestBranch{ Ref: String("r1"), Repo: &Repository{ID: Int64(1)}, }, } if !cmp.Equal(pull, want) { t.Errorf("PullRequests.Get returned %+v, want %+v", pull, want) } } func TestPullRequestsService_Get_urlFields(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"number":1, "url": "https://api.github.com/repos/octocat/Hello-World/pulls/1347", "html_url": "https://github.com/octocat/Hello-World/pull/1347", "issue_url": "https://api.github.com/repos/octocat/Hello-World/issues/1347", "statuses_url": "https://api.github.com/repos/octocat/Hello-World/statuses/6dcb09b5b57875f334f61aebed695e2e4193db5e", "diff_url": "https://github.com/octocat/Hello-World/pull/1347.diff", "patch_url": "https://github.com/octocat/Hello-World/pull/1347.patch", "review_comments_url": "https://api.github.com/repos/octocat/Hello-World/pulls/1347/comments", "review_comment_url": "https://api.github.com/repos/octocat/Hello-World/pulls/comments{/number}"}`) }) ctx := context.Background() pull, _, err := client.PullRequests.Get(ctx, "o", "r", 1) if err != nil { t.Errorf("PullRequests.Get returned error: %v", err) } want := &PullRequest{ Number: Int(1), URL: String("https://api.github.com/repos/octocat/Hello-World/pulls/1347"), HTMLURL: String("https://github.com/octocat/Hello-World/pull/1347"), IssueURL: String("https://api.github.com/repos/octocat/Hello-World/issues/1347"), StatusesURL: String("https://api.github.com/repos/octocat/Hello-World/statuses/6dcb09b5b57875f334f61aebed695e2e4193db5e"), DiffURL: String("https://github.com/octocat/Hello-World/pull/1347.diff"), PatchURL: String("https://github.com/octocat/Hello-World/pull/1347.patch"), ReviewCommentsURL: String("https://api.github.com/repos/octocat/Hello-World/pulls/1347/comments"), ReviewCommentURL: String("https://api.github.com/repos/octocat/Hello-World/pulls/comments{/number}"), } if !cmp.Equal(pull, want) { t.Errorf("PullRequests.Get returned %+v, want %+v", pull, want) } } func TestPullRequestsService_Get_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.Get(ctx, "%", "r", 1) testURLParseError(t, err) } func TestPullRequestsService_Create(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &NewPullRequest{Title: String("t")} mux.HandleFunc("/repos/o/r/pulls", func(w http.ResponseWriter, r *http.Request) { v := new(NewPullRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"number":1}`) }) ctx := context.Background() pull, _, err := client.PullRequests.Create(ctx, "o", "r", input) if err != nil { t.Errorf("PullRequests.Create returned error: %v", err) } want := &PullRequest{Number: Int(1)} if !cmp.Equal(pull, want) { t.Errorf("PullRequests.Create returned %+v, want %+v", pull, want) } const methodName = "Create" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.Create(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.Create(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_Create_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.Create(ctx, "%", "r", nil) testURLParseError(t, err) } func TestPullRequestsService_UpdateBranch(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1/update-branch", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Accept", mediaTypeUpdatePullRequestBranchPreview) fmt.Fprint(w, ` { "message": "Updating pull request branch.", "url": "https://github.com/repos/o/r/pulls/1" }`) }) opts := &PullRequestBranchUpdateOptions{ ExpectedHeadSHA: String("s"), } ctx := context.Background() pull, _, err := client.PullRequests.UpdateBranch(ctx, "o", "r", 1, opts) if err != nil { t.Errorf("PullRequests.UpdateBranch returned error: %v", err) } want := &PullRequestBranchUpdateResponse{ Message: String("Updating pull request branch."), URL: String("https://github.com/repos/o/r/pulls/1"), } if !cmp.Equal(pull, want) { t.Errorf("PullRequests.UpdateBranch returned %+v, want %+v", pull, want) } const methodName = "UpdateBranch" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.UpdateBranch(ctx, "\n", "\n", -1, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.UpdateBranch(ctx, "o", "r", 1, opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_Edit(t *testing.T) { client, mux, _, teardown := setup() defer teardown() tests := []struct { input *PullRequest sendResponse string wantUpdate string want *PullRequest }{ { input: &PullRequest{Title: String("t")}, sendResponse: `{"number":1}`, wantUpdate: `{"title":"t"}`, want: &PullRequest{Number: Int(1)}, }, { // base update input: &PullRequest{Base: &PullRequestBranch{Ref: String("master")}}, sendResponse: `{"number":1,"base":{"ref":"master"}}`, wantUpdate: `{"base":"master"}`, want: &PullRequest{ Number: Int(1), Base: &PullRequestBranch{Ref: String("master")}, }, }, } for i, tt := range tests { madeRequest := false mux.HandleFunc(fmt.Sprintf("/repos/o/r/pulls/%v", i), func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") testBody(t, r, tt.wantUpdate+"\n") io.WriteString(w, tt.sendResponse) madeRequest = true }) ctx := context.Background() pull, _, err := client.PullRequests.Edit(ctx, "o", "r", i, tt.input) if err != nil { t.Errorf("%d: PullRequests.Edit returned error: %v", i, err) } if !cmp.Equal(pull, tt.want) { t.Errorf("%d: PullRequests.Edit returned %+v, want %+v", i, pull, tt.want) } if !madeRequest { t.Errorf("%d: PullRequest.Edit did not make the expected request", i) } const methodName = "Edit" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.Edit(ctx, "\n", "\n", -i, tt.input) return err }) } } func TestPullRequestsService_Edit_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.PullRequests.Edit(ctx, "%", "r", 1, &PullRequest{}) testURLParseError(t, err) } func TestPullRequestsService_ListCommits(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1/commits", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, ` [ { "sha": "3", "parents": [ { "sha": "2" } ] }, { "sha": "2", "parents": [ { "sha": "1" } ] } ]`) }) opts := &ListOptions{Page: 2} ctx := context.Background() commits, _, err := client.PullRequests.ListCommits(ctx, "o", "r", 1, opts) if err != nil { t.Errorf("PullRequests.ListCommits returned error: %v", err) } want := []*RepositoryCommit{ { SHA: String("3"), Parents: []*Commit{ { SHA: String("2"), }, }, }, { SHA: String("2"), Parents: []*Commit{ { SHA: String("1"), }, }, }, } if !cmp.Equal(commits, want) { t.Errorf("PullRequests.ListCommits returned %+v, want %+v", commits, want) } const methodName = "ListCommits" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.ListCommits(ctx, "\n", "\n", -1, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.ListCommits(ctx, "o", "r", 1, opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_ListFiles(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1/files", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, ` [ { "sha": "6dcb09b5b57875f334f61aebed695e2e4193db5e", "filename": "file1.txt", "status": "added", "additions": 103, "deletions": 21, "changes": 124, "patch": "@@ -132,7 +132,7 @@ module Test @@ -1000,7 +1000,7 @@ module Test" }, { "sha": "f61aebed695e2e4193db5e6dcb09b5b57875f334", "filename": "file2.txt", "status": "modified", "additions": 5, "deletions": 3, "changes": 103, "patch": "@@ -132,7 +132,7 @@ module Test @@ -1000,7 +1000,7 @@ module Test" } ]`) }) opts := &ListOptions{Page: 2} ctx := context.Background() commitFiles, _, err := client.PullRequests.ListFiles(ctx, "o", "r", 1, opts) if err != nil { t.Errorf("PullRequests.ListFiles returned error: %v", err) } want := []*CommitFile{ { SHA: String("6dcb09b5b57875f334f61aebed695e2e4193db5e"), Filename: String("file1.txt"), Additions: Int(103), Deletions: Int(21), Changes: Int(124), Status: String("added"), Patch: String("@@ -132,7 +132,7 @@ module Test @@ -1000,7 +1000,7 @@ module Test"), }, { SHA: String("f61aebed695e2e4193db5e6dcb09b5b57875f334"), Filename: String("file2.txt"), Additions: Int(5), Deletions: Int(3), Changes: Int(103), Status: String("modified"), Patch: String("@@ -132,7 +132,7 @@ module Test @@ -1000,7 +1000,7 @@ module Test"), }, } if !cmp.Equal(commitFiles, want) { t.Errorf("PullRequests.ListFiles returned %+v, want %+v", commitFiles, want) } const methodName = "ListFiles" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.ListFiles(ctx, "\n", "\n", -1, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.ListFiles(ctx, "o", "r", 1, opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPullRequestsService_IsMerged(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1/merge", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() isMerged, _, err := client.PullRequests.IsMerged(ctx, "o", "r", 1) if err != nil { t.Errorf("PullRequests.IsMerged returned error: %v", err) } want := true if !cmp.Equal(isMerged, want) { t.Errorf("PullRequests.IsMerged returned %+v, want %+v", isMerged, want) } const methodName = "IsMerged" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.IsMerged(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.IsMerged(ctx, "o", "r", 1) if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) } return resp, err }) } func TestPullRequestsService_Merge(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/1/merge", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") fmt.Fprint(w, ` { "sha": "6dcb09b5b57875f334f61aebed695e2e4193db5e", "merged": true, "message": "Pull Request successfully merged" }`) }) options := &PullRequestOptions{MergeMethod: "rebase"} ctx := context.Background() merge, _, err := client.PullRequests.Merge(ctx, "o", "r", 1, "merging pull request", options) if err != nil { t.Errorf("PullRequests.Merge returned error: %v", err) } want := &PullRequestMergeResult{ SHA: String("6dcb09b5b57875f334f61aebed695e2e4193db5e"), Merged: Bool(true), Message: String("Pull Request successfully merged"), } if !cmp.Equal(merge, want) { t.Errorf("PullRequests.Merge returned %+v, want %+v", merge, want) } const methodName = "Merge" testBadOptions(t, methodName, func() (err error) { _, _, err = client.PullRequests.Merge(ctx, "\n", "\n", -1, "\n", options) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.PullRequests.Merge(ctx, "o", "r", 1, "merging pull request", options) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } // Test that different merge options produce expected PUT requests. See issue https://github.com/google/go-github/issues/500. func TestPullRequestsService_Merge_options(t *testing.T) { client, mux, _, teardown := setup() defer teardown() tests := []struct { options *PullRequestOptions wantBody string }{ { options: nil, wantBody: `{"commit_message":"merging pull request"}`, }, { options: &PullRequestOptions{}, wantBody: `{"commit_message":"merging pull request"}`, }, { options: &PullRequestOptions{MergeMethod: "rebase"}, wantBody: `{"commit_message":"merging pull request","merge_method":"rebase"}`, }, { options: &PullRequestOptions{SHA: "6dcb09b5b57875f334f61aebed695e2e4193db5e"}, wantBody: `{"commit_message":"merging pull request","sha":"6dcb09b5b57875f334f61aebed695e2e4193db5e"}`, }, { options: &PullRequestOptions{ CommitTitle: "Extra detail", SHA: "6dcb09b5b57875f334f61aebed695e2e4193db5e", MergeMethod: "squash", }, wantBody: `{"commit_message":"merging pull request","commit_title":"Extra detail","merge_method":"squash","sha":"6dcb09b5b57875f334f61aebed695e2e4193db5e"}`, }, { options: &PullRequestOptions{ DontDefaultIfBlank: true, }, wantBody: `{"commit_message":"merging pull request"}`, }, } for i, test := range tests { madeRequest := false mux.HandleFunc(fmt.Sprintf("/repos/o/r/pulls/%d/merge", i), func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testBody(t, r, test.wantBody+"\n") madeRequest = true }) ctx := context.Background() _, _, _ = client.PullRequests.Merge(ctx, "o", "r", i, "merging pull request", test.options) if !madeRequest { t.Errorf("%d: PullRequests.Merge(%#v): expected request was not made", i, test.options) } } } func TestPullRequestsService_Merge_Blank_Message(t *testing.T) { client, mux, _, teardown := setup() defer teardown() madeRequest := false expectedBody := "" mux.HandleFunc("/repos/o/r/pulls/1/merge", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testBody(t, r, expectedBody+"\n") madeRequest = true }) ctx := context.Background() expectedBody = `{}` _, _, _ = client.PullRequests.Merge(ctx, "o", "r", 1, "", nil) if !madeRequest { t.Error("TestPullRequestsService_Merge_Blank_Message #1 did not make request") } madeRequest = false opts := PullRequestOptions{ DontDefaultIfBlank: true, } expectedBody = `{"commit_message":""}` _, _, _ = client.PullRequests.Merge(ctx, "o", "r", 1, "", &opts) if !madeRequest { t.Error("TestPullRequestsService_Merge_Blank_Message #2 did not make request") } } func TestPullRequestMergeRequest_Marshal(t *testing.T) { testJSONMarshal(t, &pullRequestMergeRequest{}, "{}") u := &pullRequestMergeRequest{ CommitMessage: String("cm"), CommitTitle: "ct", MergeMethod: "mm", SHA: "sha", } want := `{ "commit_message": "cm", "commit_title": "ct", "merge_method": "mm", "sha": "sha" }` testJSONMarshal(t, u, want) } func TestPullRequestMergeResult_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestMergeResult{}, "{}") u := &PullRequestMergeResult{ SHA: String("sha"), Merged: Bool(false), Message: String("msg"), } want := `{ "sha": "sha", "merged": false, "message": "msg" }` testJSONMarshal(t, u, want) } func TestPullRequestUpdate_Marshal(t *testing.T) { testJSONMarshal(t, &pullRequestUpdate{}, "{}") u := &pullRequestUpdate{ Title: String("title"), Body: String("body"), State: String("state"), Base: String("base"), MaintainerCanModify: Bool(false), } want := `{ "title": "title", "body": "body", "state": "state", "base": "base", "maintainer_can_modify": false }` testJSONMarshal(t, u, want) } func TestPullRequestBranchUpdateResponse_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestBranchUpdateResponse{}, "{}") u := &PullRequestBranchUpdateResponse{ Message: String("message"), URL: String("url"), } want := `{ "message": "message", "url": "url" }` testJSONMarshal(t, u, want) } func TestPullRequestBranchUpdateOptions_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestBranchUpdateOptions{}, "{}") u := &PullRequestBranchUpdateOptions{ ExpectedHeadSHA: String("eh"), } want := `{ "expected_head_sha": "eh" }` testJSONMarshal(t, u, want) } func TestNewPullRequest_Marshal(t *testing.T) { testJSONMarshal(t, &NewPullRequest{}, "{}") u := &NewPullRequest{ Title: String("eh"), Head: String("eh"), Base: String("eh"), Body: String("eh"), Issue: Int(1), MaintainerCanModify: Bool(false), Draft: Bool(false), } want := `{ "title": "eh", "head": "eh", "base": "eh", "body": "eh", "issue": 1, "maintainer_can_modify": false, "draft": false }` testJSONMarshal(t, u, want) } func TestPullRequestBranch_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestBranch{}, "{}") u := &PullRequestBranch{ Label: String("label"), Ref: String("ref"), SHA: String("sha"), Repo: &Repository{ID: Int64(1)}, User: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "label": "label", "ref": "ref", "sha": "sha", "repo": { "id": 1 }, "user": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" } }` testJSONMarshal(t, u, want) } func TestPRLink_Marshal(t *testing.T) { testJSONMarshal(t, &PRLink{}, "{}") u := &PRLink{ HRef: String("href"), } want := `{ "href": "href" }` testJSONMarshal(t, u, want) } func TestPRLinks_Marshal(t *testing.T) { testJSONMarshal(t, &PRLinks{}, "{}") u := &PRLinks{ Self: &PRLink{ HRef: String("href"), }, HTML: &PRLink{ HRef: String("href"), }, Issue: &PRLink{ HRef: String("href"), }, Comments: &PRLink{ HRef: String("href"), }, ReviewComments: &PRLink{ HRef: String("href"), }, ReviewComment: &PRLink{ HRef: String("href"), }, Commits: &PRLink{ HRef: String("href"), }, Statuses: &PRLink{ HRef: String("href"), }, } want := `{ "self": { "href": "href" }, "html": { "href": "href" }, "issue": { "href": "href" }, "comments": { "href": "href" }, "review_comments": { "href": "href" }, "review_comment": { "href": "href" }, "commits": { "href": "href" }, "statuses": { "href": "href" } }` testJSONMarshal(t, u, want) } func TestPullRequestAutoMerge_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestAutoMerge{}, "{}") u := &PullRequestAutoMerge{ EnabledBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, MergeMethod: String("mm"), CommitTitle: String("ct"), CommitMessage: String("cm"), } want := `{ "enabled_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "merge_method": "mm", "commit_title": "ct", "commit_message": "cm" }` testJSONMarshal(t, u, want) } func TestPullRequest_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequest{}, "{}") u := &PullRequest{ ID: Int64(1), Number: Int(1), State: String("state"), Locked: Bool(false), Title: String("title"), Body: String("body"), CreatedAt: &referenceTime, UpdatedAt: &referenceTime, ClosedAt: &referenceTime, MergedAt: &referenceTime, Labels: []*Label{{ID: Int64(1)}}, User: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Draft: Bool(false), Merged: Bool(false), Mergeable: Bool(false), MergeableState: String("ms"), MergedBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, MergeCommitSHA: String("mcs"), Rebaseable: Bool(false), Comments: Int(1), Commits: Int(1), Additions: Int(1), Deletions: Int(1), ChangedFiles: Int(1), URL: String("url"), HTMLURL: String("hurl"), IssueURL: String("iurl"), StatusesURL: String("surl"), DiffURL: String("durl"), PatchURL: String("purl"), CommitsURL: String("curl"), CommentsURL: String("comurl"), ReviewCommentsURL: String("rcurls"), ReviewCommentURL: String("rcurl"), ReviewComments: Int(1), Assignee: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Assignees: []*User{ { Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, }, Milestone: &Milestone{ID: Int64(1)}, MaintainerCanModify: Bool(true), AuthorAssociation: String("aa"), NodeID: String("nid"), RequestedReviewers: []*User{ { Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, }, AutoMerge: &PullRequestAutoMerge{ EnabledBy: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, MergeMethod: String("mm"), CommitTitle: String("ct"), CommitMessage: String("cm"), }, RequestedTeams: []*Team{{ID: Int64(1)}}, Links: &PRLinks{ Self: &PRLink{ HRef: String("href"), }, HTML: &PRLink{ HRef: String("href"), }, Issue: &PRLink{ HRef: String("href"), }, Comments: &PRLink{ HRef: String("href"), }, ReviewComments: &PRLink{ HRef: String("href"), }, ReviewComment: &PRLink{ HRef: String("href"), }, Commits: &PRLink{ HRef: String("href"), }, Statuses: &PRLink{ HRef: String("href"), }, }, Head: &PullRequestBranch{ Ref: String("r2"), Repo: &Repository{ID: Int64(2)}, }, Base: &PullRequestBranch{ Ref: String("r2"), Repo: &Repository{ID: Int64(2)}, }, ActiveLockReason: String("alr"), } want := `{ "id": 1, "number": 1, "state": "state", "locked": false, "title": "title", "body": "body", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "closed_at": ` + referenceTimeStr + `, "merged_at": ` + referenceTimeStr + `, "labels": [ { "id": 1 } ], "user": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "draft": false, "merged": false, "mergeable": false, "mergeable_state": "ms", "merged_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "merge_commit_sha": "mcs", "rebaseable": false, "comments": 1, "commits": 1, "additions": 1, "deletions": 1, "changed_files": 1, "url": "url", "html_url": "hurl", "issue_url": "iurl", "statuses_url": "surl", "diff_url": "durl", "patch_url": "purl", "commits_url": "curl", "comments_url": "comurl", "review_comments_url": "rcurls", "review_comment_url": "rcurl", "review_comments": 1, "assignee": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "assignees": [ { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" } ], "milestone": { "id": 1 }, "maintainer_can_modify": true, "author_association": "aa", "node_id": "nid", "requested_reviewers": [ { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" } ], "auto_merge": { "enabled_by": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "merge_method": "mm", "commit_title": "ct", "commit_message": "cm" }, "requested_teams": [ { "id": 1 } ], "_links": { "self": { "href": "href" }, "html": { "href": "href" }, "issue": { "href": "href" }, "comments": { "href": "href" }, "review_comments": { "href": "href" }, "review_comment": { "href": "href" }, "commits": { "href": "href" }, "statuses": { "href": "href" } }, "head": { "ref": "r2", "repo": { "id": 2 } }, "base": { "ref": "r2", "repo": { "id": 2 } }, "active_lock_reason": "alr" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/reactions.go000066400000000000000000000466261410475703100173100ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" "net/http" ) // ReactionsService provides access to the reactions-related functions in the // GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/ type ReactionsService service // Reaction represents a GitHub reaction. type Reaction struct { // ID is the Reaction ID. ID *int64 `json:"id,omitempty"` User *User `json:"user,omitempty"` NodeID *string `json:"node_id,omitempty"` // Content is the type of reaction. // Possible values are: // "+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", or "eyes". Content *string `json:"content,omitempty"` } // Reactions represents a summary of GitHub reactions. type Reactions struct { TotalCount *int `json:"total_count,omitempty"` PlusOne *int `json:"+1,omitempty"` MinusOne *int `json:"-1,omitempty"` Laugh *int `json:"laugh,omitempty"` Confused *int `json:"confused,omitempty"` Heart *int `json:"heart,omitempty"` Hooray *int `json:"hooray,omitempty"` Rocket *int `json:"rocket,omitempty"` Eyes *int `json:"eyes,omitempty"` URL *string `json:"url,omitempty"` } func (r Reaction) String() string { return Stringify(r) } // ListCommentReactionOptions specifies the optional parameters to the // ReactionsService.ListCommentReactions method. type ListCommentReactionOptions struct { // Content restricts the returned comment reactions to only those with the given type. // Omit this parameter to list all reactions to a commit comment. // Possible values are: "+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", or "eyes". Content string `url:"content,omitempty"` ListOptions } // ListCommentReactions lists the reactions for a commit comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-a-commit-comment func (s *ReactionsService) ListCommentReactions(ctx context.Context, owner, repo string, id int64, opts *ListCommentReactionOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions", owner, repo, id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreateCommentReaction creates a reaction for a commit comment. // Note that if you have already created a reaction of type content, the // previously created reaction will be returned with Status: 200 OK. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", or "eyes". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-a-commit-comment func (s *ReactionsService) CreateCommentReaction(ctx context.Context, owner, repo string, id int64, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions", owner, repo, id) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteCommentReaction deletes the reaction for a commit comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-a-commit-comment-reaction func (s *ReactionsService) DeleteCommentReaction(ctx context.Context, owner, repo string, commentID, reactionID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions/%v", owner, repo, commentID, reactionID) return s.deleteReaction(ctx, u) } // DeleteCommentReactionByID deletes the reaction for a commit comment by repository ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-a-commit-comment-reaction func (s *ReactionsService) DeleteCommentReactionByID(ctx context.Context, repoID, commentID, reactionID int64) (*Response, error) { u := fmt.Sprintf("repositories/%v/comments/%v/reactions/%v", repoID, commentID, reactionID) return s.deleteReaction(ctx, u) } // ListIssueReactions lists the reactions for an issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-an-issue func (s *ReactionsService) ListIssueReactions(ctx context.Context, owner, repo string, number int, opts *ListOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%v/reactions", owner, repo, number) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreateIssueReaction creates a reaction for an issue. // Note that if you have already created a reaction of type content, the // previously created reaction will be returned with Status: 200 OK. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", or "eyes". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-an-issue func (s *ReactionsService) CreateIssueReaction(ctx context.Context, owner, repo string, number int, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%v/reactions", owner, repo, number) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteIssueReaction deletes the reaction to an issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-an-issue-reaction func (s *ReactionsService) DeleteIssueReaction(ctx context.Context, owner, repo string, issueNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/issues/%v/reactions/%v", owner, repo, issueNumber, reactionID) return s.deleteReaction(ctx, url) } // DeleteIssueReactionByID deletes the reaction to an issue by repository ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-an-issue-reaction func (s *ReactionsService) DeleteIssueReactionByID(ctx context.Context, repoID, issueNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("repositories/%v/issues/%v/reactions/%v", repoID, issueNumber, reactionID) return s.deleteReaction(ctx, url) } // ListIssueCommentReactions lists the reactions for an issue comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-an-issue-comment func (s *ReactionsService) ListIssueCommentReactions(ctx context.Context, owner, repo string, id int64, opts *ListOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions", owner, repo, id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreateIssueCommentReaction creates a reaction for an issue comment. // Note that if you have already created a reaction of type content, the // previously created reaction will be returned with Status: 200 OK. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", or "eyes". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-an-issue-comment func (s *ReactionsService) CreateIssueCommentReaction(ctx context.Context, owner, repo string, id int64, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions", owner, repo, id) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteIssueCommentReaction deletes the reaction to an issue comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-an-issue-comment-reaction func (s *ReactionsService) DeleteIssueCommentReaction(ctx context.Context, owner, repo string, commentID, reactionID int64) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions/%v", owner, repo, commentID, reactionID) return s.deleteReaction(ctx, url) } // DeleteIssueCommentReactionByID deletes the reaction to an issue comment by repository ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-an-issue-comment-reaction func (s *ReactionsService) DeleteIssueCommentReactionByID(ctx context.Context, repoID, commentID, reactionID int64) (*Response, error) { url := fmt.Sprintf("repositories/%v/issues/comments/%v/reactions/%v", repoID, commentID, reactionID) return s.deleteReaction(ctx, url) } // ListPullRequestCommentReactions lists the reactions for a pull request review comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-a-pull-request-review-comment func (s *ReactionsService) ListPullRequestCommentReactions(ctx context.Context, owner, repo string, id int64, opts *ListOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions", owner, repo, id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreatePullRequestCommentReaction creates a reaction for a pull request review comment. // Note that if you have already created a reaction of type content, the // previously created reaction will be returned with Status: 200 OK. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", or "eyes". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-a-pull-request-review-comment func (s *ReactionsService) CreatePullRequestCommentReaction(ctx context.Context, owner, repo string, id int64, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions", owner, repo, id) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeletePullRequestCommentReaction deletes the reaction to a pull request review comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-a-pull-request-comment-reaction func (s *ReactionsService) DeletePullRequestCommentReaction(ctx context.Context, owner, repo string, commentID, reactionID int64) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions/%v", owner, repo, commentID, reactionID) return s.deleteReaction(ctx, url) } // DeletePullRequestCommentReactionByID deletes the reaction to a pull request review comment by repository ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-a-pull-request-comment-reaction func (s *ReactionsService) DeletePullRequestCommentReactionByID(ctx context.Context, repoID, commentID, reactionID int64) (*Response, error) { url := fmt.Sprintf("repositories/%v/pulls/comments/%v/reactions/%v", repoID, commentID, reactionID) return s.deleteReaction(ctx, url) } // ListTeamDiscussionReactions lists the reactions for a team discussion. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-a-team-discussion-legacy func (s *ReactionsService) ListTeamDiscussionReactions(ctx context.Context, teamID int64, discussionNumber int, opts *ListOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("teams/%v/discussions/%v/reactions", teamID, discussionNumber) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreateTeamDiscussionReaction creates a reaction for a team discussion. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", or "eyes". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-a-team-discussion-legacy func (s *ReactionsService) CreateTeamDiscussionReaction(ctx context.Context, teamID int64, discussionNumber int, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("teams/%v/discussions/%v/reactions", teamID, discussionNumber) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteTeamDiscussionReaction deletes the reaction to a team discussion. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-team-discussion-reaction func (s *ReactionsService) DeleteTeamDiscussionReaction(ctx context.Context, org, teamSlug string, discussionNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/reactions/%v", org, teamSlug, discussionNumber, reactionID) return s.deleteReaction(ctx, url) } // DeleteTeamDiscussionReactionByOrgIDAndTeamID deletes the reaction to a team discussion by organization ID and team ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-team-discussion-reaction func (s *ReactionsService) DeleteTeamDiscussionReactionByOrgIDAndTeamID(ctx context.Context, orgID, teamID, discussionNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/reactions/%v", orgID, teamID, discussionNumber, reactionID) return s.deleteReaction(ctx, url) } // ListTeamDiscussionCommentReactions lists the reactions for a team discussion comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-a-team-discussion-comment-legacy func (s *ReactionsService) ListTeamDiscussionCommentReactions(ctx context.Context, teamID int64, discussionNumber, commentNumber int, opts *ListOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v/reactions", teamID, discussionNumber, commentNumber) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreateTeamDiscussionCommentReaction creates a reaction for a team discussion comment. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", or "eyes". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-a-team-discussion-comment-legacy func (s *ReactionsService) CreateTeamDiscussionCommentReaction(ctx context.Context, teamID int64, discussionNumber, commentNumber int, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v/reactions", teamID, discussionNumber, commentNumber) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteTeamDiscussionCommentReaction deletes the reaction to a team discussion comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-team-discussion-comment-reaction func (s *ReactionsService) DeleteTeamDiscussionCommentReaction(ctx context.Context, org, teamSlug string, discussionNumber, commentNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments/%v/reactions/%v", org, teamSlug, discussionNumber, commentNumber, reactionID) return s.deleteReaction(ctx, url) } // DeleteTeamDiscussionCommentReactionByOrgIDAndTeamID deletes the reaction to a team discussion comment by organization ID and team ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-team-discussion-comment-reaction func (s *ReactionsService) DeleteTeamDiscussionCommentReactionByOrgIDAndTeamID(ctx context.Context, orgID, teamID, discussionNumber, commentNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments/%v/reactions/%v", orgID, teamID, discussionNumber, commentNumber, reactionID) return s.deleteReaction(ctx, url) } func (s *ReactionsService) deleteReaction(ctx context.Context, url string) (*Response, error) { req, err := s.client.NewRequest(http.MethodDelete, url, nil) if err != nil { return nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/reactions_test.go000066400000000000000000000707001410475703100203350ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestReaction_Marshal(t *testing.T) { testJSONMarshal(t, &Reaction{}, "{}") r := &Reaction{ ID: Int64(1), User: nil, NodeID: String("n"), Content: String("+1"), } want := `{ "id": 1, "node_id": "n", "content": "+1" }` testJSONMarshal(t, r, want) } func TestReactions_Marshal(t *testing.T) { testJSONMarshal(t, &Reactions{}, "{}") r := &Reactions{ TotalCount: Int(1), PlusOne: Int(1), MinusOne: Int(1), Laugh: Int(1), Confused: Int(1), Heart: Int(1), Hooray: Int(1), Rocket: Int(1), Eyes: Int(1), URL: String("u"), } want := `{ "total_count": 1, "+1": 1, "-1": 1, "laugh": 1, "confused": 1, "heart": 1, "hooray": 1, "rocket": 1, "eyes": 1, "url": "u" }` testJSONMarshal(t, r, want) } func TestReactionsService_ListCommentReactions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/comments/1/reactions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) testFormValues(t, r, values{"content": "+1"}) fmt.Fprint(w, `[{"id":1,"user":{"login":"l","id":2},"content":"+1"}]`) }) opt := &ListCommentReactionOptions{Content: "+1"} ctx := context.Background() reactions, _, err := client.Reactions.ListCommentReactions(ctx, "o", "r", 1, opt) if err != nil { t.Errorf("ListCommentReactions returned error: %v", err) } want := []*Reaction{{ID: Int64(1), User: &User{Login: String("l"), ID: Int64(2)}, Content: String("+1")}} if !cmp.Equal(reactions, want) { t.Errorf("ListCommentReactions = %+v, want %+v", reactions, want) } const methodName = "ListCommentReactions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Reactions.ListCommentReactions(ctx, "\n", "\n", -1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Reactions.ListCommentReactions(ctx, "o", "r", 1, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestReactionsService_CreateCommentReaction(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/comments/1/reactions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusCreated) w.Write([]byte(`{"id":1,"user":{"login":"l","id":2},"content":"+1"}`)) }) ctx := context.Background() got, _, err := client.Reactions.CreateCommentReaction(ctx, "o", "r", 1, "+1") if err != nil { t.Errorf("CreateCommentReaction returned error: %v", err) } want := &Reaction{ID: Int64(1), User: &User{Login: String("l"), ID: Int64(2)}, Content: String("+1")} if !cmp.Equal(got, want) { t.Errorf("CreateCommentReaction = %+v, want %+v", got, want) } const methodName = "CreateCommentReaction" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Reactions.CreateCommentReaction(ctx, "\n", "\n", -1, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Reactions.CreateCommentReaction(ctx, "o", "r", 1, "+1") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestReactionsService_ListIssueReactions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/1/reactions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusOK) w.Write([]byte(`[{"id":1,"user":{"login":"l","id":2},"content":"+1"}]`)) }) ctx := context.Background() got, _, err := client.Reactions.ListIssueReactions(ctx, "o", "r", 1, nil) if err != nil { t.Errorf("ListIssueReactions returned error: %v", err) } want := []*Reaction{{ID: Int64(1), User: &User{Login: String("l"), ID: Int64(2)}, Content: String("+1")}} if !cmp.Equal(got, want) { t.Errorf("ListIssueReactions = %+v, want %+v", got, want) } } func TestReactionsService_ListIssueReactions_coverage(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() const methodName = "ListIssueReactions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Reactions.ListIssueReactions(ctx, "\n", "\n", -1, &ListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Reactions.ListIssueReactions(ctx, "o", "r", 1, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestReactionsService_CreateIssueReaction(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/1/reactions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusCreated) w.Write([]byte(`{"id":1,"user":{"login":"l","id":2},"content":"+1"}`)) }) ctx := context.Background() got, _, err := client.Reactions.CreateIssueReaction(ctx, "o", "r", 1, "+1") if err != nil { t.Errorf("CreateIssueReaction returned error: %v", err) } want := &Reaction{ID: Int64(1), User: &User{Login: String("l"), ID: Int64(2)}, Content: String("+1")} if !cmp.Equal(got, want) { t.Errorf("CreateIssueReaction = %+v, want %+v", got, want) } const methodName = "CreateIssueReaction" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Reactions.CreateIssueReaction(ctx, "\n", "\n", -1, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Reactions.CreateIssueReaction(ctx, "o", "r", 1, "+1") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestReactionsService_ListIssueCommentReactions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/comments/1/reactions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusOK) w.Write([]byte(`[{"id":1,"user":{"login":"l","id":2},"content":"+1"}]`)) }) ctx := context.Background() got, _, err := client.Reactions.ListIssueCommentReactions(ctx, "o", "r", 1, nil) if err != nil { t.Errorf("ListIssueCommentReactions returned error: %v", err) } want := []*Reaction{{ID: Int64(1), User: &User{Login: String("l"), ID: Int64(2)}, Content: String("+1")}} if !cmp.Equal(got, want) { t.Errorf("ListIssueCommentReactions = %+v, want %+v", got, want) } } func TestReactionsService_ListIssueCommentReactions_coverage(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() const methodName = "ListIssueCommentReactions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Reactions.ListIssueCommentReactions(ctx, "\n", "\n", -1, &ListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Reactions.ListIssueCommentReactions(ctx, "o", "r", 1, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestReactionsService_CreateIssueCommentReaction(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/comments/1/reactions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusCreated) w.Write([]byte(`{"id":1,"user":{"login":"l","id":2},"content":"+1"}`)) }) ctx := context.Background() got, _, err := client.Reactions.CreateIssueCommentReaction(ctx, "o", "r", 1, "+1") if err != nil { t.Errorf("CreateIssueCommentReaction returned error: %v", err) } want := &Reaction{ID: Int64(1), User: &User{Login: String("l"), ID: Int64(2)}, Content: String("+1")} if !cmp.Equal(got, want) { t.Errorf("CreateIssueCommentReaction = %+v, want %+v", got, want) } const methodName = "CreateIssueCommentReaction" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Reactions.CreateIssueCommentReaction(ctx, "\n", "\n", -1, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Reactions.CreateIssueCommentReaction(ctx, "o", "r", 1, "+1") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestReactionsService_ListPullRequestCommentReactions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/comments/1/reactions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusOK) w.Write([]byte(`[{"id":1,"user":{"login":"l","id":2},"content":"+1"}]`)) }) ctx := context.Background() got, _, err := client.Reactions.ListPullRequestCommentReactions(ctx, "o", "r", 1, nil) if err != nil { t.Errorf("ListPullRequestCommentReactions returned error: %v", err) } want := []*Reaction{{ID: Int64(1), User: &User{Login: String("l"), ID: Int64(2)}, Content: String("+1")}} if !cmp.Equal(got, want) { t.Errorf("ListPullRequestCommentReactions = %+v, want %+v", got, want) } } func TestReactionsService_ListPullRequestCommentReactions_coverage(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() const methodName = "ListPullRequestCommentReactions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Reactions.ListPullRequestCommentReactions(ctx, "\n", "\n", -1, &ListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Reactions.ListPullRequestCommentReactions(ctx, "o", "r", 1, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestReactionsService_CreatePullRequestCommentReaction(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/comments/1/reactions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusCreated) w.Write([]byte(`{"id":1,"user":{"login":"l","id":2},"content":"+1"}`)) }) ctx := context.Background() got, _, err := client.Reactions.CreatePullRequestCommentReaction(ctx, "o", "r", 1, "+1") if err != nil { t.Errorf("CreatePullRequestCommentReaction returned error: %v", err) } want := &Reaction{ID: Int64(1), User: &User{Login: String("l"), ID: Int64(2)}, Content: String("+1")} if !cmp.Equal(got, want) { t.Errorf("CreatePullRequestCommentReaction = %+v, want %+v", got, want) } const methodName = "CreatePullRequestCommentReaction" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Reactions.CreatePullRequestCommentReaction(ctx, "\n", "\n", -1, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Reactions.CreatePullRequestCommentReaction(ctx, "o", "r", 1, "+1") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestReactionsService_ListTeamDiscussionReactions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/teams/1/discussions/2/reactions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusOK) w.Write([]byte(`[{"id":1,"user":{"login":"l","id":2},"content":"+1"}]`)) }) ctx := context.Background() got, _, err := client.Reactions.ListTeamDiscussionReactions(ctx, 1, 2, nil) if err != nil { t.Errorf("ListTeamDiscussionReactions returned error: %v", err) } want := []*Reaction{{ID: Int64(1), User: &User{Login: String("l"), ID: Int64(2)}, Content: String("+1")}} if !cmp.Equal(got, want) { t.Errorf("ListTeamDiscussionReactions = %+v, want %+v", got, want) } } func TestReactionsService_ListTeamDiscussionReactions_coverage(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() const methodName = "ListTeamDiscussionReactions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Reactions.ListTeamDiscussionReactions(ctx, -1, -2, &ListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Reactions.ListTeamDiscussionReactions(ctx, 1, 2, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestReactionsService_CreateTeamDiscussionReaction(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/teams/1/discussions/2/reactions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusCreated) w.Write([]byte(`{"id":1,"user":{"login":"l","id":2},"content":"+1"}`)) }) ctx := context.Background() got, _, err := client.Reactions.CreateTeamDiscussionReaction(ctx, 1, 2, "+1") if err != nil { t.Errorf("CreateTeamDiscussionReaction returned error: %v", err) } want := &Reaction{ID: Int64(1), User: &User{Login: String("l"), ID: Int64(2)}, Content: String("+1")} if !cmp.Equal(got, want) { t.Errorf("CreateTeamDiscussionReaction = %+v, want %+v", got, want) } const methodName = "CreateTeamDiscussionReaction" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Reactions.CreateTeamDiscussionReaction(ctx, -1, -2, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Reactions.CreateTeamDiscussionReaction(ctx, 1, 2, "+1") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestReactionService_ListTeamDiscussionCommentReactions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/teams/1/discussions/2/comments/3/reactions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusOK) w.Write([]byte(`[{"id":1,"user":{"login":"l","id":2},"content":"+1"}]`)) }) ctx := context.Background() got, _, err := client.Reactions.ListTeamDiscussionCommentReactions(ctx, 1, 2, 3, nil) if err != nil { t.Errorf("ListTeamDiscussionCommentReactions returned error: %v", err) } want := []*Reaction{{ID: Int64(1), User: &User{Login: String("l"), ID: Int64(2)}, Content: String("+1")}} if !cmp.Equal(got, want) { t.Errorf("ListTeamDiscussionCommentReactions = %+v, want %+v", got, want) } } func TestReactionService_ListTeamDiscussionCommentReactions_coverage(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() const methodName = "ListTeamDiscussionCommentReactions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Reactions.ListTeamDiscussionCommentReactions(ctx, -1, -2, -3, &ListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Reactions.ListTeamDiscussionCommentReactions(ctx, 1, 2, 3, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestReactionService_CreateTeamDiscussionCommentReaction(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/teams/1/discussions/2/comments/3/reactions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusCreated) w.Write([]byte(`{"id":1,"user":{"login":"l","id":2},"content":"+1"}`)) }) ctx := context.Background() got, _, err := client.Reactions.CreateTeamDiscussionCommentReaction(ctx, 1, 2, 3, "+1") if err != nil { t.Errorf("CreateTeamDiscussionCommentReaction returned error: %v", err) } want := &Reaction{ID: Int64(1), User: &User{Login: String("l"), ID: Int64(2)}, Content: String("+1")} if !cmp.Equal(got, want) { t.Errorf("CreateTeamDiscussionCommentReaction = %+v, want %+v", got, want) } const methodName = "CreateTeamDiscussionCommentReaction" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Reactions.CreateTeamDiscussionCommentReaction(ctx, -1, -2, -3, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Reactions.CreateTeamDiscussionCommentReaction(ctx, 1, 2, 3, "+1") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestReactionsService_DeleteCommitCommentReaction(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/comments/1/reactions/2", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Reactions.DeleteCommentReaction(ctx, "o", "r", 1, 2); err != nil { t.Errorf("DeleteCommentReaction returned error: %v", err) } const methodName = "DeleteCommentReaction" testBadOptions(t, methodName, func() (err error) { _, err = client.Reactions.DeleteCommentReaction(ctx, "\n", "\n", -1, -2) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Reactions.DeleteCommentReaction(ctx, "o", "r", 1, 2) }) } func TestReactionsService_DeleteCommitCommentReactionByRepoID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/comments/2/reactions/3", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Reactions.DeleteCommentReactionByID(ctx, 1, 2, 3); err != nil { t.Errorf("DeleteCommentReactionByRepoID returned error: %v", err) } const methodName = "DeleteCommentReactionByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Reactions.DeleteCommentReactionByID(ctx, -1, -2, -3) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Reactions.DeleteCommentReactionByID(ctx, 1, 2, 3) }) } func TestReactionsService_DeleteIssueReaction(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/1/reactions/2", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Reactions.DeleteIssueReaction(ctx, "o", "r", 1, 2); err != nil { t.Errorf("DeleteIssueReaction returned error: %v", err) } const methodName = "DeleteIssueReaction" testBadOptions(t, methodName, func() (err error) { _, err = client.Reactions.DeleteIssueReaction(ctx, "\n", "\n", -1, -2) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Reactions.DeleteIssueReaction(ctx, "o", "r", 1, 2) }) } func TestReactionsService_DeleteIssueReactionByRepoID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/issues/2/reactions/3", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Reactions.DeleteIssueReactionByID(ctx, 1, 2, 3); err != nil { t.Errorf("DeleteIssueReactionByRepoID returned error: %v", err) } const methodName = "DeleteIssueReactionByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Reactions.DeleteIssueReactionByID(ctx, -1, -2, -3) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Reactions.DeleteIssueReactionByID(ctx, 1, 2, 3) }) } func TestReactionsService_DeleteIssueCommentReaction(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/issues/comments/1/reactions/2", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Reactions.DeleteIssueCommentReaction(ctx, "o", "r", 1, 2); err != nil { t.Errorf("DeleteIssueCommentReaction returned error: %v", err) } const methodName = "DeleteIssueCommentReaction" testBadOptions(t, methodName, func() (err error) { _, err = client.Reactions.DeleteIssueCommentReaction(ctx, "\n", "\n", -1, -2) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Reactions.DeleteIssueCommentReaction(ctx, "o", "r", 1, 2) }) } func TestReactionsService_DeleteIssueCommentReactionByRepoID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/issues/comments/2/reactions/3", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Reactions.DeleteIssueCommentReactionByID(ctx, 1, 2, 3); err != nil { t.Errorf("DeleteIssueCommentReactionByRepoID returned error: %v", err) } const methodName = "DeleteIssueCommentReactionByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Reactions.DeleteIssueCommentReactionByID(ctx, -1, -2, -3) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Reactions.DeleteIssueCommentReactionByID(ctx, 1, 2, 3) }) } func TestReactionsService_DeletePullRequestCommentReaction(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pulls/comments/1/reactions/2", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Reactions.DeletePullRequestCommentReaction(ctx, "o", "r", 1, 2); err != nil { t.Errorf("DeletePullRequestCommentReaction returned error: %v", err) } const methodName = "DeletePullRequestCommentReaction" testBadOptions(t, methodName, func() (err error) { _, err = client.Reactions.DeletePullRequestCommentReaction(ctx, "\n", "\n", -1, -2) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Reactions.DeletePullRequestCommentReaction(ctx, "o", "r", 1, 2) }) } func TestReactionsService_DeletePullRequestCommentReactionByRepoID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/pulls/comments/2/reactions/3", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Reactions.DeletePullRequestCommentReactionByID(ctx, 1, 2, 3); err != nil { t.Errorf("DeletePullRequestCommentReactionByRepoID returned error: %v", err) } const methodName = "DeletePullRequestCommentReactionByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Reactions.DeletePullRequestCommentReactionByID(ctx, -1, -2, -3) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Reactions.DeletePullRequestCommentReactionByID(ctx, 1, 2, 3) }) } func TestReactionsService_DeleteTeamDiscussionReaction(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s/discussions/1/reactions/2", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Reactions.DeleteTeamDiscussionReaction(ctx, "o", "s", 1, 2); err != nil { t.Errorf("DeleteTeamDiscussionReaction returned error: %v", err) } const methodName = "DeleteTeamDiscussionReaction" testBadOptions(t, methodName, func() (err error) { _, err = client.Reactions.DeleteTeamDiscussionReaction(ctx, "\n", "\n", -1, -2) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Reactions.DeleteTeamDiscussionReaction(ctx, "o", "s", 1, 2) }) } func TestReactionsService_DeleteTeamDiscussionReactionByTeamIDAndOrgID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/2/discussions/3/reactions/4", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Reactions.DeleteTeamDiscussionReactionByOrgIDAndTeamID(ctx, 1, 2, 3, 4); err != nil { t.Errorf("DeleteTeamDiscussionReactionByTeamIDAndOrgID returned error: %v", err) } const methodName = "DeleteTeamDiscussionReactionByOrgIDAndTeamID" testBadOptions(t, methodName, func() (err error) { _, err = client.Reactions.DeleteTeamDiscussionReactionByOrgIDAndTeamID(ctx, -1, -2, -3, -4) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Reactions.DeleteTeamDiscussionReactionByOrgIDAndTeamID(ctx, 1, 2, 3, 4) }) } func TestReactionsService_DeleteTeamDiscussionCommentReaction(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s/discussions/1/comments/2/reactions/3", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Reactions.DeleteTeamDiscussionCommentReaction(ctx, "o", "s", 1, 2, 3); err != nil { t.Errorf("DeleteTeamDiscussionCommentReaction returned error: %v", err) } const methodName = "DeleteTeamDiscussionCommentReaction" testBadOptions(t, methodName, func() (err error) { _, err = client.Reactions.DeleteTeamDiscussionCommentReaction(ctx, "\n", "\n", -1, -2, -3) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Reactions.DeleteTeamDiscussionCommentReaction(ctx, "o", "s", 1, 2, 3) }) } func TestReactionsService_DeleteTeamDiscussionCommentReactionByTeamIDAndOrgID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/2/discussions/3/comments/4/reactions/5", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Reactions.DeleteTeamDiscussionCommentReactionByOrgIDAndTeamID(ctx, 1, 2, 3, 4, 5); err != nil { t.Errorf("DeleteTeamDiscussionCommentReactionByTeamIDAndOrgID returned error: %v", err) } const methodName = "DeleteTeamDiscussionCommentReactionByOrgIDAndTeamID" testBadOptions(t, methodName, func() (err error) { _, err = client.Reactions.DeleteTeamDiscussionCommentReactionByOrgIDAndTeamID(ctx, -1, -2, -3, -4, -5) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Reactions.DeleteTeamDiscussionCommentReactionByOrgIDAndTeamID(ctx, 1, 2, 3, 4, 5) }) } go-github-38.1.0/github/repos.go000066400000000000000000001667671410475703100164620ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "strings" ) // RepositoriesService handles communication with the repository related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/ type RepositoriesService service // Repository represents a GitHub repository. type Repository struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Owner *User `json:"owner,omitempty"` Name *string `json:"name,omitempty"` FullName *string `json:"full_name,omitempty"` Description *string `json:"description,omitempty"` Homepage *string `json:"homepage,omitempty"` CodeOfConduct *CodeOfConduct `json:"code_of_conduct,omitempty"` DefaultBranch *string `json:"default_branch,omitempty"` MasterBranch *string `json:"master_branch,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` PushedAt *Timestamp `json:"pushed_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` HTMLURL *string `json:"html_url,omitempty"` CloneURL *string `json:"clone_url,omitempty"` GitURL *string `json:"git_url,omitempty"` MirrorURL *string `json:"mirror_url,omitempty"` SSHURL *string `json:"ssh_url,omitempty"` SVNURL *string `json:"svn_url,omitempty"` Language *string `json:"language,omitempty"` Fork *bool `json:"fork,omitempty"` ForksCount *int `json:"forks_count,omitempty"` NetworkCount *int `json:"network_count,omitempty"` OpenIssuesCount *int `json:"open_issues_count,omitempty"` OpenIssues *int `json:"open_issues,omitempty"` // Deprecated: Replaced by OpenIssuesCount. For backward compatibility OpenIssues is still populated. StargazersCount *int `json:"stargazers_count,omitempty"` SubscribersCount *int `json:"subscribers_count,omitempty"` WatchersCount *int `json:"watchers_count,omitempty"` // Deprecated: Replaced by StargazersCount. For backward compatibility WatchersCount is still populated. Watchers *int `json:"watchers,omitempty"` // Deprecated: Replaced by StargazersCount. For backward compatibility Watchers is still populated. Size *int `json:"size,omitempty"` AutoInit *bool `json:"auto_init,omitempty"` Parent *Repository `json:"parent,omitempty"` Source *Repository `json:"source,omitempty"` TemplateRepository *Repository `json:"template_repository,omitempty"` Organization *Organization `json:"organization,omitempty"` Permissions map[string]bool `json:"permissions,omitempty"` AllowRebaseMerge *bool `json:"allow_rebase_merge,omitempty"` AllowSquashMerge *bool `json:"allow_squash_merge,omitempty"` AllowMergeCommit *bool `json:"allow_merge_commit,omitempty"` DeleteBranchOnMerge *bool `json:"delete_branch_on_merge,omitempty"` Topics []string `json:"topics,omitempty"` Archived *bool `json:"archived,omitempty"` Disabled *bool `json:"disabled,omitempty"` // Only provided when using RepositoriesService.Get while in preview License *License `json:"license,omitempty"` // Additional mutable fields when creating and editing a repository Private *bool `json:"private,omitempty"` HasIssues *bool `json:"has_issues,omitempty"` HasWiki *bool `json:"has_wiki,omitempty"` HasPages *bool `json:"has_pages,omitempty"` HasProjects *bool `json:"has_projects,omitempty"` HasDownloads *bool `json:"has_downloads,omitempty"` IsTemplate *bool `json:"is_template,omitempty"` LicenseTemplate *string `json:"license_template,omitempty"` GitignoreTemplate *string `json:"gitignore_template,omitempty"` // Creating an organization repository. Required for non-owners. TeamID *int64 `json:"team_id,omitempty"` // API URLs URL *string `json:"url,omitempty"` ArchiveURL *string `json:"archive_url,omitempty"` AssigneesURL *string `json:"assignees_url,omitempty"` BlobsURL *string `json:"blobs_url,omitempty"` BranchesURL *string `json:"branches_url,omitempty"` CollaboratorsURL *string `json:"collaborators_url,omitempty"` CommentsURL *string `json:"comments_url,omitempty"` CommitsURL *string `json:"commits_url,omitempty"` CompareURL *string `json:"compare_url,omitempty"` ContentsURL *string `json:"contents_url,omitempty"` ContributorsURL *string `json:"contributors_url,omitempty"` DeploymentsURL *string `json:"deployments_url,omitempty"` DownloadsURL *string `json:"downloads_url,omitempty"` EventsURL *string `json:"events_url,omitempty"` ForksURL *string `json:"forks_url,omitempty"` GitCommitsURL *string `json:"git_commits_url,omitempty"` GitRefsURL *string `json:"git_refs_url,omitempty"` GitTagsURL *string `json:"git_tags_url,omitempty"` HooksURL *string `json:"hooks_url,omitempty"` IssueCommentURL *string `json:"issue_comment_url,omitempty"` IssueEventsURL *string `json:"issue_events_url,omitempty"` IssuesURL *string `json:"issues_url,omitempty"` KeysURL *string `json:"keys_url,omitempty"` LabelsURL *string `json:"labels_url,omitempty"` LanguagesURL *string `json:"languages_url,omitempty"` MergesURL *string `json:"merges_url,omitempty"` MilestonesURL *string `json:"milestones_url,omitempty"` NotificationsURL *string `json:"notifications_url,omitempty"` PullsURL *string `json:"pulls_url,omitempty"` ReleasesURL *string `json:"releases_url,omitempty"` StargazersURL *string `json:"stargazers_url,omitempty"` StatusesURL *string `json:"statuses_url,omitempty"` SubscribersURL *string `json:"subscribers_url,omitempty"` SubscriptionURL *string `json:"subscription_url,omitempty"` TagsURL *string `json:"tags_url,omitempty"` TreesURL *string `json:"trees_url,omitempty"` TeamsURL *string `json:"teams_url,omitempty"` // TextMatches is only populated from search results that request text matches // See: search.go and https://docs.github.com/en/free-pro-team@latest/rest/reference/search/#text-match-metadata TextMatches []*TextMatch `json:"text_matches,omitempty"` // Visibility is only used for Create and Edit endpoints. The visibility field // overrides the field parameter when both are used. // Can be one of public, private or internal. Visibility *string `json:"visibility,omitempty"` } func (r Repository) String() string { return Stringify(r) } // BranchListOptions specifies the optional parameters to the // RepositoriesService.ListBranches method. type BranchListOptions struct { // Setting to true returns only protected branches. // When set to false, only unprotected branches are returned. // Omitting this parameter returns all branches. // Default: nil Protected *bool `url:"protected,omitempty"` ListOptions } // RepositoryListOptions specifies the optional parameters to the // RepositoriesService.List method. type RepositoryListOptions struct { // Visibility of repositories to list. Can be one of all, public, or private. // Default: all Visibility string `url:"visibility,omitempty"` // List repos of given affiliation[s]. // Comma-separated list of values. Can include: // * owner: Repositories that are owned by the authenticated user. // * collaborator: Repositories that the user has been added to as a // collaborator. // * organization_member: Repositories that the user has access to through // being a member of an organization. This includes every repository on // every team that the user is on. // Default: owner,collaborator,organization_member Affiliation string `url:"affiliation,omitempty"` // Type of repositories to list. // Can be one of all, owner, public, private, member. Default: all // Will cause a 422 error if used in the same request as visibility or // affiliation. Type string `url:"type,omitempty"` // How to sort the repository list. Can be one of created, updated, pushed, // full_name. Default: full_name Sort string `url:"sort,omitempty"` // Direction in which to sort repositories. Can be one of asc or desc. // Default: when using full_name: asc; otherwise desc Direction string `url:"direction,omitempty"` ListOptions } // List the repositories for a user. Passing the empty string will list // repositories for the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-repositories-for-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-repositories-for-a-user func (s *RepositoriesService) List(ctx context.Context, user string, opts *RepositoryListOptions) ([]*Repository, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/repos", user) } else { u = "user/repos" } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. acceptHeaders := []string{mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) var repos []*Repository resp, err := s.client.Do(ctx, req, &repos) if err != nil { return nil, resp, err } return repos, resp, nil } // RepositoryListByOrgOptions specifies the optional parameters to the // RepositoriesService.ListByOrg method. type RepositoryListByOrgOptions struct { // Type of repositories to list. Possible values are: all, public, private, // forks, sources, member. Default is "all". Type string `url:"type,omitempty"` // How to sort the repository list. Can be one of created, updated, pushed, // full_name. Default is "created". Sort string `url:"sort,omitempty"` // Direction in which to sort repositories. Can be one of asc or desc. // Default when using full_name: asc; otherwise desc. Direction string `url:"direction,omitempty"` ListOptions } // ListByOrg lists the repositories for an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-organization-repositories func (s *RepositoriesService) ListByOrg(ctx context.Context, org string, opts *RepositoryListByOrgOptions) ([]*Repository, *Response, error) { u := fmt.Sprintf("orgs/%v/repos", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. acceptHeaders := []string{mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) var repos []*Repository resp, err := s.client.Do(ctx, req, &repos) if err != nil { return nil, resp, err } return repos, resp, nil } // RepositoryListAllOptions specifies the optional parameters to the // RepositoriesService.ListAll method. type RepositoryListAllOptions struct { // ID of the last repository seen Since int64 `url:"since,omitempty"` } // ListAll lists all GitHub repositories in the order that they were created. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-public-repositories func (s *RepositoriesService) ListAll(ctx context.Context, opts *RepositoryListAllOptions) ([]*Repository, *Response, error) { u, err := addOptions("repositories", opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var repos []*Repository resp, err := s.client.Do(ctx, req, &repos) if err != nil { return nil, resp, err } return repos, resp, nil } // createRepoRequest is a subset of Repository and is used internally // by Create to pass only the known fields for the endpoint. // // See https://github.com/google/go-github/issues/1014 for more // information. type createRepoRequest struct { // Name is required when creating a repo. Name *string `json:"name,omitempty"` Description *string `json:"description,omitempty"` Homepage *string `json:"homepage,omitempty"` Private *bool `json:"private,omitempty"` Visibility *string `json:"visibility,omitempty"` HasIssues *bool `json:"has_issues,omitempty"` HasProjects *bool `json:"has_projects,omitempty"` HasWiki *bool `json:"has_wiki,omitempty"` IsTemplate *bool `json:"is_template,omitempty"` // Creating an organization repository. Required for non-owners. TeamID *int64 `json:"team_id,omitempty"` AutoInit *bool `json:"auto_init,omitempty"` GitignoreTemplate *string `json:"gitignore_template,omitempty"` LicenseTemplate *string `json:"license_template,omitempty"` AllowSquashMerge *bool `json:"allow_squash_merge,omitempty"` AllowMergeCommit *bool `json:"allow_merge_commit,omitempty"` AllowRebaseMerge *bool `json:"allow_rebase_merge,omitempty"` DeleteBranchOnMerge *bool `json:"delete_branch_on_merge,omitempty"` } // Create a new repository. If an organization is specified, the new // repository will be created under that org. If the empty string is // specified, it will be created for the authenticated user. // // Note that only a subset of the repo fields are used and repo must // not be nil. // // Also note that this method will return the response without actually // waiting for GitHub to finish creating the repository and letting the // changes propagate throughout its servers. You may set up a loop with // exponential back-off to verify repository's creation. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-a-repository-for-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-an-organization-repository func (s *RepositoriesService) Create(ctx context.Context, org string, repo *Repository) (*Repository, *Response, error) { var u string if org != "" { u = fmt.Sprintf("orgs/%v/repos", org) } else { u = "user/repos" } repoReq := &createRepoRequest{ Name: repo.Name, Description: repo.Description, Homepage: repo.Homepage, Private: repo.Private, Visibility: repo.Visibility, HasIssues: repo.HasIssues, HasProjects: repo.HasProjects, HasWiki: repo.HasWiki, IsTemplate: repo.IsTemplate, TeamID: repo.TeamID, AutoInit: repo.AutoInit, GitignoreTemplate: repo.GitignoreTemplate, LicenseTemplate: repo.LicenseTemplate, AllowSquashMerge: repo.AllowSquashMerge, AllowMergeCommit: repo.AllowMergeCommit, AllowRebaseMerge: repo.AllowRebaseMerge, DeleteBranchOnMerge: repo.DeleteBranchOnMerge, } req, err := s.client.NewRequest("POST", u, repoReq) if err != nil { return nil, nil, err } acceptHeaders := []string{mediaTypeRepositoryTemplatePreview, mediaTypeRepositoryVisibilityPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) r := new(Repository) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // TemplateRepoRequest represents a request to create a repository from a template. type TemplateRepoRequest struct { // Name is required when creating a repo. Name *string `json:"name,omitempty"` Owner *string `json:"owner,omitempty"` Description *string `json:"description,omitempty"` IncludeAllBranches *bool `json:"include_all_branches,omitempty"` Private *bool `json:"private,omitempty"` } // CreateFromTemplate generates a repository from a template. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-a-repository-using-a-template func (s *RepositoriesService) CreateFromTemplate(ctx context.Context, templateOwner, templateRepo string, templateRepoReq *TemplateRepoRequest) (*Repository, *Response, error) { u := fmt.Sprintf("repos/%v/%v/generate", templateOwner, templateRepo) req, err := s.client.NewRequest("POST", u, templateRepoReq) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeRepositoryTemplatePreview) r := new(Repository) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // Get fetches a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-repository func (s *RepositoriesService) Get(ctx context.Context, owner, repo string) (*Repository, *Response, error) { u := fmt.Sprintf("repos/%v/%v", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when the license support fully launches // https://docs.github.com/en/free-pro-team@latest/rest/reference/licenses/#get-a-repositorys-license acceptHeaders := []string{ mediaTypeCodesOfConductPreview, mediaTypeTopicsPreview, mediaTypeRepositoryTemplatePreview, mediaTypeRepositoryVisibilityPreview, } req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) repository := new(Repository) resp, err := s.client.Do(ctx, req, repository) if err != nil { return nil, resp, err } return repository, resp, nil } // GetCodeOfConduct gets the contents of a repository's code of conduct. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/codes-of-conduct/#get-the-code-of-conduct-for-a-repository func (s *RepositoriesService) GetCodeOfConduct(ctx context.Context, owner, repo string) (*CodeOfConduct, *Response, error) { u := fmt.Sprintf("repos/%v/%v/community/code_of_conduct", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeCodesOfConductPreview) coc := new(CodeOfConduct) resp, err := s.client.Do(ctx, req, coc) if err != nil { return nil, resp, err } return coc, resp, nil } // GetByID fetches a repository. // // Note: GetByID uses the undocumented GitHub API endpoint /repositories/:id. func (s *RepositoriesService) GetByID(ctx context.Context, id int64) (*Repository, *Response, error) { u := fmt.Sprintf("repositories/%d", id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } repository := new(Repository) resp, err := s.client.Do(ctx, req, repository) if err != nil { return nil, resp, err } return repository, resp, nil } // Edit updates a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#update-a-repository func (s *RepositoriesService) Edit(ctx context.Context, owner, repo string, repository *Repository) (*Repository, *Response, error) { u := fmt.Sprintf("repos/%v/%v", owner, repo) req, err := s.client.NewRequest("PATCH", u, repository) if err != nil { return nil, nil, err } acceptHeaders := []string{mediaTypeRepositoryTemplatePreview, mediaTypeRepositoryVisibilityPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) r := new(Repository) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // Delete a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#delete-a-repository func (s *RepositoriesService) Delete(ctx context.Context, owner, repo string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v", owner, repo) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // Contributor represents a repository contributor type Contributor struct { Login *string `json:"login,omitempty"` ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` AvatarURL *string `json:"avatar_url,omitempty"` GravatarID *string `json:"gravatar_id,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` FollowersURL *string `json:"followers_url,omitempty"` FollowingURL *string `json:"following_url,omitempty"` GistsURL *string `json:"gists_url,omitempty"` StarredURL *string `json:"starred_url,omitempty"` SubscriptionsURL *string `json:"subscriptions_url,omitempty"` OrganizationsURL *string `json:"organizations_url,omitempty"` ReposURL *string `json:"repos_url,omitempty"` EventsURL *string `json:"events_url,omitempty"` ReceivedEventsURL *string `json:"received_events_url,omitempty"` Type *string `json:"type,omitempty"` SiteAdmin *bool `json:"site_admin,omitempty"` Contributions *int `json:"contributions,omitempty"` Name *string `json:"name,omitempty"` Email *string `json:"email,omitempty"` } // ListContributorsOptions specifies the optional parameters to the // RepositoriesService.ListContributors method. type ListContributorsOptions struct { // Include anonymous contributors in results or not Anon string `url:"anon,omitempty"` ListOptions } // GetVulnerabilityAlerts checks if vulnerability alerts are enabled for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#check-if-vulnerability-alerts-are-enabled-for-a-repository func (s *RepositoriesService) GetVulnerabilityAlerts(ctx context.Context, owner, repository string) (bool, *Response, error) { u := fmt.Sprintf("repos/%v/%v/vulnerability-alerts", owner, repository) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return false, nil, err } // TODO: remove custom Accept header when this API fully launches req.Header.Set("Accept", mediaTypeRequiredVulnerabilityAlertsPreview) resp, err := s.client.Do(ctx, req, nil) vulnerabilityAlertsEnabled, err := parseBoolResponse(err) return vulnerabilityAlertsEnabled, resp, err } // EnableVulnerabilityAlerts enables vulnerability alerts and the dependency graph for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#enable-vulnerability-alerts func (s *RepositoriesService) EnableVulnerabilityAlerts(ctx context.Context, owner, repository string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/vulnerability-alerts", owner, repository) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches req.Header.Set("Accept", mediaTypeRequiredVulnerabilityAlertsPreview) return s.client.Do(ctx, req, nil) } // DisableVulnerabilityAlerts disables vulnerability alerts and the dependency graph for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#disable-vulnerability-alerts func (s *RepositoriesService) DisableVulnerabilityAlerts(ctx context.Context, owner, repository string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/vulnerability-alerts", owner, repository) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches req.Header.Set("Accept", mediaTypeRequiredVulnerabilityAlertsPreview) return s.client.Do(ctx, req, nil) } // EnableAutomatedSecurityFixes enables the automated security fixes for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#enable-automated-security-fixes func (s *RepositoriesService) EnableAutomatedSecurityFixes(ctx context.Context, owner, repository string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/automated-security-fixes", owner, repository) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches req.Header.Set("Accept", mediaTypeRequiredAutomatedSecurityFixesPreview) return s.client.Do(ctx, req, nil) } // DisableAutomatedSecurityFixes disables vulnerability alerts and the dependency graph for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#disable-automated-security-fixes func (s *RepositoriesService) DisableAutomatedSecurityFixes(ctx context.Context, owner, repository string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/automated-security-fixes", owner, repository) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches req.Header.Set("Accept", mediaTypeRequiredAutomatedSecurityFixesPreview) return s.client.Do(ctx, req, nil) } // ListContributors lists contributors for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-repository-contributors func (s *RepositoriesService) ListContributors(ctx context.Context, owner string, repository string, opts *ListContributorsOptions) ([]*Contributor, *Response, error) { u := fmt.Sprintf("repos/%v/%v/contributors", owner, repository) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var contributor []*Contributor resp, err := s.client.Do(ctx, req, &contributor) if err != nil { return nil, resp, err } return contributor, resp, nil } // ListLanguages lists languages for the specified repository. The returned map // specifies the languages and the number of bytes of code written in that // language. For example: // // { // "C": 78769, // "Python": 7769 // } // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-repository-languages func (s *RepositoriesService) ListLanguages(ctx context.Context, owner string, repo string) (map[string]int, *Response, error) { u := fmt.Sprintf("repos/%v/%v/languages", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } languages := make(map[string]int) resp, err := s.client.Do(ctx, req, &languages) if err != nil { return nil, resp, err } return languages, resp, nil } // ListTeams lists the teams for the specified repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-repository-teams func (s *RepositoriesService) ListTeams(ctx context.Context, owner string, repo string, opts *ListOptions) ([]*Team, *Response, error) { u := fmt.Sprintf("repos/%v/%v/teams", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var teams []*Team resp, err := s.client.Do(ctx, req, &teams) if err != nil { return nil, resp, err } return teams, resp, nil } // RepositoryTag represents a repository tag. type RepositoryTag struct { Name *string `json:"name,omitempty"` Commit *Commit `json:"commit,omitempty"` ZipballURL *string `json:"zipball_url,omitempty"` TarballURL *string `json:"tarball_url,omitempty"` } // ListTags lists tags for the specified repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-repository-tags func (s *RepositoriesService) ListTags(ctx context.Context, owner string, repo string, opts *ListOptions) ([]*RepositoryTag, *Response, error) { u := fmt.Sprintf("repos/%v/%v/tags", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var tags []*RepositoryTag resp, err := s.client.Do(ctx, req, &tags) if err != nil { return nil, resp, err } return tags, resp, nil } // Branch represents a repository branch type Branch struct { Name *string `json:"name,omitempty"` Commit *RepositoryCommit `json:"commit,omitempty"` Protected *bool `json:"protected,omitempty"` } // Protection represents a repository branch's protection. type Protection struct { RequiredStatusChecks *RequiredStatusChecks `json:"required_status_checks"` RequiredPullRequestReviews *PullRequestReviewsEnforcement `json:"required_pull_request_reviews"` EnforceAdmins *AdminEnforcement `json:"enforce_admins"` Restrictions *BranchRestrictions `json:"restrictions"` RequireLinearHistory *RequireLinearHistory `json:"required_linear_history"` AllowForcePushes *AllowForcePushes `json:"allow_force_pushes"` AllowDeletions *AllowDeletions `json:"allow_deletions"` RequiredConversationResolution *RequiredConversationResolution `json:"required_conversation_resolution"` } // ProtectionRequest represents a request to create/edit a branch's protection. type ProtectionRequest struct { RequiredStatusChecks *RequiredStatusChecks `json:"required_status_checks"` RequiredPullRequestReviews *PullRequestReviewsEnforcementRequest `json:"required_pull_request_reviews"` EnforceAdmins bool `json:"enforce_admins"` Restrictions *BranchRestrictionsRequest `json:"restrictions"` // Enforces a linear commit Git history, which prevents anyone from pushing merge commits to a branch. RequireLinearHistory *bool `json:"required_linear_history,omitempty"` // Permits force pushes to the protected branch by anyone with write access to the repository. AllowForcePushes *bool `json:"allow_force_pushes,omitempty"` // Allows deletion of the protected branch by anyone with write access to the repository. AllowDeletions *bool `json:"allow_deletions,omitempty"` // RequiredConversationResolution, if set to true, requires all comments // on the pull request to be resolved before it can be merged to a protected branch. RequiredConversationResolution *bool `json:"required_conversation_resolution,omitempty"` } // RequiredStatusChecks represents the protection status of a individual branch. type RequiredStatusChecks struct { // Require branches to be up to date before merging. (Required.) Strict bool `json:"strict"` // The list of status checks to require in order to merge into this // branch. (Required; use []string{} instead of nil for empty list.) Contexts []string `json:"contexts"` } // RequiredStatusChecksRequest represents a request to edit a protected branch's status checks. type RequiredStatusChecksRequest struct { Strict *bool `json:"strict,omitempty"` Contexts []string `json:"contexts,omitempty"` } // PullRequestReviewsEnforcement represents the pull request reviews enforcement of a protected branch. type PullRequestReviewsEnforcement struct { // Specifies which users and teams can dismiss pull request reviews. DismissalRestrictions *DismissalRestrictions `json:"dismissal_restrictions,omitempty"` // Specifies if approved reviews are dismissed automatically, when a new commit is pushed. DismissStaleReviews bool `json:"dismiss_stale_reviews"` // RequireCodeOwnerReviews specifies if an approved review is required in pull requests including files with a designated code owner. RequireCodeOwnerReviews bool `json:"require_code_owner_reviews"` // RequiredApprovingReviewCount specifies the number of approvals required before the pull request can be merged. // Valid values are 1-6. RequiredApprovingReviewCount int `json:"required_approving_review_count"` } // PullRequestReviewsEnforcementRequest represents request to set the pull request review // enforcement of a protected branch. It is separate from PullRequestReviewsEnforcement above // because the request structure is different from the response structure. type PullRequestReviewsEnforcementRequest struct { // Specifies which users and teams should be allowed to dismiss pull request reviews. // User and team dismissal restrictions are only available for // organization-owned repositories. Must be nil for personal repositories. DismissalRestrictionsRequest *DismissalRestrictionsRequest `json:"dismissal_restrictions,omitempty"` // Specifies if approved reviews can be dismissed automatically, when a new commit is pushed. (Required) DismissStaleReviews bool `json:"dismiss_stale_reviews"` // RequireCodeOwnerReviews specifies if an approved review is required in pull requests including files with a designated code owner. RequireCodeOwnerReviews bool `json:"require_code_owner_reviews"` // RequiredApprovingReviewCount specifies the number of approvals required before the pull request can be merged. // Valid values are 1-6. RequiredApprovingReviewCount int `json:"required_approving_review_count"` } // PullRequestReviewsEnforcementUpdate represents request to patch the pull request review // enforcement of a protected branch. It is separate from PullRequestReviewsEnforcementRequest above // because the patch request does not require all fields to be initialized. type PullRequestReviewsEnforcementUpdate struct { // Specifies which users and teams can dismiss pull request reviews. Can be omitted. DismissalRestrictionsRequest *DismissalRestrictionsRequest `json:"dismissal_restrictions,omitempty"` // Specifies if approved reviews can be dismissed automatically, when a new commit is pushed. Can be omitted. DismissStaleReviews *bool `json:"dismiss_stale_reviews,omitempty"` // RequireCodeOwnerReviews specifies if an approved review is required in pull requests including files with a designated code owner. RequireCodeOwnerReviews bool `json:"require_code_owner_reviews,omitempty"` // RequiredApprovingReviewCount specifies the number of approvals required before the pull request can be merged. // Valid values are 1 - 6. RequiredApprovingReviewCount int `json:"required_approving_review_count"` } // RequireLinearHistory represents the configuration to enforce branches with no merge commit. type RequireLinearHistory struct { Enabled bool `json:"enabled"` } // AllowDeletions represents the configuration to accept deletion of protected branches. type AllowDeletions struct { Enabled bool `json:"enabled"` } // AllowForcePushes represents the configuration to accept forced pushes on protected branches. type AllowForcePushes struct { Enabled bool `json:"enabled"` } // RequiredConversationResolution, if enabled, requires all comments on the pull request to be resolved before it can be merged to a protected branch. type RequiredConversationResolution struct { Enabled bool `json:"enabled"` } // AdminEnforcement represents the configuration to enforce required status checks for repository administrators. type AdminEnforcement struct { URL *string `json:"url,omitempty"` Enabled bool `json:"enabled"` } // BranchRestrictions represents the restriction that only certain users or // teams may push to a branch. type BranchRestrictions struct { // The list of user logins with push access. Users []*User `json:"users"` // The list of team slugs with push access. Teams []*Team `json:"teams"` // The list of app slugs with push access. Apps []*App `json:"apps"` } // BranchRestrictionsRequest represents the request to create/edit the // restriction that only certain users or teams may push to a branch. It is // separate from BranchRestrictions above because the request structure is // different from the response structure. type BranchRestrictionsRequest struct { // The list of user logins with push access. (Required; use []string{} instead of nil for empty list.) Users []string `json:"users"` // The list of team slugs with push access. (Required; use []string{} instead of nil for empty list.) Teams []string `json:"teams"` // The list of app slugs with push access. Apps []string `json:"apps,omitempty"` } // DismissalRestrictions specifies which users and teams can dismiss pull request reviews. type DismissalRestrictions struct { // The list of users who can dimiss pull request reviews. Users []*User `json:"users"` // The list of teams which can dismiss pull request reviews. Teams []*Team `json:"teams"` } // DismissalRestrictionsRequest represents the request to create/edit the // restriction to allows only specific users or teams to dimiss pull request reviews. It is // separate from DismissalRestrictions above because the request structure is // different from the response structure. // Note: Both Users and Teams must be nil, or both must be non-nil. type DismissalRestrictionsRequest struct { // The list of user logins who can dismiss pull request reviews. (Required; use nil to disable dismissal_restrictions or &[]string{} otherwise.) Users *[]string `json:"users,omitempty"` // The list of team slugs which can dismiss pull request reviews. (Required; use nil to disable dismissal_restrictions or &[]string{} otherwise.) Teams *[]string `json:"teams,omitempty"` } // SignaturesProtectedBranch represents the protection status of an individual branch. type SignaturesProtectedBranch struct { URL *string `json:"url,omitempty"` // Commits pushed to matching branches must have verified signatures. Enabled *bool `json:"enabled,omitempty"` } // ListBranches lists branches for the specified repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-branches func (s *RepositoriesService) ListBranches(ctx context.Context, owner string, repo string, opts *BranchListOptions) ([]*Branch, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var branches []*Branch resp, err := s.client.Do(ctx, req, &branches) if err != nil { return nil, resp, err } return branches, resp, nil } // GetBranch gets the specified branch for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-branch func (s *RepositoriesService) GetBranch(ctx context.Context, owner, repo, branch string, followRedirects bool) (*Branch, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v", owner, repo, branch) resp, err := s.getBranchFromURL(ctx, u, followRedirects) if err != nil { return nil, nil, err } defer resp.Body.Close() if resp.StatusCode != http.StatusOK { return nil, newResponse(resp), fmt.Errorf("unexpected status code: %s", resp.Status) } b := new(Branch) err = json.NewDecoder(resp.Body).Decode(b) return b, newResponse(resp), err } func (s *RepositoriesService) getBranchFromURL(ctx context.Context, u string, followRedirects bool) (*http.Response, error) { req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, err } var resp *http.Response // Use http.DefaultTransport if no custom Transport is configured req = withContext(ctx, req) if s.client.client.Transport == nil { resp, err = http.DefaultTransport.RoundTrip(req) } else { resp, err = s.client.client.Transport.RoundTrip(req) } if err != nil { return nil, err } // If redirect response is returned, follow it if followRedirects && resp.StatusCode == http.StatusMovedPermanently { resp.Body.Close() u = resp.Header.Get("Location") resp, err = s.getBranchFromURL(ctx, u, false) } return resp, err } // GetBranchProtection gets the protection of a given branch. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-branch-protection func (s *RepositoriesService) GetBranchProtection(ctx context.Context, owner, repo, branch string) (*Protection, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection", owner, repo, branch) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview) p := new(Protection) resp, err := s.client.Do(ctx, req, p) if err != nil { return nil, resp, err } return p, resp, nil } // GetRequiredStatusChecks gets the required status checks for a given protected branch. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-status-checks-protection func (s *RepositoriesService) GetRequiredStatusChecks(ctx context.Context, owner, repo, branch string) (*RequiredStatusChecks, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks", owner, repo, branch) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } p := new(RequiredStatusChecks) resp, err := s.client.Do(ctx, req, p) if err != nil { return nil, resp, err } return p, resp, nil } // ListRequiredStatusChecksContexts lists the required status checks contexts for a given protected branch. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-all-status-check-contexts func (s *RepositoriesService) ListRequiredStatusChecksContexts(ctx context.Context, owner, repo, branch string) (contexts []string, resp *Response, err error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks/contexts", owner, repo, branch) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } resp, err = s.client.Do(ctx, req, &contexts) if err != nil { return nil, resp, err } return contexts, resp, nil } // UpdateBranchProtection updates the protection of a given branch. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#update-branch-protection func (s *RepositoriesService) UpdateBranchProtection(ctx context.Context, owner, repo, branch string, preq *ProtectionRequest) (*Protection, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection", owner, repo, branch) req, err := s.client.NewRequest("PUT", u, preq) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview) p := new(Protection) resp, err := s.client.Do(ctx, req, p) if err != nil { return nil, resp, err } return p, resp, nil } // RemoveBranchProtection removes the protection of a given branch. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#delete-branch-protection func (s *RepositoriesService) RemoveBranchProtection(ctx context.Context, owner, repo, branch string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection", owner, repo, branch) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // GetSignaturesProtectedBranch gets required signatures of protected branch. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-commit-signature-protection func (s *RepositoriesService) GetSignaturesProtectedBranch(ctx context.Context, owner, repo, branch string) (*SignaturesProtectedBranch, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_signatures", owner, repo, branch) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches req.Header.Set("Accept", mediaTypeSignaturePreview) p := new(SignaturesProtectedBranch) resp, err := s.client.Do(ctx, req, p) if err != nil { return nil, resp, err } return p, resp, nil } // RequireSignaturesOnProtectedBranch makes signed commits required on a protected branch. // It requires admin access and branch protection to be enabled. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-commit-signature-protection func (s *RepositoriesService) RequireSignaturesOnProtectedBranch(ctx context.Context, owner, repo, branch string) (*SignaturesProtectedBranch, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_signatures", owner, repo, branch) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches req.Header.Set("Accept", mediaTypeSignaturePreview) r := new(SignaturesProtectedBranch) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, err } // OptionalSignaturesOnProtectedBranch removes required signed commits on a given branch. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#delete-commit-signature-protection func (s *RepositoriesService) OptionalSignaturesOnProtectedBranch(ctx context.Context, owner, repo, branch string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_signatures", owner, repo, branch) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches req.Header.Set("Accept", mediaTypeSignaturePreview) return s.client.Do(ctx, req, nil) } // UpdateRequiredStatusChecks updates the required status checks for a given protected branch. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#update-status-check-protection func (s *RepositoriesService) UpdateRequiredStatusChecks(ctx context.Context, owner, repo, branch string, sreq *RequiredStatusChecksRequest) (*RequiredStatusChecks, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks", owner, repo, branch) req, err := s.client.NewRequest("PATCH", u, sreq) if err != nil { return nil, nil, err } sc := new(RequiredStatusChecks) resp, err := s.client.Do(ctx, req, sc) if err != nil { return nil, resp, err } return sc, resp, nil } // RemoveRequiredStatusChecks removes the required status checks for a given protected branch. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos#remove-status-check-protection func (s *RepositoriesService) RemoveRequiredStatusChecks(ctx context.Context, owner, repo, branch string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_status_checks", owner, repo, branch) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // License gets the contents of a repository's license if one is detected. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/licenses/#get-the-license-for-a-repository func (s *RepositoriesService) License(ctx context.Context, owner, repo string) (*RepositoryLicense, *Response, error) { u := fmt.Sprintf("repos/%v/%v/license", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } r := &RepositoryLicense{} resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // GetPullRequestReviewEnforcement gets pull request review enforcement of a protected branch. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-pull-request-review-protection func (s *RepositoriesService) GetPullRequestReviewEnforcement(ctx context.Context, owner, repo, branch string) (*PullRequestReviewsEnforcement, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview) r := new(PullRequestReviewsEnforcement) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // UpdatePullRequestReviewEnforcement patches pull request review enforcement of a protected branch. // It requires admin access and branch protection to be enabled. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#update-pull-request-review-protection func (s *RepositoriesService) UpdatePullRequestReviewEnforcement(ctx context.Context, owner, repo, branch string, patch *PullRequestReviewsEnforcementUpdate) (*PullRequestReviewsEnforcement, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch) req, err := s.client.NewRequest("PATCH", u, patch) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview) r := new(PullRequestReviewsEnforcement) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, err } // DisableDismissalRestrictions disables dismissal restrictions of a protected branch. // It requires admin access and branch protection to be enabled. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#update-pull-request-review-protection func (s *RepositoriesService) DisableDismissalRestrictions(ctx context.Context, owner, repo, branch string) (*PullRequestReviewsEnforcement, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch) data := new(struct { DismissalRestrictionsRequest `json:"dismissal_restrictions"` }) req, err := s.client.NewRequest("PATCH", u, data) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches req.Header.Set("Accept", mediaTypeRequiredApprovingReviewsPreview) r := new(PullRequestReviewsEnforcement) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, err } // RemovePullRequestReviewEnforcement removes pull request enforcement of a protected branch. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#delete-pull-request-review-protection func (s *RepositoriesService) RemovePullRequestReviewEnforcement(ctx context.Context, owner, repo, branch string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/required_pull_request_reviews", owner, repo, branch) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // GetAdminEnforcement gets admin enforcement information of a protected branch. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-admin-branch-protection func (s *RepositoriesService) GetAdminEnforcement(ctx context.Context, owner, repo, branch string) (*AdminEnforcement, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/enforce_admins", owner, repo, branch) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } r := new(AdminEnforcement) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // AddAdminEnforcement adds admin enforcement to a protected branch. // It requires admin access and branch protection to be enabled. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#set-admin-branch-protection func (s *RepositoriesService) AddAdminEnforcement(ctx context.Context, owner, repo, branch string) (*AdminEnforcement, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/enforce_admins", owner, repo, branch) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, nil, err } r := new(AdminEnforcement) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, err } // RemoveAdminEnforcement removes admin enforcement from a protected branch. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#delete-admin-branch-protection func (s *RepositoriesService) RemoveAdminEnforcement(ctx context.Context, owner, repo, branch string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/enforce_admins", owner, repo, branch) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // repositoryTopics represents a collection of repository topics. type repositoryTopics struct { Names []string `json:"names"` } // ListAllTopics lists topics for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-all-repository-topics func (s *RepositoriesService) ListAllTopics(ctx context.Context, owner, repo string) ([]string, *Response, error) { u := fmt.Sprintf("repos/%v/%v/topics", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeTopicsPreview) topics := new(repositoryTopics) resp, err := s.client.Do(ctx, req, topics) if err != nil { return nil, resp, err } return topics.Names, resp, nil } // ReplaceAllTopics replaces topics for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#replace-all-repository-topics func (s *RepositoriesService) ReplaceAllTopics(ctx context.Context, owner, repo string, topics []string) ([]string, *Response, error) { u := fmt.Sprintf("repos/%v/%v/topics", owner, repo) t := &repositoryTopics{ Names: topics, } if t.Names == nil { t.Names = []string{} } req, err := s.client.NewRequest("PUT", u, t) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeTopicsPreview) t = new(repositoryTopics) resp, err := s.client.Do(ctx, req, t) if err != nil { return nil, resp, err } return t.Names, resp, nil } // ListApps lists the GitHub apps that have push access to a given protected branch. // It requires the GitHub apps to have `write` access to the `content` permission. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-apps-with-access-to-the-protected-branch func (s *RepositoriesService) ListApps(ctx context.Context, owner, repo, branch string) ([]*App, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var apps []*App resp, err := s.client.Do(ctx, req, &apps) if err != nil { return nil, resp, err } return apps, resp, nil } // ReplaceAppRestrictions replaces the apps that have push access to a given protected branch. // It removes all apps that previously had push access and grants push access to the new list of apps. // It requires the GitHub apps to have `write` access to the `content` permission. // // Note: The list of users, apps, and teams in total is limited to 100 items. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#set-app-access-restrictions func (s *RepositoriesService) ReplaceAppRestrictions(ctx context.Context, owner, repo, branch string, slug []string) ([]*App, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch) req, err := s.client.NewRequest("PUT", u, slug) if err != nil { return nil, nil, err } var apps []*App resp, err := s.client.Do(ctx, req, &apps) if err != nil { return nil, resp, err } return apps, resp, nil } // AddAppRestrictions grants the specified apps push access to a given protected branch. // It requires the GitHub apps to have `write` access to the `content` permission. // // Note: The list of users, apps, and teams in total is limited to 100 items. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#add-app-access-restrictions func (s *RepositoriesService) AddAppRestrictions(ctx context.Context, owner, repo, branch string, slug []string) ([]*App, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch) req, err := s.client.NewRequest("POST", u, slug) if err != nil { return nil, nil, err } var apps []*App resp, err := s.client.Do(ctx, req, &apps) if err != nil { return nil, resp, err } return apps, resp, nil } // RemoveAppRestrictions removes the ability of an app to push to this branch. // It requires the GitHub apps to have `write` access to the `content` permission. // // Note: The list of users, apps, and teams in total is limited to 100 items. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#remove-app-access-restrictions func (s *RepositoriesService) RemoveAppRestrictions(ctx context.Context, owner, repo, branch string, slug []string) ([]*App, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, branch) req, err := s.client.NewRequest("DELETE", u, slug) if err != nil { return nil, nil, err } var apps []*App resp, err := s.client.Do(ctx, req, &apps) if err != nil { return nil, resp, err } return apps, resp, nil } // TransferRequest represents a request to transfer a repository. type TransferRequest struct { NewOwner string `json:"new_owner"` TeamID []int64 `json:"team_ids,omitempty"` } // Transfer transfers a repository from one account or organization to another. // // This method might return an *AcceptedError and a status code of // 202. This is because this is the status that GitHub returns to signify that // it has now scheduled the transfer of the repository in a background task. // A follow up request, after a delay of a second or so, should result // in a successful request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#transfer-a-repository func (s *RepositoriesService) Transfer(ctx context.Context, owner, repo string, transfer TransferRequest) (*Repository, *Response, error) { u := fmt.Sprintf("repos/%v/%v/transfer", owner, repo) req, err := s.client.NewRequest("POST", u, &transfer) if err != nil { return nil, nil, err } r := new(Repository) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // DispatchRequestOptions represents a request to trigger a repository_dispatch event. type DispatchRequestOptions struct { // EventType is a custom webhook event name. (Required.) EventType string `json:"event_type"` // ClientPayload is a custom JSON payload with extra information about the webhook event. // Defaults to an empty JSON object. ClientPayload *json.RawMessage `json:"client_payload,omitempty"` } // Dispatch triggers a repository_dispatch event in a GitHub Actions workflow. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-a-repository-dispatch-event func (s *RepositoriesService) Dispatch(ctx context.Context, owner, repo string, opts DispatchRequestOptions) (*Repository, *Response, error) { u := fmt.Sprintf("repos/%v/%v/dispatches", owner, repo) req, err := s.client.NewRequest("POST", u, &opts) if err != nil { return nil, nil, err } r := new(Repository) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } go-github-38.1.0/github/repos_collaborators.go000066400000000000000000000141371410475703100213670ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" ) // ListCollaboratorsOptions specifies the optional parameters to the // RepositoriesService.ListCollaborators method. type ListCollaboratorsOptions struct { // Affiliation specifies how collaborators should be filtered by their affiliation. // Possible values are: // outside - All outside collaborators of an organization-owned repository // direct - All collaborators with permissions to an organization-owned repository, // regardless of organization membership status // all - All collaborators the authenticated user can see // // Default value is "all". Affiliation string `url:"affiliation,omitempty"` ListOptions } // CollaboratorInvitation represents an invitation created when adding a collaborator. // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/collaborators/#response-when-a-new-invitation-is-created type CollaboratorInvitation struct { ID *int64 `json:"id,omitempty"` Repo *Repository `json:"repository,omitempty"` Invitee *User `json:"invitee,omitempty"` Inviter *User `json:"inviter,omitempty"` Permissions *string `json:"permissions,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` } // ListCollaborators lists the GitHub users that have access to the repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-repository-collaborators func (s *RepositoriesService) ListCollaborators(ctx context.Context, owner, repo string, opts *ListCollaboratorsOptions) ([]*User, *Response, error) { u := fmt.Sprintf("repos/%v/%v/collaborators", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var users []*User resp, err := s.client.Do(ctx, req, &users) if err != nil { return nil, resp, err } return users, resp, nil } // IsCollaborator checks whether the specified GitHub user has collaborator // access to the given repo. // Note: This will return false if the user is not a collaborator OR the user // is not a GitHub user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#check-if-a-user-is-a-repository-collaborator func (s *RepositoriesService) IsCollaborator(ctx context.Context, owner, repo, user string) (bool, *Response, error) { u := fmt.Sprintf("repos/%v/%v/collaborators/%v", owner, repo, user) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return false, nil, err } resp, err := s.client.Do(ctx, req, nil) isCollab, err := parseBoolResponse(err) return isCollab, resp, err } // RepositoryPermissionLevel represents the permission level an organization // member has for a given repository. type RepositoryPermissionLevel struct { // Possible values: "admin", "write", "read", "none" Permission *string `json:"permission,omitempty"` User *User `json:"user,omitempty"` } // GetPermissionLevel retrieves the specific permission level a collaborator has for a given repository. // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-repository-permissions-for-a-user func (s *RepositoriesService) GetPermissionLevel(ctx context.Context, owner, repo, user string) (*RepositoryPermissionLevel, *Response, error) { u := fmt.Sprintf("repos/%v/%v/collaborators/%v/permission", owner, repo, user) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } rpl := new(RepositoryPermissionLevel) resp, err := s.client.Do(ctx, req, rpl) if err != nil { return nil, resp, err } return rpl, resp, nil } // RepositoryAddCollaboratorOptions specifies the optional parameters to the // RepositoriesService.AddCollaborator method. type RepositoryAddCollaboratorOptions struct { // Permission specifies the permission to grant the user on this repository. // Possible values are: // pull - team members can pull, but not push to or administer this repository // push - team members can pull and push, but not administer this repository // admin - team members can pull, push and administer this repository // maintain - team members can manage the repository without access to sensitive or destructive actions. // triage - team members can proactively manage issues and pull requests without write access. // // Default value is "push". This option is only valid for organization-owned repositories. Permission string `json:"permission,omitempty"` } // AddCollaborator sends an invitation to the specified GitHub user // to become a collaborator to the given repo. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#add-a-repository-collaborator func (s *RepositoriesService) AddCollaborator(ctx context.Context, owner, repo, user string, opts *RepositoryAddCollaboratorOptions) (*CollaboratorInvitation, *Response, error) { u := fmt.Sprintf("repos/%v/%v/collaborators/%v", owner, repo, user) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, nil, err } acr := new(CollaboratorInvitation) resp, err := s.client.Do(ctx, req, acr) if err != nil { return nil, resp, err } return acr, resp, nil } // RemoveCollaborator removes the specified GitHub user as collaborator from the given repo. // Note: Does not return error if a valid user that is not a collaborator is removed. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#remove-a-repository-collaborator func (s *RepositoriesService) RemoveCollaborator(ctx context.Context, owner, repo, user string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/collaborators/%v", owner, repo, user) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/repos_collaborators_test.go000066400000000000000000000335651410475703100224340ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_ListCollaborators(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/collaborators", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprintf(w, `[{"id":1}, {"id":2}]`) }) opt := &ListCollaboratorsOptions{ ListOptions: ListOptions{Page: 2}, } ctx := context.Background() users, _, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListCollaborators returned error: %v", err) } want := []*User{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(users, want) { t.Errorf("Repositories.ListCollaborators returned %+v, want %+v", users, want) } const methodName = "ListCollaborators" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListCollaborators(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListCollaborators_withAffiliation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/collaborators", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"affiliation": "all", "page": "2"}) fmt.Fprintf(w, `[{"id":1}, {"id":2}]`) }) opt := &ListCollaboratorsOptions{ ListOptions: ListOptions{Page: 2}, Affiliation: "all", } ctx := context.Background() users, _, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListCollaborators returned error: %v", err) } want := []*User{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(users, want) { t.Errorf("Repositories.ListCollaborators returned %+v, want %+v", users, want) } const methodName = "ListCollaborators" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListCollaborators(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListCollaborators(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListCollaborators_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.ListCollaborators(ctx, "%", "%", nil) testURLParseError(t, err) } func TestRepositoriesService_IsCollaborator_True(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/collaborators/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() isCollab, _, err := client.Repositories.IsCollaborator(ctx, "o", "r", "u") if err != nil { t.Errorf("Repositories.IsCollaborator returned error: %v", err) } if !isCollab { t.Errorf("Repositories.IsCollaborator returned false, want true") } const methodName = "IsCollaborator" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.IsCollaborator(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.IsCollaborator(ctx, "o", "r", "u") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) } return resp, err }) } func TestRepositoriesService_IsCollaborator_False(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/collaborators/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() isCollab, _, err := client.Repositories.IsCollaborator(ctx, "o", "r", "u") if err != nil { t.Errorf("Repositories.IsCollaborator returned error: %v", err) } if isCollab { t.Errorf("Repositories.IsCollaborator returned true, want false") } const methodName = "IsCollaborator" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.IsCollaborator(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.IsCollaborator(ctx, "o", "r", "u") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) } return resp, err }) } func TestRepositoriesService_IsCollaborator_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.IsCollaborator(ctx, "%", "%", "%") testURLParseError(t, err) } func TestRepositoryService_GetPermissionLevel(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/collaborators/u/permission", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprintf(w, `{"permission":"admin","user":{"login":"u"}}`) }) ctx := context.Background() rpl, _, err := client.Repositories.GetPermissionLevel(ctx, "o", "r", "u") if err != nil { t.Errorf("Repositories.GetPermissionLevel returned error: %v", err) } want := &RepositoryPermissionLevel{ Permission: String("admin"), User: &User{ Login: String("u"), }, } if !cmp.Equal(rpl, want) { t.Errorf("Repositories.GetPermissionLevel returned %+v, want %+v", rpl, want) } const methodName = "GetPermissionLevel" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetPermissionLevel(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetPermissionLevel(ctx, "o", "r", "u") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_AddCollaborator(t *testing.T) { client, mux, _, teardown := setup() defer teardown() opt := &RepositoryAddCollaboratorOptions{Permission: "admin"} mux.HandleFunc("/repos/o/r/collaborators/u", func(w http.ResponseWriter, r *http.Request) { v := new(RepositoryAddCollaboratorOptions) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, opt) { t.Errorf("Request body = %+v, want %+v", v, opt) } w.WriteHeader(http.StatusOK) w.Write([]byte(`{"permissions": "write","url": "https://api.github.com/user/repository_invitations/1296269","html_url": "https://github.com/octocat/Hello-World/invitations","id":1,"permissions":"write","repository":{"url":"s","name":"r","id":1},"invitee":{"login":"u"},"inviter":{"login":"o"}}`)) }) ctx := context.Background() collaboratorInvitation, _, err := client.Repositories.AddCollaborator(ctx, "o", "r", "u", opt) if err != nil { t.Errorf("Repositories.AddCollaborator returned error: %v", err) } want := &CollaboratorInvitation{ ID: Int64(1), Repo: &Repository{ ID: Int64(1), URL: String("s"), Name: String("r"), }, Invitee: &User{ Login: String("u"), }, Inviter: &User{ Login: String("o"), }, Permissions: String("write"), URL: String("https://api.github.com/user/repository_invitations/1296269"), HTMLURL: String("https://github.com/octocat/Hello-World/invitations"), } if !cmp.Equal(collaboratorInvitation, want) { t.Errorf("AddCollaborator returned %+v, want %+v", collaboratorInvitation, want) } const methodName = "AddCollaborator" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.AddCollaborator(ctx, "\n", "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.AddCollaborator(ctx, "o", "r", "u", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_AddCollaborator_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.AddCollaborator(ctx, "%", "%", "%", nil) testURLParseError(t, err) } func TestRepositoriesService_RemoveCollaborator(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/collaborators/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Repositories.RemoveCollaborator(ctx, "o", "r", "u") if err != nil { t.Errorf("Repositories.RemoveCollaborator returned error: %v", err) } const methodName = "RemoveCollaborator" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.RemoveCollaborator(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.RemoveCollaborator(ctx, "o", "r", "u") }) } func TestRepositoriesService_RemoveCollaborator_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Repositories.RemoveCollaborator(ctx, "%", "%", "%") testURLParseError(t, err) } func TestRepositoryAddCollaboratorOptions_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryAddCollaboratorOptions{}, "{}") r := &RepositoryAddCollaboratorOptions{ Permission: "permission", } want := `{ "permission": "permission" }` testJSONMarshal(t, r, want) } func TestRepositoryPermissionLevel_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryPermissionLevel{}, "{}") r := &RepositoryPermissionLevel{ Permission: String("permission"), User: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, } want := `{ "permission": "permission", "user": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" } }` testJSONMarshal(t, r, want) } func TestCollaboratorInvitation_Marshal(t *testing.T) { testJSONMarshal(t, &CollaboratorInvitation{}, "{}") r := &CollaboratorInvitation{ ID: Int64(1), Repo: &Repository{ ID: Int64(1), URL: String("url"), Name: String("n"), }, Invitee: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Inviter: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Permissions: String("per"), CreatedAt: &Timestamp{referenceTime}, URL: String("url"), HTMLURL: String("hurl"), } want := `{ "id": 1, "repository": { "id": 1, "name": "n", "url": "url" }, "invitee": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "inviter": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "permissions": "per", "created_at": ` + referenceTimeStr + `, "url": "url", "html_url": "hurl" }` testJSONMarshal(t, r, want) } go-github-38.1.0/github/repos_comments.go000066400000000000000000000122341410475703100203420ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "time" ) // RepositoryComment represents a comment for a commit, file, or line in a repository. type RepositoryComment struct { HTMLURL *string `json:"html_url,omitempty"` URL *string `json:"url,omitempty"` ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` CommitID *string `json:"commit_id,omitempty"` User *User `json:"user,omitempty"` Reactions *Reactions `json:"reactions,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` UpdatedAt *time.Time `json:"updated_at,omitempty"` // User-mutable fields Body *string `json:"body"` // User-initialized fields Path *string `json:"path,omitempty"` Position *int `json:"position,omitempty"` } func (r RepositoryComment) String() string { return Stringify(r) } // ListComments lists all the comments for the repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-commit-comments-for-a-repository func (s *RepositoriesService) ListComments(ctx context.Context, owner, repo string, opts *ListOptions) ([]*RepositoryComment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/comments", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeReactionsPreview) var comments []*RepositoryComment resp, err := s.client.Do(ctx, req, &comments) if err != nil { return nil, resp, err } return comments, resp, nil } // ListCommitComments lists all the comments for a given commit SHA. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-commit-comments func (s *RepositoriesService) ListCommitComments(ctx context.Context, owner, repo, sha string, opts *ListOptions) ([]*RepositoryComment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/commits/%v/comments", owner, repo, sha) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeReactionsPreview) var comments []*RepositoryComment resp, err := s.client.Do(ctx, req, &comments) if err != nil { return nil, resp, err } return comments, resp, nil } // CreateComment creates a comment for the given commit. // Note: GitHub allows for comments to be created for non-existing files and positions. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-a-commit-comment func (s *RepositoriesService) CreateComment(ctx context.Context, owner, repo, sha string, comment *RepositoryComment) (*RepositoryComment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/commits/%v/comments", owner, repo, sha) req, err := s.client.NewRequest("POST", u, comment) if err != nil { return nil, nil, err } c := new(RepositoryComment) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } // GetComment gets a single comment from a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-commit-comment func (s *RepositoriesService) GetComment(ctx context.Context, owner, repo string, id int64) (*RepositoryComment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/comments/%v", owner, repo, id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeReactionsPreview) c := new(RepositoryComment) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } // UpdateComment updates the body of a single comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#update-a-commit-comment func (s *RepositoriesService) UpdateComment(ctx context.Context, owner, repo string, id int64, comment *RepositoryComment) (*RepositoryComment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/comments/%v", owner, repo, id) req, err := s.client.NewRequest("PATCH", u, comment) if err != nil { return nil, nil, err } c := new(RepositoryComment) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } // DeleteComment deletes a single comment from a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#delete-a-commit-comment func (s *RepositoriesService) DeleteComment(ctx context.Context, owner, repo string, id int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/comments/%v", owner, repo, id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/repos_comments_test.go000066400000000000000000000251651410475703100214100ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_ListComments(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/comments", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}, {"id":2}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() comments, _, err := client.Repositories.ListComments(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListComments returned error: %v", err) } want := []*RepositoryComment{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(comments, want) { t.Errorf("Repositories.ListComments returned %+v, want %+v", comments, want) } const methodName = "ListComments" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListComments(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListComments(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListComments_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.ListComments(ctx, "%", "%", nil) testURLParseError(t, err) } func TestRepositoriesService_ListCommitComments(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/commits/s/comments", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}, {"id":2}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() comments, _, err := client.Repositories.ListCommitComments(ctx, "o", "r", "s", opt) if err != nil { t.Errorf("Repositories.ListCommitComments returned error: %v", err) } want := []*RepositoryComment{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(comments, want) { t.Errorf("Repositories.ListCommitComments returned %+v, want %+v", comments, want) } const methodName = "ListCommitComments" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListCommitComments(ctx, "\n", "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListCommitComments(ctx, "o", "r", "s", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListCommitComments_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.ListCommitComments(ctx, "%", "%", "%", nil) testURLParseError(t, err) } func TestRepositoriesService_CreateComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &RepositoryComment{Body: String("b")} mux.HandleFunc("/repos/o/r/commits/s/comments", func(w http.ResponseWriter, r *http.Request) { v := new(RepositoryComment) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() comment, _, err := client.Repositories.CreateComment(ctx, "o", "r", "s", input) if err != nil { t.Errorf("Repositories.CreateComment returned error: %v", err) } want := &RepositoryComment{ID: Int64(1)} if !cmp.Equal(comment, want) { t.Errorf("Repositories.CreateComment returned %+v, want %+v", comment, want) } const methodName = "CreateComment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateComment(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateComment(ctx, "o", "r", "s", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_CreateComment_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.CreateComment(ctx, "%", "%", "%", nil) testURLParseError(t, err) } func TestRepositoriesService_GetComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/comments/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeReactionsPreview) fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() comment, _, err := client.Repositories.GetComment(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.GetComment returned error: %v", err) } want := &RepositoryComment{ID: Int64(1)} if !cmp.Equal(comment, want) { t.Errorf("Repositories.GetComment returned %+v, want %+v", comment, want) } const methodName = "GetComment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetComment(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetComment(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetComment_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.GetComment(ctx, "%", "%", 1) testURLParseError(t, err) } func TestRepositoriesService_UpdateComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &RepositoryComment{Body: String("b")} mux.HandleFunc("/repos/o/r/comments/1", func(w http.ResponseWriter, r *http.Request) { v := new(RepositoryComment) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() comment, _, err := client.Repositories.UpdateComment(ctx, "o", "r", 1, input) if err != nil { t.Errorf("Repositories.UpdateComment returned error: %v", err) } want := &RepositoryComment{ID: Int64(1)} if !cmp.Equal(comment, want) { t.Errorf("Repositories.UpdateComment returned %+v, want %+v", comment, want) } const methodName = "UpdateComment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.UpdateComment(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.UpdateComment(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_UpdateComment_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.UpdateComment(ctx, "%", "%", 1, nil) testURLParseError(t, err) } func TestRepositoriesService_DeleteComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/comments/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Repositories.DeleteComment(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.DeleteComment returned error: %v", err) } const methodName = "DeleteComment" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.DeleteComment(ctx, "\n", "\n", 1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DeleteComment(ctx, "o", "r", 1) }) } func TestRepositoriesService_DeleteComment_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Repositories.DeleteComment(ctx, "%", "%", 1) testURLParseError(t, err) } func TestRepositoryComment_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryComment{}, "{}") r := &RepositoryComment{ HTMLURL: String("hurl"), URL: String("url"), ID: Int64(1), NodeID: String("nid"), CommitID: String("cid"), User: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Reactions: &Reactions{ TotalCount: Int(1), PlusOne: Int(1), MinusOne: Int(1), Laugh: Int(1), Confused: Int(1), Heart: Int(1), Hooray: Int(1), Rocket: Int(1), Eyes: Int(1), URL: String("u"), }, CreatedAt: &referenceTime, UpdatedAt: &referenceTime, Body: String("body"), Path: String("path"), Position: Int(1), } want := `{ "html_url": "hurl", "url": "url", "id": 1, "node_id": "nid", "commit_id": "cid", "user": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "reactions": { "total_count": 1, "+1": 1, "-1": 1, "laugh": 1, "confused": 1, "heart": 1, "hooray": 1, "rocket": 1, "eyes": 1, "url": "u" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "body": "body", "path": "path", "position": 1 }` testJSONMarshal(t, r, want) } go-github-38.1.0/github/repos_commits.go000066400000000000000000000237301410475703100201730ustar00rootroot00000000000000// Copyright 2013 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 ( "bytes" "context" "fmt" "net/url" "time" ) // RepositoryCommit represents a commit in a repo. // Note that it's wrapping a Commit, so author/committer information is in two places, // but contain different details about them: in RepositoryCommit "github details", in Commit - "git details". type RepositoryCommit struct { NodeID *string `json:"node_id,omitempty"` SHA *string `json:"sha,omitempty"` Commit *Commit `json:"commit,omitempty"` Author *User `json:"author,omitempty"` Committer *User `json:"committer,omitempty"` Parents []*Commit `json:"parents,omitempty"` HTMLURL *string `json:"html_url,omitempty"` URL *string `json:"url,omitempty"` CommentsURL *string `json:"comments_url,omitempty"` // Details about how many changes were made in this commit. Only filled in during GetCommit! Stats *CommitStats `json:"stats,omitempty"` // Details about which files, and how this commit touched. Only filled in during GetCommit! Files []*CommitFile `json:"files,omitempty"` } func (r RepositoryCommit) String() string { return Stringify(r) } // CommitStats represents the number of additions / deletions from a file in a given RepositoryCommit or GistCommit. type CommitStats struct { Additions *int `json:"additions,omitempty"` Deletions *int `json:"deletions,omitempty"` Total *int `json:"total,omitempty"` } func (c CommitStats) String() string { return Stringify(c) } // CommitFile represents a file modified in a commit. type CommitFile struct { SHA *string `json:"sha,omitempty"` Filename *string `json:"filename,omitempty"` Additions *int `json:"additions,omitempty"` Deletions *int `json:"deletions,omitempty"` Changes *int `json:"changes,omitempty"` Status *string `json:"status,omitempty"` Patch *string `json:"patch,omitempty"` BlobURL *string `json:"blob_url,omitempty"` RawURL *string `json:"raw_url,omitempty"` ContentsURL *string `json:"contents_url,omitempty"` PreviousFilename *string `json:"previous_filename,omitempty"` } func (c CommitFile) String() string { return Stringify(c) } // CommitsComparison is the result of comparing two commits. // See CompareCommits() for details. type CommitsComparison struct { BaseCommit *RepositoryCommit `json:"base_commit,omitempty"` MergeBaseCommit *RepositoryCommit `json:"merge_base_commit,omitempty"` // Head can be 'behind' or 'ahead' Status *string `json:"status,omitempty"` AheadBy *int `json:"ahead_by,omitempty"` BehindBy *int `json:"behind_by,omitempty"` TotalCommits *int `json:"total_commits,omitempty"` Commits []*RepositoryCommit `json:"commits,omitempty"` Files []*CommitFile `json:"files,omitempty"` HTMLURL *string `json:"html_url,omitempty"` PermalinkURL *string `json:"permalink_url,omitempty"` DiffURL *string `json:"diff_url,omitempty"` PatchURL *string `json:"patch_url,omitempty"` URL *string `json:"url,omitempty"` // API URL. } func (c CommitsComparison) String() string { return Stringify(c) } // CommitsListOptions specifies the optional parameters to the // RepositoriesService.ListCommits method. type CommitsListOptions struct { // SHA or branch to start listing Commits from. SHA string `url:"sha,omitempty"` // Path that should be touched by the returned Commits. Path string `url:"path,omitempty"` // Author of by which to filter Commits. Author string `url:"author,omitempty"` // Since when should Commits be included in the response. Since time.Time `url:"since,omitempty"` // Until when should Commits be included in the response. Until time.Time `url:"until,omitempty"` ListOptions } // BranchCommit is the result of listing branches with commit SHA. type BranchCommit struct { Name *string `json:"name,omitempty"` Commit *Commit `json:"commit,omitempty"` Protected *bool `json:"protected,omitempty"` } // ListCommits lists the commits of a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-commits func (s *RepositoriesService) ListCommits(ctx context.Context, owner, repo string, opts *CommitsListOptions) ([]*RepositoryCommit, *Response, error) { u := fmt.Sprintf("repos/%v/%v/commits", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var commits []*RepositoryCommit resp, err := s.client.Do(ctx, req, &commits) if err != nil { return nil, resp, err } return commits, resp, nil } // GetCommit fetches the specified commit, including all details about it. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-single-commit // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-commit func (s *RepositoriesService) GetCommit(ctx context.Context, owner, repo, sha string, opts *ListOptions) (*RepositoryCommit, *Response, error) { u := fmt.Sprintf("repos/%v/%v/commits/%v", owner, repo, sha) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } commit := new(RepositoryCommit) resp, err := s.client.Do(ctx, req, commit) if err != nil { return nil, resp, err } return commit, resp, nil } // GetCommitRaw fetches the specified commit in raw (diff or patch) format. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-commit func (s *RepositoriesService) GetCommitRaw(ctx context.Context, owner string, repo string, sha string, opts RawOptions) (string, *Response, error) { u := fmt.Sprintf("repos/%v/%v/commits/%v", owner, repo, sha) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return "", nil, err } switch opts.Type { case Diff: req.Header.Set("Accept", mediaTypeV3Diff) case Patch: req.Header.Set("Accept", mediaTypeV3Patch) default: return "", nil, fmt.Errorf("unsupported raw type %d", opts.Type) } var buf bytes.Buffer resp, err := s.client.Do(ctx, req, &buf) if err != nil { return "", resp, err } return buf.String(), resp, nil } // GetCommitSHA1 gets the SHA-1 of a commit reference. If a last-known SHA1 is // supplied and no new commits have occurred, a 304 Unmodified response is returned. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-commit func (s *RepositoriesService) GetCommitSHA1(ctx context.Context, owner, repo, ref, lastSHA string) (string, *Response, error) { u := fmt.Sprintf("repos/%v/%v/commits/%v", owner, repo, refURLEscape(ref)) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return "", nil, err } if lastSHA != "" { req.Header.Set("If-None-Match", `"`+lastSHA+`"`) } req.Header.Set("Accept", mediaTypeV3SHA) var buf bytes.Buffer resp, err := s.client.Do(ctx, req, &buf) if err != nil { return "", resp, err } return buf.String(), resp, nil } // CompareCommits compares a range of commits with each other. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#compare-two-commits func (s *RepositoriesService) CompareCommits(ctx context.Context, owner, repo string, base, head string, opts *ListOptions) (*CommitsComparison, *Response, error) { escapedBase := url.QueryEscape(base) escapedHead := url.QueryEscape(head) u := fmt.Sprintf("repos/%v/%v/compare/%v...%v", owner, repo, escapedBase, escapedHead) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } comp := new(CommitsComparison) resp, err := s.client.Do(ctx, req, comp) if err != nil { return nil, resp, err } return comp, resp, nil } // CompareCommitsRaw compares a range of commits with each other in raw (diff or patch) format. // // Both "base" and "head" must be branch names in "repo". // To compare branches across other repositories in the same network as "repo", // use the format ":branch". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#compare-two-commits func (s *RepositoriesService) CompareCommitsRaw(ctx context.Context, owner, repo, base, head string, opts RawOptions) (string, *Response, error) { escapedBase := url.QueryEscape(base) escapedHead := url.QueryEscape(head) u := fmt.Sprintf("repos/%v/%v/compare/%v...%v", owner, repo, escapedBase, escapedHead) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return "", nil, err } switch opts.Type { case Diff: req.Header.Set("Accept", mediaTypeV3Diff) case Patch: req.Header.Set("Accept", mediaTypeV3Patch) default: return "", nil, fmt.Errorf("unsupported raw type %d", opts.Type) } var buf bytes.Buffer resp, err := s.client.Do(ctx, req, &buf) if err != nil { return "", resp, err } return buf.String(), resp, nil } // ListBranchesHeadCommit gets all branches where the given commit SHA is the HEAD, // or latest commit for the branch. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-branches-for-head-commit func (s *RepositoriesService) ListBranchesHeadCommit(ctx context.Context, owner, repo, sha string) ([]*BranchCommit, *Response, error) { u := fmt.Sprintf("repos/%v/%v/commits/%v/branches-where-head", owner, repo, sha) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeListPullsOrBranchesForCommitPreview) var branchCommits []*BranchCommit resp, err := s.client.Do(ctx, req, &branchCommits) if err != nil { return nil, resp, err } return branchCommits, resp, nil } go-github-38.1.0/github/repos_commits_test.go000066400000000000000000000610511410475703100212300ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "net/http" "net/url" "strings" "testing" "time" "github.com/google/go-cmp/cmp" "golang.org/x/crypto/openpgp" ) func TestRepositoriesService_ListCommits(t *testing.T) { client, mux, _, teardown := setup() defer teardown() // given mux.HandleFunc("/repos/o/r/commits", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "sha": "s", "path": "p", "author": "a", "since": "2013-08-01T00:00:00Z", "until": "2013-09-03T00:00:00Z", }) fmt.Fprintf(w, `[{"sha": "s"}]`) }) opt := &CommitsListOptions{ SHA: "s", Path: "p", Author: "a", Since: time.Date(2013, time.August, 1, 0, 0, 0, 0, time.UTC), Until: time.Date(2013, time.September, 3, 0, 0, 0, 0, time.UTC), } ctx := context.Background() commits, _, err := client.Repositories.ListCommits(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListCommits returned error: %v", err) } want := []*RepositoryCommit{{SHA: String("s")}} if !cmp.Equal(commits, want) { t.Errorf("Repositories.ListCommits returned %+v, want %+v", commits, want) } const methodName = "ListCommits" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListCommits(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListCommits(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetCommit(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/commits/s", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprintf(w, `{ "sha": "s", "commit": { "message": "m" }, "author": { "login": "l" }, "committer": { "login": "l" }, "parents": [ { "sha": "s" } ], "stats": { "additions": 104, "deletions": 4, "total": 108 }, "files": [ { "filename": "f", "additions": 10, "deletions": 2, "changes": 12, "status": "s", "patch": "p", "blob_url": "b", "raw_url": "r", "contents_url": "c" } ] }`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() commit, _, err := client.Repositories.GetCommit(ctx, "o", "r", "s", opts) if err != nil { t.Errorf("Repositories.GetCommit returned error: %v", err) } want := &RepositoryCommit{ SHA: String("s"), Commit: &Commit{ Message: String("m"), }, Author: &User{ Login: String("l"), }, Committer: &User{ Login: String("l"), }, Parents: []*Commit{ { SHA: String("s"), }, }, Stats: &CommitStats{ Additions: Int(104), Deletions: Int(4), Total: Int(108), }, Files: []*CommitFile{ { Filename: String("f"), Additions: Int(10), Deletions: Int(2), Changes: Int(12), Status: String("s"), Patch: String("p"), BlobURL: String("b"), RawURL: String("r"), ContentsURL: String("c"), }, }, } if !cmp.Equal(commit, want) { t.Errorf("Repositories.GetCommit returned \n%+v, want \n%+v", commit, want) } const methodName = "GetCommit" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetCommit(ctx, "\n", "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetCommit(ctx, "o", "r", "s", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetCommitRaw_diff(t *testing.T) { client, mux, _, teardown := setup() defer teardown() const rawStr = "@@diff content" mux.HandleFunc("/repos/o/r/commits/s", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeV3Diff) fmt.Fprint(w, rawStr) }) ctx := context.Background() got, _, err := client.Repositories.GetCommitRaw(ctx, "o", "r", "s", RawOptions{Type: Diff}) if err != nil { t.Fatalf("Repositories.GetCommitRaw returned error: %v", err) } want := rawStr if got != want { t.Errorf("Repositories.GetCommitRaw returned %s want %s", got, want) } const methodName = "GetCommitRaw" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetCommitRaw(ctx, "\n", "\n", "\n", RawOptions{Type: Diff}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetCommitRaw(ctx, "o", "r", "s", RawOptions{Type: Diff}) if got != "" { t.Errorf("testNewRequestAndDoFailure %v = %#v, want ''", methodName, got) } return resp, err }) } func TestRepositoriesService_GetCommitRaw_patch(t *testing.T) { client, mux, _, teardown := setup() defer teardown() const rawStr = "@@patch content" mux.HandleFunc("/repos/o/r/commits/s", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeV3Patch) fmt.Fprint(w, rawStr) }) ctx := context.Background() got, _, err := client.Repositories.GetCommitRaw(ctx, "o", "r", "s", RawOptions{Type: Patch}) if err != nil { t.Fatalf("Repositories.GetCommitRaw returned error: %v", err) } want := rawStr if got != want { t.Errorf("Repositories.GetCommitRaw returned %s want %s", got, want) } } func TestRepositoriesService_GetCommitRaw_invalid(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.GetCommitRaw(ctx, "o", "r", "s", RawOptions{100}) if err == nil { t.Fatal("Repositories.GetCommitRaw should return error") } if !strings.Contains(err.Error(), "unsupported raw type") { t.Error("Repositories.GetCommitRaw should return unsupported raw type error") } } func TestRepositoriesService_GetCommitSHA1(t *testing.T) { client, mux, _, teardown := setup() defer teardown() const sha1 = "01234abcde" mux.HandleFunc("/repos/o/r/commits/master", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeV3SHA) fmt.Fprintf(w, sha1) }) ctx := context.Background() got, _, err := client.Repositories.GetCommitSHA1(ctx, "o", "r", "master", "") if err != nil { t.Errorf("Repositories.GetCommitSHA1 returned error: %v", err) } want := sha1 if got != want { t.Errorf("Repositories.GetCommitSHA1 = %v, want %v", got, want) } mux.HandleFunc("/repos/o/r/commits/tag", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeV3SHA) testHeader(t, r, "If-None-Match", `"`+sha1+`"`) w.WriteHeader(http.StatusNotModified) }) got, _, err = client.Repositories.GetCommitSHA1(ctx, "o", "r", "tag", sha1) if err == nil { t.Errorf("Expected HTTP 304 response") } want = "" if got != want { t.Errorf("Repositories.GetCommitSHA1 = %v, want %v", got, want) } const methodName = "GetCommitSHA1" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetCommitSHA1(ctx, "\n", "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetCommitSHA1(ctx, "o", "r", "master", "") if got != "" { t.Errorf("testNewRequestAndDoFailure %v = %#v, want ''", methodName, got) } return resp, err }) } func TestRepositoriesService_NonAlphabetCharacter_GetCommitSHA1(t *testing.T) { client, mux, _, teardown := setup() defer teardown() const sha1 = "01234abcde" mux.HandleFunc("/repos/o/r/commits/master%20hash", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeV3SHA) fmt.Fprintf(w, sha1) }) ctx := context.Background() got, _, err := client.Repositories.GetCommitSHA1(ctx, "o", "r", "master%20hash", "") if err != nil { t.Errorf("Repositories.GetCommitSHA1 returned error: %v", err) } if want := sha1; got != want { t.Errorf("Repositories.GetCommitSHA1 = %v, want %v", got, want) } mux.HandleFunc("/repos/o/r/commits/tag", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeV3SHA) testHeader(t, r, "If-None-Match", `"`+sha1+`"`) w.WriteHeader(http.StatusNotModified) }) got, _, err = client.Repositories.GetCommitSHA1(ctx, "o", "r", "tag", sha1) if err == nil { t.Errorf("Expected HTTP 304 response") } if want := ""; got != want { t.Errorf("Repositories.GetCommitSHA1 = %v, want %v", got, want) } } func TestRepositoriesService_TrailingPercent_GetCommitSHA1(t *testing.T) { client, mux, _, teardown := setup() defer teardown() const sha1 = "01234abcde" mux.HandleFunc("/repos/o/r/commits/comm%", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeV3SHA) fmt.Fprintf(w, sha1) }) ctx := context.Background() got, _, err := client.Repositories.GetCommitSHA1(ctx, "o", "r", "comm%", "") if err != nil { t.Errorf("Repositories.GetCommitSHA1 returned error: %v", err) } if want := sha1; got != want { t.Errorf("Repositories.GetCommitSHA1 = %v, want %v", got, want) } mux.HandleFunc("/repos/o/r/commits/tag", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeV3SHA) testHeader(t, r, "If-None-Match", `"`+sha1+`"`) w.WriteHeader(http.StatusNotModified) }) got, _, err = client.Repositories.GetCommitSHA1(ctx, "o", "r", "tag", sha1) if err == nil { t.Errorf("Expected HTTP 304 response") } if want := ""; got != want { t.Errorf("Repositories.GetCommitSHA1 = %v, want %v", got, want) } } func TestRepositoriesService_CompareCommits(t *testing.T) { testCases := []struct { base string head string }{ {base: "b", head: "h"}, {base: "123base", head: "head123"}, {base: "`~!@#$%^&*()_+-=[]\\{}|;':\",./<>?/*-+123base", head: "head123`~!@#$%^&*()_+-=[]\\{}|;':\",./<>?/*-+"}, } for _, sample := range testCases { client, mux, _, teardown := setup() base := sample.base head := sample.head escapedBase := url.QueryEscape(base) escapedHead := url.QueryEscape(head) pattern := fmt.Sprintf("/repos/o/r/compare/%v...%v", base, head) mux.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprintf(w, `{ "base_commit": { "sha": "s", "commit": { "author": { "name": "n" }, "committer": { "name": "n" }, "message": "m", "tree": { "sha": "t" } }, "author": { "login": "l" }, "committer": { "login": "l" }, "parents": [ { "sha": "s" } ] }, "status": "s", "ahead_by": 1, "behind_by": 2, "total_commits": 1, "commits": [ { "sha": "s", "commit": { "author": { "name": "n" } }, "author": { "login": "l" }, "committer": { "login": "l" }, "parents": [ { "sha": "s" } ] } ], "files": [ { "filename": "f" } ], "html_url": "https://github.com/o/r/compare/%[1]v...%[2]v", "permalink_url": "https://github.com/o/r/compare/o:bbcd538c8e72b8c175046e27cc8f907076331401...o:0328041d1152db8ae77652d1618a02e57f745f17", "diff_url": "https://github.com/o/r/compare/%[1]v...%[2]v.diff", "patch_url": "https://github.com/o/r/compare/%[1]v...%[2]v.patch", "url": "https://api.github.com/repos/o/r/compare/%[1]v...%[2]v" }`, escapedBase, escapedHead) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() got, _, err := client.Repositories.CompareCommits(ctx, "o", "r", base, head, opts) if err != nil { t.Errorf("Repositories.CompareCommits returned error: %v", err) } want := &CommitsComparison{ BaseCommit: &RepositoryCommit{ SHA: String("s"), Commit: &Commit{ Author: &CommitAuthor{Name: String("n")}, Committer: &CommitAuthor{Name: String("n")}, Message: String("m"), Tree: &Tree{SHA: String("t")}, }, Author: &User{Login: String("l")}, Committer: &User{Login: String("l")}, Parents: []*Commit{ { SHA: String("s"), }, }, }, Status: String("s"), AheadBy: Int(1), BehindBy: Int(2), TotalCommits: Int(1), Commits: []*RepositoryCommit{ { SHA: String("s"), Commit: &Commit{ Author: &CommitAuthor{Name: String("n")}, }, Author: &User{Login: String("l")}, Committer: &User{Login: String("l")}, Parents: []*Commit{ { SHA: String("s"), }, }, }, }, Files: []*CommitFile{ { Filename: String("f"), }, }, HTMLURL: String(fmt.Sprintf("https://github.com/o/r/compare/%v...%v", escapedBase, escapedHead)), PermalinkURL: String("https://github.com/o/r/compare/o:bbcd538c8e72b8c175046e27cc8f907076331401...o:0328041d1152db8ae77652d1618a02e57f745f17"), DiffURL: String(fmt.Sprintf("https://github.com/o/r/compare/%v...%v.diff", escapedBase, escapedHead)), PatchURL: String(fmt.Sprintf("https://github.com/o/r/compare/%v...%v.patch", escapedBase, escapedHead)), URL: String(fmt.Sprintf("https://api.github.com/repos/o/r/compare/%v...%v", escapedBase, escapedHead)), } if !cmp.Equal(got, want) { t.Errorf("Repositories.CompareCommits returned \n%+v, want \n%+v", got, want) } const methodName = "CompareCommits" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CompareCommits(ctx, "\n", "\n", "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CompareCommits(ctx, "o", "r", base, head, opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) teardown() } } func TestRepositoriesService_CompareCommitsRaw_diff(t *testing.T) { testCases := []struct { base string head string }{ {base: "b", head: "h"}, {base: "123base", head: "head123"}, {base: "`~!@#$%^&*()_+-=[]\\{}|;':\",./<>?/*-+123base", head: "head123`~!@#$%^&*()_+-=[]\\{}|;':\",./<>?/*-+"}, } for _, sample := range testCases { client, mux, _, teardown := setup() base := sample.base head := sample.head pattern := fmt.Sprintf("/repos/o/r/compare/%v...%v", base, head) const rawStr = "@@diff content" mux.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeV3Diff) fmt.Fprint(w, rawStr) }) ctx := context.Background() got, _, err := client.Repositories.CompareCommitsRaw(ctx, "o", "r", base, head, RawOptions{Type: Diff}) if err != nil { t.Fatalf("Repositories.GetCommitRaw returned error: %v", err) } want := rawStr if got != want { t.Errorf("Repositories.GetCommitRaw returned %s want %s", got, want) } const methodName = "CompareCommitsRaw" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CompareCommitsRaw(ctx, "\n", "\n", "\n", "\n", RawOptions{Type: Diff}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CompareCommitsRaw(ctx, "o", "r", base, head, RawOptions{Type: Diff}) if got != "" { t.Errorf("testNewRequestAndDoFailure %v = %#v, want ''", methodName, got) } return resp, err }) teardown() } } func TestRepositoriesService_CompareCommitsRaw_patch(t *testing.T) { testCases := []struct { base string head string }{ {base: "b", head: "h"}, {base: "123base", head: "head123"}, {base: "`~!@#$%^&*()_+-=[]\\{}|;':\",./<>?/*-+123base", head: "head123`~!@#$%^&*()_+-=[]\\{}|;':\",./<>?/*-+"}, } for _, sample := range testCases { client, mux, _, teardown := setup() base := sample.base head := sample.head pattern := fmt.Sprintf("/repos/o/r/compare/%v...%v", base, head) const rawStr = "@@patch content" mux.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeV3Patch) fmt.Fprint(w, rawStr) }) ctx := context.Background() got, _, err := client.Repositories.CompareCommitsRaw(ctx, "o", "r", base, head, RawOptions{Type: Patch}) if err != nil { t.Fatalf("Repositories.GetCommitRaw returned error: %v", err) } want := rawStr if got != want { t.Errorf("Repositories.GetCommitRaw returned %s want %s", got, want) } teardown() } } func TestRepositoriesService_CompareCommitsRaw_invalid(t *testing.T) { ctx := context.Background() testCases := []struct { base string head string }{ {base: "b", head: "h"}, {base: "123base", head: "head123"}, {base: "`~!@#$%^&*()_+-=[]\\{}|;':\",./<>?/*-+123base", head: "head123`~!@#$%^&*()_+-=[]\\{}|;':\",./<>?/*-+"}, } for _, sample := range testCases { client, _, _, teardown := setup() _, _, err := client.Repositories.CompareCommitsRaw(ctx, "o", "r", sample.base, sample.head, RawOptions{100}) if err == nil { t.Fatal("Repositories.GetCommitRaw should return error") } if !strings.Contains(err.Error(), "unsupported raw type") { t.Error("Repositories.GetCommitRaw should return unsupported raw type error") } teardown() } } func TestRepositoriesService_ListBranchesHeadCommit(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/commits/s/branches-where-head", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprintf(w, `[{"name": "b","commit":{"sha":"2e90302801c870f17b6152327d9b9a03c8eca0e2","url":"https://api.github.com/repos/google/go-github/commits/2e90302801c870f17b6152327d9b9a03c8eca0e2"},"protected":true}]`) }) ctx := context.Background() branches, _, err := client.Repositories.ListBranchesHeadCommit(ctx, "o", "r", "s") if err != nil { t.Errorf("Repositories.ListBranchesHeadCommit returned error: %v", err) } want := []*BranchCommit{ { Name: String("b"), Commit: &Commit{ SHA: String("2e90302801c870f17b6152327d9b9a03c8eca0e2"), URL: String("https://api.github.com/repos/google/go-github/commits/2e90302801c870f17b6152327d9b9a03c8eca0e2"), }, Protected: Bool(true), }, } if !cmp.Equal(branches, want) { t.Errorf("Repositories.ListBranchesHeadCommit returned %+v, want %+v", branches, want) } const methodName = "ListBranchesHeadCommit" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListBranchesHeadCommit(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListBranchesHeadCommit(ctx, "o", "r", "s") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestBranchCommit_Marshal(t *testing.T) { testJSONMarshal(t, &BranchCommit{}, "{}") r := &BranchCommit{ Name: String("n"), Commit: &Commit{ SHA: String("s"), Author: &CommitAuthor{ Date: &referenceTime, Name: String("n"), Email: String("e"), Login: String("u"), }, Committer: &CommitAuthor{ Date: &referenceTime, Name: String("n"), Email: String("e"), Login: String("u"), }, Message: String("m"), Tree: &Tree{ SHA: String("s"), Entries: []*TreeEntry{{ SHA: String("s"), Path: String("p"), Mode: String("m"), Type: String("t"), Size: Int(1), Content: String("c"), URL: String("u"), }}, Truncated: Bool(false), }, Parents: nil, Stats: &CommitStats{ Additions: Int(1), Deletions: Int(1), Total: Int(1), }, HTMLURL: String("h"), URL: String("u"), Verification: &SignatureVerification{ Verified: Bool(false), Reason: String("r"), Signature: String("s"), Payload: String("p"), }, NodeID: String("n"), CommentCount: Int(1), SigningKey: &openpgp.Entity{}, }, Protected: Bool(false), } want := `{ "name": "n", "commit": { "sha": "s", "author": { "date": ` + referenceTimeStr + `, "name": "n", "email": "e", "username": "u" }, "committer": { "date": ` + referenceTimeStr + `, "name": "n", "email": "e", "username": "u" }, "message": "m", "tree": { "sha": "s", "tree": [ { "sha": "s", "path": "p", "mode": "m", "type": "t", "size": 1, "content": "c", "url": "u" } ], "truncated": false }, "stats": { "additions": 1, "deletions": 1, "total": 1 }, "html_url": "h", "url": "u", "verification": { "verified": false, "reason": "r", "signature": "s", "payload": "p" }, "node_id": "n", "comment_count": 1 }, "protected": false }` testJSONMarshal(t, r, want) } func TestCommitsComparison_Marshal(t *testing.T) { testJSONMarshal(t, &CommitsComparison{}, "{}") r := &CommitsComparison{ BaseCommit: &RepositoryCommit{NodeID: String("nid")}, MergeBaseCommit: &RepositoryCommit{NodeID: String("nid")}, Status: String("status"), AheadBy: Int(1), BehindBy: Int(1), TotalCommits: Int(1), Commits: []*RepositoryCommit{ { NodeID: String("nid"), }, }, Files: []*CommitFile{ { SHA: String("sha"), }, }, HTMLURL: String("hurl"), PermalinkURL: String("purl"), DiffURL: String("durl"), PatchURL: String("purl"), URL: String("url"), } want := `{ "base_commit": { "node_id": "nid" }, "merge_base_commit": { "node_id": "nid" }, "status": "status", "ahead_by": 1, "behind_by": 1, "total_commits": 1, "commits": [ { "node_id": "nid" } ], "files": [ { "sha": "sha" } ], "html_url": "hurl", "permalink_url": "purl", "diff_url": "durl", "patch_url": "purl", "url": "url" }` testJSONMarshal(t, r, want) } func TestCommitFile_Marshal(t *testing.T) { testJSONMarshal(t, &CommitFile{}, "{}") r := &CommitFile{ SHA: String("sha"), Filename: String("fn"), Additions: Int(1), Deletions: Int(1), Changes: Int(1), Status: String("status"), Patch: String("patch"), BlobURL: String("burl"), RawURL: String("rurl"), ContentsURL: String("curl"), PreviousFilename: String("pf"), } want := `{ "sha": "sha", "filename": "fn", "additions": 1, "deletions": 1, "changes": 1, "status": "status", "patch": "patch", "blob_url": "burl", "raw_url": "rurl", "contents_url": "curl", "previous_filename": "pf" }` testJSONMarshal(t, r, want) } func TestCommitStats_Marshal(t *testing.T) { testJSONMarshal(t, &CommitStats{}, "{}") r := &CommitStats{ Additions: Int(1), Deletions: Int(1), Total: Int(1), } want := `{ "additions": 1, "deletions": 1, "total": 1 }` testJSONMarshal(t, r, want) } func TestRepositoryCommit_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryCommit{}, "{}") r := &RepositoryCommit{ NodeID: String("nid"), SHA: String("sha"), Commit: &Commit{ Message: String("m"), }, Author: &User{ Login: String("l"), }, Committer: &User{ Login: String("l"), }, Parents: []*Commit{ { SHA: String("s"), }, }, HTMLURL: String("hurl"), URL: String("url"), CommentsURL: String("curl"), Stats: &CommitStats{ Additions: Int(104), Deletions: Int(4), Total: Int(108), }, Files: []*CommitFile{ { Filename: String("f"), Additions: Int(10), Deletions: Int(2), Changes: Int(12), Status: String("s"), Patch: String("p"), BlobURL: String("b"), RawURL: String("r"), ContentsURL: String("c"), }, }, } want := `{ "node_id": "nid", "sha": "sha", "commit": { "message": "m" }, "author": { "login": "l" }, "committer": { "login": "l" }, "parents": [ { "sha": "s" } ], "html_url": "hurl", "url": "url", "comments_url": "curl", "stats": { "additions": 104, "deletions": 4, "total": 108 }, "files": [ { "filename": "f", "additions": 10, "deletions": 2, "changes": 12, "status": "s", "patch": "p", "blob_url": "b", "raw_url": "r", "contents_url": "c" } ] }` testJSONMarshal(t, r, want) } go-github-38.1.0/github/repos_community_health.go000066400000000000000000000037641410475703100220760ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "fmt" "time" ) // Metric represents the different fields for one file in community health files. type Metric struct { Name *string `json:"name"` Key *string `json:"key"` URL *string `json:"url"` HTMLURL *string `json:"html_url"` } // CommunityHealthFiles represents the different files in the community health metrics response. type CommunityHealthFiles struct { CodeOfConduct *Metric `json:"code_of_conduct"` Contributing *Metric `json:"contributing"` IssueTemplate *Metric `json:"issue_template"` PullRequestTemplate *Metric `json:"pull_request_template"` License *Metric `json:"license"` Readme *Metric `json:"readme"` } // CommunityHealthMetrics represents a response containing the community metrics of a repository. type CommunityHealthMetrics struct { HealthPercentage *int `json:"health_percentage"` Files *CommunityHealthFiles `json:"files"` UpdatedAt *time.Time `json:"updated_at"` } // GetCommunityHealthMetrics retrieves all the community health metrics for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-community-profile-metrics func (s *RepositoriesService) GetCommunityHealthMetrics(ctx context.Context, owner, repo string) (*CommunityHealthMetrics, *Response, error) { u := fmt.Sprintf("repos/%v/%v/community/profile", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeRepositoryCommunityHealthMetricsPreview) metrics := &CommunityHealthMetrics{} resp, err := s.client.Do(ctx, req, metrics) if err != nil { return nil, resp, err } return metrics, resp, nil } go-github-38.1.0/github/repos_community_health_test.go000066400000000000000000000161631410475703100231320ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_GetCommunityHealthMetrics(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/community/profile", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeRepositoryCommunityHealthMetricsPreview) fmt.Fprintf(w, `{ "health_percentage": 100, "files": { "code_of_conduct": { "name": "Contributor Covenant", "key": "contributor_covenant", "url": null, "html_url": "https://github.com/octocat/Hello-World/blob/master/CODE_OF_CONDUCT.md" }, "contributing": { "url": "https://api.github.com/repos/octocat/Hello-World/contents/CONTRIBUTING", "html_url": "https://github.com/octocat/Hello-World/blob/master/CONTRIBUTING" }, "license": { "name": "MIT License", "key": "mit", "url": "https://api.github.com/licenses/mit", "html_url": "https://github.com/octocat/Hello-World/blob/master/LICENSE" }, "readme": { "url": "https://api.github.com/repos/octocat/Hello-World/contents/README.md", "html_url": "https://github.com/octocat/Hello-World/blob/master/README.md" } }, "updated_at": "2017-02-28T00:00:00Z" }`) }) ctx := context.Background() got, _, err := client.Repositories.GetCommunityHealthMetrics(ctx, "o", "r") if err != nil { t.Errorf("Repositories.GetCommunityHealthMetrics returned error: %v", err) } updatedAt := time.Date(2017, time.February, 28, 0, 0, 0, 0, time.UTC) want := &CommunityHealthMetrics{ HealthPercentage: Int(100), UpdatedAt: &updatedAt, Files: &CommunityHealthFiles{ CodeOfConduct: &Metric{ Name: String("Contributor Covenant"), Key: String("contributor_covenant"), HTMLURL: String("https://github.com/octocat/Hello-World/blob/master/CODE_OF_CONDUCT.md"), }, Contributing: &Metric{ URL: String("https://api.github.com/repos/octocat/Hello-World/contents/CONTRIBUTING"), HTMLURL: String("https://github.com/octocat/Hello-World/blob/master/CONTRIBUTING"), }, License: &Metric{ Name: String("MIT License"), Key: String("mit"), URL: String("https://api.github.com/licenses/mit"), HTMLURL: String("https://github.com/octocat/Hello-World/blob/master/LICENSE"), }, Readme: &Metric{ URL: String("https://api.github.com/repos/octocat/Hello-World/contents/README.md"), HTMLURL: String("https://github.com/octocat/Hello-World/blob/master/README.md"), }, }, } if !cmp.Equal(got, want) { t.Errorf("Repositories.GetCommunityHealthMetrics:\ngot:\n%v\nwant:\n%v", Stringify(got), Stringify(want)) } const methodName = "GetCommunityHealthMetrics" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetCommunityHealthMetrics(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetCommunityHealthMetrics(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMetric_Marshal(t *testing.T) { testJSONMarshal(t, &Metric{}, "{}") r := &Metric{ Name: String("name"), Key: String("key"), URL: String("url"), HTMLURL: String("hurl"), } want := `{ "name": "name", "key": "key", "url": "url", "html_url": "hurl" }` testJSONMarshal(t, r, want) } func TestCommunityHealthFiles_Marshal(t *testing.T) { testJSONMarshal(t, &CommunityHealthFiles{}, "{}") r := &CommunityHealthFiles{ CodeOfConduct: &Metric{ Name: String("name"), Key: String("key"), URL: String("url"), HTMLURL: String("hurl"), }, Contributing: &Metric{ Name: String("name"), Key: String("key"), URL: String("url"), HTMLURL: String("hurl"), }, IssueTemplate: &Metric{ Name: String("name"), Key: String("key"), URL: String("url"), HTMLURL: String("hurl"), }, PullRequestTemplate: &Metric{ Name: String("name"), Key: String("key"), URL: String("url"), HTMLURL: String("hurl"), }, License: &Metric{ Name: String("name"), Key: String("key"), URL: String("url"), HTMLURL: String("hurl"), }, Readme: &Metric{ Name: String("name"), Key: String("key"), URL: String("url"), HTMLURL: String("hurl"), }, } want := `{ "code_of_conduct": { "name": "name", "key": "key", "url": "url", "html_url": "hurl" }, "contributing": { "name": "name", "key": "key", "url": "url", "html_url": "hurl" }, "issue_template": { "name": "name", "key": "key", "url": "url", "html_url": "hurl" }, "pull_request_template": { "name": "name", "key": "key", "url": "url", "html_url": "hurl" }, "license": { "name": "name", "key": "key", "url": "url", "html_url": "hurl" }, "readme": { "name": "name", "key": "key", "url": "url", "html_url": "hurl" } }` testJSONMarshal(t, r, want) } func TestCommunityHealthMetrics_Marshal(t *testing.T) { testJSONMarshal(t, &CommunityHealthMetrics{}, "{}") r := &CommunityHealthMetrics{ HealthPercentage: Int(1), Files: &CommunityHealthFiles{ CodeOfConduct: &Metric{ Name: String("name"), Key: String("key"), URL: String("url"), HTMLURL: String("hurl"), }, Contributing: &Metric{ Name: String("name"), Key: String("key"), URL: String("url"), HTMLURL: String("hurl"), }, IssueTemplate: &Metric{ Name: String("name"), Key: String("key"), URL: String("url"), HTMLURL: String("hurl"), }, PullRequestTemplate: &Metric{ Name: String("name"), Key: String("key"), URL: String("url"), HTMLURL: String("hurl"), }, License: &Metric{ Name: String("name"), Key: String("key"), URL: String("url"), HTMLURL: String("hurl"), }, Readme: &Metric{ Name: String("name"), Key: String("key"), URL: String("url"), HTMLURL: String("hurl"), }, }, UpdatedAt: &referenceTime, } want := `{ "health_percentage": 1, "files": { "code_of_conduct": { "name": "name", "key": "key", "url": "url", "html_url": "hurl" }, "contributing": { "name": "name", "key": "key", "url": "url", "html_url": "hurl" }, "issue_template": { "name": "name", "key": "key", "url": "url", "html_url": "hurl" }, "pull_request_template": { "name": "name", "key": "key", "url": "url", "html_url": "hurl" }, "license": { "name": "name", "key": "key", "url": "url", "html_url": "hurl" }, "readme": { "name": "name", "key": "key", "url": "url", "html_url": "hurl" } }, "updated_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, r, want) } go-github-38.1.0/github/repos_contents.go000066400000000000000000000302661410475703100203570ustar00rootroot00000000000000// Copyright 2013 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. // Repository contents API methods. // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/contents/ package github import ( "context" "encoding/base64" "encoding/json" "errors" "fmt" "io" "net/http" "net/url" "path" "strings" ) // RepositoryContent represents a file or directory in a github repository. type RepositoryContent struct { Type *string `json:"type,omitempty"` // Target is only set if the type is "symlink" and the target is not a normal file. // If Target is set, Path will be the symlink path. Target *string `json:"target,omitempty"` Encoding *string `json:"encoding,omitempty"` Size *int `json:"size,omitempty"` Name *string `json:"name,omitempty"` Path *string `json:"path,omitempty"` // Content contains the actual file content, which may be encoded. // Callers should call GetContent which will decode the content if // necessary. Content *string `json:"content,omitempty"` SHA *string `json:"sha,omitempty"` URL *string `json:"url,omitempty"` GitURL *string `json:"git_url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` DownloadURL *string `json:"download_url,omitempty"` } // RepositoryContentResponse holds the parsed response from CreateFile, UpdateFile, and DeleteFile. type RepositoryContentResponse struct { Content *RepositoryContent `json:"content,omitempty"` Commit `json:"commit,omitempty"` } // RepositoryContentFileOptions specifies optional parameters for CreateFile, UpdateFile, and DeleteFile. type RepositoryContentFileOptions struct { Message *string `json:"message,omitempty"` Content []byte `json:"content,omitempty"` // unencoded SHA *string `json:"sha,omitempty"` Branch *string `json:"branch,omitempty"` Author *CommitAuthor `json:"author,omitempty"` Committer *CommitAuthor `json:"committer,omitempty"` } // RepositoryContentGetOptions represents an optional ref parameter, which can be a SHA, // branch, or tag type RepositoryContentGetOptions struct { Ref string `url:"ref,omitempty"` } // String converts RepositoryContent to a string. It's primarily for testing. func (r RepositoryContent) String() string { return Stringify(r) } // GetContent returns the content of r, decoding it if necessary. func (r *RepositoryContent) GetContent() (string, error) { var encoding string if r.Encoding != nil { encoding = *r.Encoding } switch encoding { case "base64": if r.Content == nil { return "", errors.New("malformed response: base64 encoding of null content") } c, err := base64.StdEncoding.DecodeString(*r.Content) return string(c), err case "": if r.Content == nil { return "", nil } return *r.Content, nil default: return "", fmt.Errorf("unsupported content encoding: %v", encoding) } } // GetReadme gets the Readme file for the repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-repository-readme func (s *RepositoriesService) GetReadme(ctx context.Context, owner, repo string, opts *RepositoryContentGetOptions) (*RepositoryContent, *Response, error) { u := fmt.Sprintf("repos/%v/%v/readme", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } readme := new(RepositoryContent) resp, err := s.client.Do(ctx, req, readme) if err != nil { return nil, resp, err } return readme, resp, nil } // DownloadContents returns an io.ReadCloser that reads the contents of the // specified file. This function will work with files of any size, as opposed // to GetContents which is limited to 1 Mb files. It is the caller's // responsibility to close the ReadCloser. // // It is possible for the download to result in a failed response when the // returned error is nil. Callers should check the returned Response status // code to verify the content is from a successful response. func (s *RepositoriesService) DownloadContents(ctx context.Context, owner, repo, filepath string, opts *RepositoryContentGetOptions) (io.ReadCloser, *Response, error) { dir := path.Dir(filepath) filename := path.Base(filepath) _, dirContents, resp, err := s.GetContents(ctx, owner, repo, dir, opts) if err != nil { return nil, resp, err } for _, contents := range dirContents { if *contents.Name == filename { if contents.DownloadURL == nil || *contents.DownloadURL == "" { return nil, resp, fmt.Errorf("No download link found for %s", filepath) } dlResp, err := s.client.client.Get(*contents.DownloadURL) if err != nil { return nil, &Response{Response: dlResp}, err } return dlResp.Body, &Response{Response: dlResp}, nil } } return nil, resp, fmt.Errorf("No file named %s found in %s", filename, dir) } // DownloadContentsWithMeta is identical to DownloadContents but additionally // returns the RepositoryContent of the requested file. This additional data // is useful for future operations involving the requested file. For merely // reading the content of a file, DownloadContents is perfectly adequate. // // It is possible for the download to result in a failed response when the // returned error is nil. Callers should check the returned Response status // code to verify the content is from a successful response. func (s *RepositoriesService) DownloadContentsWithMeta(ctx context.Context, owner, repo, filepath string, opts *RepositoryContentGetOptions) (io.ReadCloser, *RepositoryContent, *Response, error) { dir := path.Dir(filepath) filename := path.Base(filepath) _, dirContents, resp, err := s.GetContents(ctx, owner, repo, dir, opts) if err != nil { return nil, nil, resp, err } for _, contents := range dirContents { if *contents.Name == filename { if contents.DownloadURL == nil || *contents.DownloadURL == "" { return nil, contents, resp, fmt.Errorf("No download link found for %s", filepath) } dlResp, err := s.client.client.Get(*contents.DownloadURL) if err != nil { return nil, contents, &Response{Response: dlResp}, err } return dlResp.Body, contents, &Response{Response: dlResp}, nil } } return nil, nil, resp, fmt.Errorf("No file named %s found in %s", filename, dir) } // GetContents can return either the metadata and content of a single file // (when path references a file) or the metadata of all the files and/or // subdirectories of a directory (when path references a directory). To make it // easy to distinguish between both result types and to mimic the API as much // as possible, both result types will be returned but only one will contain a // value and the other will be nil. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-repository-content func (s *RepositoriesService) GetContents(ctx context.Context, owner, repo, path string, opts *RepositoryContentGetOptions) (fileContent *RepositoryContent, directoryContent []*RepositoryContent, resp *Response, err error) { escapedPath := (&url.URL{Path: strings.TrimSuffix(path, "/")}).String() u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, escapedPath) u, err = addOptions(u, opts) if err != nil { return nil, nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, nil, err } var rawJSON json.RawMessage resp, err = s.client.Do(ctx, req, &rawJSON) if err != nil { return nil, nil, resp, err } fileUnmarshalError := json.Unmarshal(rawJSON, &fileContent) if fileUnmarshalError == nil { return fileContent, nil, resp, nil } directoryUnmarshalError := json.Unmarshal(rawJSON, &directoryContent) if directoryUnmarshalError == nil { return nil, directoryContent, resp, nil } return nil, nil, resp, fmt.Errorf("unmarshalling failed for both file and directory content: %s and %s", fileUnmarshalError, directoryUnmarshalError) } // CreateFile creates a new file in a repository at the given path and returns // the commit and file metadata. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-or-update-file-contents func (s *RepositoriesService) CreateFile(ctx context.Context, owner, repo, path string, opts *RepositoryContentFileOptions) (*RepositoryContentResponse, *Response, error) { u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, path) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, nil, err } createResponse := new(RepositoryContentResponse) resp, err := s.client.Do(ctx, req, createResponse) if err != nil { return nil, resp, err } return createResponse, resp, nil } // UpdateFile updates a file in a repository at the given path and returns the // commit and file metadata. Requires the blob SHA of the file being updated. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-or-update-file-contents func (s *RepositoriesService) UpdateFile(ctx context.Context, owner, repo, path string, opts *RepositoryContentFileOptions) (*RepositoryContentResponse, *Response, error) { u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, path) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, nil, err } updateResponse := new(RepositoryContentResponse) resp, err := s.client.Do(ctx, req, updateResponse) if err != nil { return nil, resp, err } return updateResponse, resp, nil } // DeleteFile deletes a file from a repository and returns the commit. // Requires the blob SHA of the file to be deleted. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#delete-a-file func (s *RepositoriesService) DeleteFile(ctx context.Context, owner, repo, path string, opts *RepositoryContentFileOptions) (*RepositoryContentResponse, *Response, error) { u := fmt.Sprintf("repos/%s/%s/contents/%s", owner, repo, path) req, err := s.client.NewRequest("DELETE", u, opts) if err != nil { return nil, nil, err } deleteResponse := new(RepositoryContentResponse) resp, err := s.client.Do(ctx, req, deleteResponse) if err != nil { return nil, resp, err } return deleteResponse, resp, nil } // ArchiveFormat is used to define the archive type when calling GetArchiveLink. type ArchiveFormat string const ( // Tarball specifies an archive in gzipped tar format. Tarball ArchiveFormat = "tarball" // Zipball specifies an archive in zip format. Zipball ArchiveFormat = "zipball" ) // GetArchiveLink returns an URL to download a tarball or zipball archive for a // repository. The archiveFormat can be specified by either the github.Tarball // or github.Zipball constant. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/contents/#get-archive-link func (s *RepositoriesService) GetArchiveLink(ctx context.Context, owner, repo string, archiveformat ArchiveFormat, opts *RepositoryContentGetOptions, followRedirects bool) (*url.URL, *Response, error) { u := fmt.Sprintf("repos/%s/%s/%s", owner, repo, archiveformat) if opts != nil && opts.Ref != "" { u += fmt.Sprintf("/%s", opts.Ref) } resp, err := s.getArchiveLinkFromURL(ctx, u, followRedirects) if err != nil { return nil, nil, err } if resp.StatusCode != http.StatusFound { return nil, newResponse(resp), fmt.Errorf("unexpected status code: %s", resp.Status) } parsedURL, err := url.Parse(resp.Header.Get("Location")) return parsedURL, newResponse(resp), err } func (s *RepositoriesService) getArchiveLinkFromURL(ctx context.Context, u string, followRedirects bool) (*http.Response, error) { req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, err } var resp *http.Response // Use http.DefaultTransport if no custom Transport is configured req = withContext(ctx, req) if s.client.client.Transport == nil { resp, err = http.DefaultTransport.RoundTrip(req) } else { resp, err = s.client.client.Transport.RoundTrip(req) } if err != nil { return nil, err } resp.Body.Close() // If redirect response is returned, follow it if followRedirects && resp.StatusCode == http.StatusMovedPermanently { u = resp.Header.Get("Location") resp, err = s.getArchiveLinkFromURL(ctx, u, false) } return resp, err } go-github-38.1.0/github/repos_contents_test.go000066400000000000000000000711151410475703100214140ustar00rootroot00000000000000// 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 ( "context" "errors" "fmt" "io/ioutil" "net/http" "net/url" "testing" "github.com/google/go-cmp/cmp" "golang.org/x/crypto/openpgp" ) func TestRepositoryContent_GetContent(t *testing.T) { tests := []struct { encoding, content *string // input encoding and content want string // desired output wantErr bool // whether an error is expected }{ { encoding: String(""), content: String("hello"), want: "hello", wantErr: false, }, { encoding: nil, content: String("hello"), want: "hello", wantErr: false, }, { encoding: nil, content: nil, want: "", wantErr: false, }, { encoding: String("base64"), content: String("aGVsbG8="), want: "hello", wantErr: false, }, { encoding: String("bad"), content: String("aGVsbG8="), want: "", wantErr: true, }, } for _, tt := range tests { r := RepositoryContent{Encoding: tt.encoding, Content: tt.content} got, err := r.GetContent() if err != nil && !tt.wantErr { t.Errorf("RepositoryContent(%s, %s) returned unexpected error: %v", stringOrNil(tt.encoding), stringOrNil(tt.content), err) } if err == nil && tt.wantErr { t.Errorf("RepositoryContent(%s, %s) did not return unexpected error", stringOrNil(tt.encoding), stringOrNil(tt.content)) } if want := tt.want; got != want { t.Errorf("RepositoryContent.GetContent returned %+v, want %+v", got, want) } } } // stringOrNil converts a potentially null string pointer to string. // For non-nil input pointer, the returned string is enclosed in double-quotes. func stringOrNil(s *string) string { if s == nil { return "" } return fmt.Sprintf("%q", *s) } func TestRepositoriesService_GetReadme(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/readme", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "type": "file", "encoding": "base64", "size": 5362, "name": "README.md", "path": "README.md" }`) }) ctx := context.Background() readme, _, err := client.Repositories.GetReadme(ctx, "o", "r", &RepositoryContentGetOptions{}) if err != nil { t.Errorf("Repositories.GetReadme returned error: %v", err) } want := &RepositoryContent{Type: String("file"), Name: String("README.md"), Size: Int(5362), Encoding: String("base64"), Path: String("README.md")} if !cmp.Equal(readme, want) { t.Errorf("Repositories.GetReadme returned %+v, want %+v", readme, want) } const methodName = "GetReadme" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetReadme(ctx, "\n", "\n", &RepositoryContentGetOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetReadme(ctx, "o", "r", &RepositoryContentGetOptions{}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_DownloadContents_Success(t *testing.T) { client, mux, serverURL, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/d", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{ "type": "file", "name": "f", "download_url": "`+serverURL+baseURLPath+`/download/f" }]`) }) mux.HandleFunc("/download/f", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, "foo") }) ctx := context.Background() r, resp, err := client.Repositories.DownloadContents(ctx, "o", "r", "d/f", nil) if err != nil { t.Errorf("Repositories.DownloadContents returned error: %v", err) } if got, want := resp.Response.StatusCode, http.StatusOK; got != want { t.Errorf("Repositories.DownloadContents returned status code %v, want %v", got, want) } bytes, err := ioutil.ReadAll(r) if err != nil { t.Errorf("Error reading response body: %v", err) } r.Close() if got, want := string(bytes), "foo"; got != want { t.Errorf("Repositories.DownloadContents returned %v, want %v", got, want) } const methodName = "DownloadContents" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.DownloadContents(ctx, "\n", "\n", "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.DownloadContents(ctx, "o", "r", "d/f", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_DownloadContents_FailedResponse(t *testing.T) { client, mux, serverURL, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/d", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{ "type": "file", "name": "f", "download_url": "`+serverURL+baseURLPath+`/download/f" }]`) }) mux.HandleFunc("/download/f", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusInternalServerError) fmt.Fprint(w, "foo error") }) ctx := context.Background() r, resp, err := client.Repositories.DownloadContents(ctx, "o", "r", "d/f", nil) if err != nil { t.Errorf("Repositories.DownloadContents returned error: %v", err) } if got, want := resp.Response.StatusCode, http.StatusInternalServerError; got != want { t.Errorf("Repositories.DownloadContents returned status code %v, want %v", got, want) } bytes, err := ioutil.ReadAll(r) if err != nil { t.Errorf("Error reading response body: %v", err) } r.Close() if got, want := string(bytes), "foo error"; got != want { t.Errorf("Repositories.DownloadContents returned %v, want %v", got, want) } } func TestRepositoriesService_DownloadContents_NoDownloadURL(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/d", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{ "type": "file", "name": "f", }]`) }) ctx := context.Background() _, resp, err := client.Repositories.DownloadContents(ctx, "o", "r", "d/f", nil) if err == nil { t.Errorf("Repositories.DownloadContents did not return expected error") } if resp == nil { t.Errorf("Repositories.DownloadContents did not return expected response") } } func TestRepositoriesService_DownloadContents_NoFile(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/d", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[]`) }) ctx := context.Background() _, resp, err := client.Repositories.DownloadContents(ctx, "o", "r", "d/f", nil) if err == nil { t.Errorf("Repositories.DownloadContents did not return expected error") } if resp == nil { t.Errorf("Repositories.DownloadContents did not return expected response") } } func TestRepositoriesService_DownloadContentsWithMeta_Success(t *testing.T) { client, mux, serverURL, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/d", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{ "type": "file", "name": "f", "download_url": "`+serverURL+baseURLPath+`/download/f" }]`) }) mux.HandleFunc("/download/f", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, "foo") }) ctx := context.Background() r, c, resp, err := client.Repositories.DownloadContentsWithMeta(ctx, "o", "r", "d/f", nil) if err != nil { t.Errorf("Repositories.DownloadContentsWithMeta returned error: %v", err) } if got, want := resp.Response.StatusCode, http.StatusOK; got != want { t.Errorf("Repositories.DownloadContentsWithMeta returned status code %v, want %v", got, want) } bytes, err := ioutil.ReadAll(r) if err != nil { t.Errorf("Error reading response body: %v", err) } r.Close() if got, want := string(bytes), "foo"; got != want { t.Errorf("Repositories.DownloadContentsWithMeta returned %v, want %v", got, want) } if c != nil && c.Name != nil { if got, want := *c.Name, "f"; got != want { t.Errorf("Repositories.DownloadContentsWithMeta returned content name %v, want %v", got, want) } } else { t.Errorf("Returned RepositoryContent is null") } const methodName = "DownloadContentsWithMeta" testBadOptions(t, methodName, func() (err error) { _, _, _, err = client.Repositories.DownloadContentsWithMeta(ctx, "\n", "\n", "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, cot, resp, err := client.Repositories.DownloadContentsWithMeta(ctx, "o", "r", "d/f", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } if cot != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, cot) } return resp, err }) } func TestRepositoriesService_DownloadContentsWithMeta_FailedResponse(t *testing.T) { client, mux, serverURL, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/d", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{ "type": "file", "name": "f", "download_url": "`+serverURL+baseURLPath+`/download/f" }]`) }) mux.HandleFunc("/download/f", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusInternalServerError) fmt.Fprint(w, "foo error") }) ctx := context.Background() r, c, resp, err := client.Repositories.DownloadContentsWithMeta(ctx, "o", "r", "d/f", nil) if err != nil { t.Errorf("Repositories.DownloadContentsWithMeta returned error: %v", err) } if got, want := resp.Response.StatusCode, http.StatusInternalServerError; got != want { t.Errorf("Repositories.DownloadContentsWithMeta returned status code %v, want %v", got, want) } bytes, err := ioutil.ReadAll(r) if err != nil { t.Errorf("Error reading response body: %v", err) } r.Close() if got, want := string(bytes), "foo error"; got != want { t.Errorf("Repositories.DownloadContentsWithMeta returned %v, want %v", got, want) } if c != nil && c.Name != nil { if got, want := *c.Name, "f"; got != want { t.Errorf("Repositories.DownloadContentsWithMeta returned content name %v, want %v", got, want) } } else { t.Errorf("Returned RepositoryContent is null") } } func TestRepositoriesService_DownloadContentsWithMeta_NoDownloadURL(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/d", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{ "type": "file", "name": "f", }]`) }) ctx := context.Background() _, _, resp, err := client.Repositories.DownloadContentsWithMeta(ctx, "o", "r", "d/f", nil) if err == nil { t.Errorf("Repositories.DownloadContentsWithMeta did not return expected error") } if resp == nil { t.Errorf("Repositories.DownloadContentsWithMeta did not return expected response") } } func TestRepositoriesService_DownloadContentsWithMeta_NoFile(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/d", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[]`) }) ctx := context.Background() _, _, resp, err := client.Repositories.DownloadContentsWithMeta(ctx, "o", "r", "d/f", nil) if err == nil { t.Errorf("Repositories.DownloadContentsWithMeta did not return expected error") } if resp == nil { t.Errorf("Repositories.DownloadContentsWithMeta did not return expected response") } } func TestRepositoriesService_GetContents_File(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/p", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "type": "file", "encoding": "base64", "size": 20678, "name": "LICENSE", "path": "LICENSE" }`) }) ctx := context.Background() fileContents, _, _, err := client.Repositories.GetContents(ctx, "o", "r", "p", &RepositoryContentGetOptions{}) if err != nil { t.Errorf("Repositories.GetContents returned error: %v", err) } want := &RepositoryContent{Type: String("file"), Name: String("LICENSE"), Size: Int(20678), Encoding: String("base64"), Path: String("LICENSE")} if !cmp.Equal(fileContents, want) { t.Errorf("Repositories.GetContents returned %+v, want %+v", fileContents, want) } const methodName = "GetContents" testBadOptions(t, methodName, func() (err error) { _, _, _, err = client.Repositories.GetContents(ctx, "\n", "\n", "\n", &RepositoryContentGetOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, _, resp, err := client.Repositories.GetContents(ctx, "o", "r", "p", &RepositoryContentGetOptions{}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetContents_FilenameNeedsEscape(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/p#?%/中.go", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{}`) }) ctx := context.Background() _, _, _, err := client.Repositories.GetContents(ctx, "o", "r", "p#?%/中.go", &RepositoryContentGetOptions{}) if err != nil { t.Fatalf("Repositories.GetContents returned error: %v", err) } } func TestRepositoriesService_GetContents_DirectoryWithSpaces(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/some directory/file.go", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{}`) }) ctx := context.Background() _, _, _, err := client.Repositories.GetContents(ctx, "o", "r", "some directory/file.go", &RepositoryContentGetOptions{}) if err != nil { t.Fatalf("Repositories.GetContents returned error: %v", err) } } func TestRepositoriesService_GetContents_DirectoryWithPlusChars(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/some directory+name/file.go", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{}`) }) ctx := context.Background() _, _, _, err := client.Repositories.GetContents(ctx, "o", "r", "some directory+name/file.go", &RepositoryContentGetOptions{}) if err != nil { t.Fatalf("Repositories.GetContents returned error: %v", err) } } func TestRepositoriesService_GetContents_Directory(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/p", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{ "type": "dir", "name": "lib", "path": "lib" }, { "type": "file", "size": 20678, "name": "LICENSE", "path": "LICENSE" }]`) }) ctx := context.Background() _, directoryContents, _, err := client.Repositories.GetContents(ctx, "o", "r", "p", &RepositoryContentGetOptions{}) if err != nil { t.Errorf("Repositories.GetContents returned error: %v", err) } want := []*RepositoryContent{{Type: String("dir"), Name: String("lib"), Path: String("lib")}, {Type: String("file"), Name: String("LICENSE"), Size: Int(20678), Path: String("LICENSE")}} if !cmp.Equal(directoryContents, want) { t.Errorf("Repositories.GetContents_Directory returned %+v, want %+v", directoryContents, want) } } func TestRepositoriesService_CreateFile(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/p", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") fmt.Fprint(w, `{ "content":{ "name":"p" }, "commit":{ "message":"m", "sha":"f5f369044773ff9c6383c087466d12adb6fa0828" } }`) }) message := "m" content := []byte("c") repositoryContentsOptions := &RepositoryContentFileOptions{ Message: &message, Content: content, Committer: &CommitAuthor{Name: String("n"), Email: String("e")}, } ctx := context.Background() createResponse, _, err := client.Repositories.CreateFile(ctx, "o", "r", "p", repositoryContentsOptions) if err != nil { t.Errorf("Repositories.CreateFile returned error: %v", err) } want := &RepositoryContentResponse{ Content: &RepositoryContent{Name: String("p")}, Commit: Commit{ Message: String("m"), SHA: String("f5f369044773ff9c6383c087466d12adb6fa0828"), }, } if !cmp.Equal(createResponse, want) { t.Errorf("Repositories.CreateFile returned %+v, want %+v", createResponse, want) } const methodName = "CreateFile" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateFile(ctx, "\n", "\n", "\n", repositoryContentsOptions) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateFile(ctx, "o", "r", "p", repositoryContentsOptions) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_UpdateFile(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/p", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") fmt.Fprint(w, `{ "content":{ "name":"p" }, "commit":{ "message":"m", "sha":"f5f369044773ff9c6383c087466d12adb6fa0828" } }`) }) message := "m" content := []byte("c") sha := "f5f369044773ff9c6383c087466d12adb6fa0828" repositoryContentsOptions := &RepositoryContentFileOptions{ Message: &message, Content: content, SHA: &sha, Committer: &CommitAuthor{Name: String("n"), Email: String("e")}, } ctx := context.Background() updateResponse, _, err := client.Repositories.UpdateFile(ctx, "o", "r", "p", repositoryContentsOptions) if err != nil { t.Errorf("Repositories.UpdateFile returned error: %v", err) } want := &RepositoryContentResponse{ Content: &RepositoryContent{Name: String("p")}, Commit: Commit{ Message: String("m"), SHA: String("f5f369044773ff9c6383c087466d12adb6fa0828"), }, } if !cmp.Equal(updateResponse, want) { t.Errorf("Repositories.UpdateFile returned %+v, want %+v", updateResponse, want) } const methodName = "UpdateFile" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.UpdateFile(ctx, "\n", "\n", "\n", repositoryContentsOptions) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.UpdateFile(ctx, "o", "r", "p", repositoryContentsOptions) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_DeleteFile(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/p", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") fmt.Fprint(w, `{ "content": null, "commit":{ "message":"m", "sha":"f5f369044773ff9c6383c087466d12adb6fa0828" } }`) }) message := "m" sha := "f5f369044773ff9c6383c087466d12adb6fa0828" repositoryContentsOptions := &RepositoryContentFileOptions{ Message: &message, SHA: &sha, Committer: &CommitAuthor{Name: String("n"), Email: String("e")}, } ctx := context.Background() deleteResponse, _, err := client.Repositories.DeleteFile(ctx, "o", "r", "p", repositoryContentsOptions) if err != nil { t.Errorf("Repositories.DeleteFile returned error: %v", err) } want := &RepositoryContentResponse{ Content: nil, Commit: Commit{ Message: String("m"), SHA: String("f5f369044773ff9c6383c087466d12adb6fa0828"), }, } if !cmp.Equal(deleteResponse, want) { t.Errorf("Repositories.DeleteFile returned %+v, want %+v", deleteResponse, want) } const methodName = "DeleteFile" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.DeleteFile(ctx, "\n", "\n", "\n", repositoryContentsOptions) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.DeleteFile(ctx, "o", "r", "p", repositoryContentsOptions) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetArchiveLink(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/tarball", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Redirect(w, r, "http://github.com/a", http.StatusFound) }) ctx := context.Background() url, resp, err := client.Repositories.GetArchiveLink(ctx, "o", "r", Tarball, &RepositoryContentGetOptions{}, true) if err != nil { t.Errorf("Repositories.GetArchiveLink returned error: %v", err) } if resp.StatusCode != http.StatusFound { t.Errorf("Repositories.GetArchiveLink returned status: %d, want %d", resp.StatusCode, http.StatusFound) } want := "http://github.com/a" if url.String() != want { t.Errorf("Repositories.GetArchiveLink returned %+v, want %+v", url.String(), want) } const methodName = "GetArchiveLink" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetArchiveLink(ctx, "\n", "\n", Tarball, &RepositoryContentGetOptions{}, true) return err }) // Add custom round tripper client.client.Transport = roundTripperFunc(func(r *http.Request) (*http.Response, error) { return nil, errors.New("failed to get archive link") }) testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetArchiveLink(ctx, "o", "r", Tarball, &RepositoryContentGetOptions{}, true) return err }) } func TestRepositoriesService_GetArchiveLink_StatusMovedPermanently_dontFollowRedirects(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/tarball", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Redirect(w, r, "http://github.com/a", http.StatusMovedPermanently) }) ctx := context.Background() _, resp, _ := client.Repositories.GetArchiveLink(ctx, "o", "r", Tarball, &RepositoryContentGetOptions{}, false) if resp.StatusCode != http.StatusMovedPermanently { t.Errorf("Repositories.GetArchiveLink returned status: %d, want %d", resp.StatusCode, http.StatusMovedPermanently) } } func TestRepositoriesService_GetArchiveLink_StatusMovedPermanently_followRedirects(t *testing.T) { client, mux, serverURL, teardown := setup() defer teardown() // Mock a redirect link, which leads to an archive link mux.HandleFunc("/repos/o/r/tarball", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") redirectURL, _ := url.Parse(serverURL + baseURLPath + "/redirect") http.Redirect(w, r, redirectURL.String(), http.StatusMovedPermanently) }) mux.HandleFunc("/redirect", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Redirect(w, r, "http://github.com/a", http.StatusFound) }) ctx := context.Background() url, resp, err := client.Repositories.GetArchiveLink(ctx, "o", "r", Tarball, &RepositoryContentGetOptions{}, true) if err != nil { t.Errorf("Repositories.GetArchiveLink returned error: %v", err) } if resp.StatusCode != http.StatusFound { t.Errorf("Repositories.GetArchiveLink returned status: %d, want %d", resp.StatusCode, http.StatusFound) } want := "http://github.com/a" if url.String() != want { t.Errorf("Repositories.GetArchiveLink returned %+v, want %+v", url.String(), want) } } func TestRepositoriesService_GetContents_NoTrailingSlashInDirectoryApiPath(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contents/.github", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") query := r.URL.Query() if query.Get("ref") != "mybranch" { t.Errorf("Repositories.GetContents returned %+v, want %+v", query.Get("ref"), "mybranch") } fmt.Fprint(w, `{}`) }) ctx := context.Background() _, _, _, err := client.Repositories.GetContents(ctx, "o", "r", ".github/", &RepositoryContentGetOptions{ Ref: "mybranch", }) if err != nil { t.Fatalf("Repositories.GetContents returned error: %v", err) } } func TestRepositoryContent_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryContent{}, "{}") r := &RepositoryContent{ Type: String("type"), Target: String("target"), Encoding: String("encoding"), Size: Int(1), Name: String("name"), Path: String("path"), Content: String("content"), SHA: String("sha"), URL: String("url"), GitURL: String("gurl"), HTMLURL: String("hurl"), DownloadURL: String("durl"), } want := `{ "type": "type", "target": "target", "encoding": "encoding", "size": 1, "name": "name", "path": "path", "content": "content", "sha": "sha", "url": "url", "git_url": "gurl", "html_url": "hurl", "download_url": "durl" }` testJSONMarshal(t, r, want) } func TestRepositoryContentResponse_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryContentResponse{}, "{}") r := &RepositoryContentResponse{ Content: &RepositoryContent{ Type: String("type"), Target: String("target"), Encoding: String("encoding"), Size: Int(1), Name: String("name"), Path: String("path"), Content: String("content"), SHA: String("sha"), URL: String("url"), GitURL: String("gurl"), HTMLURL: String("hurl"), DownloadURL: String("durl"), }, Commit: Commit{ SHA: String("s"), Author: &CommitAuthor{ Date: &referenceTime, Name: String("n"), Email: String("e"), Login: String("u"), }, Committer: &CommitAuthor{ Date: &referenceTime, Name: String("n"), Email: String("e"), Login: String("u"), }, Message: String("m"), Tree: &Tree{ SHA: String("s"), Entries: []*TreeEntry{{ SHA: String("s"), Path: String("p"), Mode: String("m"), Type: String("t"), Size: Int(1), Content: String("c"), URL: String("u"), }}, Truncated: Bool(false), }, Parents: nil, Stats: &CommitStats{ Additions: Int(1), Deletions: Int(1), Total: Int(1), }, HTMLURL: String("h"), URL: String("u"), Verification: &SignatureVerification{ Verified: Bool(false), Reason: String("r"), Signature: String("s"), Payload: String("p"), }, NodeID: String("n"), CommentCount: Int(1), SigningKey: &openpgp.Entity{}, }, } want := `{ "content": { "type": "type", "target": "target", "encoding": "encoding", "size": 1, "name": "name", "path": "path", "content": "content", "sha": "sha", "url": "url", "git_url": "gurl", "html_url": "hurl", "download_url": "durl" }, "commit": { "sha": "s", "author": { "date": ` + referenceTimeStr + `, "name": "n", "email": "e", "username": "u" }, "committer": { "date": ` + referenceTimeStr + `, "name": "n", "email": "e", "username": "u" }, "message": "m", "tree": { "sha": "s", "tree": [ { "sha": "s", "path": "p", "mode": "m", "type": "t", "size": 1, "content": "c", "url": "u" } ], "truncated": false }, "stats": { "additions": 1, "deletions": 1, "total": 1 }, "html_url": "h", "url": "u", "verification": { "verified": false, "reason": "r", "signature": "s", "payload": "p" }, "node_id": "n", "comment_count": 1 } }` testJSONMarshal(t, r, want) } func TestRepositoryContentFileOptions_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryContentFileOptions{}, "{}") r := &RepositoryContentFileOptions{ Message: String("type"), Content: []byte{1}, SHA: String("type"), Branch: String("type"), Author: &CommitAuthor{ Date: &referenceTime, Name: String("name"), Email: String("email"), Login: String("login"), }, Committer: &CommitAuthor{ Date: &referenceTime, Name: String("name"), Email: String("email"), Login: String("login"), }, } want := `{ "message": "type", "content": "AQ==", "sha": "type", "branch": "type", "author": { "date": ` + referenceTimeStr + `, "name": "name", "email": "email", "username": "login" }, "committer": { "date": ` + referenceTimeStr + `, "name": "name", "email": "email", "username": "login" } }` testJSONMarshal(t, r, want) } go-github-38.1.0/github/repos_deployments.go000066400000000000000000000221031410475703100210540ustar00rootroot00000000000000// 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 ( "context" "encoding/json" "fmt" "strings" ) // Deployment represents a deployment in a repo type Deployment struct { URL *string `json:"url,omitempty"` ID *int64 `json:"id,omitempty"` SHA *string `json:"sha,omitempty"` Ref *string `json:"ref,omitempty"` Task *string `json:"task,omitempty"` Payload json.RawMessage `json:"payload,omitempty"` Environment *string `json:"environment,omitempty"` Description *string `json:"description,omitempty"` Creator *User `json:"creator,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` StatusesURL *string `json:"statuses_url,omitempty"` RepositoryURL *string `json:"repository_url,omitempty"` NodeID *string `json:"node_id,omitempty"` } // DeploymentRequest represents a deployment request type DeploymentRequest struct { Ref *string `json:"ref,omitempty"` Task *string `json:"task,omitempty"` AutoMerge *bool `json:"auto_merge,omitempty"` RequiredContexts *[]string `json:"required_contexts,omitempty"` Payload interface{} `json:"payload,omitempty"` Environment *string `json:"environment,omitempty"` Description *string `json:"description,omitempty"` TransientEnvironment *bool `json:"transient_environment,omitempty"` ProductionEnvironment *bool `json:"production_environment,omitempty"` } // DeploymentsListOptions specifies the optional parameters to the // RepositoriesService.ListDeployments method. type DeploymentsListOptions struct { // SHA of the Deployment. SHA string `url:"sha,omitempty"` // List deployments for a given ref. Ref string `url:"ref,omitempty"` // List deployments for a given task. Task string `url:"task,omitempty"` // List deployments for a given environment. Environment string `url:"environment,omitempty"` ListOptions } // ListDeployments lists the deployments of a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-deployments func (s *RepositoriesService) ListDeployments(ctx context.Context, owner, repo string, opts *DeploymentsListOptions) ([]*Deployment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/deployments", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var deployments []*Deployment resp, err := s.client.Do(ctx, req, &deployments) if err != nil { return nil, resp, err } return deployments, resp, nil } // GetDeployment returns a single deployment of a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-deployment func (s *RepositoriesService) GetDeployment(ctx context.Context, owner, repo string, deploymentID int64) (*Deployment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/deployments/%v", owner, repo, deploymentID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } deployment := new(Deployment) resp, err := s.client.Do(ctx, req, deployment) if err != nil { return nil, resp, err } return deployment, resp, nil } // CreateDeployment creates a new deployment for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-a-deployment func (s *RepositoriesService) CreateDeployment(ctx context.Context, owner, repo string, request *DeploymentRequest) (*Deployment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/deployments", owner, repo) req, err := s.client.NewRequest("POST", u, request) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. acceptHeaders := []string{mediaTypeDeploymentStatusPreview, mediaTypeExpandDeploymentStatusPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) d := new(Deployment) resp, err := s.client.Do(ctx, req, d) if err != nil { return nil, resp, err } return d, resp, nil } // DeleteDeployment deletes an existing deployment for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#delete-a-deployment func (s *RepositoriesService) DeleteDeployment(ctx context.Context, owner, repo string, deploymentID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/deployments/%v", owner, repo, deploymentID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DeploymentStatus represents the status of a // particular deployment. type DeploymentStatus struct { ID *int64 `json:"id,omitempty"` // State is the deployment state. // Possible values are: "pending", "success", "failure", "error", // "inactive", "in_progress", "queued". State *string `json:"state,omitempty"` Creator *User `json:"creator,omitempty"` Description *string `json:"description,omitempty"` Environment *string `json:"environment,omitempty"` NodeID *string `json:"node_id,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` TargetURL *string `json:"target_url,omitempty"` DeploymentURL *string `json:"deployment_url,omitempty"` RepositoryURL *string `json:"repository_url,omitempty"` EnvironmentURL *string `json:"environment_url,omitempty"` LogURL *string `json:"log_url,omitempty"` URL *string `json:"url,omitempty"` } // DeploymentStatusRequest represents a deployment request type DeploymentStatusRequest struct { State *string `json:"state,omitempty"` LogURL *string `json:"log_url,omitempty"` Description *string `json:"description,omitempty"` Environment *string `json:"environment,omitempty"` EnvironmentURL *string `json:"environment_url,omitempty"` AutoInactive *bool `json:"auto_inactive,omitempty"` } // ListDeploymentStatuses lists the statuses of a given deployment of a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-deployment-statuses func (s *RepositoriesService) ListDeploymentStatuses(ctx context.Context, owner, repo string, deployment int64, opts *ListOptions) ([]*DeploymentStatus, *Response, error) { u := fmt.Sprintf("repos/%v/%v/deployments/%v/statuses", owner, repo, deployment) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. acceptHeaders := []string{mediaTypeDeploymentStatusPreview, mediaTypeExpandDeploymentStatusPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) var statuses []*DeploymentStatus resp, err := s.client.Do(ctx, req, &statuses) if err != nil { return nil, resp, err } return statuses, resp, nil } // GetDeploymentStatus returns a single deployment status of a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-deployment-status func (s *RepositoriesService) GetDeploymentStatus(ctx context.Context, owner, repo string, deploymentID, deploymentStatusID int64) (*DeploymentStatus, *Response, error) { u := fmt.Sprintf("repos/%v/%v/deployments/%v/statuses/%v", owner, repo, deploymentID, deploymentStatusID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. acceptHeaders := []string{mediaTypeDeploymentStatusPreview, mediaTypeExpandDeploymentStatusPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) d := new(DeploymentStatus) resp, err := s.client.Do(ctx, req, d) if err != nil { return nil, resp, err } return d, resp, nil } // CreateDeploymentStatus creates a new status for a deployment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-a-deployment-status func (s *RepositoriesService) CreateDeploymentStatus(ctx context.Context, owner, repo string, deployment int64, request *DeploymentStatusRequest) (*DeploymentStatus, *Response, error) { u := fmt.Sprintf("repos/%v/%v/deployments/%v/statuses", owner, repo, deployment) req, err := s.client.NewRequest("POST", u, request) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. acceptHeaders := []string{mediaTypeDeploymentStatusPreview, mediaTypeExpandDeploymentStatusPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) d := new(DeploymentStatus) resp, err := s.client.Do(ctx, req, d) if err != nil { return nil, resp, err } return d, resp, nil } go-github-38.1.0/github/repos_deployments_test.go000066400000000000000000000353701410475703100221250ustar00rootroot00000000000000// 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 ( "context" "encoding/json" "fmt" "net/http" "strings" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_ListDeployments(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/deployments", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"environment": "test"}) fmt.Fprint(w, `[{"id":1}, {"id":2}]`) }) opt := &DeploymentsListOptions{Environment: "test"} ctx := context.Background() deployments, _, err := client.Repositories.ListDeployments(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListDeployments returned error: %v", err) } want := []*Deployment{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(deployments, want) { t.Errorf("Repositories.ListDeployments returned %+v, want %+v", deployments, want) } const methodName = "ListDeployments" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListDeployments(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListDeployments(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetDeployment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/deployments/3", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":3}`) }) ctx := context.Background() deployment, _, err := client.Repositories.GetDeployment(ctx, "o", "r", 3) if err != nil { t.Errorf("Repositories.GetDeployment returned error: %v", err) } want := &Deployment{ID: Int64(3)} if !cmp.Equal(deployment, want) { t.Errorf("Repositories.GetDeployment returned %+v, want %+v", deployment, want) } const methodName = "GetDeployment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetDeployment(ctx, "\n", "\n", 3) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetDeployment(ctx, "o", "r", 3) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_CreateDeployment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &DeploymentRequest{Ref: String("1111"), Task: String("deploy"), TransientEnvironment: Bool(true)} mux.HandleFunc("/repos/o/r/deployments", func(w http.ResponseWriter, r *http.Request) { v := new(DeploymentRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") wantAcceptHeaders := []string{mediaTypeDeploymentStatusPreview, mediaTypeExpandDeploymentStatusPreview} testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"ref": "1111", "task": "deploy"}`) }) ctx := context.Background() deployment, _, err := client.Repositories.CreateDeployment(ctx, "o", "r", input) if err != nil { t.Errorf("Repositories.CreateDeployment returned error: %v", err) } want := &Deployment{Ref: String("1111"), Task: String("deploy")} if !cmp.Equal(deployment, want) { t.Errorf("Repositories.CreateDeployment returned %+v, want %+v", deployment, want) } const methodName = "CreateDeployment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateDeployment(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateDeployment(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_DeleteDeployment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/deployments/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() resp, err := client.Repositories.DeleteDeployment(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.DeleteDeployment returned error: %v", err) } if resp.StatusCode != http.StatusNoContent { t.Error("Repositories.DeleteDeployment should return a 204 status") } resp, err = client.Repositories.DeleteDeployment(ctx, "o", "r", 2) if err == nil { t.Error("Repositories.DeleteDeployment should return an error") } if resp.StatusCode != http.StatusNotFound { t.Error("Repositories.DeleteDeployment should return a 404 status") } const methodName = "DeleteDeployment" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.DeleteDeployment(ctx, "\n", "\n", 1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DeleteDeployment(ctx, "o", "r", 1) }) } func TestRepositoriesService_ListDeploymentStatuses(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeDeploymentStatusPreview, mediaTypeExpandDeploymentStatusPreview} mux.HandleFunc("/repos/o/r/deployments/1/statuses", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}, {"id":2}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() statutses, _, err := client.Repositories.ListDeploymentStatuses(ctx, "o", "r", 1, opt) if err != nil { t.Errorf("Repositories.ListDeploymentStatuses returned error: %v", err) } want := []*DeploymentStatus{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(statutses, want) { t.Errorf("Repositories.ListDeploymentStatuses returned %+v, want %+v", statutses, want) } const methodName = "ListDeploymentStatuses" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListDeploymentStatuses(ctx, "\n", "\n", 1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListDeploymentStatuses(ctx, "o", "r", 1, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetDeploymentStatus(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeDeploymentStatusPreview, mediaTypeExpandDeploymentStatusPreview} mux.HandleFunc("/repos/o/r/deployments/3/statuses/4", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) fmt.Fprint(w, `{"id":4}`) }) ctx := context.Background() deploymentStatus, _, err := client.Repositories.GetDeploymentStatus(ctx, "o", "r", 3, 4) if err != nil { t.Errorf("Repositories.GetDeploymentStatus returned error: %v", err) } want := &DeploymentStatus{ID: Int64(4)} if !cmp.Equal(deploymentStatus, want) { t.Errorf("Repositories.GetDeploymentStatus returned %+v, want %+v", deploymentStatus, want) } const methodName = "GetDeploymentStatus" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetDeploymentStatus(ctx, "\n", "\n", 3, 4) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetDeploymentStatus(ctx, "o", "r", 3, 4) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_CreateDeploymentStatus(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &DeploymentStatusRequest{State: String("inactive"), Description: String("deploy"), AutoInactive: Bool(false)} mux.HandleFunc("/repos/o/r/deployments/1/statuses", func(w http.ResponseWriter, r *http.Request) { v := new(DeploymentStatusRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") wantAcceptHeaders := []string{mediaTypeDeploymentStatusPreview, mediaTypeExpandDeploymentStatusPreview} testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"state": "inactive", "description": "deploy"}`) }) ctx := context.Background() deploymentStatus, _, err := client.Repositories.CreateDeploymentStatus(ctx, "o", "r", 1, input) if err != nil { t.Errorf("Repositories.CreateDeploymentStatus returned error: %v", err) } want := &DeploymentStatus{State: String("inactive"), Description: String("deploy")} if !cmp.Equal(deploymentStatus, want) { t.Errorf("Repositories.CreateDeploymentStatus returned %+v, want %+v", deploymentStatus, want) } const methodName = "CreateDeploymentStatus" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateDeploymentStatus(ctx, "\n", "\n", 1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateDeploymentStatus(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestDeploymentStatusRequest_Marshal(t *testing.T) { testJSONMarshal(t, &DeploymentStatusRequest{}, "{}") r := &DeploymentStatusRequest{ State: String("state"), LogURL: String("logurl"), Description: String("desc"), Environment: String("env"), EnvironmentURL: String("eurl"), AutoInactive: Bool(false), } want := `{ "state": "state", "log_url": "logurl", "description": "desc", "environment": "env", "environment_url": "eurl", "auto_inactive": false }` testJSONMarshal(t, r, want) } func TestDeploymentStatus_Marshal(t *testing.T) { testJSONMarshal(t, &DeploymentStatus{}, "{}") r := &DeploymentStatus{ ID: Int64(1), State: String("state"), Creator: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, Description: String("desc"), Environment: String("env"), NodeID: String("nid"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, TargetURL: String("turl"), DeploymentURL: String("durl"), RepositoryURL: String("rurl"), EnvironmentURL: String("eurl"), LogURL: String("lurl"), URL: String("url"), } want := `{ "id": 1, "state": "state", "creator": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "description": "desc", "environment": "env", "node_id": "nid", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "target_url": "turl", "deployment_url": "durl", "repository_url": "rurl", "environment_url": "eurl", "log_url": "lurl", "url": "url" }` testJSONMarshal(t, r, want) } func TestDeploymentRequest_Marshal(t *testing.T) { testJSONMarshal(t, &DeploymentRequest{}, "{}") r := &DeploymentRequest{ Ref: String("ref"), Task: String("task"), AutoMerge: Bool(false), RequiredContexts: &[]string{"s"}, Payload: "payload", Environment: String("environment"), Description: String("description"), TransientEnvironment: Bool(false), ProductionEnvironment: Bool(false), } want := `{ "ref": "ref", "task": "task", "auto_merge": false, "required_contexts": ["s"], "payload": "payload", "environment": "environment", "description": "description", "transient_environment": false, "production_environment": false }` testJSONMarshal(t, r, want) } func TestDeployment_Marshal(t *testing.T) { testJSONMarshal(t, &Deployment{}, "{}") str := "s" jsonMsg, _ := json.Marshal(str) r := &Deployment{ URL: String("url"), ID: Int64(1), SHA: String("sha"), Ref: String("ref"), Task: String("task"), Payload: jsonMsg, Environment: String("env"), Description: String("desc"), Creator: &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, StatusesURL: String("surl"), RepositoryURL: String("rurl"), NodeID: String("nid"), } want := `{ "url": "url", "id": 1, "sha": "sha", "ref": "ref", "task": "task", "payload": "s", "environment": "env", "description": "desc", "creator": { "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "statuses_url": "surl", "repository_url": "rurl", "node_id": "nid" }` testJSONMarshal(t, r, want) } go-github-38.1.0/github/repos_environments.go000066400000000000000000000150531410475703100212460ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "encoding/json" "fmt" ) // Environment represents a single environment in a repository. type Environment struct { Owner *string `json:"owner,omitempty"` Repo *string `json:"repo,omitempty"` EnvironmentName *string `json:"environment_name,omitempty"` WaitTimer *int `json:"wait_timer,omitempty"` Reviewers []*EnvReviewers `json:"reviewers,omitempty"` DeploymentBranchPolicy *BranchPolicy `json:"deployment_branch_policy,omitempty"` // Return/response only values ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Name *string `json:"name,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` ProtectionRules []*ProtectionRule `json:"protection_rules,omitempty"` } // EnvReviewers represents a single environment reviewer entry. type EnvReviewers struct { Type *string `json:"type,omitempty"` ID *int64 `json:"id,omitempty"` } // BranchPolicy represents the options for whether a branch deployment policy is applied to this environment. type BranchPolicy struct { ProtectedBranches *bool `json:"protected_branches,omitempty"` CustomBranchPolicies *bool `json:"custom_branch_policies,omitempty"` } // EnvResponse represents the slightly different format of response that comes back when you list an environment. type EnvResponse struct { TotalCount *int `json:"total_count,omitempty"` Environments []*Environment `json:"environments,omitempty"` } // ProtectionRule represents a single protection rule applied to the environment. type ProtectionRule struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Type *string `json:"type,omitempty"` WaitTimer *int `json:"wait_timer,omitempty"` Reviewers []*RequiredReviewer `json:"reviewers,omitempty"` } // RequiredReviewer represents a required reviewer. type RequiredReviewer struct { Type *string `json:"type,omitempty"` Reviewer interface{} `json:"reviewer,omitempty"` } // UnmarshalJSON implements the json.Unmarshaler interface. // This helps us handle the fact that RequiredReviewer can have either a User or Team type reviewer field. func (r *RequiredReviewer) UnmarshalJSON(data []byte) error { type aliasReviewer RequiredReviewer var reviewer aliasReviewer if err := json.Unmarshal(data, &reviewer); err != nil { return err } r.Type = reviewer.Type switch *reviewer.Type { case "User": reviewer.Reviewer = &User{} if err := json.Unmarshal(data, &reviewer); err != nil { return err } r.Reviewer = reviewer.Reviewer case "Team": reviewer.Reviewer = &Team{} if err := json.Unmarshal(data, &reviewer); err != nil { return err } r.Reviewer = reviewer.Reviewer default: r.Type = nil r.Reviewer = nil return fmt.Errorf("reviewer.Type is %T, not a string of 'User' or 'Team', unable to unmarshal", reviewer.Type) } return nil } // ListEnvironments lists all environments for a repository. // // GitHub API docs: https://docs.github.com/en/rest/reference/repos#get-all-environments func (s *RepositoriesService) ListEnvironments(ctx context.Context, owner, repo string) (*EnvResponse, *Response, error) { u := fmt.Sprintf("repos/%s/%s/environments", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var list *EnvResponse resp, err := s.client.Do(ctx, req, &list) if err != nil { return nil, resp, err } return list, resp, nil } // GetEnvironment get a single environment for a repository. // // GitHub API docs: https://docs.github.com/en/rest/reference/repos#get-an-environment func (s *RepositoriesService) GetEnvironment(ctx context.Context, owner, repo, name string) (*Environment, *Response, error) { u := fmt.Sprintf("repos/%s/%s/environments/%s", owner, repo, name) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var env *Environment resp, err := s.client.Do(ctx, req, &env) if err != nil { return nil, resp, err } return env, resp, nil } // MarshalJSON implements the json.Marshaler interface. // As the only way to clear a WaitTimer is to set it to 0, a missing WaitTimer object should default to 0, not null. func (c *CreateUpdateEnvironment) MarshalJSON() ([]byte, error) { type Alias CreateUpdateEnvironment if c.WaitTimer == nil { c.WaitTimer = Int(0) } return json.Marshal(&struct { *Alias }{ Alias: (*Alias)(c), }) } // CreateUpdateEnvironment represents the fields required for the create/update operation // following the Create/Update release example. // See https://github.com/google/go-github/issues/992 for more information. // Removed omitempty here as the API expects null values for reviewers and deployment_branch_policy to clear them. type CreateUpdateEnvironment struct { WaitTimer *int `json:"wait_timer"` Reviewers []*EnvReviewers `json:"reviewers"` DeploymentBranchPolicy *BranchPolicy `json:"deployment_branch_policy"` } // CreateUpdateEnvironment create or update a new environment for a repository. // // GitHub API docs: https://docs.github.com/en/rest/reference/repos#create-or-update-an-environment func (s *RepositoriesService) CreateUpdateEnvironment(ctx context.Context, owner, repo, name string, environment *CreateUpdateEnvironment) (*Environment, *Response, error) { u := fmt.Sprintf("repos/%s/%s/environments/%s", owner, repo, name) req, err := s.client.NewRequest("PUT", u, environment) if err != nil { return nil, nil, err } e := new(Environment) resp, err := s.client.Do(ctx, req, e) if err != nil { return nil, resp, err } return e, resp, nil } // DeleteEnvironment delete an environment from a repository. // // GitHub API docs: https://docs.github.com/en/rest/reference/repos#delete-an-environment func (s *RepositoriesService) DeleteEnvironment(ctx context.Context, owner, repo, name string) (*Response, error) { u := fmt.Sprintf("repos/%s/%s/environments/%s", owner, repo, name) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/repos_environments_test.go000066400000000000000000000200761410475703100223060ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestRequiredReviewer_UnmarshalJSON(t *testing.T) { var testCases = map[string]struct { data []byte wantRule []*RequiredReviewer wantError bool }{ "User Reviewer": { data: []byte(`[{"type": "User", "reviewer": {"id": 1,"login": "octocat"}}]`), wantRule: []*RequiredReviewer{{Type: String("User"), Reviewer: &User{ID: Int64(1), Login: String("octocat")}}}, wantError: false, }, "Team Reviewer": { data: []byte(`[{"type": "Team", "reviewer": {"id": 1, "name": "Justice League"}}]`), wantRule: []*RequiredReviewer{{Type: String("Team"), Reviewer: &Team{ID: Int64(1), Name: String("Justice League")}}}, wantError: false, }, "Both Types Reviewer": { data: []byte(`[{"type": "User", "reviewer": {"id": 1,"login": "octocat"}},{"type": "Team", "reviewer": {"id": 1, "name": "Justice League"}}]`), wantRule: []*RequiredReviewer{{Type: String("User"), Reviewer: &User{ID: Int64(1), Login: String("octocat")}}, {Type: String("Team"), Reviewer: &Team{ID: Int64(1), Name: String("Justice League")}}}, wantError: false, }, "Empty JSON Object": { data: []byte(`[]`), wantRule: []*RequiredReviewer{}, wantError: false, }, "Bad JSON Object": { data: []byte(`[badjson: 1]`), wantRule: []*RequiredReviewer{}, wantError: true, }, "Wrong Type Type in Reviewer Object": { data: []byte(`[{"type": 1, "reviewer": {"id": 1}}]`), wantRule: []*RequiredReviewer{{Type: nil, Reviewer: nil}}, wantError: true, }, "Wrong ID Type in User Object": { data: []byte(`[{"type": "User", "reviewer": {"id": "string"}}]`), wantRule: []*RequiredReviewer{{Type: String("User"), Reviewer: nil}}, wantError: true, }, "Wrong ID Type in Team Object": { data: []byte(`[{"type": "Team", "reviewer": {"id": "string"}}]`), wantRule: []*RequiredReviewer{{Type: String("Team"), Reviewer: nil}}, wantError: true, }, "Wrong Type of Reviewer": { data: []byte(`[{"type": "Cat", "reviewer": {"id": 1,"login": "octocat"}}]`), wantRule: []*RequiredReviewer{{Type: nil, Reviewer: nil}}, wantError: true, }, } for name, test := range testCases { t.Run(name, func(t *testing.T) { rule := []*RequiredReviewer{} err := json.Unmarshal(test.data, &rule) if err != nil && !test.wantError { t.Errorf("RequiredReviewer.UnmarshalJSON returned an error when we expected nil") } if err == nil && test.wantError { t.Errorf("RequiredReviewer.UnmarshalJSON returned no error when we expected one") } if !cmp.Equal(test.wantRule, rule) { t.Errorf("RequiredReviewer.UnmarshalJSON expected rule %+v, got %+v", test.wantRule, rule) } }) } } func TestCreateUpdateEnvironment_MarshalJSON(t *testing.T) { cu := &CreateUpdateEnvironment{} got, err := cu.MarshalJSON() if err != nil { t.Errorf("MarshalJSON: %v", err) } want := `{"wait_timer":0,"reviewers":null,"deployment_branch_policy":null}` if string(got) != want { t.Errorf("MarshalJSON = %s, want %v", got, want) } } func TestRepositoriesService_ListEnvironments(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/environments", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"total_count":1, "environments":[{"id":1}, {"id": 2}]}`) }) ctx := context.Background() environments, _, err := client.Repositories.ListEnvironments(ctx, "o", "r") if err != nil { t.Errorf("Repositories.ListEnvironments returned error: %v", err) } want := &EnvResponse{TotalCount: Int(1), Environments: []*Environment{{ID: Int64(1)}, {ID: Int64(2)}}} if !cmp.Equal(environments, want) { t.Errorf("Repositories.ListEnvironments returned %+v, want %+v", environments, want) } const methodName = "ListEnvironments" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListEnvironments(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListEnvironments(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetEnvironment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/environments/e", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id": 1,"name": "staging", "deployment_branch_policy": {"protected_branches": true, "custom_branch_policies": false}}`) }) ctx := context.Background() release, resp, err := client.Repositories.GetEnvironment(ctx, "o", "r", "e") if err != nil { t.Errorf("Repositories.GetEnvironment returned error: %v\n%v", err, resp.Body) } want := &Environment{ID: Int64(1), Name: String("staging"), DeploymentBranchPolicy: &BranchPolicy{ProtectedBranches: Bool(true), CustomBranchPolicies: Bool(false)}} if !cmp.Equal(release, want) { t.Errorf("Repositories.GetEnvironment returned %+v, want %+v", release, want) } const methodName = "GetEnvironment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetEnvironment(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetEnvironment(ctx, "o", "r", "e") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_CreateEnvironment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &CreateUpdateEnvironment{ WaitTimer: Int(30), } mux.HandleFunc("/repos/o/r/environments/e", func(w http.ResponseWriter, r *http.Request) { v := new(CreateUpdateEnvironment) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") want := &CreateUpdateEnvironment{WaitTimer: Int(30)} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"id": 1, "name": "staging", "protection_rules": [{"id": 1, "type": "wait_timer", "wait_timer": 30}]}`) }) ctx := context.Background() release, _, err := client.Repositories.CreateUpdateEnvironment(ctx, "o", "r", "e", input) if err != nil { t.Errorf("Repositories.CreateUpdateEnvironment returned error: %v", err) } want := &Environment{ID: Int64(1), Name: String("staging"), ProtectionRules: []*ProtectionRule{{ID: Int64(1), Type: String("wait_timer"), WaitTimer: Int(30)}}} if !cmp.Equal(release, want) { t.Errorf("Repositories.CreateUpdateEnvironment returned %+v, want %+v", release, want) } const methodName = "CreateUpdateEnvironment" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateUpdateEnvironment(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateUpdateEnvironment(ctx, "o", "r", "e", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_DeleteEnvironment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/environments/e", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Repositories.DeleteEnvironment(ctx, "o", "r", "e") if err != nil { t.Errorf("Repositories.DeleteEnvironment returned error: %v", err) } const methodName = "DeleteEnvironment" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.DeleteEnvironment(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DeleteEnvironment(ctx, "o", "r", "e") }) } go-github-38.1.0/github/repos_forks.go000066400000000000000000000055521410475703100176460ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "encoding/json" ) // RepositoryListForksOptions specifies the optional parameters to the // RepositoriesService.ListForks method. type RepositoryListForksOptions struct { // How to sort the forks list. Possible values are: newest, oldest, // watchers. Default is "newest". Sort string `url:"sort,omitempty"` ListOptions } // ListForks lists the forks of the specified repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-forks func (s *RepositoriesService) ListForks(ctx context.Context, owner, repo string, opts *RepositoryListForksOptions) ([]*Repository, *Response, error) { u := fmt.Sprintf("repos/%v/%v/forks", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when topics API fully launches. req.Header.Set("Accept", mediaTypeTopicsPreview) var repos []*Repository resp, err := s.client.Do(ctx, req, &repos) if err != nil { return nil, resp, err } return repos, resp, nil } // RepositoryCreateForkOptions specifies the optional parameters to the // RepositoriesService.CreateFork method. type RepositoryCreateForkOptions struct { // The organization to fork the repository into. Organization string `url:"organization,omitempty"` } // CreateFork creates a fork of the specified repository. // // This method might return an *AcceptedError and a status code of // 202. This is because this is the status that GitHub returns to signify that // it is now computing creating the fork in a background task. In this event, // the Repository value will be returned, which includes the details about the pending fork. // A follow up request, after a delay of a second or so, should result // in a successful request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-a-fork func (s *RepositoriesService) CreateFork(ctx context.Context, owner, repo string, opts *RepositoryCreateForkOptions) (*Repository, *Response, error) { u := fmt.Sprintf("repos/%v/%v/forks", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, nil, err } fork := new(Repository) resp, err := s.client.Do(ctx, req, fork) if err != nil { // Persist AcceptedError's metadata to the Repository object. if aerr, ok := err.(*AcceptedError); ok { if err := json.Unmarshal(aerr.Raw, fork); err != nil { return fork, resp, err } return fork, resp, err } return nil, resp, err } return fork, resp, nil } go-github-38.1.0/github/repos_forks_test.go000066400000000000000000000076541410475703100207120ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_ListForks(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/forks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeTopicsPreview) testFormValues(t, r, values{ "sort": "newest", "page": "3", }) fmt.Fprint(w, `[{"id":1},{"id":2}]`) }) opt := &RepositoryListForksOptions{ Sort: "newest", ListOptions: ListOptions{Page: 3}, } ctx := context.Background() repos, _, err := client.Repositories.ListForks(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListForks returned error: %v", err) } want := []*Repository{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(repos, want) { t.Errorf("Repositories.ListForks returned %+v, want %+v", repos, want) } const methodName = "ListForks" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListForks(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListForks(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListForks_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.ListForks(ctx, "%", "r", nil) testURLParseError(t, err) } func TestRepositoriesService_CreateFork(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/forks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testFormValues(t, r, values{"organization": "o"}) fmt.Fprint(w, `{"id":1}`) }) opt := &RepositoryCreateForkOptions{Organization: "o"} ctx := context.Background() repo, _, err := client.Repositories.CreateFork(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.CreateFork returned error: %v", err) } want := &Repository{ID: Int64(1)} if !cmp.Equal(repo, want) { t.Errorf("Repositories.CreateFork returned %+v, want %+v", repo, want) } const methodName = "CreateFork" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateFork(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateFork(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_CreateFork_deferred(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/forks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testFormValues(t, r, values{"organization": "o"}) // This response indicates the fork will happen asynchronously. w.WriteHeader(http.StatusAccepted) fmt.Fprint(w, `{"id":1}`) }) opt := &RepositoryCreateForkOptions{Organization: "o"} ctx := context.Background() repo, _, err := client.Repositories.CreateFork(ctx, "o", "r", opt) if _, ok := err.(*AcceptedError); !ok { t.Errorf("Repositories.CreateFork returned error: %v (want AcceptedError)", err) } want := &Repository{ID: Int64(1)} if !cmp.Equal(repo, want) { t.Errorf("Repositories.CreateFork returned %+v, want %+v", repo, want) } } func TestRepositoriesService_CreateFork_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.CreateFork(ctx, "%", "r", nil) testURLParseError(t, err) } go-github-38.1.0/github/repos_hooks.go000066400000000000000000000177221410475703100176470ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "time" ) // WebHookPayload represents the data that is received from GitHub when a push // event hook is triggered. The format of these payloads pre-date most of the // GitHub v3 API, so there are lots of minor incompatibilities with the types // defined in the rest of the API. Therefore, several types are duplicated // here to account for these differences. // // GitHub API docs: https://help.github.com/articles/post-receive-hooks type WebHookPayload struct { Action *string `json:"action,omitempty"` After *string `json:"after,omitempty"` Before *string `json:"before,omitempty"` Commits []*WebHookCommit `json:"commits,omitempty"` Compare *string `json:"compare,omitempty"` Created *bool `json:"created,omitempty"` Deleted *bool `json:"deleted,omitempty"` Forced *bool `json:"forced,omitempty"` HeadCommit *WebHookCommit `json:"head_commit,omitempty"` Installation *Installation `json:"installation,omitempty"` Organization *Organization `json:"organization,omitempty"` Pusher *User `json:"pusher,omitempty"` Ref *string `json:"ref,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` } func (w WebHookPayload) String() string { return Stringify(w) } // WebHookCommit represents the commit variant we receive from GitHub in a // WebHookPayload. type WebHookCommit struct { Added []string `json:"added,omitempty"` Author *WebHookAuthor `json:"author,omitempty"` Committer *WebHookAuthor `json:"committer,omitempty"` Distinct *bool `json:"distinct,omitempty"` ID *string `json:"id,omitempty"` Message *string `json:"message,omitempty"` Modified []string `json:"modified,omitempty"` Removed []string `json:"removed,omitempty"` Timestamp *time.Time `json:"timestamp,omitempty"` } func (w WebHookCommit) String() string { return Stringify(w) } // WebHookAuthor represents the author or committer of a commit, as specified // in a WebHookCommit. The commit author may not correspond to a GitHub User. type WebHookAuthor struct { Email *string `json:"email,omitempty"` Name *string `json:"name,omitempty"` Username *string `json:"username,omitempty"` } func (w WebHookAuthor) String() string { return Stringify(w) } // Hook represents a GitHub (web and service) hook for a repository. type Hook struct { CreatedAt *time.Time `json:"created_at,omitempty"` UpdatedAt *time.Time `json:"updated_at,omitempty"` URL *string `json:"url,omitempty"` ID *int64 `json:"id,omitempty"` Type *string `json:"type,omitempty"` Name *string `json:"name,omitempty"` TestURL *string `json:"test_url,omitempty"` PingURL *string `json:"ping_url,omitempty"` LastResponse map[string]interface{} `json:"last_response,omitempty"` // Only the following fields are used when creating a hook. // Config is required. Config map[string]interface{} `json:"config,omitempty"` Events []string `json:"events,omitempty"` Active *bool `json:"active,omitempty"` } func (h Hook) String() string { return Stringify(h) } // createHookRequest is a subset of Hook and is used internally // by CreateHook to pass only the known fields for the endpoint. // // See https://github.com/google/go-github/issues/1015 for more // information. type createHookRequest struct { // Config is required. Name string `json:"name"` Config map[string]interface{} `json:"config,omitempty"` Events []string `json:"events,omitempty"` Active *bool `json:"active,omitempty"` } // CreateHook creates a Hook for the specified repository. // Config is a required field. // // Note that only a subset of the hook fields are used and hook must // not be nil. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-a-repository-webhook func (s *RepositoriesService) CreateHook(ctx context.Context, owner, repo string, hook *Hook) (*Hook, *Response, error) { u := fmt.Sprintf("repos/%v/%v/hooks", owner, repo) hookReq := &createHookRequest{ Name: "web", Events: hook.Events, Active: hook.Active, Config: hook.Config, } req, err := s.client.NewRequest("POST", u, hookReq) if err != nil { return nil, nil, err } h := new(Hook) resp, err := s.client.Do(ctx, req, h) if err != nil { return nil, resp, err } return h, resp, nil } // ListHooks lists all Hooks for the specified repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-repository-webhooks func (s *RepositoriesService) ListHooks(ctx context.Context, owner, repo string, opts *ListOptions) ([]*Hook, *Response, error) { u := fmt.Sprintf("repos/%v/%v/hooks", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var hooks []*Hook resp, err := s.client.Do(ctx, req, &hooks) if err != nil { return nil, resp, err } return hooks, resp, nil } // GetHook returns a single specified Hook. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-repository-webhook func (s *RepositoriesService) GetHook(ctx context.Context, owner, repo string, id int64) (*Hook, *Response, error) { u := fmt.Sprintf("repos/%v/%v/hooks/%d", owner, repo, id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } h := new(Hook) resp, err := s.client.Do(ctx, req, h) if err != nil { return nil, resp, err } return h, resp, nil } // EditHook updates a specified Hook. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#update-a-repository-webhook func (s *RepositoriesService) EditHook(ctx context.Context, owner, repo string, id int64, hook *Hook) (*Hook, *Response, error) { u := fmt.Sprintf("repos/%v/%v/hooks/%d", owner, repo, id) req, err := s.client.NewRequest("PATCH", u, hook) if err != nil { return nil, nil, err } h := new(Hook) resp, err := s.client.Do(ctx, req, h) if err != nil { return nil, resp, err } return h, resp, nil } // DeleteHook deletes a specified Hook. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#delete-a-repository-webhook func (s *RepositoriesService) DeleteHook(ctx context.Context, owner, repo string, id int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/hooks/%d", owner, repo, id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // PingHook triggers a 'ping' event to be sent to the Hook. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#ping-a-repository-webhook func (s *RepositoriesService) PingHook(ctx context.Context, owner, repo string, id int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/hooks/%d/pings", owner, repo, id) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // TestHook triggers a test Hook by github. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#test-the-push-repository-webhook func (s *RepositoriesService) TestHook(ctx context.Context, owner, repo string, id int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/hooks/%d/tests", owner, repo, id) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/repos_hooks_deliveries.go000066400000000000000000000073431410475703100220600ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "encoding/json" "fmt" ) // HookDelivery represents the data that is received from GitHub's Webhook Delivery API // // GitHub API docs: // - https://docs.github.com/en/rest/reference/repos#list-deliveries-for-a-repository-webhook // - https://docs.github.com/en/rest/reference/repos#get-a-delivery-for-a-repository-webhook type HookDelivery struct { ID *int64 `json:"id"` GUID *string `json:"guid"` DeliveredAt *Timestamp `json:"delivered_at"` Redelivery *bool `json:"redelivery"` Duration *float64 `json:"duration"` Status *string `json:"status"` StatusCode *int `json:"status_code"` Event *string `json:"event"` Action *string `json:"action"` InstallationID *string `json:"installation_id"` RepositoryID *int64 `json:"repository_id"` // Request is populated by GetHookDelivery. Request *HookRequest `json:"request,omitempty"` // Response is populated by GetHookDelivery. Response *HookResponse `json:"response,omitempty"` } func (d HookDelivery) String() string { return Stringify(d) } // HookRequest is a part of HookDelivery that contains // the HTTP headers and the JSON payload of the webhook request. type HookRequest struct { Headers map[string]string `json:"headers,omitempty"` RawPayload *json.RawMessage `json:"payload,omitempty"` } func (r HookRequest) String() string { return Stringify(r) } // HookResponse is a part of HookDelivery that contains // the HTTP headers and the response body served by the webhook endpoint. type HookResponse struct { Headers map[string]string `json:"headers,omitempty"` RawPayload *json.RawMessage `json:"payload,omitempty"` } func (r HookResponse) String() string { return Stringify(r) } // ListHookDeliveries lists webhook deliveries for a webhook configured in a repository. // // GitHub API docs: https://docs.github.com/en/rest/reference/repos#list-deliveries-for-a-repository-webhook func (s *RepositoriesService) ListHookDeliveries(ctx context.Context, owner, repo string, id int64, opts *ListCursorOptions) ([]*HookDelivery, *Response, error) { u := fmt.Sprintf("repos/%v/%v/hooks/%v/deliveries", owner, repo, id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } deliveries := []*HookDelivery{} resp, err := s.client.Do(ctx, req, &deliveries) if err != nil { return nil, resp, err } return deliveries, resp, nil } // GetHookDelivery returns a delivery for a webhook configured in a repository. // // GitHub API docs: https://docs.github.com/en/rest/reference/repos#get-a-delivery-for-a-repository-webhook func (s *RepositoriesService) GetHookDelivery(ctx context.Context, owner, repo string, hookID, deliveryID int64) (*HookDelivery, *Response, error) { u := fmt.Sprintf("repos/%v/%v/hooks/%v/deliveries/%v", owner, repo, hookID, deliveryID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } h := new(HookDelivery) resp, err := s.client.Do(ctx, req, h) if err != nil { return nil, resp, err } return h, resp, nil } // ParseRequestPayload parses the request payload. For recognized event types, // a value of the corresponding struct type will be returned. func (d *HookDelivery) ParseRequestPayload() (interface{}, error) { eType, ok := eventTypeMapping[*d.Event] if !ok { return nil, fmt.Errorf("unsupported event type %q", *d.Event) } e := &Event{Type: &eType, RawPayload: d.Request.RawPayload} return e.ParsePayload() } go-github-38.1.0/github/repos_hooks_deliveries_test.go000066400000000000000000000160701410475703100231140ustar00rootroot00000000000000// Copyright 2021 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 ( "context" "encoding/json" "fmt" "net/http" "reflect" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_ListHookDeliveries(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/hooks/1/deliveries", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"cursor": "v1_12077215967"}) fmt.Fprint(w, `[{"id":1}, {"id":2}]`) }) opt := &ListCursorOptions{Cursor: "v1_12077215967"} ctx := context.Background() hooks, _, err := client.Repositories.ListHookDeliveries(ctx, "o", "r", 1, opt) if err != nil { t.Errorf("Repositories.ListHookDeliveries returned error: %v", err) } want := []*HookDelivery{{ID: Int64(1)}, {ID: Int64(2)}} if d := cmp.Diff(hooks, want); d != "" { t.Errorf("Repositories.ListHooks want (-), got (+):\n%s", d) } const methodName = "ListHookDeliveries" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListHookDeliveries(ctx, "\n", "\n", -1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListHookDeliveries(ctx, "o", "r", 1, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListHookDeliveries_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.ListHookDeliveries(ctx, "%", "%", 1, nil) testURLParseError(t, err) } func TestRepositoriesService_GetHookDelivery(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/hooks/1/deliveries/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() hook, _, err := client.Repositories.GetHookDelivery(ctx, "o", "r", 1, 1) if err != nil { t.Errorf("Repositories.GetHookDelivery returned error: %v", err) } want := &HookDelivery{ID: Int64(1)} if !cmp.Equal(hook, want) { t.Errorf("Repositories.GetHookDelivery returned %+v, want %+v", hook, want) } const methodName = "GetHookDelivery" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetHookDelivery(ctx, "\n", "\n", -1, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetHookDelivery(ctx, "o", "r", 1, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetHookDelivery_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.GetHookDelivery(ctx, "%", "%", 1, 1) testURLParseError(t, err) } var hookDeliveryPayloadTypeToStruct = map[string]interface{}{ "check_run": &CheckRunEvent{}, "check_suite": &CheckSuiteEvent{}, "commit_comment": &CommitCommentEvent{}, "content_reference": &ContentReferenceEvent{}, "create": &CreateEvent{}, "delete": &DeleteEvent{}, "deploy_key": &DeployKeyEvent{}, "deployment": &DeploymentEvent{}, "deployment_status": &DeploymentStatusEvent{}, "fork": &ForkEvent{}, "github_app_authorization": &GitHubAppAuthorizationEvent{}, "gollum": &GollumEvent{}, "installation": &InstallationEvent{}, "installation_repositories": &InstallationRepositoriesEvent{}, "issue_comment": &IssueCommentEvent{}, "issues": &IssuesEvent{}, "label": &LabelEvent{}, "marketplace_purchase": &MarketplacePurchaseEvent{}, "member": &MemberEvent{}, "membership": &MembershipEvent{}, "meta": &MetaEvent{}, "milestone": &MilestoneEvent{}, "organization": &OrganizationEvent{}, "org_block": &OrgBlockEvent{}, "package": &PackageEvent{}, "page_build": &PageBuildEvent{}, "ping": &PingEvent{}, "project": &ProjectEvent{}, "project_card": &ProjectCardEvent{}, "project_column": &ProjectColumnEvent{}, "public": &PublicEvent{}, "pull_request": &PullRequestEvent{}, "pull_request_review": &PullRequestReviewEvent{}, "pull_request_review_comment": &PullRequestReviewCommentEvent{}, "pull_request_target": &PullRequestTargetEvent{}, "push": &PushEvent{}, "release": &ReleaseEvent{}, "repository": &RepositoryEvent{}, "repository_dispatch": &RepositoryDispatchEvent{}, "repository_vulnerability_alert": &RepositoryVulnerabilityAlertEvent{}, "star": &StarEvent{}, "status": &StatusEvent{}, "team": &TeamEvent{}, "team_add": &TeamAddEvent{}, "user": &UserEvent{}, "watch": &WatchEvent{}, "workflow_dispatch": &WorkflowDispatchEvent{}, "workflow_run": &WorkflowRunEvent{}, } func TestHookDelivery_ParsePayload(t *testing.T) { for evt, obj := range hookDeliveryPayloadTypeToStruct { t.Run(evt, func(t *testing.T) { bs, err := json.Marshal(obj) if err != nil { t.Fatal(err) } p := json.RawMessage(bs) d := &HookDelivery{ Event: String(evt), Request: &HookRequest{ RawPayload: &p, }, } got, err := d.ParseRequestPayload() if err != nil { t.Error(err) } if !reflect.DeepEqual(obj, got) { t.Errorf("want %T %v, got %T %v", obj, obj, got, got) } }) } } func TestHookDelivery_ParsePayload_invalidEvent(t *testing.T) { p := json.RawMessage(nil) d := &HookDelivery{ Event: String("some_invalid_event"), Request: &HookRequest{ RawPayload: &p, }, } _, err := d.ParseRequestPayload() if err == nil || err.Error() != `unsupported event type "some_invalid_event"` { t.Errorf("unexpected error: %v", err) } } func TestHookDelivery_ParsePayload_invalidPayload(t *testing.T) { p := json.RawMessage([]byte(`{"check_run":{"id":"invalid"}}`)) d := &HookDelivery{ Event: String("check_run"), Request: &HookRequest{ RawPayload: &p, }, } _, err := d.ParseRequestPayload() if err == nil || err.Error() != "json: cannot unmarshal string into Go struct field CheckRun.check_run.id of type int64" { t.Errorf("unexpected error: %v", err) } } go-github-38.1.0/github/repos_hooks_test.go000066400000000000000000000177531410475703100207120ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_CreateHook(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Hook{CreatedAt: &referenceTime} mux.HandleFunc("/repos/o/r/hooks", func(w http.ResponseWriter, r *http.Request) { v := new(createHookRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") want := &createHookRequest{Name: "web"} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() hook, _, err := client.Repositories.CreateHook(ctx, "o", "r", input) if err != nil { t.Errorf("Repositories.CreateHook returned error: %v", err) } want := &Hook{ID: Int64(1)} if !cmp.Equal(hook, want) { t.Errorf("Repositories.CreateHook returned %+v, want %+v", hook, want) } const methodName = "CreateHook" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateHook(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateHook(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListHooks(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/hooks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}, {"id":2}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() hooks, _, err := client.Repositories.ListHooks(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListHooks returned error: %v", err) } want := []*Hook{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(hooks, want) { t.Errorf("Repositories.ListHooks returned %+v, want %+v", hooks, want) } const methodName = "ListHooks" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListHooks(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListHooks(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListHooks_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.ListHooks(ctx, "%", "%", nil) testURLParseError(t, err) } func TestRepositoriesService_GetHook(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/hooks/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() hook, _, err := client.Repositories.GetHook(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.GetHook returned error: %v", err) } want := &Hook{ID: Int64(1)} if !cmp.Equal(hook, want) { t.Errorf("Repositories.GetHook returned %+v, want %+v", hook, want) } const methodName = "GetHook" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetHook(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetHook(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetHook_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.GetHook(ctx, "%", "%", 1) testURLParseError(t, err) } func TestRepositoriesService_EditHook(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Hook{} mux.HandleFunc("/repos/o/r/hooks/1", func(w http.ResponseWriter, r *http.Request) { v := new(Hook) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() hook, _, err := client.Repositories.EditHook(ctx, "o", "r", 1, input) if err != nil { t.Errorf("Repositories.EditHook returned error: %v", err) } want := &Hook{ID: Int64(1)} if !cmp.Equal(hook, want) { t.Errorf("Repositories.EditHook returned %+v, want %+v", hook, want) } const methodName = "EditHook" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.EditHook(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.EditHook(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_EditHook_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.EditHook(ctx, "%", "%", 1, nil) testURLParseError(t, err) } func TestRepositoriesService_DeleteHook(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/hooks/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Repositories.DeleteHook(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.DeleteHook returned error: %v", err) } const methodName = "DeleteHook" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.DeleteHook(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DeleteHook(ctx, "o", "r", 1) }) } func TestRepositoriesService_DeleteHook_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Repositories.DeleteHook(ctx, "%", "%", 1) testURLParseError(t, err) } func TestRepositoriesService_PingHook(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/hooks/1/pings", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") }) ctx := context.Background() _, err := client.Repositories.PingHook(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.PingHook returned error: %v", err) } const methodName = "PingHook" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.PingHook(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.PingHook(ctx, "o", "r", 1) }) } func TestRepositoriesService_TestHook(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/hooks/1/tests", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") }) ctx := context.Background() _, err := client.Repositories.TestHook(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.TestHook returned error: %v", err) } const methodName = "TestHook" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.TestHook(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.TestHook(ctx, "o", "r", 1) }) } func TestRepositoriesService_TestHook_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Repositories.TestHook(ctx, "%", "%", 1) testURLParseError(t, err) } go-github-38.1.0/github/repos_invitations.go000066400000000000000000000057571410475703100211000ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" ) // RepositoryInvitation represents an invitation to collaborate on a repo. type RepositoryInvitation struct { ID *int64 `json:"id,omitempty"` Repo *Repository `json:"repository,omitempty"` Invitee *User `json:"invitee,omitempty"` Inviter *User `json:"inviter,omitempty"` // Permissions represents the permissions that the associated user will have // on the repository. Possible values are: "read", "write", "admin". Permissions *string `json:"permissions,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` } // ListInvitations lists all currently-open repository invitations. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-repository-invitations func (s *RepositoriesService) ListInvitations(ctx context.Context, owner, repo string, opts *ListOptions) ([]*RepositoryInvitation, *Response, error) { u := fmt.Sprintf("repos/%v/%v/invitations", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } invites := []*RepositoryInvitation{} resp, err := s.client.Do(ctx, req, &invites) if err != nil { return nil, resp, err } return invites, resp, nil } // DeleteInvitation deletes a repository invitation. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#delete-a-repository-invitation func (s *RepositoriesService) DeleteInvitation(ctx context.Context, owner, repo string, invitationID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/invitations/%v", owner, repo, invitationID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // UpdateInvitation updates the permissions associated with a repository // invitation. // // permissions represents the permissions that the associated user will have // on the repository. Possible values are: "read", "write", "admin". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#update-a-repository-invitation func (s *RepositoriesService) UpdateInvitation(ctx context.Context, owner, repo string, invitationID int64, permissions string) (*RepositoryInvitation, *Response, error) { opts := &struct { Permissions string `json:"permissions"` }{Permissions: permissions} u := fmt.Sprintf("repos/%v/%v/invitations/%v", owner, repo, invitationID) req, err := s.client.NewRequest("PATCH", u, opts) if err != nil { return nil, nil, err } invite := &RepositoryInvitation{} resp, err := s.client.Do(ctx, req, invite) if err != nil { return nil, resp, err } return invite, resp, nil } go-github-38.1.0/github/repos_invitations_test.go000066400000000000000000000063771410475703100221360ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_ListInvitations(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/invitations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprintf(w, `[{"id":1}, {"id":2}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() got, _, err := client.Repositories.ListInvitations(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListInvitations returned error: %v", err) } want := []*RepositoryInvitation{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(got, want) { t.Errorf("Repositories.ListInvitations = %+v, want %+v", got, want) } const methodName = "ListInvitations" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListInvitations(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListInvitations(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_DeleteInvitation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/invitations/2", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Repositories.DeleteInvitation(ctx, "o", "r", 2) if err != nil { t.Errorf("Repositories.DeleteInvitation returned error: %v", err) } const methodName = "DeleteInvitation" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.DeleteInvitation(ctx, "\n", "\n", 2) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DeleteInvitation(ctx, "o", "r", 2) }) } func TestRepositoriesService_UpdateInvitation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/invitations/2", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") fmt.Fprintf(w, `{"id":1}`) }) ctx := context.Background() got, _, err := client.Repositories.UpdateInvitation(ctx, "o", "r", 2, "write") if err != nil { t.Errorf("Repositories.UpdateInvitation returned error: %v", err) } want := &RepositoryInvitation{ID: Int64(1)} if !cmp.Equal(got, want) { t.Errorf("Repositories.UpdateInvitation = %+v, want %+v", got, want) } const methodName = "UpdateInvitation" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.UpdateInvitation(ctx, "\n", "\n", 2, "write") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.UpdateInvitation(ctx, "o", "r", 2, "write") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-38.1.0/github/repos_keys.go000066400000000000000000000046431410475703100174750ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" ) // The Key type is defined in users_keys.go // ListKeys lists the deploy keys for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-deploy-keys func (s *RepositoriesService) ListKeys(ctx context.Context, owner string, repo string, opts *ListOptions) ([]*Key, *Response, error) { u := fmt.Sprintf("repos/%v/%v/keys", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var keys []*Key resp, err := s.client.Do(ctx, req, &keys) if err != nil { return nil, resp, err } return keys, resp, nil } // GetKey fetches a single deploy key. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-deploy-key func (s *RepositoriesService) GetKey(ctx context.Context, owner string, repo string, id int64) (*Key, *Response, error) { u := fmt.Sprintf("repos/%v/%v/keys/%v", owner, repo, id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } key := new(Key) resp, err := s.client.Do(ctx, req, key) if err != nil { return nil, resp, err } return key, resp, nil } // CreateKey adds a deploy key for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-a-deploy-key func (s *RepositoriesService) CreateKey(ctx context.Context, owner string, repo string, key *Key) (*Key, *Response, error) { u := fmt.Sprintf("repos/%v/%v/keys", owner, repo) req, err := s.client.NewRequest("POST", u, key) if err != nil { return nil, nil, err } k := new(Key) resp, err := s.client.Do(ctx, req, k) if err != nil { return nil, resp, err } return k, resp, nil } // DeleteKey deletes a deploy key. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#delete-a-deploy-key func (s *RepositoriesService) DeleteKey(ctx context.Context, owner string, repo string, id int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/keys/%v", owner, repo, id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/repos_keys_test.go000066400000000000000000000121371410475703100205310ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_ListKeys(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/keys", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() keys, _, err := client.Repositories.ListKeys(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListKeys returned error: %v", err) } want := []*Key{{ID: Int64(1)}} if !cmp.Equal(keys, want) { t.Errorf("Repositories.ListKeys returned %+v, want %+v", keys, want) } const methodName = "ListKeys" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListKeys(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListKeys(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListKeys_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.ListKeys(ctx, "%", "%", nil) testURLParseError(t, err) } func TestRepositoriesService_GetKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/keys/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() key, _, err := client.Repositories.GetKey(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.GetKey returned error: %v", err) } want := &Key{ID: Int64(1)} if !cmp.Equal(key, want) { t.Errorf("Repositories.GetKey returned %+v, want %+v", key, want) } const methodName = "GetKey" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetKey(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetKey(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetKey_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.GetKey(ctx, "%", "%", 1) testURLParseError(t, err) } func TestRepositoriesService_CreateKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Key{Key: String("k"), Title: String("t")} mux.HandleFunc("/repos/o/r/keys", func(w http.ResponseWriter, r *http.Request) { v := new(Key) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() key, _, err := client.Repositories.CreateKey(ctx, "o", "r", input) if err != nil { t.Errorf("Repositories.GetKey returned error: %v", err) } want := &Key{ID: Int64(1)} if !cmp.Equal(key, want) { t.Errorf("Repositories.GetKey returned %+v, want %+v", key, want) } const methodName = "CreateKey" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateKey(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateKey(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_CreateKey_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.CreateKey(ctx, "%", "%", nil) testURLParseError(t, err) } func TestRepositoriesService_DeleteKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/keys/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Repositories.DeleteKey(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.DeleteKey returned error: %v", err) } const methodName = "DeleteKey" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.DeleteKey(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DeleteKey(ctx, "o", "r", 1) }) } func TestRepositoriesService_DeleteKey_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Repositories.DeleteKey(ctx, "%", "%", 1) testURLParseError(t, err) } go-github-38.1.0/github/repos_merging.go000066400000000000000000000021111410475703100201360ustar00rootroot00000000000000// 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 ( "context" "fmt" ) // RepositoryMergeRequest represents a request to merge a branch in a // repository. type RepositoryMergeRequest struct { Base *string `json:"base,omitempty"` Head *string `json:"head,omitempty"` CommitMessage *string `json:"commit_message,omitempty"` } // Merge a branch in the specified repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#merge-a-branch func (s *RepositoriesService) Merge(ctx context.Context, owner, repo string, request *RepositoryMergeRequest) (*RepositoryCommit, *Response, error) { u := fmt.Sprintf("repos/%v/%v/merges", owner, repo) req, err := s.client.NewRequest("POST", u, request) if err != nil { return nil, nil, err } commit := new(RepositoryCommit) resp, err := s.client.Do(ctx, req, commit) if err != nil { return nil, resp, err } return commit, resp, nil } go-github-38.1.0/github/repos_merging_test.go000066400000000000000000000030651410475703100212060ustar00rootroot00000000000000// 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_Merge(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &RepositoryMergeRequest{ Base: String("b"), Head: String("h"), CommitMessage: String("c"), } mux.HandleFunc("/repos/o/r/merges", func(w http.ResponseWriter, r *http.Request) { v := new(RepositoryMergeRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"sha":"s"}`) }) ctx := context.Background() commit, _, err := client.Repositories.Merge(ctx, "o", "r", input) if err != nil { t.Errorf("Repositories.Merge returned error: %v", err) } want := &RepositoryCommit{SHA: String("s")} if !cmp.Equal(commit, want) { t.Errorf("Repositories.Merge returned %+v, want %+v", commit, want) } const methodName = "Merge" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.Merge(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.Merge(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-38.1.0/github/repos_pages.go000066400000000000000000000156231410475703100176210ustar00rootroot00000000000000// 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 ( "context" "fmt" ) // Pages represents a GitHub Pages site configuration. type Pages struct { URL *string `json:"url,omitempty"` Status *string `json:"status,omitempty"` CNAME *string `json:"cname,omitempty"` Custom404 *bool `json:"custom_404,omitempty"` HTMLURL *string `json:"html_url,omitempty"` Source *PagesSource `json:"source,omitempty"` } // PagesSource represents a GitHub page's source. type PagesSource struct { Branch *string `json:"branch,omitempty"` Path *string `json:"path,omitempty"` } // PagesError represents a build error for a GitHub Pages site. type PagesError struct { Message *string `json:"message,omitempty"` } // PagesBuild represents the build information for a GitHub Pages site. type PagesBuild struct { URL *string `json:"url,omitempty"` Status *string `json:"status,omitempty"` Error *PagesError `json:"error,omitempty"` Pusher *User `json:"pusher,omitempty"` Commit *string `json:"commit,omitempty"` Duration *int `json:"duration,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` } // createPagesRequest is a subset of Pages and is used internally // by EnablePages to pass only the known fields for the endpoint. type createPagesRequest struct { Source *PagesSource `json:"source,omitempty"` } // EnablePages enables GitHub Pages for the named repo. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-a-github-pages-site func (s *RepositoriesService) EnablePages(ctx context.Context, owner, repo string, pages *Pages) (*Pages, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pages", owner, repo) pagesReq := &createPagesRequest{ Source: pages.Source, } req, err := s.client.NewRequest("POST", u, pagesReq) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeEnablePagesAPIPreview) enable := new(Pages) resp, err := s.client.Do(ctx, req, enable) if err != nil { return nil, resp, err } return enable, resp, nil } // PagesUpdate sets up parameters needed to update a GitHub Pages site. type PagesUpdate struct { // CNAME represents a custom domain for the repository. // Leaving CNAME empty will remove the custom domain. CNAME *string `json:"cname"` // Source must include the branch name, and may optionally specify the subdirectory "/docs". // Possible values are: "gh-pages", "master", and "master /docs". Source *string `json:"source,omitempty"` } // UpdatePages updates GitHub Pages for the named repo. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#update-information-about-a-github-pages-site func (s *RepositoriesService) UpdatePages(ctx context.Context, owner, repo string, opts *PagesUpdate) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/pages", owner, repo) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, err } resp, err := s.client.Do(ctx, req, nil) if err != nil { return resp, err } return resp, nil } // DisablePages disables GitHub Pages for the named repo. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#delete-a-github-pages-site func (s *RepositoriesService) DisablePages(ctx context.Context, owner, repo string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/pages", owner, repo) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeEnablePagesAPIPreview) return s.client.Do(ctx, req, nil) } // GetPagesInfo fetches information about a GitHub Pages site. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-github-pages-site func (s *RepositoriesService) GetPagesInfo(ctx context.Context, owner, repo string) (*Pages, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pages", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } site := new(Pages) resp, err := s.client.Do(ctx, req, site) if err != nil { return nil, resp, err } return site, resp, nil } // ListPagesBuilds lists the builds for a GitHub Pages site. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-github-pages-builds func (s *RepositoriesService) ListPagesBuilds(ctx context.Context, owner, repo string, opts *ListOptions) ([]*PagesBuild, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pages/builds", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var pages []*PagesBuild resp, err := s.client.Do(ctx, req, &pages) if err != nil { return nil, resp, err } return pages, resp, nil } // GetLatestPagesBuild fetches the latest build information for a GitHub pages site. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-latest-pages-build func (s *RepositoriesService) GetLatestPagesBuild(ctx context.Context, owner, repo string) (*PagesBuild, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pages/builds/latest", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } build := new(PagesBuild) resp, err := s.client.Do(ctx, req, build) if err != nil { return nil, resp, err } return build, resp, nil } // GetPageBuild fetches the specific build information for a GitHub pages site. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-github-pages-build func (s *RepositoriesService) GetPageBuild(ctx context.Context, owner, repo string, id int64) (*PagesBuild, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pages/builds/%v", owner, repo, id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } build := new(PagesBuild) resp, err := s.client.Do(ctx, req, build) if err != nil { return nil, resp, err } return build, resp, nil } // RequestPageBuild requests a build of a GitHub Pages site without needing to push new commit. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#request-a-github-pages-build func (s *RepositoriesService) RequestPageBuild(ctx context.Context, owner, repo string) (*PagesBuild, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pages/builds", owner, repo) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, nil, err } build := new(PagesBuild) resp, err := s.client.Do(ctx, req, build) if err != nil { return nil, resp, err } return build, resp, nil } go-github-38.1.0/github/repos_pages_test.go000066400000000000000000000253161410475703100206600ustar00rootroot00000000000000// 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 ( "bytes" "context" "encoding/json" "fmt" "io/ioutil" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_EnablePages(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Pages{ Source: &PagesSource{ Branch: String("master"), Path: String("/"), }, CNAME: String("www.my-domain.com"), // not passed along. } mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) { v := new(createPagesRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeEnablePagesAPIPreview) want := &createPagesRequest{Source: &PagesSource{Branch: String("master"), Path: String("/")}} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"url":"u","status":"s","cname":"c","custom_404":false,"html_url":"h", "source": {"branch":"master", "path":"/"}}`) }) ctx := context.Background() page, _, err := client.Repositories.EnablePages(ctx, "o", "r", input) if err != nil { t.Errorf("Repositories.EnablePages returned error: %v", err) } want := &Pages{URL: String("u"), Status: String("s"), CNAME: String("c"), Custom404: Bool(false), HTMLURL: String("h"), Source: &PagesSource{Branch: String("master"), Path: String("/")}} if !cmp.Equal(page, want) { t.Errorf("Repositories.EnablePages returned %v, want %v", page, want) } const methodName = "EnablePages" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.EnablePages(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.EnablePages(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_UpdatePages(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &PagesUpdate{ CNAME: String("www.my-domain.com"), Source: String("gh-pages"), } mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) { v := new(PagesUpdate) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") want := &PagesUpdate{CNAME: String("www.my-domain.com"), Source: String("gh-pages")} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"cname":"www.my-domain.com","source":"gh-pages"}`) }) ctx := context.Background() _, err := client.Repositories.UpdatePages(ctx, "o", "r", input) if err != nil { t.Errorf("Repositories.UpdatePages returned error: %v", err) } const methodName = "UpdatePages" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.UpdatePages(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.UpdatePages(ctx, "o", "r", input) }) } func TestRepositoriesService_UpdatePages_NullCNAME(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &PagesUpdate{ Source: String("gh-pages"), } mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) { got, err := ioutil.ReadAll(r.Body) if err != nil { t.Fatalf("unable to read body: %v", err) } want := []byte(`{"cname":null,"source":"gh-pages"}` + "\n") if !bytes.Equal(got, want) { t.Errorf("Request body = %+v, want %+v", got, want) } fmt.Fprint(w, `{"cname":null,"source":"gh-pages"}`) }) ctx := context.Background() _, err := client.Repositories.UpdatePages(ctx, "o", "r", input) if err != nil { t.Errorf("Repositories.UpdatePages returned error: %v", err) } } func TestRepositoriesService_DisablePages(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeEnablePagesAPIPreview) }) ctx := context.Background() _, err := client.Repositories.DisablePages(ctx, "o", "r") if err != nil { t.Errorf("Repositories.DisablePages returned error: %v", err) } const methodName = "DisablePages" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.DisablePages(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DisablePages(ctx, "o", "r") }) } func TestRepositoriesService_GetPagesInfo(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"url":"u","status":"s","cname":"c","custom_404":false,"html_url":"h"}`) }) ctx := context.Background() page, _, err := client.Repositories.GetPagesInfo(ctx, "o", "r") if err != nil { t.Errorf("Repositories.GetPagesInfo returned error: %v", err) } want := &Pages{URL: String("u"), Status: String("s"), CNAME: String("c"), Custom404: Bool(false), HTMLURL: String("h")} if !cmp.Equal(page, want) { t.Errorf("Repositories.GetPagesInfo returned %+v, want %+v", page, want) } const methodName = "GetPagesInfo" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetPagesInfo(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetPagesInfo(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListPagesBuilds(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pages/builds", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"url":"u","status":"s","commit":"c"}]`) }) ctx := context.Background() pages, _, err := client.Repositories.ListPagesBuilds(ctx, "o", "r", nil) if err != nil { t.Errorf("Repositories.ListPagesBuilds returned error: %v", err) } want := []*PagesBuild{{URL: String("u"), Status: String("s"), Commit: String("c")}} if !cmp.Equal(pages, want) { t.Errorf("Repositories.ListPagesBuilds returned %+v, want %+v", pages, want) } const methodName = "ListPagesBuilds" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListPagesBuilds(ctx, "\n", "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListPagesBuilds(ctx, "o", "r", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListPagesBuilds_withOptions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pages/builds", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprint(w, `[]`) }) ctx := context.Background() _, _, err := client.Repositories.ListPagesBuilds(ctx, "o", "r", &ListOptions{Page: 2}) if err != nil { t.Errorf("Repositories.ListPagesBuilds returned error: %v", err) } } func TestRepositoriesService_GetLatestPagesBuild(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pages/builds/latest", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"url":"u","status":"s","commit":"c"}`) }) ctx := context.Background() build, _, err := client.Repositories.GetLatestPagesBuild(ctx, "o", "r") if err != nil { t.Errorf("Repositories.GetLatestPagesBuild returned error: %v", err) } want := &PagesBuild{URL: String("u"), Status: String("s"), Commit: String("c")} if !cmp.Equal(build, want) { t.Errorf("Repositories.GetLatestPagesBuild returned %+v, want %+v", build, want) } const methodName = "GetLatestPagesBuild" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetLatestPagesBuild(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetLatestPagesBuild(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetPageBuild(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pages/builds/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"url":"u","status":"s","commit":"c"}`) }) ctx := context.Background() build, _, err := client.Repositories.GetPageBuild(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.GetPageBuild returned error: %v", err) } want := &PagesBuild{URL: String("u"), Status: String("s"), Commit: String("c")} if !cmp.Equal(build, want) { t.Errorf("Repositories.GetPageBuild returned %+v, want %+v", build, want) } const methodName = "GetPageBuild" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetPageBuild(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetPageBuild(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_RequestPageBuild(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pages/builds", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"url":"u","status":"s"}`) }) ctx := context.Background() build, _, err := client.Repositories.RequestPageBuild(ctx, "o", "r") if err != nil { t.Errorf("Repositories.RequestPageBuild returned error: %v", err) } want := &PagesBuild{URL: String("u"), Status: String("s")} if !cmp.Equal(build, want) { t.Errorf("Repositories.RequestPageBuild returned %+v, want %+v", build, want) } const methodName = "RequestPageBuild" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.RequestPageBuild(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.RequestPageBuild(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-38.1.0/github/repos_prereceive_hooks.go000066400000000000000000000070651410475703100220570ustar00rootroot00000000000000// Copyright 2018 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 ( "context" "fmt" ) // PreReceiveHook represents a GitHub pre-receive hook for a repository. type PreReceiveHook struct { ID *int64 `json:"id,omitempty"` Name *string `json:"name,omitempty"` Enforcement *string `json:"enforcement,omitempty"` ConfigURL *string `json:"configuration_url,omitempty"` } func (p PreReceiveHook) String() string { return Stringify(p) } // ListPreReceiveHooks lists all pre-receive hooks for the specified repository. // // GitHub API docs: https://developer.github.com/enterprise/2.13/v3/repos/pre_receive_hooks/#list-pre-receive-hooks func (s *RepositoriesService) ListPreReceiveHooks(ctx context.Context, owner, repo string, opts *ListOptions) ([]*PreReceiveHook, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pre-receive-hooks", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypePreReceiveHooksPreview) var hooks []*PreReceiveHook resp, err := s.client.Do(ctx, req, &hooks) if err != nil { return nil, resp, err } return hooks, resp, nil } // GetPreReceiveHook returns a single specified pre-receive hook. // // GitHub API docs: https://developer.github.com/enterprise/2.13/v3/repos/pre_receive_hooks/#get-a-single-pre-receive-hook func (s *RepositoriesService) GetPreReceiveHook(ctx context.Context, owner, repo string, id int64) (*PreReceiveHook, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pre-receive-hooks/%d", owner, repo, id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypePreReceiveHooksPreview) h := new(PreReceiveHook) resp, err := s.client.Do(ctx, req, h) if err != nil { return nil, resp, err } return h, resp, nil } // UpdatePreReceiveHook updates a specified pre-receive hook. // // GitHub API docs: https://developer.github.com/enterprise/2.13/v3/repos/pre_receive_hooks/#update-pre-receive-hook-enforcement func (s *RepositoriesService) UpdatePreReceiveHook(ctx context.Context, owner, repo string, id int64, hook *PreReceiveHook) (*PreReceiveHook, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pre-receive-hooks/%d", owner, repo, id) req, err := s.client.NewRequest("PATCH", u, hook) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypePreReceiveHooksPreview) h := new(PreReceiveHook) resp, err := s.client.Do(ctx, req, h) if err != nil { return nil, resp, err } return h, resp, nil } // DeletePreReceiveHook deletes a specified pre-receive hook. // // GitHub API docs: https://developer.github.com/enterprise/2.13/v3/repos/pre_receive_hooks/#remove-enforcement-overrides-for-a-pre-receive-hook func (s *RepositoriesService) DeletePreReceiveHook(ctx context.Context, owner, repo string, id int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/pre-receive-hooks/%d", owner, repo, id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypePreReceiveHooksPreview) return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/repos_prereceive_hooks_test.go000066400000000000000000000133151410475703100231110ustar00rootroot00000000000000// Copyright 2018 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_ListPreReceiveHooks(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pre-receive-hooks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypePreReceiveHooksPreview) testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}, {"id":2}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() hooks, _, err := client.Repositories.ListPreReceiveHooks(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListHooks returned error: %v", err) } want := []*PreReceiveHook{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(hooks, want) { t.Errorf("Repositories.ListPreReceiveHooks returned %+v, want %+v", hooks, want) } const methodName = "ListPreReceiveHooks" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListPreReceiveHooks(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListPreReceiveHooks(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListPreReceiveHooks_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.ListPreReceiveHooks(ctx, "%", "%", nil) testURLParseError(t, err) } func TestRepositoriesService_GetPreReceiveHook(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pre-receive-hooks/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypePreReceiveHooksPreview) fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() hook, _, err := client.Repositories.GetPreReceiveHook(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.GetPreReceiveHook returned error: %v", err) } want := &PreReceiveHook{ID: Int64(1)} if !cmp.Equal(hook, want) { t.Errorf("Repositories.GetPreReceiveHook returned %+v, want %+v", hook, want) } const methodName = "GetPreReceiveHook" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetPreReceiveHook(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetPreReceiveHook(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetPreReceiveHook_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.GetPreReceiveHook(ctx, "%", "%", 1) testURLParseError(t, err) } func TestRepositoriesService_UpdatePreReceiveHook(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &PreReceiveHook{} mux.HandleFunc("/repos/o/r/pre-receive-hooks/1", func(w http.ResponseWriter, r *http.Request) { v := new(PreReceiveHook) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() hook, _, err := client.Repositories.UpdatePreReceiveHook(ctx, "o", "r", 1, input) if err != nil { t.Errorf("Repositories.UpdatePreReceiveHook returned error: %v", err) } want := &PreReceiveHook{ID: Int64(1)} if !cmp.Equal(hook, want) { t.Errorf("Repositories.UpdatePreReceiveHook returned %+v, want %+v", hook, want) } const methodName = "UpdatePreReceiveHook" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.UpdatePreReceiveHook(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.UpdatePreReceiveHook(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_PreReceiveHook_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.UpdatePreReceiveHook(ctx, "%", "%", 1, nil) testURLParseError(t, err) } func TestRepositoriesService_DeletePreReceiveHook(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pre-receive-hooks/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Repositories.DeletePreReceiveHook(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.DeletePreReceiveHook returned error: %v", err) } const methodName = "DeletePreReceiveHook" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.DeletePreReceiveHook(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DeletePreReceiveHook(ctx, "o", "r", 1) }) } func TestRepositoriesService_DeletePreReceiveHook_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Repositories.DeletePreReceiveHook(ctx, "%", "%", 1) testURLParseError(t, err) } go-github-38.1.0/github/repos_projects.go000066400000000000000000000040511410475703100203440ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "fmt" ) // ProjectListOptions specifies the optional parameters to the // OrganizationsService.ListProjects and RepositoriesService.ListProjects methods. type ProjectListOptions struct { // Indicates the state of the projects to return. Can be either open, closed, or all. Default: open State string `url:"state,omitempty"` ListOptions } // ListProjects lists the projects for a repo. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#list-repository-projects func (s *RepositoriesService) ListProjects(ctx context.Context, owner, repo string, opts *ProjectListOptions) ([]*Project, *Response, error) { u := fmt.Sprintf("repos/%v/%v/projects", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeProjectsPreview) var projects []*Project resp, err := s.client.Do(ctx, req, &projects) if err != nil { return nil, resp, err } return projects, resp, nil } // CreateProject creates a GitHub Project for the specified repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#create-a-repository-project func (s *RepositoriesService) CreateProject(ctx context.Context, owner, repo string, opts *ProjectOptions) (*Project, *Response, error) { u := fmt.Sprintf("repos/%v/%v/projects", owner, repo) req, err := s.client.NewRequest("POST", u, opts) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeProjectsPreview) project := &Project{} resp, err := s.client.Do(ctx, req, project) if err != nil { return nil, resp, err } return project, resp, nil } go-github-38.1.0/github/repos_projects_test.go000066400000000000000000000054451410475703100214130ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_ListProjects(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/projects", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeProjectsPreview) testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ProjectListOptions{ListOptions: ListOptions{Page: 2}} ctx := context.Background() projects, _, err := client.Repositories.ListProjects(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListProjects returned error: %v", err) } want := []*Project{{ID: Int64(1)}} if !cmp.Equal(projects, want) { t.Errorf("Repositories.ListProjects returned %+v, want %+v", projects, want) } const methodName = "ListProjects" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListProjects(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListProjects(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_CreateProject(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ProjectOptions{Name: String("Project Name"), Body: String("Project body.")} mux.HandleFunc("/repos/o/r/projects", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeProjectsPreview) v := &ProjectOptions{} json.NewDecoder(r.Body).Decode(v) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() project, _, err := client.Repositories.CreateProject(ctx, "o", "r", input) if err != nil { t.Errorf("Repositories.CreateProject returned error: %v", err) } want := &Project{ID: Int64(1)} if !cmp.Equal(project, want) { t.Errorf("Repositories.CreateProject returned %+v, want %+v", project, want) } const methodName = "CreateProject" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateProject(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateProject(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-38.1.0/github/repos_releases.go000066400000000000000000000340611410475703100203220ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "errors" "fmt" "io" "mime" "net/http" "os" "path/filepath" "strings" ) // RepositoryRelease represents a GitHub release in a repository. type RepositoryRelease struct { TagName *string `json:"tag_name,omitempty"` TargetCommitish *string `json:"target_commitish,omitempty"` Name *string `json:"name,omitempty"` Body *string `json:"body,omitempty"` Draft *bool `json:"draft,omitempty"` Prerelease *bool `json:"prerelease,omitempty"` DiscussionCategoryName *string `json:"discussion_category_name,omitempty"` // The following fields are not used in CreateRelease or EditRelease: ID *int64 `json:"id,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` PublishedAt *Timestamp `json:"published_at,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` AssetsURL *string `json:"assets_url,omitempty"` Assets []*ReleaseAsset `json:"assets,omitempty"` UploadURL *string `json:"upload_url,omitempty"` ZipballURL *string `json:"zipball_url,omitempty"` TarballURL *string `json:"tarball_url,omitempty"` Author *User `json:"author,omitempty"` NodeID *string `json:"node_id,omitempty"` } func (r RepositoryRelease) String() string { return Stringify(r) } // ReleaseAsset represents a GitHub release asset in a repository. type ReleaseAsset struct { ID *int64 `json:"id,omitempty"` URL *string `json:"url,omitempty"` Name *string `json:"name,omitempty"` Label *string `json:"label,omitempty"` State *string `json:"state,omitempty"` ContentType *string `json:"content_type,omitempty"` Size *int `json:"size,omitempty"` DownloadCount *int `json:"download_count,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` BrowserDownloadURL *string `json:"browser_download_url,omitempty"` Uploader *User `json:"uploader,omitempty"` NodeID *string `json:"node_id,omitempty"` } func (r ReleaseAsset) String() string { return Stringify(r) } // ListReleases lists the releases for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-releases func (s *RepositoriesService) ListReleases(ctx context.Context, owner, repo string, opts *ListOptions) ([]*RepositoryRelease, *Response, error) { u := fmt.Sprintf("repos/%s/%s/releases", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var releases []*RepositoryRelease resp, err := s.client.Do(ctx, req, &releases) if err != nil { return nil, resp, err } return releases, resp, nil } // GetRelease fetches a single release. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-release func (s *RepositoriesService) GetRelease(ctx context.Context, owner, repo string, id int64) (*RepositoryRelease, *Response, error) { u := fmt.Sprintf("repos/%s/%s/releases/%d", owner, repo, id) return s.getSingleRelease(ctx, u) } // GetLatestRelease fetches the latest published release for the repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-the-latest-release func (s *RepositoriesService) GetLatestRelease(ctx context.Context, owner, repo string) (*RepositoryRelease, *Response, error) { u := fmt.Sprintf("repos/%s/%s/releases/latest", owner, repo) return s.getSingleRelease(ctx, u) } // GetReleaseByTag fetches a release with the specified tag. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-release-by-tag-name func (s *RepositoriesService) GetReleaseByTag(ctx context.Context, owner, repo, tag string) (*RepositoryRelease, *Response, error) { u := fmt.Sprintf("repos/%s/%s/releases/tags/%s", owner, repo, tag) return s.getSingleRelease(ctx, u) } func (s *RepositoriesService) getSingleRelease(ctx context.Context, url string) (*RepositoryRelease, *Response, error) { req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } release := new(RepositoryRelease) resp, err := s.client.Do(ctx, req, release) if err != nil { return nil, resp, err } return release, resp, nil } // repositoryReleaseRequest is a subset of RepositoryRelease and // is used internally by CreateRelease and EditRelease to pass // only the known fields for these endpoints. // // See https://github.com/google/go-github/issues/992 for more // information. type repositoryReleaseRequest struct { TagName *string `json:"tag_name,omitempty"` TargetCommitish *string `json:"target_commitish,omitempty"` Name *string `json:"name,omitempty"` Body *string `json:"body,omitempty"` Draft *bool `json:"draft,omitempty"` Prerelease *bool `json:"prerelease,omitempty"` DiscussionCategoryName *string `json:"discussion_category_name,omitempty"` } // CreateRelease adds a new release for a repository. // // Note that only a subset of the release fields are used. // See RepositoryRelease for more information. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-a-release func (s *RepositoriesService) CreateRelease(ctx context.Context, owner, repo string, release *RepositoryRelease) (*RepositoryRelease, *Response, error) { u := fmt.Sprintf("repos/%s/%s/releases", owner, repo) releaseReq := &repositoryReleaseRequest{ TagName: release.TagName, TargetCommitish: release.TargetCommitish, Name: release.Name, Body: release.Body, Draft: release.Draft, Prerelease: release.Prerelease, DiscussionCategoryName: release.DiscussionCategoryName, } req, err := s.client.NewRequest("POST", u, releaseReq) if err != nil { return nil, nil, err } r := new(RepositoryRelease) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // EditRelease edits a repository release. // // Note that only a subset of the release fields are used. // See RepositoryRelease for more information. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#update-a-release func (s *RepositoriesService) EditRelease(ctx context.Context, owner, repo string, id int64, release *RepositoryRelease) (*RepositoryRelease, *Response, error) { u := fmt.Sprintf("repos/%s/%s/releases/%d", owner, repo, id) releaseReq := &repositoryReleaseRequest{ TagName: release.TagName, TargetCommitish: release.TargetCommitish, Name: release.Name, Body: release.Body, Draft: release.Draft, Prerelease: release.Prerelease, DiscussionCategoryName: release.DiscussionCategoryName, } req, err := s.client.NewRequest("PATCH", u, releaseReq) if err != nil { return nil, nil, err } r := new(RepositoryRelease) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } // DeleteRelease delete a single release from a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#delete-a-release func (s *RepositoriesService) DeleteRelease(ctx context.Context, owner, repo string, id int64) (*Response, error) { u := fmt.Sprintf("repos/%s/%s/releases/%d", owner, repo, id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListReleaseAssets lists the release's assets. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-release-assets func (s *RepositoriesService) ListReleaseAssets(ctx context.Context, owner, repo string, id int64, opts *ListOptions) ([]*ReleaseAsset, *Response, error) { u := fmt.Sprintf("repos/%s/%s/releases/%d/assets", owner, repo, id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var assets []*ReleaseAsset resp, err := s.client.Do(ctx, req, &assets) if err != nil { return nil, resp, err } return assets, resp, nil } // GetReleaseAsset fetches a single release asset. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-release-asset func (s *RepositoriesService) GetReleaseAsset(ctx context.Context, owner, repo string, id int64) (*ReleaseAsset, *Response, error) { u := fmt.Sprintf("repos/%s/%s/releases/assets/%d", owner, repo, id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } asset := new(ReleaseAsset) resp, err := s.client.Do(ctx, req, asset) if err != nil { return nil, resp, err } return asset, resp, nil } // DownloadReleaseAsset downloads a release asset or returns a redirect URL. // // DownloadReleaseAsset returns an io.ReadCloser that reads the contents of the // specified release asset. It is the caller's responsibility to close the ReadCloser. // If a redirect is returned, the redirect URL will be returned as a string instead // of the io.ReadCloser. Exactly one of rc and redirectURL will be zero. // // followRedirectsClient can be passed to download the asset from a redirected // location. Passing http.DefaultClient is recommended unless special circumstances // exist, but it's possible to pass any http.Client. If nil is passed the // redirectURL will be returned instead. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-a-release-asset func (s *RepositoriesService) DownloadReleaseAsset(ctx context.Context, owner, repo string, id int64, followRedirectsClient *http.Client) (rc io.ReadCloser, redirectURL string, err error) { u := fmt.Sprintf("repos/%s/%s/releases/assets/%d", owner, repo, id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, "", err } req.Header.Set("Accept", defaultMediaType) s.client.clientMu.Lock() defer s.client.clientMu.Unlock() var loc string saveRedirect := s.client.client.CheckRedirect s.client.client.CheckRedirect = func(req *http.Request, via []*http.Request) error { loc = req.URL.String() return errors.New("disable redirect") } defer func() { s.client.client.CheckRedirect = saveRedirect }() req = withContext(ctx, req) resp, err := s.client.client.Do(req) if err != nil { if !strings.Contains(err.Error(), "disable redirect") { return nil, "", err } if followRedirectsClient != nil { rc, err := s.downloadReleaseAssetFromURL(ctx, followRedirectsClient, loc) return rc, "", err } return nil, loc, nil // Intentionally return no error with valid redirect URL. } if err := CheckResponse(resp); err != nil { resp.Body.Close() return nil, "", err } return resp.Body, "", nil } func (s *RepositoriesService) downloadReleaseAssetFromURL(ctx context.Context, followRedirectsClient *http.Client, url string) (rc io.ReadCloser, err error) { req, err := http.NewRequest("GET", url, nil) if err != nil { return nil, err } req = withContext(ctx, req) req.Header.Set("Accept", "*/*") resp, err := followRedirectsClient.Do(req) if err != nil { return nil, err } if err := CheckResponse(resp); err != nil { resp.Body.Close() return nil, err } return resp.Body, nil } // EditReleaseAsset edits a repository release asset. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#update-a-release-asset func (s *RepositoriesService) EditReleaseAsset(ctx context.Context, owner, repo string, id int64, release *ReleaseAsset) (*ReleaseAsset, *Response, error) { u := fmt.Sprintf("repos/%s/%s/releases/assets/%d", owner, repo, id) req, err := s.client.NewRequest("PATCH", u, release) if err != nil { return nil, nil, err } asset := new(ReleaseAsset) resp, err := s.client.Do(ctx, req, asset) if err != nil { return nil, resp, err } return asset, resp, nil } // DeleteReleaseAsset delete a single release asset from a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#delete-a-release-asset func (s *RepositoriesService) DeleteReleaseAsset(ctx context.Context, owner, repo string, id int64) (*Response, error) { u := fmt.Sprintf("repos/%s/%s/releases/assets/%d", owner, repo, id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // UploadReleaseAsset creates an asset by uploading a file into a release repository. // To upload assets that cannot be represented by an os.File, call NewUploadRequest directly. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#upload-a-release-asset func (s *RepositoriesService) UploadReleaseAsset(ctx context.Context, owner, repo string, id int64, opts *UploadOptions, file *os.File) (*ReleaseAsset, *Response, error) { u := fmt.Sprintf("repos/%s/%s/releases/%d/assets", owner, repo, id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } stat, err := file.Stat() if err != nil { return nil, nil, err } if stat.IsDir() { return nil, nil, errors.New("the asset to upload can't be a directory") } mediaType := mime.TypeByExtension(filepath.Ext(file.Name())) if opts.MediaType != "" { mediaType = opts.MediaType } req, err := s.client.NewUploadRequest(u, file, stat.Size(), mediaType) if err != nil { return nil, nil, err } asset := new(ReleaseAsset) resp, err := s.client.Do(ctx, req, asset) if err != nil { return nil, resp, err } return asset, resp, nil } go-github-38.1.0/github/repos_releases_test.go000066400000000000000000000474451410475703100213730ustar00rootroot00000000000000// Copyright 2013 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 ( "bytes" "context" "encoding/json" "fmt" "io/ioutil" "net/http" "os" "strings" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_ListReleases(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/releases", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() releases, _, err := client.Repositories.ListReleases(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListReleases returned error: %v", err) } want := []*RepositoryRelease{{ID: Int64(1)}} if !cmp.Equal(releases, want) { t.Errorf("Repositories.ListReleases returned %+v, want %+v", releases, want) } const methodName = "ListReleases" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListReleases(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListReleases(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetRelease(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/releases/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1,"author":{"login":"l"}}`) }) ctx := context.Background() release, resp, err := client.Repositories.GetRelease(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.GetRelease returned error: %v\n%v", err, resp.Body) } want := &RepositoryRelease{ID: Int64(1), Author: &User{Login: String("l")}} if !cmp.Equal(release, want) { t.Errorf("Repositories.GetRelease returned %+v, want %+v", release, want) } const methodName = "GetRelease" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetRelease(ctx, "\n", "\n", 1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetRelease(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetLatestRelease(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/releases/latest", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":3}`) }) ctx := context.Background() release, resp, err := client.Repositories.GetLatestRelease(ctx, "o", "r") if err != nil { t.Errorf("Repositories.GetLatestRelease returned error: %v\n%v", err, resp.Body) } want := &RepositoryRelease{ID: Int64(3)} if !cmp.Equal(release, want) { t.Errorf("Repositories.GetLatestRelease returned %+v, want %+v", release, want) } const methodName = "GetLatestRelease" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetLatestRelease(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetLatestRelease(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetReleaseByTag(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/releases/tags/foo", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":13}`) }) ctx := context.Background() release, resp, err := client.Repositories.GetReleaseByTag(ctx, "o", "r", "foo") if err != nil { t.Errorf("Repositories.GetReleaseByTag returned error: %v\n%v", err, resp.Body) } want := &RepositoryRelease{ID: Int64(13)} if !cmp.Equal(release, want) { t.Errorf("Repositories.GetReleaseByTag returned %+v, want %+v", release, want) } const methodName = "GetReleaseByTag" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetReleaseByTag(ctx, "\n", "\n", "foo") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetReleaseByTag(ctx, "o", "r", "foo") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_CreateRelease(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &RepositoryRelease{ Name: String("v1.0"), DiscussionCategoryName: String("General"), // Fields to be removed: ID: Int64(2), CreatedAt: &Timestamp{referenceTime}, PublishedAt: &Timestamp{referenceTime}, URL: String("http://url/"), HTMLURL: String("http://htmlurl/"), AssetsURL: String("http://assetsurl/"), Assets: []*ReleaseAsset{{ID: Int64(5)}}, UploadURL: String("http://uploadurl/"), ZipballURL: String("http://zipballurl/"), TarballURL: String("http://tarballurl/"), Author: &User{Name: String("octocat")}, NodeID: String("nodeid"), } mux.HandleFunc("/repos/o/r/releases", func(w http.ResponseWriter, r *http.Request) { v := new(repositoryReleaseRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") want := &repositoryReleaseRequest{ Name: String("v1.0"), DiscussionCategoryName: String("General"), } if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() release, _, err := client.Repositories.CreateRelease(ctx, "o", "r", input) if err != nil { t.Errorf("Repositories.CreateRelease returned error: %v", err) } want := &RepositoryRelease{ID: Int64(1)} if !cmp.Equal(release, want) { t.Errorf("Repositories.CreateRelease returned %+v, want %+v", release, want) } const methodName = "CreateRelease" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateRelease(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateRelease(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_EditRelease(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &RepositoryRelease{ Name: String("n"), DiscussionCategoryName: String("General"), // Fields to be removed: ID: Int64(2), CreatedAt: &Timestamp{referenceTime}, PublishedAt: &Timestamp{referenceTime}, URL: String("http://url/"), HTMLURL: String("http://htmlurl/"), AssetsURL: String("http://assetsurl/"), Assets: []*ReleaseAsset{{ID: Int64(5)}}, UploadURL: String("http://uploadurl/"), ZipballURL: String("http://zipballurl/"), TarballURL: String("http://tarballurl/"), Author: &User{Name: String("octocat")}, NodeID: String("nodeid"), } mux.HandleFunc("/repos/o/r/releases/1", func(w http.ResponseWriter, r *http.Request) { v := new(repositoryReleaseRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") want := &repositoryReleaseRequest{ Name: String("n"), DiscussionCategoryName: String("General"), } if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() release, _, err := client.Repositories.EditRelease(ctx, "o", "r", 1, input) if err != nil { t.Errorf("Repositories.EditRelease returned error: %v", err) } want := &RepositoryRelease{ID: Int64(1)} if !cmp.Equal(release, want) { t.Errorf("Repositories.EditRelease returned = %+v, want %+v", release, want) } const methodName = "EditRelease" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.EditRelease(ctx, "\n", "\n", 1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.EditRelease(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_DeleteRelease(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/releases/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Repositories.DeleteRelease(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.DeleteRelease returned error: %v", err) } const methodName = "DeleteRelease" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.DeleteRelease(ctx, "\n", "\n", 1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DeleteRelease(ctx, "o", "r", 1) }) } func TestRepositoriesService_ListReleaseAssets(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/releases/1/assets", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() assets, _, err := client.Repositories.ListReleaseAssets(ctx, "o", "r", 1, opt) if err != nil { t.Errorf("Repositories.ListReleaseAssets returned error: %v", err) } want := []*ReleaseAsset{{ID: Int64(1)}} if !cmp.Equal(assets, want) { t.Errorf("Repositories.ListReleaseAssets returned %+v, want %+v", assets, want) } const methodName = "ListReleaseAssets" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListReleaseAssets(ctx, "\n", "\n", 1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListReleaseAssets(ctx, "o", "r", 1, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetReleaseAsset(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/releases/assets/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() asset, _, err := client.Repositories.GetReleaseAsset(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.GetReleaseAsset returned error: %v", err) } want := &ReleaseAsset{ID: Int64(1)} if !cmp.Equal(asset, want) { t.Errorf("Repositories.GetReleaseAsset returned %+v, want %+v", asset, want) } const methodName = "GetReleaseAsset" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetReleaseAsset(ctx, "\n", "\n", 1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetReleaseAsset(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_DownloadReleaseAsset_Stream(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/releases/assets/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", defaultMediaType) w.Header().Set("Content-Type", "application/octet-stream") w.Header().Set("Content-Disposition", "attachment; filename=hello-world.txt") fmt.Fprint(w, "Hello World") }) ctx := context.Background() reader, _, err := client.Repositories.DownloadReleaseAsset(ctx, "o", "r", 1, nil) if err != nil { t.Errorf("Repositories.DownloadReleaseAsset returned error: %v", err) } want := []byte("Hello World") content, err := ioutil.ReadAll(reader) if err != nil { t.Errorf("Repositories.DownloadReleaseAsset returned bad reader: %v", err) } if !bytes.Equal(want, content) { t.Errorf("Repositories.DownloadReleaseAsset returned %+v, want %+v", content, want) } const methodName = "DownloadReleaseAsset" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.DownloadReleaseAsset(ctx, "\n", "\n", -1, nil) return err }) } func TestRepositoriesService_DownloadReleaseAsset_Redirect(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/releases/assets/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", defaultMediaType) http.Redirect(w, r, "/yo", http.StatusFound) }) ctx := context.Background() _, got, err := client.Repositories.DownloadReleaseAsset(ctx, "o", "r", 1, nil) if err != nil { t.Errorf("Repositories.DownloadReleaseAsset returned error: %v", err) } want := "/yo" if !strings.HasSuffix(got, want) { t.Errorf("Repositories.DownloadReleaseAsset returned %+v, want %+v", got, want) } } func TestRepositoriesService_DownloadReleaseAsset_FollowRedirect(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/releases/assets/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", defaultMediaType) // /yo, below will be served as baseURLPath/yo http.Redirect(w, r, baseURLPath+"/yo", http.StatusFound) }) mux.HandleFunc("/yo", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", "*/*") w.Header().Set("Content-Type", "application/octet-stream") w.Header().Set("Content-Disposition", "attachment; filename=hello-world.txt") fmt.Fprint(w, "Hello World") }) ctx := context.Background() reader, _, err := client.Repositories.DownloadReleaseAsset(ctx, "o", "r", 1, http.DefaultClient) content, err := ioutil.ReadAll(reader) if err != nil { t.Errorf("Repositories.DownloadReleaseAsset returned error: %v", err) } reader.Close() want := []byte("Hello World") if !bytes.Equal(want, content) { t.Errorf("Repositories.DownloadReleaseAsset returned %+v, want %+v", content, want) } } func TestRepositoriesService_DownloadReleaseAsset_APIError(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/releases/assets/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", defaultMediaType) w.WriteHeader(http.StatusNotFound) fmt.Fprint(w, `{"message":"Not Found","documentation_url":"https://developer.github.com/v3"}`) }) ctx := context.Background() resp, loc, err := client.Repositories.DownloadReleaseAsset(ctx, "o", "r", 1, nil) if err == nil { t.Error("Repositories.DownloadReleaseAsset did not return an error") } if resp != nil { resp.Close() t.Error("Repositories.DownloadReleaseAsset returned stream, want nil") } if loc != "" { t.Errorf(`Repositories.DownloadReleaseAsset returned "%s", want empty ""`, loc) } } func TestRepositoriesService_EditReleaseAsset(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ReleaseAsset{Name: String("n")} mux.HandleFunc("/repos/o/r/releases/assets/1", func(w http.ResponseWriter, r *http.Request) { v := new(ReleaseAsset) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() asset, _, err := client.Repositories.EditReleaseAsset(ctx, "o", "r", 1, input) if err != nil { t.Errorf("Repositories.EditReleaseAsset returned error: %v", err) } want := &ReleaseAsset{ID: Int64(1)} if !cmp.Equal(asset, want) { t.Errorf("Repositories.EditReleaseAsset returned = %+v, want %+v", asset, want) } const methodName = "EditReleaseAsset" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.EditReleaseAsset(ctx, "\n", "\n", 1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.EditReleaseAsset(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_DeleteReleaseAsset(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/releases/assets/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Repositories.DeleteReleaseAsset(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.DeleteReleaseAsset returned error: %v", err) } const methodName = "DeleteReleaseAsset" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.DeleteReleaseAsset(ctx, "\n", "\n", 1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DeleteReleaseAsset(ctx, "o", "r", 1) }) } func TestRepositoriesService_UploadReleaseAsset(t *testing.T) { var ( defaultUploadOptions = &UploadOptions{Name: "n"} defaultExpectedFormValue = values{"name": "n"} mediaTypeTextPlain = "text/plain; charset=utf-8" ) uploadTests := []struct { uploadOpts *UploadOptions fileName string expectedFormValues values expectedMediaType string }{ // No file extension and no explicit media type. { defaultUploadOptions, "upload", defaultExpectedFormValue, defaultMediaType, }, // File extension and no explicit media type. { defaultUploadOptions, "upload.txt", defaultExpectedFormValue, mediaTypeTextPlain, }, // No file extension and explicit media type. { &UploadOptions{Name: "n", MediaType: "image/png"}, "upload", defaultExpectedFormValue, "image/png", }, // File extension and explicit media type. { &UploadOptions{Name: "n", MediaType: "image/png"}, "upload.png", defaultExpectedFormValue, "image/png", }, // Label provided. { &UploadOptions{Name: "n", Label: "l"}, "upload.txt", values{"name": "n", "label": "l"}, mediaTypeTextPlain, }, // No label provided. { defaultUploadOptions, "upload.txt", defaultExpectedFormValue, mediaTypeTextPlain, }, } client, mux, _, teardown := setup() defer teardown() for key, test := range uploadTests { releaseEndpoint := fmt.Sprintf("/repos/o/r/releases/%d/assets", key) mux.HandleFunc(releaseEndpoint, func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Content-Type", test.expectedMediaType) testHeader(t, r, "Content-Length", "12") testFormValues(t, r, test.expectedFormValues) testBody(t, r, "Upload me !\n") fmt.Fprintf(w, `{"id":1}`) }) file, dir, err := openTestFile(test.fileName, "Upload me !\n") if err != nil { t.Fatalf("Unable to create temp file: %v", err) } defer os.RemoveAll(dir) ctx := context.Background() asset, _, err := client.Repositories.UploadReleaseAsset(ctx, "o", "r", int64(key), test.uploadOpts, file) if err != nil { t.Errorf("Repositories.UploadReleaseAssert returned error: %v", err) } want := &ReleaseAsset{ID: Int64(1)} if !cmp.Equal(asset, want) { t.Errorf("Repositories.UploadReleaseAssert returned %+v, want %+v", asset, want) } const methodName = "UploadReleaseAsset" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.UploadReleaseAsset(ctx, "\n", "\n", int64(key), test.uploadOpts, file) return err }) } } go-github-38.1.0/github/repos_stats.go000066400000000000000000000177351410475703100176660ustar00rootroot00000000000000// 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 ( "context" "fmt" "time" ) // ContributorStats represents a contributor to a repository and their // weekly contributions to a given repo. type ContributorStats struct { Author *Contributor `json:"author,omitempty"` Total *int `json:"total,omitempty"` Weeks []*WeeklyStats `json:"weeks,omitempty"` } func (c ContributorStats) String() string { return Stringify(c) } // WeeklyStats represents the number of additions, deletions and commits // a Contributor made in a given week. type WeeklyStats struct { Week *Timestamp `json:"w,omitempty"` Additions *int `json:"a,omitempty"` Deletions *int `json:"d,omitempty"` Commits *int `json:"c,omitempty"` } func (w WeeklyStats) String() string { return Stringify(w) } // ListContributorsStats gets a repo's contributor list with additions, // deletions and commit counts. // // If this is the first time these statistics are requested for the given // repository, this method will return an *AcceptedError and a status code of // 202. This is because this is the status that GitHub returns to signify that // it is now computing the requested statistics. A follow up request, after a // delay of a second or so, should result in a successful request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-all-contributor-commit-activity func (s *RepositoriesService) ListContributorsStats(ctx context.Context, owner, repo string) ([]*ContributorStats, *Response, error) { u := fmt.Sprintf("repos/%v/%v/stats/contributors", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var contributorStats []*ContributorStats resp, err := s.client.Do(ctx, req, &contributorStats) if err != nil { return nil, resp, err } return contributorStats, resp, nil } // WeeklyCommitActivity represents the weekly commit activity for a repository. // The days array is a group of commits per day, starting on Sunday. type WeeklyCommitActivity struct { Days []int `json:"days,omitempty"` Total *int `json:"total,omitempty"` Week *Timestamp `json:"week,omitempty"` } func (w WeeklyCommitActivity) String() string { return Stringify(w) } // ListCommitActivity returns the last year of commit activity // grouped by week. The days array is a group of commits per day, // starting on Sunday. // // If this is the first time these statistics are requested for the given // repository, this method will return an *AcceptedError and a status code of // 202. This is because this is the status that GitHub returns to signify that // it is now computing the requested statistics. A follow up request, after a // delay of a second or so, should result in a successful request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-the-last-year-of-commit-activity func (s *RepositoriesService) ListCommitActivity(ctx context.Context, owner, repo string) ([]*WeeklyCommitActivity, *Response, error) { u := fmt.Sprintf("repos/%v/%v/stats/commit_activity", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var weeklyCommitActivity []*WeeklyCommitActivity resp, err := s.client.Do(ctx, req, &weeklyCommitActivity) if err != nil { return nil, resp, err } return weeklyCommitActivity, resp, nil } // ListCodeFrequency returns a weekly aggregate of the number of additions and // deletions pushed to a repository. Returned WeeklyStats will contain // additions and deletions, but not total commits. // // If this is the first time these statistics are requested for the given // repository, this method will return an *AcceptedError and a status code of // 202. This is because this is the status that GitHub returns to signify that // it is now computing the requested statistics. A follow up request, after a // delay of a second or so, should result in a successful request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-the-weekly-commit-activity func (s *RepositoriesService) ListCodeFrequency(ctx context.Context, owner, repo string) ([]*WeeklyStats, *Response, error) { u := fmt.Sprintf("repos/%v/%v/stats/code_frequency", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var weeks [][]int resp, err := s.client.Do(ctx, req, &weeks) // convert int slices into WeeklyStats var stats []*WeeklyStats for _, week := range weeks { if len(week) != 3 { continue } stat := &WeeklyStats{ Week: &Timestamp{time.Unix(int64(week[0]), 0)}, Additions: Int(week[1]), Deletions: Int(week[2]), } stats = append(stats, stat) } return stats, resp, err } // RepositoryParticipation is the number of commits by everyone // who has contributed to the repository (including the owner) // as well as the number of commits by the owner themself. type RepositoryParticipation struct { All []int `json:"all,omitempty"` Owner []int `json:"owner,omitempty"` } func (r RepositoryParticipation) String() string { return Stringify(r) } // ListParticipation returns the total commit counts for the 'owner' // and total commit counts in 'all'. 'all' is everyone combined, // including the 'owner' in the last 52 weeks. If you’d like to get // the commit counts for non-owners, you can subtract 'all' from 'owner'. // // The array order is oldest week (index 0) to most recent week. // // If this is the first time these statistics are requested for the given // repository, this method will return an *AcceptedError and a status code of // 202. This is because this is the status that GitHub returns to signify that // it is now computing the requested statistics. A follow up request, after a // delay of a second or so, should result in a successful request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-the-weekly-commit-count func (s *RepositoriesService) ListParticipation(ctx context.Context, owner, repo string) (*RepositoryParticipation, *Response, error) { u := fmt.Sprintf("repos/%v/%v/stats/participation", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } participation := new(RepositoryParticipation) resp, err := s.client.Do(ctx, req, participation) if err != nil { return nil, resp, err } return participation, resp, nil } // PunchCard represents the number of commits made during a given hour of a // day of the week. type PunchCard struct { Day *int // Day of the week (0-6: =Sunday - Saturday). Hour *int // Hour of day (0-23). Commits *int // Number of commits. } // ListPunchCard returns the number of commits per hour in each day. // // If this is the first time these statistics are requested for the given // repository, this method will return an *AcceptedError and a status code of // 202. This is because this is the status that GitHub returns to signify that // it is now computing the requested statistics. A follow up request, after a // delay of a second or so, should result in a successful request. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-the-hourly-commit-count-for-each-day func (s *RepositoriesService) ListPunchCard(ctx context.Context, owner, repo string) ([]*PunchCard, *Response, error) { u := fmt.Sprintf("repos/%v/%v/stats/punch_card", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var results [][]int resp, err := s.client.Do(ctx, req, &results) // convert int slices into Punchcards var cards []*PunchCard for _, result := range results { if len(result) != 3 { continue } card := &PunchCard{ Day: Int(result[0]), Hour: Int(result[1]), Commits: Int(result[2]), } cards = append(cards, card) } return cards, resp, err } go-github-38.1.0/github/repos_stats_test.go000066400000000000000000000213121410475703100207070ustar00rootroot00000000000000// 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 ( "context" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_ListContributorsStats(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/stats/contributors", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, ` [ { "author": { "id": 1, "node_id": "nodeid-1" }, "total": 135, "weeks": [ { "w": 1367712000, "a": 6898, "d": 77, "c": 10 } ] } ] `) }) ctx := context.Background() stats, _, err := client.Repositories.ListContributorsStats(ctx, "o", "r") if err != nil { t.Errorf("RepositoriesService.ListContributorsStats returned error: %v", err) } want := []*ContributorStats{ { Author: &Contributor{ ID: Int64(1), NodeID: String("nodeid-1"), }, Total: Int(135), Weeks: []*WeeklyStats{ { Week: &Timestamp{time.Date(2013, time.May, 05, 00, 00, 00, 0, time.UTC).Local()}, Additions: Int(6898), Deletions: Int(77), Commits: Int(10), }, }, }, } if !cmp.Equal(stats, want) { t.Errorf("RepositoriesService.ListContributorsStats returned %+v, want %+v", stats, want) } const methodName = "ListContributorsStats" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListContributorsStats(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListContributorsStats(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListCommitActivity(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/stats/commit_activity", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, ` [ { "days": [0, 3, 26, 20, 39, 1, 0], "total": 89, "week": 1336280400 } ] `) }) ctx := context.Background() activity, _, err := client.Repositories.ListCommitActivity(ctx, "o", "r") if err != nil { t.Errorf("RepositoriesService.ListCommitActivity returned error: %v", err) } want := []*WeeklyCommitActivity{ { Days: []int{0, 3, 26, 20, 39, 1, 0}, Total: Int(89), Week: &Timestamp{time.Date(2012, time.May, 06, 05, 00, 00, 0, time.UTC).Local()}, }, } if !cmp.Equal(activity, want) { t.Errorf("RepositoriesService.ListCommitActivity returned %+v, want %+v", activity, want) } const methodName = "ListCommitActivity" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListCommitActivity(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListCommitActivity(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListCodeFrequency(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/stats/code_frequency", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[[1302998400, 1124, -435]]`) }) ctx := context.Background() code, _, err := client.Repositories.ListCodeFrequency(ctx, "o", "r") if err != nil { t.Errorf("RepositoriesService.ListCodeFrequency returned error: %v", err) } want := []*WeeklyStats{{ Week: &Timestamp{time.Date(2011, time.April, 17, 00, 00, 00, 0, time.UTC).Local()}, Additions: Int(1124), Deletions: Int(-435), }} if !cmp.Equal(code, want) { t.Errorf("RepositoriesService.ListCodeFrequency returned %+v, want %+v", code, want) } const methodName = "ListCodeFrequency" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListCodeFrequency(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListCodeFrequency(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_Participation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/stats/participation", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, ` { "all": [ 11,21,15,2,8,1,8,23,17,21,11,10,33, 91,38,34,22,23,32,3,43,87,71,18,13,5, 13,16,66,27,12,45,110,117,13,8,18,9,19, 26,39,12,20,31,46,91,45,10,24,9,29,7 ], "owner": [ 3,2,3,0,2,0,5,14,7,9,1,5,0, 48,19,2,0,1,10,2,23,40,35,8,8,2, 10,6,30,0,2,9,53,104,3,3,10,4,7, 11,21,4,4,22,26,63,11,2,14,1,10,3 ] } `) }) ctx := context.Background() participation, _, err := client.Repositories.ListParticipation(ctx, "o", "r") if err != nil { t.Errorf("RepositoriesService.ListParticipation returned error: %v", err) } want := &RepositoryParticipation{ All: []int{ 11, 21, 15, 2, 8, 1, 8, 23, 17, 21, 11, 10, 33, 91, 38, 34, 22, 23, 32, 3, 43, 87, 71, 18, 13, 5, 13, 16, 66, 27, 12, 45, 110, 117, 13, 8, 18, 9, 19, 26, 39, 12, 20, 31, 46, 91, 45, 10, 24, 9, 29, 7, }, Owner: []int{ 3, 2, 3, 0, 2, 0, 5, 14, 7, 9, 1, 5, 0, 48, 19, 2, 0, 1, 10, 2, 23, 40, 35, 8, 8, 2, 10, 6, 30, 0, 2, 9, 53, 104, 3, 3, 10, 4, 7, 11, 21, 4, 4, 22, 26, 63, 11, 2, 14, 1, 10, 3, }, } if !cmp.Equal(participation, want) { t.Errorf("RepositoriesService.ListParticipation returned %+v, want %+v", participation, want) } const methodName = "ListParticipation" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListParticipation(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListParticipation(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListPunchCard(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/stats/punch_card", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[ [0, 0, 5], [0, 1, 43], [0, 2, 21] ]`) }) ctx := context.Background() card, _, err := client.Repositories.ListPunchCard(ctx, "o", "r") if err != nil { t.Errorf("RepositoriesService.ListPunchCard returned error: %v", err) } want := []*PunchCard{ {Day: Int(0), Hour: Int(0), Commits: Int(5)}, {Day: Int(0), Hour: Int(1), Commits: Int(43)}, {Day: Int(0), Hour: Int(2), Commits: Int(21)}, } if !cmp.Equal(card, want) { t.Errorf("RepositoriesService.ListPunchCard returned %+v, want %+v", card, want) } const methodName = "ListPunchCard" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListPunchCard(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListPunchCard(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_AcceptedError(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/stats/contributors", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") // This response indicates the fork will happen asynchronously. w.WriteHeader(http.StatusAccepted) fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() stats, _, err := client.Repositories.ListContributorsStats(ctx, "o", "r") if err == nil { t.Errorf("RepositoriesService.AcceptedError should have returned an error") } if _, ok := err.(*AcceptedError); !ok { t.Errorf("RepositoriesService.AcceptedError returned an AcceptedError: %v", err) } if stats != nil { t.Errorf("RepositoriesService.AcceptedError expected stats to be nil: %v", stats) } const methodName = "ListContributorsStats" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListContributorsStats(ctx, "o", "r") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListContributorsStats(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-38.1.0/github/repos_statuses.go000066400000000000000000000104501410475703100203660ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "time" ) // RepoStatus represents the status of a repository at a particular reference. type RepoStatus struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` URL *string `json:"url,omitempty"` // State is the current state of the repository. Possible values are: // pending, success, error, or failure. State *string `json:"state,omitempty"` // TargetURL is the URL of the page representing this status. It will be // linked from the GitHub UI to allow users to see the source of the status. TargetURL *string `json:"target_url,omitempty"` // Description is a short high level summary of the status. Description *string `json:"description,omitempty"` // A string label to differentiate this status from the statuses of other systems. Context *string `json:"context,omitempty"` // AvatarURL is the URL of the avatar of this status. AvatarURL *string `json:"avatar_url,omitempty"` Creator *User `json:"creator,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` UpdatedAt *time.Time `json:"updated_at,omitempty"` } func (r RepoStatus) String() string { return Stringify(r) } // ListStatuses lists the statuses of a repository at the specified // reference. ref can be a SHA, a branch name, or a tag name. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-commit-statuses-for-a-reference func (s *RepositoriesService) ListStatuses(ctx context.Context, owner, repo, ref string, opts *ListOptions) ([]*RepoStatus, *Response, error) { u := fmt.Sprintf("repos/%v/%v/commits/%v/statuses", owner, repo, refURLEscape(ref)) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var statuses []*RepoStatus resp, err := s.client.Do(ctx, req, &statuses) if err != nil { return nil, resp, err } return statuses, resp, nil } // CreateStatus creates a new status for a repository at the specified // reference. Ref can be a SHA, a branch name, or a tag name. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#create-a-commit-status func (s *RepositoriesService) CreateStatus(ctx context.Context, owner, repo, ref string, status *RepoStatus) (*RepoStatus, *Response, error) { u := fmt.Sprintf("repos/%v/%v/statuses/%v", owner, repo, refURLEscape(ref)) req, err := s.client.NewRequest("POST", u, status) if err != nil { return nil, nil, err } repoStatus := new(RepoStatus) resp, err := s.client.Do(ctx, req, repoStatus) if err != nil { return nil, resp, err } return repoStatus, resp, nil } // CombinedStatus represents the combined status of a repository at a particular reference. type CombinedStatus struct { // State is the combined state of the repository. Possible values are: // failure, pending, or success. State *string `json:"state,omitempty"` Name *string `json:"name,omitempty"` SHA *string `json:"sha,omitempty"` TotalCount *int `json:"total_count,omitempty"` Statuses []*RepoStatus `json:"statuses,omitempty"` CommitURL *string `json:"commit_url,omitempty"` RepositoryURL *string `json:"repository_url,omitempty"` } func (s CombinedStatus) String() string { return Stringify(s) } // GetCombinedStatus returns the combined status of a repository at the specified // reference. ref can be a SHA, a branch name, or a tag name. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-the-combined-status-for-a-specific-reference func (s *RepositoriesService) GetCombinedStatus(ctx context.Context, owner, repo, ref string, opts *ListOptions) (*CombinedStatus, *Response, error) { u := fmt.Sprintf("repos/%v/%v/commits/%v/status", owner, repo, refURLEscape(ref)) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } status := new(CombinedStatus) resp, err := s.client.Do(ctx, req, status) if err != nil { return nil, resp, err } return status, resp, nil } go-github-38.1.0/github/repos_statuses_test.go000066400000000000000000000106641410475703100214340ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_ListStatuses(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/commits/r/statuses", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() statuses, _, err := client.Repositories.ListStatuses(ctx, "o", "r", "r", opt) if err != nil { t.Errorf("Repositories.ListStatuses returned error: %v", err) } want := []*RepoStatus{{ID: Int64(1)}} if !cmp.Equal(statuses, want) { t.Errorf("Repositories.ListStatuses returned %+v, want %+v", statuses, want) } const methodName = "ListStatuses" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListStatuses(ctx, "\n", "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListStatuses(ctx, "o", "r", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListStatuses_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.ListStatuses(ctx, "%", "r", "r", nil) testURLParseError(t, err) } func TestRepositoriesService_CreateStatus(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &RepoStatus{State: String("s"), TargetURL: String("t"), Description: String("d")} mux.HandleFunc("/repos/o/r/statuses/r", func(w http.ResponseWriter, r *http.Request) { v := new(RepoStatus) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() status, _, err := client.Repositories.CreateStatus(ctx, "o", "r", "r", input) if err != nil { t.Errorf("Repositories.CreateStatus returned error: %v", err) } want := &RepoStatus{ID: Int64(1)} if !cmp.Equal(status, want) { t.Errorf("Repositories.CreateStatus returned %+v, want %+v", status, want) } const methodName = "CreateStatus" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateStatus(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateStatus(ctx, "o", "r", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_CreateStatus_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.CreateStatus(ctx, "%", "r", "r", nil) testURLParseError(t, err) } func TestRepositoriesService_GetCombinedStatus(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/commits/r/status", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `{"state":"success", "statuses":[{"id":1}]}`) }) opt := &ListOptions{Page: 2} ctx := context.Background() status, _, err := client.Repositories.GetCombinedStatus(ctx, "o", "r", "r", opt) if err != nil { t.Errorf("Repositories.GetCombinedStatus returned error: %v", err) } want := &CombinedStatus{State: String("success"), Statuses: []*RepoStatus{{ID: Int64(1)}}} if !cmp.Equal(status, want) { t.Errorf("Repositories.GetCombinedStatus returned %+v, want %+v", status, want) } const methodName = "GetCombinedStatus" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetCombinedStatus(ctx, "\n", "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetCombinedStatus(ctx, "o", "r", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-38.1.0/github/repos_test.go000066400000000000000000002167231410475703100175050ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "errors" "fmt" "net/http" "net/url" "strings" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_List_authenticatedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview} mux.HandleFunc("/user/repos", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) fmt.Fprint(w, `[{"id":1},{"id":2}]`) }) ctx := context.Background() got, _, err := client.Repositories.List(ctx, "", nil) if err != nil { t.Errorf("Repositories.List returned error: %v", err) } want := []*Repository{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(got, want) { t.Errorf("Repositories.List returned %+v, want %+v", got, want) } const methodName = "List" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.List(ctx, "\n", &RepositoryListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.List(ctx, "", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_List_specifiedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview} mux.HandleFunc("/users/u/repos", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) testFormValues(t, r, values{ "visibility": "public", "affiliation": "owner,collaborator", "sort": "created", "direction": "asc", "page": "2", }) fmt.Fprint(w, `[{"id":1}]`) }) opt := &RepositoryListOptions{ Visibility: "public", Affiliation: "owner,collaborator", Sort: "created", Direction: "asc", ListOptions: ListOptions{Page: 2}, } ctx := context.Background() repos, _, err := client.Repositories.List(ctx, "u", opt) if err != nil { t.Errorf("Repositories.List returned error: %v", err) } want := []*Repository{{ID: Int64(1)}} if !cmp.Equal(repos, want) { t.Errorf("Repositories.List returned %+v, want %+v", repos, want) } } func TestRepositoriesService_List_specifiedUser_type(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview} mux.HandleFunc("/users/u/repos", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) testFormValues(t, r, values{ "type": "owner", }) fmt.Fprint(w, `[{"id":1}]`) }) opt := &RepositoryListOptions{ Type: "owner", } ctx := context.Background() repos, _, err := client.Repositories.List(ctx, "u", opt) if err != nil { t.Errorf("Repositories.List returned error: %v", err) } want := []*Repository{{ID: Int64(1)}} if !cmp.Equal(repos, want) { t.Errorf("Repositories.List returned %+v, want %+v", repos, want) } } func TestRepositoriesService_List_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.List(ctx, "%", nil) testURLParseError(t, err) } func TestRepositoriesService_ListByOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeTopicsPreview, mediaTypeRepositoryVisibilityPreview} mux.HandleFunc("/orgs/o/repos", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) testFormValues(t, r, values{ "type": "forks", "page": "2", }) fmt.Fprint(w, `[{"id":1}]`) }) ctx := context.Background() opt := &RepositoryListByOrgOptions{ Type: "forks", ListOptions: ListOptions{Page: 2}, } got, _, err := client.Repositories.ListByOrg(ctx, "o", opt) if err != nil { t.Errorf("Repositories.ListByOrg returned error: %v", err) } want := []*Repository{{ID: Int64(1)}} if !cmp.Equal(got, want) { t.Errorf("Repositories.ListByOrg returned %+v, want %+v", got, want) } const methodName = "ListByOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListByOrg(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListByOrg(ctx, "o", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListByOrg_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.ListByOrg(ctx, "%", nil) testURLParseError(t, err) } func TestRepositoriesService_ListAll(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "since": "1", }) fmt.Fprint(w, `[{"id":1}]`) }) ctx := context.Background() opt := &RepositoryListAllOptions{1} got, _, err := client.Repositories.ListAll(ctx, opt) if err != nil { t.Errorf("Repositories.ListAll returned error: %v", err) } want := []*Repository{{ID: Int64(1)}} if !cmp.Equal(got, want) { t.Errorf("Repositories.ListAll returned %+v, want %+v", got, want) } const methodName = "ListAll" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListAll(ctx, &RepositoryListAllOptions{1}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_Create_user(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Repository{ Name: String("n"), Archived: Bool(true), // not passed along. } wantAcceptHeaders := []string{mediaTypeRepositoryTemplatePreview, mediaTypeRepositoryVisibilityPreview} mux.HandleFunc("/user/repos", func(w http.ResponseWriter, r *http.Request) { v := new(createRepoRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) want := &createRepoRequest{Name: String("n")} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() got, _, err := client.Repositories.Create(ctx, "", input) if err != nil { t.Errorf("Repositories.Create returned error: %v", err) } want := &Repository{ID: Int64(1)} if !cmp.Equal(got, want) { t.Errorf("Repositories.Create returned %+v, want %+v", got, want) } const methodName = "Create" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.Create(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.Create(ctx, "", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_Create_org(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Repository{ Name: String("n"), Archived: Bool(true), // not passed along. } wantAcceptHeaders := []string{mediaTypeRepositoryTemplatePreview, mediaTypeRepositoryVisibilityPreview} mux.HandleFunc("/orgs/o/repos", func(w http.ResponseWriter, r *http.Request) { v := new(createRepoRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) want := &createRepoRequest{Name: String("n")} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() repo, _, err := client.Repositories.Create(ctx, "o", input) if err != nil { t.Errorf("Repositories.Create returned error: %v", err) } want := &Repository{ID: Int64(1)} if !cmp.Equal(repo, want) { t.Errorf("Repositories.Create returned %+v, want %+v", repo, want) } } func TestRepositoriesService_CreateFromTemplate(t *testing.T) { client, mux, _, teardown := setup() defer teardown() templateRepoReq := &TemplateRepoRequest{ Name: String("n"), } mux.HandleFunc("/repos/to/tr/generate", func(w http.ResponseWriter, r *http.Request) { v := new(TemplateRepoRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeRepositoryTemplatePreview) want := &TemplateRepoRequest{Name: String("n")} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"id":1,"name":"n"}`) }) ctx := context.Background() got, _, err := client.Repositories.CreateFromTemplate(ctx, "to", "tr", templateRepoReq) if err != nil { t.Errorf("Repositories.CreateFromTemplate returned error: %v", err) } want := &Repository{ID: Int64(1), Name: String("n")} if !cmp.Equal(got, want) { t.Errorf("Repositories.CreateFromTemplate returned %+v, want %+v", got, want) } const methodName = "CreateFromTemplate" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateFromTemplate(ctx, "\n", "\n", templateRepoReq) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateFromTemplate(ctx, "to", "tr", templateRepoReq) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_Get(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeCodesOfConductPreview, mediaTypeTopicsPreview, mediaTypeRepositoryTemplatePreview, mediaTypeRepositoryVisibilityPreview} mux.HandleFunc("/repos/o/r", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) fmt.Fprint(w, `{"id":1,"name":"n","description":"d","owner":{"login":"l"},"license":{"key":"mit"}}`) }) ctx := context.Background() got, _, err := client.Repositories.Get(ctx, "o", "r") if err != nil { t.Errorf("Repositories.Get returned error: %v", err) } want := &Repository{ID: Int64(1), Name: String("n"), Description: String("d"), Owner: &User{Login: String("l")}, License: &License{Key: String("mit")}} if !cmp.Equal(got, want) { t.Errorf("Repositories.Get returned %+v, want %+v", got, want) } const methodName = "Get" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.Get(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.Get(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetCodeOfConduct(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/community/code_of_conduct", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeCodesOfConductPreview) fmt.Fprint(w, `{ "key": "key", "name": "name", "url": "url", "body": "body"}`, ) }) ctx := context.Background() got, _, err := client.Repositories.GetCodeOfConduct(ctx, "o", "r") if err != nil { t.Errorf("Repositories.GetCodeOfConduct returned error: %v", err) } want := &CodeOfConduct{ Key: String("key"), Name: String("name"), URL: String("url"), Body: String("body"), } if !cmp.Equal(got, want) { t.Errorf("Repositories.GetCodeOfConduct returned %+v, want %+v", got, want) } const methodName = "GetCodeOfConduct" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetCodeOfConduct(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetCodeOfConduct(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1,"name":"n","description":"d","owner":{"login":"l"},"license":{"key":"mit"}}`) }) ctx := context.Background() got, _, err := client.Repositories.GetByID(ctx, 1) if err != nil { t.Fatalf("Repositories.GetByID returned error: %v", err) } want := &Repository{ID: Int64(1), Name: String("n"), Description: String("d"), Owner: &User{Login: String("l")}, License: &License{Key: String("mit")}} if !cmp.Equal(got, want) { t.Errorf("Repositories.GetByID returned %+v, want %+v", got, want) } const methodName = "GetByID" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetByID(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_Edit(t *testing.T) { client, mux, _, teardown := setup() defer teardown() i := true input := &Repository{HasIssues: &i} wantAcceptHeaders := []string{mediaTypeRepositoryTemplatePreview, mediaTypeRepositoryVisibilityPreview} mux.HandleFunc("/repos/o/r", func(w http.ResponseWriter, r *http.Request) { v := new(Repository) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() got, _, err := client.Repositories.Edit(ctx, "o", "r", input) if err != nil { t.Errorf("Repositories.Edit returned error: %v", err) } want := &Repository{ID: Int64(1)} if !cmp.Equal(got, want) { t.Errorf("Repositories.Edit returned %+v, want %+v", got, want) } const methodName = "Edit" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.Edit(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.Edit(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_Delete(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Repositories.Delete(ctx, "o", "r") if err != nil { t.Errorf("Repositories.Delete returned error: %v", err) } const methodName = "Delete" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.Delete(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.Delete(ctx, "o", "r") }) } func TestRepositoriesService_Get_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.Get(ctx, "%", "r") testURLParseError(t, err) } func TestRepositoriesService_Edit_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.Edit(ctx, "%", "r", nil) testURLParseError(t, err) } func TestRepositoriesService_GetVulnerabilityAlerts(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/vulnerability-alerts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeRequiredVulnerabilityAlertsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() vulnerabilityAlertsEnabled, _, err := client.Repositories.GetVulnerabilityAlerts(ctx, "o", "r") if err != nil { t.Errorf("Repositories.GetVulnerabilityAlerts returned error: %v", err) } if want := true; vulnerabilityAlertsEnabled != want { t.Errorf("Repositories.GetVulnerabilityAlerts returned %+v, want %+v", vulnerabilityAlertsEnabled, want) } const methodName = "GetVulnerabilityAlerts" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetVulnerabilityAlerts(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetVulnerabilityAlerts(ctx, "o", "r") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) } return resp, err }) } func TestRepositoriesService_EnableVulnerabilityAlerts(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/vulnerability-alerts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Accept", mediaTypeRequiredVulnerabilityAlertsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Repositories.EnableVulnerabilityAlerts(ctx, "o", "r"); err != nil { t.Errorf("Repositories.EnableVulnerabilityAlerts returned error: %v", err) } const methodName = "EnableVulnerabilityAlerts" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.EnableVulnerabilityAlerts(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.EnableVulnerabilityAlerts(ctx, "o", "r") }) } func TestRepositoriesService_DisableVulnerabilityAlerts(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/vulnerability-alerts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeRequiredVulnerabilityAlertsPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Repositories.DisableVulnerabilityAlerts(ctx, "o", "r"); err != nil { t.Errorf("Repositories.DisableVulnerabilityAlerts returned error: %v", err) } const methodName = "DisableVulnerabilityAlerts" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.DisableVulnerabilityAlerts(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DisableVulnerabilityAlerts(ctx, "o", "r") }) } func TestRepositoriesService_EnableAutomatedSecurityFixes(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/automated-security-fixes", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Accept", mediaTypeRequiredAutomatedSecurityFixesPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Repositories.EnableAutomatedSecurityFixes(ctx, "o", "r"); err != nil { t.Errorf("Repositories.EnableAutomatedSecurityFixes returned error: %v", err) } } func TestRepositoriesService_DisableAutomatedSecurityFixes(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/automated-security-fixes", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeRequiredAutomatedSecurityFixesPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Repositories.DisableAutomatedSecurityFixes(ctx, "o", "r"); err != nil { t.Errorf("Repositories.DisableAutomatedSecurityFixes returned error: %v", err) } } func TestRepositoriesService_ListContributors(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/contributors", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "anon": "true", "page": "2", }) fmt.Fprint(w, `[{"contributions":42}]`) }) opts := &ListContributorsOptions{Anon: "true", ListOptions: ListOptions{Page: 2}} ctx := context.Background() contributors, _, err := client.Repositories.ListContributors(ctx, "o", "r", opts) if err != nil { t.Errorf("Repositories.ListContributors returned error: %v", err) } want := []*Contributor{{Contributions: Int(42)}} if !cmp.Equal(contributors, want) { t.Errorf("Repositories.ListContributors returned %+v, want %+v", contributors, want) } const methodName = "ListContributors" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListContributors(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListContributors(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListLanguages(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/languages", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"go":1}`) }) ctx := context.Background() languages, _, err := client.Repositories.ListLanguages(ctx, "o", "r") if err != nil { t.Errorf("Repositories.ListLanguages returned error: %v", err) } want := map[string]int{"go": 1} if !cmp.Equal(languages, want) { t.Errorf("Repositories.ListLanguages returned %+v, want %+v", languages, want) } const methodName = "ListLanguages" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListLanguages(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListLanguages(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListTeams(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/teams", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() teams, _, err := client.Repositories.ListTeams(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListTeams returned error: %v", err) } want := []*Team{{ID: Int64(1)}} if !cmp.Equal(teams, want) { t.Errorf("Repositories.ListTeams returned %+v, want %+v", teams, want) } const methodName = "ListTeams" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListTeams(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListTeams(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListTags(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/tags", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"name":"n", "commit" : {"sha" : "s", "url" : "u"}, "zipball_url": "z", "tarball_url": "t"}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() tags, _, err := client.Repositories.ListTags(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListTags returned error: %v", err) } want := []*RepositoryTag{ { Name: String("n"), Commit: &Commit{ SHA: String("s"), URL: String("u"), }, ZipballURL: String("z"), TarballURL: String("t"), }, } if !cmp.Equal(tags, want) { t.Errorf("Repositories.ListTags returned %+v, want %+v", tags, want) } const methodName = "ListTags" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListTags(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListTags(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListBranches(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"name":"master", "commit" : {"sha" : "a57781", "url" : "https://api.github.com/repos/o/r/commits/a57781"}}]`) }) opt := &BranchListOptions{ Protected: nil, ListOptions: ListOptions{Page: 2}, } ctx := context.Background() branches, _, err := client.Repositories.ListBranches(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListBranches returned error: %v", err) } want := []*Branch{{Name: String("master"), Commit: &RepositoryCommit{SHA: String("a57781"), URL: String("https://api.github.com/repos/o/r/commits/a57781")}}} if !cmp.Equal(branches, want) { t.Errorf("Repositories.ListBranches returned %+v, want %+v", branches, want) } const methodName = "ListBranches" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListBranches(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListBranches(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetBranch(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"name":"n", "commit":{"sha":"s","commit":{"message":"m"}}, "protected":true}`) }) ctx := context.Background() branch, _, err := client.Repositories.GetBranch(ctx, "o", "r", "b", false) if err != nil { t.Errorf("Repositories.GetBranch returned error: %v", err) } want := &Branch{ Name: String("n"), Commit: &RepositoryCommit{ SHA: String("s"), Commit: &Commit{ Message: String("m"), }, }, Protected: Bool(true), } if !cmp.Equal(branch, want) { t.Errorf("Repositories.GetBranch returned %+v, want %+v", branch, want) } const methodName = "GetBranch" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetBranch(ctx, "\n", "\n", "\n", false) return err }) } func TestRepositoriesService_GetBranch_StatusMovedPermanently_followRedirects(t *testing.T) { client, mux, serverURL, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") redirectURL, _ := url.Parse(serverURL + baseURLPath + "/repos/o/r/branches/br") http.Redirect(w, r, redirectURL.String(), http.StatusMovedPermanently) }) mux.HandleFunc("/repos/o/r/branches/br", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"name":"n", "commit":{"sha":"s","commit":{"message":"m"}}, "protected":true}`) }) ctx := context.Background() branch, resp, err := client.Repositories.GetBranch(ctx, "o", "r", "b", true) if err != nil { t.Errorf("Repositories.GetBranch returned error: %v", err) } if resp.StatusCode != http.StatusOK { t.Errorf("Repositories.GetBranch returned status: %d, want %d", resp.StatusCode, http.StatusOK) } want := &Branch{ Name: String("n"), Commit: &RepositoryCommit{ SHA: String("s"), Commit: &Commit{ Message: String("m"), }, }, Protected: Bool(true), } if !cmp.Equal(branch, want) { t.Errorf("Repositories.GetBranch returned %+v, want %+v", branch, want) } } func TestRepositoriesService_GetBranch_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Error(w, "branch not found", http.StatusNotFound) }) ctx := context.Background() _, resp, err := client.Repositories.GetBranch(ctx, "o", "r", "b", true) if err == nil { t.Error("Repositories.GetBranch returned error: nil") } if resp.StatusCode != http.StatusNotFound { t.Errorf("Repositories.GetBranch returned status: %d, want %d", resp.StatusCode, http.StatusNotFound) } // Add custom round tripper client.client.Transport = roundTripperFunc(func(r *http.Request) (*http.Response, error) { return nil, errors.New("failed to get branch") }) const methodName = "GetBranch" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetBranch(ctx, "o", "r", "b", true) return err }) } func TestRepositoriesService_GetBranchProtection(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection", func(w http.ResponseWriter, r *http.Request) { v := new(ProtectionRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "GET") // TODO: remove custom Accept header when this API fully launches testHeader(t, r, "Accept", mediaTypeRequiredApprovingReviewsPreview) fmt.Fprintf(w, `{ "required_status_checks":{ "strict":true, "contexts":["continuous-integration"] }, "required_pull_request_reviews":{ "dismissal_restrictions":{ "users":[{ "id":3, "login":"u" }], "teams":[{ "id":4, "slug":"t" }] }, "dismiss_stale_reviews":true, "require_code_owner_reviews":true, "required_approving_review_count":1 }, "enforce_admins":{ "url":"/repos/o/r/branches/b/protection/enforce_admins", "enabled":true }, "restrictions":{ "users":[{"id":1,"login":"u"}], "teams":[{"id":2,"slug":"t"}] }, "required_conversation_resolution": { "enabled": true } }`) }) ctx := context.Background() protection, _, err := client.Repositories.GetBranchProtection(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.GetBranchProtection returned error: %v", err) } want := &Protection{ RequiredStatusChecks: &RequiredStatusChecks{ Strict: true, Contexts: []string{"continuous-integration"}, }, RequiredPullRequestReviews: &PullRequestReviewsEnforcement{ DismissStaleReviews: true, DismissalRestrictions: &DismissalRestrictions{ Users: []*User{ {Login: String("u"), ID: Int64(3)}, }, Teams: []*Team{ {Slug: String("t"), ID: Int64(4)}, }, }, RequireCodeOwnerReviews: true, RequiredApprovingReviewCount: 1, }, EnforceAdmins: &AdminEnforcement{ URL: String("/repos/o/r/branches/b/protection/enforce_admins"), Enabled: true, }, Restrictions: &BranchRestrictions{ Users: []*User{ {Login: String("u"), ID: Int64(1)}, }, Teams: []*Team{ {Slug: String("t"), ID: Int64(2)}, }, }, RequiredConversationResolution: &RequiredConversationResolution{ Enabled: true, }, } if !cmp.Equal(protection, want) { t.Errorf("Repositories.GetBranchProtection returned %+v, want %+v", protection, want) } const methodName = "GetBranchProtection" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetBranchProtection(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetBranchProtection(ctx, "o", "r", "b") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetBranchProtection_noDismissalRestrictions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") // TODO: remove custom Accept header when this API fully launches testHeader(t, r, "Accept", mediaTypeRequiredApprovingReviewsPreview) fmt.Fprintf(w, `{ "required_status_checks":{ "strict":true, "contexts":["continuous-integration"] }, "required_pull_request_reviews":{ "dismiss_stale_reviews":true, "require_code_owner_reviews":true, "required_approving_review_count":1 }, "enforce_admins":{ "url":"/repos/o/r/branches/b/protection/enforce_admins", "enabled":true }, "restrictions":{ "users":[{"id":1,"login":"u"}], "teams":[{"id":2,"slug":"t"}] } }`) }) ctx := context.Background() protection, _, err := client.Repositories.GetBranchProtection(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.GetBranchProtection returned error: %v", err) } want := &Protection{ RequiredStatusChecks: &RequiredStatusChecks{ Strict: true, Contexts: []string{"continuous-integration"}, }, RequiredPullRequestReviews: &PullRequestReviewsEnforcement{ DismissStaleReviews: true, DismissalRestrictions: nil, RequireCodeOwnerReviews: true, RequiredApprovingReviewCount: 1, }, EnforceAdmins: &AdminEnforcement{ URL: String("/repos/o/r/branches/b/protection/enforce_admins"), Enabled: true, }, Restrictions: &BranchRestrictions{ Users: []*User{ {Login: String("u"), ID: Int64(1)}, }, Teams: []*Team{ {Slug: String("t"), ID: Int64(2)}, }, }, } if !cmp.Equal(protection, want) { t.Errorf("Repositories.GetBranchProtection returned %+v, want %+v", protection, want) } } func TestRepositoriesService_UpdateBranchProtection(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ProtectionRequest{ RequiredStatusChecks: &RequiredStatusChecks{ Strict: true, Contexts: []string{"continuous-integration"}, }, RequiredPullRequestReviews: &PullRequestReviewsEnforcementRequest{ DismissStaleReviews: true, DismissalRestrictionsRequest: &DismissalRestrictionsRequest{ Users: &[]string{"uu"}, Teams: &[]string{"tt"}, }, }, Restrictions: &BranchRestrictionsRequest{ Users: []string{"u"}, Teams: []string{"t"}, Apps: []string{"a"}, }, } mux.HandleFunc("/repos/o/r/branches/b/protection", func(w http.ResponseWriter, r *http.Request) { v := new(ProtectionRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } // TODO: remove custom Accept header when this API fully launches testHeader(t, r, "Accept", mediaTypeRequiredApprovingReviewsPreview) fmt.Fprintf(w, `{ "required_status_checks":{ "strict":true, "contexts":["continuous-integration"] }, "required_pull_request_reviews":{ "dismissal_restrictions":{ "users":[{ "id":3, "login":"uu" }], "teams":[{ "id":4, "slug":"tt" }] }, "dismiss_stale_reviews":true, "require_code_owner_reviews":true }, "restrictions":{ "users":[{"id":1,"login":"u"}], "teams":[{"id":2,"slug":"t"}], "apps":[{"id":3,"slug":"a"}] } }`) }) ctx := context.Background() protection, _, err := client.Repositories.UpdateBranchProtection(ctx, "o", "r", "b", input) if err != nil { t.Errorf("Repositories.UpdateBranchProtection returned error: %v", err) } want := &Protection{ RequiredStatusChecks: &RequiredStatusChecks{ Strict: true, Contexts: []string{"continuous-integration"}, }, RequiredPullRequestReviews: &PullRequestReviewsEnforcement{ DismissStaleReviews: true, DismissalRestrictions: &DismissalRestrictions{ Users: []*User{ {Login: String("uu"), ID: Int64(3)}, }, Teams: []*Team{ {Slug: String("tt"), ID: Int64(4)}, }, }, RequireCodeOwnerReviews: true, }, Restrictions: &BranchRestrictions{ Users: []*User{ {Login: String("u"), ID: Int64(1)}, }, Teams: []*Team{ {Slug: String("t"), ID: Int64(2)}, }, Apps: []*App{ {Slug: String("a"), ID: Int64(3)}, }, }, } if !cmp.Equal(protection, want) { t.Errorf("Repositories.UpdateBranchProtection returned %+v, want %+v", protection, want) } const methodName = "UpdateBranchProtection" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.UpdateBranchProtection(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.UpdateBranchProtection(ctx, "o", "r", "b", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_RemoveBranchProtection(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Repositories.RemoveBranchProtection(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.RemoveBranchProtection returned error: %v", err) } const methodName = "RemoveBranchProtection" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.RemoveBranchProtection(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.RemoveBranchProtection(ctx, "o", "r", "b") }) } func TestRepositoriesService_ListLanguages_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.ListLanguages(ctx, "%", "%") testURLParseError(t, err) } func TestRepositoriesService_License(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/license", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"name": "LICENSE", "path": "LICENSE", "license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","featured":true}}`) }) ctx := context.Background() got, _, err := client.Repositories.License(ctx, "o", "r") if err != nil { t.Errorf("Repositories.License returned error: %v", err) } want := &RepositoryLicense{ Name: String("LICENSE"), Path: String("LICENSE"), License: &License{ Name: String("MIT License"), Key: String("mit"), SPDXID: String("MIT"), URL: String("https://api.github.com/licenses/mit"), Featured: Bool(true), }, } if !cmp.Equal(got, want) { t.Errorf("Repositories.License returned %+v, want %+v", got, want) } const methodName = "License" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.License(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.License(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetRequiredStatusChecks(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/required_status_checks", func(w http.ResponseWriter, r *http.Request) { v := new(ProtectionRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "GET") fmt.Fprint(w, `{"strict": true,"contexts": ["x","y","z"]}`) }) ctx := context.Background() checks, _, err := client.Repositories.GetRequiredStatusChecks(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.GetRequiredStatusChecks returned error: %v", err) } want := &RequiredStatusChecks{ Strict: true, Contexts: []string{"x", "y", "z"}, } if !cmp.Equal(checks, want) { t.Errorf("Repositories.GetRequiredStatusChecks returned %+v, want %+v", checks, want) } const methodName = "GetRequiredStatusChecks" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetRequiredStatusChecks(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetRequiredStatusChecks(ctx, "o", "r", "b") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_UpdateRequiredStatusChecks(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &RequiredStatusChecksRequest{ Strict: Bool(true), Contexts: []string{"continuous-integration"}, } mux.HandleFunc("/repos/o/r/branches/b/protection/required_status_checks", func(w http.ResponseWriter, r *http.Request) { v := new(RequiredStatusChecksRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } testHeader(t, r, "Accept", mediaTypeV3) fmt.Fprintf(w, `{"strict":true,"contexts":["continuous-integration"]}`) }) ctx := context.Background() statusChecks, _, err := client.Repositories.UpdateRequiredStatusChecks(ctx, "o", "r", "b", input) if err != nil { t.Errorf("Repositories.UpdateRequiredStatusChecks returned error: %v", err) } want := &RequiredStatusChecks{ Strict: true, Contexts: []string{"continuous-integration"}, } if !cmp.Equal(statusChecks, want) { t.Errorf("Repositories.UpdateRequiredStatusChecks returned %+v, want %+v", statusChecks, want) } const methodName = "UpdateRequiredStatusChecks" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.UpdateRequiredStatusChecks(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.UpdateRequiredStatusChecks(ctx, "o", "r", "b", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_RemoveRequiredStatusChecks(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/required_status_checks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeV3) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Repositories.RemoveRequiredStatusChecks(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.RemoveRequiredStatusChecks returned error: %v", err) } const methodName = "RemoveRequiredStatusChecks" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.RemoveRequiredStatusChecks(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.RemoveRequiredStatusChecks(ctx, "o", "r", "b") }) } func TestRepositoriesService_ListRequiredStatusChecksContexts(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/required_status_checks/contexts", func(w http.ResponseWriter, r *http.Request) { v := new(ProtectionRequest) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "GET") fmt.Fprint(w, `["x", "y", "z"]`) }) ctx := context.Background() contexts, _, err := client.Repositories.ListRequiredStatusChecksContexts(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.ListRequiredStatusChecksContexts returned error: %v", err) } want := []string{"x", "y", "z"} if !cmp.Equal(contexts, want) { t.Errorf("Repositories.ListRequiredStatusChecksContexts returned %+v, want %+v", contexts, want) } const methodName = "ListRequiredStatusChecksContexts" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListRequiredStatusChecksContexts(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListRequiredStatusChecksContexts(ctx, "o", "r", "b") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetPullRequestReviewEnforcement(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/required_pull_request_reviews", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") // TODO: remove custom Accept header when this API fully launches testHeader(t, r, "Accept", mediaTypeRequiredApprovingReviewsPreview) fmt.Fprintf(w, `{ "dismissal_restrictions":{ "users":[{"id":1,"login":"u"}], "teams":[{"id":2,"slug":"t"}] }, "dismiss_stale_reviews":true, "require_code_owner_reviews":true, "required_approving_review_count":1 }`) }) ctx := context.Background() enforcement, _, err := client.Repositories.GetPullRequestReviewEnforcement(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.GetPullRequestReviewEnforcement returned error: %v", err) } want := &PullRequestReviewsEnforcement{ DismissStaleReviews: true, DismissalRestrictions: &DismissalRestrictions{ Users: []*User{ {Login: String("u"), ID: Int64(1)}, }, Teams: []*Team{ {Slug: String("t"), ID: Int64(2)}, }, }, RequireCodeOwnerReviews: true, RequiredApprovingReviewCount: 1, } if !cmp.Equal(enforcement, want) { t.Errorf("Repositories.GetPullRequestReviewEnforcement returned %+v, want %+v", enforcement, want) } const methodName = "GetPullRequestReviewEnforcement" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetPullRequestReviewEnforcement(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetPullRequestReviewEnforcement(ctx, "o", "r", "b") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_UpdatePullRequestReviewEnforcement(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &PullRequestReviewsEnforcementUpdate{ DismissalRestrictionsRequest: &DismissalRestrictionsRequest{ Users: &[]string{"u"}, Teams: &[]string{"t"}, }, } mux.HandleFunc("/repos/o/r/branches/b/protection/required_pull_request_reviews", func(w http.ResponseWriter, r *http.Request) { v := new(PullRequestReviewsEnforcementUpdate) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } // TODO: remove custom Accept header when this API fully launches testHeader(t, r, "Accept", mediaTypeRequiredApprovingReviewsPreview) fmt.Fprintf(w, `{ "dismissal_restrictions":{ "users":[{"id":1,"login":"u"}], "teams":[{"id":2,"slug":"t"}] }, "dismiss_stale_reviews":true, "require_code_owner_reviews":true, "required_approving_review_count":3 }`) }) ctx := context.Background() enforcement, _, err := client.Repositories.UpdatePullRequestReviewEnforcement(ctx, "o", "r", "b", input) if err != nil { t.Errorf("Repositories.UpdatePullRequestReviewEnforcement returned error: %v", err) } want := &PullRequestReviewsEnforcement{ DismissStaleReviews: true, DismissalRestrictions: &DismissalRestrictions{ Users: []*User{ {Login: String("u"), ID: Int64(1)}, }, Teams: []*Team{ {Slug: String("t"), ID: Int64(2)}, }, }, RequireCodeOwnerReviews: true, RequiredApprovingReviewCount: 3, } if !cmp.Equal(enforcement, want) { t.Errorf("Repositories.UpdatePullRequestReviewEnforcement returned %+v, want %+v", enforcement, want) } const methodName = "UpdatePullRequestReviewEnforcement" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.UpdatePullRequestReviewEnforcement(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.UpdatePullRequestReviewEnforcement(ctx, "o", "r", "b", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_DisableDismissalRestrictions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/required_pull_request_reviews", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") // TODO: remove custom Accept header when this API fully launches testHeader(t, r, "Accept", mediaTypeRequiredApprovingReviewsPreview) testBody(t, r, `{"dismissal_restrictions":{}}`+"\n") fmt.Fprintf(w, `{"dismiss_stale_reviews":true,"require_code_owner_reviews":true,"required_approving_review_count":1}`) }) ctx := context.Background() enforcement, _, err := client.Repositories.DisableDismissalRestrictions(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.DisableDismissalRestrictions returned error: %v", err) } want := &PullRequestReviewsEnforcement{ DismissStaleReviews: true, DismissalRestrictions: nil, RequireCodeOwnerReviews: true, RequiredApprovingReviewCount: 1, } if !cmp.Equal(enforcement, want) { t.Errorf("Repositories.DisableDismissalRestrictions returned %+v, want %+v", enforcement, want) } const methodName = "DisableDismissalRestrictions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.DisableDismissalRestrictions(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.DisableDismissalRestrictions(ctx, "o", "r", "b") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_RemovePullRequestReviewEnforcement(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/required_pull_request_reviews", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Repositories.RemovePullRequestReviewEnforcement(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.RemovePullRequestReviewEnforcement returned error: %v", err) } const methodName = "RemovePullRequestReviewEnforcement" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.RemovePullRequestReviewEnforcement(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.RemovePullRequestReviewEnforcement(ctx, "o", "r", "b") }) } func TestRepositoriesService_GetAdminEnforcement(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/enforce_admins", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprintf(w, `{"url":"/repos/o/r/branches/b/protection/enforce_admins","enabled":true}`) }) ctx := context.Background() enforcement, _, err := client.Repositories.GetAdminEnforcement(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.GetAdminEnforcement returned error: %v", err) } want := &AdminEnforcement{ URL: String("/repos/o/r/branches/b/protection/enforce_admins"), Enabled: true, } if !cmp.Equal(enforcement, want) { t.Errorf("Repositories.GetAdminEnforcement returned %+v, want %+v", enforcement, want) } const methodName = "GetAdminEnforcement" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetAdminEnforcement(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetAdminEnforcement(ctx, "o", "r", "b") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_AddAdminEnforcement(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/enforce_admins", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprintf(w, `{"url":"/repos/o/r/branches/b/protection/enforce_admins","enabled":true}`) }) ctx := context.Background() enforcement, _, err := client.Repositories.AddAdminEnforcement(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.AddAdminEnforcement returned error: %v", err) } want := &AdminEnforcement{ URL: String("/repos/o/r/branches/b/protection/enforce_admins"), Enabled: true, } if !cmp.Equal(enforcement, want) { t.Errorf("Repositories.AddAdminEnforcement returned %+v, want %+v", enforcement, want) } const methodName = "AddAdminEnforcement" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.AddAdminEnforcement(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.AddAdminEnforcement(ctx, "o", "r", "b") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_RemoveAdminEnforcement(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/enforce_admins", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Repositories.RemoveAdminEnforcement(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.RemoveAdminEnforcement returned error: %v", err) } const methodName = "RemoveAdminEnforcement" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.RemoveAdminEnforcement(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.RemoveAdminEnforcement(ctx, "o", "r", "b") }) } func TestRepositoriesService_GetSignaturesProtectedBranch(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/required_signatures", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeSignaturePreview) fmt.Fprintf(w, `{"url":"/repos/o/r/branches/b/protection/required_signatures","enabled":false}`) }) ctx := context.Background() signature, _, err := client.Repositories.GetSignaturesProtectedBranch(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.GetSignaturesProtectedBranch returned error: %v", err) } want := &SignaturesProtectedBranch{ URL: String("/repos/o/r/branches/b/protection/required_signatures"), Enabled: Bool(false), } if !cmp.Equal(signature, want) { t.Errorf("Repositories.GetSignaturesProtectedBranch returned %+v, want %+v", signature, want) } const methodName = "GetSignaturesProtectedBranch" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetSignaturesProtectedBranch(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetSignaturesProtectedBranch(ctx, "o", "r", "b") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_RequireSignaturesOnProtectedBranch(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/required_signatures", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeSignaturePreview) fmt.Fprintf(w, `{"url":"/repos/o/r/branches/b/protection/required_signatures","enabled":true}`) }) ctx := context.Background() signature, _, err := client.Repositories.RequireSignaturesOnProtectedBranch(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.RequireSignaturesOnProtectedBranch returned error: %v", err) } want := &SignaturesProtectedBranch{ URL: String("/repos/o/r/branches/b/protection/required_signatures"), Enabled: Bool(true), } if !cmp.Equal(signature, want) { t.Errorf("Repositories.RequireSignaturesOnProtectedBranch returned %+v, want %+v", signature, want) } const methodName = "RequireSignaturesOnProtectedBranch" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.RequireSignaturesOnProtectedBranch(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.RequireSignaturesOnProtectedBranch(ctx, "o", "r", "b") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_OptionalSignaturesOnProtectedBranch(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/required_signatures", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeSignaturePreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Repositories.OptionalSignaturesOnProtectedBranch(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.OptionalSignaturesOnProtectedBranch returned error: %v", err) } const methodName = "OptionalSignaturesOnProtectedBranch" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.OptionalSignaturesOnProtectedBranch(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.OptionalSignaturesOnProtectedBranch(ctx, "o", "r", "b") }) } func TestPullRequestReviewsEnforcementRequest_MarshalJSON_nilDismissalRestirctions(t *testing.T) { req := PullRequestReviewsEnforcementRequest{} got, err := json.Marshal(req) if err != nil { t.Errorf("PullRequestReviewsEnforcementRequest.MarshalJSON returned error: %v", err) } want := `{"dismiss_stale_reviews":false,"require_code_owner_reviews":false,"required_approving_review_count":0}` if want != string(got) { t.Errorf("PullRequestReviewsEnforcementRequest.MarshalJSON returned %+v, want %+v", string(got), want) } req = PullRequestReviewsEnforcementRequest{ DismissalRestrictionsRequest: &DismissalRestrictionsRequest{}, } got, err = json.Marshal(req) if err != nil { t.Errorf("PullRequestReviewsEnforcementRequest.MarshalJSON returned error: %v", err) } want = `{"dismissal_restrictions":{},"dismiss_stale_reviews":false,"require_code_owner_reviews":false,"required_approving_review_count":0}` if want != string(got) { t.Errorf("PullRequestReviewsEnforcementRequest.MarshalJSON returned %+v, want %+v", string(got), want) } req = PullRequestReviewsEnforcementRequest{ DismissalRestrictionsRequest: &DismissalRestrictionsRequest{ Users: &[]string{}, Teams: &[]string{}, }, } got, err = json.Marshal(req) if err != nil { t.Errorf("PullRequestReviewsEnforcementRequest.MarshalJSON returned error: %v", err) } want = `{"dismissal_restrictions":{"users":[],"teams":[]},"dismiss_stale_reviews":false,"require_code_owner_reviews":false,"required_approving_review_count":0}` if want != string(got) { t.Errorf("PullRequestReviewsEnforcementRequest.MarshalJSON returned %+v, want %+v", string(got), want) } } func TestRepositoriesService_ListAllTopics(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/topics", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeTopicsPreview) fmt.Fprint(w, `{"names":["go", "go-github", "github"]}`) }) ctx := context.Background() got, _, err := client.Repositories.ListAllTopics(ctx, "o", "r") if err != nil { t.Fatalf("Repositories.ListAllTopics returned error: %v", err) } want := []string{"go", "go-github", "github"} if !cmp.Equal(got, want) { t.Errorf("Repositories.ListAllTopics returned %+v, want %+v", got, want) } const methodName = "ListAllTopics" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListAllTopics(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListAllTopics(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListAllTopics_emptyTopics(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/topics", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeTopicsPreview) fmt.Fprint(w, `{"names":[]}`) }) ctx := context.Background() got, _, err := client.Repositories.ListAllTopics(ctx, "o", "r") if err != nil { t.Fatalf("Repositories.ListAllTopics returned error: %v", err) } want := []string{} if !cmp.Equal(got, want) { t.Errorf("Repositories.ListAllTopics returned %+v, want %+v", got, want) } } func TestRepositoriesService_ReplaceAllTopics(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/topics", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Accept", mediaTypeTopicsPreview) fmt.Fprint(w, `{"names":["go", "go-github", "github"]}`) }) ctx := context.Background() got, _, err := client.Repositories.ReplaceAllTopics(ctx, "o", "r", []string{"go", "go-github", "github"}) if err != nil { t.Fatalf("Repositories.ReplaceAllTopics returned error: %v", err) } want := []string{"go", "go-github", "github"} if !cmp.Equal(got, want) { t.Errorf("Repositories.ReplaceAllTopics returned %+v, want %+v", got, want) } const methodName = "ReplaceAllTopics" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ReplaceAllTopics(ctx, "\n", "\n", []string{"\n", "\n", "\n"}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ReplaceAllTopics(ctx, "o", "r", []string{"go", "go-github", "github"}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ReplaceAllTopics_nilSlice(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/topics", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Accept", mediaTypeTopicsPreview) testBody(t, r, `{"names":[]}`+"\n") fmt.Fprint(w, `{"names":[]}`) }) ctx := context.Background() got, _, err := client.Repositories.ReplaceAllTopics(ctx, "o", "r", nil) if err != nil { t.Fatalf("Repositories.ReplaceAllTopics returned error: %v", err) } want := []string{} if !cmp.Equal(got, want) { t.Errorf("Repositories.ReplaceAllTopics returned %+v, want %+v", got, want) } } func TestRepositoriesService_ReplaceAllTopics_emptySlice(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/topics", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Accept", mediaTypeTopicsPreview) testBody(t, r, `{"names":[]}`+"\n") fmt.Fprint(w, `{"names":[]}`) }) ctx := context.Background() got, _, err := client.Repositories.ReplaceAllTopics(ctx, "o", "r", []string{}) if err != nil { t.Fatalf("Repositories.ReplaceAllTopics returned error: %v", err) } want := []string{} if !cmp.Equal(got, want) { t.Errorf("Repositories.ReplaceAllTopics returned %+v, want %+v", got, want) } } func TestRepositoriesService_ListApps(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/restrictions/apps", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") }) ctx := context.Background() _, _, err := client.Repositories.ListApps(ctx, "o", "r", "b") if err != nil { t.Errorf("Repositories.ListApps returned error: %v", err) } const methodName = "ListApps" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListApps(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListApps(ctx, "o", "r", "b") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ReplaceAppRestrictions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/restrictions/apps", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") fmt.Fprint(w, `[{ "name": "octocat" }]`) }) input := []string{"octocat"} ctx := context.Background() got, _, err := client.Repositories.ReplaceAppRestrictions(ctx, "o", "r", "b", input) if err != nil { t.Errorf("Repositories.ReplaceAppRestrictions returned error: %v", err) } want := []*App{ {Name: String("octocat")}, } if !cmp.Equal(got, want) { t.Errorf("Repositories.ReplaceAppRestrictions returned %+v, want %+v", got, want) } const methodName = "ReplaceAppRestrictions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ReplaceAppRestrictions(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ReplaceAppRestrictions(ctx, "o", "r", "b", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_AddAppRestrictions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/restrictions/apps", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `[{ "name": "octocat" }]`) }) input := []string{"octocat"} ctx := context.Background() got, _, err := client.Repositories.AddAppRestrictions(ctx, "o", "r", "b", input) if err != nil { t.Errorf("Repositories.AddAppRestrictions returned error: %v", err) } want := []*App{ {Name: String("octocat")}, } if !cmp.Equal(got, want) { t.Errorf("Repositories.AddAppRestrictions returned %+v, want %+v", got, want) } const methodName = "AddAppRestrictions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.AddAppRestrictions(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.AddAppRestrictions(ctx, "o", "r", "b", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_RemoveAppRestrictions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/branches/b/protection/restrictions/apps", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") fmt.Fprint(w, `[]`) }) input := []string{"octocat"} ctx := context.Background() got, _, err := client.Repositories.RemoveAppRestrictions(ctx, "o", "r", "b", input) if err != nil { t.Errorf("Repositories.RemoveAppRestrictions returned error: %v", err) } want := []*App{} if !cmp.Equal(got, want) { t.Errorf("Repositories.RemoveAppRestrictions returned %+v, want %+v", got, want) } const methodName = "RemoveAppRestrictions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.RemoveAppRestrictions(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.RemoveAppRestrictions(ctx, "o", "r", "b", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_Transfer(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := TransferRequest{NewOwner: "a", TeamID: []int64{123}} mux.HandleFunc("/repos/o/r/transfer", func(w http.ResponseWriter, r *http.Request) { var v TransferRequest json.NewDecoder(r.Body).Decode(&v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"owner":{"login":"a"}}`) }) ctx := context.Background() got, _, err := client.Repositories.Transfer(ctx, "o", "r", input) if err != nil { t.Errorf("Repositories.Transfer returned error: %v", err) } want := &Repository{Owner: &User{Login: String("a")}} if !cmp.Equal(got, want) { t.Errorf("Repositories.Transfer returned %+v, want %+v", got, want) } const methodName = "Transfer" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.Transfer(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.Transfer(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_Dispatch(t *testing.T) { client, mux, _, teardown := setup() defer teardown() var input DispatchRequestOptions mux.HandleFunc("/repos/o/r/dispatches", func(w http.ResponseWriter, r *http.Request) { var v DispatchRequestOptions json.NewDecoder(r.Body).Decode(&v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"owner":{"login":"a"}}`) }) ctx := context.Background() testCases := []interface{}{ nil, struct { Foo string }{ Foo: "test", }, struct { Bar int }{ Bar: 42, }, struct { Foo string Bar int Baz bool }{ Foo: "test", Bar: 42, Baz: false, }, } for _, tc := range testCases { if tc == nil { input = DispatchRequestOptions{EventType: "go"} } else { bytes, _ := json.Marshal(tc) payload := json.RawMessage(bytes) input = DispatchRequestOptions{EventType: "go", ClientPayload: &payload} } got, _, err := client.Repositories.Dispatch(ctx, "o", "r", input) if err != nil { t.Errorf("Repositories.Dispatch returned error: %v", err) } want := &Repository{Owner: &User{Login: String("a")}} if !cmp.Equal(got, want) { t.Errorf("Repositories.Dispatch returned %+v, want %+v", got, want) } } const methodName = "Dispatch" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.Dispatch(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.Dispatch(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-38.1.0/github/repos_traffic.go000066400000000000000000000107771410475703100201450ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" ) // TrafficReferrer represent information about traffic from a referrer . type TrafficReferrer struct { Referrer *string `json:"referrer,omitempty"` Count *int `json:"count,omitempty"` Uniques *int `json:"uniques,omitempty"` } // TrafficPath represent information about the traffic on a path of the repo. type TrafficPath struct { Path *string `json:"path,omitempty"` Title *string `json:"title,omitempty"` Count *int `json:"count,omitempty"` Uniques *int `json:"uniques,omitempty"` } // TrafficData represent information about a specific timestamp in views or clones list. type TrafficData struct { Timestamp *Timestamp `json:"timestamp,omitempty"` Count *int `json:"count,omitempty"` Uniques *int `json:"uniques,omitempty"` } // TrafficViews represent information about the number of views in the last 14 days. type TrafficViews struct { Views []*TrafficData `json:"views,omitempty"` Count *int `json:"count,omitempty"` Uniques *int `json:"uniques,omitempty"` } // TrafficClones represent information about the number of clones in the last 14 days. type TrafficClones struct { Clones []*TrafficData `json:"clones,omitempty"` Count *int `json:"count,omitempty"` Uniques *int `json:"uniques,omitempty"` } // TrafficBreakdownOptions specifies the parameters to methods that support breakdown per day or week. // Can be one of: day, week. Default: day. type TrafficBreakdownOptions struct { Per string `url:"per,omitempty"` } // ListTrafficReferrers list the top 10 referrers over the last 14 days. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-top-referral-sources func (s *RepositoriesService) ListTrafficReferrers(ctx context.Context, owner, repo string) ([]*TrafficReferrer, *Response, error) { u := fmt.Sprintf("repos/%v/%v/traffic/popular/referrers", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var trafficReferrers []*TrafficReferrer resp, err := s.client.Do(ctx, req, &trafficReferrers) if err != nil { return nil, resp, err } return trafficReferrers, resp, nil } // ListTrafficPaths list the top 10 popular content over the last 14 days. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-top-referral-paths func (s *RepositoriesService) ListTrafficPaths(ctx context.Context, owner, repo string) ([]*TrafficPath, *Response, error) { u := fmt.Sprintf("repos/%v/%v/traffic/popular/paths", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var paths []*TrafficPath resp, err := s.client.Do(ctx, req, &paths) if err != nil { return nil, resp, err } return paths, resp, nil } // ListTrafficViews get total number of views for the last 14 days and breaks it down either per day or week. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-page-views func (s *RepositoriesService) ListTrafficViews(ctx context.Context, owner, repo string, opts *TrafficBreakdownOptions) (*TrafficViews, *Response, error) { u := fmt.Sprintf("repos/%v/%v/traffic/views", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } trafficViews := new(TrafficViews) resp, err := s.client.Do(ctx, req, &trafficViews) if err != nil { return nil, resp, err } return trafficViews, resp, nil } // ListTrafficClones get total number of clones for the last 14 days and breaks it down either per day or week for the last 14 days. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#get-repository-clones func (s *RepositoriesService) ListTrafficClones(ctx context.Context, owner, repo string, opts *TrafficBreakdownOptions) (*TrafficClones, *Response, error) { u := fmt.Sprintf("repos/%v/%v/traffic/clones", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } trafficClones := new(TrafficClones) resp, err := s.client.Do(ctx, req, &trafficClones) if err != nil { return nil, resp, err } return trafficClones, resp, nil } go-github-38.1.0/github/repos_traffic_test.go000066400000000000000000000130271410475703100211730ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_ListTrafficReferrers(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/traffic/popular/referrers", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprintf(w, `[{ "referrer": "Google", "count": 4, "uniques": 3 }]`) }) ctx := context.Background() got, _, err := client.Repositories.ListTrafficReferrers(ctx, "o", "r") if err != nil { t.Errorf("Repositories.ListTrafficReferrers returned error: %+v", err) } want := []*TrafficReferrer{{ Referrer: String("Google"), Count: Int(4), Uniques: Int(3), }} if !cmp.Equal(got, want) { t.Errorf("Repositories.ListTrafficReferrers returned %+v, want %+v", got, want) } const methodName = "ListTrafficReferrers" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListTrafficReferrers(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListTrafficReferrers(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListTrafficPaths(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/traffic/popular/paths", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprintf(w, `[{ "path": "/github/hubot", "title": "github/hubot: A customizable life embetterment robot.", "count": 3542, "uniques": 2225 }]`) }) ctx := context.Background() got, _, err := client.Repositories.ListTrafficPaths(ctx, "o", "r") if err != nil { t.Errorf("Repositories.ListTrafficPaths returned error: %+v", err) } want := []*TrafficPath{{ Path: String("/github/hubot"), Title: String("github/hubot: A customizable life embetterment robot."), Count: Int(3542), Uniques: Int(2225), }} if !cmp.Equal(got, want) { t.Errorf("Repositories.ListTrafficPaths returned %+v, want %+v", got, want) } const methodName = "ListTrafficPaths" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListTrafficPaths(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListTrafficPaths(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListTrafficViews(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/traffic/views", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprintf(w, `{"count": 7, "uniques": 6, "views": [{ "timestamp": "2016-05-31T16:00:00.000Z", "count": 7, "uniques": 6 }]}`) }) ctx := context.Background() got, _, err := client.Repositories.ListTrafficViews(ctx, "o", "r", nil) if err != nil { t.Errorf("Repositories.ListTrafficViews returned error: %+v", err) } want := &TrafficViews{ Views: []*TrafficData{{ Timestamp: &Timestamp{time.Date(2016, time.May, 31, 16, 0, 0, 0, time.UTC)}, Count: Int(7), Uniques: Int(6), }}, Count: Int(7), Uniques: Int(6), } if !cmp.Equal(got, want) { t.Errorf("Repositories.ListTrafficViews returned %+v, want %+v", got, want) } const methodName = "ListTrafficViews" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListTrafficViews(ctx, "\n", "\n", &TrafficBreakdownOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListTrafficViews(ctx, "o", "r", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListTrafficClones(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/traffic/clones", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprintf(w, `{"count": 7, "uniques": 6, "clones": [{ "timestamp": "2016-05-31T16:00:00.00Z", "count": 7, "uniques": 6 }]}`) }) ctx := context.Background() got, _, err := client.Repositories.ListTrafficClones(ctx, "o", "r", nil) if err != nil { t.Errorf("Repositories.ListTrafficClones returned error: %+v", err) } want := &TrafficClones{ Clones: []*TrafficData{{ Timestamp: &Timestamp{time.Date(2016, time.May, 31, 16, 0, 0, 0, time.UTC)}, Count: Int(7), Uniques: Int(6), }}, Count: Int(7), Uniques: Int(6), } if !cmp.Equal(got, want) { t.Errorf("Repositories.ListTrafficClones returned %+v, want %+v", got, want) } const methodName = "ListTrafficClones" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListTrafficClones(ctx, "\n", "\n", &TrafficBreakdownOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListTrafficClones(ctx, "o", "r", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-38.1.0/github/search.go000066400000000000000000000277451410475703100165670ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "strconv" qs "github.com/google/go-querystring/query" ) // SearchService provides access to the search related functions // in the GitHub API. // // Each method takes a query string defining the search keywords and any search qualifiers. // For example, when searching issues, the query "gopher is:issue language:go" will search // for issues containing the word "gopher" in Go repositories. The method call // opts := &github.SearchOptions{Sort: "created", Order: "asc"} // cl.Search.Issues(ctx, "gopher is:issue language:go", opts) // will search for such issues, sorting by creation date in ascending order // (i.e., oldest first). // // If query includes multiple conditions, it MUST NOT include "+" as the condition separator. // You have to use " " as the separator instead. // For example, querying with "language:c++" and "leveldb", then query should be // "language:c++ leveldb" but not "language:c+++leveldb". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/search/ type SearchService service // SearchOptions specifies optional parameters to the SearchService methods. type SearchOptions struct { // How to sort the search results. Possible values are: // - for repositories: stars, fork, updated // - for commits: author-date, committer-date // - for code: indexed // - for issues: comments, created, updated // - for users: followers, repositories, joined // // Default is to sort by best match. Sort string `url:"sort,omitempty"` // Sort order if sort parameter is provided. Possible values are: asc, // desc. Default is desc. Order string `url:"order,omitempty"` // Whether to retrieve text match metadata with a query TextMatch bool `url:"-"` ListOptions } // Common search parameters. type searchParameters struct { Query string RepositoryID *int64 // Sent if non-nil. } // RepositoriesSearchResult represents the result of a repositories search. type RepositoriesSearchResult struct { Total *int `json:"total_count,omitempty"` IncompleteResults *bool `json:"incomplete_results,omitempty"` Repositories []*Repository `json:"items,omitempty"` } // Repositories searches repositories via various criteria. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/search/#search-repositories func (s *SearchService) Repositories(ctx context.Context, query string, opts *SearchOptions) (*RepositoriesSearchResult, *Response, error) { result := new(RepositoriesSearchResult) resp, err := s.search(ctx, "repositories", &searchParameters{Query: query}, opts, result) return result, resp, err } // TopicsSearchResult represents the result of a topics search. type TopicsSearchResult struct { Total *int `json:"total_count,omitempty"` IncompleteResults *bool `json:"incomplete_results,omitempty"` Topics []*TopicResult `json:"items,omitempty"` } type TopicResult struct { Name *string `json:"name,omitempty"` DisplayName *string `json:"display_name,omitempty"` ShortDescription *string `json:"short_description,omitempty"` Description *string `json:"description,omitempty"` CreatedBy *string `json:"created_by,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *string `json:"updated_at,omitempty"` Featured *bool `json:"featured,omitempty"` Curated *bool `json:"curated,omitempty"` Score *float64 `json:"score,omitempty"` } // Topics finds topics via various criteria. Results are sorted by best match. // Please see https://help.github.com/en/articles/searching-topics for more // information about search qualifiers. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/search/#search-topics func (s *SearchService) Topics(ctx context.Context, query string, opts *SearchOptions) (*TopicsSearchResult, *Response, error) { result := new(TopicsSearchResult) resp, err := s.search(ctx, "topics", &searchParameters{Query: query}, opts, result) return result, resp, err } // CommitsSearchResult represents the result of a commits search. type CommitsSearchResult struct { Total *int `json:"total_count,omitempty"` IncompleteResults *bool `json:"incomplete_results,omitempty"` Commits []*CommitResult `json:"items,omitempty"` } // CommitResult represents a commit object as returned in commit search endpoint response. type CommitResult struct { SHA *string `json:"sha,omitempty"` Commit *Commit `json:"commit,omitempty"` Author *User `json:"author,omitempty"` Committer *User `json:"committer,omitempty"` Parents []*Commit `json:"parents,omitempty"` HTMLURL *string `json:"html_url,omitempty"` URL *string `json:"url,omitempty"` CommentsURL *string `json:"comments_url,omitempty"` Repository *Repository `json:"repository,omitempty"` Score *float64 `json:"score,omitempty"` } // Commits searches commits via various criteria. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/search/#search-commits func (s *SearchService) Commits(ctx context.Context, query string, opts *SearchOptions) (*CommitsSearchResult, *Response, error) { result := new(CommitsSearchResult) resp, err := s.search(ctx, "commits", &searchParameters{Query: query}, opts, result) return result, resp, err } // IssuesSearchResult represents the result of an issues search. type IssuesSearchResult struct { Total *int `json:"total_count,omitempty"` IncompleteResults *bool `json:"incomplete_results,omitempty"` Issues []*Issue `json:"items,omitempty"` } // Issues searches issues via various criteria. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/search/#search-issues-and-pull-requests func (s *SearchService) Issues(ctx context.Context, query string, opts *SearchOptions) (*IssuesSearchResult, *Response, error) { result := new(IssuesSearchResult) resp, err := s.search(ctx, "issues", &searchParameters{Query: query}, opts, result) return result, resp, err } // UsersSearchResult represents the result of a users search. type UsersSearchResult struct { Total *int `json:"total_count,omitempty"` IncompleteResults *bool `json:"incomplete_results,omitempty"` Users []*User `json:"items,omitempty"` } // Users searches users via various criteria. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/search/#search-users func (s *SearchService) Users(ctx context.Context, query string, opts *SearchOptions) (*UsersSearchResult, *Response, error) { result := new(UsersSearchResult) resp, err := s.search(ctx, "users", &searchParameters{Query: query}, opts, result) return result, resp, err } // Match represents a single text match. type Match struct { Text *string `json:"text,omitempty"` Indices []int `json:"indices,omitempty"` } // TextMatch represents a text match for a SearchResult type TextMatch struct { ObjectURL *string `json:"object_url,omitempty"` ObjectType *string `json:"object_type,omitempty"` Property *string `json:"property,omitempty"` Fragment *string `json:"fragment,omitempty"` Matches []*Match `json:"matches,omitempty"` } func (tm TextMatch) String() string { return Stringify(tm) } // CodeSearchResult represents the result of a code search. type CodeSearchResult struct { Total *int `json:"total_count,omitempty"` IncompleteResults *bool `json:"incomplete_results,omitempty"` CodeResults []*CodeResult `json:"items,omitempty"` } // CodeResult represents a single search result. type CodeResult struct { Name *string `json:"name,omitempty"` Path *string `json:"path,omitempty"` SHA *string `json:"sha,omitempty"` HTMLURL *string `json:"html_url,omitempty"` Repository *Repository `json:"repository,omitempty"` TextMatches []*TextMatch `json:"text_matches,omitempty"` } func (c CodeResult) String() string { return Stringify(c) } // Code searches code via various criteria. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/search/#search-code func (s *SearchService) Code(ctx context.Context, query string, opts *SearchOptions) (*CodeSearchResult, *Response, error) { result := new(CodeSearchResult) resp, err := s.search(ctx, "code", &searchParameters{Query: query}, opts, result) return result, resp, err } // LabelsSearchResult represents the result of a code search. type LabelsSearchResult struct { Total *int `json:"total_count,omitempty"` IncompleteResults *bool `json:"incomplete_results,omitempty"` Labels []*LabelResult `json:"items,omitempty"` } // LabelResult represents a single search result. type LabelResult struct { ID *int64 `json:"id,omitempty"` URL *string `json:"url,omitempty"` Name *string `json:"name,omitempty"` Color *string `json:"color,omitempty"` Default *bool `json:"default,omitempty"` Description *string `json:"description,omitempty"` Score *float64 `json:"score,omitempty"` } func (l LabelResult) String() string { return Stringify(l) } // Labels searches labels in the repository with ID repoID via various criteria. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/search/#search-labels func (s *SearchService) Labels(ctx context.Context, repoID int64, query string, opts *SearchOptions) (*LabelsSearchResult, *Response, error) { result := new(LabelsSearchResult) resp, err := s.search(ctx, "labels", &searchParameters{RepositoryID: &repoID, Query: query}, opts, result) return result, resp, err } // Helper function that executes search queries against different // GitHub search types (repositories, commits, code, issues, users, labels) // // If searchParameters.Query includes multiple condition, it MUST NOT include "+" as condition separator. // For example, querying with "language:c++" and "leveldb", then searchParameters.Query should be "language:c++ leveldb" but not "language:c+++leveldb". func (s *SearchService) search(ctx context.Context, searchType string, parameters *searchParameters, opts *SearchOptions, result interface{}) (*Response, error) { params, err := qs.Values(opts) if err != nil { return nil, err } if parameters.RepositoryID != nil { params.Set("repository_id", strconv.FormatInt(*parameters.RepositoryID, 10)) } params.Set("q", parameters.Query) u := fmt.Sprintf("search/%s?%s", searchType, params.Encode()) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, err } switch { case searchType == "commits": // Accept header for search commits preview endpoint // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeCommitSearchPreview) case searchType == "topics": // Accept header for search repositories based on topics preview endpoint // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeTopicsPreview) case searchType == "repositories": // Accept header for search repositories based on topics preview endpoint // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeTopicsPreview) case searchType == "issues": // Accept header for search issues based on reactions preview endpoint // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeReactionsPreview) case opts != nil && opts.TextMatch: // Accept header defaults to "application/vnd.github.v3+json" // We change it here to fetch back text-match metadata req.Header.Set("Accept", "application/vnd.github.v3.text-match+json") } return s.client.Do(ctx, req, result) } go-github-38.1.0/github/search_test.go000066400000000000000000000320361410475703100176130ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestSearchService_Repositories(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/search/repositories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "q": "blah", "sort": "forks", "order": "desc", "page": "2", "per_page": "2", }) fmt.Fprint(w, `{"total_count": 4, "incomplete_results": false, "items": [{"id":1},{"id":2}]}`) }) opts := &SearchOptions{Sort: "forks", Order: "desc", ListOptions: ListOptions{Page: 2, PerPage: 2}} ctx := context.Background() result, _, err := client.Search.Repositories(ctx, "blah", opts) if err != nil { t.Errorf("Search.Repositories returned error: %v", err) } want := &RepositoriesSearchResult{ Total: Int(4), IncompleteResults: Bool(false), Repositories: []*Repository{{ID: Int64(1)}, {ID: Int64(2)}}, } if !cmp.Equal(result, want) { t.Errorf("Search.Repositories returned %+v, want %+v", result, want) } } func TestSearchService_Repositories_coverage(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() const methodName = "Repositories" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Search.Repositories(ctx, "\n", nil) return err }) } func TestSearchService_Topics(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/search/topics", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "q": "blah", "page": "2", "per_page": "2", }) fmt.Fprint(w, `{"total_count": 4, "incomplete_results": false, "items": [{"name":"blah"},{"name":"blahblah"}]}`) }) opts := &SearchOptions{ListOptions: ListOptions{Page: 2, PerPage: 2}} ctx := context.Background() result, _, err := client.Search.Topics(ctx, "blah", opts) if err != nil { t.Errorf("Search.Topics returned error: %v", err) } want := &TopicsSearchResult{ Total: Int(4), IncompleteResults: Bool(false), Topics: []*TopicResult{{Name: String("blah")}, {Name: String("blahblah")}}, } if !cmp.Equal(result, want) { t.Errorf("Search.Topics returned %+v, want %+v", result, want) } } func TestSearchService_Topics_coverage(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() const methodName = "Topics" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Search.Topics(ctx, "\n", nil) return err }) } func TestSearchService_Commits(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/search/commits", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "q": "blah", "sort": "author-date", "order": "desc", }) fmt.Fprint(w, `{"total_count": 4, "incomplete_results": false, "items": [{"sha":"random_hash1"},{"sha":"random_hash2"}]}`) }) opts := &SearchOptions{Sort: "author-date", Order: "desc"} ctx := context.Background() result, _, err := client.Search.Commits(ctx, "blah", opts) if err != nil { t.Errorf("Search.Commits returned error: %v", err) } want := &CommitsSearchResult{ Total: Int(4), IncompleteResults: Bool(false), Commits: []*CommitResult{{SHA: String("random_hash1")}, {SHA: String("random_hash2")}}, } if !cmp.Equal(result, want) { t.Errorf("Search.Commits returned %+v, want %+v", result, want) } } func TestSearchService_Commits_coverage(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() const methodName = "Commits" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Search.Commits(ctx, "\n", nil) return err }) } func TestSearchService_Issues(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/search/issues", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "q": "blah", "sort": "forks", "order": "desc", "page": "2", "per_page": "2", }) fmt.Fprint(w, `{"total_count": 4, "incomplete_results": true, "items": [{"number":1},{"number":2}]}`) }) opts := &SearchOptions{Sort: "forks", Order: "desc", ListOptions: ListOptions{Page: 2, PerPage: 2}} ctx := context.Background() result, _, err := client.Search.Issues(ctx, "blah", opts) if err != nil { t.Errorf("Search.Issues returned error: %v", err) } want := &IssuesSearchResult{ Total: Int(4), IncompleteResults: Bool(true), Issues: []*Issue{{Number: Int(1)}, {Number: Int(2)}}, } if !cmp.Equal(result, want) { t.Errorf("Search.Issues returned %+v, want %+v", result, want) } } func TestSearchService_Issues_coverage(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() const methodName = "Issues" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Search.Issues(ctx, "\n", nil) return err }) } func TestSearchService_Issues_withQualifiersNoOpts(t *testing.T) { client, mux, _, teardown := setup() defer teardown() const q = "gopher is:issue label:bug language:c++ pushed:>=2018-01-01 stars:>=200" var requestURI string mux.HandleFunc("/search/issues", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "q": q, }) requestURI = r.RequestURI fmt.Fprint(w, `{"total_count": 4, "incomplete_results": true, "items": [{"number":1},{"number":2}]}`) }) opts := &SearchOptions{} ctx := context.Background() result, _, err := client.Search.Issues(ctx, q, opts) if err != nil { t.Errorf("Search.Issues returned error: %v", err) } if want := "/api-v3/search/issues?q=gopher+is%3Aissue+label%3Abug+language%3Ac%2B%2B+pushed%3A%3E%3D2018-01-01+stars%3A%3E%3D200"; requestURI != want { t.Fatalf("URI encoding failed: got %v, want %v", requestURI, want) } want := &IssuesSearchResult{ Total: Int(4), IncompleteResults: Bool(true), Issues: []*Issue{{Number: Int(1)}, {Number: Int(2)}}, } if !cmp.Equal(result, want) { t.Errorf("Search.Issues returned %+v, want %+v", result, want) } } func TestSearchService_Issues_withQualifiersAndOpts(t *testing.T) { client, mux, _, teardown := setup() defer teardown() const q = "gopher is:issue label:bug language:c++ pushed:>=2018-01-01 stars:>=200" var requestURI string mux.HandleFunc("/search/issues", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "q": q, "sort": "forks", }) requestURI = r.RequestURI fmt.Fprint(w, `{"total_count": 4, "incomplete_results": true, "items": [{"number":1},{"number":2}]}`) }) opts := &SearchOptions{Sort: "forks"} ctx := context.Background() result, _, err := client.Search.Issues(ctx, q, opts) if err != nil { t.Errorf("Search.Issues returned error: %v", err) } if want := "/api-v3/search/issues?q=gopher+is%3Aissue+label%3Abug+language%3Ac%2B%2B+pushed%3A%3E%3D2018-01-01+stars%3A%3E%3D200&sort=forks"; requestURI != want { t.Fatalf("URI encoding failed: got %v, want %v", requestURI, want) } want := &IssuesSearchResult{ Total: Int(4), IncompleteResults: Bool(true), Issues: []*Issue{{Number: Int(1)}, {Number: Int(2)}}, } if !cmp.Equal(result, want) { t.Errorf("Search.Issues returned %+v, want %+v", result, want) } } func TestSearchService_Users(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/search/users", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "q": "blah", "sort": "forks", "order": "desc", "page": "2", "per_page": "2", }) fmt.Fprint(w, `{"total_count": 4, "incomplete_results": false, "items": [{"id":1},{"id":2}]}`) }) opts := &SearchOptions{Sort: "forks", Order: "desc", ListOptions: ListOptions{Page: 2, PerPage: 2}} ctx := context.Background() result, _, err := client.Search.Users(ctx, "blah", opts) if err != nil { t.Errorf("Search.Issues returned error: %v", err) } want := &UsersSearchResult{ Total: Int(4), IncompleteResults: Bool(false), Users: []*User{{ID: Int64(1)}, {ID: Int64(2)}}, } if !cmp.Equal(result, want) { t.Errorf("Search.Users returned %+v, want %+v", result, want) } } func TestSearchService_Users_coverage(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() const methodName = "Users" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Search.Users(ctx, "\n", nil) return err }) } func TestSearchService_Code(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/search/code", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "q": "blah", "sort": "forks", "order": "desc", "page": "2", "per_page": "2", }) fmt.Fprint(w, `{"total_count": 4, "incomplete_results": false, "items": [{"name":"1"},{"name":"2"}]}`) }) opts := &SearchOptions{Sort: "forks", Order: "desc", ListOptions: ListOptions{Page: 2, PerPage: 2}} ctx := context.Background() result, _, err := client.Search.Code(ctx, "blah", opts) if err != nil { t.Errorf("Search.Code returned error: %v", err) } want := &CodeSearchResult{ Total: Int(4), IncompleteResults: Bool(false), CodeResults: []*CodeResult{{Name: String("1")}, {Name: String("2")}}, } if !cmp.Equal(result, want) { t.Errorf("Search.Code returned %+v, want %+v", result, want) } } func TestSearchService_Code_coverage(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() const methodName = "Code" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Search.Code(ctx, "\n", nil) return err }) } func TestSearchService_CodeTextMatch(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/search/code", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") textMatchResponse := ` { "total_count": 1, "incomplete_results": false, "items": [ { "name":"gopher1", "text_matches": [ { "fragment": "I'm afraid my friend what you have found\nIs a gopher who lives to feed", "matches": [ { "text": "gopher", "indices": [ 14, 21 ] } ] } ] } ] } ` fmt.Fprint(w, textMatchResponse) }) opts := &SearchOptions{Sort: "forks", Order: "desc", ListOptions: ListOptions{Page: 2, PerPage: 2}, TextMatch: true} ctx := context.Background() result, _, err := client.Search.Code(ctx, "blah", opts) if err != nil { t.Errorf("Search.Code returned error: %v", err) } wantedCodeResult := &CodeResult{ Name: String("gopher1"), TextMatches: []*TextMatch{{ Fragment: String("I'm afraid my friend what you have found\nIs a gopher who lives to feed"), Matches: []*Match{{Text: String("gopher"), Indices: []int{14, 21}}}, }, }, } want := &CodeSearchResult{ Total: Int(1), IncompleteResults: Bool(false), CodeResults: []*CodeResult{wantedCodeResult}, } if !cmp.Equal(result, want) { t.Errorf("Search.Code returned %+v, want %+v", result, want) } } func TestSearchService_Labels(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/search/labels", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "repository_id": "1234", "q": "blah", "sort": "updated", "order": "desc", "page": "2", "per_page": "2", }) fmt.Fprint(w, `{"total_count": 4, "incomplete_results": false, "items": [{"id": 1234, "name":"bug", "description": "some text"},{"id": 4567, "name":"feature"}]}`) }) opts := &SearchOptions{Sort: "updated", Order: "desc", ListOptions: ListOptions{Page: 2, PerPage: 2}} ctx := context.Background() result, _, err := client.Search.Labels(ctx, 1234, "blah", opts) if err != nil { t.Errorf("Search.Code returned error: %v", err) } want := &LabelsSearchResult{ Total: Int(4), IncompleteResults: Bool(false), Labels: []*LabelResult{ {ID: Int64(1234), Name: String("bug"), Description: String("some text")}, {ID: Int64(4567), Name: String("feature")}, }, } if !cmp.Equal(result, want) { t.Errorf("Search.Labels returned %+v, want %+v", result, want) } } func TestSearchService_Labels_coverage(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() const methodName = "Labels" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Search.Labels(ctx, -1234, "\n", nil) return err }) } go-github-38.1.0/github/strings.go000066400000000000000000000035671410475703100170070ustar00rootroot00000000000000// Copyright 2013 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 ( "bytes" "fmt" "io" "reflect" ) var timestampType = reflect.TypeOf(Timestamp{}) // Stringify attempts to create a reasonable string representation of types in // the GitHub library. It does things like resolve pointers to their values // and omits struct fields with nil values. func Stringify(message interface{}) string { var buf bytes.Buffer v := reflect.ValueOf(message) stringifyValue(&buf, v) return buf.String() } // stringifyValue was heavily inspired by the goprotobuf library. func stringifyValue(w io.Writer, val reflect.Value) { if val.Kind() == reflect.Ptr && val.IsNil() { w.Write([]byte("")) return } v := reflect.Indirect(val) switch v.Kind() { case reflect.String: fmt.Fprintf(w, `"%s"`, v) case reflect.Slice: w.Write([]byte{'['}) for i := 0; i < v.Len(); i++ { if i > 0 { w.Write([]byte{' '}) } stringifyValue(w, v.Index(i)) } w.Write([]byte{']'}) return case reflect.Struct: if v.Type().Name() != "" { w.Write([]byte(v.Type().String())) } // special handling of Timestamp values if v.Type() == timestampType { fmt.Fprintf(w, "{%s}", v.Interface()) return } w.Write([]byte{'{'}) var sep bool for i := 0; i < v.NumField(); i++ { fv := v.Field(i) if fv.Kind() == reflect.Ptr && fv.IsNil() { continue } if fv.Kind() == reflect.Slice && fv.IsNil() { continue } if fv.Kind() == reflect.Map && fv.IsNil() { continue } if sep { w.Write([]byte(", ")) } else { sep = true } w.Write([]byte(v.Type().Field(i).Name)) w.Write([]byte{':'}) stringifyValue(w, fv) } w.Write([]byte{'}'}) default: if v.CanInterface() { fmt.Fprint(w, v.Interface()) } } } go-github-38.1.0/github/strings_test.go000066400000000000000000000112431410475703100200340ustar00rootroot00000000000000// Copyright 2013 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" "testing" "time" ) func TestStringify(t *testing.T) { var nilPointer *string var tests = []struct { in interface{} out string }{ // basic types {"foo", `"foo"`}, {123, `123`}, {1.5, `1.5`}, {false, `false`}, { []string{"a", "b"}, `["a" "b"]`, }, { struct { A []string }{nil}, // nil slice is skipped `{}`, }, { struct { A string }{"foo"}, // structs not of a named type get no prefix `{A:"foo"}`, }, // pointers {nilPointer, ``}, {String("foo"), `"foo"`}, {Int(123), `123`}, {Bool(false), `false`}, { []*string{String("a"), String("b")}, `["a" "b"]`, }, // actual GitHub structs { Timestamp{time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)}, `github.Timestamp{2006-01-02 15:04:05 +0000 UTC}`, }, { &Timestamp{time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)}, `github.Timestamp{2006-01-02 15:04:05 +0000 UTC}`, }, { User{ID: Int64(123), Name: String("n")}, `github.User{ID:123, Name:"n"}`, }, { Repository{Owner: &User{ID: Int64(123)}}, `github.Repository{Owner:github.User{ID:123}}`, }, } for i, tt := range tests { s := Stringify(tt.in) if s != tt.out { t.Errorf("%d. Stringify(%q) => %q, want %q", i, tt.in, s, tt.out) } } } // Directly test the String() methods on various GitHub types. We don't do an // exaustive test of all the various field types, since TestStringify() above // takes care of that. Rather, we just make sure that Stringify() is being // used to build the strings, which we do by verifying that pointers are // stringified as their underlying value. func TestString(t *testing.T) { var tests = []struct { in interface{} out string }{ {CodeResult{Name: String("n")}, `github.CodeResult{Name:"n"}`}, {CommitAuthor{Name: String("n")}, `github.CommitAuthor{Name:"n"}`}, {CommitFile{SHA: String("s")}, `github.CommitFile{SHA:"s"}`}, {CommitStats{Total: Int(1)}, `github.CommitStats{Total:1}`}, {CommitsComparison{TotalCommits: Int(1)}, `github.CommitsComparison{TotalCommits:1}`}, {Commit{SHA: String("s")}, `github.Commit{SHA:"s"}`}, {Event{ID: String("1")}, `github.Event{ID:"1"}`}, {GistComment{ID: Int64(1)}, `github.GistComment{ID:1}`}, {GistFile{Size: Int(1)}, `github.GistFile{Size:1}`}, {Gist{ID: String("1")}, `github.Gist{ID:"1"}`}, {GitObject{SHA: String("s")}, `github.GitObject{SHA:"s"}`}, {Gitignore{Name: String("n")}, `github.Gitignore{Name:"n"}`}, {Hook{ID: Int64(1)}, `github.Hook{ID:1}`}, {IssueComment{ID: Int64(1)}, `github.IssueComment{ID:1}`}, {Issue{Number: Int(1)}, `github.Issue{Number:1}`}, {Key{ID: Int64(1)}, `github.Key{ID:1}`}, {Label{ID: Int64(1), Name: String("l")}, `github.Label{ID:1, Name:"l"}`}, {Organization{ID: Int64(1)}, `github.Organization{ID:1}`}, {PullRequestComment{ID: Int64(1)}, `github.PullRequestComment{ID:1}`}, {PullRequest{Number: Int(1)}, `github.PullRequest{Number:1}`}, {PullRequestReview{ID: Int64(1)}, `github.PullRequestReview{ID:1}`}, {DraftReviewComment{Position: Int(1)}, `github.DraftReviewComment{Position:1}`}, {PullRequestReviewRequest{Body: String("r")}, `github.PullRequestReviewRequest{Body:"r"}`}, {PullRequestReviewDismissalRequest{Message: String("r")}, `github.PullRequestReviewDismissalRequest{Message:"r"}`}, {HeadCommit{SHA: String("s")}, `github.HeadCommit{SHA:"s"}`}, {PushEvent{PushID: Int64(1)}, `github.PushEvent{PushID:1}`}, {Reference{Ref: String("r")}, `github.Reference{Ref:"r"}`}, {ReleaseAsset{ID: Int64(1)}, `github.ReleaseAsset{ID:1}`}, {RepoStatus{ID: Int64(1)}, `github.RepoStatus{ID:1}`}, {RepositoryComment{ID: Int64(1)}, `github.RepositoryComment{ID:1}`}, {RepositoryCommit{SHA: String("s")}, `github.RepositoryCommit{SHA:"s"}`}, {RepositoryContent{Name: String("n")}, `github.RepositoryContent{Name:"n"}`}, {RepositoryRelease{ID: Int64(1)}, `github.RepositoryRelease{ID:1}`}, {Repository{ID: Int64(1)}, `github.Repository{ID:1}`}, {Team{ID: Int64(1)}, `github.Team{ID:1}`}, {TreeEntry{SHA: String("s")}, `github.TreeEntry{SHA:"s"}`}, {Tree{SHA: String("s")}, `github.Tree{SHA:"s"}`}, {User{ID: Int64(1)}, `github.User{ID:1}`}, {WebHookAuthor{Name: String("n")}, `github.WebHookAuthor{Name:"n"}`}, {WebHookCommit{ID: String("1")}, `github.WebHookCommit{ID:"1"}`}, {WebHookPayload{Ref: String("r")}, `github.WebHookPayload{Ref:"r"}`}, } for i, tt := range tests { s := tt.in.(fmt.Stringer).String() if s != tt.out { t.Errorf("%d. String() => %q, want %q", i, tt.in, tt.out) } } } go-github-38.1.0/github/teams.go000066400000000000000000000745031410475703100164250ustar00rootroot00000000000000// Copyright 2018 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 ( "context" "fmt" "net/http" "strings" "time" ) // TeamsService provides access to the team-related functions // in the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/ type TeamsService service // Team represents a team within a GitHub organization. Teams are used to // manage access to an organization's repositories. type Team struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Name *string `json:"name,omitempty"` Description *string `json:"description,omitempty"` URL *string `json:"url,omitempty"` Slug *string `json:"slug,omitempty"` // Permission specifies the default permission for repositories owned by the team. Permission *string `json:"permission,omitempty"` // Permissions identifies the permissions that a team has on a given // repository. This is only populated when calling Repositories.ListTeams. Permissions map[string]bool `json:"permissions,omitempty"` // Privacy identifies the level of privacy this team should have. // Possible values are: // secret - only visible to organization owners and members of this team // closed - visible to all members of this organization // Default is "secret". Privacy *string `json:"privacy,omitempty"` MembersCount *int `json:"members_count,omitempty"` ReposCount *int `json:"repos_count,omitempty"` Organization *Organization `json:"organization,omitempty"` MembersURL *string `json:"members_url,omitempty"` RepositoriesURL *string `json:"repositories_url,omitempty"` Parent *Team `json:"parent,omitempty"` // LDAPDN is only available in GitHub Enterprise and when the team // membership is synchronized with LDAP. LDAPDN *string `json:"ldap_dn,omitempty"` } func (t Team) String() string { return Stringify(t) } // Invitation represents a team member's invitation status. type Invitation struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Login *string `json:"login,omitempty"` Email *string `json:"email,omitempty"` // Role can be one of the values - 'direct_member', 'admin', 'billing_manager', 'hiring_manager', or 'reinstate'. Role *string `json:"role,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` Inviter *User `json:"inviter,omitempty"` TeamCount *int `json:"team_count,omitempty"` InvitationTeamURL *string `json:"invitation_team_url,omitempty"` FailedAt *Timestamp `json:"failed_at,omitempty"` FailedReason *string `json:"failed_reason,omitempty"` } func (i Invitation) String() string { return Stringify(i) } // ListTeams lists all of the teams for an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-teams func (s *TeamsService) ListTeams(ctx context.Context, org string, opts *ListOptions) ([]*Team, *Response, error) { u := fmt.Sprintf("orgs/%v/teams", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var teams []*Team resp, err := s.client.Do(ctx, req, &teams) if err != nil { return nil, resp, err } return teams, resp, nil } // GetTeamByID fetches a team, given a specified organization ID, by ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#get-a-team-by-name func (s *TeamsService) GetTeamByID(ctx context.Context, orgID, teamID int64) (*Team, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v", orgID, teamID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } t := new(Team) resp, err := s.client.Do(ctx, req, t) if err != nil { return nil, resp, err } return t, resp, nil } // GetTeamBySlug fetches a team, given a specified organization name, by slug. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#get-a-team-by-name func (s *TeamsService) GetTeamBySlug(ctx context.Context, org, slug string) (*Team, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v", org, slug) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } t := new(Team) resp, err := s.client.Do(ctx, req, t) if err != nil { return nil, resp, err } return t, resp, nil } // NewTeam represents a team to be created or modified. type NewTeam struct { Name string `json:"name"` // Name of the team. (Required.) Description *string `json:"description,omitempty"` Maintainers []string `json:"maintainers,omitempty"` RepoNames []string `json:"repo_names,omitempty"` ParentTeamID *int64 `json:"parent_team_id,omitempty"` // Deprecated: Permission is deprecated when creating or editing a team in an org // using the new GitHub permission model. It no longer identifies the // permission a team has on its repos, but only specifies the default // permission a repo is initially added with. Avoid confusion by // specifying a permission value when calling AddTeamRepo. Permission *string `json:"permission,omitempty"` // Privacy identifies the level of privacy this team should have. // Possible values are: // secret - only visible to organization owners and members of this team // closed - visible to all members of this organization // Default is "secret". Privacy *string `json:"privacy,omitempty"` // LDAPDN may be used in GitHub Enterprise when the team membership // is synchronized with LDAP. LDAPDN *string `json:"ldap_dn,omitempty"` } func (s NewTeam) String() string { return Stringify(s) } // CreateTeam creates a new team within an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#create-a-team func (s *TeamsService) CreateTeam(ctx context.Context, org string, team NewTeam) (*Team, *Response, error) { u := fmt.Sprintf("orgs/%v/teams", org) req, err := s.client.NewRequest("POST", u, team) if err != nil { return nil, nil, err } t := new(Team) resp, err := s.client.Do(ctx, req, t) if err != nil { return nil, resp, err } return t, resp, nil } // newTeamNoParent is the same as NewTeam but ensures that the // "parent_team_id" field will be null. It is for internal use // only and should not be exported. type newTeamNoParent struct { Name string `json:"name"` Description *string `json:"description,omitempty"` Maintainers []string `json:"maintainers,omitempty"` RepoNames []string `json:"repo_names,omitempty"` ParentTeamID *int64 `json:"parent_team_id"` // This will be "null" Privacy *string `json:"privacy,omitempty"` LDAPDN *string `json:"ldap_dn,omitempty"` } // copyNewTeamWithoutParent is used to set the "parent_team_id" // field to "null" after copying the other fields from a NewTeam. // It is for internal use only and should not be exported. func copyNewTeamWithoutParent(team *NewTeam) *newTeamNoParent { return &newTeamNoParent{ Name: team.Name, Description: team.Description, Maintainers: team.Maintainers, RepoNames: team.RepoNames, Privacy: team.Privacy, LDAPDN: team.LDAPDN, } } // EditTeamByID edits a team, given an organization ID, selected by ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#update-a-team func (s *TeamsService) EditTeamByID(ctx context.Context, orgID, teamID int64, team NewTeam, removeParent bool) (*Team, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v", orgID, teamID) var req *http.Request var err error if removeParent { teamRemoveParent := copyNewTeamWithoutParent(&team) req, err = s.client.NewRequest("PATCH", u, teamRemoveParent) } else { req, err = s.client.NewRequest("PATCH", u, team) } if err != nil { return nil, nil, err } t := new(Team) resp, err := s.client.Do(ctx, req, t) if err != nil { return nil, resp, err } return t, resp, nil } // EditTeamBySlug edits a team, given an organization name, by slug. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#update-a-team func (s *TeamsService) EditTeamBySlug(ctx context.Context, org, slug string, team NewTeam, removeParent bool) (*Team, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v", org, slug) var req *http.Request var err error if removeParent { teamRemoveParent := copyNewTeamWithoutParent(&team) req, err = s.client.NewRequest("PATCH", u, teamRemoveParent) } else { req, err = s.client.NewRequest("PATCH", u, team) } if err != nil { return nil, nil, err } t := new(Team) resp, err := s.client.Do(ctx, req, t) if err != nil { return nil, resp, err } return t, resp, nil } // DeleteTeamByID deletes a team referenced by ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#delete-a-team func (s *TeamsService) DeleteTeamByID(ctx context.Context, orgID, teamID int64) (*Response, error) { u := fmt.Sprintf("organizations/%v/team/%v", orgID, teamID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DeleteTeamBySlug deletes a team reference by slug. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#delete-a-team func (s *TeamsService) DeleteTeamBySlug(ctx context.Context, org, slug string) (*Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v", org, slug) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListChildTeamsByParentID lists child teams for a parent team given parent ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-child-teams func (s *TeamsService) ListChildTeamsByParentID(ctx context.Context, orgID, teamID int64, opts *ListOptions) ([]*Team, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/teams", orgID, teamID) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var teams []*Team resp, err := s.client.Do(ctx, req, &teams) if err != nil { return nil, resp, err } return teams, resp, nil } // ListChildTeamsByParentSlug lists child teams for a parent team given parent slug. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-child-teams func (s *TeamsService) ListChildTeamsByParentSlug(ctx context.Context, org, slug string, opts *ListOptions) ([]*Team, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/teams", org, slug) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var teams []*Team resp, err := s.client.Do(ctx, req, &teams) if err != nil { return nil, resp, err } return teams, resp, nil } // ListTeamReposByID lists the repositories given a team ID that the specified team has access to. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-team-repositories func (s *TeamsService) ListTeamReposByID(ctx context.Context, orgID, teamID int64, opts *ListOptions) ([]*Repository, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/repos", orgID, teamID) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when topics API fully launches. headers := []string{mediaTypeTopicsPreview} req.Header.Set("Accept", strings.Join(headers, ", ")) var repos []*Repository resp, err := s.client.Do(ctx, req, &repos) if err != nil { return nil, resp, err } return repos, resp, nil } // ListTeamReposBySlug lists the repositories given a team slug that the specified team has access to. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-team-repositories func (s *TeamsService) ListTeamReposBySlug(ctx context.Context, org, slug string, opts *ListOptions) ([]*Repository, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/repos", org, slug) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when topics API fully launches. headers := []string{mediaTypeTopicsPreview} req.Header.Set("Accept", strings.Join(headers, ", ")) var repos []*Repository resp, err := s.client.Do(ctx, req, &repos) if err != nil { return nil, resp, err } return repos, resp, nil } // IsTeamRepoByID checks if a team, given its ID, manages the specified repository. If the // repository is managed by team, a Repository is returned which includes the // permissions team has for that repo. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#check-team-permissions-for-a-repository func (s *TeamsService) IsTeamRepoByID(ctx context.Context, orgID, teamID int64, owner, repo string) (*Repository, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/repos/%v/%v", orgID, teamID, owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } headers := []string{mediaTypeOrgPermissionRepo} req.Header.Set("Accept", strings.Join(headers, ", ")) repository := new(Repository) resp, err := s.client.Do(ctx, req, repository) if err != nil { return nil, resp, err } return repository, resp, nil } // IsTeamRepoBySlug checks if a team, given its slug, manages the specified repository. If the // repository is managed by team, a Repository is returned which includes the // permissions team has for that repo. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#check-team-permissions-for-a-repository func (s *TeamsService) IsTeamRepoBySlug(ctx context.Context, org, slug, owner, repo string) (*Repository, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/repos/%v/%v", org, slug, owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } headers := []string{mediaTypeOrgPermissionRepo} req.Header.Set("Accept", strings.Join(headers, ", ")) repository := new(Repository) resp, err := s.client.Do(ctx, req, repository) if err != nil { return nil, resp, err } return repository, resp, nil } // TeamAddTeamRepoOptions specifies the optional parameters to the // TeamsService.AddTeamRepo method. type TeamAddTeamRepoOptions struct { // Permission specifies the permission to grant the team on this repository. // Possible values are: // pull - team members can pull, but not push to or administer this repository // push - team members can pull and push, but not administer this repository // admin - team members can pull, push and administer this repository // maintain - team members can manage the repository without access to sensitive or destructive actions. // triage - team members can proactively manage issues and pull requests without write access. // // If not specified, the team's permission attribute will be used. Permission string `json:"permission,omitempty"` } // AddTeamRepoByID adds a repository to be managed by the specified team given the team ID. // The specified repository must be owned by the organization to which the team // belongs, or a direct fork of a repository owned by the organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#add-or-update-team-repository-permissions func (s *TeamsService) AddTeamRepoByID(ctx context.Context, orgID, teamID int64, owner, repo string, opts *TeamAddTeamRepoOptions) (*Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/repos/%v/%v", orgID, teamID, owner, repo) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // AddTeamRepoBySlug adds a repository to be managed by the specified team given the team slug. // The specified repository must be owned by the organization to which the team // belongs, or a direct fork of a repository owned by the organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#add-or-update-team-repository-permissions func (s *TeamsService) AddTeamRepoBySlug(ctx context.Context, org, slug, owner, repo string, opts *TeamAddTeamRepoOptions) (*Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/repos/%v/%v", org, slug, owner, repo) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // RemoveTeamRepoByID removes a repository from being managed by the specified // team given the team ID. Note that this does not delete the repository, it // just removes it from the team. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#remove-a-repository-from-a-team func (s *TeamsService) RemoveTeamRepoByID(ctx context.Context, orgID, teamID int64, owner, repo string) (*Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/repos/%v/%v", orgID, teamID, owner, repo) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // RemoveTeamRepoBySlug removes a repository from being managed by the specified // team given the team slug. Note that this does not delete the repository, it // just removes it from the team. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#remove-a-repository-from-a-team func (s *TeamsService) RemoveTeamRepoBySlug(ctx context.Context, org, slug, owner, repo string) (*Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/repos/%v/%v", org, slug, owner, repo) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListUserTeams lists a user's teams // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-teams-for-the-authenticated-user func (s *TeamsService) ListUserTeams(ctx context.Context, opts *ListOptions) ([]*Team, *Response, error) { u := "user/teams" u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var teams []*Team resp, err := s.client.Do(ctx, req, &teams) if err != nil { return nil, resp, err } return teams, resp, nil } // ListTeamProjectsByID lists the organization projects for a team given the team ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-team-projects func (s *TeamsService) ListTeamProjectsByID(ctx context.Context, orgID, teamID int64) ([]*Project, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/projects", orgID, teamID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. acceptHeaders := []string{mediaTypeProjectsPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) var projects []*Project resp, err := s.client.Do(ctx, req, &projects) if err != nil { return nil, resp, err } return projects, resp, nil } // ListTeamProjectsBySlug lists the organization projects for a team given the team slug. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-team-projects func (s *TeamsService) ListTeamProjectsBySlug(ctx context.Context, org, slug string) ([]*Project, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/projects", org, slug) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. acceptHeaders := []string{mediaTypeProjectsPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) var projects []*Project resp, err := s.client.Do(ctx, req, &projects) if err != nil { return nil, resp, err } return projects, resp, nil } // ReviewTeamProjectsByID checks whether a team, given its ID, has read, write, or admin // permissions for an organization project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#check-team-permissions-for-a-project func (s *TeamsService) ReviewTeamProjectsByID(ctx context.Context, orgID, teamID, projectID int64) (*Project, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/projects/%v", orgID, teamID, projectID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. acceptHeaders := []string{mediaTypeProjectsPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) projects := &Project{} resp, err := s.client.Do(ctx, req, &projects) if err != nil { return nil, resp, err } return projects, resp, nil } // ReviewTeamProjectsBySlug checks whether a team, given its slug, has read, write, or admin // permissions for an organization project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#check-team-permissions-for-a-project func (s *TeamsService) ReviewTeamProjectsBySlug(ctx context.Context, org, slug string, projectID int64) (*Project, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/projects/%v", org, slug, projectID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. acceptHeaders := []string{mediaTypeProjectsPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) projects := &Project{} resp, err := s.client.Do(ctx, req, &projects) if err != nil { return nil, resp, err } return projects, resp, nil } // TeamProjectOptions specifies the optional parameters to the // TeamsService.AddTeamProject method. type TeamProjectOptions struct { // Permission specifies the permission to grant to the team for this project. // Possible values are: // "read" - team members can read, but not write to or administer this project. // "write" - team members can read and write, but not administer this project. // "admin" - team members can read, write and administer this project. // Permission *string `json:"permission,omitempty"` } // AddTeamProjectByID adds an organization project to a team given the team ID. // To add a project to a team or update the team's permission on a project, the // authenticated user must have admin permissions for the project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#add-or-update-team-project-permissions func (s *TeamsService) AddTeamProjectByID(ctx context.Context, orgID, teamID, projectID int64, opts *TeamProjectOptions) (*Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/projects/%v", orgID, teamID, projectID) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. acceptHeaders := []string{mediaTypeProjectsPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) return s.client.Do(ctx, req, nil) } // AddTeamProjectBySlug adds an organization project to a team given the team slug. // To add a project to a team or update the team's permission on a project, the // authenticated user must have admin permissions for the project. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#add-or-update-team-project-permissions func (s *TeamsService) AddTeamProjectBySlug(ctx context.Context, org, slug string, projectID int64, opts *TeamProjectOptions) (*Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/projects/%v", org, slug, projectID) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. acceptHeaders := []string{mediaTypeProjectsPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) return s.client.Do(ctx, req, nil) } // RemoveTeamProjectByID removes an organization project from a team given team ID. // An organization owner or a team maintainer can remove any project from the team. // To remove a project from a team as an organization member, the authenticated user // must have "read" access to both the team and project, or "admin" access to the team // or project. // Note: This endpoint removes the project from the team, but does not delete it. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#remove-a-project-from-a-team func (s *TeamsService) RemoveTeamProjectByID(ctx context.Context, orgID, teamID, projectID int64) (*Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/projects/%v", orgID, teamID, projectID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. acceptHeaders := []string{mediaTypeProjectsPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) return s.client.Do(ctx, req, nil) } // RemoveTeamProjectBySlug removes an organization project from a team given team slug. // An organization owner or a team maintainer can remove any project from the team. // To remove a project from a team as an organization member, the authenticated user // must have "read" access to both the team and project, or "admin" access to the team // or project. // Note: This endpoint removes the project from the team, but does not delete it. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#remove-a-project-from-a-team func (s *TeamsService) RemoveTeamProjectBySlug(ctx context.Context, org, slug string, projectID int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/projects/%v", org, slug, projectID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. acceptHeaders := []string{mediaTypeProjectsPreview} req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) return s.client.Do(ctx, req, nil) } // IDPGroupList represents a list of external identity provider (IDP) groups. type IDPGroupList struct { Groups []*IDPGroup `json:"groups"` } // IDPGroup represents an external identity provider (IDP) group. type IDPGroup struct { GroupID *string `json:"group_id,omitempty"` GroupName *string `json:"group_name,omitempty"` GroupDescription *string `json:"group_description,omitempty"` } // ListIDPGroupsInOrganization lists IDP groups available in an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-idp-groups-for-an-organization func (s *TeamsService) ListIDPGroupsInOrganization(ctx context.Context, org string, opts *ListCursorOptions) (*IDPGroupList, *Response, error) { u := fmt.Sprintf("orgs/%v/team-sync/groups", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } groups := new(IDPGroupList) resp, err := s.client.Do(ctx, req, groups) if err != nil { return nil, resp, err } return groups, resp, nil } // ListIDPGroupsForTeamByID lists IDP groups connected to a team on GitHub // given organization and team IDs. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-idp-groups-for-a-team func (s *TeamsService) ListIDPGroupsForTeamByID(ctx context.Context, orgID, teamID int64) (*IDPGroupList, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/team-sync/group-mappings", orgID, teamID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } groups := new(IDPGroupList) resp, err := s.client.Do(ctx, req, groups) if err != nil { return nil, resp, err } return groups, resp, err } // ListIDPGroupsForTeamBySlug lists IDP groups connected to a team on GitHub // given organization name and team slug. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-idp-groups-for-a-team func (s *TeamsService) ListIDPGroupsForTeamBySlug(ctx context.Context, org, slug string) (*IDPGroupList, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/team-sync/group-mappings", org, slug) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } groups := new(IDPGroupList) resp, err := s.client.Do(ctx, req, groups) if err != nil { return nil, resp, err } return groups, resp, err } // CreateOrUpdateIDPGroupConnectionsByID creates, updates, or removes a connection // between a team and an IDP group given organization and team IDs. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#create-or-update-idp-group-connections func (s *TeamsService) CreateOrUpdateIDPGroupConnectionsByID(ctx context.Context, orgID, teamID int64, opts IDPGroupList) (*IDPGroupList, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/team-sync/group-mappings", orgID, teamID) req, err := s.client.NewRequest("PATCH", u, opts) if err != nil { return nil, nil, err } groups := new(IDPGroupList) resp, err := s.client.Do(ctx, req, groups) if err != nil { return nil, resp, err } return groups, resp, nil } // CreateOrUpdateIDPGroupConnectionsBySlug creates, updates, or removes a connection // between a team and an IDP group given organization name and team slug. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#create-or-update-idp-group-connections func (s *TeamsService) CreateOrUpdateIDPGroupConnectionsBySlug(ctx context.Context, org, slug string, opts IDPGroupList) (*IDPGroupList, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/team-sync/group-mappings", org, slug) req, err := s.client.NewRequest("PATCH", u, opts) if err != nil { return nil, nil, err } groups := new(IDPGroupList) resp, err := s.client.Do(ctx, req, groups) if err != nil { return nil, resp, err } return groups, resp, nil } go-github-38.1.0/github/teams_discussion_comments.go000066400000000000000000000222621410475703100225700ustar00rootroot00000000000000// Copyright 2018 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 ( "context" "fmt" ) // DiscussionComment represents a GitHub dicussion in a team. type DiscussionComment struct { Author *User `json:"author,omitempty"` Body *string `json:"body,omitempty"` BodyHTML *string `json:"body_html,omitempty"` BodyVersion *string `json:"body_version,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` LastEditedAt *Timestamp `json:"last_edited_at,omitempty"` DiscussionURL *string `json:"discussion_url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` NodeID *string `json:"node_id,omitempty"` Number *int `json:"number,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` URL *string `json:"url,omitempty"` Reactions *Reactions `json:"reactions,omitempty"` } func (c DiscussionComment) String() string { return Stringify(c) } // DiscussionCommentListOptions specifies optional parameters to the // TeamServices.ListComments method. type DiscussionCommentListOptions struct { // Sorts the discussion comments by the date they were created. // Accepted values are asc and desc. Default is desc. Direction string `url:"direction,omitempty"` ListOptions } // ListCommentsByID lists all comments on a team discussion by team ID. // Authenticated user must grant read:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-discussion-comments func (s *TeamsService) ListCommentsByID(ctx context.Context, orgID, teamID int64, discussionNumber int, options *DiscussionCommentListOptions) ([]*DiscussionComment, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments", orgID, teamID, discussionNumber) u, err := addOptions(u, options) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var comments []*DiscussionComment resp, err := s.client.Do(ctx, req, &comments) if err != nil { return nil, resp, err } return comments, resp, nil } // ListCommentsBySlug lists all comments on a team discussion by team slug. // Authenticated user must grant read:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-discussion-comments func (s *TeamsService) ListCommentsBySlug(ctx context.Context, org, slug string, discussionNumber int, options *DiscussionCommentListOptions) ([]*DiscussionComment, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments", org, slug, discussionNumber) u, err := addOptions(u, options) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var comments []*DiscussionComment resp, err := s.client.Do(ctx, req, &comments) if err != nil { return nil, resp, err } return comments, resp, nil } // GetCommentByID gets a specific comment on a team discussion by team ID. // Authenticated user must grant read:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#get-a-discussion-comment func (s *TeamsService) GetCommentByID(ctx context.Context, orgID, teamID int64, discussionNumber, commentNumber int) (*DiscussionComment, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments/%v", orgID, teamID, discussionNumber, commentNumber) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } discussionComment := &DiscussionComment{} resp, err := s.client.Do(ctx, req, discussionComment) if err != nil { return nil, resp, err } return discussionComment, resp, nil } // GetCommentBySlug gets a specific comment on a team discussion by team slug. // Authenticated user must grant read:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#get-a-discussion-comment func (s *TeamsService) GetCommentBySlug(ctx context.Context, org, slug string, discussionNumber, commentNumber int) (*DiscussionComment, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments/%v", org, slug, discussionNumber, commentNumber) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } discussionComment := &DiscussionComment{} resp, err := s.client.Do(ctx, req, discussionComment) if err != nil { return nil, resp, err } return discussionComment, resp, nil } // CreateCommentByID creates a new comment on a team discussion by team ID. // Authenticated user must grant write:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#create-a-discussion-comment func (s *TeamsService) CreateCommentByID(ctx context.Context, orgID, teamID int64, discsusionNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments", orgID, teamID, discsusionNumber) req, err := s.client.NewRequest("POST", u, comment) if err != nil { return nil, nil, err } discussionComment := &DiscussionComment{} resp, err := s.client.Do(ctx, req, discussionComment) if err != nil { return nil, resp, err } return discussionComment, resp, nil } // CreateCommentBySlug creates a new comment on a team discussion by team slug. // Authenticated user must grant write:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#create-a-discussion-comment func (s *TeamsService) CreateCommentBySlug(ctx context.Context, org, slug string, discsusionNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments", org, slug, discsusionNumber) req, err := s.client.NewRequest("POST", u, comment) if err != nil { return nil, nil, err } discussionComment := &DiscussionComment{} resp, err := s.client.Do(ctx, req, discussionComment) if err != nil { return nil, resp, err } return discussionComment, resp, nil } // EditCommentByID edits the body text of a discussion comment by team ID. // Authenticated user must grant write:discussion scope. // User is allowed to edit body of a comment only. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#update-a-discussion-comment func (s *TeamsService) EditCommentByID(ctx context.Context, orgID, teamID int64, discussionNumber, commentNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments/%v", orgID, teamID, discussionNumber, commentNumber) req, err := s.client.NewRequest("PATCH", u, comment) if err != nil { return nil, nil, err } discussionComment := &DiscussionComment{} resp, err := s.client.Do(ctx, req, discussionComment) if err != nil { return nil, resp, err } return discussionComment, resp, nil } // EditCommentBySlug edits the body text of a discussion comment by team slug. // Authenticated user must grant write:discussion scope. // User is allowed to edit body of a comment only. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#update-a-discussion-comment func (s *TeamsService) EditCommentBySlug(ctx context.Context, org, slug string, discussionNumber, commentNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments/%v", org, slug, discussionNumber, commentNumber) req, err := s.client.NewRequest("PATCH", u, comment) if err != nil { return nil, nil, err } discussionComment := &DiscussionComment{} resp, err := s.client.Do(ctx, req, discussionComment) if err != nil { return nil, resp, err } return discussionComment, resp, nil } // DeleteCommentByID deletes a comment on a team discussion by team ID. // Authenticated user must grant write:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#delete-a-discussion-comment func (s *TeamsService) DeleteCommentByID(ctx context.Context, orgID, teamID int64, discussionNumber, commentNumber int) (*Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments/%v", orgID, teamID, discussionNumber, commentNumber) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DeleteCommentBySlug deletes a comment on a team discussion by team slug. // Authenticated user must grant write:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#delete-a-discussion-comment func (s *TeamsService) DeleteCommentBySlug(ctx context.Context, org, slug string, discussionNumber, commentNumber int) (*Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments/%v", org, slug, discussionNumber, commentNumber) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/teams_discussion_comments_test.go000066400000000000000000000333661410475703100236360ustar00rootroot00000000000000// Copyright 2018 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) // "Team Discussion Comments" endpoint, when using a teamID. func tdcEndpointByID(orgID, teamID, discussionNumber, commentNumber string) string { out := fmt.Sprintf("/organizations/%v/team/%v/discussions/%v/comments", orgID, teamID, discussionNumber) if commentNumber != "" { return fmt.Sprintf("%v/%v", out, commentNumber) } return out } // "Team Discussion Comments" endpoint, when using a team slug. func tdcEndpointBySlug(org, slug, dicsuccionsNumber, commentNumber string) string { out := fmt.Sprintf("/orgs/%v/teams/%v/discussions/%v/comments", org, slug, dicsuccionsNumber) if commentNumber != "" { return fmt.Sprintf("%v/%v", out, commentNumber) } return out } func TestTeamsService_ListComments(t *testing.T) { client, mux, _, teardown := setup() defer teardown() handleFunc := func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "direction": "desc", }) fmt.Fprintf(w, `[ { "author": { "login": "author", "id": 0, "avatar_url": "https://avatars1.githubusercontent.com/u/0?v=4", "gravatar_id": "", "url": "https://api.github.com/users/author", "html_url": "https://github.com/author", "followers_url": "https://api.github.com/users/author/followers", "following_url": "https://api.github.com/users/author/following{/other_user}", "gists_url": "https://api.github.com/users/author/gists{/gist_id}", "starred_url": "https://api.github.com/users/author/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/author/subscriptions", "organizations_url": "https://api.github.com/users/author/orgs", "repos_url": "https://api.github.com/users/author/repos", "events_url": "https://api.github.com/users/author/events{/privacy}", "received_events_url": "https://api.github.com/users/author/received_events", "type": "User", "site_admin": false }, "body": "comment", "body_html": "

comment

", "body_version": "version", "created_at": "2018-01-01T00:00:00Z", "last_edited_at": null, "discussion_url": "https://api.github.com/teams/2/discussions/3", "html_url": "https://github.com/orgs/1/teams/2/discussions/3/comments/4", "node_id": "node", "number": 4, "updated_at": "2018-01-01T00:00:00Z", "url": "https://api.github.com/teams/2/discussions/3/comments/4" } ]`) } want := []*DiscussionComment{ { Author: &User{ Login: String("author"), ID: Int64(0), AvatarURL: String("https://avatars1.githubusercontent.com/u/0?v=4"), GravatarID: String(""), URL: String("https://api.github.com/users/author"), HTMLURL: String("https://github.com/author"), FollowersURL: String("https://api.github.com/users/author/followers"), FollowingURL: String("https://api.github.com/users/author/following{/other_user}"), GistsURL: String("https://api.github.com/users/author/gists{/gist_id}"), StarredURL: String("https://api.github.com/users/author/starred{/owner}{/repo}"), SubscriptionsURL: String("https://api.github.com/users/author/subscriptions"), OrganizationsURL: String("https://api.github.com/users/author/orgs"), ReposURL: String("https://api.github.com/users/author/repos"), EventsURL: String("https://api.github.com/users/author/events{/privacy}"), ReceivedEventsURL: String("https://api.github.com/users/author/received_events"), Type: String("User"), SiteAdmin: Bool(false), }, Body: String("comment"), BodyHTML: String("

comment

"), BodyVersion: String("version"), CreatedAt: &Timestamp{time.Date(2018, time.January, 1, 0, 0, 0, 0, time.UTC)}, LastEditedAt: nil, DiscussionURL: String("https://api.github.com/teams/2/discussions/3"), HTMLURL: String("https://github.com/orgs/1/teams/2/discussions/3/comments/4"), NodeID: String("node"), Number: Int(4), UpdatedAt: &Timestamp{time.Date(2018, time.January, 1, 0, 0, 0, 0, time.UTC)}, URL: String("https://api.github.com/teams/2/discussions/3/comments/4"), }, } e := tdcEndpointByID("1", "2", "3", "") mux.HandleFunc(e, handleFunc) ctx := context.Background() commentsByID, _, err := client.Teams.ListCommentsByID(ctx, 1, 2, 3, &DiscussionCommentListOptions{Direction: "desc"}) if err != nil { t.Errorf("Teams.ListCommentsByID returned error: %v", err) } if !cmp.Equal(commentsByID, want) { t.Errorf("Teams.ListCommentsByID returned %+v, want %+v", commentsByID, want) } e = tdcEndpointBySlug("a", "b", "3", "") mux.HandleFunc(e, handleFunc) commentsBySlug, _, err := client.Teams.ListCommentsBySlug(ctx, "a", "b", 3, &DiscussionCommentListOptions{Direction: "desc"}) if err != nil { t.Errorf("Teams.ListCommentsBySlug returned error: %v", err) } if !cmp.Equal(commentsBySlug, want) { t.Errorf("Teams.ListCommentsBySlug returned %+v, want %+v", commentsBySlug, want) } methodName := "ListCommentsByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListCommentsByID(ctx, -1, -2, -3, &DiscussionCommentListOptions{Direction: "desc"}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListCommentsByID(ctx, 1, 2, 3, &DiscussionCommentListOptions{Direction: "desc"}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) methodName = "ListCommentsBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListCommentsBySlug(ctx, "a\na", "b\nb", -3, &DiscussionCommentListOptions{Direction: "desc"}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListCommentsBySlug(ctx, "a", "b", 3, &DiscussionCommentListOptions{Direction: "desc"}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_GetComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() handlerFunc := func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"number":4}`) } want := &DiscussionComment{Number: Int(4)} e := tdcEndpointByID("1", "2", "3", "4") mux.HandleFunc(e, handlerFunc) ctx := context.Background() commentByID, _, err := client.Teams.GetCommentByID(ctx, 1, 2, 3, 4) if err != nil { t.Errorf("Teams.GetCommentByID returned error: %v", err) } if !cmp.Equal(commentByID, want) { t.Errorf("Teams.GetCommentByID returned %+v, want %+v", commentByID, want) } e = tdcEndpointBySlug("a", "b", "3", "4") mux.HandleFunc(e, handlerFunc) commentBySlug, _, err := client.Teams.GetCommentBySlug(ctx, "a", "b", 3, 4) if err != nil { t.Errorf("Teams.GetCommentBySlug returned error: %v", err) } if !cmp.Equal(commentBySlug, want) { t.Errorf("Teams.GetCommentBySlug returned %+v, want %+v", commentBySlug, want) } methodName := "GetCommentByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.GetCommentByID(ctx, -1, -2, -3, -4) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.GetCommentByID(ctx, 1, 2, 3, 4) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) methodName = "ListCommentsBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.GetCommentBySlug(ctx, "a\na", "b\nb", -3, -4) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.GetCommentBySlug(ctx, "a", "b", 3, 4) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_CreateComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := DiscussionComment{Body: String("c")} handlerFunc := func(w http.ResponseWriter, r *http.Request) { v := new(DiscussionComment) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, &input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"number":4}`) } want := &DiscussionComment{Number: Int(4)} e := tdcEndpointByID("1", "2", "3", "") mux.HandleFunc(e, handlerFunc) ctx := context.Background() commentByID, _, err := client.Teams.CreateCommentByID(ctx, 1, 2, 3, input) if err != nil { t.Errorf("Teams.CreateCommentByID returned error: %v", err) } if !cmp.Equal(commentByID, want) { t.Errorf("Teams.CreateCommentByID returned %+v, want %+v", commentByID, want) } e = tdcEndpointBySlug("a", "b", "3", "") mux.HandleFunc(e, handlerFunc) commentBySlug, _, err := client.Teams.CreateCommentBySlug(ctx, "a", "b", 3, input) if err != nil { t.Errorf("Teams.CreateCommentBySlug returned error: %v", err) } if !cmp.Equal(commentBySlug, want) { t.Errorf("Teams.CreateCommentBySlug returned %+v, want %+v", commentBySlug, want) } methodName := "CreateCommentByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.CreateCommentByID(ctx, -1, -2, -3, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.CreateCommentByID(ctx, 1, 2, 3, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) methodName = "CreateCommentBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.CreateCommentBySlug(ctx, "a\na", "b\nb", -3, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.CreateCommentBySlug(ctx, "a", "b", 3, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_EditComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := DiscussionComment{Body: String("e")} handlerFunc := func(w http.ResponseWriter, r *http.Request) { v := new(DiscussionComment) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, &input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"number":4}`) } want := &DiscussionComment{Number: Int(4)} e := tdcEndpointByID("1", "2", "3", "4") mux.HandleFunc(e, handlerFunc) ctx := context.Background() commentByID, _, err := client.Teams.EditCommentByID(ctx, 1, 2, 3, 4, input) if err != nil { t.Errorf("Teams.EditCommentByID returned error: %v", err) } if !cmp.Equal(commentByID, want) { t.Errorf("Teams.EditCommentByID returned %+v, want %+v", commentByID, want) } e = tdcEndpointBySlug("a", "b", "3", "4") mux.HandleFunc(e, handlerFunc) commentBySlug, _, err := client.Teams.EditCommentBySlug(ctx, "a", "b", 3, 4, input) if err != nil { t.Errorf("Teams.EditCommentBySlug returned error: %v", err) } if !cmp.Equal(commentBySlug, want) { t.Errorf("Teams.EditCommentBySlug returned %+v, want %+v", commentBySlug, want) } methodName := "EditCommentByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.EditCommentByID(ctx, -1, -2, -3, -4, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.EditCommentByID(ctx, 1, 2, 3, 4, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) methodName = "EditCommentBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.EditCommentBySlug(ctx, "a\na", "b\nb", -3, -4, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.EditCommentBySlug(ctx, "a", "b", 3, 4, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_DeleteComment(t *testing.T) { client, mux, _, teardown := setup() defer teardown() handlerFunc := func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") } e := tdcEndpointByID("1", "2", "3", "4") mux.HandleFunc(e, handlerFunc) ctx := context.Background() _, err := client.Teams.DeleteCommentByID(ctx, 1, 2, 3, 4) if err != nil { t.Errorf("Teams.DeleteCommentByID returned error: %v", err) } e = tdcEndpointBySlug("a", "b", "3", "4") mux.HandleFunc(e, handlerFunc) _, err = client.Teams.DeleteCommentBySlug(ctx, "a", "b", 3, 4) if err != nil { t.Errorf("Teams.DeleteCommentBySlug returned error: %v", err) } methodName := "DeleteCommentByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.DeleteCommentByID(ctx, -1, -2, -3, -4) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { resp, err := client.Teams.DeleteCommentByID(ctx, 1, 2, 3, 4) return resp, err }) methodName = "DeleteCommentBySlug" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.DeleteCommentBySlug(ctx, "a\na", "b\nb", -3, -4) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { resp, err := client.Teams.DeleteCommentBySlug(ctx, "a", "b", 3, 4) return resp, err }) } go-github-38.1.0/github/teams_discussions.go000066400000000000000000000222141410475703100210430ustar00rootroot00000000000000// Copyright 2018 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 ( "context" "fmt" ) // TeamDiscussion represents a GitHub dicussion in a team. type TeamDiscussion struct { Author *User `json:"author,omitempty"` Body *string `json:"body,omitempty"` BodyHTML *string `json:"body_html,omitempty"` BodyVersion *string `json:"body_version,omitempty"` CommentsCount *int `json:"comments_count,omitempty"` CommentsURL *string `json:"comments_url,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` LastEditedAt *Timestamp `json:"last_edited_at,omitempty"` HTMLURL *string `json:"html_url,omitempty"` NodeID *string `json:"node_id,omitempty"` Number *int `json:"number,omitempty"` Pinned *bool `json:"pinned,omitempty"` Private *bool `json:"private,omitempty"` TeamURL *string `json:"team_url,omitempty"` Title *string `json:"title,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` URL *string `json:"url,omitempty"` Reactions *Reactions `json:"reactions,omitempty"` } func (d TeamDiscussion) String() string { return Stringify(d) } // DiscussionListOptions specifies optional parameters to the // TeamServices.ListDiscussions method. type DiscussionListOptions struct { // Sorts the discussion by the date they were created. // Accepted values are asc and desc. Default is desc. Direction string `url:"direction,omitempty"` ListOptions } // ListDiscussionsByID lists all discussions on team's page given Organization and Team ID. // Authenticated user must grant read:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-discussions func (s *TeamsService) ListDiscussionsByID(ctx context.Context, orgID, teamID int64, opts *DiscussionListOptions) ([]*TeamDiscussion, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/discussions", orgID, teamID) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var teamDiscussions []*TeamDiscussion resp, err := s.client.Do(ctx, req, &teamDiscussions) if err != nil { return nil, resp, err } return teamDiscussions, resp, nil } // ListDiscussionsBySlug lists all discussions on team's page given Organization name and Team's slug. // Authenticated user must grant read:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-discussions func (s *TeamsService) ListDiscussionsBySlug(ctx context.Context, org, slug string, opts *DiscussionListOptions) ([]*TeamDiscussion, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/discussions", org, slug) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var teamDiscussions []*TeamDiscussion resp, err := s.client.Do(ctx, req, &teamDiscussions) if err != nil { return nil, resp, err } return teamDiscussions, resp, nil } // GetDiscussionByID gets a specific discussion on a team's page given Organization and Team ID. // Authenticated user must grant read:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#get-a-discussion func (s *TeamsService) GetDiscussionByID(ctx context.Context, orgID, teamID int64, discussionNumber int) (*TeamDiscussion, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v", orgID, teamID, discussionNumber) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } teamDiscussion := &TeamDiscussion{} resp, err := s.client.Do(ctx, req, teamDiscussion) if err != nil { return nil, resp, err } return teamDiscussion, resp, nil } // GetDiscussionBySlug gets a specific discussion on a team's page given Organization name and Team's slug. // Authenticated user must grant read:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#get-a-discussion func (s *TeamsService) GetDiscussionBySlug(ctx context.Context, org, slug string, discussionNumber int) (*TeamDiscussion, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v", org, slug, discussionNumber) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } teamDiscussion := &TeamDiscussion{} resp, err := s.client.Do(ctx, req, teamDiscussion) if err != nil { return nil, resp, err } return teamDiscussion, resp, nil } // CreateDiscussionByID creates a new discussion post on a team's page given Organization and Team ID. // Authenticated user must grant write:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#create-a-discussion func (s *TeamsService) CreateDiscussionByID(ctx context.Context, orgID, teamID int64, discussion TeamDiscussion) (*TeamDiscussion, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/discussions", orgID, teamID) req, err := s.client.NewRequest("POST", u, discussion) if err != nil { return nil, nil, err } teamDiscussion := &TeamDiscussion{} resp, err := s.client.Do(ctx, req, teamDiscussion) if err != nil { return nil, resp, err } return teamDiscussion, resp, nil } // CreateDiscussionBySlug creates a new discussion post on a team's page given Organization name and Team's slug. // Authenticated user must grant write:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#create-a-discussion func (s *TeamsService) CreateDiscussionBySlug(ctx context.Context, org, slug string, discussion TeamDiscussion) (*TeamDiscussion, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/discussions", org, slug) req, err := s.client.NewRequest("POST", u, discussion) if err != nil { return nil, nil, err } teamDiscussion := &TeamDiscussion{} resp, err := s.client.Do(ctx, req, teamDiscussion) if err != nil { return nil, resp, err } return teamDiscussion, resp, nil } // EditDiscussionByID edits the title and body text of a discussion post given Organization and Team ID. // Authenticated user must grant write:discussion scope. // User is allowed to change Title and Body of a discussion only. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#update-a-discussion func (s *TeamsService) EditDiscussionByID(ctx context.Context, orgID, teamID int64, discussionNumber int, discussion TeamDiscussion) (*TeamDiscussion, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v", orgID, teamID, discussionNumber) req, err := s.client.NewRequest("PATCH", u, discussion) if err != nil { return nil, nil, err } teamDiscussion := &TeamDiscussion{} resp, err := s.client.Do(ctx, req, teamDiscussion) if err != nil { return nil, resp, err } return teamDiscussion, resp, nil } // EditDiscussionBySlug edits the title and body text of a discussion post given Organization name and Team's slug. // Authenticated user must grant write:discussion scope. // User is allowed to change Title and Body of a discussion only. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#update-a-discussion func (s *TeamsService) EditDiscussionBySlug(ctx context.Context, org, slug string, discussionNumber int, discussion TeamDiscussion) (*TeamDiscussion, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v", org, slug, discussionNumber) req, err := s.client.NewRequest("PATCH", u, discussion) if err != nil { return nil, nil, err } teamDiscussion := &TeamDiscussion{} resp, err := s.client.Do(ctx, req, teamDiscussion) if err != nil { return nil, resp, err } return teamDiscussion, resp, nil } // DeleteDiscussionByID deletes a discussion from team's page given Organization and Team ID. // Authenticated user must grant write:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#delete-a-discussion func (s *TeamsService) DeleteDiscussionByID(ctx context.Context, orgID, teamID int64, discussionNumber int) (*Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v", orgID, teamID, discussionNumber) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DeleteDiscussionBySlug deletes a discussion from team's page given Organization name and Team's slug. // Authenticated user must grant write:discussion scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#delete-a-discussion func (s *TeamsService) DeleteDiscussionBySlug(ctx context.Context, org, slug string, discussionNumber int) (*Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v", org, slug, discussionNumber) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/teams_discussions_test.go000066400000000000000000000446521410475703100221140ustar00rootroot00000000000000// Copyright 2018 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "time" "github.com/google/go-cmp/cmp" ) func TestTeamsService_ListDiscussionsByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/2/discussions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "direction": "desc", "page": "2", }) fmt.Fprintf(w, `[ { "author": { "login": "author", "id": 0, "avatar_url": "https://avatars1.githubusercontent.com/u/0?v=4", "gravatar_id": "", "url": "https://api.github.com/users/author", "html_url": "https://github.com/author", "followers_url": "https://api.github.com/users/author/followers", "following_url": "https://api.github.com/users/author/following{/other_user}", "gists_url": "https://api.github.com/users/author/gists{/gist_id}", "starred_url": "https://api.github.com/users/author/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/author/subscriptions", "organizations_url": "https://api.github.com/users/author/orgs", "repos_url": "https://api.github.com/users/author/repos", "events_url": "https://api.github.com/users/author/events{/privacy}", "received_events_url": "https://api.github.com/users/author/received_events", "type": "User", "site_admin": false }, "body": "test", "body_html": "

test

", "body_version": "version", "comments_count": 1, "comments_url": "https://api.github.com/teams/2/discussions/3/comments", "created_at": "2018-01-01T00:00:00Z", "last_edited_at": null, "html_url": "https://github.com/orgs/1/teams/2/discussions/3", "node_id": "node", "number": 3, "pinned": false, "private": false, "team_url": "https://api.github.com/teams/2", "title": "test", "updated_at": "2018-01-01T00:00:00Z", "url": "https://api.github.com/teams/2/discussions/3" } ]`) }) ctx := context.Background() discussions, _, err := client.Teams.ListDiscussionsByID(ctx, 1, 2, &DiscussionListOptions{"desc", ListOptions{Page: 2}}) if err != nil { t.Errorf("Teams.ListDiscussionsByID returned error: %v", err) } want := []*TeamDiscussion{ { Author: &User{ Login: String("author"), ID: Int64(0), AvatarURL: String("https://avatars1.githubusercontent.com/u/0?v=4"), GravatarID: String(""), URL: String("https://api.github.com/users/author"), HTMLURL: String("https://github.com/author"), FollowersURL: String("https://api.github.com/users/author/followers"), FollowingURL: String("https://api.github.com/users/author/following{/other_user}"), GistsURL: String("https://api.github.com/users/author/gists{/gist_id}"), StarredURL: String("https://api.github.com/users/author/starred{/owner}{/repo}"), SubscriptionsURL: String("https://api.github.com/users/author/subscriptions"), OrganizationsURL: String("https://api.github.com/users/author/orgs"), ReposURL: String("https://api.github.com/users/author/repos"), EventsURL: String("https://api.github.com/users/author/events{/privacy}"), ReceivedEventsURL: String("https://api.github.com/users/author/received_events"), Type: String("User"), SiteAdmin: Bool(false), }, Body: String("test"), BodyHTML: String("

test

"), BodyVersion: String("version"), CommentsCount: Int(1), CommentsURL: String("https://api.github.com/teams/2/discussions/3/comments"), CreatedAt: &Timestamp{time.Date(2018, time.January, 1, 0, 0, 0, 0, time.UTC)}, LastEditedAt: nil, HTMLURL: String("https://github.com/orgs/1/teams/2/discussions/3"), NodeID: String("node"), Number: Int(3), Pinned: Bool(false), Private: Bool(false), TeamURL: String("https://api.github.com/teams/2"), Title: String("test"), UpdatedAt: &Timestamp{time.Date(2018, time.January, 1, 0, 0, 0, 0, time.UTC)}, URL: String("https://api.github.com/teams/2/discussions/3"), }, } if !cmp.Equal(discussions, want) { t.Errorf("Teams.ListDiscussionsByID returned %+v, want %+v", discussions, want) } const methodName = "ListDiscussionsByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListDiscussionsByID(ctx, -1, -2, nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListDiscussionsByID(ctx, 1, 2, &DiscussionListOptions{"desc", ListOptions{Page: 2}}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_ListDiscussionsBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s/discussions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "direction": "desc", "page": "2", }) fmt.Fprintf(w, `[ { "author": { "login": "author", "id": 0, "avatar_url": "https://avatars1.githubusercontent.com/u/0?v=4", "gravatar_id": "", "url": "https://api.github.com/users/author", "html_url": "https://github.com/author", "followers_url": "https://api.github.com/users/author/followers", "following_url": "https://api.github.com/users/author/following{/other_user}", "gists_url": "https://api.github.com/users/author/gists{/gist_id}", "starred_url": "https://api.github.com/users/author/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/author/subscriptions", "organizations_url": "https://api.github.com/users/author/orgs", "repos_url": "https://api.github.com/users/author/repos", "events_url": "https://api.github.com/users/author/events{/privacy}", "received_events_url": "https://api.github.com/users/author/received_events", "type": "User", "site_admin": false }, "body": "test", "body_html": "

test

", "body_version": "version", "comments_count": 1, "comments_url": "https://api.github.com/teams/2/discussions/3/comments", "created_at": "2018-01-01T00:00:00Z", "last_edited_at": null, "html_url": "https://github.com/orgs/1/teams/2/discussions/3", "node_id": "node", "number": 3, "pinned": false, "private": false, "team_url": "https://api.github.com/teams/2", "title": "test", "updated_at": "2018-01-01T00:00:00Z", "url": "https://api.github.com/teams/2/discussions/3" } ]`) }) ctx := context.Background() discussions, _, err := client.Teams.ListDiscussionsBySlug(ctx, "o", "s", &DiscussionListOptions{"desc", ListOptions{Page: 2}}) if err != nil { t.Errorf("Teams.ListDiscussionsBySlug returned error: %v", err) } want := []*TeamDiscussion{ { Author: &User{ Login: String("author"), ID: Int64(0), AvatarURL: String("https://avatars1.githubusercontent.com/u/0?v=4"), GravatarID: String(""), URL: String("https://api.github.com/users/author"), HTMLURL: String("https://github.com/author"), FollowersURL: String("https://api.github.com/users/author/followers"), FollowingURL: String("https://api.github.com/users/author/following{/other_user}"), GistsURL: String("https://api.github.com/users/author/gists{/gist_id}"), StarredURL: String("https://api.github.com/users/author/starred{/owner}{/repo}"), SubscriptionsURL: String("https://api.github.com/users/author/subscriptions"), OrganizationsURL: String("https://api.github.com/users/author/orgs"), ReposURL: String("https://api.github.com/users/author/repos"), EventsURL: String("https://api.github.com/users/author/events{/privacy}"), ReceivedEventsURL: String("https://api.github.com/users/author/received_events"), Type: String("User"), SiteAdmin: Bool(false), }, Body: String("test"), BodyHTML: String("

test

"), BodyVersion: String("version"), CommentsCount: Int(1), CommentsURL: String("https://api.github.com/teams/2/discussions/3/comments"), CreatedAt: &Timestamp{time.Date(2018, time.January, 1, 0, 0, 0, 0, time.UTC)}, LastEditedAt: nil, HTMLURL: String("https://github.com/orgs/1/teams/2/discussions/3"), NodeID: String("node"), Number: Int(3), Pinned: Bool(false), Private: Bool(false), TeamURL: String("https://api.github.com/teams/2"), Title: String("test"), UpdatedAt: &Timestamp{time.Date(2018, time.January, 1, 0, 0, 0, 0, time.UTC)}, URL: String("https://api.github.com/teams/2/discussions/3"), }, } if !cmp.Equal(discussions, want) { t.Errorf("Teams.ListDiscussionsBySlug returned %+v, want %+v", discussions, want) } const methodName = "ListDiscussionsBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListDiscussionsBySlug(ctx, "o\no", "s\ns", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListDiscussionsBySlug(ctx, "o", "s", &DiscussionListOptions{"desc", ListOptions{Page: 2}}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_GetDiscussionByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/2/discussions/3", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"number":3}`) }) ctx := context.Background() discussion, _, err := client.Teams.GetDiscussionByID(ctx, 1, 2, 3) if err != nil { t.Errorf("Teams.GetDiscussionByID returned error: %v", err) } want := &TeamDiscussion{Number: Int(3)} if !cmp.Equal(discussion, want) { t.Errorf("Teams.GetDiscussionByID returned %+v, want %+v", discussion, want) } const methodName = "GetDiscussionByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.GetDiscussionByID(ctx, -1, -2, -3) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.GetDiscussionByID(ctx, 1, 2, 3) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_GetDiscussionBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s/discussions/3", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"number":3}`) }) ctx := context.Background() discussion, _, err := client.Teams.GetDiscussionBySlug(ctx, "o", "s", 3) if err != nil { t.Errorf("Teams.GetDiscussionBySlug returned error: %v", err) } want := &TeamDiscussion{Number: Int(3)} if !cmp.Equal(discussion, want) { t.Errorf("Teams.GetDiscussionBySlug returned %+v, want %+v", discussion, want) } const methodName = "GetDiscussionBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.GetDiscussionBySlug(ctx, "o\no", "s\ns", -3) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.GetDiscussionBySlug(ctx, "o", "s", 3) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_CreateDiscussionByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := TeamDiscussion{Title: String("c_t"), Body: String("c_b")} mux.HandleFunc("/organizations/1/team/2/discussions", func(w http.ResponseWriter, r *http.Request) { v := new(TeamDiscussion) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, &input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"number":3}`) }) ctx := context.Background() comment, _, err := client.Teams.CreateDiscussionByID(ctx, 1, 2, input) if err != nil { t.Errorf("Teams.CreateDiscussionByID returned error: %v", err) } want := &TeamDiscussion{Number: Int(3)} if !cmp.Equal(comment, want) { t.Errorf("Teams.CreateDiscussionByID returned %+v, want %+v", comment, want) } const methodName = "CreateDiscussionByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.CreateDiscussionByID(ctx, -1, -2, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.CreateDiscussionByID(ctx, 1, 2, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_CreateDiscussionBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := TeamDiscussion{Title: String("c_t"), Body: String("c_b")} mux.HandleFunc("/orgs/o/teams/s/discussions", func(w http.ResponseWriter, r *http.Request) { v := new(TeamDiscussion) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, &input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"number":3}`) }) ctx := context.Background() comment, _, err := client.Teams.CreateDiscussionBySlug(ctx, "o", "s", input) if err != nil { t.Errorf("Teams.CreateDiscussionBySlug returned error: %v", err) } want := &TeamDiscussion{Number: Int(3)} if !cmp.Equal(comment, want) { t.Errorf("Teams.CreateDiscussionBySlug returned %+v, want %+v", comment, want) } const methodName = "CreateDiscussionBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.CreateDiscussionBySlug(ctx, "o\no", "s\ns", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.CreateDiscussionBySlug(ctx, "o", "s", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_EditDiscussionByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := TeamDiscussion{Title: String("e_t"), Body: String("e_b")} mux.HandleFunc("/organizations/1/team/2/discussions/3", func(w http.ResponseWriter, r *http.Request) { v := new(TeamDiscussion) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, &input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"number":3}`) }) ctx := context.Background() comment, _, err := client.Teams.EditDiscussionByID(ctx, 1, 2, 3, input) if err != nil { t.Errorf("Teams.EditDiscussionByID returned error: %v", err) } want := &TeamDiscussion{Number: Int(3)} if !cmp.Equal(comment, want) { t.Errorf("Teams.EditDiscussionByID returned %+v, want %+v", comment, want) } const methodName = "EditDiscussionByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.EditDiscussionByID(ctx, -1, -2, -3, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.EditDiscussionByID(ctx, 1, 2, 3, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_EditDiscussionBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := TeamDiscussion{Title: String("e_t"), Body: String("e_b")} mux.HandleFunc("/orgs/o/teams/s/discussions/3", func(w http.ResponseWriter, r *http.Request) { v := new(TeamDiscussion) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, &input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"number":3}`) }) ctx := context.Background() comment, _, err := client.Teams.EditDiscussionBySlug(ctx, "o", "s", 3, input) if err != nil { t.Errorf("Teams.EditDiscussionBySlug returned error: %v", err) } want := &TeamDiscussion{Number: Int(3)} if !cmp.Equal(comment, want) { t.Errorf("Teams.EditDiscussionBySlug returned %+v, want %+v", comment, want) } const methodName = "EditDiscussionBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.EditDiscussionBySlug(ctx, "o\no", "s\ns", -3, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.EditDiscussionBySlug(ctx, "o", "s", 3, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_DeleteDiscussionByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/2/discussions/3", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Teams.DeleteDiscussionByID(ctx, 1, 2, 3) if err != nil { t.Errorf("Teams.DeleteDiscussionByID returned error: %v", err) } const methodName = "DeleteDiscussionByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.DeleteDiscussionByID(ctx, -1, -2, -3) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.DeleteDiscussionByID(ctx, 1, 2, 3) }) } func TestTeamsService_DeleteDiscussionBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s/discussions/3", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Teams.DeleteDiscussionBySlug(ctx, "o", "s", 3) if err != nil { t.Errorf("Teams.DeleteDiscussionBySlug returned error: %v", err) } const methodName = "DeleteDiscussionBySlug" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.DeleteDiscussionBySlug(ctx, "o\no", "s\ns", -3) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.DeleteDiscussionBySlug(ctx, "o", "s", 3) }) } go-github-38.1.0/github/teams_members.go000066400000000000000000000177651410475703100201460ustar00rootroot00000000000000// Copyright 2018 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 ( "context" "fmt" ) // TeamListTeamMembersOptions specifies the optional parameters to the // TeamsService.ListTeamMembers method. type TeamListTeamMembersOptions struct { // Role filters members returned by their role in the team. Possible // values are "all", "member", "maintainer". Default is "all". Role string `url:"role,omitempty"` ListOptions } // ListTeamMembersByID lists all of the users who are members of a team, given a specified // organization ID, by team ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-team-members func (s *TeamsService) ListTeamMembersByID(ctx context.Context, orgID, teamID int64, opts *TeamListTeamMembersOptions) ([]*User, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/members", orgID, teamID) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var members []*User resp, err := s.client.Do(ctx, req, &members) if err != nil { return nil, resp, err } return members, resp, nil } // ListTeamMembersBySlug lists all of the users who are members of a team, given a specified // organization name, by team slug. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-team-members func (s *TeamsService) ListTeamMembersBySlug(ctx context.Context, org, slug string, opts *TeamListTeamMembersOptions) ([]*User, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/members", org, slug) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var members []*User resp, err := s.client.Do(ctx, req, &members) if err != nil { return nil, resp, err } return members, resp, nil } // GetTeamMembershipByID returns the membership status for a user in a team, given a specified // organization ID, by team ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#get-team-membership-for-a-user func (s *TeamsService) GetTeamMembershipByID(ctx context.Context, orgID, teamID int64, user string) (*Membership, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/memberships/%v", orgID, teamID, user) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } t := new(Membership) resp, err := s.client.Do(ctx, req, t) if err != nil { return nil, resp, err } return t, resp, nil } // GetTeamMembershipBySlug returns the membership status for a user in a team, given a specified // organization name, by team slug. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#get-team-membership-for-a-user func (s *TeamsService) GetTeamMembershipBySlug(ctx context.Context, org, slug, user string) (*Membership, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/memberships/%v", org, slug, user) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } t := new(Membership) resp, err := s.client.Do(ctx, req, t) if err != nil { return nil, resp, err } return t, resp, nil } // TeamAddTeamMembershipOptions specifies the optional // parameters to the TeamsService.AddTeamMembership method. type TeamAddTeamMembershipOptions struct { // Role specifies the role the user should have in the team. Possible // values are: // member - a normal member of the team // maintainer - a team maintainer. Able to add/remove other team // members, promote other team members to team // maintainer, and edit the team’s name and description // // Default value is "member". Role string `json:"role,omitempty"` } // AddTeamMembershipByID adds or invites a user to a team, given a specified // organization ID, by team ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#add-or-update-team-membership-for-a-user func (s *TeamsService) AddTeamMembershipByID(ctx context.Context, orgID, teamID int64, user string, opts *TeamAddTeamMembershipOptions) (*Membership, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/memberships/%v", orgID, teamID, user) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, nil, err } t := new(Membership) resp, err := s.client.Do(ctx, req, t) if err != nil { return nil, resp, err } return t, resp, nil } // AddTeamMembershipBySlug adds or invites a user to a team, given a specified // organization name, by team slug. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#add-or-update-team-membership-for-a-user func (s *TeamsService) AddTeamMembershipBySlug(ctx context.Context, org, slug, user string, opts *TeamAddTeamMembershipOptions) (*Membership, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/memberships/%v", org, slug, user) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, nil, err } t := new(Membership) resp, err := s.client.Do(ctx, req, t) if err != nil { return nil, resp, err } return t, resp, nil } // RemoveTeamMembershipByID removes a user from a team, given a specified // organization ID, by team ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#remove-team-membership-for-a-user func (s *TeamsService) RemoveTeamMembershipByID(ctx context.Context, orgID, teamID int64, user string) (*Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/memberships/%v", orgID, teamID, user) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // RemoveTeamMembershipBySlug removes a user from a team, given a specified // organization name, by team slug. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#remove-team-membership-for-a-user func (s *TeamsService) RemoveTeamMembershipBySlug(ctx context.Context, org, slug, user string) (*Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/memberships/%v", org, slug, user) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListPendingTeamInvitationsByID gets pending invitation list of a team, given a specified // organization ID, by team ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-pending-team-invitations func (s *TeamsService) ListPendingTeamInvitationsByID(ctx context.Context, orgID, teamID int64, opts *ListOptions) ([]*Invitation, *Response, error) { u := fmt.Sprintf("organizations/%v/team/%v/invitations", orgID, teamID) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var pendingInvitations []*Invitation resp, err := s.client.Do(ctx, req, &pendingInvitations) if err != nil { return nil, resp, err } return pendingInvitations, resp, nil } // ListPendingTeamInvitationsBySlug get pending invitation list of a team, given a specified // organization name, by team slug. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/teams/#list-pending-team-invitations func (s *TeamsService) ListPendingTeamInvitationsBySlug(ctx context.Context, org, slug string, opts *ListOptions) ([]*Invitation, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/invitations", org, slug) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var pendingInvitations []*Invitation resp, err := s.client.Do(ctx, req, &pendingInvitations) if err != nil { return nil, resp, err } return pendingInvitations, resp, nil } go-github-38.1.0/github/teams_members_test.go000066400000000000000000000620631410475703100211740ustar00rootroot00000000000000// Copyright 2018 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestTeamsService__ListTeamMembersByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/2/members", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"role": "member", "page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &TeamListTeamMembersOptions{Role: "member", ListOptions: ListOptions{Page: 2}} ctx := context.Background() members, _, err := client.Teams.ListTeamMembersByID(ctx, 1, 2, opt) if err != nil { t.Errorf("Teams.ListTeamMembersByID returned error: %v", err) } want := []*User{{ID: Int64(1)}} if !cmp.Equal(members, want) { t.Errorf("Teams.ListTeamMembersByID returned %+v, want %+v", members, want) } const methodName = "ListTeamMembersByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListTeamMembersByID(ctx, -1, -2, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListTeamMembersByID(ctx, 1, 2, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__ListTeamMembersByID_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/2/members", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"role": "member", "page": "2"}) w.WriteHeader(http.StatusNotFound) }) opt := &TeamListTeamMembersOptions{Role: "member", ListOptions: ListOptions{Page: 2}} ctx := context.Background() members, resp, err := client.Teams.ListTeamMembersByID(ctx, 1, 2, opt) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.ListTeamMembersByID returned status %d, want %d", got, want) } if members != nil { t.Errorf("Teams.ListTeamMembersByID returned %+v, want nil", members) } const methodName = "ListTeamMembersByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListTeamMembersByID(ctx, 1, 2, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListTeamMembersByID(ctx, 1, 2, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__ListTeamMembersBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s/members", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"role": "member", "page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &TeamListTeamMembersOptions{Role: "member", ListOptions: ListOptions{Page: 2}} ctx := context.Background() members, _, err := client.Teams.ListTeamMembersBySlug(ctx, "o", "s", opt) if err != nil { t.Errorf("Teams.ListTeamMembersBySlug returned error: %v", err) } want := []*User{{ID: Int64(1)}} if !cmp.Equal(members, want) { t.Errorf("Teams.ListTeamMembersBySlug returned %+v, want %+v", members, want) } const methodName = "ListTeamMembersBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListTeamMembersBySlug(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListTeamMembersBySlug(ctx, "o", "s", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__ListTeamMembersBySlug_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s/members", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"role": "member", "page": "2"}) w.WriteHeader(http.StatusNotFound) }) opt := &TeamListTeamMembersOptions{Role: "member", ListOptions: ListOptions{Page: 2}} ctx := context.Background() members, resp, err := client.Teams.ListTeamMembersBySlug(ctx, "o", "s", opt) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.ListTeamMembersBySlug returned status %d, want %d", got, want) } if members != nil { t.Errorf("Teams.ListTeamMembersBySlug returned %+v, want nil", members) } const methodName = "ListTeamMembersBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListTeamMembersBySlug(ctx, "o", "s", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListTeamMembersBySlug(ctx, "o", "s", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__ListTeamMembersBySlug_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Teams.ListTeamMembersBySlug(ctx, "%", "s", nil) testURLParseError(t, err) } func TestTeamsService__GetTeamMembershipByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/2/memberships/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"url":"u", "state":"active"}`) }) ctx := context.Background() membership, _, err := client.Teams.GetTeamMembershipByID(ctx, 1, 2, "u") if err != nil { t.Errorf("Teams.GetTeamMembershipByID returned error: %v", err) } want := &Membership{URL: String("u"), State: String("active")} if !cmp.Equal(membership, want) { t.Errorf("Teams.GetTeamMembershipByID returned %+v, want %+v", membership, want) } const methodName = "GetTeamMembershipByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.GetTeamMembershipByID(ctx, -1, -2, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.GetTeamMembershipByID(ctx, 1, 2, "u") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__GetTeamMembershipByID_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/2/memberships/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() membership, resp, err := client.Teams.GetTeamMembershipByID(ctx, 1, 2, "u") if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.GetTeamMembershipByID returned status %d, want %d", got, want) } if membership != nil { t.Errorf("Teams.GetTeamMembershipByID returned %+v, want nil", membership) } const methodName = "GetTeamMembershipByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.GetTeamMembershipByID(ctx, 1, 2, "u") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.GetTeamMembershipByID(ctx, 1, 2, "u") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__GetTeamMembershipBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s/memberships/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"url":"u", "state":"active"}`) }) ctx := context.Background() membership, _, err := client.Teams.GetTeamMembershipBySlug(ctx, "o", "s", "u") if err != nil { t.Errorf("Teams.GetTeamMembershipBySlug returned error: %v", err) } want := &Membership{URL: String("u"), State: String("active")} if !cmp.Equal(membership, want) { t.Errorf("Teams.GetTeamMembershipBySlug returned %+v, want %+v", membership, want) } const methodName = "GetTeamMembershipBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.GetTeamMembershipBySlug(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.GetTeamMembershipBySlug(ctx, "o", "s", "u") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__GetTeamMembershipBySlug_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s/memberships/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() membership, resp, err := client.Teams.GetTeamMembershipBySlug(ctx, "o", "s", "u") if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.GetTeamMembershipBySlug returned status %d, want %d", got, want) } if membership != nil { t.Errorf("Teams.GetTeamMembershipBySlug returned %+v, want nil", membership) } const methodName = "GetTeamMembershipBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.GetTeamMembershipBySlug(ctx, "o", "s", "u") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.GetTeamMembershipBySlug(ctx, "o", "s", "u") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__GetTeamMembershipBySlug_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Teams.GetTeamMembershipBySlug(ctx, "%s", "s", "u") testURLParseError(t, err) } func TestTeamsService__AddTeamMembershipByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() opt := &TeamAddTeamMembershipOptions{Role: "maintainer"} mux.HandleFunc("/organizations/1/team/2/memberships/u", func(w http.ResponseWriter, r *http.Request) { v := new(TeamAddTeamMembershipOptions) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, opt) { t.Errorf("Request body = %+v, want %+v", v, opt) } fmt.Fprint(w, `{"url":"u", "state":"pending"}`) }) ctx := context.Background() membership, _, err := client.Teams.AddTeamMembershipByID(ctx, 1, 2, "u", opt) if err != nil { t.Errorf("Teams.AddTeamMembershipByID returned error: %v", err) } want := &Membership{URL: String("u"), State: String("pending")} if !cmp.Equal(membership, want) { t.Errorf("Teams.AddTeamMembershipByID returned %+v, want %+v", membership, want) } const methodName = "AddTeamMembershipByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.AddTeamMembershipByID(ctx, -1, -2, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.AddTeamMembershipByID(ctx, 1, 2, "u", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__AddTeamMembershipByID_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() opt := &TeamAddTeamMembershipOptions{Role: "maintainer"} mux.HandleFunc("/organizations/1/team/2/memberships/u", func(w http.ResponseWriter, r *http.Request) { v := new(TeamAddTeamMembershipOptions) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, opt) { t.Errorf("Request body = %+v, want %+v", v, opt) } w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() membership, resp, err := client.Teams.AddTeamMembershipByID(ctx, 1, 2, "u", opt) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.AddTeamMembershipByID returned status %d, want %d", got, want) } if membership != nil { t.Errorf("Teams.AddTeamMembershipByID returned %+v, want nil", membership) } const methodName = "AddTeamMembershipByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.AddTeamMembershipByID(ctx, 1, 2, "u", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.AddTeamMembershipByID(ctx, 1, 2, "u", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__AddTeamMembershipBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() opt := &TeamAddTeamMembershipOptions{Role: "maintainer"} mux.HandleFunc("/orgs/o/teams/s/memberships/u", func(w http.ResponseWriter, r *http.Request) { v := new(TeamAddTeamMembershipOptions) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, opt) { t.Errorf("Request body = %+v, want %+v", v, opt) } fmt.Fprint(w, `{"url":"u", "state":"pending"}`) }) ctx := context.Background() membership, _, err := client.Teams.AddTeamMembershipBySlug(ctx, "o", "s", "u", opt) if err != nil { t.Errorf("Teams.AddTeamMembershipBySlug returned error: %v", err) } want := &Membership{URL: String("u"), State: String("pending")} if !cmp.Equal(membership, want) { t.Errorf("Teams.AddTeamMembershipBySlug returned %+v, want %+v", membership, want) } const methodName = "AddTeamMembershipBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.AddTeamMembershipBySlug(ctx, "\n", "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.AddTeamMembershipBySlug(ctx, "o", "s", "u", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__AddTeamMembershipBySlug_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() opt := &TeamAddTeamMembershipOptions{Role: "maintainer"} mux.HandleFunc("/orgs/o/teams/s/memberships/u", func(w http.ResponseWriter, r *http.Request) { v := new(TeamAddTeamMembershipOptions) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, opt) { t.Errorf("Request body = %+v, want %+v", v, opt) } w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() membership, resp, err := client.Teams.AddTeamMembershipBySlug(ctx, "o", "s", "u", opt) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.AddTeamMembershipBySlug returned status %d, want %d", got, want) } if membership != nil { t.Errorf("Teams.AddTeamMembershipBySlug returned %+v, want nil", membership) } const methodName = "AddTeamMembershipBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.AddTeamMembershipBySlug(ctx, "o", "s", "u", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.AddTeamMembershipBySlug(ctx, "o", "s", "u", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__AddTeamMembershipBySlug_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Teams.AddTeamMembershipBySlug(ctx, "%", "s", "u", nil) testURLParseError(t, err) } func TestTeamsService__RemoveTeamMembershipByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/2/memberships/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Teams.RemoveTeamMembershipByID(ctx, 1, 2, "u") if err != nil { t.Errorf("Teams.RemoveTeamMembershipByID returned error: %v", err) } const methodName = "RemoveTeamMembershipByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.RemoveTeamMembershipByID(ctx, -1, -2, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.RemoveTeamMembershipByID(ctx, 1, 2, "u") }) } func TestTeamsService__RemoveTeamMembershipByID_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/2/memberships/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() resp, err := client.Teams.RemoveTeamMembershipByID(ctx, 1, 2, "u") if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.RemoveTeamMembershipByID returned status %d, want %d", got, want) } const methodName = "RemoveTeamMembershipByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.RemoveTeamMembershipByID(ctx, 1, 2, "u") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.RemoveTeamMembershipByID(ctx, 1, 2, "u") }) } func TestTeamsService__RemoveTeamMembershipBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s/memberships/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Teams.RemoveTeamMembershipBySlug(ctx, "o", "s", "u") if err != nil { t.Errorf("Teams.RemoveTeamMembershipBySlug returned error: %v", err) } const methodName = "RemoveTeamMembershipBySlug" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.RemoveTeamMembershipBySlug(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.RemoveTeamMembershipBySlug(ctx, "o", "s", "u") }) } func TestTeamsService__RemoveTeamMembershipBySlug_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s/memberships/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() resp, err := client.Teams.RemoveTeamMembershipBySlug(ctx, "o", "s", "u") if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.RemoveTeamMembershipBySlug returned status %d, want %d", got, want) } const methodName = "RemoveTeamMembershipBySlug" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.RemoveTeamMembershipBySlug(ctx, "o", "s", "u") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.RemoveTeamMembershipBySlug(ctx, "o", "s", "u") }) } func TestTeamsService__RemoveTeamMembershipBySlug_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Teams.RemoveTeamMembershipBySlug(ctx, "%", "s", "u") testURLParseError(t, err) } func TestTeamsService__ListPendingTeamInvitationsByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/2/invitations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() invitations, _, err := client.Teams.ListPendingTeamInvitationsByID(ctx, 1, 2, opt) if err != nil { t.Errorf("Teams.ListPendingTeamInvitationsByID returned error: %v", err) } want := []*Invitation{{ID: Int64(1)}} if !cmp.Equal(invitations, want) { t.Errorf("Teams.ListPendingTeamInvitationsByID returned %+v, want %+v", invitations, want) } const methodName = "ListPendingTeamInvitationsByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListPendingTeamInvitationsByID(ctx, -1, -2, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListPendingTeamInvitationsByID(ctx, 1, 2, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__ListPendingTeamInvitationsByID_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/2/invitations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) w.WriteHeader(http.StatusNotFound) }) opt := &ListOptions{Page: 2} ctx := context.Background() invitations, resp, err := client.Teams.ListPendingTeamInvitationsByID(ctx, 1, 2, opt) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.RemoveTeamMembershipByID returned status %d, want %d", got, want) } if invitations != nil { t.Errorf("Teams.RemoveTeamMembershipByID returned %+v, want nil", invitations) } const methodName = "ListPendingTeamInvitationsByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListPendingTeamInvitationsByID(ctx, 1, 2, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListPendingTeamInvitationsByID(ctx, 1, 2, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__ListPendingTeamInvitationsBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s/invitations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() invitations, _, err := client.Teams.ListPendingTeamInvitationsBySlug(ctx, "o", "s", opt) if err != nil { t.Errorf("Teams.ListPendingTeamInvitationsByID returned error: %v", err) } want := []*Invitation{{ID: Int64(1)}} if !cmp.Equal(invitations, want) { t.Errorf("Teams.ListPendingTeamInvitationsByID returned %+v, want %+v", invitations, want) } const methodName = "ListPendingTeamInvitationsBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListPendingTeamInvitationsBySlug(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListPendingTeamInvitationsBySlug(ctx, "o", "s", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__ListPendingTeamInvitationsBySlug_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s/invitations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) w.WriteHeader(http.StatusNotFound) }) opt := &ListOptions{Page: 2} ctx := context.Background() invitations, resp, err := client.Teams.ListPendingTeamInvitationsBySlug(ctx, "o", "s", opt) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.RemoveTeamMembershipByID returned status %d, want %d", got, want) } if invitations != nil { t.Errorf("Teams.RemoveTeamMembershipByID returned %+v, want nil", invitations) } const methodName = "ListPendingTeamInvitationsBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListPendingTeamInvitationsBySlug(ctx, "o", "s", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListPendingTeamInvitationsBySlug(ctx, "o", "s", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService__ListPendingTeamInvitationsBySlug_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Teams.ListPendingTeamInvitationsBySlug(ctx, "%", "s", nil) testURLParseError(t, err) } go-github-38.1.0/github/teams_test.go000066400000000000000000001410201410475703100174510ustar00rootroot00000000000000// Copyright 2018 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 ( "bytes" "context" "encoding/json" "fmt" "io/ioutil" "net/http" "strings" "testing" "github.com/google/go-cmp/cmp" ) func TestTeamsService_ListTeams(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() teams, _, err := client.Teams.ListTeams(ctx, "o", opt) if err != nil { t.Errorf("Teams.ListTeams returned error: %v", err) } want := []*Team{{ID: Int64(1)}} if !cmp.Equal(teams, want) { t.Errorf("Teams.ListTeams returned %+v, want %+v", teams, want) } const methodName = "ListTeams" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListTeams(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListTeams(ctx, "o", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_ListTeams_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Teams.ListTeams(ctx, "%", nil) testURLParseError(t, err) } func TestTeamsService_GetTeamByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "name":"n", "description": "d", "url":"u", "slug": "s", "permission":"p", "ldap_dn":"cn=n,ou=groups,dc=example,dc=com", "parent":null}`) }) ctx := context.Background() team, _, err := client.Teams.GetTeamByID(ctx, 1, 1) if err != nil { t.Errorf("Teams.GetTeamByID returned error: %v", err) } want := &Team{ID: Int64(1), Name: String("n"), Description: String("d"), URL: String("u"), Slug: String("s"), Permission: String("p"), LDAPDN: String("cn=n,ou=groups,dc=example,dc=com")} if !cmp.Equal(team, want) { t.Errorf("Teams.GetTeamByID returned %+v, want %+v", team, want) } const methodName = "GetTeamByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.GetTeamByID(ctx, -1, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.GetTeamByID(ctx, 1, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_GetTeamByID_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/2", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() team, resp, err := client.Teams.GetTeamByID(ctx, 1, 2) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.GetTeamByID returned status %d, want %d", got, want) } if team != nil { t.Errorf("Teams.GetTeamByID returned %+v, want nil", team) } } func TestTeamsService_GetTeamBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "name":"n", "description": "d", "url":"u", "slug": "s", "permission":"p", "ldap_dn":"cn=n,ou=groups,dc=example,dc=com", "parent":null}`) }) ctx := context.Background() team, _, err := client.Teams.GetTeamBySlug(ctx, "o", "s") if err != nil { t.Errorf("Teams.GetTeamBySlug returned error: %v", err) } want := &Team{ID: Int64(1), Name: String("n"), Description: String("d"), URL: String("u"), Slug: String("s"), Permission: String("p"), LDAPDN: String("cn=n,ou=groups,dc=example,dc=com")} if !cmp.Equal(team, want) { t.Errorf("Teams.GetTeamBySlug returned %+v, want %+v", team, want) } const methodName = "GetTeamBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.GetTeamBySlug(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.GetTeamBySlug(ctx, "o", "s") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_GetTeamBySlug_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Teams.GetTeamBySlug(ctx, "%", "s") testURLParseError(t, err) } func TestTeamsService_GetTeamBySlug_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() team, resp, err := client.Teams.GetTeamBySlug(ctx, "o", "s") if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.GetTeamBySlug returned status %d, want %d", got, want) } if team != nil { t.Errorf("Teams.GetTeamBySlug returned %+v, want nil", team) } } func TestTeamsService_CreateTeam(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := NewTeam{Name: "n", Privacy: String("closed"), RepoNames: []string{"r"}} mux.HandleFunc("/orgs/o/teams", func(w http.ResponseWriter, r *http.Request) { v := new(NewTeam) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, &input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() team, _, err := client.Teams.CreateTeam(ctx, "o", input) if err != nil { t.Errorf("Teams.CreateTeam returned error: %v", err) } want := &Team{ID: Int64(1)} if !cmp.Equal(team, want) { t.Errorf("Teams.CreateTeam returned %+v, want %+v", team, want) } const methodName = "CreateTeam" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.CreateTeam(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.CreateTeam(ctx, "o", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_CreateTeam_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Teams.CreateTeam(ctx, "%", NewTeam{}) testURLParseError(t, err) } func TestTeamsService_EditTeamByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := NewTeam{Name: "n", Privacy: String("closed")} mux.HandleFunc("/organizations/1/team/1", func(w http.ResponseWriter, r *http.Request) { v := new(NewTeam) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, &input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() team, _, err := client.Teams.EditTeamByID(ctx, 1, 1, input, false) if err != nil { t.Errorf("Teams.EditTeamByID returned error: %v", err) } want := &Team{ID: Int64(1)} if !cmp.Equal(team, want) { t.Errorf("Teams.EditTeamByID returned %+v, want %+v", team, want) } const methodName = "EditTeamByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.EditTeamByID(ctx, -1, -1, input, false) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.EditTeamByID(ctx, 1, 1, input, false) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_EditTeamByID_RemoveParent(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := NewTeam{Name: "n", Privacy: String("closed")} var body string mux.HandleFunc("/organizations/1/team/1", func(w http.ResponseWriter, r *http.Request) { v := new(NewTeam) buf, err := ioutil.ReadAll(r.Body) if err != nil { t.Errorf("Unable to read body: %v", err) } body = string(buf) json.NewDecoder(bytes.NewBuffer(buf)).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, &input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() team, _, err := client.Teams.EditTeamByID(ctx, 1, 1, input, true) if err != nil { t.Errorf("Teams.EditTeamByID returned error: %v", err) } want := &Team{ID: Int64(1)} if !cmp.Equal(team, want) { t.Errorf("Teams.EditTeamByID returned %+v, want %+v", team, want) } if want := `{"name":"n","parent_team_id":null,"privacy":"closed"}` + "\n"; body != want { t.Errorf("Teams.EditTeamByID body = %+v, want %+v", body, want) } } func TestTeamsService_EditTeamBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := NewTeam{Name: "n", Privacy: String("closed")} mux.HandleFunc("/orgs/o/teams/s", func(w http.ResponseWriter, r *http.Request) { v := new(NewTeam) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, &input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() team, _, err := client.Teams.EditTeamBySlug(ctx, "o", "s", input, false) if err != nil { t.Errorf("Teams.EditTeamBySlug returned error: %v", err) } want := &Team{ID: Int64(1)} if !cmp.Equal(team, want) { t.Errorf("Teams.EditTeamBySlug returned %+v, want %+v", team, want) } const methodName = "EditTeamBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.EditTeamBySlug(ctx, "\n", "\n", input, false) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.EditTeamBySlug(ctx, "o", "s", input, false) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_EditTeamBySlug_RemoveParent(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := NewTeam{Name: "n", Privacy: String("closed")} var body string mux.HandleFunc("/orgs/o/teams/s", func(w http.ResponseWriter, r *http.Request) { v := new(NewTeam) buf, err := ioutil.ReadAll(r.Body) if err != nil { t.Errorf("Unable to read body: %v", err) } body = string(buf) json.NewDecoder(bytes.NewBuffer(buf)).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, &input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() team, _, err := client.Teams.EditTeamBySlug(ctx, "o", "s", input, true) if err != nil { t.Errorf("Teams.EditTeam returned error: %v", err) } want := &Team{ID: Int64(1)} if !cmp.Equal(team, want) { t.Errorf("Teams.EditTeam returned %+v, want %+v", team, want) } if want := `{"name":"n","parent_team_id":null,"privacy":"closed"}` + "\n"; body != want { t.Errorf("Teams.EditTeam body = %+v, want %+v", body, want) } } func TestTeamsService_DeleteTeamByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Teams.DeleteTeamByID(ctx, 1, 1) if err != nil { t.Errorf("Teams.DeleteTeamByID returned error: %v", err) } const methodName = "DeleteTeamByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.DeleteTeamByID(ctx, -1, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.DeleteTeamByID(ctx, 1, 1) }) } func TestTeamsService_DeleteTeamBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Teams.DeleteTeamBySlug(ctx, "o", "s") if err != nil { t.Errorf("Teams.DeleteTeamBySlug returned error: %v", err) } const methodName = "DeleteTeamBySlug" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.DeleteTeamBySlug(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.DeleteTeamBySlug(ctx, "o", "s") }) } func TestTeamsService_ListChildTeamsByParentID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/2/teams", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":2}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() teams, _, err := client.Teams.ListChildTeamsByParentID(ctx, 1, 2, opt) if err != nil { t.Errorf("Teams.ListChildTeamsByParentID returned error: %v", err) } want := []*Team{{ID: Int64(2)}} if !cmp.Equal(teams, want) { t.Errorf("Teams.ListChildTeamsByParentID returned %+v, want %+v", teams, want) } const methodName = "ListChildTeamsByParentID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListChildTeamsByParentID(ctx, -1, -2, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListChildTeamsByParentID(ctx, 1, 2, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_ListChildTeamsByParentSlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s/teams", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":2}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() teams, _, err := client.Teams.ListChildTeamsByParentSlug(ctx, "o", "s", opt) if err != nil { t.Errorf("Teams.ListChildTeamsByParentSlug returned error: %v", err) } want := []*Team{{ID: Int64(2)}} if !cmp.Equal(teams, want) { t.Errorf("Teams.ListChildTeamsByParentSlug returned %+v, want %+v", teams, want) } const methodName = "ListChildTeamsByParentSlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListChildTeamsByParentSlug(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListChildTeamsByParentSlug(ctx, "o", "s", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_ListTeamReposByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/1/repos", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") wantAcceptHeaders := []string{mediaTypeTopicsPreview} testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() members, _, err := client.Teams.ListTeamReposByID(ctx, 1, 1, opt) if err != nil { t.Errorf("Teams.ListTeamReposByID returned error: %v", err) } want := []*Repository{{ID: Int64(1)}} if !cmp.Equal(members, want) { t.Errorf("Teams.ListTeamReposByID returned %+v, want %+v", members, want) } const methodName = "ListTeamReposByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListTeamReposByID(ctx, -1, -1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListTeamReposByID(ctx, 1, 1, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_ListTeamReposBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/s/repos", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") wantAcceptHeaders := []string{mediaTypeTopicsPreview} testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() members, _, err := client.Teams.ListTeamReposBySlug(ctx, "o", "s", opt) if err != nil { t.Errorf("Teams.ListTeamReposBySlug returned error: %v", err) } want := []*Repository{{ID: Int64(1)}} if !cmp.Equal(members, want) { t.Errorf("Teams.ListTeamReposBySlug returned %+v, want %+v", members, want) } const methodName = "ListTeamReposBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListTeamReposBySlug(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListTeamReposBySlug(ctx, "o", "s", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_IsTeamRepoByID_true(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") wantAcceptHeaders := []string{mediaTypeOrgPermissionRepo} testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() repo, _, err := client.Teams.IsTeamRepoByID(ctx, 1, 1, "owner", "repo") if err != nil { t.Errorf("Teams.IsTeamRepoByID returned error: %v", err) } want := &Repository{ID: Int64(1)} if !cmp.Equal(repo, want) { t.Errorf("Teams.IsTeamRepoByID returned %+v, want %+v", repo, want) } const methodName = "IsTeamRepoByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.IsTeamRepoByID(ctx, -1, -1, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.IsTeamRepoByID(ctx, 1, 1, "owner", "repo") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_IsTeamRepoBySlug_true(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/org/teams/slug/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") wantAcceptHeaders := []string{mediaTypeOrgPermissionRepo} testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() repo, _, err := client.Teams.IsTeamRepoBySlug(ctx, "org", "slug", "owner", "repo") if err != nil { t.Errorf("Teams.IsTeamRepoBySlug returned error: %v", err) } want := &Repository{ID: Int64(1)} if !cmp.Equal(repo, want) { t.Errorf("Teams.IsTeamRepoBySlug returned %+v, want %+v", repo, want) } const methodName = "IsTeamRepoBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.IsTeamRepoBySlug(ctx, "\n", "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.IsTeamRepoBySlug(ctx, "org", "slug", "owner", "repo") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_IsTeamRepoByID_false(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() repo, resp, err := client.Teams.IsTeamRepoByID(ctx, 1, 1, "owner", "repo") if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.IsTeamRepoByID returned status %d, want %d", got, want) } if repo != nil { t.Errorf("Teams.IsTeamRepoByID returned %+v, want nil", repo) } } func TestTeamsService_IsTeamRepoBySlug_false(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/org/teams/slug/repos/o/r", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() repo, resp, err := client.Teams.IsTeamRepoBySlug(ctx, "org", "slug", "owner", "repo") if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.IsTeamRepoByID returned status %d, want %d", got, want) } if repo != nil { t.Errorf("Teams.IsTeamRepoByID returned %+v, want nil", repo) } } func TestTeamsService_IsTeamRepoByID_error(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Error(w, "BadRequest", http.StatusBadRequest) }) ctx := context.Background() repo, resp, err := client.Teams.IsTeamRepoByID(ctx, 1, 1, "owner", "repo") if err == nil { t.Errorf("Expected HTTP 400 response") } if got, want := resp.Response.StatusCode, http.StatusBadRequest; got != want { t.Errorf("Teams.IsTeamRepoByID returned status %d, want %d", got, want) } if repo != nil { t.Errorf("Teams.IsTeamRepoByID returned %+v, want nil", repo) } } func TestTeamsService_IsTeamRepoBySlug_error(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/org/teams/slug/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Error(w, "BadRequest", http.StatusBadRequest) }) ctx := context.Background() repo, resp, err := client.Teams.IsTeamRepoBySlug(ctx, "org", "slug", "owner", "repo") if err == nil { t.Errorf("Expected HTTP 400 response") } if got, want := resp.Response.StatusCode, http.StatusBadRequest; got != want { t.Errorf("Teams.IsTeamRepoBySlug returned status %d, want %d", got, want) } if repo != nil { t.Errorf("Teams.IsTeamRepoBySlug returned %+v, want nil", repo) } } func TestTeamsService_IsTeamRepoByID_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Teams.IsTeamRepoByID(ctx, 1, 1, "%", "r") testURLParseError(t, err) } func TestTeamsService_IsTeamRepoBySlug_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Teams.IsTeamRepoBySlug(ctx, "o", "s", "%", "r") testURLParseError(t, err) } func TestTeamsService_AddTeamRepoByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() opt := &TeamAddTeamRepoOptions{Permission: "admin"} mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { v := new(TeamAddTeamRepoOptions) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, opt) { t.Errorf("Request body = %+v, want %+v", v, opt) } w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Teams.AddTeamRepoByID(ctx, 1, 1, "owner", "repo", opt) if err != nil { t.Errorf("Teams.AddTeamRepoByID returned error: %v", err) } const methodName = "AddTeamRepoByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.AddTeamRepoByID(ctx, 1, 1, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.AddTeamRepoByID(ctx, 1, 1, "owner", "repo", opt) }) } func TestTeamsService_AddTeamRepoBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() opt := &TeamAddTeamRepoOptions{Permission: "admin"} mux.HandleFunc("/orgs/org/teams/slug/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { v := new(TeamAddTeamRepoOptions) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, opt) { t.Errorf("Request body = %+v, want %+v", v, opt) } w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Teams.AddTeamRepoBySlug(ctx, "org", "slug", "owner", "repo", opt) if err != nil { t.Errorf("Teams.AddTeamRepoBySlug returned error: %v", err) } const methodName = "AddTeamRepoBySlug" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.AddTeamRepoBySlug(ctx, "\n", "\n", "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.AddTeamRepoBySlug(ctx, "org", "slug", "owner", "repo", opt) }) } func TestTeamsService_AddTeamRepoByID_noAccess(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") w.WriteHeader(http.StatusUnprocessableEntity) }) ctx := context.Background() _, err := client.Teams.AddTeamRepoByID(ctx, 1, 1, "owner", "repo", nil) if err == nil { t.Errorf("Expcted error to be returned") } } func TestTeamsService_AddTeamRepoBySlug_noAccess(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/org/teams/slug/repos/o/r", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") w.WriteHeader(http.StatusUnprocessableEntity) }) ctx := context.Background() _, err := client.Teams.AddTeamRepoBySlug(ctx, "org", "slug", "owner", "repo", nil) if err == nil { t.Errorf("Expcted error to be returned") } } func TestTeamsService_AddTeamRepoByID_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Teams.AddTeamRepoByID(ctx, 1, 1, "%", "r", nil) testURLParseError(t, err) } func TestTeamsService_AddTeamRepoBySlug_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Teams.AddTeamRepoBySlug(ctx, "o", "s", "%", "r", nil) testURLParseError(t, err) } func TestTeamsService_RemoveTeamRepoByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/1/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Teams.RemoveTeamRepoByID(ctx, 1, 1, "owner", "repo") if err != nil { t.Errorf("Teams.RemoveTeamRepoByID returned error: %v", err) } const methodName = "RemoveTeamRepoByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.RemoveTeamRepoByID(ctx, -1, -1, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.RemoveTeamRepoByID(ctx, 1, 1, "owner", "repo") }) } func TestTeamsService_RemoveTeamRepoBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/org/teams/slug/repos/owner/repo", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Teams.RemoveTeamRepoBySlug(ctx, "org", "slug", "owner", "repo") if err != nil { t.Errorf("Teams.RemoveTeamRepoBySlug returned error: %v", err) } const methodName = "RemoveTeamRepoBySlug" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.RemoveTeamRepoBySlug(ctx, "\n", "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.RemoveTeamRepoBySlug(ctx, "org", "slug", "owner", "repo") }) } func TestTeamsService_RemoveTeamRepoByID_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Teams.RemoveTeamRepoByID(ctx, 1, 1, "%", "r") testURLParseError(t, err) } func TestTeamsService_RemoveTeamRepoBySlug_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Teams.RemoveTeamRepoBySlug(ctx, "o", "s", "%", "r") testURLParseError(t, err) } func TestTeamsService_ListUserTeams(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/teams", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "1"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 1} ctx := context.Background() teams, _, err := client.Teams.ListUserTeams(ctx, opt) if err != nil { t.Errorf("Teams.ListUserTeams returned error: %v", err) } want := []*Team{{ID: Int64(1)}} if !cmp.Equal(teams, want) { t.Errorf("Teams.ListUserTeams returned %+v, want %+v", teams, want) } const methodName = "ListUserTeams" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListUserTeams(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_ListProjectsByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeProjectsPreview} mux.HandleFunc("/organizations/1/team/1/projects", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) fmt.Fprint(w, `[{"id":1}]`) }) ctx := context.Background() projects, _, err := client.Teams.ListTeamProjectsByID(ctx, 1, 1) if err != nil { t.Errorf("Teams.ListTeamProjectsByID returned error: %v", err) } want := []*Project{{ID: Int64(1)}} if !cmp.Equal(projects, want) { t.Errorf("Teams.ListTeamProjectsByID returned %+v, want %+v", projects, want) } const methodName = "ListTeamProjectsByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListTeamProjectsByID(ctx, -1, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListTeamProjectsByID(ctx, 1, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_ListProjectsBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeProjectsPreview} mux.HandleFunc("/orgs/o/teams/s/projects", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) fmt.Fprint(w, `[{"id":1}]`) }) ctx := context.Background() projects, _, err := client.Teams.ListTeamProjectsBySlug(ctx, "o", "s") if err != nil { t.Errorf("Teams.ListTeamProjectsBySlug returned error: %v", err) } want := []*Project{{ID: Int64(1)}} if !cmp.Equal(projects, want) { t.Errorf("Teams.ListTeamProjectsBySlug returned %+v, want %+v", projects, want) } const methodName = "ListTeamProjectsBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListTeamProjectsBySlug(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListTeamProjectsBySlug(ctx, "o", "s") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_ReviewProjectsByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeProjectsPreview} mux.HandleFunc("/organizations/1/team/1/projects/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() project, _, err := client.Teams.ReviewTeamProjectsByID(ctx, 1, 1, 1) if err != nil { t.Errorf("Teams.ReviewTeamProjectsByID returned error: %v", err) } want := &Project{ID: Int64(1)} if !cmp.Equal(project, want) { t.Errorf("Teams.ReviewTeamProjectsByID returned %+v, want %+v", project, want) } const methodName = "ReviewTeamProjectsByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ReviewTeamProjectsByID(ctx, -1, -1, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ReviewTeamProjectsByID(ctx, 1, 1, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_ReviewProjectsBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeProjectsPreview} mux.HandleFunc("/orgs/o/teams/s/projects/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() project, _, err := client.Teams.ReviewTeamProjectsBySlug(ctx, "o", "s", 1) if err != nil { t.Errorf("Teams.ReviewTeamProjectsBySlug returned error: %v", err) } want := &Project{ID: Int64(1)} if !cmp.Equal(project, want) { t.Errorf("Teams.ReviewTeamProjectsBySlug returned %+v, want %+v", project, want) } const methodName = "ReviewTeamProjectsBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ReviewTeamProjectsBySlug(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ReviewTeamProjectsBySlug(ctx, "o", "s", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_AddTeamProjectByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() opt := &TeamProjectOptions{ Permission: String("admin"), } wantAcceptHeaders := []string{mediaTypeProjectsPreview} mux.HandleFunc("/organizations/1/team/1/projects/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) v := &TeamProjectOptions{} json.NewDecoder(r.Body).Decode(v) if !cmp.Equal(v, opt) { t.Errorf("Request body = %+v, want %+v", v, opt) } w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Teams.AddTeamProjectByID(ctx, 1, 1, 1, opt) if err != nil { t.Errorf("Teams.AddTeamProjectByID returned error: %v", err) } const methodName = "AddTeamProjectByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.AddTeamProjectByID(ctx, -1, -1, -1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.AddTeamProjectByID(ctx, 1, 1, 1, opt) }) } func TestTeamsService_AddTeamProjectBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() opt := &TeamProjectOptions{ Permission: String("admin"), } wantAcceptHeaders := []string{mediaTypeProjectsPreview} mux.HandleFunc("/orgs/o/teams/s/projects/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) v := &TeamProjectOptions{} json.NewDecoder(r.Body).Decode(v) if !cmp.Equal(v, opt) { t.Errorf("Request body = %+v, want %+v", v, opt) } w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Teams.AddTeamProjectBySlug(ctx, "o", "s", 1, opt) if err != nil { t.Errorf("Teams.AddTeamProjectBySlug returned error: %v", err) } const methodName = "AddTeamProjectBySlug" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.AddTeamProjectBySlug(ctx, "\n", "\n", -1, opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.AddTeamProjectBySlug(ctx, "o", "s", 1, opt) }) } func TestTeamsService_RemoveTeamProjectByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeProjectsPreview} mux.HandleFunc("/organizations/1/team/1/projects/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Teams.RemoveTeamProjectByID(ctx, 1, 1, 1) if err != nil { t.Errorf("Teams.RemoveTeamProjectByID returned error: %v", err) } const methodName = "RemoveTeamProjectByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.RemoveTeamProjectByID(ctx, -1, -1, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.RemoveTeamProjectByID(ctx, 1, 1, 1) }) } func TestTeamsService_RemoveTeamProjectBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() wantAcceptHeaders := []string{mediaTypeProjectsPreview} mux.HandleFunc("/orgs/o/teams/s/projects/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Teams.RemoveTeamProjectBySlug(ctx, "o", "s", 1) if err != nil { t.Errorf("Teams.RemoveTeamProjectBySlug returned error: %v", err) } const methodName = "RemoveTeamProjectBySlug" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.RemoveTeamProjectBySlug(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.RemoveTeamProjectBySlug(ctx, "o", "s", 1) }) } func TestTeamsService_ListIDPGroupsInOrganization(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/team-sync/groups", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "url-encoded-next-page-token", }) fmt.Fprint(w, `{"groups": [{"group_id": "1", "group_name": "n", "group_description": "d"}]}`) }) opt := &ListCursorOptions{Page: "url-encoded-next-page-token"} ctx := context.Background() groups, _, err := client.Teams.ListIDPGroupsInOrganization(ctx, "o", opt) if err != nil { t.Errorf("Teams.ListIDPGroupsInOrganization returned error: %v", err) } want := &IDPGroupList{ Groups: []*IDPGroup{ { GroupID: String("1"), GroupName: String("n"), GroupDescription: String("d"), }, }, } if !cmp.Equal(groups, want) { t.Errorf("Teams.ListIDPGroupsInOrganization returned %+v. want %+v", groups, want) } const methodName = "ListIDPGroupsInOrganization" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListIDPGroupsInOrganization(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListIDPGroupsInOrganization(ctx, "o", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_ListIDPGroupsForTeamByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/1/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"groups": [{"group_id": "1", "group_name": "n", "group_description": "d"}]}`) }) ctx := context.Background() groups, _, err := client.Teams.ListIDPGroupsForTeamByID(ctx, 1, 1) if err != nil { t.Errorf("Teams.ListIDPGroupsForTeamByID returned error: %v", err) } want := &IDPGroupList{ Groups: []*IDPGroup{ { GroupID: String("1"), GroupName: String("n"), GroupDescription: String("d"), }, }, } if !cmp.Equal(groups, want) { t.Errorf("Teams.ListIDPGroupsForTeamByID returned %+v. want %+v", groups, want) } const methodName = "ListIDPGroupsForTeamByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListIDPGroupsForTeamByID(ctx, -1, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListIDPGroupsForTeamByID(ctx, 1, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_ListIDPGroupsForTeamBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/slug/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"groups": [{"group_id": "1", "group_name": "n", "group_description": "d"}]}`) }) ctx := context.Background() groups, _, err := client.Teams.ListIDPGroupsForTeamBySlug(ctx, "o", "slug") if err != nil { t.Errorf("Teams.ListIDPGroupsForTeamBySlug returned error: %v", err) } want := &IDPGroupList{ Groups: []*IDPGroup{ { GroupID: String("1"), GroupName: String("n"), GroupDescription: String("d"), }, }, } if !cmp.Equal(groups, want) { t.Errorf("Teams.ListIDPGroupsForTeamBySlug returned %+v. want %+v", groups, want) } const methodName = "ListIDPGroupsForTeamBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListIDPGroupsForTeamBySlug(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListIDPGroupsForTeamBySlug(ctx, "o", "slug") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_CreateOrUpdateIDPGroupConnectionsByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/1/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") fmt.Fprint(w, `{"groups": [{"group_id": "1", "group_name": "n", "group_description": "d"}]}`) }) input := IDPGroupList{ Groups: []*IDPGroup{ { GroupID: String("1"), GroupName: String("n"), GroupDescription: String("d"), }, }, } ctx := context.Background() groups, _, err := client.Teams.CreateOrUpdateIDPGroupConnectionsByID(ctx, 1, 1, input) if err != nil { t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsByID returned error: %v", err) } want := &IDPGroupList{ Groups: []*IDPGroup{ { GroupID: String("1"), GroupName: String("n"), GroupDescription: String("d"), }, }, } if !cmp.Equal(groups, want) { t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsByID returned %+v. want %+v", groups, want) } const methodName = "CreateOrUpdateIDPGroupConnectionsByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.CreateOrUpdateIDPGroupConnectionsByID(ctx, -1, -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.CreateOrUpdateIDPGroupConnectionsByID(ctx, 1, 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_CreateOrUpdateIDPGroupConnectionsBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/slug/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") fmt.Fprint(w, `{"groups": [{"group_id": "1", "group_name": "n", "group_description": "d"}]}`) }) input := IDPGroupList{ Groups: []*IDPGroup{ { GroupID: String("1"), GroupName: String("n"), GroupDescription: String("d"), }, }, } ctx := context.Background() groups, _, err := client.Teams.CreateOrUpdateIDPGroupConnectionsBySlug(ctx, "o", "slug", input) if err != nil { t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsBySlug returned error: %v", err) } want := &IDPGroupList{ Groups: []*IDPGroup{ { GroupID: String("1"), GroupName: String("n"), GroupDescription: String("d"), }, }, } if !cmp.Equal(groups, want) { t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsBySlug returned %+v. want %+v", groups, want) } const methodName = "CreateOrUpdateIDPGroupConnectionsBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.CreateOrUpdateIDPGroupConnectionsBySlug(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.CreateOrUpdateIDPGroupConnectionsBySlug(ctx, "o", "slug", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_CreateOrUpdateIDPGroupConnectionsByID_empty(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/organizations/1/team/1/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") fmt.Fprint(w, `{"groups": []}`) }) input := IDPGroupList{ Groups: []*IDPGroup{}, } ctx := context.Background() groups, _, err := client.Teams.CreateOrUpdateIDPGroupConnectionsByID(ctx, 1, 1, input) if err != nil { t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsByID returned error: %v", err) } want := &IDPGroupList{ Groups: []*IDPGroup{}, } if !cmp.Equal(groups, want) { t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsByID returned %+v. want %+v", groups, want) } } func TestTeamsService_CreateOrUpdateIDPGroupConnectionsBySlug_empty(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/slug/team-sync/group-mappings", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") fmt.Fprint(w, `{"groups": []}`) }) input := IDPGroupList{ Groups: []*IDPGroup{}, } ctx := context.Background() groups, _, err := client.Teams.CreateOrUpdateIDPGroupConnectionsBySlug(ctx, "o", "slug", input) if err != nil { t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsBySlug returned error: %v", err) } want := &IDPGroupList{ Groups: []*IDPGroup{}, } if !cmp.Equal(groups, want) { t.Errorf("Teams.CreateOrUpdateIDPGroupConnectionsBySlug returned %+v. want %+v", groups, want) } } func TestTeams_Marshal(t *testing.T) { testJSONMarshal(t, &Team{}, "{}") u := &Team{ ID: Int64(1), NodeID: String("n"), Name: String("n"), Description: String("d"), URL: String("u"), Slug: String("s"), Permission: String("p"), Privacy: String("p"), MembersCount: Int(1), ReposCount: Int(1), MembersURL: String("m"), RepositoriesURL: String("r"), Organization: &Organization{ Login: String("l"), ID: Int64(1), NodeID: String("n"), AvatarURL: String("a"), HTMLURL: String("h"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), }, Parent: &Team{ ID: Int64(1), NodeID: String("n"), Name: String("n"), Description: String("d"), URL: String("u"), Slug: String("s"), Permission: String("p"), Privacy: String("p"), MembersCount: Int(1), ReposCount: Int(1), }, LDAPDN: String("l"), } want := `{ "id": 1, "node_id": "n", "name": "n", "description": "d", "url": "u", "slug": "s", "permission": "p", "privacy": "p", "members_count": 1, "repos_count": 1, "members_url": "m", "repositories_url": "r", "organization": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "html_url": "h", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e" }, "parent": { "id": 1, "node_id": "n", "name": "n", "description": "d", "url": "u", "slug": "s", "permission": "p", "privacy": "p", "members_count": 1, "repos_count": 1 }, "ldap_dn": "l" }` testJSONMarshal(t, u, want) } go-github-38.1.0/github/timestamp.go000066400000000000000000000022211410475703100173030ustar00rootroot00000000000000// Copyright 2013 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 ( "strconv" "time" ) // Timestamp represents a time that can be unmarshalled from a JSON string // formatted as either an RFC3339 or Unix timestamp. This is necessary for some // fields since the GitHub API is inconsistent in how it represents times. All // exported methods of time.Time can be called on Timestamp. type Timestamp struct { time.Time } func (t Timestamp) String() string { return t.Time.String() } // UnmarshalJSON implements the json.Unmarshaler interface. // Time is expected in RFC3339 or Unix format. func (t *Timestamp) UnmarshalJSON(data []byte) (err error) { str := string(data) i, err := strconv.ParseInt(str, 10, 64) if err == nil { t.Time = time.Unix(i, 0) if t.Time.Year() > 3000 { t.Time = time.Unix(0, i*1e6) } } else { t.Time, err = time.Parse(`"`+time.RFC3339+`"`, str) } return } // Equal reports whether t and u are equal based on time.Equal func (t Timestamp) Equal(u Timestamp) bool { return t.Time.Equal(u.Time) } go-github-38.1.0/github/timestamp_test.go000066400000000000000000000143311410475703100203470ustar00rootroot00000000000000// Copyright 2013 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 ( "encoding/json" "fmt" "testing" "time" ) const ( emptyTimeStr = `"0001-01-01T00:00:00Z"` referenceTimeStr = `"2006-01-02T15:04:05Z"` referenceTimeStrFractional = `"2006-01-02T15:04:05.000Z"` // This format was returned by the Projects API before October 1, 2017. referenceUnixTimeStr = `1136214245` referenceUnixTimeStrMilliSeconds = `1136214245000` // Millisecond-granular timestamps were introduced in the Audit log API. ) var ( referenceTime = time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC) unixOrigin = time.Unix(0, 0).In(time.UTC) ) func TestTimestamp_Marshal(t *testing.T) { testCases := []struct { desc string data Timestamp want string wantErr bool equal bool }{ {"Reference", Timestamp{referenceTime}, referenceTimeStr, false, true}, {"Empty", Timestamp{}, emptyTimeStr, false, true}, {"Mismatch", Timestamp{}, referenceTimeStr, false, false}, } for _, tc := range testCases { out, err := json.Marshal(tc.data) if gotErr := err != nil; gotErr != tc.wantErr { t.Errorf("%s: gotErr=%v, wantErr=%v, err=%v", tc.desc, gotErr, tc.wantErr, err) } got := string(out) equal := got == tc.want if (got == tc.want) != tc.equal { t.Errorf("%s: got=%s, want=%s, equal=%v, want=%v", tc.desc, got, tc.want, equal, tc.equal) } } } func TestTimestamp_Unmarshal(t *testing.T) { testCases := []struct { desc string data string want Timestamp wantErr bool equal bool }{ {"Reference", referenceTimeStr, Timestamp{referenceTime}, false, true}, {"ReferenceUnix", referenceUnixTimeStr, Timestamp{referenceTime}, false, true}, {"ReferenceUnixMillisecond", referenceUnixTimeStrMilliSeconds, Timestamp{referenceTime}, false, true}, {"ReferenceFractional", referenceTimeStrFractional, Timestamp{referenceTime}, false, true}, {"Empty", emptyTimeStr, Timestamp{}, false, true}, {"UnixStart", `0`, Timestamp{unixOrigin}, false, true}, {"Mismatch", referenceTimeStr, Timestamp{}, false, false}, {"MismatchUnix", `0`, Timestamp{}, false, false}, {"Invalid", `"asdf"`, Timestamp{referenceTime}, true, false}, {"OffByMillisecond", `1136214245001`, Timestamp{referenceTime}, false, false}, } for _, tc := range testCases { var got Timestamp err := json.Unmarshal([]byte(tc.data), &got) if gotErr := err != nil; gotErr != tc.wantErr { t.Errorf("%s: gotErr=%v, wantErr=%v, err=%v", tc.desc, gotErr, tc.wantErr, err) continue } equal := got.Equal(tc.want) if equal != tc.equal { t.Errorf("%s: got=%#v, want=%#v, equal=%v, want=%v", tc.desc, got, tc.want, equal, tc.equal) } } } func TestTimestamp_MarshalReflexivity(t *testing.T) { testCases := []struct { desc string data Timestamp }{ {"Reference", Timestamp{referenceTime}}, {"Empty", Timestamp{}}, } for _, tc := range testCases { data, err := json.Marshal(tc.data) if err != nil { t.Errorf("%s: Marshal err=%v", tc.desc, err) } var got Timestamp err = json.Unmarshal(data, &got) if err != nil { t.Errorf("%s: Unmarshal err=%v", tc.desc, err) } if !got.Equal(tc.data) { t.Errorf("%s: %+v != %+v", tc.desc, got, data) } } } type WrappedTimestamp struct { A int Time Timestamp } func TestWrappedTimestamp_Marshal(t *testing.T) { testCases := []struct { desc string data WrappedTimestamp want string wantErr bool equal bool }{ {"Reference", WrappedTimestamp{0, Timestamp{referenceTime}}, fmt.Sprintf(`{"A":0,"Time":%s}`, referenceTimeStr), false, true}, {"Empty", WrappedTimestamp{}, fmt.Sprintf(`{"A":0,"Time":%s}`, emptyTimeStr), false, true}, {"Mismatch", WrappedTimestamp{}, fmt.Sprintf(`{"A":0,"Time":%s}`, referenceTimeStr), false, false}, } for _, tc := range testCases { out, err := json.Marshal(tc.data) if gotErr := err != nil; gotErr != tc.wantErr { t.Errorf("%s: gotErr=%v, wantErr=%v, err=%v", tc.desc, gotErr, tc.wantErr, err) } got := string(out) equal := got == tc.want if equal != tc.equal { t.Errorf("%s: got=%s, want=%s, equal=%v, want=%v", tc.desc, got, tc.want, equal, tc.equal) } } } func TestWrappedTimestamp_Unmarshal(t *testing.T) { testCases := []struct { desc string data string want WrappedTimestamp wantErr bool equal bool }{ {"Reference", referenceTimeStr, WrappedTimestamp{0, Timestamp{referenceTime}}, false, true}, {"ReferenceUnix", referenceUnixTimeStr, WrappedTimestamp{0, Timestamp{referenceTime}}, false, true}, {"ReferenceUnixMillisecond", referenceUnixTimeStrMilliSeconds, WrappedTimestamp{0, Timestamp{referenceTime}}, false, true}, {"Empty", emptyTimeStr, WrappedTimestamp{0, Timestamp{}}, false, true}, {"UnixStart", `0`, WrappedTimestamp{0, Timestamp{unixOrigin}}, false, true}, {"Mismatch", referenceTimeStr, WrappedTimestamp{0, Timestamp{}}, false, false}, {"MismatchUnix", `0`, WrappedTimestamp{0, Timestamp{}}, false, false}, {"Invalid", `"asdf"`, WrappedTimestamp{0, Timestamp{referenceTime}}, true, false}, {"OffByMillisecond", `1136214245001`, WrappedTimestamp{0, Timestamp{referenceTime}}, false, false}, } for _, tc := range testCases { var got Timestamp err := json.Unmarshal([]byte(tc.data), &got) if gotErr := err != nil; gotErr != tc.wantErr { t.Errorf("%s: gotErr=%v, wantErr=%v, err=%v", tc.desc, gotErr, tc.wantErr, err) continue } equal := got.Time.Equal(tc.want.Time.Time) if equal != tc.equal { t.Errorf("%s: got=%#v, want=%#v, equal=%v, want=%v", tc.desc, got, tc.want, equal, tc.equal) } } } func TestWrappedTimestamp_MarshalReflexivity(t *testing.T) { testCases := []struct { desc string data WrappedTimestamp }{ {"Reference", WrappedTimestamp{0, Timestamp{referenceTime}}}, {"Empty", WrappedTimestamp{0, Timestamp{}}}, } for _, tc := range testCases { bytes, err := json.Marshal(tc.data) if err != nil { t.Errorf("%s: Marshal err=%v", tc.desc, err) } var got WrappedTimestamp err = json.Unmarshal(bytes, &got) if err != nil { t.Errorf("%s: Unmarshal err=%v", tc.desc, err) } if !got.Time.Equal(tc.data.Time) { t.Errorf("%s: %+v != %+v", tc.desc, got, tc.data) } } } go-github-38.1.0/github/users.go000066400000000000000000000226351410475703100164540ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" ) // UsersService handles communication with the user related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/ type UsersService service // User represents a GitHub user. type User struct { Login *string `json:"login,omitempty"` ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` AvatarURL *string `json:"avatar_url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` GravatarID *string `json:"gravatar_id,omitempty"` Name *string `json:"name,omitempty"` Company *string `json:"company,omitempty"` Blog *string `json:"blog,omitempty"` Location *string `json:"location,omitempty"` Email *string `json:"email,omitempty"` Hireable *bool `json:"hireable,omitempty"` Bio *string `json:"bio,omitempty"` TwitterUsername *string `json:"twitter_username,omitempty"` PublicRepos *int `json:"public_repos,omitempty"` PublicGists *int `json:"public_gists,omitempty"` Followers *int `json:"followers,omitempty"` Following *int `json:"following,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` SuspendedAt *Timestamp `json:"suspended_at,omitempty"` Type *string `json:"type,omitempty"` SiteAdmin *bool `json:"site_admin,omitempty"` TotalPrivateRepos *int `json:"total_private_repos,omitempty"` OwnedPrivateRepos *int `json:"owned_private_repos,omitempty"` PrivateGists *int `json:"private_gists,omitempty"` DiskUsage *int `json:"disk_usage,omitempty"` Collaborators *int `json:"collaborators,omitempty"` TwoFactorAuthentication *bool `json:"two_factor_authentication,omitempty"` Plan *Plan `json:"plan,omitempty"` LdapDn *string `json:"ldap_dn,omitempty"` // API URLs URL *string `json:"url,omitempty"` EventsURL *string `json:"events_url,omitempty"` FollowingURL *string `json:"following_url,omitempty"` FollowersURL *string `json:"followers_url,omitempty"` GistsURL *string `json:"gists_url,omitempty"` OrganizationsURL *string `json:"organizations_url,omitempty"` ReceivedEventsURL *string `json:"received_events_url,omitempty"` ReposURL *string `json:"repos_url,omitempty"` StarredURL *string `json:"starred_url,omitempty"` SubscriptionsURL *string `json:"subscriptions_url,omitempty"` // TextMatches is only populated from search results that request text matches // See: search.go and https://docs.github.com/en/free-pro-team@latest/rest/reference/search/#text-match-metadata TextMatches []*TextMatch `json:"text_matches,omitempty"` // Permissions identifies the permissions that a user has on a given // repository. This is only populated when calling Repositories.ListCollaborators. Permissions map[string]bool `json:"permissions,omitempty"` } func (u User) String() string { return Stringify(u) } // Get fetches a user. Passing the empty string will fetch the authenticated // user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#get-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#get-a-user func (s *UsersService) Get(ctx context.Context, user string) (*User, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v", user) } else { u = "user" } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } uResp := new(User) resp, err := s.client.Do(ctx, req, uResp) if err != nil { return nil, resp, err } return uResp, resp, nil } // GetByID fetches a user. // // Note: GetByID uses the undocumented GitHub API endpoint /user/:id. func (s *UsersService) GetByID(ctx context.Context, id int64) (*User, *Response, error) { u := fmt.Sprintf("user/%d", id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } user := new(User) resp, err := s.client.Do(ctx, req, user) if err != nil { return nil, resp, err } return user, resp, nil } // Edit the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#update-the-authenticated-user func (s *UsersService) Edit(ctx context.Context, user *User) (*User, *Response, error) { u := "user" req, err := s.client.NewRequest("PATCH", u, user) if err != nil { return nil, nil, err } uResp := new(User) resp, err := s.client.Do(ctx, req, uResp) if err != nil { return nil, resp, err } return uResp, resp, nil } // HovercardOptions specifies optional parameters to the UsersService.GetHovercard // method. type HovercardOptions struct { // SubjectType specifies the additional information to be received about the hovercard. // Possible values are: organization, repository, issue, pull_request. (Required when using subject_id.) SubjectType string `url:"subject_type"` // SubjectID specifies the ID for the SubjectType. (Required when using subject_type.) SubjectID string `url:"subject_id"` } // Hovercard represents hovercard information about a user. type Hovercard struct { Contexts []*UserContext `json:"contexts,omitempty"` } // UserContext represents the contextual information about user. type UserContext struct { Message *string `json:"message,omitempty"` Octicon *string `json:"octicon,omitempty"` } // GetHovercard fetches contextual information about user. It requires authentication // via Basic Auth or via OAuth with the repo scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#get-contextual-information-for-a-user func (s *UsersService) GetHovercard(ctx context.Context, user string, opts *HovercardOptions) (*Hovercard, *Response, error) { u := fmt.Sprintf("users/%v/hovercard", user) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } hc := new(Hovercard) resp, err := s.client.Do(ctx, req, hc) if err != nil { return nil, resp, err } return hc, resp, nil } // UserListOptions specifies optional parameters to the UsersService.ListAll // method. type UserListOptions struct { // ID of the last user seen Since int64 `url:"since,omitempty"` // Note: Pagination is powered exclusively by the Since parameter, // ListOptions.Page has no effect. // ListOptions.PerPage controls an undocumented GitHub API parameter. ListOptions } // ListAll lists all GitHub users. // // To paginate through all users, populate 'Since' with the ID of the last user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#list-users func (s *UsersService) ListAll(ctx context.Context, opts *UserListOptions) ([]*User, *Response, error) { u, err := addOptions("users", opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var users []*User resp, err := s.client.Do(ctx, req, &users) if err != nil { return nil, resp, err } return users, resp, nil } // ListInvitations lists all currently-open repository invitations for the // authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#list-repository-invitations-for-the-authenticated-user func (s *UsersService) ListInvitations(ctx context.Context, opts *ListOptions) ([]*RepositoryInvitation, *Response, error) { u, err := addOptions("user/repository_invitations", opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } invites := []*RepositoryInvitation{} resp, err := s.client.Do(ctx, req, &invites) if err != nil { return nil, resp, err } return invites, resp, nil } // AcceptInvitation accepts the currently-open repository invitation for the // authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#accept-a-repository-invitation func (s *UsersService) AcceptInvitation(ctx context.Context, invitationID int64) (*Response, error) { u := fmt.Sprintf("user/repository_invitations/%v", invitationID) req, err := s.client.NewRequest("PATCH", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DeclineInvitation declines the currently-open repository invitation for the // authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/repos/#decline-a-repository-invitation func (s *UsersService) DeclineInvitation(ctx context.Context, invitationID int64) (*Response, error) { u := fmt.Sprintf("user/repository_invitations/%v", invitationID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/users_administration.go000066400000000000000000000042631410475703100215560ustar00rootroot00000000000000// 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 ( "context" "fmt" ) // PromoteSiteAdmin promotes a user to a site administrator of a GitHub Enterprise instance. // // GitHub API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#promote-an-ordinary-user-to-a-site-administrator func (s *UsersService) PromoteSiteAdmin(ctx context.Context, user string) (*Response, error) { u := fmt.Sprintf("users/%v/site_admin", user) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DemoteSiteAdmin demotes a user from site administrator of a GitHub Enterprise instance. // // GitHub API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#demote-a-site-administrator-to-an-ordinary-user func (s *UsersService) DemoteSiteAdmin(ctx context.Context, user string) (*Response, error) { u := fmt.Sprintf("users/%v/site_admin", user) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // UserSuspendOptions represents the reason a user is being suspended. type UserSuspendOptions struct { Reason *string `json:"reason,omitempty"` } // Suspend a user on a GitHub Enterprise instance. // // GitHub API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#suspend-a-user func (s *UsersService) Suspend(ctx context.Context, user string, opts *UserSuspendOptions) (*Response, error) { u := fmt.Sprintf("users/%v/suspended", user) req, err := s.client.NewRequest("PUT", u, opts) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // Unsuspend a user on a GitHub Enterprise instance. // // GitHub API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#unsuspend-a-user func (s *UsersService) Unsuspend(ctx context.Context, user string) (*Response, error) { u := fmt.Sprintf("users/%v/suspended", user) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/users_administration_test.go000066400000000000000000000072071410475703100226160ustar00rootroot00000000000000// 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 ( "context" "encoding/json" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestUsersService_PromoteSiteAdmin(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/site_admin", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Users.PromoteSiteAdmin(ctx, "u") if err != nil { t.Errorf("Users.PromoteSiteAdmin returned error: %v", err) } const methodName = "PromoteSiteAdmin" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.PromoteSiteAdmin(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.PromoteSiteAdmin(ctx, "u") }) } func TestUsersService_DemoteSiteAdmin(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/site_admin", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Users.DemoteSiteAdmin(ctx, "u") if err != nil { t.Errorf("Users.DemoteSiteAdmin returned error: %v", err) } const methodName = "DemoteSiteAdmin" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.DemoteSiteAdmin(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.DemoteSiteAdmin(ctx, "u") }) } func TestUsersService_Suspend(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/suspended", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Users.Suspend(ctx, "u", nil) if err != nil { t.Errorf("Users.Suspend returned error: %v", err) } const methodName = "Suspend" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.Suspend(ctx, "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.Suspend(ctx, "u", nil) }) } func TestUsersServiceReason_Suspend(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &UserSuspendOptions{Reason: String("test")} mux.HandleFunc("/users/u/suspended", func(w http.ResponseWriter, r *http.Request) { v := new(UserSuspendOptions) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PUT") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Users.Suspend(ctx, "u", input) if err != nil { t.Errorf("Users.Suspend returned error: %v", err) } } func TestUsersService_Unsuspend(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/suspended", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Users.Unsuspend(ctx, "u") if err != nil { t.Errorf("Users.Unsuspend returned error: %v", err) } const methodName = "Unsuspend" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.Unsuspend(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.Unsuspend(ctx, "u") }) } go-github-38.1.0/github/users_blocking.go000066400000000000000000000053711410475703100203220ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "fmt" ) // ListBlockedUsers lists all the blocked users by the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#list-users-blocked-by-the-authenticated-user func (s *UsersService) ListBlockedUsers(ctx context.Context, opts *ListOptions) ([]*User, *Response, error) { u := "user/blocks" u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeBlockUsersPreview) var blockedUsers []*User resp, err := s.client.Do(ctx, req, &blockedUsers) if err != nil { return nil, resp, err } return blockedUsers, resp, nil } // IsBlocked reports whether specified user is blocked by the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#check-if-a-user-is-blocked-by-the-authenticated-user func (s *UsersService) IsBlocked(ctx context.Context, user string) (bool, *Response, error) { u := fmt.Sprintf("user/blocks/%v", user) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return false, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeBlockUsersPreview) resp, err := s.client.Do(ctx, req, nil) isBlocked, err := parseBoolResponse(err) return isBlocked, resp, err } // BlockUser blocks specified user for the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#block-a-user func (s *UsersService) BlockUser(ctx context.Context, user string) (*Response, error) { u := fmt.Sprintf("user/blocks/%v", user) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeBlockUsersPreview) return s.client.Do(ctx, req, nil) } // UnblockUser unblocks specified user for the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#unblock-a-user func (s *UsersService) UnblockUser(ctx context.Context, user string) (*Response, error) { u := fmt.Sprintf("user/blocks/%v", user) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeBlockUsersPreview) return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/users_blocking_test.go000066400000000000000000000073071410475703100213620ustar00rootroot00000000000000// Copyright 2017 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestUsersService_ListBlockedUsers(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/blocks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeBlockUsersPreview) testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{ "login": "octocat" }]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() blockedUsers, _, err := client.Users.ListBlockedUsers(ctx, opt) if err != nil { t.Errorf("Users.ListBlockedUsers returned error: %v", err) } want := []*User{{Login: String("octocat")}} if !cmp.Equal(blockedUsers, want) { t.Errorf("Users.ListBlockedUsers returned %+v, want %+v", blockedUsers, want) } const methodName = "ListBlockedUsers" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.ListBlockedUsers(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_IsBlocked(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/blocks/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeBlockUsersPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() isBlocked, _, err := client.Users.IsBlocked(ctx, "u") if err != nil { t.Errorf("Users.IsBlocked returned error: %v", err) } if want := true; isBlocked != want { t.Errorf("Users.IsBlocked returned %+v, want %+v", isBlocked, want) } const methodName = "IsBlocked" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.IsBlocked(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.IsBlocked(ctx, "u") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_BlockUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/blocks/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Accept", mediaTypeBlockUsersPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Users.BlockUser(ctx, "u") if err != nil { t.Errorf("Users.BlockUser returned error: %v", err) } const methodName = "BlockUser" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.BlockUser(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.BlockUser(ctx, "u") }) } func TestUsersService_UnblockUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/blocks/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testHeader(t, r, "Accept", mediaTypeBlockUsersPreview) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Users.UnblockUser(ctx, "u") if err != nil { t.Errorf("Users.UnblockUser returned error: %v", err) } const methodName = "UnblockUser" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.UnblockUser(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.UnblockUser(ctx, "u") }) } go-github-38.1.0/github/users_emails.go000066400000000000000000000041121410475703100177740ustar00rootroot00000000000000// Copyright 2013 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 "context" // UserEmail represents user's email address type UserEmail struct { Email *string `json:"email,omitempty"` Primary *bool `json:"primary,omitempty"` Verified *bool `json:"verified,omitempty"` Visibility *string `json:"visibility,omitempty"` } // ListEmails lists all email addresses for the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#list-email-addresses-for-the-authenticated-user func (s *UsersService) ListEmails(ctx context.Context, opts *ListOptions) ([]*UserEmail, *Response, error) { u := "user/emails" u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var emails []*UserEmail resp, err := s.client.Do(ctx, req, &emails) if err != nil { return nil, resp, err } return emails, resp, nil } // AddEmails adds email addresses of the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#add-an-email-address-for-the-authenticated-user func (s *UsersService) AddEmails(ctx context.Context, emails []string) ([]*UserEmail, *Response, error) { u := "user/emails" req, err := s.client.NewRequest("POST", u, emails) if err != nil { return nil, nil, err } var e []*UserEmail resp, err := s.client.Do(ctx, req, &e) if err != nil { return nil, resp, err } return e, resp, nil } // DeleteEmails deletes email addresses from authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#delete-an-email-address-for-the-authenticated-user func (s *UsersService) DeleteEmails(ctx context.Context, emails []string) (*Response, error) { u := "user/emails" req, err := s.client.NewRequest("DELETE", u, emails) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/users_emails_test.go000066400000000000000000000061621410475703100210420ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestUsersService_ListEmails(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/emails", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{ "email": "user@example.com", "verified": false, "primary": true }]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() emails, _, err := client.Users.ListEmails(ctx, opt) if err != nil { t.Errorf("Users.ListEmails returned error: %v", err) } want := []*UserEmail{{Email: String("user@example.com"), Verified: Bool(false), Primary: Bool(true)}} if !cmp.Equal(emails, want) { t.Errorf("Users.ListEmails returned %+v, want %+v", emails, want) } const methodName = "ListEmails" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.ListEmails(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_AddEmails(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := []string{"new@example.com"} mux.HandleFunc("/user/emails", func(w http.ResponseWriter, r *http.Request) { var v []string json.NewDecoder(r.Body).Decode(&v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `[{"email":"old@example.com"}, {"email":"new@example.com"}]`) }) ctx := context.Background() emails, _, err := client.Users.AddEmails(ctx, input) if err != nil { t.Errorf("Users.AddEmails returned error: %v", err) } want := []*UserEmail{ {Email: String("old@example.com")}, {Email: String("new@example.com")}, } if !cmp.Equal(emails, want) { t.Errorf("Users.AddEmails returned %+v, want %+v", emails, want) } const methodName = "AddEmails" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.AddEmails(ctx, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_DeleteEmails(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := []string{"user@example.com"} mux.HandleFunc("/user/emails", func(w http.ResponseWriter, r *http.Request) { var v []string json.NewDecoder(r.Body).Decode(&v) testMethod(t, r, "DELETE") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } }) ctx := context.Background() _, err := client.Users.DeleteEmails(ctx, input) if err != nil { t.Errorf("Users.DeleteEmails returned error: %v", err) } const methodName = "DeleteEmails" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.DeleteEmails(ctx, input) }) } go-github-38.1.0/github/users_followers.go000066400000000000000000000074001410475703100205410ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" ) // ListFollowers lists the followers for a user. Passing the empty string will // fetch followers for the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#list-followers-of-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#list-followers-of-a-user func (s *UsersService) ListFollowers(ctx context.Context, user string, opts *ListOptions) ([]*User, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/followers", user) } else { u = "user/followers" } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var users []*User resp, err := s.client.Do(ctx, req, &users) if err != nil { return nil, resp, err } return users, resp, nil } // ListFollowing lists the people that a user is following. Passing the empty // string will list people the authenticated user is following. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#list-the-people-the-authenticated-user-follows // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#list-the-people-a-user-follows func (s *UsersService) ListFollowing(ctx context.Context, user string, opts *ListOptions) ([]*User, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/following", user) } else { u = "user/following" } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var users []*User resp, err := s.client.Do(ctx, req, &users) if err != nil { return nil, resp, err } return users, resp, nil } // IsFollowing checks if "user" is following "target". Passing the empty // string for "user" will check if the authenticated user is following "target". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#check-if-a-person-is-followed-by-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#check-if-a-user-follows-another-user func (s *UsersService) IsFollowing(ctx context.Context, user, target string) (bool, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/following/%v", user, target) } else { u = fmt.Sprintf("user/following/%v", target) } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return false, nil, err } resp, err := s.client.Do(ctx, req, nil) following, err := parseBoolResponse(err) return following, resp, err } // Follow will cause the authenticated user to follow the specified user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#follow-a-user func (s *UsersService) Follow(ctx context.Context, user string) (*Response, error) { u := fmt.Sprintf("user/following/%v", user) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // Unfollow will cause the authenticated user to unfollow the specified user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#unfollow-a-user func (s *UsersService) Unfollow(ctx context.Context, user string) (*Response, error) { u := fmt.Sprintf("user/following/%v", user) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/users_followers_test.go000066400000000000000000000247211410475703100216050ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestUsersService_ListFollowers_authenticatedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/followers", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() users, _, err := client.Users.ListFollowers(ctx, "", opt) if err != nil { t.Errorf("Users.ListFollowers returned error: %v", err) } want := []*User{{ID: Int64(1)}} if !cmp.Equal(users, want) { t.Errorf("Users.ListFollowers returned %+v, want %+v", users, want) } const methodName = "ListFollowers" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.ListFollowers(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.ListFollowers(ctx, "", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_ListFollowers_specifiedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/followers", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":1}]`) }) ctx := context.Background() users, _, err := client.Users.ListFollowers(ctx, "u", nil) if err != nil { t.Errorf("Users.ListFollowers returned error: %v", err) } want := []*User{{ID: Int64(1)}} if !cmp.Equal(users, want) { t.Errorf("Users.ListFollowers returned %+v, want %+v", users, want) } const methodName = "ListFollowers" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.ListFollowers(ctx, "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.ListFollowers(ctx, "u", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_ListFollowers_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Users.ListFollowers(ctx, "%", nil) testURLParseError(t, err) } func TestUsersService_ListFollowing_authenticatedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/following", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opts := &ListOptions{Page: 2} ctx := context.Background() users, _, err := client.Users.ListFollowing(ctx, "", opts) if err != nil { t.Errorf("Users.ListFollowing returned error: %v", err) } want := []*User{{ID: Int64(1)}} if !cmp.Equal(users, want) { t.Errorf("Users.ListFollowing returned %+v, want %+v", users, want) } const methodName = "ListFollowing" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.ListFollowing(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.ListFollowing(ctx, "", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_ListFollowing_specifiedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/following", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":1}]`) }) ctx := context.Background() users, _, err := client.Users.ListFollowing(ctx, "u", nil) if err != nil { t.Errorf("Users.ListFollowing returned error: %v", err) } want := []*User{{ID: Int64(1)}} if !cmp.Equal(users, want) { t.Errorf("Users.ListFollowing returned %+v, want %+v", users, want) } const methodName = "ListFollowing" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.ListFollowing(ctx, "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.ListFollowing(ctx, "u", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_ListFollowing_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Users.ListFollowing(ctx, "%", nil) testURLParseError(t, err) } func TestUsersService_IsFollowing_authenticatedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/following/t", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() following, _, err := client.Users.IsFollowing(ctx, "", "t") if err != nil { t.Errorf("Users.IsFollowing returned error: %v", err) } if want := true; following != want { t.Errorf("Users.IsFollowing returned %+v, want %+v", following, want) } const methodName = "IsFollowing" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.IsFollowing(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.IsFollowing(ctx, "", "t") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) } return resp, err }) } func TestUsersService_IsFollowing_specifiedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/following/t", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() following, _, err := client.Users.IsFollowing(ctx, "u", "t") if err != nil { t.Errorf("Users.IsFollowing returned error: %v", err) } if want := true; following != want { t.Errorf("Users.IsFollowing returned %+v, want %+v", following, want) } const methodName = "IsFollowing" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.IsFollowing(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.IsFollowing(ctx, "u", "t") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) } return resp, err }) } func TestUsersService_IsFollowing_false(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/following/t", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() following, _, err := client.Users.IsFollowing(ctx, "u", "t") if err != nil { t.Errorf("Users.IsFollowing returned error: %v", err) } if want := false; following != want { t.Errorf("Users.IsFollowing returned %+v, want %+v", following, want) } const methodName = "IsFollowing" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.IsFollowing(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.IsFollowing(ctx, "u", "t") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) } return resp, err }) } func TestUsersService_IsFollowing_error(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/following/t", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Error(w, "BadRequest", http.StatusBadRequest) }) ctx := context.Background() following, _, err := client.Users.IsFollowing(ctx, "u", "t") if err == nil { t.Errorf("Expected HTTP 400 response") } if want := false; following != want { t.Errorf("Users.IsFollowing returned %+v, want %+v", following, want) } const methodName = "IsFollowing" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.IsFollowing(ctx, "u", "t") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.IsFollowing(ctx, "u", "t") if got { t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got) } return resp, err }) } func TestUsersService_IsFollowing_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Users.IsFollowing(ctx, "%", "%") testURLParseError(t, err) } func TestUsersService_Follow(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/following/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") }) ctx := context.Background() _, err := client.Users.Follow(ctx, "u") if err != nil { t.Errorf("Users.Follow returned error: %v", err) } const methodName = "Follow" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.Follow(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.Follow(ctx, "u") }) } func TestUsersService_Follow_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Users.Follow(ctx, "%") testURLParseError(t, err) } func TestUsersService_Unfollow(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/following/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Users.Unfollow(ctx, "u") if err != nil { t.Errorf("Users.Follow returned error: %v", err) } const methodName = "Unfollow" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.Unfollow(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.Unfollow(ctx, "u") }) } func TestUsersService_Unfollow_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Users.Unfollow(ctx, "%") testURLParseError(t, err) } go-github-38.1.0/github/users_gpg_keys.go000066400000000000000000000103011410475703100203270ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "fmt" "time" ) // GPGKey represents a GitHub user's public GPG key used to verify GPG signed commits and tags. // // https://developer.github.com/changes/2016-04-04-git-signing-api-preview/ type GPGKey struct { ID *int64 `json:"id,omitempty"` PrimaryKeyID *int64 `json:"primary_key_id,omitempty"` KeyID *string `json:"key_id,omitempty"` PublicKey *string `json:"public_key,omitempty"` Emails []*GPGEmail `json:"emails,omitempty"` Subkeys []*GPGKey `json:"subkeys,omitempty"` CanSign *bool `json:"can_sign,omitempty"` CanEncryptComms *bool `json:"can_encrypt_comms,omitempty"` CanEncryptStorage *bool `json:"can_encrypt_storage,omitempty"` CanCertify *bool `json:"can_certify,omitempty"` CreatedAt *time.Time `json:"created_at,omitempty"` ExpiresAt *time.Time `json:"expires_at,omitempty"` } // String stringifies a GPGKey. func (k GPGKey) String() string { return Stringify(k) } // GPGEmail represents an email address associated to a GPG key. type GPGEmail struct { Email *string `json:"email,omitempty"` Verified *bool `json:"verified,omitempty"` } // ListGPGKeys lists the public GPG keys for a user. Passing the empty // string will fetch keys for the authenticated user. It requires authentication // via Basic Auth or via OAuth with at least read:gpg_key scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#list-gpg-keys-for-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#list-gpg-keys-for-a-user func (s *UsersService) ListGPGKeys(ctx context.Context, user string, opts *ListOptions) ([]*GPGKey, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/gpg_keys", user) } else { u = "user/gpg_keys" } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var keys []*GPGKey resp, err := s.client.Do(ctx, req, &keys) if err != nil { return nil, resp, err } return keys, resp, nil } // GetGPGKey gets extended details for a single GPG key. It requires authentication // via Basic Auth or via OAuth with at least read:gpg_key scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#get-a-gpg-key-for-the-authenticated-user func (s *UsersService) GetGPGKey(ctx context.Context, id int64) (*GPGKey, *Response, error) { u := fmt.Sprintf("user/gpg_keys/%v", id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } key := &GPGKey{} resp, err := s.client.Do(ctx, req, key) if err != nil { return nil, resp, err } return key, resp, nil } // CreateGPGKey creates a GPG key. It requires authenticatation via Basic Auth // or OAuth with at least write:gpg_key scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#create-a-gpg-key func (s *UsersService) CreateGPGKey(ctx context.Context, armoredPublicKey string) (*GPGKey, *Response, error) { gpgKey := &struct { ArmoredPublicKey string `json:"armored_public_key"` }{ArmoredPublicKey: armoredPublicKey} req, err := s.client.NewRequest("POST", "user/gpg_keys", gpgKey) if err != nil { return nil, nil, err } key := &GPGKey{} resp, err := s.client.Do(ctx, req, key) if err != nil { return nil, resp, err } return key, resp, nil } // DeleteGPGKey deletes a GPG key. It requires authentication via Basic Auth or // via OAuth with at least admin:gpg_key scope. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#delete-a-gpg-key-for-the-authenticated-user func (s *UsersService) DeleteGPGKey(ctx context.Context, id int64) (*Response, error) { u := fmt.Sprintf("user/gpg_keys/%v", id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/users_gpg_keys_test.go000066400000000000000000000117461410475703100214040ustar00rootroot00000000000000// Copyright 2016 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestUsersService_ListGPGKeys_authenticatedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/gpg_keys", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1,"primary_key_id":2}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() keys, _, err := client.Users.ListGPGKeys(ctx, "", opt) if err != nil { t.Errorf("Users.ListGPGKeys returned error: %v", err) } want := []*GPGKey{{ID: Int64(1), PrimaryKeyID: Int64(2)}} if !cmp.Equal(keys, want) { t.Errorf("Users.ListGPGKeys = %+v, want %+v", keys, want) } const methodName = "ListGPGKeys" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.ListGPGKeys(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.ListGPGKeys(ctx, "", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_ListGPGKeys_specifiedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/gpg_keys", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":1,"primary_key_id":2}]`) }) ctx := context.Background() keys, _, err := client.Users.ListGPGKeys(ctx, "u", nil) if err != nil { t.Errorf("Users.ListGPGKeys returned error: %v", err) } want := []*GPGKey{{ID: Int64(1), PrimaryKeyID: Int64(2)}} if !cmp.Equal(keys, want) { t.Errorf("Users.ListGPGKeys = %+v, want %+v", keys, want) } } func TestUsersService_ListGPGKeys_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Users.ListGPGKeys(ctx, "%", nil) testURLParseError(t, err) } func TestUsersService_GetGPGKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/gpg_keys/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() key, _, err := client.Users.GetGPGKey(ctx, 1) if err != nil { t.Errorf("Users.GetGPGKey returned error: %v", err) } want := &GPGKey{ID: Int64(1)} if !cmp.Equal(key, want) { t.Errorf("Users.GetGPGKey = %+v, want %+v", key, want) } const methodName = "GetGPGKey" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.GetGPGKey(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.GetGPGKey(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_CreateGPGKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := ` -----BEGIN PGP PUBLIC KEY BLOCK----- Comment: GPGTools - https://gpgtools.org mQINBFcEd9kBEACo54TDbGhKlXKWMvJgecEUKPPcv7XdnpKdGb3LRw5MvFwT0V0f ... =tqfb -----END PGP PUBLIC KEY BLOCK-----` mux.HandleFunc("/user/gpg_keys", func(w http.ResponseWriter, r *http.Request) { var gpgKey struct { ArmoredPublicKey *string `json:"armored_public_key,omitempty"` } json.NewDecoder(r.Body).Decode(&gpgKey) testMethod(t, r, "POST") if gpgKey.ArmoredPublicKey == nil || *gpgKey.ArmoredPublicKey != input { t.Errorf("gpgKey = %+v, want %q", gpgKey, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() gpgKey, _, err := client.Users.CreateGPGKey(ctx, input) if err != nil { t.Errorf("Users.GetGPGKey returned error: %v", err) } want := &GPGKey{ID: Int64(1)} if !cmp.Equal(gpgKey, want) { t.Errorf("Users.GetGPGKey = %+v, want %+v", gpgKey, want) } const methodName = "CreateGPGKey" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.CreateGPGKey(ctx, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_DeleteGPGKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/gpg_keys/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Users.DeleteGPGKey(ctx, 1) if err != nil { t.Errorf("Users.DeleteGPGKey returned error: %v", err) } const methodName = "DeleteGPGKey" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.DeleteGPGKey(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.DeleteGPGKey(ctx, 1) }) } go-github-38.1.0/github/users_keys.go000066400000000000000000000060301410475703100174760ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "fmt" ) // Key represents a public SSH key used to authenticate a user or deploy script. type Key struct { ID *int64 `json:"id,omitempty"` Key *string `json:"key,omitempty"` URL *string `json:"url,omitempty"` Title *string `json:"title,omitempty"` ReadOnly *bool `json:"read_only,omitempty"` Verified *bool `json:"verified,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` } func (k Key) String() string { return Stringify(k) } // ListKeys lists the verified public keys for a user. Passing the empty // string will fetch keys for the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#list-public-ssh-keys-for-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#list-public-keys-for-a-user func (s *UsersService) ListKeys(ctx context.Context, user string, opts *ListOptions) ([]*Key, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/keys", user) } else { u = "user/keys" } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var keys []*Key resp, err := s.client.Do(ctx, req, &keys) if err != nil { return nil, resp, err } return keys, resp, nil } // GetKey fetches a single public key. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#get-a-public-ssh-key-for-the-authenticated-user func (s *UsersService) GetKey(ctx context.Context, id int64) (*Key, *Response, error) { u := fmt.Sprintf("user/keys/%v", id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } key := new(Key) resp, err := s.client.Do(ctx, req, key) if err != nil { return nil, resp, err } return key, resp, nil } // CreateKey adds a public key for the authenticated user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#create-a-public-ssh-key-for-the-authenticated-user func (s *UsersService) CreateKey(ctx context.Context, key *Key) (*Key, *Response, error) { u := "user/keys" req, err := s.client.NewRequest("POST", u, key) if err != nil { return nil, nil, err } k := new(Key) resp, err := s.client.Do(ctx, req, k) if err != nil { return nil, resp, err } return k, resp, nil } // DeleteKey deletes a public key. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/users/#delete-a-public-ssh-key-for-the-authenticated-user func (s *UsersService) DeleteKey(ctx context.Context, id int64) (*Response, error) { u := fmt.Sprintf("user/keys/%v", id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-38.1.0/github/users_keys_test.go000066400000000000000000000110171410475703100205360ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestUsersService_ListKeys_authenticatedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/keys", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ListOptions{Page: 2} ctx := context.Background() keys, _, err := client.Users.ListKeys(ctx, "", opt) if err != nil { t.Errorf("Users.ListKeys returned error: %v", err) } want := []*Key{{ID: Int64(1)}} if !cmp.Equal(keys, want) { t.Errorf("Users.ListKeys returned %+v, want %+v", keys, want) } const methodName = "ListKeys" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.ListKeys(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.ListKeys(ctx, "", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_ListKeys_specifiedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/keys", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":1}]`) }) ctx := context.Background() keys, _, err := client.Users.ListKeys(ctx, "u", nil) if err != nil { t.Errorf("Users.ListKeys returned error: %v", err) } want := []*Key{{ID: Int64(1)}} if !cmp.Equal(keys, want) { t.Errorf("Users.ListKeys returned %+v, want %+v", keys, want) } } func TestUsersService_ListKeys_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Users.ListKeys(ctx, "%", nil) testURLParseError(t, err) } func TestUsersService_GetKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/keys/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() key, _, err := client.Users.GetKey(ctx, 1) if err != nil { t.Errorf("Users.GetKey returned error: %v", err) } want := &Key{ID: Int64(1)} if !cmp.Equal(key, want) { t.Errorf("Users.GetKey returned %+v, want %+v", key, want) } const methodName = "GetKey" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.GetKey(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.GetKey(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_CreateKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Key{Key: String("k"), Title: String("t")} mux.HandleFunc("/user/keys", func(w http.ResponseWriter, r *http.Request) { v := new(Key) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() key, _, err := client.Users.CreateKey(ctx, input) if err != nil { t.Errorf("Users.GetKey returned error: %v", err) } want := &Key{ID: Int64(1)} if !cmp.Equal(key, want) { t.Errorf("Users.GetKey returned %+v, want %+v", key, want) } const methodName = "CreateKey" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.CreateKey(ctx, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_DeleteKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/keys/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Users.DeleteKey(ctx, 1) if err != nil { t.Errorf("Users.DeleteKey returned error: %v", err) } const methodName = "DeleteKey" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.DeleteKey(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.DeleteKey(ctx, 1) }) } go-github-38.1.0/github/users_projects.go000066400000000000000000000036651410475703100203670ustar00rootroot00000000000000// Copyright 2019 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 ( "context" "fmt" ) // ListProjects lists the projects for the specified user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#list-user-projects func (s *UsersService) ListProjects(ctx context.Context, user string, opts *ProjectListOptions) ([]*Project, *Response, error) { u := fmt.Sprintf("users/%v/projects", user) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeProjectsPreview) var projects []*Project resp, err := s.client.Do(ctx, req, &projects) if err != nil { return nil, resp, err } return projects, resp, nil } // CreateUserProjectOptions specifies the parameters to the UsersService.CreateProject method. type CreateUserProjectOptions struct { // The name of the project. (Required.) Name string `json:"name"` // The description of the project. (Optional.) Body *string `json:"body,omitempty"` } // CreateProject creates a GitHub Project for the current user. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/projects/#create-a-user-project func (s *UsersService) CreateProject(ctx context.Context, opts *CreateUserProjectOptions) (*Project, *Response, error) { u := "user/projects" req, err := s.client.NewRequest("POST", u, opts) if err != nil { return nil, nil, err } // TODO: remove custom Accept header when this API fully launches. req.Header.Set("Accept", mediaTypeProjectsPreview) project := &Project{} resp, err := s.client.Do(ctx, req, project) if err != nil { return nil, resp, err } return project, resp, nil } go-github-38.1.0/github/users_projects_test.go000066400000000000000000000051131410475703100214140ustar00rootroot00000000000000// Copyright 2019 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestUsersService_ListProjects(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/projects", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeProjectsPreview) testFormValues(t, r, values{"state": "open", "page": "2"}) fmt.Fprint(w, `[{"id":1}]`) }) opt := &ProjectListOptions{State: "open", ListOptions: ListOptions{Page: 2}} ctx := context.Background() projects, _, err := client.Users.ListProjects(ctx, "u", opt) if err != nil { t.Errorf("Users.ListProjects returned error: %v", err) } want := []*Project{{ID: Int64(1)}} if !cmp.Equal(projects, want) { t.Errorf("Users.ListProjects returned %+v, want %+v", projects, want) } const methodName = "ListProjects" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.ListProjects(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.ListProjects(ctx, "u", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_CreateProject(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &CreateUserProjectOptions{Name: "Project Name", Body: String("Project body.")} mux.HandleFunc("/user/projects", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeProjectsPreview) v := &CreateUserProjectOptions{} json.NewDecoder(r.Body).Decode(v) if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() project, _, err := client.Users.CreateProject(ctx, input) if err != nil { t.Errorf("Users.CreateProject returned error: %v", err) } want := &Project{ID: Int64(1)} if !cmp.Equal(project, want) { t.Errorf("Users.CreateProject returned %+v, want %+v", project, want) } const methodName = "CreateProject" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.CreateProject(ctx, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-38.1.0/github/users_test.go000066400000000000000000000233551410475703100175130ustar00rootroot00000000000000// Copyright 2013 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 ( "context" "encoding/json" "fmt" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestUser_Marshal(t *testing.T) { testJSONMarshal(t, &User{}, "{}") u := &User{ Login: String("l"), ID: Int64(1), URL: String("u"), AvatarURL: String("a"), GravatarID: String("g"), Name: String("n"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(true), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, } want := `{ "login": "l", "id": 1, "avatar_url": "a", "gravatar_id": "g", "name": "n", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": true, "bio": "b", "twitter_username": "t", "public_repos": 1, "followers": 1, "following": 1, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u" }` testJSONMarshal(t, u, want) } func TestUsersService_Get_authenticatedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() user, _, err := client.Users.Get(ctx, "") if err != nil { t.Errorf("Users.Get returned error: %v", err) } want := &User{ID: Int64(1)} if !cmp.Equal(user, want) { t.Errorf("Users.Get returned %+v, want %+v", user, want) } const methodName = "Get" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.Get(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.Get(ctx, "") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_Get_specifiedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() user, _, err := client.Users.Get(ctx, "u") if err != nil { t.Errorf("Users.Get returned error: %v", err) } want := &User{ID: Int64(1)} if !cmp.Equal(user, want) { t.Errorf("Users.Get returned %+v, want %+v", user, want) } } func TestUsersService_Get_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Users.Get(ctx, "%") testURLParseError(t, err) } func TestUsersService_GetByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() user, _, err := client.Users.GetByID(ctx, 1) if err != nil { t.Fatalf("Users.GetByID returned error: %v", err) } want := &User{ID: Int64(1)} if !cmp.Equal(user, want) { t.Errorf("Users.GetByID returned %+v, want %+v", user, want) } const methodName = "GetByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.GetByID(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.GetByID(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_Edit(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &User{Name: String("n")} mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { v := new(User) json.NewDecoder(r.Body).Decode(v) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() user, _, err := client.Users.Edit(ctx, input) if err != nil { t.Errorf("Users.Edit returned error: %v", err) } want := &User{ID: Int64(1)} if !cmp.Equal(user, want) { t.Errorf("Users.Edit returned %+v, want %+v", user, want) } const methodName = "Edit" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.Edit(ctx, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_GetHovercard(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/hovercard", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"subject_type": "repository", "subject_id": "20180408"}) fmt.Fprint(w, `{"contexts": [{"message":"Owns this repository", "octicon": "repo"}]}`) }) opt := &HovercardOptions{SubjectType: "repository", SubjectID: "20180408"} ctx := context.Background() hovercard, _, err := client.Users.GetHovercard(ctx, "u", opt) if err != nil { t.Errorf("Users.GetHovercard returned error: %v", err) } want := &Hovercard{Contexts: []*UserContext{{Message: String("Owns this repository"), Octicon: String("repo")}}} if !cmp.Equal(hovercard, want) { t.Errorf("Users.GetHovercard returned %+v, want %+v", hovercard, want) } const methodName = "GetHovercard" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.GetHovercard(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.GetHovercard(ctx, "u", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_ListAll(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"since": "1", "page": "2"}) fmt.Fprint(w, `[{"id":2}]`) }) opt := &UserListOptions{1, ListOptions{Page: 2}} ctx := context.Background() users, _, err := client.Users.ListAll(ctx, opt) if err != nil { t.Errorf("Users.Get returned error: %v", err) } want := []*User{{ID: Int64(2)}} if !cmp.Equal(users, want) { t.Errorf("Users.ListAll returned %+v, want %+v", users, want) } const methodName = "ListAll" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.ListAll(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_ListInvitations(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/repository_invitations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprintf(w, `[{"id":1}, {"id":2}]`) }) ctx := context.Background() got, _, err := client.Users.ListInvitations(ctx, nil) if err != nil { t.Errorf("Users.ListInvitations returned error: %v", err) } want := []*RepositoryInvitation{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(got, want) { t.Errorf("Users.ListInvitations = %+v, want %+v", got, want) } const methodName = "ListInvitations" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.ListInvitations(ctx, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_ListInvitations_withOptions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/repository_invitations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "2", }) fmt.Fprintf(w, `[{"id":1}, {"id":2}]`) }) ctx := context.Background() _, _, err := client.Users.ListInvitations(ctx, &ListOptions{Page: 2}) if err != nil { t.Errorf("Users.ListInvitations returned error: %v", err) } } func TestUsersService_AcceptInvitation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/repository_invitations/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Users.AcceptInvitation(ctx, 1); err != nil { t.Errorf("Users.AcceptInvitation returned error: %v", err) } const methodName = "AcceptInvitation" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.AcceptInvitation(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.AcceptInvitation(ctx, 1) }) } func TestUsersService_DeclineInvitation(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/repository_invitations/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Users.DeclineInvitation(ctx, 1); err != nil { t.Errorf("Users.DeclineInvitation returned error: %v", err) } const methodName = "DeclineInvitation" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.DeclineInvitation(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.DeclineInvitation(ctx, 1) }) } go-github-38.1.0/github/with_appengine.go000066400000000000000000000007441410475703100203110ustar00rootroot00000000000000// Copyright 2017 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. //go:build appengine // +build appengine // This file provides glue for making github work on App Engine. package github import ( "context" "net/http" ) func withContext(ctx context.Context, req *http.Request) *http.Request { // No-op because App Engine adds context to a request differently. return req } go-github-38.1.0/github/without_appengine.go000066400000000000000000000006701410475703100210370ustar00rootroot00000000000000// Copyright 2017 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. //go:build !appengine // +build !appengine // This file provides glue for making github work without App Engine. package github import ( "context" "net/http" ) func withContext(ctx context.Context, req *http.Request) *http.Request { return req.WithContext(ctx) } go-github-38.1.0/go.mod000066400000000000000000000006131410475703100146000ustar00rootroot00000000000000module github.com/google/go-github/v38 require ( github.com/golang/protobuf v1.3.2 // indirect github.com/google/go-cmp v0.5.6 github.com/google/go-querystring v1.0.0 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 golang.org/x/net v0.0.0-20190311183353-d8887717615a // indirect golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be google.golang.org/appengine v1.1.0 ) go 1.16 go-github-38.1.0/go.sum000066400000000000000000000034451410475703100146330ustar00rootroot00000000000000github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= go-github-38.1.0/scrape/000077500000000000000000000000001410475703100147475ustar00rootroot00000000000000go-github-38.1.0/scrape/README.md000066400000000000000000000024331410475703100162300ustar00rootroot00000000000000[![GoDoc](https://godoc.org/github.com/google/go-github/scrape?status.svg)](https://godoc.org/github.com/google/go-github/scrape) The scrape package provides an experimental client for accessing additional GitHub data via screen scraping. It is designed to be a client of last resort for data that cannot be retrieved via the REST or GraphQL APIs. # What should be added here **Add only what you need.** Whereas the main go-github library attempts to implement the entire GitHub REST API, there is little point in trying to do that here. Certainly, feel free to contribution patches to get data you actually need, but I'd rather not try and provide exhaustive coverage of all GitHub data here. **Add only what can't be accessed elsewhere.** If the data can be retrieved through the REST or GraphQL API, use the appropriate libraries for that. **Prefer read-only access.** For now, I'm only focusing on reading data. It might be that writing works fine as well, but it is of course much riskier. # How to add methods See [apps.go](apps.go) for examples of methods that access data. Basically, fetch the contents of the page using `client.get`, and then use goquery to dig into the markup on the page. Prefer selectors that grab semantic ID or class names, as they are more likely to be stable. go-github-38.1.0/scrape/apps.go000066400000000000000000000107331410475703100162450ustar00rootroot00000000000000// Copyright 2013 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. // apps.go contains functions for accessing data about applications installed // on a GitHub organization. package scrape import ( "bytes" "encoding/json" "errors" "net/http" "strconv" "strings" "github.com/PuerkitoBio/goquery" "github.com/google/go-github/v32/github" ) // AppRestrictionsEnabled returns whether the specified organization has // restricted third-party application access. func (c *Client) AppRestrictionsEnabled(org string) (bool, error) { doc, err := c.get("/organizations/%s/settings/oauth_application_policy", org) if err != nil { return false, err } s := doc.Find(".oauth-application-whitelist svg").First() if s.Length() == 0 { return false, errors.New("unable to find expected markup") } if s.HasClass("octicon-check") { return true, nil } if s.HasClass("octicon-alert") { return false, nil } return false, errors.New("unable to find expected markup") } // ListOAuthApps lists the reviewed OAuth Applications for the // specified organization (whether approved or denied). func (c *Client) ListOAuthApps(org string) ([]OAuthApp, error) { doc, err := c.get("/organizations/%s/settings/oauth_application_policy", org) if err != nil { return nil, err } var apps []OAuthApp doc.Find(".oauth-application-whitelist ul > li").Each(func(i int, s *goquery.Selection) { var app OAuthApp app.Name = s.Find(".request-info strong").First().Text() app.Description = s.Find(".request-info .application-description").Text() if editURL, ok := s.Find(".request-indicator a.edit-link").Attr("href"); ok { app.ID = intFromLastPathSegment(editURL) } if r := s.Find(".request-indicator .requestor"); r.Length() > 0 { app.State = OAuthAppRequested app.RequestedBy = r.Text() if editURL, ok := s.Find(".request-indicator a").Last().Attr("href"); ok { app.ID = intFromLastPathSegment(editURL) } } else if r := s.Find(".request-indicator .approved-request"); r.Length() > 0 { app.State = OAuthAppApproved } else if r := s.Find(".request-indicator .denied-request"); r.Length() > 0 { app.State = OAuthAppDenied } apps = append(apps, app) }) return apps, nil } func intFromLastPathSegment(s string) int { seg := strings.Split(s, "/") if len(seg) > 0 { i, _ := strconv.Atoi(seg[len(seg)-1]) return i } return 0 } // OAuthAppReviewState indicates the current state of a requested OAuth Application. type OAuthAppReviewState int const ( // OAuthAppRequested indicates access has been requested, but not reviewed OAuthAppRequested OAuthAppReviewState = iota + 1 // OAuthAppApproved indicates access has been approved OAuthAppApproved // OAuthAppDenied indicates access has been denied OAuthAppDenied ) // OAuthApp represents an OAuth application that has been reviewed for access to organization data. type OAuthApp struct { ID int Name string Description string State OAuthAppReviewState RequestedBy string } // AppManifest represents a GitHub App manifest, used for preconfiguring // GitHub App configuration. type AppManifest struct { // The name of the GitHub App. Name *string `json:"name,omitempty"` //Required. The homepage of your GitHub App. URL *string `json:"url,omitempty"` // Required. The configuration of the GitHub App's webhook. HookAttributes map[string]string `json:"hook_attributes,omitempty"` // The full URL to redirect to after the person installs the GitHub App. RedirectURL *string `json:"redirect_url,omitempty"` // A description of the GitHub App. Description *string `json:"description,omitempty"` // Set to true when your GitHub App is available to the public or false when // it is only accessible to the owner of the app. Public *bool `json:"public,omitempty"` // The list of events the GitHub App subscribes to. DefaultEvents []string `json:"default_events,omitempty"` // The set of permissions needed by the GitHub App. DefaultPermissions *github.InstallationPermissions `json:"default_permissions,omitempty"` } // CreateApp creates a new GitHub App with the given manifest configuration. func (c *Client) CreateApp(m *AppManifest) (*http.Response, error) { u, err := c.baseURL.Parse("/settings/apps/new") if err != nil { return nil, err } body, err := json.Marshal(map[string]*AppManifest{"manifest": m}) if err != nil { return nil, err } return c.Client.Post(u.String(), "json", bytes.NewReader(body)) } go-github-38.1.0/scrape/apps_test.go000066400000000000000000000047541410475703100173120ustar00rootroot00000000000000package scrape import ( "net/http" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-github/v32/github" ) func Test_AppRestrictionsEnabled(t *testing.T) { tests := []struct { description string testFile string org string want bool }{ { description: "return true for enabled orgs", testFile: "access-restrictions-enabled.html", want: true, }, { description: "return false for disabled orgs", testFile: "access-restrictions-disabled.html", want: false, }, } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { client, mux, cleanup := setup() defer cleanup() mux.HandleFunc("/organizations/o/settings/oauth_application_policy", func(w http.ResponseWriter, r *http.Request) { copyTestFile(w, tt.testFile) }) got, err := client.AppRestrictionsEnabled("o") if err != nil { t.Errorf("AppRestrictionsEnabled returned err: %v", err) } if want := tt.want; got != want { t.Errorf("AppRestrictionsEnabled returned %t, want %t", got, want) } }) } } func Test_ListOAuthApps(t *testing.T) { client, mux, cleanup := setup() defer cleanup() mux.HandleFunc("/organizations/e/settings/oauth_application_policy", func(w http.ResponseWriter, r *http.Request) { copyTestFile(w, "access-restrictions-enabled.html") }) got, err := client.ListOAuthApps("e") if err != nil { t.Errorf("ListOAuthApps(e) returned err: %v", err) } want := []OAuthApp{ { ID: 22222, Name: "Coveralls", Description: "Test coverage history and statistics.", State: OAuthAppRequested, RequestedBy: "willnorris", }, { ID: 530107, Name: "Google Cloud Platform", State: OAuthAppApproved, }, { ID: 231424, Name: "GitKraken", Description: "An intuitive, cross-platform Git client that doesn't suck, built by @axosoft and made with @nodegit & @ElectronJS.", State: OAuthAppDenied, }, } if !cmp.Equal(got, want) { t.Errorf("ListOAuthApps(o) returned %v, want %v", got, want) } } func Test_CreateApp(t *testing.T) { client, mux, cleanup := setup() defer cleanup() mux.HandleFunc("/apps/settings/new", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusCreated) }) if _, err := client.CreateApp(&AppManifest{ URL: github.String("https://example.com"), HookAttributes: map[string]string{ "url": "https://example.com/hook", }, }); err != nil { t.Fatalf("CreateApp: %v", err) } } go-github-38.1.0/scrape/example/000077500000000000000000000000001410475703100164025ustar00rootroot00000000000000go-github-38.1.0/scrape/example/scrape/000077500000000000000000000000001410475703100176575ustar00rootroot00000000000000go-github-38.1.0/scrape/example/scrape/main.go000066400000000000000000000030071410475703100211320ustar00rootroot00000000000000// The scrape tool demonstrates use of the github.com/google/go-github/scrape // package to fetch data from GitHub. The tool lists whether third-party app // restrictions are enabled for an organization, and lists information about // OAuth apps requested for the org. package main import ( "bufio" "flag" "fmt" "log" "os" "strings" "github.com/google/go-github/scrape" ) var ( username = flag.String("username", "", "github auth: username") password = flag.String("password", "", "github auth: password") otpseed = flag.String("otpseed", "", "github auth: otp seed") org = flag.String("org", "", "github org to get data for") ) func main() { flag.Parse() // prompt for password and otpseed in case the user didn't want to specify as flags reader := bufio.NewReader(os.Stdin) if *password == "" { fmt.Print("password: ") *password, _ = reader.ReadString('\n') *password = strings.TrimSpace(*password) } if *otpseed == "" { fmt.Print("OTP seed: ") *otpseed, _ = reader.ReadString('\n') *otpseed = strings.TrimSpace(*otpseed) } client := scrape.NewClient(nil) if err := client.Authenticate(*username, *password, *otpseed); err != nil { log.Fatal(err) } enabled, err := client.AppRestrictionsEnabled(*org) if err != nil { log.Fatal(err) } fmt.Printf("App restrictions enabled for %q: %t\n", *org, enabled) apps, err := client.ListOAuthApps(*org) if err != nil { log.Fatal(err) } fmt.Printf("OAuth apps for %q: \n", *org) for _, app := range apps { fmt.Printf("\t%+v\n", app) } } go-github-38.1.0/scrape/forms.go000066400000000000000000000065051410475703100164320ustar00rootroot00000000000000// Copyright 2013 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. // forms.go contains logic for parsing and submitting HTML forms. None of this // is specific to go-github in any way, and could easily be pulled out into a // general purpose scraping library in the future. package scrape import ( "fmt" "net/http" "net/url" "strings" "github.com/PuerkitoBio/goquery" "golang.org/x/net/html" ) // htmlForm represents the basic elements of an HTML Form. type htmlForm struct { // Action is the URL where the form will be submitted Action string // Method is the HTTP method to use when submitting the form Method string // Values contains form values to be submitted Values url.Values } // parseForms parses and returns all form elements beneath node. Form values // include all input and textarea elements within the form. The values of radio // and checkbox inputs are included only if they are checked. // // In the future, we might want to allow a custom selector to be passed in to // further restrict what forms will be returned. func parseForms(node *html.Node) (forms []htmlForm) { if node == nil { return nil } doc := goquery.NewDocumentFromNode(node) doc.Find("form").Each(func(_ int, s *goquery.Selection) { form := htmlForm{Values: url.Values{}} form.Action, _ = s.Attr("action") form.Method, _ = s.Attr("method") s.Find("input").Each(func(_ int, s *goquery.Selection) { name, _ := s.Attr("name") if name == "" { return } typ, _ := s.Attr("type") typ = strings.ToLower(typ) _, checked := s.Attr("checked") if (typ == "radio" || typ == "checkbox") && !checked { return } value, _ := s.Attr("value") form.Values.Add(name, value) }) s.Find("textarea").Each(func(_ int, s *goquery.Selection) { name, _ := s.Attr("name") if name == "" { return } value := s.Text() form.Values.Add(name, value) }) forms = append(forms, form) }) return forms } // fetchAndSubmitForm will fetch the page at urlStr, then parse and submit the first form found. // setValues will be called with the parsed form values, allowing the caller to set any custom // form values. Form submission will always use the POST method, regardless of the value of the // method attribute in the form. The response from submitting the parsed form is returned. func fetchAndSubmitForm(client *http.Client, urlStr string, setValues func(url.Values)) (*http.Response, error) { resp, err := client.Get(urlStr) if err != nil { return nil, fmt.Errorf("error fetching url %q: %v", urlStr, err) } defer resp.Body.Close() root, err := html.Parse(resp.Body) if err != nil { return nil, fmt.Errorf("error parsing response: %v", err) } forms := parseForms(root) if len(forms) == 0 { return nil, fmt.Errorf("no forms found at %q", urlStr) } form := forms[0] actionURL, err := url.Parse(form.Action) if err != nil { return nil, fmt.Errorf("error parsing form action URL %q: %v", form.Action, err) } actionURL = resp.Request.URL.ResolveReference(actionURL) // allow caller to fill out the form if setValues != nil { setValues(form.Values) } resp, err = client.PostForm(actionURL.String(), form.Values) if err != nil { return nil, fmt.Errorf("error posting form: %v", err) } return resp, nil } go-github-38.1.0/scrape/forms_test.go000066400000000000000000000061101410475703100174610ustar00rootroot00000000000000package scrape import ( "fmt" "net/http" "net/url" "strings" "testing" "github.com/google/go-cmp/cmp" "golang.org/x/net/html" ) func Test_ParseForms(t *testing.T) { tests := []struct { description string html string forms []htmlForm }{ {"no forms", ``, nil}, {"empty form", `
`, []htmlForm{{Values: url.Values{}}}}, { "single form with one value", `
`, []htmlForm{{Action: "a", Method: "m", Values: url.Values{"n1": {"v1"}}}}, }, { "two forms", `
`, []htmlForm{ {Action: "a1", Method: "m1", Values: url.Values{"n1": {"v1"}}}, {Action: "a2", Method: "m2", Values: url.Values{"n2": {"v2"}}}, }, }, { "form with radio buttons (none checked)", `
`, []htmlForm{{Values: url.Values{}}}, }, { "form with radio buttons", `
`, []htmlForm{{Values: url.Values{"n1": {"v3"}}}}, }, { "form with checkboxes", `
`, []htmlForm{{Values: url.Values{"n1": {"v1"}, "n3": {"v3"}}}}, }, { "single form with textarea", `
`, []htmlForm{{Values: url.Values{"n1": {"v1"}}}}, }, } for _, tt := range tests { t.Run(tt.description, func(t *testing.T) { node, err := html.Parse(strings.NewReader(tt.html)) if err != nil { t.Errorf("error parsing html: %v", err) } if got, want := parseForms(node), tt.forms; !cmp.Equal(got, want) { t.Errorf("parseForms(%q) returned %+v, want %+v", tt.html, got, want) } }) } } func Test_FetchAndSumbitForm(t *testing.T) { client, mux, cleanup := setup() defer cleanup() var submitted bool mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, `
`) }) mux.HandleFunc("/submit", func(w http.ResponseWriter, r *http.Request) { r.ParseForm() want := url.Values{"hidden": {"h"}, "name": {"n"}} if got := r.Form; !cmp.Equal(got, want) { t.Errorf("submitted form contained values %v, want %v", got, want) } submitted = true }) setValues := func(values url.Values) { values.Set("name", "n") } fetchAndSubmitForm(client.Client, client.baseURL.String()+"/", setValues) if !submitted { t.Error("form was never submitted") } } go-github-38.1.0/scrape/go.mod000066400000000000000000000004371410475703100160610ustar00rootroot00000000000000module github.com/google/go-github/scrape go 1.13 require ( github.com/PuerkitoBio/goquery v1.5.0 github.com/google/go-cmp v0.3.1 github.com/google/go-github/v32 v32.1.0 github.com/xlzd/gotp v0.0.0-20181030022105-c8557ba2c119 golang.org/x/net v0.0.0-20191014212845-da9a3fd4c582 ) go-github-38.1.0/scrape/go.sum000066400000000000000000000044251410475703100161070ustar00rootroot00000000000000github.com/PuerkitoBio/goquery v1.5.0 h1:uGvmFXOA73IKluu/F84Xd1tt/z07GYm8X49XKHP7EJk= github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg= github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o= github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-github/v32 v32.1.0 h1:GWkQOdXqviCPx7Q7Fj+KyPoGm4SwHRh8rheoPhd27II= github.com/google/go-github/v32 v32.1.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/xlzd/gotp v0.0.0-20181030022105-c8557ba2c119 h1:YyPWX3jLOtYKulBR6AScGIs74lLrJcgeKRwcbAuQOG4= github.com/xlzd/gotp v0.0.0-20181030022105-c8557ba2c119/go.mod h1:/nuTSlK+okRfR/vnIPqR89fFKonnWPiZymN5ydRJkX8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20191014212845-da9a3fd4c582 h1:p9xBe/w/OzkeYVKm234g55gMdD1nSIooTir5kV11kfA= golang.org/x/net v0.0.0-20191014212845-da9a3fd4c582/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= go-github-38.1.0/scrape/payment.go000066400000000000000000000024521410475703100167560ustar00rootroot00000000000000// Copyright 2013 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. // apps.go contains functions for accessing data about applications installed // on a GitHub organization. package scrape import ( "strings" "github.com/PuerkitoBio/goquery" ) // OrgPaymentInformation returns payment information for the specified org. func (c *Client) OrgPaymentInformation(org string) (PaymentInformation, error) { var info PaymentInformation doc, err := c.get("/organizations/%s/settings/billing/payment_information", org) if err != nil { return info, err } doc.Find("main h4.mb-1").Each(func(i int, s *goquery.Selection) { name := strings.TrimSpace(strings.ToLower(s.Text())) value := strings.Join(strings.Fields(strings.TrimSpace(s.NextFiltered("p").Text())), " ") switch name { case "payment method": info.PaymentMethod = value case "last payment": info.LastPayment = value case "coupon": info.Coupon = value case "extra information": info.ExtraInformation = value } }) return info, nil } // PaymentInformation for an organization on a paid plan. type PaymentInformation struct { PaymentMethod string LastPayment string Coupon string ExtraInformation string } go-github-38.1.0/scrape/scrape.go000066400000000000000000000111011410475703100165450ustar00rootroot00000000000000// Copyright 2013 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 scrape provides a client for interacting with GitHub using screen // scraping. // // This is intended to be used as a supplement to the standard go-github // library to access data that is not currently exposed by either the official // REST or GraphQL APIs. // // Because of the nature of screen scraping, this package should be treated as // HIGHLY EXPERIMENTAL, and potentially unstable. We make no promises relating // to compatibility or stability of the exported API. Even though this package // is distributed as part of the go-github library, it is explicitly exempt // from any stability promises that my be implied by the library version // number. package scrape import ( "bytes" "encoding/gob" "fmt" "log" "net/http" "net/http/cookiejar" "net/url" "strings" "github.com/PuerkitoBio/goquery" "github.com/xlzd/gotp" "golang.org/x/net/publicsuffix" ) var defaultBaseURL = "https://github.com/" // Client is a GitHub scraping client. type Client struct { *http.Client // base URL for github.com pages. Exposed primarily for testing. Also // used for saving and restoring cookies on the Client. baseURL *url.URL } // NewClient constructs a new Client. If transport is nil, a default transport is used. func NewClient(transport http.RoundTripper) *Client { jar, err := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List}) if err != nil { log.Fatalf("error creating cookiejar: %v", err) } baseURL, _ := url.Parse(defaultBaseURL) return &Client{ Client: &http.Client{ Transport: transport, Jar: jar, }, baseURL: baseURL, } } // SaveCookies returns an encoded form of the github.com cookies set on this // client. If Authenticate() has been called, this should include the // github.com session cookie. These cookies can be loaded onto a new client by // calling LoadCookies. // // GitHub session cookies are bearer tokens that are not tied to any particular // client, so should be treated with the same sensitivity as the account // credentials. func (c *Client) SaveCookies() ([]byte, error) { cookies := c.Client.Jar.Cookies(c.baseURL) var b bytes.Buffer err := gob.NewEncoder(&b).Encode(cookies) return b.Bytes(), err } // LoadCookies loads the provided cookies for github.com. func (c *Client) LoadCookies(v []byte) error { var cookies []*http.Cookie r := bytes.NewReader(v) err := gob.NewDecoder(r).Decode(&cookies) if err != nil { return err } c.Client.Jar.SetCookies(c.baseURL, cookies) return nil } // get fetches a urlStr (a GitHub URL relative to the client's baseURL), and // returns the parsed response document. func (c *Client) get(urlStr string, a ...interface{}) (*goquery.Document, error) { u, err := c.baseURL.Parse(fmt.Sprintf(urlStr, a...)) if err != nil { return nil, fmt.Errorf("error parsing URL: %q: %v", urlStr, err) } resp, err := c.Client.Get(u.String()) if err != nil { return nil, fmt.Errorf("error fetching url %q: %v", u, err) } if resp.StatusCode == http.StatusNotFound { return nil, fmt.Errorf("received %v response fetching URL %q", resp.StatusCode, u) } defer resp.Body.Close() doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { return nil, fmt.Errorf("error parsing response: %v", err) } return doc, nil } // Authenticate client to GitHub with the provided username, password, and if // two-factor auth is enabled for the account, otpseed. // // otpseed is the OTP Secret provided from GitHub as part of two-factor // application enrollment. When registering the application, click the "enter // this text code" link on the QR Code page to see the raw OTP Secret. func (c *Client) Authenticate(username, password, otpseed string) error { setPassword := func(values url.Values) { values.Set("login", username) values.Set("password", password) } resp, err := fetchAndSubmitForm(c.Client, "https://github.com/login", setPassword) if err != nil { return err } if resp.StatusCode != http.StatusOK { return fmt.Errorf("received %v response submitting login form", resp.StatusCode) } if otpseed == "" { return nil } setOTP := func(values url.Values) { otp := gotp.NewDefaultTOTP(strings.ToUpper(otpseed)).Now() values.Set("otp", otp) } resp, err = fetchAndSubmitForm(c.Client, "https://github.com/sessions/two-factor", setOTP) if err != nil { return err } if resp.StatusCode != http.StatusOK { return fmt.Errorf("received %v response submitting otp form", resp.StatusCode) } return nil } go-github-38.1.0/scrape/scrape_test.go000066400000000000000000000013311410475703100176100ustar00rootroot00000000000000package scrape import ( "io" "net/http" "net/http/httptest" "net/url" "os" ) // setup a test HTTP server along with a scrape.Client that is configured to // talk to that test server. Tests should register handlers on the mux which // provide mock responses for the GitHub pages being tested. func setup() (client *Client, mux *http.ServeMux, cleanup func()) { mux = http.NewServeMux() server := httptest.NewServer(mux) client = NewClient(nil) client.baseURL, _ = url.Parse(server.URL + "/") return client, mux, server.Close } func copyTestFile(w io.Writer, filename string) error { f, err := os.Open("testdata/" + filename) if err != nil { return err } defer f.Close() _, err = io.Copy(w, f) return err } go-github-38.1.0/scrape/testdata/000077500000000000000000000000001410475703100165605ustar00rootroot00000000000000go-github-38.1.0/scrape/testdata/access-restrictions-disabled.html000066400000000000000000000044141410475703100252050ustar00rootroot00000000000000

Third-party application access policy

Policy: No restrictions

All applications authorized by organization members have access to google-test’s data.

Setup application access restrictions

When authorized, applications can act on behalf of organization members. Your access policy determines which applications can access data in your organization. Read more about third-party access and organizations.

go-github-38.1.0/scrape/testdata/access-restrictions-enabled.html000066400000000000000000000171211410475703100250270ustar00rootroot00000000000000

Third-party application access policy

Policy: Access restricted

Only approved applications can access data in this organization. Applications owned by google-test always have access.

Remove restrictions

Are you sure?

You’re about to remove all third-party application restrictions. Please read this carefully.

Removing third-party application restrictions will immediately give member authorized applications access to private data in the google-test organization.

Please be sure you want to do this.

  • Approval requested by willnorrisReview
    Coveralls Test coverage history and statistics.
  • Approved Google Cloud Platform
  • Denied GitKraken An intuitive, cross-platform Git client that doesn't suck, built by @axosoft and made with @nodegit & @ElectronJS.

When authorized, applications can act on behalf of organization members. Your access policy determines which applications can access data in your organization. Read more about third-party access and organizations.

go-github-38.1.0/test/000077500000000000000000000000001410475703100144515ustar00rootroot00000000000000go-github-38.1.0/test/README.md000066400000000000000000000052341410475703100157340ustar00rootroot00000000000000go-github tests =============== This directory contains additional test suites beyond the unit tests already in [../github](../github). Whereas the unit tests run very quickly (since they don't make any network calls) and are run by Travis on every commit, the tests in this directory are only run manually. The test packages are: integration ----------- This will exercise the entire go-github library (or at least as much as is practical) against the live GitHub API. These tests will verify that the library is properly coded against the actual behavior of the API, and will (hopefully) fail upon any incompatible change in the API. Because these tests are running using live data, there is a much higher probability of false positives in test failures due to network issues, test data having been changed, etc. These tests send real network traffic to the GitHub API and will exhaust the default unregistered rate limit (60 requests per hour) very quickly. Additionally, in order to test the methods that modify data, a real OAuth token will need to be present. While the tests will try to be well-behaved in terms of what data they modify, it is **strongly** recommended that these tests only be run using a dedicated test account. Run tests using: GITHUB_AUTH_TOKEN=XXX go test -v -tags=integration ./integration Additionally there are a set of integration tests for the Authorizations API. These tests require a GitHub user (username and password), and also that a [GitHub Application](https://github.com/settings/applications/new) (with attendant Client ID and Client Secret) be available. Then, to execute just the Authorization tests: GITHUB_USERNAME='' GITHUB_PASSWORD='' GITHUB_CLIENT_ID='' GITHUB_CLIENT_SECRET='' go test -v -tags=integration -run=Authorizations ./integration If some or all of these environment variables are not available, certain of the Authorization integration tests will be skipped. fields ------ This will identify the fields being returned by the live GitHub API that are not currently being mapped into the relevant Go data type. Sometimes fields are deliberately not mapped, so the results of this tool should just be taken as a hint. This test sends real network traffic to the GitHub API and will exhaust the default unregistered rate limit (60 requests per hour) very quickly. Additionally, some data is only returned for authenticated API calls. Unlike the integration tests above, these tests only read data, so it's less imperative that these be run using a dedicated test account (though you still really should). Run the fields tool using: GITHUB_AUTH_TOKEN=XXX go run ./fields/fields.go go-github-38.1.0/test/fields/000077500000000000000000000000001410475703100157175ustar00rootroot00000000000000go-github-38.1.0/test/fields/fields.go000066400000000000000000000071601410475703100175200ustar00rootroot00000000000000// 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. // This tool tests for the JSON mappings in the go-github data types. It will // identify fields that are returned by the live GitHub API, but that are not // currently mapped into a struct field of the relevant go-github type. This // helps to ensure that all relevant data returned by the API is being made // accessible, particularly new fields that are periodically (and sometimes // quietly) added to the API over time. // // These tests simply aid in identifying which fields aren't being mapped; it // is not necessarily true that every one of them should always be mapped. // Some fields may be undocumented for a reason, either because they aren't // actually used yet or should not be relied upon. package main import ( "context" "encoding/json" "flag" "fmt" "os" "reflect" "strings" "github.com/google/go-github/v38/github" "golang.org/x/oauth2" ) var ( client *github.Client // auth indicates whether tests are being run with an OAuth token. // Tests can use this flag to skip certain tests when run without auth. auth bool skipURLs = flag.Bool("skip_urls", false, "skip url fields") ) func main() { flag.Parse() token := os.Getenv("GITHUB_AUTH_TOKEN") if token == "" { print("!!! No OAuth token. Some tests won't run. !!!\n\n") client = github.NewClient(nil) } else { tc := oauth2.NewClient(context.Background(), oauth2.StaticTokenSource( &oauth2.Token{AccessToken: token}, )) client = github.NewClient(tc) auth = true } for _, tt := range []struct { url string typ interface{} }{ //{"rate_limit", &github.RateLimits{}}, {"users/octocat", &github.User{}}, {"user", &github.User{}}, {"users/willnorris/keys", &[]github.Key{}}, {"orgs/google-test", &github.Organization{}}, {"repos/google/go-github", &github.Repository{}}, {"repos/google/go-github/issues/1", &github.Issue{}}, {"/gists/9257657", &github.Gist{}}, } { err := testType(tt.url, tt.typ) if err != nil { fmt.Printf("error: %v\n", err) } } } // testType fetches the JSON resource at urlStr and compares its keys to the // struct fields of typ. func testType(urlStr string, typ interface{}) error { slice := reflect.Indirect(reflect.ValueOf(typ)).Kind() == reflect.Slice req, err := client.NewRequest("GET", urlStr, nil) if err != nil { return err } // start with a json.RawMessage so we can decode multiple ways below raw := new(json.RawMessage) _, err = client.Do(context.Background(), req, raw) if err != nil { return err } // unmarshal directly to a map var m1 map[string]interface{} if slice { var s []map[string]interface{} err = json.Unmarshal(*raw, &s) if err != nil { return err } m1 = s[0] } else { err = json.Unmarshal(*raw, &m1) if err != nil { return err } } // unmarshal to typ first, then re-marshal and unmarshal to a map err = json.Unmarshal(*raw, typ) if err != nil { return err } var byt []byte if slice { // use first item in slice v := reflect.Indirect(reflect.ValueOf(typ)) byt, err = json.Marshal(v.Index(0).Interface()) if err != nil { return err } } else { byt, err = json.Marshal(typ) if err != nil { return err } } var m2 map[string]interface{} err = json.Unmarshal(byt, &m2) if err != nil { return err } // now compare the two maps for k, v := range m1 { if *skipURLs && strings.HasSuffix(k, "_url") { continue } if _, ok := m2[k]; !ok { fmt.Printf("%v missing field for key: %v (example value: %v)\n", reflect.TypeOf(typ), k, v) } } return nil } go-github-38.1.0/test/integration/000077500000000000000000000000001410475703100167745ustar00rootroot00000000000000go-github-38.1.0/test/integration/activity_test.go000066400000000000000000000100531410475703100222150ustar00rootroot00000000000000// 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. //go:build integration // +build integration package integration import ( "context" "testing" "github.com/google/go-github/v38/github" ) const ( owner = "google" repo = "go-github" ) func TestActivity_Starring(t *testing.T) { stargazers, _, err := client.Activity.ListStargazers(context.Background(), owner, repo, nil) if err != nil { t.Fatalf("Activity.ListStargazers returned error: %v", err) } if len(stargazers) == 0 { t.Errorf("Activity.ListStargazers(%q, %q) returned no stargazers", owner, repo) } // the rest of the tests requires auth if !checkAuth("TestActivity_Starring") { return } // first, check if already starred the target repository star, _, err := client.Activity.IsStarred(context.Background(), owner, repo) if err != nil { t.Fatalf("Activity.IsStarred returned error: %v", err) } if star { t.Fatalf("Already starring %v/%v. Please manually unstar it first.", owner, repo) } // star the target repository _, err = client.Activity.Star(context.Background(), owner, repo) if err != nil { t.Fatalf("Activity.Star returned error: %v", err) } // check again and verify starred star, _, err = client.Activity.IsStarred(context.Background(), owner, repo) if err != nil { t.Fatalf("Activity.IsStarred returned error: %v", err) } if !star { t.Fatalf("Not starred %v/%v after starring it.", owner, repo) } // unstar _, err = client.Activity.Unstar(context.Background(), owner, repo) if err != nil { t.Fatalf("Activity.Unstar returned error: %v", err) } // check again and verify not watching star, _, err = client.Activity.IsStarred(context.Background(), owner, repo) if err != nil { t.Fatalf("Activity.IsStarred returned error: %v", err) } if star { t.Fatalf("Still starred %v/%v after unstarring it.", owner, repo) } } func deleteSubscription(t *testing.T) { // delete subscription _, err := client.Activity.DeleteRepositorySubscription(context.Background(), owner, repo) if err != nil { t.Fatalf("Activity.DeleteRepositorySubscription returned error: %v", err) } // check again and verify not watching sub, _, err := client.Activity.GetRepositorySubscription(context.Background(), owner, repo) if err != nil { t.Fatalf("Activity.GetRepositorySubscription returned error: %v", err) } if sub != nil { t.Fatalf("Still watching %v/%v after deleting subscription.", owner, repo) } } func createSubscription(t *testing.T) { // watch the target repository sub := &github.Subscription{Subscribed: github.Bool(true)} _, _, err := client.Activity.SetRepositorySubscription(context.Background(), owner, repo, sub) if err != nil { t.Fatalf("Activity.SetRepositorySubscription returned error: %v", err) } // check again and verify watching sub, _, err = client.Activity.GetRepositorySubscription(context.Background(), owner, repo) if err != nil { t.Fatalf("Activity.GetRepositorySubscription returned error: %v", err) } if sub == nil || !*sub.Subscribed { t.Fatalf("Not watching %v/%v after setting subscription.", owner, repo) } } func TestActivity_Watching(t *testing.T) { watchers, _, err := client.Activity.ListWatchers(context.Background(), owner, repo, nil) if err != nil { t.Fatalf("Activity.ListWatchers returned error: %v", err) } if len(watchers) == 0 { t.Errorf("Activity.ListWatchers(%q, %q) returned no watchers", owner, repo) } // the rest of the tests requires auth if !checkAuth("TestActivity_Watching") { return } // first, check if already watching the target repository sub, _, err := client.Activity.GetRepositorySubscription(context.Background(), owner, repo) if err != nil { t.Fatalf("Activity.GetRepositorySubscription returned error: %v", err) } switch { case sub != nil: // If already subscribing, delete then recreate subscription. deleteSubscription(t) createSubscription(t) case sub == nil: // Otherwise, create subscription and then delete it. createSubscription(t) deleteSubscription(t) } } go-github-38.1.0/test/integration/audit_log_test.go000066400000000000000000000015561410475703100223400ustar00rootroot00000000000000// Copyright 2021 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. //go:build integration // +build integration package integration import ( "context" "testing" ) // TestOrganizationAuditLog test that the client can read an org's audit log // Note: Org must be part of an enterprise // Test requires auth - set env var GITHUB_AUTH_TOKEN func TestOrganizationAuditLog(t *testing.T) { org := "example_org" entries, _, err := client.Organizations.GetAuditLog(context.Background(), org, nil) if err != nil { t.Fatalf("Organizations.GetAuditLog returned error: %v", err) } if len(entries) == 0 { t.Errorf("No AuditLog events returned for org") } for _, e := range entries { t.Log(e.GetAction(), e.GetActor(), e.GetTimestamp(), e.GetUser(), e.GetActive()) } } go-github-38.1.0/test/integration/authorizations_test.go000066400000000000000000000156361410475703100234600ustar00rootroot00000000000000// Copyright 2016 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. //go:build integration // +build integration package integration import ( "context" "math/rand" "os" "strconv" "strings" "testing" "time" "github.com/google/go-github/v38/github" ) const msgEnvMissing = "Skipping test because the required environment variable (%v) is not present." const envKeyGitHubUsername = "GITHUB_USERNAME" const envKeyGitHubPassword = "GITHUB_PASSWORD" const envKeyClientID = "GITHUB_CLIENT_ID" const envKeyClientSecret = "GITHUB_CLIENT_SECRET" const envKeyAccessToken = "GITHUB_ACCESS_TOKEN" const InvalidTokenValue = "iamnotacroken" // TestAuthorizationsAppOperations tests the application/token related operations, such // as creating, testing, resetting and revoking application OAuth tokens. func TestAuthorizationsAppOperations(t *testing.T) { appAuthenticatedClient := getOAuthAppClient(t) // We know these vars are set because getOAuthAppClient would have // skipped the test by now clientID := os.Getenv(envKeyClientID) accessToken := os.Getenv(envKeyAccessToken) // Verify the token appAuth, resp, err := appAuthenticatedClient.Authorizations.Check(context.Background(), clientID, accessToken) failOnError(t, err) failIfNotStatusCode(t, resp, 200) // Quick sanity check if *appAuth.Token != accessToken { t.Fatal("The returned auth/token does not match.") } // Let's verify that we get a 404 for a non-existent token _, resp, err = appAuthenticatedClient.Authorizations.Check(context.Background(), clientID, InvalidTokenValue) if err == nil { t.Fatal("An error should have been returned because of the invalid token.") } failIfNotStatusCode(t, resp, 404) // Let's reset the token resetAuth, resp, err := appAuthenticatedClient.Authorizations.Reset(context.Background(), clientID, accessToken) failOnError(t, err) failIfNotStatusCode(t, resp, 200) // Let's verify that we get a 404 for a non-existent token _, resp, err = appAuthenticatedClient.Authorizations.Reset(context.Background(), clientID, InvalidTokenValue) if err == nil { t.Fatal("An error should have been returned because of the invalid token.") } failIfNotStatusCode(t, resp, 404) // Verify that the token has changed if *resetAuth.Token == accessToken { t.Fatal("The reset token should be different from the original.") } // Verify that we do have a token value if *resetAuth.Token == "" { t.Fatal("A token value should have been returned.") } // Verify that the original token is now invalid _, resp, err = appAuthenticatedClient.Authorizations.Check(context.Background(), clientID, accessToken) if err == nil { t.Fatal("The original token should be invalid.") } failIfNotStatusCode(t, resp, 404) // Check that the reset token is valid _, resp, err = appAuthenticatedClient.Authorizations.Check(context.Background(), clientID, *resetAuth.Token) failOnError(t, err) failIfNotStatusCode(t, resp, 200) // Let's revoke the token resp, err = appAuthenticatedClient.Authorizations.Revoke(context.Background(), clientID, *resetAuth.Token) failOnError(t, err) failIfNotStatusCode(t, resp, 204) // Sleep for two seconds... I've seen cases where the revocation appears not // to have take place immediately. time.Sleep(time.Second * 2) // Now, the reset token should also be invalid _, resp, err = appAuthenticatedClient.Authorizations.Check(context.Background(), clientID, *resetAuth.Token) if err == nil { t.Fatal("The reset token should be invalid.") } failIfNotStatusCode(t, resp, 404) } // generatePersonalAuthTokenRequest is a helper function that generates an // AuthorizationRequest for a Personal Access Token (no client id). func generatePersonalAuthTokenRequest() *github.AuthorizationRequest { rand := randString() auth := github.AuthorizationRequest{ Note: github.String("Personal token: Note generated by test: " + rand), Scopes: []github.Scope{github.ScopePublicRepo}, Fingerprint: github.String("Personal token: Fingerprint generated by test: " + rand), } return &auth } // generatePersonalAuthTokenRequest is a helper function that generates an // AuthorizationRequest for an OAuth application Token (uses client id). func generateAppAuthTokenRequest(clientID string, clientSecret string) *github.AuthorizationRequest { rand := randString() auth := github.AuthorizationRequest{ Note: github.String("App token: Note generated by test: " + rand), Scopes: []github.Scope{github.ScopePublicRepo}, Fingerprint: github.String("App token: Fingerprint generated by test: " + rand), ClientID: github.String(clientID), ClientSecret: github.String(clientSecret), } return &auth } // randString returns a (kinda) random string for uniqueness purposes. func randString() string { return strconv.FormatInt(rand.NewSource(time.Now().UnixNano()).Int63(), 10) } // failOnError invokes t.Fatal() if err is present. func failOnError(t *testing.T, err error) { if err != nil { t.Fatal(err) } } // failIfNotStatusCode invokes t.Fatal() if the response's status code doesn't match the expected code. func failIfNotStatusCode(t *testing.T, resp *github.Response, expectedCode int) { if resp.StatusCode != expectedCode { t.Fatalf("Expected HTTP status code [%v] but received [%v]", expectedCode, resp.StatusCode) } } // getUserPassClient returns a GitHub client for authorization testing. The client // uses BasicAuth via GH username and password passed in environment variables // (and will skip the calling test if those vars are not present). func getUserPassClient(t *testing.T) *github.Client { username, ok := os.LookupEnv(envKeyGitHubUsername) if !ok { t.Skipf(msgEnvMissing, envKeyGitHubUsername) } password, ok := os.LookupEnv(envKeyGitHubPassword) if !ok { t.Skipf(msgEnvMissing, envKeyGitHubPassword) } tp := github.BasicAuthTransport{ Username: strings.TrimSpace(username), Password: strings.TrimSpace(password), } return github.NewClient(tp.Client()) } // getOAuthAppClient returns a GitHub client for authorization testing. The client // uses BasicAuth, but instead of username and password, it uses the client id // and client secret passed in via environment variables // (and will skip the calling test if those vars are not present). Certain API operations (check // an authorization; reset an authorization; revoke an authorization for an app) // require this authentication mechanism. // // See GitHub API docs: https://developer.com/v3/oauth_authorizations/#check-an-authorization func getOAuthAppClient(t *testing.T) *github.Client { username, ok := os.LookupEnv(envKeyClientID) if !ok { t.Skipf(msgEnvMissing, envKeyClientID) } password, ok := os.LookupEnv(envKeyClientSecret) if !ok { t.Skipf(msgEnvMissing, envKeyClientSecret) } tp := github.BasicAuthTransport{ Username: strings.TrimSpace(username), Password: strings.TrimSpace(password), } return github.NewClient(tp.Client()) } go-github-38.1.0/test/integration/doc.go000066400000000000000000000006601410475703100200720ustar00rootroot00000000000000// Copyright 2016 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 integration contains integration tests. // // These tests call the live GitHub API, and therefore require a little more // setup to run. See https://github.com/google/go-github/tree/master/test#integration // for more information. package integration go-github-38.1.0/test/integration/github_test.go000066400000000000000000000037471410475703100216570ustar00rootroot00000000000000// 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. //go:build integration // +build integration package integration import ( "context" "fmt" "math/rand" "net/http" "os" "github.com/google/go-github/v38/github" "golang.org/x/oauth2" ) var ( client *github.Client // auth indicates whether tests are being run with an OAuth token. // Tests can use this flag to skip certain tests when run without auth. auth bool ) func init() { token := os.Getenv("GITHUB_AUTH_TOKEN") if token == "" { print("!!! No OAuth token. Some tests won't run. !!!\n\n") client = github.NewClient(nil) } else { tc := oauth2.NewClient(context.Background(), oauth2.StaticTokenSource( &oauth2.Token{AccessToken: token}, )) client = github.NewClient(tc) auth = true } // Environment variables required for Authorization integration tests vars := []string{envKeyGitHubUsername, envKeyGitHubPassword, envKeyClientID, envKeyClientSecret} for _, v := range vars { value := os.Getenv(v) if value == "" { print("!!! " + fmt.Sprintf(msgEnvMissing, v) + " !!!\n\n") } } } func checkAuth(name string) bool { if !auth { fmt.Printf("No auth - skipping portions of %v\n", name) } return auth } func createRandomTestRepository(owner string, autoinit bool) (*github.Repository, error) { // create random repo name that does not currently exist var repoName string for { repoName = fmt.Sprintf("test-%d", rand.Int()) _, resp, err := client.Repositories.Get(context.Background(), owner, repoName) if err != nil { if resp.StatusCode == http.StatusNotFound { // found a non-existent repo, perfect break } return nil, err } } // create the repository repo, _, err := client.Repositories.Create(context.Background(), "", &github.Repository{Name: github.String(repoName), AutoInit: github.Bool(autoinit)}) if err != nil { return nil, err } return repo, nil } go-github-38.1.0/test/integration/issues_test.go000066400000000000000000000021711410475703100216760ustar00rootroot00000000000000// 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. //go:build integration // +build integration package integration import ( "context" "testing" ) func TestIssueEvents(t *testing.T) { events, _, err := client.Issues.ListRepositoryEvents(context.Background(), "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(context.Background(), "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(context.Background(), "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) } } go-github-38.1.0/test/integration/misc_test.go000066400000000000000000000034271410475703100213230ustar00rootroot00000000000000// 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. //go:build integration // +build integration package integration import ( "context" "testing" "time" ) func TestEmojis(t *testing.T) { emoji, _, err := client.ListEmojis(context.Background()) if err != nil { t.Fatalf("ListEmojis returned error: %v", err) } if len(emoji) == 0 { t.Errorf("ListEmojis returned no emojis") } if _, ok := emoji["+1"]; !ok { t.Errorf("ListEmojis missing '+1' emoji") } } func TestAPIMeta(t *testing.T) { meta, _, err := client.APIMeta(context.Background()) if err != nil { t.Fatalf("APIMeta returned error: %v", err) } if len(meta.Hooks) == 0 { t.Errorf("APIMeta returned no hook addresses") } if len(meta.Git) == 0 { t.Errorf("APIMeta returned no git addresses") } if !*meta.VerifiablePasswordAuthentication { t.Errorf("APIMeta VerifiablePasswordAuthentication is false") } } func TestRateLimits(t *testing.T) { limits, _, err := client.RateLimits(context.Background()) if err != nil { t.Fatalf("RateLimits returned error: %v", err) } // do some sanity checks if limits.Core.Limit == 0 { t.Errorf("RateLimits returned 0 core limit") } if limits.Core.Limit < limits.Core.Remaining { t.Errorf("Core.Limits is less than Core.Remaining.") } if limits.Core.Reset.Time.Before(time.Now().Add(-1 * time.Minute)) { t.Errorf("Core.Reset is more than 1 minute in the past; that doesn't seem right.") } } func TestListServiceHooks(t *testing.T) { hooks, _, err := client.ListServiceHooks(context.Background()) if err != nil { t.Fatalf("ListServiceHooks returned error: %v", err) } if len(hooks) == 0 { t.Fatalf("ListServiceHooks returned no hooks") } } go-github-38.1.0/test/integration/pulls_test.go000066400000000000000000000014431410475703100215230ustar00rootroot00000000000000// 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. //go:build integration // +build integration package integration import ( "context" "testing" ) func TestPullRequests_ListCommits(t *testing.T) { commits, _, err := client.PullRequests.ListCommits(context.Background(), "google", "go-github", 2, nil) if err != nil { t.Fatalf("PullRequests.ListCommits() returned error: %v", err) } if got, want := len(commits), 3; got != want { t.Fatalf("PullRequests.ListCommits() returned %d commits, want %d", got, want) } if got, want := *commits[0].Author.Login, "sqs"; got != want { t.Fatalf("PullRequests.ListCommits()[0].Author.Login returned %v, want %v", got, want) } } go-github-38.1.0/test/integration/repos_test.go000066400000000000000000000142031410475703100215120ustar00rootroot00000000000000// 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. //go:build integration // +build integration package integration import ( "context" "io" "io/ioutil" "net/http" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-github/v38/github" ) func TestRepositories_CRUD(t *testing.T) { if !checkAuth("TestRepositories_CRUD") { return } // get authenticated user me, _, err := client.Users.Get(context.Background(), "") if err != nil { t.Fatalf("Users.Get('') returned error: %v", err) } repo, err := createRandomTestRepository(*me.Login, false) if err != nil { t.Fatalf("createRandomTestRepository returned error: %v", err) } // update the repository description repo.Description = github.String("description") repo.DefaultBranch = nil // FIXME: this shouldn't be necessary _, _, err = client.Repositories.Edit(context.Background(), *repo.Owner.Login, *repo.Name, repo) if err != nil { t.Fatalf("Repositories.Edit() returned error: %v", err) } // delete the repository _, err = client.Repositories.Delete(context.Background(), *repo.Owner.Login, *repo.Name) if err != nil { t.Fatalf("Repositories.Delete() returned error: %v", err) } // verify that the repository was deleted _, resp, err := client.Repositories.Get(context.Background(), *repo.Owner.Login, *repo.Name) if err == nil { t.Fatalf("Test repository still exists after deleting it.") } if err != nil && resp.StatusCode != http.StatusNotFound { t.Fatalf("Repositories.Get() returned error: %v", err) } } func TestRepositories_BranchesTags(t *testing.T) { // branches branches, _, err := client.Repositories.ListBranches(context.Background(), "git", "git", nil) if err != nil { t.Fatalf("Repositories.ListBranches() returned error: %v", err) } if len(branches) == 0 { t.Fatalf("Repositories.ListBranches('git', 'git') returned no branches") } _, _, err = client.Repositories.GetBranch(context.Background(), "git", "git", *branches[0].Name, false) if err != nil { t.Fatalf("Repositories.GetBranch() returned error: %v", err) } // tags tags, _, err := client.Repositories.ListTags(context.Background(), "git", "git", nil) if err != nil { t.Fatalf("Repositories.ListTags() returned error: %v", err) } if len(tags) == 0 { t.Fatalf("Repositories.ListTags('git', 'git') returned no tags") } } func TestRepositories_EditBranches(t *testing.T) { if !checkAuth("TestRepositories_EditBranches") { return } // get authenticated user me, _, err := client.Users.Get(context.Background(), "") if err != nil { t.Fatalf("Users.Get('') returned error: %v", err) } repo, err := createRandomTestRepository(*me.Login, true) if err != nil { t.Fatalf("createRandomTestRepository returned error: %v", err) } branch, _, err := client.Repositories.GetBranch(context.Background(), *repo.Owner.Login, *repo.Name, "master", false) if err != nil { t.Fatalf("Repositories.GetBranch() returned error: %v", err) } if *branch.Protected { t.Fatalf("Branch %v of repo %v is already protected", "master", *repo.Name) } protectionRequest := &github.ProtectionRequest{ RequiredStatusChecks: &github.RequiredStatusChecks{ Strict: true, Contexts: []string{"continuous-integration"}, }, RequiredPullRequestReviews: &github.PullRequestReviewsEnforcementRequest{ DismissStaleReviews: true, }, EnforceAdmins: true, // TODO: Only organization repositories can have users and team restrictions. // In order to be able to test these Restrictions, need to add support // for creating temporary organization repositories. Restrictions: nil, } protection, _, err := client.Repositories.UpdateBranchProtection(context.Background(), *repo.Owner.Login, *repo.Name, "master", protectionRequest) if err != nil { t.Fatalf("Repositories.UpdateBranchProtection() returned error: %v", err) } want := &github.Protection{ RequiredStatusChecks: &github.RequiredStatusChecks{ Strict: true, Contexts: []string{"continuous-integration"}, }, RequiredPullRequestReviews: &github.PullRequestReviewsEnforcement{ DismissStaleReviews: true, RequiredApprovingReviewCount: 0, }, EnforceAdmins: &github.AdminEnforcement{ URL: github.String("https://api.github.com/repos/" + *repo.Owner.Login + "/" + *repo.Name + "/branches/master/protection/enforce_admins"), Enabled: true, }, Restrictions: nil, } if !cmp.Equal(protection, want) { t.Errorf("Repositories.UpdateBranchProtection() returned %+v, want %+v", protection, want) } _, err = client.Repositories.Delete(context.Background(), *repo.Owner.Login, *repo.Name) if err != nil { t.Fatalf("Repositories.Delete() returned error: %v", err) } } func TestRepositories_List(t *testing.T) { if !checkAuth("TestRepositories_List") { return } _, _, err := client.Repositories.List(context.Background(), "", nil) if err != nil { t.Fatalf("Repositories.List('') returned error: %v", err) } _, _, err = client.Repositories.List(context.Background(), "google", nil) if err != nil { t.Fatalf("Repositories.List('google') returned error: %v", err) } opt := github.RepositoryListOptions{Sort: "created"} repos, _, err := client.Repositories.List(context.Background(), "google", &opt) if err != nil { t.Fatalf("Repositories.List('google') with Sort opt returned error: %v", err) } for i, repo := range repos { if i > 0 && (*repos[i-1].CreatedAt).Time.Before((*repo.CreatedAt).Time) { t.Fatalf("Repositories.List('google') with default descending Sort returned incorrect order") } } } func TestRepositories_DownloadReleaseAsset(t *testing.T) { if !checkAuth("TestRepositories_DownloadReleaseAsset") { return } rc, _, err := client.Repositories.DownloadReleaseAsset(context.Background(), "andersjanmyr", "goose", 484892, http.DefaultClient) if err != nil { t.Fatalf("Repositories.DownloadReleaseAsset(andersjanmyr, goose, 484892, true) returned error: %v", err) } defer func() { _ = rc.Close() }() _, err = io.Copy(ioutil.Discard, rc) if err != nil { t.Fatalf("Repositories.DownloadReleaseAsset(andersjanmyr, goose, 484892, true) returned error: %v", err) } } go-github-38.1.0/test/integration/users_test.go000066400000000000000000000145621410475703100215330ustar00rootroot00000000000000// 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. //go:build integration // +build integration package integration import ( "context" "fmt" "math/rand" "testing" "github.com/google/go-github/v38/github" ) func TestUsers_Get(t *testing.T) { // list all users users, _, err := client.Users.ListAll(context.Background(), nil) if err != nil { t.Fatalf("Users.ListAll returned error: %v", err) } if len(users) == 0 { t.Errorf("Users.ListAll returned no users") } // mojombo is user #1 if want := "mojombo"; want != *users[0].Login { t.Errorf("user[0].Login was %q, wanted %q", *users[0].Login, want) } // get individual user u, _, err := client.Users.Get(context.Background(), "octocat") if err != nil { t.Fatalf("Users.Get('octocat') returned error: %v", err) } if want := "octocat"; want != *u.Login { t.Errorf("user.Login was %q, wanted %q", *u.Login, want) } if want := "The Octocat"; want != *u.Name { t.Errorf("user.Name was %q, wanted %q", *u.Name, want) } } func TestUsers_Update(t *testing.T) { if !checkAuth("TestUsers_Get") { return } u, _, err := client.Users.Get(context.Background(), "") if err != nil { t.Fatalf("Users.Get('') returned error: %v", err) } if *u.Login == "" { t.Errorf("wanted non-empty values for user.Login") } // save original location var location string if u.Location != nil { location = *u.Location } // update location to test value testLoc := fmt.Sprintf("test-%d", rand.Int()) u.Location = &testLoc _, _, err = client.Users.Edit(context.Background(), u) if err != nil { t.Fatalf("Users.Update returned error: %v", err) } // refetch user and check location value u, _, err = client.Users.Get(context.Background(), "") if err != nil { t.Fatalf("Users.Get('') returned error: %v", err) } if testLoc != *u.Location { t.Errorf("Users.Get('') has location: %v, want: %v", *u.Location, testLoc) } // set location back to the original value u.Location = &location _, _, err = client.Users.Edit(context.Background(), u) if err != nil { t.Fatalf("Users.Edit returned error: %v", err) } } func TestUsers_Emails(t *testing.T) { if !checkAuth("TestUsers_Emails") { return } emails, _, err := client.Users.ListEmails(context.Background(), nil) if err != nil { t.Fatalf("Users.ListEmails() returned error: %v", err) } // create random address not currently in user's emails var email string EmailLoop: for { email = fmt.Sprintf("test-%d@example.com", rand.Int()) for _, e := range emails { if e.Email != nil && *e.Email == email { continue EmailLoop } } break } // Add new address _, _, err = client.Users.AddEmails(context.Background(), []string{email}) if err != nil { t.Fatalf("Users.AddEmails() returned error: %v", err) } // List emails again and verify new email is present emails, _, err = client.Users.ListEmails(context.Background(), nil) if err != nil { t.Fatalf("Users.ListEmails() returned error: %v", err) } var found bool for _, e := range emails { if e.Email != nil && *e.Email == email { found = true break } } if !found { t.Fatalf("Users.ListEmails() does not contain new address: %v", email) } // Remove new address _, err = client.Users.DeleteEmails(context.Background(), []string{email}) if err != nil { t.Fatalf("Users.DeleteEmails() returned error: %v", err) } // List emails again and verify new email was removed emails, _, err = client.Users.ListEmails(context.Background(), nil) if err != nil { t.Fatalf("Users.ListEmails() returned error: %v", err) } for _, e := range emails { if e.Email != nil && *e.Email == email { t.Fatalf("Users.ListEmails() still contains address %v after removing it", email) } } } func TestUsers_Keys(t *testing.T) { keys, _, err := client.Users.ListKeys(context.Background(), "willnorris", nil) if err != nil { t.Fatalf("Users.ListKeys('willnorris') returned error: %v", err) } if len(keys) == 0 { t.Errorf("Users.ListKeys('willnorris') returned no keys") } // the rest of the tests requires auth if !checkAuth("TestUsers_Keys") { return } // TODO: make this integration test work for any authenticated user. keys, _, err = client.Users.ListKeys(context.Background(), "", nil) if err != nil { t.Fatalf("Users.ListKeys('') returned error: %v", err) } // ssh public key for testing (fingerprint: a7:22:ad:8c:36:9f:68:65:eb:ae:a1:e4:59:73:c1:76) key := "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCy/RIqaMFj2wjkOEjx9EAU0ReLAIhodga82/feo5nnT9UUkHLbL9xrIavfdLHx28lD3xYgPfAoSicUMaAeNwuQhmuerr2c2LFGxzrdXP8pVsQ+Ol7y7OdmFPfe0KrzoZaLJs9aSiZ4VKyY4z5Se/k2UgcJTdgQVlLfw/P96aqCx8yUu94BiWqkDqYEvgWKRNHrTiIo1EXeVBCCcfgNZe1suFfNJUJSUU2T3EG2bpwBbSOCjE3FyH8+Lz3K3BOGzm3df8E7Regj9j4YIcD8cWJYO86jLJoGgQ0L5MSOq+ishNaHQXech22Ix03D1lVMjCvDT7S/C94Z1LzhI2lhvyff" for _, k := range keys { if k.Key != nil && *k.Key == key { t.Fatalf("Test key already exists for user. Please manually remove it first.") } } // Add new key _, _, err = client.Users.CreateKey(context.Background(), &github.Key{ Title: github.String("go-github test key"), Key: github.String(key), }) if err != nil { t.Fatalf("Users.CreateKey() returned error: %v", err) } // List keys again and verify new key is present keys, _, err = client.Users.ListKeys(context.Background(), "", nil) if err != nil { t.Fatalf("Users.ListKeys('') returned error: %v", err) } var id int64 for _, k := range keys { if k.Key != nil && *k.Key == key { id = *k.ID break } } if id == 0 { t.Fatalf("Users.ListKeys('') does not contain added test key") } // Verify that fetching individual key works k, _, err := client.Users.GetKey(context.Background(), id) if err != nil { t.Fatalf("Users.GetKey(%q) returned error: %v", id, err) } if *k.Key != key { t.Fatalf("Users.GetKey(%q) returned key %v, want %v", id, *k.Key, key) } // Remove test key _, err = client.Users.DeleteKey(context.Background(), id) if err != nil { t.Fatalf("Users.DeleteKey(%d) returned error: %v", id, err) } // List keys again and verify test key was removed keys, _, err = client.Users.ListKeys(context.Background(), "", nil) if err != nil { t.Fatalf("Users.ListKeys('') returned error: %v", err) } for _, k := range keys { if k.Key != nil && *k.Key == key { t.Fatalf("Users.ListKeys('') still contains test key after removing it") } } } go-github-38.1.0/update-urls/000077500000000000000000000000001410475703100157375ustar00rootroot00000000000000go-github-38.1.0/update-urls/activity-events_test.go000066400000000000000000011454311410475703100224740ustar00rootroot00000000000000// Copyright 2020 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 main import ( "testing" ) func newActivitiesEventsPipeline() *pipelineSetup { return &pipelineSetup{ baseURL: "https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/", endpointsFromWebsite: activityEventsWant, filename: "activity_events.go", serviceName: "ActivityService", originalGoSource: activityEventsGoFileOriginal, wantGoSource: activityEventsGoFileWant, wantNumEndpoints: 7, } } func TestPipeline_ActivityEvents(t *testing.T) { ps := newActivitiesEventsPipeline() ps.setup(t, false, false) ps.validate(t) } func TestPipeline_ActivityEvents_FirstStripAllURLs(t *testing.T) { ps := newActivitiesEventsPipeline() ps.setup(t, true, false) ps.validate(t) } func TestPipeline_ActivityEvents_FirstDestroyReceivers(t *testing.T) { ps := newActivitiesEventsPipeline() ps.setup(t, false, true) ps.validate(t) } func TestPipeline_ActivityEvents_FirstStripAllURLsAndDestroyReceivers(t *testing.T) { ps := newActivitiesEventsPipeline() ps.setup(t, true, true) ps.validate(t) } func TestParseWebPageEndpoints_ActivityEvents(t *testing.T) { got, want := parseWebPageEndpoints(activityEventsTestWebPage), activityEventsWant testWebPageHelper(t, got, want) } var activityEventsWant = endpointsByFragmentID{ "list-public-events": []*Endpoint{ {urlFormats: []string{"events"}, httpMethod: "GET"}, }, "list-repository-events": []*Endpoint{ {urlFormats: []string{"repos/%v/%v/events"}, httpMethod: "GET"}, }, "list-public-events-for-a-network-of-repositories": []*Endpoint{ {urlFormats: []string{"networks/%v/%v/events"}, httpMethod: "GET"}, }, "list-events-received-by-the-authenticated-user": []*Endpoint{ {urlFormats: []string{"users/%v/received_events"}, httpMethod: "GET"}, }, "list-events-for-the-authenticated-user": []*Endpoint{ {urlFormats: []string{"users/%v/events"}, httpMethod: "GET"}, }, "list-public-events-for-a-user": []*Endpoint{ {urlFormats: []string{"users/%v/events/public"}, httpMethod: "GET"}, }, "list-organization-events-for-the-authenticated-user": []*Endpoint{ {urlFormats: []string{"users/%v/events/orgs/%v"}, httpMethod: "GET"}, }, "list-public-organization-events": []*Endpoint{ {urlFormats: []string{"orgs/%v/events"}, httpMethod: "GET"}, }, "list-public-events-received-by-a-user": []*Endpoint{ {urlFormats: []string{"users/%v/received_events/public"}, httpMethod: "GET"}, }, // Updated docs - consolidated into single page. "delete-a-thread-subscription": []*Endpoint{ {urlFormats: []string{"notifications/threads/%v/subscription"}, httpMethod: "DELETE"}, }, "mark-notifications-as-read": []*Endpoint{ {urlFormats: []string{"notifications"}, httpMethod: "PUT"}, }, "set-a-thread-subscription": []*Endpoint{ {urlFormats: []string{"notifications/threads/%v/subscription"}, httpMethod: "PUT"}, }, "delete-a-repository-subscription": []*Endpoint{ {urlFormats: []string{"repos/%v/%v/subscription"}, httpMethod: "DELETE"}, }, "star-a-repository-for-the-authenticated-user": []*Endpoint{ {urlFormats: []string{"user/starred/%v/%v"}, httpMethod: "PUT"}, }, "list-repositories-starred-by-the-authenticated-user": []*Endpoint{ {urlFormats: []string{"user/starred"}, httpMethod: "GET"}, }, "list-watchers": []*Endpoint{ {urlFormats: []string{"repos/%v/%v/subscribers"}, httpMethod: "GET"}, }, "get-feeds": []*Endpoint{ {urlFormats: []string{"feeds"}, httpMethod: "GET"}, }, "get-a-thread": []*Endpoint{ {urlFormats: []string{"notifications/threads/%v"}, httpMethod: "GET"}, }, "mark-a-thread-as-read": []*Endpoint{ {urlFormats: []string{"notifications/threads/%v"}, httpMethod: "PATCH"}, }, "list-stargazers": []*Endpoint{ {urlFormats: []string{"repos/%v/%v/stargazers"}, httpMethod: "GET"}, }, "list-repositories-watched-by-a-user": []*Endpoint{ {urlFormats: []string{"users/%v/subscriptions"}, httpMethod: "GET"}, }, "list-repository-notifications-for-the-authenticated-user": []*Endpoint{ {urlFormats: []string{"repos/%v/%v/notifications"}, httpMethod: "GET"}, }, "mark-repository-notifications-as-read": []*Endpoint{ {urlFormats: []string{"repos/%v/%v/notifications"}, httpMethod: "PUT"}, }, "check-if-a-repository-is-starred-by-the-authenticated-user": []*Endpoint{ {urlFormats: []string{"user/starred/%v/%v"}, httpMethod: "GET"}, }, "list-notifications-for-the-authenticated-user": []*Endpoint{ {urlFormats: []string{"notifications"}, httpMethod: "GET"}, }, "get-a-thread-subscription-for-the-authenticated-user": []*Endpoint{ {urlFormats: []string{"notifications/threads/%v/subscription"}, httpMethod: "GET"}, }, "unstar-a-repository-for-the-authenticated-user": []*Endpoint{ {urlFormats: []string{"user/starred/%v/%v"}, httpMethod: "DELETE"}, }, "list-repositories-watched-by-the-authenticated-user": []*Endpoint{ {urlFormats: []string{"user/subscriptions"}, httpMethod: "GET"}, }, "get-a-repository-subscription": []*Endpoint{ {urlFormats: []string{"repos/%v/%v/subscription"}, httpMethod: "GET"}, }, "set-a-repository-subscription": []*Endpoint{ {urlFormats: []string{"repos/%v/%v/subscription"}, httpMethod: "PUT"}, }, "list-repositories-starred-by-a-user": []*Endpoint{ {urlFormats: []string{"users/%v/starred"}, httpMethod: "GET"}, }, } var activityEventsTestWebPage = ` Activity - GitHub Docs
Article version: GitHub.com

Activity

In this article

Did this doc help you?

Events

The Events API is a read-only API to the GitHub events. These events power the various activity streams on the site.

The Events API can return different types of events triggered by activity on GitHub. For more information about the specific events that you can receive from the Events API, see "GitHub Event types." An events API for repository issues is also available. For more information, see the "Issue Events API."

Events are optimized for polling with the "ETag" header. If no new events have been triggered, you will see a "304 Not Modified" response, and your current rate limit will be untouched. There is also an "X-Poll-Interval" header that specifies how often (in seconds) you are allowed to poll. In times of high server load, the time may increase. Please obey the header.

$ curl -I https://api.github.com/users/tater/events
> HTTP/1.1 200 OK
> X-Poll-Interval: 60
> ETag: "a18c3bded88eb5dbb5c849a489412bf3"

# The quotes around the ETag value are important
$ curl -I https://api.github.com/users/tater/events \
$    -H 'If-None-Match: "a18c3bded88eb5dbb5c849a489412bf3"'
> HTTP/1.1 304 Not Modified
> X-Poll-Interval: 60

Events support pagination, however the per_page option is unsupported. The fixed page size is 30 items. Fetching up to ten pages is supported, for a total of 300 events. For information, see "Traversing with pagination."

Only events created within the past 90 days will be included in timelines. Events older than 90 days will not be included (even if the total number of events in the timeline is less than 300).

List public events

We delay the public events feed by five minutes, which means the most recent event returned by the public events API actually occurred at least five minutes ago.

get /events

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/events
JavaScript (@octokit/core.js)
await octokit.request('GET /events')

Response

Status: 200 OK

Notes


get /networks/{owner}/{repo}/events

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

owner string path
repo string path
per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/networks/octocat/hello-world/events
JavaScript (@octokit/core.js)
await octokit.request('GET /networks/{owner}/{repo}/events', {
  owner: 'octocat',
  repo: 'hello-world'
})

Response

Status: 200 OK

Notes


get /orgs/{org}/events

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

org string path
per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/orgs/ORG/events
JavaScript (@octokit/core.js)
await octokit.request('GET /orgs/{org}/events', {
  org: 'org'
})

Response

Status: 200 OK

Notes


get /repos/{owner}/{repo}/events

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

owner string path
repo string path
per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/repos/octocat/hello-world/events
JavaScript (@octokit/core.js)
await octokit.request('GET /repos/{owner}/{repo}/events', {
  owner: 'octocat',
  repo: 'hello-world'
})

Response

Status: 200 OK

Notes


List events for the authenticated user

If you are authenticated as the given user, you will see your private events. Otherwise, you'll only see public events.

get /users/{username}/events

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

username string path
per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/users/USERNAME/events
JavaScript (@octokit/core.js)
await octokit.request('GET /users/{username}/events', {
  username: 'username'
})

Response

Status: 200 OK

Notes


List organization events for the authenticated user

This is the user's organization dashboard. You must be authenticated as the user to view this.

get /users/{username}/events/orgs/{org}

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

username string path
org string path
per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/users/USERNAME/events/orgs/ORG
JavaScript (@octokit/core.js)
await octokit.request('GET /users/{username}/events/orgs/{org}', {
  username: 'username',
  org: 'org'
})

Response

Status: 200 OK

get /users/{username}/events/public

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

username string path
per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/users/USERNAME/events/public
JavaScript (@octokit/core.js)
await octokit.request('GET /users/{username}/events/public', {
  username: 'username'
})

Response

Status: 200 OK

Notes


List events received by the authenticated user

These are events that you've received by watching repos and following users. If you are authenticated as the given user, you will see private events. Otherwise, you'll only see public events.

get /users/{username}/received_events

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

username string path
per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/users/USERNAME/received_events
JavaScript (@octokit/core.js)
await octokit.request('GET /users/{username}/received_events', {
  username: 'username'
})

Response

Status: 200 OK

Notes


get /users/{username}/received_events/public

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

username string path
per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/users/USERNAME/received_events/public
JavaScript (@octokit/core.js)
await octokit.request('GET /users/{username}/received_events/public', {
  username: 'username'
})

Response

Status: 200 OK

Notes


Feeds

Get feeds

GitHub provides several timeline resources in Atom format. The Feeds API lists all the feeds available to the authenticated user:

  • Timeline: The GitHub global public timeline
  • User: The public timeline for any user, using URI template
  • Current user public: The public timeline for the authenticated user
  • Current user: The private timeline for the authenticated user
  • Current user actor: The private timeline for activity created by the authenticated user
  • Current user organizations: The private timeline for the organizations the authenticated user is a member of.
  • Security advisories: A collection of public announcements that provide information about security-related vulnerabilities in software on GitHub.

Note: Private feeds are only returned when authenticating via Basic Auth since current feed URIs use the older, non revocable auth tokens.

get /feeds

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/feeds
JavaScript (@octokit/core.js)
await octokit.request('GET /feeds')

Default response

Status: 200 OK
{
  "timeline_url": "https://github.com/timeline",
  "user_url": "https://github.com/{user}",
  "current_user_public_url": "https://github.com/octocat",
  "current_user_url": "https://github.com/octocat.private?token=abc123",
  "current_user_actor_url": "https://github.com/octocat.private.actor?token=abc123",
  "current_user_organization_url": "",
  "current_user_organization_urls": [
    "https://github.com/organizations/github/octocat.private.atom?token=abc123"
  ],
  "security_advisories_url": "https://github.com/security-advisories",
  "_links": {
    "timeline": {
      "href": "https://github.com/timeline",
      "type": "application/atom+xml"
    },
    "user": {
      "href": "https://github.com/{user}",
      "type": "application/atom+xml"
    },
    "current_user_public": {
      "href": "https://github.com/octocat",
      "type": "application/atom+xml"
    },
    "current_user": {
      "href": "https://github.com/octocat.private?token=abc123",
      "type": "application/atom+xml"
    },
    "current_user_actor": {
      "href": "https://github.com/octocat.private.actor?token=abc123",
      "type": "application/atom+xml"
    },
    "current_user_organization": {
      "href": "",
      "type": ""
    },
    "current_user_organizations": [
      {
        "href": "https://github.com/organizations/github/octocat.private.atom?token=abc123",
        "type": "application/atom+xml"
      }
    ],
    "security_advisories": {
      "href": "https://github.com/security-advisories",
      "type": "application/atom+xml"
    }
  }
}

Notes


Example of getting an Atom feed

To get a feed in Atom format, you must specify the application/atom+xml type in the Accept header. For example, to get the Atom feed for GitHub security advisories:

curl -H "Accept: application/atom+xml" https://github.com/security-advisories

Response

Status: 200 OK
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xml:lang="en-US">
  <id>tag:github.com,2008:/security-advisories</id>
  <link rel="self" type="application/atom+xml" href="https://github.com/security-advisories.atom"/>
  <title>GitHub Security Advisory Feed</title>
  <author>
    <name>GitHub</name>
  </author>
  <updated>2019-01-14T19:34:52Z</updated>
     <entry>
      <id>tag:github.com,2008:GHSA-abcd-12ab-23cd</id>
      <published>2018-07-26T15:14:52Z</published>
      <updated>2019-01-14T19:34:52Z</updated>
      <title type="html">[GHSA-abcd-12ab-23cd] Moderate severity vulnerability that affects Octoapp</title>
        <category term="NPM"/>
      <content type="html">
        &lt;p&gt;Octoapp node module before 4.17.5 suffers from a Modification of Assumed-Immutable Data (MAID) vulnerability via defaultsDeep, merge, and mergeWith functions, which allows a malicious user to modify the prototype of &quot;Object&quot; via &lt;strong&gt;proto&lt;/strong&gt;, causing the addition or modification of an existing property that will exist on all objects.&lt;/p&gt;
          &lt;p&gt;&lt;strong&gt;Affected Packages&lt;/strong&gt;&lt;/p&gt;

  &lt;dl&gt;
      &lt;dt&gt;Octoapp&lt;/dt&gt;
      &lt;dd&gt;Ecosystem: npm&lt;/dd&gt;
      &lt;dd&gt;Severity: moderate&lt;/dd&gt;
      &lt;dd&gt;Versions: &amp;lt; 4.17.5&lt;/dd&gt;
        &lt;dd&gt;Fixed in: 4.17.5&lt;/dd&gt;
  &lt;/dl&gt;

          &lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;

  &lt;ul&gt;
      &lt;li&gt;https://nvd.nist.gov/vuln/detail/CVE-2018-123&lt;/li&gt;
  &lt;/ul&gt;

      </content>
    </entry>
</feed>

Notifications

Users receive notifications for conversations in repositories they watch including:

  • Issues and their comments
  • Pull Requests and their comments
  • Comments on any commits

Notifications are also sent for conversations in unwatched repositories when the user is involved including:

  • @mentions
  • Issue assignments
  • Commits the user authors or commits
  • Any discussion in which the user actively participates

All Notification API calls require the notifications or repo API scopes. Doing this will give read-only access to some issue and commit content. You will still need the repo scope to access issues and commits from their respective endpoints.

Notifications come back as "threads". A thread contains information about the current discussion of an issue, pull request, or commit.

Notifications are optimized for polling with the Last-Modified header. If there are no new notifications, you will see a 304 Not Modified response, leaving your current rate limit untouched. There is an X-Poll-Interval header that specifies how often (in seconds) you are allowed to poll. In times of high server load, the time may increase. Please obey the header.

# Add authentication to your requests
$ curl -I https://api.github.com/notifications
HTTP/1.1 200 OK
Last-Modified: Thu, 25 Oct 2012 15:16:27 GMT
X-Poll-Interval: 60

# Pass the Last-Modified header exactly
$ curl -I https://api.github.com/notifications
$    -H "If-Modified-Since: Thu, 25 Oct 2012 15:16:27 GMT"
> HTTP/1.1 304 Not Modified
> X-Poll-Interval: 60

Notification reasons

When retrieving responses from the Notifications API, each payload has a key titled reason. These correspond to events that trigger a notification.

Here's a list of potential reasons for receiving a notification:

Reason NameDescription
assignYou were assigned to the issue.
authorYou created the thread.
commentYou commented on the thread.
invitationYou accepted an invitation to contribute to the repository.
manualYou subscribed to the thread (via an issue or pull request).
mentionYou were specifically @mentioned in the content.
review_requestedYou, or a team you're a member of, were requested to review a pull request.
security_alertGitHub discovered a security vulnerability in your repository.
state_changeYou changed the thread state (for example, closing an issue or merging a pull request).
subscribedYou're watching the repository.
team_mentionYou were on a team that was mentioned.

Note that the reason is modified on a per-thread basis, and can change, if the reason on a later notification is different.

For example, if you are the author of an issue, subsequent notifications on that issue will have a reason of author. If you're then @mentioned on the same issue, the notifications you fetch thereafter will have a reason of mention. The reason remains as mention, regardless of whether you're ever mentioned again.

List notifications for the authenticated user

List all notifications for the current user, sorted by most recently updated.

get /notifications

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

all boolean query

If true, show notifications marked as read.

participating boolean query

If true, only shows notifications in which the user is directly participating or mentioned.

since string query

Only show notifications updated after the given time. This is a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ.

before string query

Only show notifications updated before the given time. This is a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ.

per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/notifications
JavaScript (@octokit/core.js)
await octokit.request('GET /notifications')

Default response

Status: 200 OK
[
  {
    "id": "1",
    "repository": {
      "id": 1296269,
      "node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5",
      "name": "Hello-World",
      "full_name": "octocat/Hello-World",
      "owner": {
        "login": "octocat",
        "id": 1,
        "node_id": "MDQ6VXNlcjE=",
        "avatar_url": "https://github.com/images/error/octocat_happy.gif",
        "gravatar_id": "",
        "url": "https://api.github.com/users/octocat",
        "html_url": "https://github.com/octocat",
        "followers_url": "https://api.github.com/users/octocat/followers",
        "following_url": "https://api.github.com/users/octocat/following{/other_user}",
        "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
        "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
        "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
        "organizations_url": "https://api.github.com/users/octocat/orgs",
        "repos_url": "https://api.github.com/users/octocat/repos",
        "events_url": "https://api.github.com/users/octocat/events{/privacy}",
        "received_events_url": "https://api.github.com/users/octocat/received_events",
        "type": "User",
        "site_admin": false
      },
      "private": false,
      "html_url": "https://github.com/octocat/Hello-World",
      "description": "This your first repo!",
      "fork": false,
      "url": "https://api.github.com/repos/octocat/Hello-World",
      "archive_url": "http://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}",
      "assignees_url": "http://api.github.com/repos/octocat/Hello-World/assignees{/user}",
      "blobs_url": "http://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}",
      "branches_url": "http://api.github.com/repos/octocat/Hello-World/branches{/branch}",
      "collaborators_url": "http://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}",
      "comments_url": "http://api.github.com/repos/octocat/Hello-World/comments{/number}",
      "commits_url": "http://api.github.com/repos/octocat/Hello-World/commits{/sha}",
      "compare_url": "http://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}",
      "contents_url": "http://api.github.com/repos/octocat/Hello-World/contents/{+path}",
      "contributors_url": "http://api.github.com/repos/octocat/Hello-World/contributors",
      "deployments_url": "http://api.github.com/repos/octocat/Hello-World/deployments",
      "downloads_url": "http://api.github.com/repos/octocat/Hello-World/downloads",
      "events_url": "http://api.github.com/repos/octocat/Hello-World/events",
      "forks_url": "http://api.github.com/repos/octocat/Hello-World/forks",
      "git_commits_url": "http://api.github.com/repos/octocat/Hello-World/git/commits{/sha}",
      "git_refs_url": "http://api.github.com/repos/octocat/Hello-World/git/refs{/sha}",
      "git_tags_url": "http://api.github.com/repos/octocat/Hello-World/git/tags{/sha}",
      "git_url": "git:github.com/octocat/Hello-World.git",
      "issue_comment_url": "http://api.github.com/repos/octocat/Hello-World/issues/comments{/number}",
      "issue_events_url": "http://api.github.com/repos/octocat/Hello-World/issues/events{/number}",
      "issues_url": "http://api.github.com/repos/octocat/Hello-World/issues{/number}",
      "keys_url": "http://api.github.com/repos/octocat/Hello-World/keys{/key_id}",
      "labels_url": "http://api.github.com/repos/octocat/Hello-World/labels{/name}",
      "languages_url": "http://api.github.com/repos/octocat/Hello-World/languages",
      "merges_url": "http://api.github.com/repos/octocat/Hello-World/merges",
      "milestones_url": "http://api.github.com/repos/octocat/Hello-World/milestones{/number}",
      "notifications_url": "http://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}",
      "pulls_url": "http://api.github.com/repos/octocat/Hello-World/pulls{/number}",
      "releases_url": "http://api.github.com/repos/octocat/Hello-World/releases{/id}",
      "ssh_url": "git@github.com:octocat/Hello-World.git",
      "stargazers_url": "http://api.github.com/repos/octocat/Hello-World/stargazers",
      "statuses_url": "http://api.github.com/repos/octocat/Hello-World/statuses/{sha}",
      "subscribers_url": "http://api.github.com/repos/octocat/Hello-World/subscribers",
      "subscription_url": "http://api.github.com/repos/octocat/Hello-World/subscription",
      "tags_url": "http://api.github.com/repos/octocat/Hello-World/tags",
      "teams_url": "http://api.github.com/repos/octocat/Hello-World/teams",
      "trees_url": "http://api.github.com/repos/octocat/Hello-World/git/trees{/sha}"
    },
    "subject": {
      "title": "Greetings",
      "url": "https://api.github.com/repos/octokit/octokit.rb/issues/123",
      "latest_comment_url": "https://api.github.com/repos/octokit/octokit.rb/issues/comments/123",
      "type": "Issue"
    },
    "reason": "subscribed",
    "unread": true,
    "updated_at": "2014-11-07T22:01:45Z",
    "last_read_at": "2014-11-07T22:01:45Z",
    "url": "https://api.github.com/notifications/threads/1"
  }
]

Mark notifications as read

Marks all notifications as "read" removes it from the default view on GitHub. If the number of notifications is too large to complete in one request, you will receive a 202 Accepted status and GitHub will run an asynchronous process to mark notifications as "read." To check whether any "unread" notifications remain, you can use the List notifications for the authenticated user endpoint and pass the query parameter all=false.

put /notifications

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

last_read_at string body

Describes the last point that notifications were checked. Anything updated since this time will not be marked as read. If you omit this parameter, all notifications are marked as read. This is a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ. Default: The current timestamp.

Code samples

Shell
curl \
  -X PUT \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/notifications \
  -d '{"last_read_at":"last_read_at"}'
JavaScript (@octokit/core.js)
await octokit.request('PUT /notifications', {
  last_read_at: 'last_read_at'
})

Response

Status: 205 Reset Content

get /notifications/threads/{thread_id}

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

thread_id integer path

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/notifications/threads/42
JavaScript (@octokit/core.js)
await octokit.request('GET /notifications/threads/{thread_id}', {
  thread_id: 42
})

Default response

Status: 200 OK
{
  "id": "1",
  "repository": {
    "id": 1296269,
    "node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5",
    "name": "Hello-World",
    "full_name": "octocat/Hello-World",
    "owner": {
      "login": "octocat",
      "id": 1,
      "node_id": "MDQ6VXNlcjE=",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "gravatar_id": "",
      "url": "https://api.github.com/users/octocat",
      "html_url": "https://github.com/octocat",
      "followers_url": "https://api.github.com/users/octocat/followers",
      "following_url": "https://api.github.com/users/octocat/following{/other_user}",
      "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
      "organizations_url": "https://api.github.com/users/octocat/orgs",
      "repos_url": "https://api.github.com/users/octocat/repos",
      "events_url": "https://api.github.com/users/octocat/events{/privacy}",
      "received_events_url": "https://api.github.com/users/octocat/received_events",
      "type": "User",
      "site_admin": false
    },
    "private": false,
    "html_url": "https://github.com/octocat/Hello-World",
    "description": "This your first repo!",
    "fork": false,
    "url": "https://api.github.com/repos/octocat/Hello-World",
    "archive_url": "http://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}",
    "assignees_url": "http://api.github.com/repos/octocat/Hello-World/assignees{/user}",
    "blobs_url": "http://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}",
    "branches_url": "http://api.github.com/repos/octocat/Hello-World/branches{/branch}",
    "collaborators_url": "http://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}",
    "comments_url": "http://api.github.com/repos/octocat/Hello-World/comments{/number}",
    "commits_url": "http://api.github.com/repos/octocat/Hello-World/commits{/sha}",
    "compare_url": "http://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}",
    "contents_url": "http://api.github.com/repos/octocat/Hello-World/contents/{+path}",
    "contributors_url": "http://api.github.com/repos/octocat/Hello-World/contributors",
    "deployments_url": "http://api.github.com/repos/octocat/Hello-World/deployments",
    "downloads_url": "http://api.github.com/repos/octocat/Hello-World/downloads",
    "events_url": "http://api.github.com/repos/octocat/Hello-World/events",
    "forks_url": "http://api.github.com/repos/octocat/Hello-World/forks",
    "git_commits_url": "http://api.github.com/repos/octocat/Hello-World/git/commits{/sha}",
    "git_refs_url": "http://api.github.com/repos/octocat/Hello-World/git/refs{/sha}",
    "git_tags_url": "http://api.github.com/repos/octocat/Hello-World/git/tags{/sha}",
    "git_url": "git:github.com/octocat/Hello-World.git",
    "issue_comment_url": "http://api.github.com/repos/octocat/Hello-World/issues/comments{/number}",
    "issue_events_url": "http://api.github.com/repos/octocat/Hello-World/issues/events{/number}",
    "issues_url": "http://api.github.com/repos/octocat/Hello-World/issues{/number}",
    "keys_url": "http://api.github.com/repos/octocat/Hello-World/keys{/key_id}",
    "labels_url": "http://api.github.com/repos/octocat/Hello-World/labels{/name}",
    "languages_url": "http://api.github.com/repos/octocat/Hello-World/languages",
    "merges_url": "http://api.github.com/repos/octocat/Hello-World/merges",
    "milestones_url": "http://api.github.com/repos/octocat/Hello-World/milestones{/number}",
    "notifications_url": "http://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}",
    "pulls_url": "http://api.github.com/repos/octocat/Hello-World/pulls{/number}",
    "releases_url": "http://api.github.com/repos/octocat/Hello-World/releases{/id}",
    "ssh_url": "git@github.com:octocat/Hello-World.git",
    "stargazers_url": "http://api.github.com/repos/octocat/Hello-World/stargazers",
    "statuses_url": "http://api.github.com/repos/octocat/Hello-World/statuses/{sha}",
    "subscribers_url": "http://api.github.com/repos/octocat/Hello-World/subscribers",
    "subscription_url": "http://api.github.com/repos/octocat/Hello-World/subscription",
    "tags_url": "http://api.github.com/repos/octocat/Hello-World/tags",
    "teams_url": "http://api.github.com/repos/octocat/Hello-World/teams",
    "trees_url": "http://api.github.com/repos/octocat/Hello-World/git/trees{/sha}"
  },
  "subject": {
    "title": "Greetings",
    "url": "https://api.github.com/repos/octokit/octokit.rb/issues/123",
    "latest_comment_url": "https://api.github.com/repos/octokit/octokit.rb/issues/comments/123",
    "type": "Issue"
  },
  "reason": "subscribed",
  "unread": true,
  "updated_at": "2014-11-07T22:01:45Z",
  "last_read_at": "2014-11-07T22:01:45Z",
  "url": "https://api.github.com/notifications/threads/1"
}

patch /notifications/threads/{thread_id}

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

thread_id integer path

Code samples

Shell
curl \
  -X PATCH \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/notifications/threads/42
JavaScript (@octokit/core.js)
await octokit.request('PATCH /notifications/threads/{thread_id}', {
  thread_id: 42
})

Response

Status: 205 Reset Content

Get a thread subscription for the authenticated user

This checks to see if the current user is subscribed to a thread. You can also get a repository subscription.

Note that subscriptions are only generated if a user is participating in a conversation--for example, they've replied to the thread, were @mentioned, or manually subscribe to a thread.

get /notifications/threads/{thread_id}/subscription

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

thread_id integer path

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/notifications/threads/42/subscription
JavaScript (@octokit/core.js)
await octokit.request('GET /notifications/threads/{thread_id}/subscription', {
  thread_id: 42
})

Default response

Status: 200 OK
{
  "subscribed": true,
  "ignored": false,
  "reason": null,
  "created_at": "2012-10-06T21:34:12Z",
  "url": "https://api.github.com/notifications/threads/1/subscription",
  "thread_url": "https://api.github.com/notifications/threads/1"
}

Set a thread subscription

If you are watching a repository, you receive notifications for all threads by default. Use this endpoint to ignore future notifications for threads until you comment on the thread or get an @mention.

You can also use this endpoint to subscribe to threads that you are currently not receiving notifications for or to subscribed to threads that you have previously ignored.

Unsubscribing from a conversation in a repository that you are not watching is functionally equivalent to the Delete a thread subscription endpoint.

put /notifications/threads/{thread_id}/subscription

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

thread_id integer path
ignored boolean body

Unsubscribes and subscribes you to a conversation. Set ignored to true to block all notifications from this thread.

Code samples

Shell
curl \
  -X PUT \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/notifications/threads/42/subscription \
  -d '{"ignored":true}'
JavaScript (@octokit/core.js)
await octokit.request('PUT /notifications/threads/{thread_id}/subscription', {
  thread_id: 42,
  ignored: true
})

Default response

Status: 200 OK
{
  "subscribed": true,
  "ignored": false,
  "reason": null,
  "created_at": "2012-10-06T21:34:12Z",
  "url": "https://api.github.com/notifications/threads/1/subscription",
  "thread_url": "https://api.github.com/notifications/threads/1"
}

Delete a thread subscription

Mutes all future notifications for a conversation until you comment on the thread or get an @mention. If you are watching the repository of the thread, you will still receive notifications. To ignore future notifications for a repository you are watching, use the Set a thread subscription endpoint and set ignore to true.

delete /notifications/threads/{thread_id}/subscription

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

thread_id integer path

Code samples

Shell
curl \
  -X DELETE \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/notifications/threads/42/subscription
JavaScript (@octokit/core.js)
await octokit.request('DELETE /notifications/threads/{thread_id}/subscription', {
  thread_id: 42
})

Default Response

Status: 204 No Content

List repository notifications for the authenticated user

List all notifications for the current user.

get /repos/{owner}/{repo}/notifications

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

owner string path
repo string path
all boolean query

If true, show notifications marked as read.

participating boolean query

If true, only shows notifications in which the user is directly participating or mentioned.

since string query

Only show notifications updated after the given time. This is a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ.

before string query

Only show notifications updated before the given time. This is a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ.

per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/repos/octocat/hello-world/notifications
JavaScript (@octokit/core.js)
await octokit.request('GET /repos/{owner}/{repo}/notifications', {
  owner: 'octocat',
  repo: 'hello-world'
})

Default response

Status: 200 OK
[
  {
    "id": "1",
    "repository": {
      "id": 1296269,
      "node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5",
      "name": "Hello-World",
      "full_name": "octocat/Hello-World",
      "owner": {
        "login": "octocat",
        "id": 1,
        "node_id": "MDQ6VXNlcjE=",
        "avatar_url": "https://github.com/images/error/octocat_happy.gif",
        "gravatar_id": "",
        "url": "https://api.github.com/users/octocat",
        "html_url": "https://github.com/octocat",
        "followers_url": "https://api.github.com/users/octocat/followers",
        "following_url": "https://api.github.com/users/octocat/following{/other_user}",
        "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
        "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
        "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
        "organizations_url": "https://api.github.com/users/octocat/orgs",
        "repos_url": "https://api.github.com/users/octocat/repos",
        "events_url": "https://api.github.com/users/octocat/events{/privacy}",
        "received_events_url": "https://api.github.com/users/octocat/received_events",
        "type": "User",
        "site_admin": false
      },
      "private": false,
      "html_url": "https://github.com/octocat/Hello-World",
      "description": "This your first repo!",
      "fork": false,
      "url": "https://api.github.com/repos/octocat/Hello-World",
      "archive_url": "http://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}",
      "assignees_url": "http://api.github.com/repos/octocat/Hello-World/assignees{/user}",
      "blobs_url": "http://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}",
      "branches_url": "http://api.github.com/repos/octocat/Hello-World/branches{/branch}",
      "collaborators_url": "http://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}",
      "comments_url": "http://api.github.com/repos/octocat/Hello-World/comments{/number}",
      "commits_url": "http://api.github.com/repos/octocat/Hello-World/commits{/sha}",
      "compare_url": "http://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}",
      "contents_url": "http://api.github.com/repos/octocat/Hello-World/contents/{+path}",
      "contributors_url": "http://api.github.com/repos/octocat/Hello-World/contributors",
      "deployments_url": "http://api.github.com/repos/octocat/Hello-World/deployments",
      "downloads_url": "http://api.github.com/repos/octocat/Hello-World/downloads",
      "events_url": "http://api.github.com/repos/octocat/Hello-World/events",
      "forks_url": "http://api.github.com/repos/octocat/Hello-World/forks",
      "git_commits_url": "http://api.github.com/repos/octocat/Hello-World/git/commits{/sha}",
      "git_refs_url": "http://api.github.com/repos/octocat/Hello-World/git/refs{/sha}",
      "git_tags_url": "http://api.github.com/repos/octocat/Hello-World/git/tags{/sha}",
      "git_url": "git:github.com/octocat/Hello-World.git",
      "issue_comment_url": "http://api.github.com/repos/octocat/Hello-World/issues/comments{/number}",
      "issue_events_url": "http://api.github.com/repos/octocat/Hello-World/issues/events{/number}",
      "issues_url": "http://api.github.com/repos/octocat/Hello-World/issues{/number}",
      "keys_url": "http://api.github.com/repos/octocat/Hello-World/keys{/key_id}",
      "labels_url": "http://api.github.com/repos/octocat/Hello-World/labels{/name}",
      "languages_url": "http://api.github.com/repos/octocat/Hello-World/languages",
      "merges_url": "http://api.github.com/repos/octocat/Hello-World/merges",
      "milestones_url": "http://api.github.com/repos/octocat/Hello-World/milestones{/number}",
      "notifications_url": "http://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}",
      "pulls_url": "http://api.github.com/repos/octocat/Hello-World/pulls{/number}",
      "releases_url": "http://api.github.com/repos/octocat/Hello-World/releases{/id}",
      "ssh_url": "git@github.com:octocat/Hello-World.git",
      "stargazers_url": "http://api.github.com/repos/octocat/Hello-World/stargazers",
      "statuses_url": "http://api.github.com/repos/octocat/Hello-World/statuses/{sha}",
      "subscribers_url": "http://api.github.com/repos/octocat/Hello-World/subscribers",
      "subscription_url": "http://api.github.com/repos/octocat/Hello-World/subscription",
      "tags_url": "http://api.github.com/repos/octocat/Hello-World/tags",
      "teams_url": "http://api.github.com/repos/octocat/Hello-World/teams",
      "trees_url": "http://api.github.com/repos/octocat/Hello-World/git/trees{/sha}"
    },
    "subject": {
      "title": "Greetings",
      "url": "https://api.github.com/repos/octokit/octokit.rb/issues/123",
      "latest_comment_url": "https://api.github.com/repos/octokit/octokit.rb/issues/comments/123",
      "type": "Issue"
    },
    "reason": "subscribed",
    "unread": true,
    "updated_at": "2014-11-07T22:01:45Z",
    "last_read_at": "2014-11-07T22:01:45Z",
    "url": "https://api.github.com/notifications/threads/1"
  }
]

Mark repository notifications as read

Marks all notifications in a repository as "read" removes them from the default view on GitHub. If the number of notifications is too large to complete in one request, you will receive a 202 Accepted status and GitHub will run an asynchronous process to mark notifications as "read." To check whether any "unread" notifications remain, you can use the List repository notifications for the authenticated user endpoint and pass the query parameter all=false.

put /repos/{owner}/{repo}/notifications

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

owner string path
repo string path
last_read_at string body

Describes the last point that notifications were checked. Anything updated since this time will not be marked as read. If you omit this parameter, all notifications are marked as read. This is a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ. Default: The current timestamp.

Code samples

Shell
curl \
  -X PUT \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/repos/octocat/hello-world/notifications \
  -d '{"last_read_at":"last_read_at"}'
JavaScript (@octokit/core.js)
await octokit.request('PUT /repos/{owner}/{repo}/notifications', {
  owner: 'octocat',
  repo: 'hello-world',
  last_read_at: 'last_read_at'
})

Response

Status: 205 Reset Content

Starring

Repository starring is a feature that lets users bookmark repositories. Stars are shown next to repositories to show an approximate level of interest. Stars have no effect on notifications or the activity feed.

Starring vs. Watching

In August 2012, we changed the way watching works on GitHub. Many API client applications may be using the original "watcher" endpoints for accessing this data. You can now start using the "star" endpoints instead (described below). For more information, see the Watcher API Change post and the "Repository Watching API."

Custom media types for starring

There is one supported custom media type for the Starring REST API. When you use this custom media type, you will receive a response with the starred_at timestamp property that indicates the time the star was created. The response also has a second property that includes the resource that is returned when the custom media type is not included. The property that contains the resource will be either user or repo.

application/vnd.github.v3.star+json

For more information about media types, see "Custom media types."

List stargazers

Lists the people that have starred the repository.

You can also find out when stars were created by passing the following custom media type via the Accept header:

get /repos/{owner}/{repo}/stargazers

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

owner string path
repo string path
per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/repos/octocat/hello-world/stargazers
JavaScript (@octokit/core.js)
await octokit.request('GET /repos/{owner}/{repo}/stargazers', {
  owner: 'octocat',
  repo: 'hello-world'
})

Default response

Status: 200 OK
[
  {
    "login": "octocat",
    "id": 1,
    "node_id": "MDQ6VXNlcjE=",
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "",
    "url": "https://api.github.com/users/octocat",
    "html_url": "https://github.com/octocat",
    "followers_url": "https://api.github.com/users/octocat/followers",
    "following_url": "https://api.github.com/users/octocat/following{/other_user}",
    "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
    "organizations_url": "https://api.github.com/users/octocat/orgs",
    "repos_url": "https://api.github.com/users/octocat/repos",
    "events_url": "https://api.github.com/users/octocat/events{/privacy}",
    "received_events_url": "https://api.github.com/users/octocat/received_events",
    "type": "User",
    "site_admin": false
  }
]

Notes


List repositories starred by the authenticated user

Lists repositories the authenticated user has starred.

You can also find out when stars were created by passing the following custom media type via the Accept header:

get /user/starred

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

sort string query

One of created (when the repository was starred) or updated (when it was last pushed to).

direction string query

One of asc (ascending) or desc (descending).

per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/user/starred
JavaScript (@octokit/core.js)
await octokit.request('GET /user/starred')

Default response

Status: 200 OK
[
  {
    "id": 1296269,
    "node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5",
    "name": "Hello-World",
    "full_name": "octocat/Hello-World",
    "owner": {
      "login": "octocat",
      "id": 1,
      "node_id": "MDQ6VXNlcjE=",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "gravatar_id": "",
      "url": "https://api.github.com/users/octocat",
      "html_url": "https://github.com/octocat",
      "followers_url": "https://api.github.com/users/octocat/followers",
      "following_url": "https://api.github.com/users/octocat/following{/other_user}",
      "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
      "organizations_url": "https://api.github.com/users/octocat/orgs",
      "repos_url": "https://api.github.com/users/octocat/repos",
      "events_url": "https://api.github.com/users/octocat/events{/privacy}",
      "received_events_url": "https://api.github.com/users/octocat/received_events",
      "type": "User",
      "site_admin": false
    },
    "private": false,
    "html_url": "https://github.com/octocat/Hello-World",
    "description": "This your first repo!",
    "fork": false,
    "url": "https://api.github.com/repos/octocat/Hello-World",
    "archive_url": "http://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}",
    "assignees_url": "http://api.github.com/repos/octocat/Hello-World/assignees{/user}",
    "blobs_url": "http://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}",
    "branches_url": "http://api.github.com/repos/octocat/Hello-World/branches{/branch}",
    "collaborators_url": "http://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}",
    "comments_url": "http://api.github.com/repos/octocat/Hello-World/comments{/number}",
    "commits_url": "http://api.github.com/repos/octocat/Hello-World/commits{/sha}",
    "compare_url": "http://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}",
    "contents_url": "http://api.github.com/repos/octocat/Hello-World/contents/{+path}",
    "contributors_url": "http://api.github.com/repos/octocat/Hello-World/contributors",
    "deployments_url": "http://api.github.com/repos/octocat/Hello-World/deployments",
    "downloads_url": "http://api.github.com/repos/octocat/Hello-World/downloads",
    "events_url": "http://api.github.com/repos/octocat/Hello-World/events",
    "forks_url": "http://api.github.com/repos/octocat/Hello-World/forks",
    "git_commits_url": "http://api.github.com/repos/octocat/Hello-World/git/commits{/sha}",
    "git_refs_url": "http://api.github.com/repos/octocat/Hello-World/git/refs{/sha}",
    "git_tags_url": "http://api.github.com/repos/octocat/Hello-World/git/tags{/sha}",
    "git_url": "git:github.com/octocat/Hello-World.git",
    "issue_comment_url": "http://api.github.com/repos/octocat/Hello-World/issues/comments{/number}",
    "issue_events_url": "http://api.github.com/repos/octocat/Hello-World/issues/events{/number}",
    "issues_url": "http://api.github.com/repos/octocat/Hello-World/issues{/number}",
    "keys_url": "http://api.github.com/repos/octocat/Hello-World/keys{/key_id}",
    "labels_url": "http://api.github.com/repos/octocat/Hello-World/labels{/name}",
    "languages_url": "http://api.github.com/repos/octocat/Hello-World/languages",
    "merges_url": "http://api.github.com/repos/octocat/Hello-World/merges",
    "milestones_url": "http://api.github.com/repos/octocat/Hello-World/milestones{/number}",
    "notifications_url": "http://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}",
    "pulls_url": "http://api.github.com/repos/octocat/Hello-World/pulls{/number}",
    "releases_url": "http://api.github.com/repos/octocat/Hello-World/releases{/id}",
    "ssh_url": "git@github.com:octocat/Hello-World.git",
    "stargazers_url": "http://api.github.com/repos/octocat/Hello-World/stargazers",
    "statuses_url": "http://api.github.com/repos/octocat/Hello-World/statuses/{sha}",
    "subscribers_url": "http://api.github.com/repos/octocat/Hello-World/subscribers",
    "subscription_url": "http://api.github.com/repos/octocat/Hello-World/subscription",
    "tags_url": "http://api.github.com/repos/octocat/Hello-World/tags",
    "teams_url": "http://api.github.com/repos/octocat/Hello-World/teams",
    "trees_url": "http://api.github.com/repos/octocat/Hello-World/git/trees{/sha}",
    "clone_url": "https://github.com/octocat/Hello-World.git",
    "mirror_url": "git:git.example.com/octocat/Hello-World",
    "hooks_url": "http://api.github.com/repos/octocat/Hello-World/hooks",
    "svn_url": "https://svn.github.com/octocat/Hello-World",
    "homepage": "https://github.com",
    "language": null,
    "forks_count": 9,
    "stargazers_count": 80,
    "watchers_count": 80,
    "size": 108,
    "default_branch": "master",
    "open_issues_count": 0,
    "is_template": true,
    "topics": [
      "octocat",
      "atom",
      "electron",
      "api"
    ],
    "has_issues": true,
    "has_projects": true,
    "has_wiki": true,
    "has_pages": false,
    "has_downloads": true,
    "archived": false,
    "disabled": false,
    "visibility": "public",
    "pushed_at": "2011-01-26T19:06:43Z",
    "created_at": "2011-01-26T19:01:12Z",
    "updated_at": "2011-01-26T19:14:43Z",
    "permissions": {
      "admin": false,
      "push": false,
      "pull": true
    },
    "allow_rebase_merge": true,
    "template_repository": null,
    "temp_clone_token": "ABTLWHOULUVAXGTRYU7OC2876QJ2O",
    "allow_squash_merge": true,
    "delete_branch_on_merge": true,
    "allow_merge_commit": true,
    "subscribers_count": 42,
    "network_count": 0
  }
]

get /user/starred/{owner}/{repo}

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

owner string path
repo string path

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/user/starred/octocat/hello-world
JavaScript (@octokit/core.js)
await octokit.request('GET /user/starred/{owner}/{repo}', {
  owner: 'octocat',
  repo: 'hello-world'
})

Response if this repository is starred by you

Status: 204 No Content

Response if this repository is not starred by you

Status: 404 Not Found

Star a repository for the authenticated user

Note that you'll need to set Content-Length to zero when calling out to this endpoint. For more information, see "HTTP verbs."

put /user/starred/{owner}/{repo}

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

owner string path
repo string path

Code samples

Shell
curl \
  -X PUT \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/user/starred/octocat/hello-world
JavaScript (@octokit/core.js)
await octokit.request('PUT /user/starred/{owner}/{repo}', {
  owner: 'octocat',
  repo: 'hello-world'
})

Default Response

Status: 204 No Content

delete /user/starred/{owner}/{repo}

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

owner string path
repo string path

Code samples

Shell
curl \
  -X DELETE \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/user/starred/octocat/hello-world
JavaScript (@octokit/core.js)
await octokit.request('DELETE /user/starred/{owner}/{repo}', {
  owner: 'octocat',
  repo: 'hello-world'
})

Default Response

Status: 204 No Content

List repositories starred by a user

Lists repositories a user has starred.

You can also find out when stars were created by passing the following custom media type via the Accept header:

get /users/{username}/starred

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

username string path
sort string query

One of created (when the repository was starred) or updated (when it was last pushed to).

direction string query

One of asc (ascending) or desc (descending).

per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/users/USERNAME/starred
JavaScript (@octokit/core.js)
await octokit.request('GET /users/{username}/starred', {
  username: 'username'
})

Default response

Status: 200 OK
[
  {
    "id": 1296269,
    "node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5",
    "name": "Hello-World",
    "full_name": "octocat/Hello-World",
    "owner": {
      "login": "octocat",
      "id": 1,
      "node_id": "MDQ6VXNlcjE=",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "gravatar_id": "",
      "url": "https://api.github.com/users/octocat",
      "html_url": "https://github.com/octocat",
      "followers_url": "https://api.github.com/users/octocat/followers",
      "following_url": "https://api.github.com/users/octocat/following{/other_user}",
      "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
      "organizations_url": "https://api.github.com/users/octocat/orgs",
      "repos_url": "https://api.github.com/users/octocat/repos",
      "events_url": "https://api.github.com/users/octocat/events{/privacy}",
      "received_events_url": "https://api.github.com/users/octocat/received_events",
      "type": "User",
      "site_admin": false
    },
    "private": false,
    "html_url": "https://github.com/octocat/Hello-World",
    "description": "This your first repo!",
    "fork": false,
    "url": "https://api.github.com/repos/octocat/Hello-World",
    "archive_url": "http://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}",
    "assignees_url": "http://api.github.com/repos/octocat/Hello-World/assignees{/user}",
    "blobs_url": "http://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}",
    "branches_url": "http://api.github.com/repos/octocat/Hello-World/branches{/branch}",
    "collaborators_url": "http://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}",
    "comments_url": "http://api.github.com/repos/octocat/Hello-World/comments{/number}",
    "commits_url": "http://api.github.com/repos/octocat/Hello-World/commits{/sha}",
    "compare_url": "http://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}",
    "contents_url": "http://api.github.com/repos/octocat/Hello-World/contents/{+path}",
    "contributors_url": "http://api.github.com/repos/octocat/Hello-World/contributors",
    "deployments_url": "http://api.github.com/repos/octocat/Hello-World/deployments",
    "downloads_url": "http://api.github.com/repos/octocat/Hello-World/downloads",
    "events_url": "http://api.github.com/repos/octocat/Hello-World/events",
    "forks_url": "http://api.github.com/repos/octocat/Hello-World/forks",
    "git_commits_url": "http://api.github.com/repos/octocat/Hello-World/git/commits{/sha}",
    "git_refs_url": "http://api.github.com/repos/octocat/Hello-World/git/refs{/sha}",
    "git_tags_url": "http://api.github.com/repos/octocat/Hello-World/git/tags{/sha}",
    "git_url": "git:github.com/octocat/Hello-World.git",
    "issue_comment_url": "http://api.github.com/repos/octocat/Hello-World/issues/comments{/number}",
    "issue_events_url": "http://api.github.com/repos/octocat/Hello-World/issues/events{/number}",
    "issues_url": "http://api.github.com/repos/octocat/Hello-World/issues{/number}",
    "keys_url": "http://api.github.com/repos/octocat/Hello-World/keys{/key_id}",
    "labels_url": "http://api.github.com/repos/octocat/Hello-World/labels{/name}",
    "languages_url": "http://api.github.com/repos/octocat/Hello-World/languages",
    "merges_url": "http://api.github.com/repos/octocat/Hello-World/merges",
    "milestones_url": "http://api.github.com/repos/octocat/Hello-World/milestones{/number}",
    "notifications_url": "http://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}",
    "pulls_url": "http://api.github.com/repos/octocat/Hello-World/pulls{/number}",
    "releases_url": "http://api.github.com/repos/octocat/Hello-World/releases{/id}",
    "ssh_url": "git@github.com:octocat/Hello-World.git",
    "stargazers_url": "http://api.github.com/repos/octocat/Hello-World/stargazers",
    "statuses_url": "http://api.github.com/repos/octocat/Hello-World/statuses/{sha}",
    "subscribers_url": "http://api.github.com/repos/octocat/Hello-World/subscribers",
    "subscription_url": "http://api.github.com/repos/octocat/Hello-World/subscription",
    "tags_url": "http://api.github.com/repos/octocat/Hello-World/tags",
    "teams_url": "http://api.github.com/repos/octocat/Hello-World/teams",
    "trees_url": "http://api.github.com/repos/octocat/Hello-World/git/trees{/sha}",
    "clone_url": "https://github.com/octocat/Hello-World.git",
    "mirror_url": "git:git.example.com/octocat/Hello-World",
    "hooks_url": "http://api.github.com/repos/octocat/Hello-World/hooks",
    "svn_url": "https://svn.github.com/octocat/Hello-World",
    "homepage": "https://github.com",
    "language": null,
    "forks_count": 9,
    "stargazers_count": 80,
    "watchers_count": 80,
    "size": 108,
    "default_branch": "master",
    "open_issues_count": 0,
    "is_template": true,
    "topics": [
      "octocat",
      "atom",
      "electron",
      "api"
    ],
    "has_issues": true,
    "has_projects": true,
    "has_wiki": true,
    "has_pages": false,
    "has_downloads": true,
    "archived": false,
    "disabled": false,
    "visibility": "public",
    "pushed_at": "2011-01-26T19:06:43Z",
    "created_at": "2011-01-26T19:01:12Z",
    "updated_at": "2011-01-26T19:14:43Z",
    "permissions": {
      "admin": false,
      "push": false,
      "pull": true
    },
    "allow_rebase_merge": true,
    "template_repository": null,
    "temp_clone_token": "ABTLWHOULUVAXGTRYU7OC2876QJ2O",
    "allow_squash_merge": true,
    "delete_branch_on_merge": true,
    "allow_merge_commit": true,
    "subscribers_count": 42,
    "network_count": 0
  }
]

Notes


Watching

Watching a repository registers the user to receive notifications on new discussions, as well as events in the user's activity feed. For simple repository bookmarks, see "Repository starring."

List watchers

Lists the people watching the specified repository.

get /repos/{owner}/{repo}/subscribers

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

owner string path
repo string path
per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/repos/octocat/hello-world/subscribers
JavaScript (@octokit/core.js)
await octokit.request('GET /repos/{owner}/{repo}/subscribers', {
  owner: 'octocat',
  repo: 'hello-world'
})

Default response

Status: 200 OK
[
  {
    "login": "octocat",
    "id": 1,
    "node_id": "MDQ6VXNlcjE=",
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "",
    "url": "https://api.github.com/users/octocat",
    "html_url": "https://github.com/octocat",
    "followers_url": "https://api.github.com/users/octocat/followers",
    "following_url": "https://api.github.com/users/octocat/following{/other_user}",
    "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
    "organizations_url": "https://api.github.com/users/octocat/orgs",
    "repos_url": "https://api.github.com/users/octocat/repos",
    "events_url": "https://api.github.com/users/octocat/events{/privacy}",
    "received_events_url": "https://api.github.com/users/octocat/received_events",
    "type": "User",
    "site_admin": false
  }
]

Notes


get /repos/{owner}/{repo}/subscription

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

owner string path
repo string path

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/repos/octocat/hello-world/subscription
JavaScript (@octokit/core.js)
await octokit.request('GET /repos/{owner}/{repo}/subscription', {
  owner: 'octocat',
  repo: 'hello-world'
})

Response if you subscribe to the repository

Status: 200 OK
{
  "subscribed": true,
  "ignored": false,
  "reason": null,
  "created_at": "2012-10-06T21:34:12Z",
  "url": "https://api.github.com/repos/octocat/example/subscription",
  "repository_url": "https://api.github.com/repos/octocat/example"
}

Response if you don t subscribe to the repository

Status: 404 Not Found

Set a repository subscription

If you would like to watch a repository, set subscribed to true. If you would like to ignore notifications made within a repository, set ignored to true. If you would like to stop watching a repository, delete the repository's subscription completely.

put /repos/{owner}/{repo}/subscription

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

owner string path
repo string path
subscribed boolean body

Determines if notifications should be received from this repository.

ignored boolean body

Determines if all notifications should be blocked from this repository.

Code samples

Shell
curl \
  -X PUT \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/repos/octocat/hello-world/subscription \
  -d '{"subscribed":true}'
JavaScript (@octokit/core.js)
await octokit.request('PUT /repos/{owner}/{repo}/subscription', {
  owner: 'octocat',
  repo: 'hello-world',
  subscribed: true
})

Default response

Status: 200 OK
{
  "subscribed": true,
  "ignored": false,
  "reason": null,
  "created_at": "2012-10-06T21:34:12Z",
  "url": "https://api.github.com/repos/octocat/example/subscription",
  "repository_url": "https://api.github.com/repos/octocat/example"
}

Delete a repository subscription

This endpoint should only be used to stop watching a repository. To control whether or not you wish to receive notifications from a repository, set the repository's subscription manually.

delete /repos/{owner}/{repo}/subscription

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

owner string path
repo string path

Code samples

Shell
curl \
  -X DELETE \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/repos/octocat/hello-world/subscription
JavaScript (@octokit/core.js)
await octokit.request('DELETE /repos/{owner}/{repo}/subscription', {
  owner: 'octocat',
  repo: 'hello-world'
})

Default Response

Status: 204 No Content

List repositories watched by the authenticated user

Lists repositories the authenticated user is watching.

get /user/subscriptions

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/user/subscriptions
JavaScript (@octokit/core.js)
await octokit.request('GET /user/subscriptions')

Default response

Status: 200 OK
[
  {
    "id": 1296269,
    "node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5",
    "name": "Hello-World",
    "full_name": "octocat/Hello-World",
    "owner": {
      "login": "octocat",
      "id": 1,
      "node_id": "MDQ6VXNlcjE=",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "gravatar_id": "",
      "url": "https://api.github.com/users/octocat",
      "html_url": "https://github.com/octocat",
      "followers_url": "https://api.github.com/users/octocat/followers",
      "following_url": "https://api.github.com/users/octocat/following{/other_user}",
      "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
      "organizations_url": "https://api.github.com/users/octocat/orgs",
      "repos_url": "https://api.github.com/users/octocat/repos",
      "events_url": "https://api.github.com/users/octocat/events{/privacy}",
      "received_events_url": "https://api.github.com/users/octocat/received_events",
      "type": "User",
      "site_admin": false
    },
    "private": false,
    "html_url": "https://github.com/octocat/Hello-World",
    "description": "This your first repo!",
    "fork": false,
    "url": "https://api.github.com/repos/octocat/Hello-World",
    "archive_url": "http://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}",
    "assignees_url": "http://api.github.com/repos/octocat/Hello-World/assignees{/user}",
    "blobs_url": "http://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}",
    "branches_url": "http://api.github.com/repos/octocat/Hello-World/branches{/branch}",
    "collaborators_url": "http://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}",
    "comments_url": "http://api.github.com/repos/octocat/Hello-World/comments{/number}",
    "commits_url": "http://api.github.com/repos/octocat/Hello-World/commits{/sha}",
    "compare_url": "http://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}",
    "contents_url": "http://api.github.com/repos/octocat/Hello-World/contents/{+path}",
    "contributors_url": "http://api.github.com/repos/octocat/Hello-World/contributors",
    "deployments_url": "http://api.github.com/repos/octocat/Hello-World/deployments",
    "downloads_url": "http://api.github.com/repos/octocat/Hello-World/downloads",
    "events_url": "http://api.github.com/repos/octocat/Hello-World/events",
    "forks_url": "http://api.github.com/repos/octocat/Hello-World/forks",
    "git_commits_url": "http://api.github.com/repos/octocat/Hello-World/git/commits{/sha}",
    "git_refs_url": "http://api.github.com/repos/octocat/Hello-World/git/refs{/sha}",
    "git_tags_url": "http://api.github.com/repos/octocat/Hello-World/git/tags{/sha}",
    "git_url": "git:github.com/octocat/Hello-World.git",
    "issue_comment_url": "http://api.github.com/repos/octocat/Hello-World/issues/comments{/number}",
    "issue_events_url": "http://api.github.com/repos/octocat/Hello-World/issues/events{/number}",
    "issues_url": "http://api.github.com/repos/octocat/Hello-World/issues{/number}",
    "keys_url": "http://api.github.com/repos/octocat/Hello-World/keys{/key_id}",
    "labels_url": "http://api.github.com/repos/octocat/Hello-World/labels{/name}",
    "languages_url": "http://api.github.com/repos/octocat/Hello-World/languages",
    "merges_url": "http://api.github.com/repos/octocat/Hello-World/merges",
    "milestones_url": "http://api.github.com/repos/octocat/Hello-World/milestones{/number}",
    "notifications_url": "http://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}",
    "pulls_url": "http://api.github.com/repos/octocat/Hello-World/pulls{/number}",
    "releases_url": "http://api.github.com/repos/octocat/Hello-World/releases{/id}",
    "ssh_url": "git@github.com:octocat/Hello-World.git",
    "stargazers_url": "http://api.github.com/repos/octocat/Hello-World/stargazers",
    "statuses_url": "http://api.github.com/repos/octocat/Hello-World/statuses/{sha}",
    "subscribers_url": "http://api.github.com/repos/octocat/Hello-World/subscribers",
    "subscription_url": "http://api.github.com/repos/octocat/Hello-World/subscription",
    "tags_url": "http://api.github.com/repos/octocat/Hello-World/tags",
    "teams_url": "http://api.github.com/repos/octocat/Hello-World/teams",
    "trees_url": "http://api.github.com/repos/octocat/Hello-World/git/trees{/sha}",
    "clone_url": "https://github.com/octocat/Hello-World.git",
    "mirror_url": "git:git.example.com/octocat/Hello-World",
    "hooks_url": "http://api.github.com/repos/octocat/Hello-World/hooks",
    "svn_url": "https://svn.github.com/octocat/Hello-World",
    "homepage": "https://github.com",
    "language": null,
    "forks_count": 9,
    "stargazers_count": 80,
    "watchers_count": 80,
    "size": 108,
    "default_branch": "master",
    "open_issues_count": 0,
    "is_template": true,
    "topics": [
      "octocat",
      "atom",
      "electron",
      "api"
    ],
    "has_issues": true,
    "has_projects": true,
    "has_wiki": true,
    "has_pages": false,
    "has_downloads": true,
    "archived": false,
    "disabled": false,
    "visibility": "public",
    "pushed_at": "2011-01-26T19:06:43Z",
    "created_at": "2011-01-26T19:01:12Z",
    "updated_at": "2011-01-26T19:14:43Z",
    "permissions": {
      "admin": false,
      "push": false,
      "pull": true
    },
    "template_repository": null,
    "temp_clone_token": "ABTLWHOULUVAXGTRYU7OC2876QJ2O",
    "delete_branch_on_merge": true,
    "subscribers_count": 42,
    "network_count": 0,
    "license": {
      "key": "mit",
      "name": "MIT License",
      "spdx_id": "MIT",
      "url": "https://api.github.com/licenses/mit",
      "node_id": "MDc6TGljZW5zZW1pdA=="
    }
  }
]

List repositories watched by a user

Lists repositories a user is watching.

get /users/{username}/subscriptions

Parameters

Name Type In Description
accept string header

Setting to application/vnd.github.v3+json is recommended

username string path
per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/users/USERNAME/subscriptions
JavaScript (@octokit/core.js)
await octokit.request('GET /users/{username}/subscriptions', {
  username: 'username'
})

Default response

Status: 200 OK
[
  {
    "id": 1296269,
    "node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5",
    "name": "Hello-World",
    "full_name": "octocat/Hello-World",
    "owner": {
      "login": "octocat",
      "id": 1,
      "node_id": "MDQ6VXNlcjE=",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "gravatar_id": "",
      "url": "https://api.github.com/users/octocat",
      "html_url": "https://github.com/octocat",
      "followers_url": "https://api.github.com/users/octocat/followers",
      "following_url": "https://api.github.com/users/octocat/following{/other_user}",
      "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
      "organizations_url": "https://api.github.com/users/octocat/orgs",
      "repos_url": "https://api.github.com/users/octocat/repos",
      "events_url": "https://api.github.com/users/octocat/events{/privacy}",
      "received_events_url": "https://api.github.com/users/octocat/received_events",
      "type": "User",
      "site_admin": false
    },
    "private": false,
    "html_url": "https://github.com/octocat/Hello-World",
    "description": "This your first repo!",
    "fork": false,
    "url": "https://api.github.com/repos/octocat/Hello-World",
    "archive_url": "http://api.github.com/repos/octocat/Hello-World/{archive_format}{/ref}",
    "assignees_url": "http://api.github.com/repos/octocat/Hello-World/assignees{/user}",
    "blobs_url": "http://api.github.com/repos/octocat/Hello-World/git/blobs{/sha}",
    "branches_url": "http://api.github.com/repos/octocat/Hello-World/branches{/branch}",
    "collaborators_url": "http://api.github.com/repos/octocat/Hello-World/collaborators{/collaborator}",
    "comments_url": "http://api.github.com/repos/octocat/Hello-World/comments{/number}",
    "commits_url": "http://api.github.com/repos/octocat/Hello-World/commits{/sha}",
    "compare_url": "http://api.github.com/repos/octocat/Hello-World/compare/{base}...{head}",
    "contents_url": "http://api.github.com/repos/octocat/Hello-World/contents/{+path}",
    "contributors_url": "http://api.github.com/repos/octocat/Hello-World/contributors",
    "deployments_url": "http://api.github.com/repos/octocat/Hello-World/deployments",
    "downloads_url": "http://api.github.com/repos/octocat/Hello-World/downloads",
    "events_url": "http://api.github.com/repos/octocat/Hello-World/events",
    "forks_url": "http://api.github.com/repos/octocat/Hello-World/forks",
    "git_commits_url": "http://api.github.com/repos/octocat/Hello-World/git/commits{/sha}",
    "git_refs_url": "http://api.github.com/repos/octocat/Hello-World/git/refs{/sha}",
    "git_tags_url": "http://api.github.com/repos/octocat/Hello-World/git/tags{/sha}",
    "git_url": "git:github.com/octocat/Hello-World.git",
    "issue_comment_url": "http://api.github.com/repos/octocat/Hello-World/issues/comments{/number}",
    "issue_events_url": "http://api.github.com/repos/octocat/Hello-World/issues/events{/number}",
    "issues_url": "http://api.github.com/repos/octocat/Hello-World/issues{/number}",
    "keys_url": "http://api.github.com/repos/octocat/Hello-World/keys{/key_id}",
    "labels_url": "http://api.github.com/repos/octocat/Hello-World/labels{/name}",
    "languages_url": "http://api.github.com/repos/octocat/Hello-World/languages",
    "merges_url": "http://api.github.com/repos/octocat/Hello-World/merges",
    "milestones_url": "http://api.github.com/repos/octocat/Hello-World/milestones{/number}",
    "notifications_url": "http://api.github.com/repos/octocat/Hello-World/notifications{?since,all,participating}",
    "pulls_url": "http://api.github.com/repos/octocat/Hello-World/pulls{/number}",
    "releases_url": "http://api.github.com/repos/octocat/Hello-World/releases{/id}",
    "ssh_url": "git@github.com:octocat/Hello-World.git",
    "stargazers_url": "http://api.github.com/repos/octocat/Hello-World/stargazers",
    "statuses_url": "http://api.github.com/repos/octocat/Hello-World/statuses/{sha}",
    "subscribers_url": "http://api.github.com/repos/octocat/Hello-World/subscribers",
    "subscription_url": "http://api.github.com/repos/octocat/Hello-World/subscription",
    "tags_url": "http://api.github.com/repos/octocat/Hello-World/tags",
    "teams_url": "http://api.github.com/repos/octocat/Hello-World/teams",
    "trees_url": "http://api.github.com/repos/octocat/Hello-World/git/trees{/sha}",
    "clone_url": "https://github.com/octocat/Hello-World.git",
    "mirror_url": "git:git.example.com/octocat/Hello-World",
    "hooks_url": "http://api.github.com/repos/octocat/Hello-World/hooks",
    "svn_url": "https://svn.github.com/octocat/Hello-World",
    "homepage": "https://github.com",
    "language": null,
    "forks_count": 9,
    "stargazers_count": 80,
    "watchers_count": 80,
    "size": 108,
    "default_branch": "master",
    "open_issues_count": 0,
    "is_template": true,
    "topics": [
      "octocat",
      "atom",
      "electron",
      "api"
    ],
    "has_issues": true,
    "has_projects": true,
    "has_wiki": true,
    "has_pages": false,
    "has_downloads": true,
    "archived": false,
    "disabled": false,
    "visibility": "public",
    "pushed_at": "2011-01-26T19:06:43Z",
    "created_at": "2011-01-26T19:01:12Z",
    "updated_at": "2011-01-26T19:14:43Z",
    "permissions": {
      "admin": false,
      "push": false,
      "pull": true
    },
    "template_repository": null,
    "temp_clone_token": "ABTLWHOULUVAXGTRYU7OC2876QJ2O",
    "delete_branch_on_merge": true,
    "subscribers_count": 42,
    "network_count": 0,
    "license": {
      "key": "mit",
      "name": "MIT License",
      "spdx_id": "MIT",
      "url": "https://api.github.com/licenses/mit",
      "node_id": "MDc6TGljZW5zZW1pdA=="
    }
  }
]

Notes


Did this doc help you?

Ask a human

Can't find what you're looking for?

Contact us
` var activityEventsGoFileOriginal = `// Copyright 2013 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 ( "context" "fmt" ) // ListEvents drinks from the firehose of all public events across GitHub. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-public-events func (s *ActivityService) ListEvents(ctx context.Context, opts *ListOptions) ([]*Event, *Response, error) { u, err := addOptions("events", opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListRepositoryEvents lists events for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-repository-events func (s *ActivityService) ListRepositoryEvents(ctx context.Context, owner, repo string, opts *ListOptions) ([]*Event, *Response, error) { u := fmt.Sprintf("repos/%v/%v/events", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // Note that ActivityService.ListIssueEventsForRepository was moved to: // IssuesService.ListRepositoryEvents. // ListEventsForRepoNetwork lists public events for a network of repositories. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-public-events-for-a-network-of-repositories func (s *ActivityService) ListEventsForRepoNetwork(ctx context.Context, owner, repo string, opts *ListOptions) ([]*Event, *Response, error) { u := fmt.Sprintf("networks/%v/%v/events", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListEventsForOrganization lists public events for an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-public-events-for-an-organization func (s *ActivityService) ListEventsForOrganization(ctx context.Context, org string, opts *ListOptions) ([]*Event, *Response, error) { u := fmt.Sprintf("orgs/%v/events", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListEventsPerformedByUser lists the events performed by a user. If publicOnly is // true, only public events will be returned. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-events-for-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-public-events-for-a-user func (s *ActivityService) ListEventsPerformedByUser(ctx context.Context, user string, publicOnly bool, opts *ListOptions) ([]*Event, *Response, error) { var u string if publicOnly { u = fmt.Sprintf("users/%v/events/public", user) } else { u = fmt.Sprintf("users/%v/events", user) } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListEventsReceivedByUser lists the events received by a user. If publicOnly is // true, only public events will be returned. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-events-received-by-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-public-events-received-by-a-user func (s *ActivityService) ListEventsReceivedByUser(ctx context.Context, user string, publicOnly bool, opts *ListOptions) ([]*Event, *Response, error) { var u string if publicOnly { u = fmt.Sprintf("users/%v/received_events/public", user) } else { u = fmt.Sprintf("users/%v/received_events", user) } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListUserEventsForOrganization provides the user’s organization dashboard. You // must be authenticated as the user to view this. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-events-for-an-organization func (s *ActivityService) ListUserEventsForOrganization(ctx context.Context, org, user string, opts *ListOptions) ([]*Event, *Response, error) { u := fmt.Sprintf("users/%v/events/orgs/%v", user, org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } ` var activityEventsGoFileWant = `// Copyright 2013 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 ( "context" "fmt" ) // ListEvents drinks from the firehose of all public events across GitHub. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-public-events func (s *ActivityService) ListEvents(ctx context.Context, opts *ListOptions) ([]*Event, *Response, error) { u, err := addOptions("events", opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListRepositoryEvents lists events for a repository. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-repository-events func (s *ActivityService) ListRepositoryEvents(ctx context.Context, owner, repo string, opts *ListOptions) ([]*Event, *Response, error) { u := fmt.Sprintf("repos/%v/%v/events", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // Note that ActivityService.ListIssueEventsForRepository was moved to: // IssuesService.ListRepositoryEvents. // ListEventsForRepoNetwork lists public events for a network of repositories. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-public-events-for-a-network-of-repositories func (s *ActivityService) ListEventsForRepoNetwork(ctx context.Context, owner, repo string, opts *ListOptions) ([]*Event, *Response, error) { u := fmt.Sprintf("networks/%v/%v/events", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListEventsForOrganization lists public events for an organization. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-public-organization-events func (s *ActivityService) ListEventsForOrganization(ctx context.Context, org string, opts *ListOptions) ([]*Event, *Response, error) { u := fmt.Sprintf("orgs/%v/events", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListEventsPerformedByUser lists the events performed by a user. If publicOnly is // true, only public events will be returned. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-events-for-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-public-events-for-a-user func (s *ActivityService) ListEventsPerformedByUser(ctx context.Context, user string, publicOnly bool, opts *ListOptions) ([]*Event, *Response, error) { var u string if publicOnly { u = fmt.Sprintf("users/%v/events/public", user) } else { u = fmt.Sprintf("users/%v/events", user) } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListEventsReceivedByUser lists the events received by a user. If publicOnly is // true, only public events will be returned. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-events-received-by-the-authenticated-user // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-public-events-received-by-a-user func (s *ActivityService) ListEventsReceivedByUser(ctx context.Context, user string, publicOnly bool, opts *ListOptions) ([]*Event, *Response, error) { var u string if publicOnly { u = fmt.Sprintf("users/%v/received_events/public", user) } else { u = fmt.Sprintf("users/%v/received_events", user) } u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } // ListUserEventsForOrganization provides the user’s organization dashboard. You // must be authenticated as the user to view this. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-organization-events-for-the-authenticated-user func (s *ActivityService) ListUserEventsForOrganization(ctx context.Context, org, user string, opts *ListOptions) ([]*Event, *Response, error) { u := fmt.Sprintf("users/%v/events/orgs/%v", user, org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var events []*Event resp, err := s.client.Do(ctx, req, &events) if err != nil { return nil, resp, err } return events, resp, nil } ` go-github-38.1.0/update-urls/go.mod000066400000000000000000000001461410475703100170460ustar00rootroot00000000000000module github.com/google/go-github/update-urls go 1.16 require github.com/pmezard/go-difflib v1.0.0 go-github-38.1.0/update-urls/go.sum000066400000000000000000000002611410475703100170710ustar00rootroot00000000000000github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= go-github-38.1.0/update-urls/main.go000066400000000000000000001150721410475703100172200ustar00rootroot00000000000000// Copyright 2020 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. // update-urls updates GitHub URL docs for each service endpoint. // // It is meant to be used periodically by go-github repo maintainers // to update stale GitHub Developer v3 API documentation URLs. // // Usage (from go-github directory): // go run ./update-urls/main.go // go generate ./... // go test ./... // go vet ./... // // When confronted with "PLEASE CHECK MANUALLY AND FIX", the problematic // URL needs to be debugged. To debug a specific file, run like this: // go run ./update-urls/main.go -v -d enterprise_actions_runners.go package main import ( "errors" "flag" "fmt" "go/ast" "go/parser" "go/token" "io/ioutil" "log" "net/http" "os" "regexp" "sort" "strings" ) const ( codeLegacySplitString = `` codeSplitString = `await octokit.request('` fragmentIDString = `

0 { pos := fileRewriter.Position(endpoint.endpointComments[i-1].Pos()) fmt.Printf("%v:%v:%v: WARNING: unable to find online docs for %q: (%v)\nPLEASE CHECK MANUALLY AND FIX.\n", pos.Filename, pos.Line, pos.Column, fullName, methodAndPath) } else { fmt.Printf("%v: WARNING: unable to find online docs for %q: (%v)\nPLEASE CHECK MANUALLY AND FIX.\n", filename, fullName, methodAndPath) } continue } logf("found %q for: %q (%v)", url, fullName, methodAndPath) // Make sure URL is up-to-date. switch { case len(endpoint.enterpriseRefLines) > 1: log.Printf("WARNING: multiple Enterprise GitHub URLs found - skipping:") for i, refLine := range endpoint.enterpriseRefLines { log.Printf("line %v: %#v", i, refLine) } case len(endpoint.enterpriseRefLines) > 0: line := fmt.Sprintf(enterpriseRefFmt, url) cmt := endpoint.enterpriseRefLines[0] if cmt.Text != line { pos := fileRewriter.Position(cmt.Pos()) logf("At byte offset %v:\nFOUND %q\nWANT: %q", pos.Offset, cmt.Text, line) fileEdits = append(fileEdits, &FileEdit{ pos: pos, fromText: cmt.Text, toText: line, }) } case len(endpoint.stdRefLines) > 1: var foundMatch bool line := fmt.Sprintf(stdRefFmt, url) for i, stdRefLine := range endpoint.stdRefLines { if stdRefLine.Text == line { foundMatch = true logf("found match with %v, not editing and removing from list", line) // Remove matching line endpoint.stdRefLines = append(endpoint.stdRefLines[:i], endpoint.stdRefLines[i+1:]...) break } } if !foundMatch { // Edit last stdRefLine, then remove it. cmt := endpoint.stdRefLines[len(endpoint.stdRefLines)-1] pos := fileRewriter.Position(cmt.Pos()) logf("stdRefLines=%v: At byte offset %v:\nFOUND %q\nWANT: %q", len(endpoint.stdRefLines), pos.Offset, cmt.Text, line) fileEdits = append(fileEdits, &FileEdit{ pos: pos, fromText: cmt.Text, toText: line, }) endpoint.stdRefLines = endpoint.stdRefLines[:len(endpoint.stdRefLines)-1] } case len(endpoint.stdRefLines) > 0: line := fmt.Sprintf(stdRefFmt, url) cmt := endpoint.stdRefLines[0] if cmt.Text != line { pos := fileRewriter.Position(cmt.Pos()) logf("stdRefLines=1: At byte offset %v:\nFOUND %q\nWANT: %q", pos.Offset, cmt.Text, line) fileEdits = append(fileEdits, &FileEdit{ pos: pos, fromText: cmt.Text, toText: line, }) } endpoint.stdRefLines = nil case len(endpoint.endpointComments) > 0: lastCmt := endpoint.endpointComments[len(endpoint.endpointComments)-1] // logf("lastCmt.Text=%q (len=%v)", lastCmt.Text, len(lastCmt.Text)) pos := fileRewriter.Position(lastCmt.Pos()) pos.Offset += len(lastCmt.Text) line := "\n" + fmt.Sprintf(stdRefFmt, url) if lastCmt.Text != "//" { line = "\n//" + line // Add blank comment line before URL. } // logf("line=%q (len=%v)", line, len(line)) // logf("At byte offset %v: adding missing documentation:\n%q", pos.Offset, line) fileEdits = append(fileEdits, &FileEdit{ pos: pos, fromText: "", toText: line, }) default: // Missing documentation - add it. log.Printf("WARNING: file %v has no godoc comment string for method %v", fullName, methodAndPath) } } } if len(fileEdits) > 0 { b, err := fileRewriter.ReadFile(filename) if err != nil { log.Fatalf("ReadFile: %v", err) } log.Printf("Performing %v edits on file %v", len(fileEdits), filename) b = performBufferEdits(b, fileEdits) if err := fileRewriter.WriteFile(filename, b, 0644); err != nil { log.Fatalf("WriteFile: %v", err) } } } } func performBufferEdits(b []byte, fileEdits []*FileEdit) []byte { fileEdits = sortAndMergeFileEdits(fileEdits) for _, edit := range fileEdits { prelude := b[0:edit.pos.Offset] postlude := b[edit.pos.Offset+len(edit.fromText):] logf("At byte offset %v, replacing %v bytes with %v bytes\nBEFORE: %v\nAFTER : %v", edit.pos.Offset, len(edit.fromText), len(edit.toText), edit.fromText, edit.toText) b = []byte(fmt.Sprintf("%s%v%s", prelude, edit.toText, postlude)) } return b } func sortAndMergeFileEdits(fileEdits []*FileEdit) []*FileEdit { // Sort edits from last to first in the file. // If the offsets are identical, sort the comment "toText" strings, ascending. var foundDups bool sort.Slice(fileEdits, func(a, b int) bool { if fileEdits[a].pos.Offset == fileEdits[b].pos.Offset { foundDups = true return fileEdits[a].toText < fileEdits[b].toText } return fileEdits[a].pos.Offset > fileEdits[b].pos.Offset }) if !foundDups { return fileEdits } // Merge the duplicate edits. var mergedEdits []*FileEdit var dupOffsets []*FileEdit mergeFunc := func() { if len(dupOffsets) > 1 { isInsert := dupOffsets[0].fromText == "" var hasBlankCommentLine bool // Merge dups var lines []string for _, dup := range dupOffsets { if isInsert && strings.HasPrefix(dup.toText, "\n//\n//") { lines = append(lines, strings.TrimPrefix(dup.toText, "\n//")) hasBlankCommentLine = true } else { lines = append(lines, dup.toText) } } sort.Strings(lines) var joinStr string // if insert, no extra newlines if !isInsert { // if replacement - add newlines joinStr = "\n" } toText := strings.Join(lines, joinStr) if hasBlankCommentLine { // Add back in toText = "\n//" + toText } mergedEdits = append(mergedEdits, &FileEdit{ pos: dupOffsets[0].pos, fromText: dupOffsets[0].fromText, toText: toText, }) } else if len(dupOffsets) > 0 { // Move non-dup to final output mergedEdits = append(mergedEdits, dupOffsets[0]) } dupOffsets = nil } lastOffset := -1 for _, fileEdit := range fileEdits { if fileEdit.pos.Offset != lastOffset { mergeFunc() } dupOffsets = append(dupOffsets, fileEdit) lastOffset = fileEdit.pos.Offset } mergeFunc() return mergedEdits } // astFileIterator iterates over all files in an ast.Package. type astFileIterator interface { // Finds the position of a token. Position(token.Pos) token.Position // Reset resets the iterator. Reset() // Next returns the next filenameAstFilePair pair or nil if done. Next() *filenameAstFilePair } type filenameAstFilePair struct { filename string astFile *ast.File } // realAstFileIterator implements astFileIterator. type realAstFileIterator struct { fset *token.FileSet pkgs map[string]*ast.Package ch chan *filenameAstFilePair closed bool } func (rafi *realAstFileIterator) Position(pos token.Pos) token.Position { return rafi.fset.Position(pos) } func (rafi *realAstFileIterator) Reset() { if !rafi.closed && rafi.ch != nil { logf("Closing old channel on Reset") close(rafi.ch) } rafi.ch = make(chan *filenameAstFilePair, 10) rafi.closed = false go func() { var count int for _, pkg := range rafi.pkgs { for filename, f := range pkg.Files { logf("Sending file #%v: %v to channel", count, filename) rafi.ch <- &filenameAstFilePair{filename: filename, astFile: f} count++ } } rafi.closed = true close(rafi.ch) logf("Closed channel after sending %v files", count) if count == 0 { log.Fatalf("Processed no files. Did you run this from the go-github directory?") } }() } func (rafi *realAstFileIterator) Next() *filenameAstFilePair { for pair := range rafi.ch { logf("Next: returning file %v", pair.filename) return pair } return nil } func findAllServices(pkgs map[string]*ast.Package) servicesMap { services := servicesMap{} for _, pkg := range pkgs { for filename, f := range pkg.Files { if filename != "github.go" { continue } logf("Step 1 - Processing %v ...", filename) if err := findClientServices(filename, f, services); err != nil { log.Fatal(err) } } } return services } func findAllServiceEndpoints(iter astFileIterator, services servicesMap) (endpointsMap, error) { endpoints := endpointsMap{} iter.Reset() var errs []string // Collect all the errors and return in a big batch. for next := iter.Next(); next != nil; next = iter.Next() { filename, f := next.filename, next.astFile if filename == "github.go" { continue } if *debugFile != "" && !strings.Contains(filename, *debugFile) { continue } logf("Step 2 - Processing %v ...", filename) if err := processAST(filename, f, services, endpoints, iter); err != nil { errs = append(errs, err.Error()) } } if len(errs) > 0 { return nil, errors.New(strings.Join(errs, "\n")) } return endpoints, nil } func resolveHelpersAndCacheDocs(endpoints endpointsMap, docCache documentCacheWriter) (usedHelpers usedHelpersMap, endpointsByFilename endpointsByFilenameMap) { usedHelpers = usedHelpersMap{} endpointsByFilename = endpointsByFilenameMap{} for k, v := range endpoints { if _, ok := endpointsByFilename[v.filename]; !ok { endpointsByFilename[v.filename] = []*Endpoint{} } endpointsByFilename[v.filename] = append(endpointsByFilename[v.filename], v) for _, cmt := range v.enterpriseRefLines { docCache.CacheDocFromInternet(cmt.Text, v.filename) } for _, cmt := range v.stdRefLines { docCache.CacheDocFromInternet(cmt.Text, v.filename) } if v.httpMethod == "" && v.helperMethod != "" { fullName := fmt.Sprintf("%v.%v", v.serviceName, v.helperMethod) hm, ok := endpoints[fullName] if !ok { log.Fatalf("Unable to find helper method %q for %q", fullName, k) } if hm.httpMethod == "" { log.Fatalf("Helper method %q for %q has empty httpMethod: %#v", fullName, k, hm) } v.httpMethod = hm.httpMethod usedHelpers[fullName] = true } } return usedHelpers, endpointsByFilename } type documentCacheReader interface { UrlByMethodAndPath(string) (string, bool) } type documentCacheWriter interface { CacheDocFromInternet(urlWithFragmentID, filename string) } // documentCache implements documentCacheReader and documentCachWriter. type documentCache struct { apiDocs map[string]map[string][]*Endpoint // cached by URL, then mapped by web fragment identifier. urlByMethodAndPath map[string]string } func (dc *documentCache) UrlByMethodAndPath(methodAndPath string) (string, bool) { url, ok := dc.urlByMethodAndPath[methodAndPath] return url, ok } func (dc *documentCache) CacheDocFromInternet(urlWithID, filename string) { if dc.apiDocs == nil { dc.apiDocs = map[string]map[string][]*Endpoint{} // cached by URL, then mapped by web fragment identifier. dc.urlByMethodAndPath = map[string]string{} } url := getURL(urlWithID) if _, ok := dc.apiDocs[url]; ok { return // already cached } logf("GET %q ...", url) resp, err := http.Get(url) check("Unable to get URL: %v: %v", url, err) if resp.StatusCode != http.StatusOK { log.Fatalf("filename: %v - url %v - StatusCode=%v", filename, url, resp.StatusCode) } finalURL := resp.Request.URL.String() url = getURL(finalURL) logf("The final URL is: %v; url=%v\n", finalURL, url) b, err := ioutil.ReadAll(resp.Body) check("Unable to read body of URL: %v, %v", url, err) check("Unable to close body of URL: %v, %v", url, resp.Body.Close()) dc.apiDocs[url] = parseWebPageEndpoints(string(b)) logf("Found %v web page fragment identifiers.", len(dc.apiDocs[url])) if len(dc.apiDocs[url]) == 0 { logf("webage text: %s", b) } // Now reverse-map the methods+paths to URLs. for fragID, v := range dc.apiDocs[url] { logf("For fragID=%q, found %v endpoints.", fragID, len(v)) for _, endpoint := range v { logf("For fragID=%q, endpoint=%q, found %v paths.", fragID, endpoint, len(endpoint.urlFormats)) for _, path := range endpoint.urlFormats { methodAndPath := fmt.Sprintf("%v %v", endpoint.httpMethod, path) dc.urlByMethodAndPath[methodAndPath] = fmt.Sprintf("%v#%v", url, fragID) logf("urlByMethodAndPath[%q] = %q", methodAndPath, dc.urlByMethodAndPath[methodAndPath]) } } } } // FileEdit represents an edit that needs to be performed on a file. type FileEdit struct { pos token.Position fromText string toText string } func getURL(s string) string { i := strings.Index(s, "http") if i < 0 { return "" } j := strings.Index(s, "#") if j < i { s = s[i:] } else { s = s[i:j] } if !strings.HasSuffix(s, "/") { // Prevent unnecessary redirects if possible. s += "/" } return s } // Service represents a go-github service. type Service struct { serviceName string } // Endpoint represents an API endpoint in this repo. type Endpoint struct { endpointName string filename string serviceName string urlFormats []string httpMethod string helperMethod string // If populated, httpMethod lives in helperMethod. enterpriseRefLines []*ast.Comment stdRefLines []*ast.Comment endpointComments []*ast.Comment } // String helps with debugging by providing an easy-to-read summary of the endpoint. func (e *Endpoint) String() string { var b strings.Builder b.WriteString(fmt.Sprintf(" filename: %v\n", e.filename)) b.WriteString(fmt.Sprintf(" serviceName: %v\n", e.serviceName)) b.WriteString(fmt.Sprintf(" endpointName: %v\n", e.endpointName)) b.WriteString(fmt.Sprintf(" httpMethod: %v\n", e.httpMethod)) if e.helperMethod != "" { b.WriteString(fmt.Sprintf(" helperMethod: %v\n", e.helperMethod)) } for i := 0; i < len(e.urlFormats); i++ { b.WriteString(fmt.Sprintf(" urlFormats[%v]: %v\n", i, e.urlFormats[i])) } for i := 0; i < len(e.enterpriseRefLines); i++ { b.WriteString(fmt.Sprintf(" enterpriseRefLines[%v]: comment: %v\n", i, e.enterpriseRefLines[i].Text)) } for i := 0; i < len(e.stdRefLines); i++ { b.WriteString(fmt.Sprintf(" stdRefLines[%v]: comment: %v\n", i, e.stdRefLines[i].Text)) } return b.String() } func (e *Endpoint) checkHttpMethodOverride(path string) { lookupOverride := fmt.Sprintf("%v.%v: %v %v", e.serviceName, e.endpointName, e.httpMethod, path) logf("Looking up override for %q", lookupOverride) if v, ok := methodOverrides[lookupOverride]; ok { logf("overriding method for %v to %q", lookupOverride, v) e.httpMethod = v return } } func processAST(filename string, f *ast.File, services servicesMap, endpoints endpointsMap, iter astFileIterator) error { var errs []string for _, decl := range f.Decls { switch decl := decl.(type) { case *ast.FuncDecl: // Doc, Recv, Name, Type, Body if decl.Recv == nil || len(decl.Recv.List) != 1 || decl.Name == nil || decl.Body == nil { continue } recv := decl.Recv.List[0] se, ok := recv.Type.(*ast.StarExpr) // Star, X if !ok || se.X == nil || len(recv.Names) != 1 { if decl.Name.Name != "String" && decl.Name.Name != "Equal" && decl.Name.Name != "IsPullRequest" { pos := iter.Position(recv.Pos()) if id, ok := recv.Type.(*ast.Ident); ok { pos = iter.Position(id.Pos()) } errs = append(errs, fmt.Sprintf("%v:%v:%v: method %v does not use a pointer receiver and needs fixing!", pos.Filename, pos.Line, pos.Column, decl.Name)) } continue } recvType, ok := se.X.(*ast.Ident) // NamePos, Name, Obj if !ok { return fmt.Errorf("unhandled se.X = %T", se.X) } serviceName := recvType.Name if _, ok := services[serviceName]; !ok { continue } endpointName := decl.Name.Name fullName := fmt.Sprintf("%v.%v", serviceName, endpointName) if skipMethods[fullName] { logf("skipping %v", fullName) continue } receiverName := recv.Names[0].Name logf("ast.FuncDecl: %#v", *decl) // Doc, Recv, Name, Type, Body logf("ast.FuncDecl.Name: %#v", *decl.Name) // NamePos, Name, Obj(nil) // logf("ast.FuncDecl.Recv: %#v", *decl.Recv) // Opening, List, Closing logf("ast.FuncDecl.Recv.List[0]: %#v", *recv) // Doc, Names, Type, Tag, Comment // for i, name := range decl.Recv.List[0].Names { // logf("recv.name[%v] = %v", i, name.Name) // } logf("recvType = %#v", recvType) var enterpriseRefLines []*ast.Comment var stdRefLines []*ast.Comment var endpointComments []*ast.Comment if decl.Doc != nil { endpointComments = decl.Doc.List for i, comment := range decl.Doc.List { logf("doc.comment[%v] = %#v", i, *comment) // if strings.Contains(comment.Text, enterpriseURL) { // enterpriseRefLines = append(enterpriseRefLines, comment) // } else if strings.Contains(comment.Text, stdURL) { stdRefLines = append(stdRefLines, comment) } } logf("%v comment lines, %v enterprise URLs, %v standard URLs", len(decl.Doc.List), len(enterpriseRefLines), len(stdRefLines)) } bd := &bodyData{receiverName: receiverName} if err := bd.parseBody(decl.Body); err != nil { // Lbrace, List, Rbrace return fmt.Errorf("parseBody: %v", err) } ep := &Endpoint{ endpointName: endpointName, filename: filename, serviceName: serviceName, urlFormats: bd.urlFormats, httpMethod: bd.httpMethod, helperMethod: bd.helperMethod, enterpriseRefLines: enterpriseRefLines, stdRefLines: stdRefLines, endpointComments: endpointComments, } // ep.checkHttpMethodOverride("") endpoints[fullName] = ep logf("endpoints[%q] = %#v", fullName, endpoints[fullName]) if ep.httpMethod == "" && (ep.helperMethod == "" || len(ep.urlFormats) == 0) { return fmt.Errorf("could not find body info: %#v", *ep) } case *ast.GenDecl: default: return fmt.Errorf("unhandled decl type: %T", decl) } } if len(errs) > 0 { return errors.New(strings.Join(errs, "\n")) } return nil } // bodyData contains information found in a BlockStmt. type bodyData struct { receiverName string // receiver name of method to help identify helper methods. httpMethod string urlVarName string urlFormats []string assignments []lhsrhs helperMethod string // If populated, httpMethod lives in helperMethod. } func (b *bodyData) parseBody(body *ast.BlockStmt) error { logf("body=%#v", *body) // Find the variable used for the format string, its one-or-more values, // and the httpMethod used for the NewRequest. for _, stmt := range body.List { switch stmt := stmt.(type) { case *ast.AssignStmt: hm, uvn, hlp, asgn := processAssignStmt(b.receiverName, stmt) if b.httpMethod != "" && hm != "" && b.httpMethod != hm { return fmt.Errorf("found two httpMethod values: %q and %q", b.httpMethod, hm) } if hm != "" { b.httpMethod = hm // logf("parseBody: httpMethod=%v", b.httpMethod) } if hlp != "" { b.helperMethod = hlp } b.assignments = append(b.assignments, asgn...) // logf("assignments=%#v", b.assignments) if b.urlVarName == "" && uvn != "" { b.urlVarName = uvn // logf("parseBody: urlVarName=%v", b.urlVarName) // By the time the urlVarName is found, all assignments should // have already taken place so that we can find the correct // ones and determine the urlFormats. for _, lr := range b.assignments { if lr.lhs == b.urlVarName { b.urlFormats = append(b.urlFormats, lr.rhs) logf("found urlFormat: %v", lr.rhs) } } } case *ast.DeclStmt: logf("*ast.DeclStmt: %#v", *stmt) case *ast.DeferStmt: logf("*ast.DeferStmt: %#v", *stmt) case *ast.ExprStmt: logf("*ast.ExprStmt: %#v", *stmt) case *ast.IfStmt: if err := b.parseIf(stmt); err != nil { return err } case *ast.RangeStmt: logf("*ast.RangeStmt: %#v", *stmt) case *ast.ReturnStmt: // Return Results logf("*ast.ReturnStmt: %#v", *stmt) if len(stmt.Results) > 0 { ce, ok := stmt.Results[0].(*ast.CallExpr) if ok { recv, funcName, args := processCallExpr(ce) logf("return CallExpr: recv=%q, funcName=%q, args=%#v", recv, funcName, args) // If the httpMethod has not been found at this point, but // this method is calling a helper function, then see if // any of its arguments match a previous assignment, then // record the urlFormat and remember the helper method. if b.httpMethod == "" && len(args) > 1 && recv == b.receiverName { if args[0] != "ctx" { return fmt.Errorf("expected helper function to get ctx as first arg: %#v, %#v", args, *b) } if len(b.assignments) == 0 && len(b.urlFormats) == 0 { b.urlFormats = append(b.urlFormats, strings.Trim(args[1], `"`)) b.helperMethod = funcName logf("found urlFormat: %v and helper method: %v", b.urlFormats[0], b.helperMethod) } else { for _, lr := range b.assignments { if lr.lhs == args[1] { // Multiple matches are possible. Loop over all assignments. b.urlVarName = args[1] b.urlFormats = append(b.urlFormats, lr.rhs) b.helperMethod = funcName logf("found urlFormat: %v and helper method: %v", lr.rhs, b.helperMethod) } } } } } } case *ast.SwitchStmt: logf("*ast.SwitchStmt: %#v", *stmt) default: return fmt.Errorf("unhandled stmt type: %T", stmt) } } logf("parseBody: assignments=%#v", b.assignments) return nil } func (b *bodyData) parseIf(stmt *ast.IfStmt) error { logf("*ast.IfStmt: %#v", *stmt) if err := b.parseBody(stmt.Body); err != nil { return err } logf("if body: b=%#v", *b) if stmt.Else != nil { switch els := stmt.Else.(type) { case *ast.BlockStmt: if err := b.parseBody(els); err != nil { return err } logf("if else: b=%#v", *b) case *ast.IfStmt: if err := b.parseIf(els); err != nil { return err } default: return fmt.Errorf("unhandled else stmt type %T", els) } } return nil } // lhsrhs represents an assignment with a variable name on the left // and a string on the right - used to find the URL format string. type lhsrhs struct { lhs string rhs string } func processAssignStmt(receiverName string, stmt *ast.AssignStmt) (httpMethod, urlVarName, helperMethod string, assignments []lhsrhs) { logf("*ast.AssignStmt: %#v", *stmt) // Lhs, TokPos, Tok, Rhs var lhs []string for _, expr := range stmt.Lhs { switch expr := expr.(type) { case *ast.Ident: // NamePos, Name, Obj logf("processAssignStmt: *ast.Ident: %#v", expr) lhs = append(lhs, expr.Name) case *ast.SelectorExpr: // X, Sel logf("processAssignStmt: *ast.SelectorExpr: %#v", expr) default: log.Fatalf("unhandled AssignStmt Lhs type: %T", expr) } } for i, expr := range stmt.Rhs { switch expr := expr.(type) { case *ast.BasicLit: // ValuePos, Kind, Value v := strings.Trim(expr.Value, `"`) if !strings.HasPrefix(v, "?") { // Hack to remove "?recursive=1" assignments = append(assignments, lhsrhs{lhs: lhs[i], rhs: v}) } case *ast.BinaryExpr: logf("processAssignStmt: *ast.BinaryExpr: %#v", *expr) case *ast.CallExpr: // Fun, Lparen, Args, Ellipsis, Rparen recv, funcName, args := processCallExpr(expr) logf("processAssignStmt: CallExpr: recv=%q, funcName=%q, args=%#v", recv, funcName, args) switch funcName { case "addOptions": if v := strings.Trim(args[0], `"`); v != args[0] { assignments = append(assignments, lhsrhs{lhs: lhs[i], rhs: v}) urlVarName = lhs[i] } else { urlVarName = args[0] } case "Sprintf": assignments = append(assignments, lhsrhs{lhs: lhs[i], rhs: strings.Trim(args[0], `"`)}) case "NewRequest": httpMethod = strings.Trim(args[0], `"`) urlVarName = args[1] case "NewUploadRequest": httpMethod = "POST" urlVarName = args[0] } if recv == receiverName && len(args) > 1 && args[0] == "ctx" { // This might be a helper method. fullName := fmt.Sprintf("%v.%v", recv, funcName) logf("checking for override: fullName=%v", fullName) if fn, ok := helperOverrides[fullName]; ok { logf("found helperOverride for %v", fullName) hm, url := fn(strings.Trim(args[1], `"`)) httpMethod = hm urlVarName = "u" // arbitrary assignments = []lhsrhs{{lhs: urlVarName, rhs: url}} } else { urlVarName = args[1] // For this to work correctly, the URL must be the second arg to the helper method! helperMethod = funcName logf("found possible helper method: funcName=%v, urlVarName=%v", funcName, urlVarName) } } case *ast.CompositeLit: // Type, Lbrace, Elts, Rbrace, Incomplete logf("processAssignStmt: *ast.CompositeLit: %#v", *expr) case *ast.FuncLit: logf("processAssignStmt: *ast.FuncLit: %#v", *expr) case *ast.SelectorExpr: logf("processAssignStmt: *ast.SelectorExpr: %#v", *expr) case *ast.UnaryExpr: // OpPos, Op, X logf("processAssignStmt: *ast.UnaryExpr: %#v", *expr) case *ast.TypeAssertExpr: // X, Lparen, Type, Rparen logf("processAssignStmt: *ast.TypeAssertExpr: %#v", *expr) case *ast.Ident: // NamePos, Name, Obj logf("processAssignStmt: *ast.Ident: %#v", *expr) default: log.Fatalf("unhandled AssignStmt Rhs type: %T", expr) } } logf("urlVarName=%v, assignments=%#v", urlVarName, assignments) return httpMethod, urlVarName, helperMethod, assignments } func processCallExpr(expr *ast.CallExpr) (recv, funcName string, args []string) { logf("*ast.CallExpr: %#v", *expr) for _, arg := range expr.Args { switch arg := arg.(type) { case *ast.ArrayType: logf("processCallExpr: *ast.ArrayType: %#v", arg) case *ast.BasicLit: // ValuePos, Kind, Value args = append(args, arg.Value) // Do not trim quotes here so as to identify it later as a string literal. case *ast.CallExpr: // Fun, Lparen, Args, Ellipsis, Rparen logf("processCallExpr: *ast.CallExpr: %#v", arg) r, fn, as := processCallExpr(arg) if r == "fmt" && fn == "Sprintf" && len(as) > 0 { // Special case - return format string. args = append(args, as[0]) } case *ast.CompositeLit: logf("processCallExpr: *ast.CompositeLit: %#v", arg) // Type, Lbrace, Elts, Rbrace, Incomplete case *ast.Ident: // NamePos, Name, Obj args = append(args, arg.Name) case *ast.MapType: logf("processCallExpr: *ast.MapType: %#v", arg) case *ast.SelectorExpr: // X, Sel logf("processCallExpr: *ast.SelectorExpr: %#v", arg) x, ok := arg.X.(*ast.Ident) if ok { // special case switch name := fmt.Sprintf("%v.%v", x.Name, arg.Sel.Name); name { case "http.MethodGet": args = append(args, http.MethodGet) case "http.MethodHead": args = append(args, http.MethodHead) case "http.MethodPost": args = append(args, http.MethodPost) case "http.MethodPut": args = append(args, http.MethodPut) case "http.MethodPatch": args = append(args, http.MethodPatch) case "http.MethodDelete": args = append(args, http.MethodDelete) case "http.MethodConnect": args = append(args, http.MethodConnect) case "http.MethodOptions": args = append(args, http.MethodOptions) case "http.MethodTrace": args = append(args, http.MethodTrace) default: args = append(args, name) } } case *ast.StarExpr: logf("processCallExpr: *ast.StarExpr: %#v", arg) case *ast.StructType: logf("processCallExpr: *ast.StructType: %#v", arg) case *ast.UnaryExpr: // OpPos, Op, X switch x := arg.X.(type) { case *ast.Ident: args = append(args, x.Name) case *ast.CompositeLit: // Type, Lbrace, Elts, Rbrace, Incomplete logf("processCallExpr: *ast.CompositeLit: %#v", x) default: log.Fatalf("processCallExpr: unhandled UnaryExpr.X arg type: %T", arg.X) } default: log.Fatalf("processCallExpr: unhandled arg type: %T", arg) } } switch fun := expr.Fun.(type) { case *ast.Ident: // NamePos, Name, Obj funcName = fun.Name case *ast.SelectorExpr: // X, Sel funcName = fun.Sel.Name switch x := fun.X.(type) { case *ast.Ident: // NamePos, Name, Obj logf("processCallExpr: X recv *ast.Ident=%#v", x) recv = x.Name case *ast.ParenExpr: logf("processCallExpr: X recv *ast.ParenExpr: %#v", x) case *ast.SelectorExpr: // X, Sel logf("processCallExpr: X recv *ast.SelectorExpr: %#v", x.Sel) recv = x.Sel.Name default: log.Fatalf("processCallExpr: unhandled X receiver type: %T", x) } default: log.Fatalf("processCallExpr: unhandled Fun: %T", expr.Fun) } return recv, funcName, args } // findClientServices finds all go-github services from the Client struct. func findClientServices(filename string, f *ast.File, services servicesMap) error { for _, decl := range f.Decls { switch decl := decl.(type) { case *ast.GenDecl: if decl.Tok != token.TYPE || len(decl.Specs) != 1 { continue } ts, ok := decl.Specs[0].(*ast.TypeSpec) if !ok || decl.Doc == nil || ts.Name == nil || ts.Type == nil || ts.Name.Name != "Client" { continue } st, ok := ts.Type.(*ast.StructType) if !ok || st.Fields == nil || len(st.Fields.List) == 0 { continue } for _, field := range st.Fields.List { se, ok := field.Type.(*ast.StarExpr) if !ok || se.X == nil || len(field.Names) != 1 { continue } id, ok := se.X.(*ast.Ident) if !ok { continue } name := id.Name if !strings.HasSuffix(name, "Service") { continue } services[name] = &Service{serviceName: name} } return nil // Found all services in Client struct. } } return fmt.Errorf("unable to find Client struct in github.go") } func check(fmtStr string, args ...interface{}) { if err := args[len(args)-1]; err != nil { log.Fatalf(fmtStr, args...) } } // parseWebPageEndpoints returns endpoint information, mapped by // web page fragment identifier. func parseWebPageEndpoints(buf string) map[string][]*Endpoint { result := map[string][]*Endpoint{} // The GitHub v3 API web pages do not appear to be auto-generated // and therefore, the XML decoder is too strict to reliably parse them. // Here is a tiny example where the XML decoder completely fails // due to mal-formed HTML: // // //

// // ... // parts := splitHTML(buf) var lastFragmentID string for _, part := range parts { for _, method := range httpMethods { if strings.HasPrefix(part, method) { endpoint := parseEndpoint(part, method) if lastFragmentID == "" { log.Fatalf("parseWebPageEndpoints: empty lastFragmentID") } result[lastFragmentID] = append(result[lastFragmentID], endpoint) } } if i := strings.LastIndex(part, fragmentIDString); i >= 0 { b := part[i+len(fragmentIDString):] i = strings.Index(b, `"`) if i >= 0 { lastFragmentID = b[:i] logf("Found lastFragmentID: %v", lastFragmentID) } } } return result } func splitHTML(buf string) []string { var result []string for buf != "" { i := strings.Index(buf, codeLegacySplitString) j := strings.Index(buf, codeSplitString) switch { case i < 0 && j < 0: result = append(result, buf) buf = "" case j < 0, i >= 0 && j >= 0 && i < j: result = append(result, buf[:i]) buf = buf[i+len(codeLegacySplitString):] case i < 0, i >= 0 && j >= 0 && j < i: result = append(result, buf[:j]) buf = buf[j+len(codeSplitString):] default: log.Fatalf("splitHTML: i=%v, j=%v", i, j) } } return result } func parseEndpoint(s, method string) *Endpoint { eol := strings.Index(s, "\n") if eol < 0 { eol = len(s) } if v := strings.Index(s, "'"); v > len(method) && v < eol { eol = v } if v := strings.Index(s, "<"); v > len(method) && v < eol { eol = v } // if v := strings.Index(s, "{"); v > len(method) && v < eol { // eol = v // } path := strings.TrimSpace(s[len(method):eol]) if strings.HasPrefix(path, "{server}") { // Hack to remove {server} path = strings.TrimPrefix(path, "{server}") } path = paramLegacyRE.ReplaceAllString(path, "%v") path = paramRE.ReplaceAllString(path, "%v") // strip leading garbage if i := strings.Index(path, "/"); i >= 0 { path = path[i+1:] } path = strings.TrimSuffix(path, ".") logf("Found endpoint: %v %v", method, path) return &Endpoint{ urlFormats: []string{path}, httpMethod: method, } } var httpMethods = []string{ "GET", "HEAD", "POST", "PUT", "PATCH", "DELETE", "CONNECT", "OPTIONS", "TRACE", } go-github-38.1.0/update-urls/main_test.go000066400000000000000000000416171410475703100202620ustar00rootroot00000000000000// Copyright 2020 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 main import ( "fmt" "go/parser" "go/token" "os" "regexp" "strings" "testing" "github.com/google/go-cmp/cmp" "github.com/pmezard/go-difflib/difflib" ) type pipelineSetup struct { // Fields filled in by the unit test: baseURL string endpointsFromWebsite endpointsByFragmentID filename string serviceName string originalGoSource string wantGoSource string wantNumEndpoints int // Fields filled in by setup: docCache *fakeDocCache fileRewriter *fakeFileRewriter iter *fakeAstFileIterator services servicesMap wantFailure bool } func (ps *pipelineSetup) setup(t *testing.T, stripURLs, destroyReceiverPointers bool) *pipelineSetup { t.Helper() if stripURLs { // For every GitHub API doc URL, remove it from the original source, // and alternate between stripping the previous blank comment line and not. for removeBlank := false; true; removeBlank = !removeBlank { var changes bool if removeBlank { ps.originalGoSource, changes = removeNextURLAndOptionalBlank(ps.originalGoSource) } else { ps.originalGoSource, changes = removeNextURLLineOnly(ps.originalGoSource) } if !changes { break } } // log.Printf("Modified Go Source:\n%v", ps.originalGoSource) } if destroyReceiverPointers { from := fmt.Sprintf(" *%v) ", ps.serviceName) to := fmt.Sprintf(" %v) ", ps.serviceName) ps.originalGoSource = strings.ReplaceAll(ps.originalGoSource, from, to) ps.wantFailure = true // receiver pointers must be fixed before running. } ps.docCache = &fakeDocCache{ t: t, baseURL: ps.baseURL, endpoints: ps.endpointsFromWebsite, } fset := token.NewFileSet() ps.fileRewriter = &fakeFileRewriter{fset: fset, in: ps.originalGoSource} ps.services = servicesMap{ps.serviceName: &Service{serviceName: ps.serviceName}} astFile, err := parser.ParseFile(fset, ps.filename, ps.originalGoSource, parser.ParseComments) if err != nil { t.Fatalf("ParseFile: %v", err) } ps.iter = &fakeAstFileIterator{ fset: fset, orig: &filenameAstFilePair{ filename: ps.filename, astFile: astFile, }, } return ps } func (ps *pipelineSetup) validate(t *testing.T) { t.Helper() // Call pipeline endpoints, err := findAllServiceEndpoints(ps.iter, ps.services) if ps.wantFailure { if err != nil { // test successful - receivers must be pointers first return } t.Fatalf("Expected non-pointer receivers to fail parsing, but no error was raised") } if err != nil { t.Fatalf("Fail detected but not expected: %v", err) } // log.Printf("endpoints=%#v (%v)", endpoints, len(endpoints)) if len(endpoints) != ps.wantNumEndpoints { t.Errorf("got %v endpoints, want %v", len(endpoints), ps.wantNumEndpoints) } usedHelpers, endpointsByFilename := resolveHelpersAndCacheDocs(endpoints, ps.docCache) // log.Printf("endpointsByFilename=%#v (%v)", endpointsByFilename, len(endpointsByFilename[ps.filename])) if len(endpointsByFilename[ps.filename]) != ps.wantNumEndpoints { t.Errorf("got %v endpointsByFilename, want %v", len(endpointsByFilename[ps.filename]), ps.wantNumEndpoints) } validateRewriteURLs(usedHelpers, endpointsByFilename, ps.docCache, ps.fileRewriter) if ps.fileRewriter.out == "" { t.Fatalf("No modifications were made to the file") } if ps.fileRewriter.out != ps.wantGoSource { diff := difflib.ContextDiff{ A: difflib.SplitLines(ps.fileRewriter.out), B: difflib.SplitLines(ps.wantGoSource), FromFile: "got", ToFile: "want", Context: 1, Eol: "\n", } result, _ := difflib.GetContextDiffString(diff) t.Errorf(strings.Replace(result, "\t", " ", -1)) } } var ( urlWithBlankCommentRE = regexp.MustCompile(`(//\n)?// GitHub API docs: [^\n]+\n`) urlLineOnlyRE = regexp.MustCompile(`// GitHub API docs: [^\n]+\n`) ) func removeNextURLAndOptionalBlank(s string) (string, bool) { parts := urlWithBlankCommentRE.Split(s, 2) if len(parts) == 1 { return parts[0], false } return parts[0] + parts[1], true } func TestRemoveNextURLAndOptionalBlank(t *testing.T) { tests := []struct { name string s string want string changes bool }{ {name: "empty string"}, {name: "no URLs", s: "// line 1\n//\n// line 3", want: "// line 1\n//\n// line 3"}, { name: "URL without prior blank comment", s: "// line 1\n// GitHub API docs: yeah\nfunc MyFunc() {\n", want: "// line 1\nfunc MyFunc() {\n", changes: true, }, { name: "URL with prior blank comment", s: "// line 1\n//\n// GitHub API docs: yeah\nfunc MyFunc() {\n", want: "// line 1\nfunc MyFunc() {\n", changes: true, }, } for i, tt := range tests { t.Run(fmt.Sprintf("test #%v: %v", i, tt.name), func(t *testing.T) { got, changes := removeNextURLAndOptionalBlank(tt.s) if got != tt.want { t.Errorf("got = %v, want %v", got, tt.want) } if changes != tt.changes { t.Errorf("got changes = %v, want %v", changes, tt.changes) } }) } } func removeNextURLLineOnly(s string) (string, bool) { parts := urlLineOnlyRE.Split(s, 2) if len(parts) == 1 { return parts[0], false } return parts[0] + parts[1], true } func TestRemoveNextURLLineOnly(t *testing.T) { tests := []struct { name string s string want string changes bool }{ {name: "empty string"}, {name: "no URLs", s: "// line 1\n//\n// line 3", want: "// line 1\n//\n// line 3"}, { name: "URL without prior blank comment", s: "// line 1\n// GitHub API docs: yeah\nfunc MyFunc() {\n", want: "// line 1\nfunc MyFunc() {\n", changes: true, }, { name: "URL with prior blank comment", s: "// line 1\n//\n// GitHub API docs: yeah\nfunc MyFunc() {\n", want: "// line 1\n//\nfunc MyFunc() {\n", changes: true, }, } for i, tt := range tests { t.Run(fmt.Sprintf("test #%v: %v", i, tt.name), func(t *testing.T) { got, changes := removeNextURLLineOnly(tt.s) if got != tt.want { t.Errorf("got = %v, want %v", got, tt.want) } if changes != tt.changes { t.Errorf("got changes = %v, want %v", changes, tt.changes) } }) } } type endpointsByFragmentID map[string][]*Endpoint // fakeDocCache implements documentCacheReader and documentCacheWriter. type fakeDocCache struct { t *testing.T baseURL string endpoints endpointsByFragmentID } func (f *fakeDocCache) UrlByMethodAndPath(methodAndPath string) (string, bool) { f.t.Helper() for fragmentID, endpoints := range f.endpoints { for _, endpoint := range endpoints { for _, urlFormat := range endpoint.urlFormats { key := fmt.Sprintf("%v %v", endpoint.httpMethod, urlFormat) if key == methodAndPath { url := fmt.Sprintf("%v#%v", f.baseURL, fragmentID) // log.Printf("UrlByMethodAndPath(%q) = (%q, true)", methodAndPath, url) return url, true } } } } f.t.Fatalf("fakeDocCache.UrlByMethodAndPath: unable to find method %v", methodAndPath) return "", false } func (f *fakeDocCache) CacheDocFromInternet(url, filename string) {} // no-op // fakeFileRewriter implements FileRewriter. type fakeFileRewriter struct { fset *token.FileSet in string out string } func (f *fakeFileRewriter) Position(pos token.Pos) token.Position { return f.fset.Position(pos) } func (f *fakeFileRewriter) ReadFile(filename string) ([]byte, error) { return []byte(f.in), nil } func (f *fakeFileRewriter) WriteFile(filename string, buf []byte, mode os.FileMode) error { f.out = string(buf) return nil } // fakeAstFileIterator implements astFileIterator. type fakeAstFileIterator struct { orig, next *filenameAstFilePair fset *token.FileSet } func (f *fakeAstFileIterator) Position(pos token.Pos) token.Position { return f.fset.Position(pos) } func (f *fakeAstFileIterator) Reset() { f.next = f.orig } func (f *fakeAstFileIterator) Next() *filenameAstFilePair { v := f.next f.next = nil return v } func TestSortAndMergeFileEdits(t *testing.T) { tests := []struct { name string fileEdits []*FileEdit want []*FileEdit }{ {name: "no edits"}, { name: "one edit", fileEdits: []*FileEdit{ {toText: "one edit"}, }, want: []*FileEdit{ {toText: "one edit"}, }, }, { name: "two inserts at same offset - no extra blank comment", fileEdits: []*FileEdit{ {pos: token.Position{Offset: 2}, fromText: "", toText: "\n// one insert"}, {pos: token.Position{Offset: 2}, fromText: "", toText: "\n// second insert"}, }, want: []*FileEdit{ {pos: token.Position{Offset: 2}, toText: "\n// one insert\n// second insert"}, }, }, { name: "two inserts at same offset - strip extra blank comment", fileEdits: []*FileEdit{ {pos: token.Position{Offset: 2}, fromText: "", toText: "\n//\n// one insert"}, {pos: token.Position{Offset: 2}, fromText: "", toText: "\n//\n// second insert"}, }, want: []*FileEdit{ {pos: token.Position{Offset: 2}, toText: "\n//\n// one insert\n// second insert"}, }, }, { name: "two non-overlapping edits, low offset to high", fileEdits: []*FileEdit{ {fromText: ".", pos: token.Position{Offset: 0}, toText: "edit one"}, {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit two"}, }, want: []*FileEdit{ {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit two"}, {fromText: ".", pos: token.Position{Offset: 0}, toText: "edit one"}, }, }, { name: "two non-overlapping edits, high offset to low", fileEdits: []*FileEdit{ {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit two"}, {fromText: ".", pos: token.Position{Offset: 0}, toText: "edit one"}, }, want: []*FileEdit{ {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit two"}, {fromText: ".", pos: token.Position{Offset: 0}, toText: "edit one"}, }, }, { name: "two overlapping edits, text low to high", fileEdits: []*FileEdit{ {fromText: ".", toText: "edit 0"}, {fromText: ".", toText: "edit 1"}, }, want: []*FileEdit{ {fromText: ".", toText: "edit 0\nedit 1"}, }, }, { name: "two overlapping edits, text high to low", fileEdits: []*FileEdit{ {fromText: ".", toText: "edit 1"}, {fromText: ".", toText: "edit 0"}, }, want: []*FileEdit{ {fromText: ".", toText: "edit 0\nedit 1"}, }, }, { name: "dup, non-dup", fileEdits: []*FileEdit{ {fromText: ".", toText: "edit 1"}, {fromText: ".", toText: "edit 0"}, {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit 2"}, }, want: []*FileEdit{ {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit 2"}, {fromText: ".", toText: "edit 0\nedit 1"}, }, }, { name: "non-dup, dup", fileEdits: []*FileEdit{ {fromText: ".", toText: "edit 2"}, {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit 1"}, {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit 0"}, }, want: []*FileEdit{ {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit 0\nedit 1"}, {fromText: ".", toText: "edit 2"}, }, }, { name: "dup, non-dup, dup", fileEdits: []*FileEdit{ {fromText: ".", toText: "edit 1"}, {fromText: ".", toText: "edit 0"}, {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit 2"}, {fromText: ".", pos: token.Position{Offset: 200}, toText: "edit 4"}, {fromText: ".", pos: token.Position{Offset: 200}, toText: "edit 3"}, }, want: []*FileEdit{ {fromText: ".", pos: token.Position{Offset: 200}, toText: "edit 3\nedit 4"}, {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit 2"}, {fromText: ".", toText: "edit 0\nedit 1"}, }, }, { name: "non-dup, dup, non-dup", fileEdits: []*FileEdit{ {fromText: ".", toText: "edit 2"}, {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit 1"}, {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit 0"}, {fromText: ".", pos: token.Position{Offset: 200}, toText: "edit 3"}, }, want: []*FileEdit{ {fromText: ".", pos: token.Position{Offset: 200}, toText: "edit 3"}, {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit 0\nedit 1"}, {fromText: ".", toText: "edit 2"}, }, }, { name: "triplet, non-dup", fileEdits: []*FileEdit{ {fromText: ".", toText: "edit 1"}, {fromText: ".", toText: "edit 0"}, {fromText: ".", toText: "edit 2"}, {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit 3"}, }, want: []*FileEdit{ {fromText: ".", pos: token.Position{Offset: 100}, toText: "edit 3"}, {fromText: ".", toText: "edit 0\nedit 1\nedit 2"}, }, }, } for i, tt := range tests { t.Run(fmt.Sprintf("test #%v: %v", i, tt.name), func(t *testing.T) { got := sortAndMergeFileEdits(tt.fileEdits) if len(got) != len(tt.want) { t.Errorf("len(got) = %v, len(want) = %v", len(got), len(tt.want)) } for i := 0; i < len(got); i++ { var wantFileEdit *FileEdit if i < len(tt.want) { wantFileEdit = tt.want[i] } if !cmp.Equal(got[i], wantFileEdit) { t.Errorf("got[%v] =\n%#v\nwant[%v]:\n%#v", i, got[i], i, wantFileEdit) } } }) } } func TestPerformBufferEdits(t *testing.T) { tests := []struct { name string fileEdits []*FileEdit s string want string }{ {name: "no edits", s: "my\nshort\nfile\n", want: "my\nshort\nfile\n"}, { name: "one edit", fileEdits: []*FileEdit{ {pos: token.Position{Offset: 3}, fromText: "short", toText: "one edit"}, }, s: "my\nshort\nfile\n", want: "my\none edit\nfile\n", }, { name: "one insert", fileEdits: []*FileEdit{ {pos: token.Position{Offset: 2}, fromText: "", toText: "\none insert"}, }, s: "my\nshort\nfile\n", want: "my\none insert\nshort\nfile\n", }, { name: "two inserts at same offset", fileEdits: []*FileEdit{ {pos: token.Position{Offset: 2}, fromText: "", toText: "\none insert"}, {pos: token.Position{Offset: 2}, fromText: "", toText: "\nsecond insert"}, }, s: "my\nshort\nfile\n", want: "my\none insert\nsecond insert\nshort\nfile\n", }, } for i, tt := range tests { t.Run(fmt.Sprintf("test #%v: %v", i, tt.name), func(t *testing.T) { b := performBufferEdits([]byte(tt.s), tt.fileEdits) got := string(b) if len(got) != len(tt.want) { t.Errorf("len(got) = %v, len(want) = %v", len(got), len(tt.want)) } if got != tt.want { t.Errorf("got = %v, want = %v", got, tt.want) } }) } } func TestGitURL(t *testing.T) { tests := []struct { name string s string want string }{ {name: "empty string"}, {name: "non-http", s: "howdy"}, { name: "normal URL, no slash", s: "https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events", want: "https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/", }, { name: "normal URL, with slash", s: "https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/", want: "https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/", }, { name: "normal URL, with fragment identifier", s: "https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/#list-public-events", want: "https://docs.github.com/en/free-pro-team@latest/rest/reference/activity/events/", }, } for i, tt := range tests { t.Run(fmt.Sprintf("test #%v: %v", i, tt.name), func(t *testing.T) { got := getURL(tt.s) if got != tt.want { t.Errorf("getURL = %v ; want %v", got, tt.want) } }) } } func testWebPageHelper(t *testing.T, got, want map[string][]*Endpoint) { t.Helper() for k := range got { w, ok := want[k] if len(got[k]) != len(w) { t.Errorf("len(got[%q]) = %v, len(want[%q]) = %v", k, len(got[k]), k, len(w)) } for i := 0; i < len(got[k]); i++ { var wantEndpoint *Endpoint if ok && i < len(w) { wantEndpoint = w[i] } if !cmp.Equal(got[k][i], wantEndpoint) { t.Errorf("got[%q][%v] =\n%#v\nwant[%q][%v]:\n%#v", k, i, got[k][i], k, i, wantEndpoint) } } } for k := range want { if _, ok := got[k]; !ok { t.Errorf("got[%q] = nil\nwant[%q]:\n%#v", k, k, want[k]) } } } func TestParseEndpoint(t *testing.T) { tests := []struct { name string s string method string want *Endpoint }{ { name: "orgs_projects: list-repository-projects", s: `GET /repos/{owner}/{repo}/projects'
, { `, method: "GET", want: &Endpoint{urlFormats: []string{"repos/%v/%v/projects"}, httpMethod: "GET"}, }, { name: "orgs_projects: ListProjects", s: `GET /orgs/{org}/projects', { `, method: "GET", want: &Endpoint{urlFormats: []string{"orgs/%v/projects"}, httpMethod: "GET"}, }, } for i, tt := range tests { t.Run(fmt.Sprintf("test #%v: %v", i, tt.name), func(t *testing.T) { got := parseEndpoint(tt.s, tt.method) if !cmp.Equal(got, tt.want) { t.Errorf("parseEndpoint = %#v, want %#v", got, tt.want) } }) } } go-github-38.1.0/update-urls/reactions_test.go000066400000000000000000011650171410475703100213270ustar00rootroot00000000000000// Copyright 2020 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 main import ( "testing" ) func newReactionsPipeline() *pipelineSetup { return &pipelineSetup{ baseURL: "https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/", endpointsFromWebsite: reactionsWant, filename: "reactions.go", serviceName: "ReactionsService", originalGoSource: reactionsGoFileOriginal, wantGoSource: reactionsGoFileWant, wantNumEndpoints: 25, } } func TestPipeline_Reactions(t *testing.T) { ps := newReactionsPipeline() ps.setup(t, false, false) ps.validate(t) } func TestPipeline_Reactions_FirstStripAllURLs(t *testing.T) { ps := newReactionsPipeline() ps.setup(t, true, false) ps.validate(t) } func TestPipeline_Reactions_FirstDestroyReceivers(t *testing.T) { ps := newReactionsPipeline() ps.setup(t, false, true) ps.validate(t) } func TestPipeline_Reactions_FirstStripAllURLsAndDestroyReceivers(t *testing.T) { ps := newReactionsPipeline() ps.setup(t, true, true) ps.validate(t) } func TestParseWebPageEndpoints_Reactions(t *testing.T) { got, want := parseWebPageEndpoints(reactionsTestWebPage), reactionsWant testWebPageHelper(t, got, want) } var reactionsWant = endpointsByFragmentID{ "list-reactions-for-a-commit-comment": []*Endpoint{{urlFormats: []string{"repos/%v/%v/comments/%v/reactions"}, httpMethod: "GET"}}, "delete-a-commit-comment-reaction": []*Endpoint{ {urlFormats: []string{"repositories/%v/comments/%v/reactions/%v"}, httpMethod: "DELETE"}, {urlFormats: []string{"repos/%v/%v/comments/%v/reactions/%v"}, httpMethod: "DELETE"}, }, "create-reaction-for-an-issue": []*Endpoint{{urlFormats: []string{"repos/%v/%v/issues/%v/reactions"}, httpMethod: "POST"}}, "delete-an-issue-reaction": []*Endpoint{ {urlFormats: []string{"repositories/%v/issues/%v/reactions/%v"}, httpMethod: "DELETE"}, {urlFormats: []string{"repos/%v/%v/issues/%v/reactions/%v"}, httpMethod: "DELETE"}, }, "create-reaction-for-a-pull-request-review-comment": []*Endpoint{{urlFormats: []string{"repos/%v/%v/pulls/comments/%v/reactions"}, httpMethod: "POST"}}, "list-reactions-for-a-team-discussion": []*Endpoint{ {urlFormats: []string{"organizations/%v/team/%v/discussions/%v/reactions"}, httpMethod: "GET"}, {urlFormats: []string{"orgs/%v/teams/%v/discussions/%v/reactions"}, httpMethod: "GET"}, }, "delete-a-reaction-legacy": []*Endpoint{{urlFormats: []string{"reactions/%v"}, httpMethod: "DELETE"}}, "list-reactions-for-a-team-discussion-comment-legacy": []*Endpoint{{urlFormats: []string{"teams/%v/discussions/%v/comments/%v/reactions"}, httpMethod: "GET"}}, "delete-an-issue-comment-reaction": []*Endpoint{ {urlFormats: []string{"repositories/%v/issues/comments/%v/reactions/%v"}, httpMethod: "DELETE"}, {urlFormats: []string{"repos/%v/%v/issues/comments/%v/reactions/%v"}, httpMethod: "DELETE"}, }, "list-reactions-for-a-pull-request-review-comment": []*Endpoint{{urlFormats: []string{"repos/%v/%v/pulls/comments/%v/reactions"}, httpMethod: "GET"}}, "create-reaction-for-a-team-discussion-legacy": []*Endpoint{{urlFormats: []string{"teams/%v/discussions/%v/reactions"}, httpMethod: "POST"}}, "create-reaction-for-a-team-discussion-comment-legacy": []*Endpoint{{urlFormats: []string{"teams/%v/discussions/%v/comments/%v/reactions"}, httpMethod: "POST"}}, "create-reaction-for-a-commit-comment": []*Endpoint{{urlFormats: []string{"repos/%v/%v/comments/%v/reactions"}, httpMethod: "POST"}}, "list-reactions-for-an-issue": []*Endpoint{{urlFormats: []string{"repos/%v/%v/issues/%v/reactions"}, httpMethod: "GET"}}, "create-reaction-for-an-issue-comment": []*Endpoint{{urlFormats: []string{"repos/%v/%v/issues/comments/%v/reactions"}, httpMethod: "POST"}}, "create-reaction-for-a-team-discussion": []*Endpoint{ {urlFormats: []string{"organizations/%v/team/%v/discussions/%v/reactions"}, httpMethod: "POST"}, {urlFormats: []string{"orgs/%v/teams/%v/discussions/%v/reactions"}, httpMethod: "POST"}, }, "delete-team-discussion-reaction": []*Endpoint{ {urlFormats: []string{"organizations/%v/team/%v/discussions/%v/reactions/%v"}, httpMethod: "DELETE"}, {urlFormats: []string{"orgs/%v/teams/%v/discussions/%v/reactions/%v"}, httpMethod: "DELETE"}, }, "create-reaction-for-a-team-discussion-comment": []*Endpoint{ {urlFormats: []string{"organizations/%v/team/%v/discussions/%v/comments/%v/reactions"}, httpMethod: "POST"}, {urlFormats: []string{"orgs/%v/teams/%v/discussions/%v/comments/%v/reactions"}, httpMethod: "POST"}, }, "list-reactions-for-an-issue-comment": []*Endpoint{{urlFormats: []string{"repos/%v/%v/issues/comments/%v/reactions"}, httpMethod: "GET"}}, "delete-a-pull-request-comment-reaction": []*Endpoint{ {urlFormats: []string{"repositories/%v/pulls/comments/%v/reactions/%v"}, httpMethod: "DELETE"}, {urlFormats: []string{"repos/%v/%v/pulls/comments/%v/reactions/%v"}, httpMethod: "DELETE"}, }, "list-reactions-for-a-team-discussion-comment": []*Endpoint{ {urlFormats: []string{"organizations/%v/team/%v/discussions/%v/comments/%v/reactions"}, httpMethod: "GET"}, {urlFormats: []string{"orgs/%v/teams/%v/discussions/%v/comments/%v/reactions"}, httpMethod: "GET"}, }, "delete-team-discussion-comment-reaction": []*Endpoint{ {urlFormats: []string{"organizations/%v/team/%v/discussions/%v/comments/%v/reactions/%v"}, httpMethod: "DELETE"}, {urlFormats: []string{"orgs/%v/teams/%v/discussions/%v/comments/%v/reactions/%v"}, httpMethod: "DELETE"}, }, "list-reactions-for-a-team-discussion-legacy": []*Endpoint{{urlFormats: []string{"teams/%v/discussions/%v/reactions"}, httpMethod: "GET"}}, } var reactionsTestWebPage = ` Reactions - GitHub Docs
Article version: GitHub.com

Reactions

In this article

Did this doc help you?

Reaction types

When creating a reaction, the allowed values for the content parameter are as follows (with the corresponding emoji for reference):

contentemoji
+1👍
-1👎
laugh😄
confused😕
heart❤️
hooray🎉
rocket🚀
eyes👀

List reactions for a team discussion comment

List the reactions to a team discussion comment. OAuth access tokens require the read:discussion scope.

Note: You can also specify a team by org_id and team_id using the route GET /organizations/:org_id/team/:team_id/discussions/:discussion_number/comments/:comment_number/reactions.

get /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
org string path
team_slug string path
discussion_number integer path
comment_number integer path
content string query

Returns a single reaction type. Omit this parameter to list all reactions to a team discussion comment.

per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/orgs/ORG/teams/TEAM_SLUG/discussions/42/comments/42/reactions
JavaScript (@octokit/core.js)
await octokit.request('GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions', {
  org: 'org',
  team_slug: 'team_slug',
  discussion_number: 42,
  comment_number: 42,
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 200 OK
[
  {
    "id": 1,
    "node_id": "MDg6UmVhY3Rpb24x",
    "user": {
      "login": "octocat",
      "id": 1,
      "node_id": "MDQ6VXNlcjE=",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "gravatar_id": "",
      "url": "https://api.github.com/users/octocat",
      "html_url": "https://github.com/octocat",
      "followers_url": "https://api.github.com/users/octocat/followers",
      "following_url": "https://api.github.com/users/octocat/following{/other_user}",
      "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
      "organizations_url": "https://api.github.com/users/octocat/orgs",
      "repos_url": "https://api.github.com/users/octocat/repos",
      "events_url": "https://api.github.com/users/octocat/events{/privacy}",
      "received_events_url": "https://api.github.com/users/octocat/received_events",
      "type": "User",
      "site_admin": false
    },
    "content": "heart",
    "created_at": "2016-05-20T20:09:31Z"
  }
]

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Create reaction for a team discussion comment

Create a reaction to a team discussion comment. OAuth access tokens require the write:discussion scope. A response with a Status: 200 OK means that you already added the reaction type to this team discussion comment.

Note: You can also specify a team by org_id and team_id using the route POST /organizations/:org_id/team/:team_id/discussions/:discussion_number/comments/:comment_number/reactions.

post /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
org string path
team_slug string path
discussion_number integer path
comment_number integer path
content string body

Required. The reaction type to add to the team discussion comment.

Code samples

Shell
curl \
  -X POST \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/orgs/ORG/teams/TEAM_SLUG/discussions/42/comments/42/reactions \
  -d '{"content":"content"}'
JavaScript (@octokit/core.js)
await octokit.request('POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions', {
  org: 'org',
  team_slug: 'team_slug',
  discussion_number: 42,
  comment_number: 42,
  content: 'content',
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 201 Created
{
  "id": 1,
  "node_id": "MDg6UmVhY3Rpb24x",
  "user": {
    "login": "octocat",
    "id": 1,
    "node_id": "MDQ6VXNlcjE=",
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "",
    "url": "https://api.github.com/users/octocat",
    "html_url": "https://github.com/octocat",
    "followers_url": "https://api.github.com/users/octocat/followers",
    "following_url": "https://api.github.com/users/octocat/following{/other_user}",
    "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
    "organizations_url": "https://api.github.com/users/octocat/orgs",
    "repos_url": "https://api.github.com/users/octocat/repos",
    "events_url": "https://api.github.com/users/octocat/events{/privacy}",
    "received_events_url": "https://api.github.com/users/octocat/received_events",
    "type": "User",
    "site_admin": false
  },
  "content": "heart",
  "created_at": "2016-05-20T20:09:31Z"
}

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Delete team discussion comment reaction

Note: You can also specify a team or organization with team_id and org_id using the route DELETE /organizations/:org_id/team/:team_id/discussions/:discussion_number/comments/:comment_number/reactions/:reaction_id.

Delete a reaction to a team discussion comment. OAuth access tokens require the write:discussion scope.

delete /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
org string path
team_slug string path
discussion_number integer path
comment_number integer path
reaction_id integer path

Code samples

Shell
curl \
  -X DELETE \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/orgs/ORG/teams/TEAM_SLUG/discussions/42/comments/42/reactions/42
JavaScript (@octokit/core.js)
await octokit.request('DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}', {
  org: 'org',
  team_slug: 'team_slug',
  discussion_number: 42,
  comment_number: 42,
  reaction_id: 42,
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default Response

Status: 204 No Content

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

List reactions for a team discussion

List the reactions to a team discussion. OAuth access tokens require the read:discussion scope.

Note: You can also specify a team by org_id and team_id using the route GET /organizations/:org_id/team/:team_id/discussions/:discussion_number/reactions.

get /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
org string path
team_slug string path
discussion_number integer path
content string query

Returns a single reaction type. Omit this parameter to list all reactions to a team discussion.

per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/orgs/ORG/teams/TEAM_SLUG/discussions/42/reactions
JavaScript (@octokit/core.js)
await octokit.request('GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions', {
  org: 'org',
  team_slug: 'team_slug',
  discussion_number: 42,
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 200 OK
[
  {
    "id": 1,
    "node_id": "MDg6UmVhY3Rpb24x",
    "user": {
      "login": "octocat",
      "id": 1,
      "node_id": "MDQ6VXNlcjE=",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "gravatar_id": "",
      "url": "https://api.github.com/users/octocat",
      "html_url": "https://github.com/octocat",
      "followers_url": "https://api.github.com/users/octocat/followers",
      "following_url": "https://api.github.com/users/octocat/following{/other_user}",
      "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
      "organizations_url": "https://api.github.com/users/octocat/orgs",
      "repos_url": "https://api.github.com/users/octocat/repos",
      "events_url": "https://api.github.com/users/octocat/events{/privacy}",
      "received_events_url": "https://api.github.com/users/octocat/received_events",
      "type": "User",
      "site_admin": false
    },
    "content": "heart",
    "created_at": "2016-05-20T20:09:31Z"
  }
]

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Create reaction for a team discussion

Create a reaction to a team discussion. OAuth access tokens require the write:discussion scope. A response with a Status: 200 OK means that you already added the reaction type to this team discussion.

Note: You can also specify a team by org_id and team_id using the route POST /organizations/:org_id/team/:team_id/discussions/:discussion_number/reactions.

post /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
org string path
team_slug string path
discussion_number integer path
content string body

Required. The reaction type to add to the team discussion.

Code samples

Shell
curl \
  -X POST \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/orgs/ORG/teams/TEAM_SLUG/discussions/42/reactions \
  -d '{"content":"content"}'
JavaScript (@octokit/core.js)
await octokit.request('POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions', {
  org: 'org',
  team_slug: 'team_slug',
  discussion_number: 42,
  content: 'content',
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 201 Created
{
  "id": 1,
  "node_id": "MDg6UmVhY3Rpb24x",
  "user": {
    "login": "octocat",
    "id": 1,
    "node_id": "MDQ6VXNlcjE=",
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "",
    "url": "https://api.github.com/users/octocat",
    "html_url": "https://github.com/octocat",
    "followers_url": "https://api.github.com/users/octocat/followers",
    "following_url": "https://api.github.com/users/octocat/following{/other_user}",
    "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
    "organizations_url": "https://api.github.com/users/octocat/orgs",
    "repos_url": "https://api.github.com/users/octocat/repos",
    "events_url": "https://api.github.com/users/octocat/events{/privacy}",
    "received_events_url": "https://api.github.com/users/octocat/received_events",
    "type": "User",
    "site_admin": false
  },
  "content": "heart",
  "created_at": "2016-05-20T20:09:31Z"
}

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Delete team discussion reaction

Note: You can also specify a team or organization with team_id and org_id using the route DELETE /organizations/:org_id/team/:team_id/discussions/:discussion_number/reactions/:reaction_id.

Delete a reaction to a team discussion. OAuth access tokens require the write:discussion scope.

delete /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
org string path
team_slug string path
discussion_number integer path
reaction_id integer path

Code samples

Shell
curl \
  -X DELETE \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/orgs/ORG/teams/TEAM_SLUG/discussions/42/reactions/42
JavaScript (@octokit/core.js)
await octokit.request('DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}', {
  org: 'org',
  team_slug: 'team_slug',
  discussion_number: 42,
  reaction_id: 42,
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default Response

Status: 204 No Content

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Delete a reaction (Legacy)

Deprecation Notice: This endpoint route is deprecated and will be removed from the Reactions API. We recommend migrating your existing code to use the new delete reactions endpoints. For more information, see this blog post.

OAuth access tokens require the write:discussion scope, when deleting a team discussion or team discussion comment.

delete /reactions/{reaction_id}

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
reaction_id integer path

Code samples

Shell
curl \
  -X DELETE \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/reactions/42
JavaScript (@octokit/core.js)
await octokit.request('DELETE /reactions/{reaction_id}', {
  reaction_id: 42,
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default Response

Status: 204 No Content

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

get /repos/{owner}/{repo}/comments/{comment_id}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
owner string path
repo string path
comment_id integer path
content string query

Returns a single reaction type. Omit this parameter to list all reactions to a commit comment.

per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/repos/octocat/hello-world/comments/42/reactions
JavaScript (@octokit/core.js)
await octokit.request('GET /repos/{owner}/{repo}/comments/{comment_id}/reactions', {
  owner: 'octocat',
  repo: 'hello-world',
  comment_id: 42,
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 200 OK
[
  {
    "id": 1,
    "node_id": "MDg6UmVhY3Rpb24x",
    "user": {
      "login": "octocat",
      "id": 1,
      "node_id": "MDQ6VXNlcjE=",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "gravatar_id": "",
      "url": "https://api.github.com/users/octocat",
      "html_url": "https://github.com/octocat",
      "followers_url": "https://api.github.com/users/octocat/followers",
      "following_url": "https://api.github.com/users/octocat/following{/other_user}",
      "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
      "organizations_url": "https://api.github.com/users/octocat/orgs",
      "repos_url": "https://api.github.com/users/octocat/repos",
      "events_url": "https://api.github.com/users/octocat/events{/privacy}",
      "received_events_url": "https://api.github.com/users/octocat/received_events",
      "type": "User",
      "site_admin": false
    },
    "content": "heart",
    "created_at": "2016-05-20T20:09:31Z"
  }
]

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Create reaction for a commit comment

Create a reaction to a commit comment. A response with a Status: 200 OK means that you already added the reaction type to this commit comment.

post /repos/{owner}/{repo}/comments/{comment_id}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
owner string path
repo string path
comment_id integer path
content string body

Required. The reaction type to add to the commit comment.

Code samples

Shell
curl \
  -X POST \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/repos/octocat/hello-world/comments/42/reactions \
  -d '{"content":"content"}'
JavaScript (@octokit/core.js)
await octokit.request('POST /repos/{owner}/{repo}/comments/{comment_id}/reactions', {
  owner: 'octocat',
  repo: 'hello-world',
  comment_id: 42,
  content: 'content',
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 201 Created
{
  "id": 1,
  "node_id": "MDg6UmVhY3Rpb24x",
  "user": {
    "login": "octocat",
    "id": 1,
    "node_id": "MDQ6VXNlcjE=",
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "",
    "url": "https://api.github.com/users/octocat",
    "html_url": "https://github.com/octocat",
    "followers_url": "https://api.github.com/users/octocat/followers",
    "following_url": "https://api.github.com/users/octocat/following{/other_user}",
    "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
    "organizations_url": "https://api.github.com/users/octocat/orgs",
    "repos_url": "https://api.github.com/users/octocat/repos",
    "events_url": "https://api.github.com/users/octocat/events{/privacy}",
    "received_events_url": "https://api.github.com/users/octocat/received_events",
    "type": "User",
    "site_admin": false
  },
  "content": "heart",
  "created_at": "2016-05-20T20:09:31Z"
}

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Delete a commit comment reaction

Note: You can also specify a repository by repository_id using the route DELETE /repositories/:repository_id/comments/:comment_id/reactions/:reaction_id.

Delete a reaction to a commit comment.

delete /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
owner string path
repo string path
comment_id integer path
reaction_id integer path

Code samples

Shell
curl \
  -X DELETE \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/repos/octocat/hello-world/comments/42/reactions/42
JavaScript (@octokit/core.js)
await octokit.request('DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}', {
  owner: 'octocat',
  repo: 'hello-world',
  comment_id: 42,
  reaction_id: 42,
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default Response

Status: 204 No Content

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

get /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
owner string path
repo string path
comment_id integer path
content string query

Returns a single reaction type. Omit this parameter to list all reactions to an issue comment.

per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/repos/octocat/hello-world/issues/comments/42/reactions
JavaScript (@octokit/core.js)
await octokit.request('GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions', {
  owner: 'octocat',
  repo: 'hello-world',
  comment_id: 42,
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 200 OK
[
  {
    "id": 1,
    "node_id": "MDg6UmVhY3Rpb24x",
    "user": {
      "login": "octocat",
      "id": 1,
      "node_id": "MDQ6VXNlcjE=",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "gravatar_id": "",
      "url": "https://api.github.com/users/octocat",
      "html_url": "https://github.com/octocat",
      "followers_url": "https://api.github.com/users/octocat/followers",
      "following_url": "https://api.github.com/users/octocat/following{/other_user}",
      "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
      "organizations_url": "https://api.github.com/users/octocat/orgs",
      "repos_url": "https://api.github.com/users/octocat/repos",
      "events_url": "https://api.github.com/users/octocat/events{/privacy}",
      "received_events_url": "https://api.github.com/users/octocat/received_events",
      "type": "User",
      "site_admin": false
    },
    "content": "heart",
    "created_at": "2016-05-20T20:09:31Z"
  }
]

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Create reaction for an issue comment

Create a reaction to an issue comment. A response with a Status: 200 OK means that you already added the reaction type to this issue comment.

post /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
owner string path
repo string path
comment_id integer path
content string body

Required. The reaction type to add to the issue comment.

Code samples

Shell
curl \
  -X POST \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/repos/octocat/hello-world/issues/comments/42/reactions \
  -d '{"content":"content"}'
JavaScript (@octokit/core.js)
await octokit.request('POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions', {
  owner: 'octocat',
  repo: 'hello-world',
  comment_id: 42,
  content: 'content',
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 201 Created
{
  "id": 1,
  "node_id": "MDg6UmVhY3Rpb24x",
  "user": {
    "login": "octocat",
    "id": 1,
    "node_id": "MDQ6VXNlcjE=",
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "",
    "url": "https://api.github.com/users/octocat",
    "html_url": "https://github.com/octocat",
    "followers_url": "https://api.github.com/users/octocat/followers",
    "following_url": "https://api.github.com/users/octocat/following{/other_user}",
    "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
    "organizations_url": "https://api.github.com/users/octocat/orgs",
    "repos_url": "https://api.github.com/users/octocat/repos",
    "events_url": "https://api.github.com/users/octocat/events{/privacy}",
    "received_events_url": "https://api.github.com/users/octocat/received_events",
    "type": "User",
    "site_admin": false
  },
  "content": "heart",
  "created_at": "2016-05-20T20:09:31Z"
}

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Delete an issue comment reaction

Note: You can also specify a repository by repository_id using the route DELETE delete /repositories/:repository_id/issues/comments/:comment_id/reactions/:reaction_id.

Delete a reaction to an issue comment.

delete /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
owner string path
repo string path
comment_id integer path
reaction_id integer path

Code samples

Shell
curl \
  -X DELETE \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/repos/octocat/hello-world/issues/comments/42/reactions/42
JavaScript (@octokit/core.js)
await octokit.request('DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}', {
  owner: 'octocat',
  repo: 'hello-world',
  comment_id: 42,
  reaction_id: 42,
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default Response

Status: 204 No Content

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

List reactions for an issue

List the reactions to an issue.

get /repos/{owner}/{repo}/issues/{issue_number}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
owner string path
repo string path
issue_number integer path
content string query

Returns a single reaction type. Omit this parameter to list all reactions to an issue.

per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/repos/octocat/hello-world/issues/42/reactions
JavaScript (@octokit/core.js)
await octokit.request('GET /repos/{owner}/{repo}/issues/{issue_number}/reactions', {
  owner: 'octocat',
  repo: 'hello-world',
  issue_number: 42,
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 200 OK
[
  {
    "id": 1,
    "node_id": "MDg6UmVhY3Rpb24x",
    "user": {
      "login": "octocat",
      "id": 1,
      "node_id": "MDQ6VXNlcjE=",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "gravatar_id": "",
      "url": "https://api.github.com/users/octocat",
      "html_url": "https://github.com/octocat",
      "followers_url": "https://api.github.com/users/octocat/followers",
      "following_url": "https://api.github.com/users/octocat/following{/other_user}",
      "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
      "organizations_url": "https://api.github.com/users/octocat/orgs",
      "repos_url": "https://api.github.com/users/octocat/repos",
      "events_url": "https://api.github.com/users/octocat/events{/privacy}",
      "received_events_url": "https://api.github.com/users/octocat/received_events",
      "type": "User",
      "site_admin": false
    },
    "content": "heart",
    "created_at": "2016-05-20T20:09:31Z"
  }
]

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Create reaction for an issue

Create a reaction to an issue. A response with a Status: 200 OK means that you already added the reaction type to this issue.

post /repos/{owner}/{repo}/issues/{issue_number}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
owner string path
repo string path
issue_number integer path
content string body

Required. The reaction type to add to the issue.

Code samples

Shell
curl \
  -X POST \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/repos/octocat/hello-world/issues/42/reactions \
  -d '{"content":"content"}'
JavaScript (@octokit/core.js)
await octokit.request('POST /repos/{owner}/{repo}/issues/{issue_number}/reactions', {
  owner: 'octocat',
  repo: 'hello-world',
  issue_number: 42,
  content: 'content',
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 201 Created
{
  "id": 1,
  "node_id": "MDg6UmVhY3Rpb24x",
  "user": {
    "login": "octocat",
    "id": 1,
    "node_id": "MDQ6VXNlcjE=",
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "",
    "url": "https://api.github.com/users/octocat",
    "html_url": "https://github.com/octocat",
    "followers_url": "https://api.github.com/users/octocat/followers",
    "following_url": "https://api.github.com/users/octocat/following{/other_user}",
    "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
    "organizations_url": "https://api.github.com/users/octocat/orgs",
    "repos_url": "https://api.github.com/users/octocat/repos",
    "events_url": "https://api.github.com/users/octocat/events{/privacy}",
    "received_events_url": "https://api.github.com/users/octocat/received_events",
    "type": "User",
    "site_admin": false
  },
  "content": "heart",
  "created_at": "2016-05-20T20:09:31Z"
}

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Delete an issue reaction

Note: You can also specify a repository by repository_id using the route DELETE /repositories/:repository_id/issues/:issue_number/reactions/:reaction_id.

Delete a reaction to an issue.

delete /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
owner string path
repo string path
issue_number integer path
reaction_id integer path

Code samples

Shell
curl \
  -X DELETE \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/repos/octocat/hello-world/issues/42/reactions/42
JavaScript (@octokit/core.js)
await octokit.request('DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}', {
  owner: 'octocat',
  repo: 'hello-world',
  issue_number: 42,
  reaction_id: 42,
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default Response

Status: 204 No Content

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

get /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
owner string path
repo string path
comment_id integer path
content string query

Returns a single reaction type. Omit this parameter to list all reactions to a pull request review comment.

per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/repos/octocat/hello-world/pulls/comments/42/reactions
JavaScript (@octokit/core.js)
await octokit.request('GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions', {
  owner: 'octocat',
  repo: 'hello-world',
  comment_id: 42,
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 200 OK
[
  {
    "id": 1,
    "node_id": "MDg6UmVhY3Rpb24x",
    "user": {
      "login": "octocat",
      "id": 1,
      "node_id": "MDQ6VXNlcjE=",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "gravatar_id": "",
      "url": "https://api.github.com/users/octocat",
      "html_url": "https://github.com/octocat",
      "followers_url": "https://api.github.com/users/octocat/followers",
      "following_url": "https://api.github.com/users/octocat/following{/other_user}",
      "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
      "organizations_url": "https://api.github.com/users/octocat/orgs",
      "repos_url": "https://api.github.com/users/octocat/repos",
      "events_url": "https://api.github.com/users/octocat/events{/privacy}",
      "received_events_url": "https://api.github.com/users/octocat/received_events",
      "type": "User",
      "site_admin": false
    },
    "content": "heart",
    "created_at": "2016-05-20T20:09:31Z"
  }
]

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Create reaction for a pull request review comment

Create a reaction to a pull request review comment. A response with a Status: 200 OK means that you already added the reaction type to this pull request review comment.

post /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
owner string path
repo string path
comment_id integer path
content string body

Required. The reaction type to add to the pull request review comment.

Code samples

Shell
curl \
  -X POST \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/repos/octocat/hello-world/pulls/comments/42/reactions \
  -d '{"content":"content"}'
JavaScript (@octokit/core.js)
await octokit.request('POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions', {
  owner: 'octocat',
  repo: 'hello-world',
  comment_id: 42,
  content: 'content',
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 201 Created
{
  "id": 1,
  "node_id": "MDg6UmVhY3Rpb24x",
  "user": {
    "login": "octocat",
    "id": 1,
    "node_id": "MDQ6VXNlcjE=",
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "",
    "url": "https://api.github.com/users/octocat",
    "html_url": "https://github.com/octocat",
    "followers_url": "https://api.github.com/users/octocat/followers",
    "following_url": "https://api.github.com/users/octocat/following{/other_user}",
    "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
    "organizations_url": "https://api.github.com/users/octocat/orgs",
    "repos_url": "https://api.github.com/users/octocat/repos",
    "events_url": "https://api.github.com/users/octocat/events{/privacy}",
    "received_events_url": "https://api.github.com/users/octocat/received_events",
    "type": "User",
    "site_admin": false
  },
  "content": "heart",
  "created_at": "2016-05-20T20:09:31Z"
}

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Delete a pull request comment reaction

Note: You can also specify a repository by repository_id using the route DELETE /repositories/:repository_id/pulls/comments/:comment_id/reactions/:reaction_id.

Delete a reaction to a pull request review comment.

delete /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
owner string path
repo string path
comment_id integer path
reaction_id integer path

Code samples

Shell
curl \
  -X DELETE \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/repos/octocat/hello-world/pulls/comments/42/reactions/42
JavaScript (@octokit/core.js)
await octokit.request('DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}', {
  owner: 'octocat',
  repo: 'hello-world',
  comment_id: 42,
  reaction_id: 42,
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default Response

Status: 204 No Content

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

List reactions for a team discussion comment (Legacy)

Deprecation Notice: This endpoint route is deprecated and will be removed from the Teams API. We recommend migrating your existing code to use the new List reactions for a team discussion comment endpoint.

List the reactions to a team discussion comment. OAuth access tokens require the read:discussion scope.

get /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
team_id integer path
discussion_number integer path
comment_number integer path
content string query

Returns a single reaction type. Omit this parameter to list all reactions to a team discussion comment.

per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/teams/42/discussions/42/comments/42/reactions
JavaScript (@octokit/core.js)
await octokit.request('GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions', {
  team_id: 42,
  discussion_number: 42,
  comment_number: 42,
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 200 OK
[
  {
    "id": 1,
    "node_id": "MDg6UmVhY3Rpb24x",
    "user": {
      "login": "octocat",
      "id": 1,
      "node_id": "MDQ6VXNlcjE=",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "gravatar_id": "",
      "url": "https://api.github.com/users/octocat",
      "html_url": "https://github.com/octocat",
      "followers_url": "https://api.github.com/users/octocat/followers",
      "following_url": "https://api.github.com/users/octocat/following{/other_user}",
      "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
      "organizations_url": "https://api.github.com/users/octocat/orgs",
      "repos_url": "https://api.github.com/users/octocat/repos",
      "events_url": "https://api.github.com/users/octocat/events{/privacy}",
      "received_events_url": "https://api.github.com/users/octocat/received_events",
      "type": "User",
      "site_admin": false
    },
    "content": "heart",
    "created_at": "2016-05-20T20:09:31Z"
  }
]

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Create reaction for a team discussion comment (Legacy)

Deprecation Notice: This endpoint route is deprecated and will be removed from the Teams API. We recommend migrating your existing code to use the new Create reaction for a team discussion comment endpoint.

Create a reaction to a team discussion comment. OAuth access tokens require the write:discussion scope. A response with a Status: 200 OK means that you already added the reaction type to this team discussion comment.

post /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
team_id integer path
discussion_number integer path
comment_number integer path
content string body

Required. The reaction type to add to the team discussion comment.

Code samples

Shell
curl \
  -X POST \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/teams/42/discussions/42/comments/42/reactions \
  -d '{"content":"content"}'
JavaScript (@octokit/core.js)
await octokit.request('POST /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions', {
  team_id: 42,
  discussion_number: 42,
  comment_number: 42,
  content: 'content',
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 201 Created
{
  "id": 1,
  "node_id": "MDg6UmVhY3Rpb24x",
  "user": {
    "login": "octocat",
    "id": 1,
    "node_id": "MDQ6VXNlcjE=",
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "",
    "url": "https://api.github.com/users/octocat",
    "html_url": "https://github.com/octocat",
    "followers_url": "https://api.github.com/users/octocat/followers",
    "following_url": "https://api.github.com/users/octocat/following{/other_user}",
    "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
    "organizations_url": "https://api.github.com/users/octocat/orgs",
    "repos_url": "https://api.github.com/users/octocat/repos",
    "events_url": "https://api.github.com/users/octocat/events{/privacy}",
    "received_events_url": "https://api.github.com/users/octocat/received_events",
    "type": "User",
    "site_admin": false
  },
  "content": "heart",
  "created_at": "2016-05-20T20:09:31Z"
}

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

List reactions for a team discussion (Legacy)

Deprecation Notice: This endpoint route is deprecated and will be removed from the Teams API. We recommend migrating your existing code to use the new List reactions for a team discussion endpoint.

List the reactions to a team discussion. OAuth access tokens require the read:discussion scope.

get /teams/{team_id}/discussions/{discussion_number}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
team_id integer path
discussion_number integer path
content string query

Returns a single reaction type. Omit this parameter to list all reactions to a team discussion.

per_page integer query

Results per page (max 100)

page integer query

Page number of the results to fetch.

Code samples

Shell
curl \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/teams/42/discussions/42/reactions
JavaScript (@octokit/core.js)
await octokit.request('GET /teams/{team_id}/discussions/{discussion_number}/reactions', {
  team_id: 42,
  discussion_number: 42,
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 200 OK
[
  {
    "id": 1,
    "node_id": "MDg6UmVhY3Rpb24x",
    "user": {
      "login": "octocat",
      "id": 1,
      "node_id": "MDQ6VXNlcjE=",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "gravatar_id": "",
      "url": "https://api.github.com/users/octocat",
      "html_url": "https://github.com/octocat",
      "followers_url": "https://api.github.com/users/octocat/followers",
      "following_url": "https://api.github.com/users/octocat/following{/other_user}",
      "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
      "organizations_url": "https://api.github.com/users/octocat/orgs",
      "repos_url": "https://api.github.com/users/octocat/repos",
      "events_url": "https://api.github.com/users/octocat/events{/privacy}",
      "received_events_url": "https://api.github.com/users/octocat/received_events",
      "type": "User",
      "site_admin": false
    },
    "content": "heart",
    "created_at": "2016-05-20T20:09:31Z"
  }
]

Notes

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Create reaction for a team discussion (Legacy)

Deprecation Notice: This endpoint route is deprecated and will be removed from the Teams API. We recommend migrating your existing code to use the new Create reaction for a team discussion endpoint.

Create a reaction to a team discussion. OAuth access tokens require the write:discussion scope. A response with a Status: 200 OK means that you already added the reaction type to this team discussion.

post /teams/{team_id}/discussions/{discussion_number}/reactions

Parameters

Name Type In Description
accept string header

This API is under preview and subject to change.

See preview notice.
team_id integer path
discussion_number integer path
content string body

Required. The reaction type to add to the team discussion.

Code samples

Shell
curl \
  -X POST \
  -H "Accept: application/vnd.github.squirrel-girl-preview+json" \
  https://api.github.com/teams/42/discussions/42/reactions \
  -d '{"content":"content"}'
JavaScript (@octokit/core.js)
await octokit.request('POST /teams/{team_id}/discussions/{discussion_number}/reactions', {
  team_id: 42,
  discussion_number: 42,
  content: 'content',
  mediaType: {
    previews: [
      'squirrel-girl'
    ]
  }
})

Default response

Status: 201 Created
{
  "id": 1,
  "node_id": "MDg6UmVhY3Rpb24x",
  "user": {
    "login": "octocat",
    "id": 1,
    "node_id": "MDQ6VXNlcjE=",
    "avatar_url": "https://github.com/images/error/octocat_happy.gif",
    "gravatar_id": "",
    "url": "https://api.github.com/users/octocat",
    "html_url": "https://github.com/octocat",
    "followers_url": "https://api.github.com/users/octocat/followers",
    "following_url": "https://api.github.com/users/octocat/following{/other_user}",
    "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
    "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
    "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
    "organizations_url": "https://api.github.com/users/octocat/orgs",
    "repos_url": "https://api.github.com/users/octocat/repos",
    "events_url": "https://api.github.com/users/octocat/events{/privacy}",
    "received_events_url": "https://api.github.com/users/octocat/received_events",
    "type": "User",
    "site_admin": false
  },
  "content": "heart",
  "created_at": "2016-05-20T20:09:31Z"
}

Preview notice

An additional reactions object in the issue comment payload is currently available for developers to preview. During the preview period, the APIs may change without advance notice. Please see the blog post for full details.

To access the API you must provide a custom media type in the Accept header:

application/vnd.github.squirrel-girl-preview

The reactions key will have the following payload where url can be used to construct the API location for listing and creating reactions.

{
  "total_count": 5,
  "+1": 3,
  "-1": 1,
  "laugh": 0,
  "confused": 0,
  "heart": 1,
  "hooray": 0,
  "url": "https://api.github.com/repos/octocat/Hello-World/issues/1347/reactions"
}
☝️ This header is required.

Did this doc help you?

Ask a human

Can't find what you're looking for?

Contact us
` var reactionsGoFileOriginal = `// Copyright 2016 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 ( "context" "fmt" "net/http" ) // ReactionsService provides access to the reactions-related functions in the // GitHub API. type ReactionsService service // Reaction represents a GitHub reaction. type Reaction struct { // ID is the Reaction ID. ID *int64 ` + "`" + `json:"id,omitempty"` + "`" + ` User *User ` + "`" + `json:"user,omitempty"` + "`" + ` NodeID *string ` + "`" + `json:"node_id,omitempty"` + "`" + ` // Content is the type of reaction. // Possible values are: // "+1", "-1", "laugh", "confused", "heart", "hooray". Content *string ` + "`" + `json:"content,omitempty"` + "`" + ` } // Reactions represents a summary of GitHub reactions. type Reactions struct { TotalCount *int ` + "`" + `json:"total_count,omitempty"` + "`" + ` PlusOne *int ` + "`" + `json:"+1,omitempty"` + "`" + ` MinusOne *int ` + "`" + `json:"-1,omitempty"` + "`" + ` Laugh *int ` + "`" + `json:"laugh,omitempty"` + "`" + ` Confused *int ` + "`" + `json:"confused,omitempty"` + "`" + ` Heart *int ` + "`" + `json:"heart,omitempty"` + "`" + ` Hooray *int ` + "`" + `json:"hooray,omitempty"` + "`" + ` URL *string ` + "`" + `json:"url,omitempty"` + "`" + ` } func (r Reaction) String() string { return Stringify(r) } // ListCommentReactionOptions specifies the optional parameters to the // ReactionsService.ListCommentReactions method. type ListCommentReactionOptions struct { // Content restricts the returned comment reactions to only those with the given type. // Omit this parameter to list all reactions to a commit comment. // Possible values are: "+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", or "eyes". Content string ` + "`" + `url:"content,omitempty"` + "`" + ` ListOptions } // ListCommentReactions lists the reactions for a commit comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-a-commit-comment func (s *ReactionsService) ListCommentReactions(ctx context.Context, owner, repo string, id int64, opts *ListCommentReactionOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions", owner, repo, id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreateCommentReaction creates a reaction for a commit comment. // Note that if you have already created a reaction of type content, the // previously created reaction will be returned with Status: 200 OK. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-a-commit-comment func (s *ReactionsService) CreateCommentReaction(ctx context.Context, owner, repo string, id int64, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions", owner, repo, id) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteCommentReaction deletes the reaction for a commit comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-a-commit-comment-reaction func (s *ReactionsService) DeleteCommentReaction(ctx context.Context, owner, repo string, commentID, reactionID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions/%v", owner, repo, commentID, reactionID) return s.deleteReaction(ctx, u) } // DeleteCommentReactionByID deletes the reaction for a commit comment by repository ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-a-commit-comment-reaction func (s *ReactionsService) DeleteCommentReactionByID(ctx context.Context, repoID, commentID, reactionID int64) (*Response, error) { u := fmt.Sprintf("repositories/%v/comments/%v/reactions/%v", repoID, commentID, reactionID) return s.deleteReaction(ctx, u) } // ListIssueReactions lists the reactions for an issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-an-issue func (s *ReactionsService) ListIssueReactions(ctx context.Context, owner, repo string, number int, opts *ListOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%v/reactions", owner, repo, number) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreateIssueReaction creates a reaction for an issue. // Note that if you have already created a reaction of type content, the // previously created reaction will be returned with Status: 200 OK. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-an-issue func (s *ReactionsService) CreateIssueReaction(ctx context.Context, owner, repo string, number int, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%v/reactions", owner, repo, number) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteIssueReaction deletes the reaction to an issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-an-issue-reaction func (s *ReactionsService) DeleteIssueReaction(ctx context.Context, owner, repo string, issueNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/issues/%v/reactions/%v", owner, repo, issueNumber, reactionID) return s.deleteReaction(ctx, url) } // DeleteIssueReactionByID deletes the reaction to an issue by repository ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-an-issue-reaction func (s *ReactionsService) DeleteIssueReactionByID(ctx context.Context, repoID, issueNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("repositories/%v/issues/%v/reactions/%v", repoID, issueNumber, reactionID) return s.deleteReaction(ctx, url) } // ListIssueCommentReactions lists the reactions for an issue comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-an-issue-comment func (s *ReactionsService) ListIssueCommentReactions(ctx context.Context, owner, repo string, id int64, opts *ListOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions", owner, repo, id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreateIssueCommentReaction creates a reaction for an issue comment. // Note that if you have already created a reaction of type content, the // previously created reaction will be returned with Status: 200 OK. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-an-issue-comment func (s *ReactionsService) CreateIssueCommentReaction(ctx context.Context, owner, repo string, id int64, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions", owner, repo, id) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteIssueCommentReaction deletes the reaction to an issue comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-an-issue-comment-reaction func (s *ReactionsService) DeleteIssueCommentReaction(ctx context.Context, owner, repo string, commentID, reactionID int64) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions/%v", owner, repo, commentID, reactionID) return s.deleteReaction(ctx, url) } // DeleteIssueCommentReactionByID deletes the reaction to an issue comment by repository ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-an-issue-comment-reaction func (s *ReactionsService) DeleteIssueCommentReactionByID(ctx context.Context, repoID, commentID, reactionID int64) (*Response, error) { url := fmt.Sprintf("repositories/%v/issues/comments/%v/reactions/%v", repoID, commentID, reactionID) return s.deleteReaction(ctx, url) } // ListPullRequestCommentReactions lists the reactions for a pull request review comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-an-issue-comment func (s *ReactionsService) ListPullRequestCommentReactions(ctx context.Context, owner, repo string, id int64, opts *ListOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions", owner, repo, id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreatePullRequestCommentReaction creates a reaction for a pull request review comment. // Note that if you have already created a reaction of type content, the // previously created reaction will be returned with Status: 200 OK. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-an-issue-comment func (s *ReactionsService) CreatePullRequestCommentReaction(ctx context.Context, owner, repo string, id int64, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions", owner, repo, id) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeletePullRequestCommentReaction deletes the reaction to a pull request review comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-a-pull-request-comment-reaction func (s *ReactionsService) DeletePullRequestCommentReaction(ctx context.Context, owner, repo string, commentID, reactionID int64) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions/%v", owner, repo, commentID, reactionID) return s.deleteReaction(ctx, url) } // DeletePullRequestCommentReactionByID deletes the reaction to a pull request review comment by repository ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-a-pull-request-comment-reaction func (s *ReactionsService) DeletePullRequestCommentReactionByID(ctx context.Context, repoID, commentID, reactionID int64) (*Response, error) { url := fmt.Sprintf("repositories/%v/pulls/comments/%v/reactions/%v", repoID, commentID, reactionID) return s.deleteReaction(ctx, url) } // ListTeamDiscussionReactions lists the reactions for a team discussion. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-a-team-discussion func (s *ReactionsService) ListTeamDiscussionReactions(ctx context.Context, teamID int64, discussionNumber int, opts *ListOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("teams/%v/discussions/%v/reactions", teamID, discussionNumber) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreateTeamDiscussionReaction creates a reaction for a team discussion. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-a-team-discussion func (s *ReactionsService) CreateTeamDiscussionReaction(ctx context.Context, teamID int64, discussionNumber int, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("teams/%v/discussions/%v/reactions", teamID, discussionNumber) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteTeamDiscussionReaction deletes the reaction to a team discussion. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-team-discussion-reaction func (s *ReactionsService) DeleteTeamDiscussionReaction(ctx context.Context, org, teamSlug string, discussionNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/reactions/%v", org, teamSlug, discussionNumber, reactionID) return s.deleteReaction(ctx, url) } // DeleteTeamDiscussionReactionByOrgIDAndTeamID deletes the reaction to a team discussion by organization ID and team ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-team-discussion-reaction func (s *ReactionsService) DeleteTeamDiscussionReactionByOrgIDAndTeamID(ctx context.Context, orgID, teamID, discussionNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/reactions/%v", orgID, teamID, discussionNumber, reactionID) return s.deleteReaction(ctx, url) } // ListTeamDiscussionCommentReactions lists the reactions for a team discussion comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-a-team-discussion-comment func (s *ReactionsService) ListTeamDiscussionCommentReactions(ctx context.Context, teamID int64, discussionNumber, commentNumber int, opts *ListOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v/reactions", teamID, discussionNumber, commentNumber) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, nil, err } return m, resp, nil } // CreateTeamDiscussionCommentReaction creates a reaction for a team discussion comment. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-a-team-discussion-comment func (s *ReactionsService) CreateTeamDiscussionCommentReaction(ctx context.Context, teamID int64, discussionNumber, commentNumber int, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v/reactions", teamID, discussionNumber, commentNumber) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteTeamDiscussionCommentReaction deletes the reaction to a team discussion comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-team-discussion-comment-reaction func (s *ReactionsService) DeleteTeamDiscussionCommentReaction(ctx context.Context, org, teamSlug string, discussionNumber, commentNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments/%v/reactions/%v", org, teamSlug, discussionNumber, commentNumber, reactionID) return s.deleteReaction(ctx, url) } // DeleteTeamDiscussionCommentReactionByOrgIDAndTeamID deletes the reaction to a team discussion comment by organization ID and team ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-team-discussion-comment-reaction func (s *ReactionsService) DeleteTeamDiscussionCommentReactionByOrgIDAndTeamID(ctx context.Context, orgID, teamID, discussionNumber, commentNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments/%v/reactions/%v", orgID, teamID, discussionNumber, commentNumber, reactionID) return s.deleteReaction(ctx, url) } func (s *ReactionsService) deleteReaction(ctx context.Context, url string) (*Response, error) { req, err := s.client.NewRequest(http.MethodDelete, url, nil) if err != nil { return nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) return s.client.Do(ctx, req, nil) } ` var reactionsGoFileWant = `// Copyright 2016 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 ( "context" "fmt" "net/http" ) // ReactionsService provides access to the reactions-related functions in the // GitHub API. type ReactionsService service // Reaction represents a GitHub reaction. type Reaction struct { // ID is the Reaction ID. ID *int64 ` + "`" + `json:"id,omitempty"` + "`" + ` User *User ` + "`" + `json:"user,omitempty"` + "`" + ` NodeID *string ` + "`" + `json:"node_id,omitempty"` + "`" + ` // Content is the type of reaction. // Possible values are: // "+1", "-1", "laugh", "confused", "heart", "hooray". Content *string ` + "`" + `json:"content,omitempty"` + "`" + ` } // Reactions represents a summary of GitHub reactions. type Reactions struct { TotalCount *int ` + "`" + `json:"total_count,omitempty"` + "`" + ` PlusOne *int ` + "`" + `json:"+1,omitempty"` + "`" + ` MinusOne *int ` + "`" + `json:"-1,omitempty"` + "`" + ` Laugh *int ` + "`" + `json:"laugh,omitempty"` + "`" + ` Confused *int ` + "`" + `json:"confused,omitempty"` + "`" + ` Heart *int ` + "`" + `json:"heart,omitempty"` + "`" + ` Hooray *int ` + "`" + `json:"hooray,omitempty"` + "`" + ` URL *string ` + "`" + `json:"url,omitempty"` + "`" + ` } func (r Reaction) String() string { return Stringify(r) } // ListCommentReactionOptions specifies the optional parameters to the // ReactionsService.ListCommentReactions method. type ListCommentReactionOptions struct { // Content restricts the returned comment reactions to only those with the given type. // Omit this parameter to list all reactions to a commit comment. // Possible values are: "+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", or "eyes". Content string ` + "`" + `url:"content,omitempty"` + "`" + ` ListOptions } // ListCommentReactions lists the reactions for a commit comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-a-commit-comment func (s *ReactionsService) ListCommentReactions(ctx context.Context, owner, repo string, id int64, opts *ListCommentReactionOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions", owner, repo, id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreateCommentReaction creates a reaction for a commit comment. // Note that if you have already created a reaction of type content, the // previously created reaction will be returned with Status: 200 OK. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-a-commit-comment func (s *ReactionsService) CreateCommentReaction(ctx context.Context, owner, repo string, id int64, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions", owner, repo, id) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteCommentReaction deletes the reaction for a commit comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-a-commit-comment-reaction func (s *ReactionsService) DeleteCommentReaction(ctx context.Context, owner, repo string, commentID, reactionID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/comments/%v/reactions/%v", owner, repo, commentID, reactionID) return s.deleteReaction(ctx, u) } // DeleteCommentReactionByID deletes the reaction for a commit comment by repository ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-a-commit-comment-reaction func (s *ReactionsService) DeleteCommentReactionByID(ctx context.Context, repoID, commentID, reactionID int64) (*Response, error) { u := fmt.Sprintf("repositories/%v/comments/%v/reactions/%v", repoID, commentID, reactionID) return s.deleteReaction(ctx, u) } // ListIssueReactions lists the reactions for an issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-an-issue func (s *ReactionsService) ListIssueReactions(ctx context.Context, owner, repo string, number int, opts *ListOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%v/reactions", owner, repo, number) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreateIssueReaction creates a reaction for an issue. // Note that if you have already created a reaction of type content, the // previously created reaction will be returned with Status: 200 OK. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-an-issue func (s *ReactionsService) CreateIssueReaction(ctx context.Context, owner, repo string, number int, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%v/reactions", owner, repo, number) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteIssueReaction deletes the reaction to an issue. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-an-issue-reaction func (s *ReactionsService) DeleteIssueReaction(ctx context.Context, owner, repo string, issueNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/issues/%v/reactions/%v", owner, repo, issueNumber, reactionID) return s.deleteReaction(ctx, url) } // DeleteIssueReactionByID deletes the reaction to an issue by repository ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-an-issue-reaction func (s *ReactionsService) DeleteIssueReactionByID(ctx context.Context, repoID, issueNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("repositories/%v/issues/%v/reactions/%v", repoID, issueNumber, reactionID) return s.deleteReaction(ctx, url) } // ListIssueCommentReactions lists the reactions for an issue comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-an-issue-comment func (s *ReactionsService) ListIssueCommentReactions(ctx context.Context, owner, repo string, id int64, opts *ListOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions", owner, repo, id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreateIssueCommentReaction creates a reaction for an issue comment. // Note that if you have already created a reaction of type content, the // previously created reaction will be returned with Status: 200 OK. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-an-issue-comment func (s *ReactionsService) CreateIssueCommentReaction(ctx context.Context, owner, repo string, id int64, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions", owner, repo, id) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteIssueCommentReaction deletes the reaction to an issue comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-an-issue-comment-reaction func (s *ReactionsService) DeleteIssueCommentReaction(ctx context.Context, owner, repo string, commentID, reactionID int64) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/issues/comments/%v/reactions/%v", owner, repo, commentID, reactionID) return s.deleteReaction(ctx, url) } // DeleteIssueCommentReactionByID deletes the reaction to an issue comment by repository ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-an-issue-comment-reaction func (s *ReactionsService) DeleteIssueCommentReactionByID(ctx context.Context, repoID, commentID, reactionID int64) (*Response, error) { url := fmt.Sprintf("repositories/%v/issues/comments/%v/reactions/%v", repoID, commentID, reactionID) return s.deleteReaction(ctx, url) } // ListPullRequestCommentReactions lists the reactions for a pull request review comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-a-pull-request-review-comment func (s *ReactionsService) ListPullRequestCommentReactions(ctx context.Context, owner, repo string, id int64, opts *ListOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions", owner, repo, id) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreatePullRequestCommentReaction creates a reaction for a pull request review comment. // Note that if you have already created a reaction of type content, the // previously created reaction will be returned with Status: 200 OK. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-a-pull-request-review-comment func (s *ReactionsService) CreatePullRequestCommentReaction(ctx context.Context, owner, repo string, id int64, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions", owner, repo, id) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeletePullRequestCommentReaction deletes the reaction to a pull request review comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-a-pull-request-comment-reaction func (s *ReactionsService) DeletePullRequestCommentReaction(ctx context.Context, owner, repo string, commentID, reactionID int64) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/pulls/comments/%v/reactions/%v", owner, repo, commentID, reactionID) return s.deleteReaction(ctx, url) } // DeletePullRequestCommentReactionByID deletes the reaction to a pull request review comment by repository ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-a-pull-request-comment-reaction func (s *ReactionsService) DeletePullRequestCommentReactionByID(ctx context.Context, repoID, commentID, reactionID int64) (*Response, error) { url := fmt.Sprintf("repositories/%v/pulls/comments/%v/reactions/%v", repoID, commentID, reactionID) return s.deleteReaction(ctx, url) } // ListTeamDiscussionReactions lists the reactions for a team discussion. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-a-team-discussion-legacy func (s *ReactionsService) ListTeamDiscussionReactions(ctx context.Context, teamID int64, discussionNumber int, opts *ListOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("teams/%v/discussions/%v/reactions", teamID, discussionNumber) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, resp, err } return m, resp, nil } // CreateTeamDiscussionReaction creates a reaction for a team discussion. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-a-team-discussion-legacy func (s *ReactionsService) CreateTeamDiscussionReaction(ctx context.Context, teamID int64, discussionNumber int, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("teams/%v/discussions/%v/reactions", teamID, discussionNumber) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteTeamDiscussionReaction deletes the reaction to a team discussion. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-team-discussion-reaction func (s *ReactionsService) DeleteTeamDiscussionReaction(ctx context.Context, org, teamSlug string, discussionNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/reactions/%v", org, teamSlug, discussionNumber, reactionID) return s.deleteReaction(ctx, url) } // DeleteTeamDiscussionReactionByOrgIDAndTeamID deletes the reaction to a team discussion by organization ID and team ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-team-discussion-reaction func (s *ReactionsService) DeleteTeamDiscussionReactionByOrgIDAndTeamID(ctx context.Context, orgID, teamID, discussionNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/reactions/%v", orgID, teamID, discussionNumber, reactionID) return s.deleteReaction(ctx, url) } // ListTeamDiscussionCommentReactions lists the reactions for a team discussion comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#list-reactions-for-a-team-discussion-comment-legacy func (s *ReactionsService) ListTeamDiscussionCommentReactions(ctx context.Context, teamID int64, discussionNumber, commentNumber int, opts *ListOptions) ([]*Reaction, *Response, error) { u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v/reactions", teamID, discussionNumber, commentNumber) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeReactionsPreview) var m []*Reaction resp, err := s.client.Do(ctx, req, &m) if err != nil { return nil, nil, err } return m, resp, nil } // CreateTeamDiscussionCommentReaction creates a reaction for a team discussion comment. // The content should have one of the following values: "+1", "-1", "laugh", "confused", "heart", "hooray". // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#create-reaction-for-a-team-discussion-comment-legacy func (s *ReactionsService) CreateTeamDiscussionCommentReaction(ctx context.Context, teamID int64, discussionNumber, commentNumber int, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v/reactions", teamID, discussionNumber, commentNumber) body := &Reaction{Content: String(content)} req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } req.Header.Set("Accept", mediaTypeReactionsPreview) m := &Reaction{} resp, err := s.client.Do(ctx, req, m) if err != nil { return nil, resp, err } return m, resp, nil } // DeleteTeamDiscussionCommentReaction deletes the reaction to a team discussion comment. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-team-discussion-comment-reaction func (s *ReactionsService) DeleteTeamDiscussionCommentReaction(ctx context.Context, org, teamSlug string, discussionNumber, commentNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments/%v/reactions/%v", org, teamSlug, discussionNumber, commentNumber, reactionID) return s.deleteReaction(ctx, url) } // DeleteTeamDiscussionCommentReactionByOrgIDAndTeamID deletes the reaction to a team discussion comment by organization ID and team ID. // // GitHub API docs: https://docs.github.com/en/free-pro-team@latest/rest/reference/reactions/#delete-team-discussion-comment-reaction func (s *ReactionsService) DeleteTeamDiscussionCommentReactionByOrgIDAndTeamID(ctx context.Context, orgID, teamID, discussionNumber, commentNumber int, reactionID int64) (*Response, error) { url := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments/%v/reactions/%v", orgID, teamID, discussionNumber, commentNumber, reactionID) return s.deleteReaction(ctx, url) } func (s *ReactionsService) deleteReaction(ctx context.Context, url string) (*Response, error) { req, err := s.client.NewRequest(http.MethodDelete, url, nil) if err != nil { return nil, err } // TODO: remove custom Accept headers when APIs fully launch. req.Header.Set("Accept", mediaTypeReactionsPreview) return s.client.Do(ctx, req, nil) } `