pax_global_header00006660000000000000000000000064145701357470014527gustar00rootroot0000000000000052 comment=ffe505198ca42c56e8c2232928a040a6d0f5b31f go-github-60.0.0/000077500000000000000000000000001457013574700134775ustar00rootroot00000000000000go-github-60.0.0/.codecov.yml000066400000000000000000000002311457013574700157160ustar00rootroot00000000000000ignore: # ignore auto-generated code - "github/github-accessors.go" # ignore experimental scrape package - "scrape" # ignore tools - "tools" go-github-60.0.0/.github/000077500000000000000000000000001457013574700150375ustar00rootroot00000000000000go-github-60.0.0/.github/dependabot.yml000066400000000000000000000005221457013574700176660ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: gomod directory: / schedule: interval: weekly - package-ecosystem: gomod directory: scrape schedule: interval: weekly - package-ecosystem: gomod directory: tools schedule: interval: weekly - package-ecosystem: github-actions directory: / schedule: interval: weekly go-github-60.0.0/.github/workflows/000077500000000000000000000000001457013574700170745ustar00rootroot00000000000000go-github-60.0.0/.github/workflows/linter.yml000066400000000000000000000005701457013574700211160ustar00rootroot00000000000000on: [push, pull_request] name: linter permissions: contents: read jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: go-version: 1.x cache-dependency-path: "**/go.sum" - run: script/lint.sh env: CHECK_GITHUB_OPENAPI: 1 GITHUB_TOKEN: ${{ github.token }} go-github-60.0.0/.github/workflows/tests.yml000066400000000000000000000041071457013574700207630ustar00rootroot00000000000000concurrency: group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true on: push: branches: - master pull_request: branches: - master name: tests env: GO111MODULE: on permissions: contents: read jobs: test: defaults: run: shell: bash strategy: matrix: go-version: [1.x, 1.21.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: - uses: actions/setup-go@v5 with: go-version: ${{ matrix.go-version }} - uses: actions/checkout@v4 # Get values for cache paths to be used in later steps - id: cache-paths run: | echo "go-cache=$(go env GOCACHE)" >> $GITHUB_OUTPUT echo "go-mod-cache=$(go env GOMODCACHE)" >> $GITHUB_OUTPUT - name: Cache go modules uses: actions/cache@v4 with: path: | ${{ steps.cache-paths.outputs.go-cache }} ${{ steps.cache-paths.outputs.go-mod-cache }} key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: ${{ runner.os }}-go- - name: Run go test run: | if [ -n "${{ matrix.update-coverage }}" ]; then script/test.sh -race -covermode atomic -coverprofile coverage.txt ./... exit fi script/test.sh -race -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: Upload coverage to Codecov if: ${{ matrix.update-coverage }} uses: codecov/codecov-action@0cfda1dd0a4ad9efc75517f399d859cd1ea4ced1 #v4.0.2 go-github-60.0.0/.gitignore000066400000000000000000000003601457013574700154660ustar00rootroot00000000000000*.sh !/script/*.sh *.test coverage.out /bin # intellij files .idea/ vendor/ .DS_Store .vscode # vim temp files *.swp # goenv local version. See https://github.com/syndbg/goenv/blob/master/COMMANDS.md#goenv-local for more info. .go-version go-github-60.0.0/.golangci.yml000066400000000000000000000026311457013574700160650ustar00rootroot00000000000000run: build-tags: - integration timeout: 10m linters: enable: - dogsled - dupl - gofmt - goimports - gosec - misspell - nakedret - stylecheck - unconvert - unparam - whitespace linters-settings: gosec: excludes: # duplicates errcheck - G104 # performance issue: see https://github.com/golangci/golangci-lint/issues/4039 # and https://github.com/securego/gosec/issues/1007 - G602 issues: exclude-use-default: false exclude-rules: - linters: - dupl - unparam - gosec - dogsled path: _test\.go # We need to pass nil Context in order to test DoBare erroring on nil ctx. - linters: [ staticcheck ] text: 'SA1012: do not pass a nil Context' path: _test\.go # We need to use sha1 for validating signatures - linters: [ gosec ] text: 'G505: Blocklisted import crypto/sha1: weak cryptographic primitive' # This is adapted from golangci-lint's default exclusions. It disables linting for error checks on # os.RemoveAll and any function ending in "Close". - linters: [ errcheck ] text: Error return value of .(.*Close|os\.Remove(All)?). is not checked # We don't care about file inclusion via variable in examples or internal tools. - linters: [ gosec ] text: 'G304: Potential file inclusion via variable' path: '^(example|tools)\/' go-github-60.0.0/AUTHORS000066400000000000000000000434151457013574700145560ustar00rootroot00000000000000# 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 6543 <6543@obermui.de> Abed Kibbe Abhinav Gupta Abhishek Veeramalla aboy Adam Kohring adrienzieba afdesk Ahmad Nurus S Ahmed Hagy Aidan Aidan Steele Ainsley Chong ajz01 Akeda Bagus Akhil Mohan Alec Thomas Aleks Clark Alex Bramley Alex Ellis Alex Orr Alex Su Alex Unger Alexander Harkness Alexis Gauthiez Ali Farooq Allan Guwatudde Allen Sun Amey Sakhadeo Anders Janmyr Andreas Garnæs Andrew Ryabchun Andrew Svoboda Andy Grunwald Andy Hume Andy Lindeman angie pinilla anjanashenoy Anshuman Bhartiya Antoine Antoine Pelisse Anton Nguyen Anubha Kushwaha appilon aprp apurwaj2 Aravind Arda Kuyumcu Arıl Bozoluk Asier Marruedo Austin Burdine Austin Dizzy Azuka Okuleye Ben Batha Benjamen Keroack Berkay Tacyildiz Beshr Kayali Beyang Liu Billy Keyes Billy Lynch Bingtan Lu Bjorn Neergaard Björn Häuser Bo Huang boljen Bracken Brad Harris Brad Moylan Bradley Falzon Bradley McAllister Brandon Butler Brandon Cook Brandon Stubbs Brett Kuhlman Brett Logan Brian Egizi Bryan Boreham Bryan Peterson Cami Diez Carl Johnson Carlos Alexandro Becker Carlos Tadeu Panato Junior ChandanChainani chandresh-pancholi Charles Fenwick Elliott Charlie Yan Chmouel Boudjnah Chris King Chris Mc Chris Raborg Chris Roche Chris Schaefer chrisforrette Christian Bargmann Christian Muehlhaeuser Christoph Jerolimov Christoph Sassenberg CI Monk Colin Misare Craig Gumbley Craig Peterson Cristian Maglie Cyb3r Jak3 Daehyeok Mun Dalton Hubble Daniel Lanner Daniel Leavitt Daniel Nilsson Daoq Dave Du Cros Dave Henderson Dave Perrett Dave Protasowski David Deng David Gamba David J. M. Karlsen David Jannotta David Ji David Lopez Reyes Davide Zipeto Dennis Webb Derek Jobst DeviousLab Dhi Aurrahman Diego Lapiduz Diogo Vilela Dmitri Shuralyov dmnlk Don Petersen Doug Turner Drew Fradette Dustin Deus Dustin Lish Eivind Eli Uriegas Elliott Beach Emerson Wood Emil V Eng Zer Jun eperm Erick Fejta Erik Nobel erwinvaneyk Evan Anderson Evan Elias Fabian Holler Fabrice Fatema-Moaiyadi Federico Di Pierro Felix Geisendörfer Filippo Valsorda Florian Forster Florian Wagner Francesc Gil Francis Francisco Guimarães François de Metz Fredrik Jönsson Gabriel Gal Ofri Garrett Squire George Kontridze Georgy Buranov Glen Mailer Gnahz Google Inc. Grachev Mikhail griffin_stewie guangwu Guillaume Jacquet Guz Alexander Guðmundur Bjarni Ólafsson Hanno Hecker Hari haran Harikesh00 haya14busa haya14busa Hiroki Ito Hubot Jr Huy Tr huydx i2bskn Iain Steers Ikko Ashimine Ilia Choly Ioannis Georgoulas Isao Jonas ishan upadhyay isqua Jacob Valdemar Jake Krammer Jake White Jameel Haffejee James Bowes James Cockbain James Loh James Maguire James Turley Jamie West Jan Kosecki Jan Švábík Jason Field Javier Campanini Jef LeCompte Jeff Wenzbauer Jens Rantil Jeremy Morris Jesse Haka Jesse Newland Jihoon Chung Jille Timmermans Jimmi Dyson Joan Saum Joe Tsai John Barton John Engelman John Jones John Liu Jordan Brockopp Jordan Burandt Jordan Sussman Jorge Gómez Reus Joshua Bezaleel Abednego João Cerqueira JP Phillips jpbelanger-mtl Juan Juan Basso Julien Garcia Gonzalez Julien Rostand Junya Kono Justin Abrahms Justin Toh Jusung Lee jzhoucliqr k0ral k1rnt kadern0 Karthik Sundari Katrina Owen Kautilya Tripathi Keita Urashima Kevin Burke Kevin Wang Kevin Zhao kgalli Kirill Konrad Malawski Kookheon Kwon Krishna Indani Krzysztof Kowalczyk Kshitij Saraogi Kumar Saurabh Kyle Kurz kyokomi Lars Lehtonen Laurent Verdoïa leopoldwang Liam Galvin Lluis Campos Lovro Mažgon Loïs Postula Luca Campese Lucas Alcantara Lucas Martin-King Luis Davim Luke Evers Luke Hinds Luke Kysow Luke Roberts Luke Young lynn [they] Magnus Kulke Maksim Zhylinski Marc Binder Marcelo Carlos Mark Tareshawty Martin Holman Martin-Louis Bright Martins Sipenko Marwan Sulaiman Masayuki Izumi Mat Geist Matija Horvat Matin Rahmanian Matt Matt Brender Matt Dainty Matt Gaunt Matt Landis Matt Moore Matt Simons Maxime Bury Michael Meng Michael Spiegel Michael Tiller Michał Glapa Michelangelo Morrillo Miguel Elias dos Santos Mike Chen mohammad ali <2018cs92@student.uet.edu.pk> Mohammed AlDujaili Mukundan Senthil Munia Balayil Mustafa Abban Nadav Kaner Naoki Kanatani Nathan VanBenschoten Navaneeth Suresh Neal Caffery Neil O'Toole Nick Miyake Nick Platt Nick Spragg Nicolas Chapurlat Nikhita Raghunath Nilesh Singh Noah Hanjun Lee Noah Zoschke ns-cweber nxya Ole Orhagen Oleg Kovalov Ondřej Kupka Ori Talmor Osama Faqhruldin oslowalk Pablo Pérez Schröder Palash Nigam Panagiotis Moustafellos Parham Alvani pari-27 Parker Moore parkhyukjun89 Pat Alwell Patrick DeVivo Patrick Marabeas Patrik Nordlén Pavel Dvoinos Pavel Shtanko Pete Wagner Petr Shevtsov Pierce McEntagart 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 Rafael Aramizu Gomes Rajat Jindal Rajendra arora Rajkumar Ranbir Singh Ravi Shekhar Jethani RaviTeja Pothana rc1140 Red Hat, Inc. Reetuparna Mukherjee reeves122 Reinier Timmer Renjith R Ricco Førgaard Richard de Vries Rob Figueiredo Rohit Upadhyay Rojan Dinc Ronak Jain Ronan Pelliard Ross Gustafson Ruben Vereecken Russell Boley Ryan Leung Ryan Lower Ryo Nakao Saaarah Safwan Olaimat Sahil Dua Sai Ravi Teja Chintakrindi saisi Sam Minnée Sandeep Sukhani Sander Knape Sander van Harmelen Sanket Payghan Sarah Funkhouser Sarasa Kisaragi Sasha Melentyev Sean Wang Sebastian Mandrean Sebastian Mæland Pedersen Sergei Popinevskii Sergey Romanov Sergio Garcia Seth Vargo Sevki Shagun Khemka shakeelrao Shawn Catanzarite Shawn Smith Shibasis Patel Sho Okada Shrikrishna Singh Simon Davis sona-tar soniachikh SoundCloud, Ltd. Sridhar Mocherla SriVignessh Pss Stefan Sedich Steve Teuber Stian Eikeland Suhaib Mujahid sushmita wable Szymon Kodrebski Søren Hansen T.J. Corrigan Takashi Yoneuchi Takayuki Watanabe Taketoshi Fujiwara Taketoshi Fujiwara Takuma Kajikawa Tasya Aditya Rukmana Theo Henson Theofilos Petsios Thomas Aidan Curran Thomas Bruyelle Tim Rogers Timothy O'Brien Timothée Peignier Tingluo Huang tkhandel Tobias Gesellchen Tom Payne Trey Tacon tsbkw ttacon Vaibhav Singh Varadarajan Aravamudhan Victor Castell Victor Vrantchan Victory Osikwemhe vikkyomkar Vivek Vlad Ungureanu Wasim Thabraze Weslei Juan Moser Pereira Wheeler Law Will Maier Will Norris Willem D'Haeseleer William Bailey William Cooke Xabi xibz Yann Malet Yannick Utard Yarden Shoham Yicheng Qin Yosuke Akatsuka Yumikiyo Osanai Yurii Soldak Yusef Mohamadi Yusuke Kuoka Zach Latta zhouhaibing089 六开箱 缘生 蒋航 go-github-60.0.0/CONTRIBUTING.md000066400000000000000000000273311457013574700157360ustar00rootroot00000000000000# 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. 2. Follow the normal process of [forking][] the project, and set up 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. 3. 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. Coverage is [monitored by codecov.io][], which flags pull requests that decrease test coverage. This doesn't necessarily mean that PRs with decreased coverage won't be merged. Sometimes a decrease in coverage makes sense, but if your PR is flagged, you should either add tests to cover those lines or add a PR comment explaining the untested lines. 4. Run `script/fmt.sh`, `script/test.sh` and `script/lint.sh` to format your code and check that it passes all tests and linters. `script/lint.sh` may also tell you that generated files need to be updated. If so, run `script/generate.sh` to update them. 5. 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. 6. 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. We always perform "squash and merge" actions on PRs in this repo, so it doesn't matter how many commits your PR has, as they will end up being a single commit after merging. This is done to make a much cleaner `git log` history and helps to find regressions in the code using existing tools such as `git bisect`. [forking]: https://help.github.com/articles/fork-a-repo [well-formed commit messages]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html [pull request]: https://help.github.com/articles/creating-a-pull-request [monitored by codecov.io]: https://codecov.io/gh/google/go-github ## Code Comments Every exported method needs to have code comments that follow [Go Doc Comments][]. A typical method's comments will look like this: ```go // Get fetches a repository. // // GitHub API docs: https://docs.github.com/rest/repos/repos#get-a-repository // //meta:operation GET /repos/{owner}/{repo} 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) ... } ``` The first line is the name of the method followed by a short description. This could also be a longer description if needed, but there is no need to repeat any details that are documented in GitHub's documentation because users are expected to follow the documentation links to learn more. After the description comes a link to the GitHub API documentation. This is added or fixed automatically when you run `script/generate.sh`, so you won't need to set this yourself. Finally, the `//meta:operation` comment is a directive to the code generator that maps the method to the corresponding OpenAPI operation. Once again, there can be multiple directives for methods that call multiple endpoints. `script/generate.sh` will normalize these directives for you, so if you are adding a new method you can use the pattern from the `u := fmt.Sprintf` line instead of looking up what the url parameters are called in the OpenAPI description. [Go Doc Comments]: https://go.dev/doc/comment ## Metadata GitHub publishes [OpenAPI descriptions of their API][]. We use these descriptions to keep documentation links up to date and to keep track of which methods call which endpoints via the `//meta:operation` comments described above. GitHub's descriptions are far too large to keep in this repository or to pull down every time we generate code, so we keep only the metadata we need in `openapi_operations.yaml`. ### openapi_operations.yaml Most contributors won't need to interact with `openapi_operations.yaml`, but it may be useful to know what it is. Its sections are: - `openapi_operations` - is the metadata that comes from GitHub's OpenAPI descriptions. It is generated by `script/metadata.sh update-openapi` and should not be edited by hand. In the rare case where it needs to be overridden, use the `operation_overrides` section instead. An operation consists of `name`, `documentation_url`, and `openapi_files`. `openapi_files` is the list of files where the operation is described. In order or preference, values can be "api.github.com.json" for operations available on the free plan, "ghec.json" for operations available on GitHub Enterprise Cloud or "ghes-.json" for operations available on GitHub Enterprise Server. When an operation is described in multiple ghes files, only the most recent version is included. `documentation_url` is the URL that should be linked from godoc. It is the documentation link found in the first file listed in `openapi_files`. - `openapi_commit` - is the git commit that `script/metadata.sh update-openapi` saw when it last updated `openapi_operations`. It is not necessarily the most recent commit seen because `update-openapi` doesn't update the file when there are no changes to `openapi_operations`. - `operations` - contains manually added metadata that is not in GitHub's OpenAPI descriptions. There are only a few of these. Some have documentation_urls that point to relevant GitHub documentation that is not in the OpenAPI descriptions. Others have no documentation_url and result in a note in the generated code that the documentation is missing. - `operation_overrides` - is where we override the documentation_url for operations where the link in the OpenAPI descriptions is wrong. ### tools/metadata The `tools/metadata` package is a command-line tool for working with metadata. In a typical workflow, you won't use it directly, but you will use it indirectly through `script/generate.sh` and `script/lint.sh`. Its subcommands are: - `update-openapi` - updates `openapi_operations.yaml` with the latest information from GitHub's OpenAPI descriptions. With `--validate` it will validate that the descriptions are correct as of the commit in `openapi_commit`. `update-openapi --validate` is called by `script/lint.sh`. - `update-go` - updates Go files with documentation URLs and formats comments. It is used by `script/generate.sh`. - `format` - formats whitespace in `openapi_operations.yaml` and sorts its arrays. It is used by `script/fmt.sh`. - `unused` - lists operations from `openapi_operations.yaml` that are not mapped from any methods. [OpenAPI descriptions of their API]: https://github.com/github/rest-api-description ## Scripts The `script` directory has shell scripts that help with common development tasks. **script/fmt.sh** formats all go code in the repository. **script/generate.sh** runs code generators and `go mod tidy` on all modules. With `--check` it checks that the generated files are current. **script/lint.sh** runs linters on the project and checks generated files are current. **script/metadata.sh** runs `tools/metadata`. See the [Metadata](#metadata) section for more information. **script/test.sh** runs tests on all modules. ## 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/rest [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 **When creating a release, don't forget to update the `Version` constant in `github.go`.** This is used to send the version in the `User-Agent` header to identify clients to the GitHub API. go-github-60.0.0/LICENSE000066400000000000000000000027161457013574700145120ustar00rootroot00000000000000Copyright (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-60.0.0/README.md000066400000000000000000000365121457013574700147650ustar00rootroot00000000000000# 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/v60/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/v60 ``` 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/v60/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/v60@master ``` ## Usage ## ```go import "github.com/google/go-github/v60/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/rest . 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 ### Use the `WithAuthToken` method to configure your client to authenticate using an OAuth token (for example, a [personal access token][]). This is what is needed for a majority of use cases aside from GitHub Apps. ```go client := github.NewClient(nil).WithAuthToken("... your access token ...") ``` 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. For API methods that require HTTP Basic Authentication, use the [`BasicAuthTransport`](https://godoc.org/github.com/google/go-github/github#BasicAuthTransport). #### As a GitHub App #### GitHub Apps authentication can be provided by the [ghinstallation](https://github.com/bradleyfalzon/ghinstallation) package. > **Note**: Most endpoints (ex. [`GET /rate_limit`]) require access token authentication > while a few others (ex. [`GET /app/hook/deliveries`]) require [JWT] authentication. [`GET /rate_limit`]: https://docs.github.com/en/rest/rate-limit#get-rate-limit-status-for-the-authenticated-user [`GET /app/hook/deliveries`]: https://docs.github.com/en/rest/apps/webhooks#list-deliveries-for-an-app-webhook [JWT]: https://docs.github.com/en/developers/apps/building-github-apps/authenticating-with-github-apps#authenticating-as-a-github-app ```go import ( "net/http" "github.com/bradleyfalzon/ghinstallation/v2" "github.com/google/go-github/v60/github" ) 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") // Or for endpoints that require JWT authentication // itr, err := ghinstallation.NewAppsTransportKeyFromFile(http.DefaultTransport, 1, "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... } ``` *Note*: In order to interact with certain APIs, for example writing a file to a repo, one must generate an installation token using the installation ID of the GitHub app and authenticate with the OAuth method mentioned above. See the examples. ### 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/rest/rate-limit . In addition to these rate limits, GitHub imposes a secondary rate limit on all API clients. This rate limit prevents clients from making too many concurrent requests. To detect an API secondary rate limit error, you can check if its type is `*github.AbuseRateLimitError`: ```go repos, _, err := client.Repositories.List(ctx, "", nil) if _, ok := err.(*github.AbuseRateLimitError); ok { log.Println("hit secondary rate limit") } ``` You can use [go-github-ratelimit](https://github.com/gofri/go-github-ratelimit) to handle secondary rate limit sleep-and-retry for you. Learn more about GitHub secondary rate limiting at https://docs.github.com/en/rest/overview/resources-in-the-rest-api#secondary-rate-limits . ### 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. For example: ```go import "github.com/gregjones/httpcache" client := github.NewClient( httpcache.NewMemoryCacheTransport().Client() ).WithAuthToken(os.Getenv("GITHUB_TOKEN")) ``` Learn more about GitHub conditional requests at https://docs.github.com/en/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 } ``` ### Webhooks ### `go-github` provides structs for almost all [GitHub webhook events][] as well as functions to validate them and unmarshal JSON payloads from `http.Request` structs. ```go 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) ... } } ``` Furthermore, there are libraries like [cbrgm/githubevents][] that build upon the example above and provide functions to subscribe callbacks to specific events. For complete usage of go-github, see the full [package docs][]. [GitHub API v3]: https://docs.github.com/en/rest [personal access token]: https://github.com/blog/1509-personal-api-tokens [package docs]: https://pkg.go.dev/github.com/google/go-github/v60/github [GraphQL API v4]: https://developer.github.com/v4/ [shurcooL/githubv4]: https://github.com/shurcooL/githubv4 [GitHub webhook events]: https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads [cbrgm/githubevents]: https://github.com/cbrgm/githubevents ### 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. ### Calendar Versioning ### As of 2022-11-28, GitHub [has announced](https://github.blog/2022-11-28-to-infinity-and-beyond-enabling-the-future-of-githubs-rest-api-with-api-versioning/) that they are starting to version their v3 API based on "calendar-versioning". In practice, our goal is to make per-method version overrides (at least in the core library) rare and temporary. Our understanding of the GitHub docs is that they will be revving the entire API to each new date-based version, even if only a few methods have breaking changes. Other methods will accept the new version with their existing functionality. So when a new date-based version of the GitHub API is released, we (the repo maintainers) plan to: * update each method that had breaking changes, overriding their per-method API version header. This may happen in one or multiple commits and PRs, and is all done in the main branch. * once all of the methods with breaking changes have been updated, have a final commit that bumps the default API version, and remove all of the per-method overrides. That would now get a major version bump when the next go-github release is made. ### Version Compatibility Table ### The following table identifies which version of the GitHub API is supported by this (and past) versions of this repo (go-github). Versions prior to 48.2.0 are not listed. | go-github Version | GitHub v3 API Version | | ----------------- | --------------------- | | 60.0.0 | 2022-11-28 | | 59.0.0 | 2022-11-28 | | 58.0.0 | 2022-11-28 | | 57.0.0 | 2022-11-28 | | 56.0.0 | 2022-11-28 | | 55.0.0 | 2022-11-28 | | 54.0.0 | 2022-11-28 | | 53.2.0 | 2022-11-28 | | 53.1.0 | 2022-11-28 | | 53.0.0 | 2022-11-28 | | 52.0.0 | 2022-11-28 | | 51.0.0 | 2022-11-28 | | 50.2.0 | 2022-11-28 | | 50.1.0 | 2022-11-28 | | 50.0.0 | 2022-11-28 | | 49.1.0 | 2022-11-28 | | 49.0.0 | 2022-11-28 | | 48.2.0 | 2022-11-28 | ## License ## This library is distributed under the BSD-style license found in the [LICENSE](./LICENSE) file. go-github-60.0.0/example/000077500000000000000000000000001457013574700151325ustar00rootroot00000000000000go-github-60.0.0/example/actionpermissions/000077500000000000000000000000001457013574700207035ustar00rootroot00000000000000go-github-60.0.0/example/actionpermissions/main.go000066400000000000000000000046021457013574700221600ustar00rootroot00000000000000// Copyright 2022 The go-github 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 actionpermissions command utilizes go-github as a cli tool for // changing GitHub Actions related permission settings for a repository. package main import ( "context" "flag" "fmt" "log" "os" "github.com/google/go-github/v60/github" ) var ( name = flag.String("name", "", "repo to change Actions permissions.") owner = flag.String("owner", "", "owner of targeted repo.") ) func main() { flag.Parse() token := os.Getenv("GITHUB_AUTH_TOKEN") if token == "" { log.Fatal("Unauthorized: No token present") } if *name == "" { log.Fatal("No name: repo name must be given") } if *owner == "" { log.Fatal("No owner: owner of repo must be given") } ctx := context.Background() client := github.NewClient(nil).WithAuthToken(token) actionsPermissionsRepository, _, err := client.Repositories.GetActionsPermissions(ctx, *owner, *name) if err != nil { log.Fatal(err) } fmt.Printf("Current ActionsPermissions %s\n", actionsPermissionsRepository.String()) actionsPermissionsRepository = &github.ActionsPermissionsRepository{Enabled: github.Bool(true), AllowedActions: github.String("selected")} _, _, err = client.Repositories.EditActionsPermissions(ctx, *owner, *name, *actionsPermissionsRepository) if err != nil { log.Fatal(err) } fmt.Printf("Current ActionsPermissions %s\n", actionsPermissionsRepository.String()) actionsAllowed, _, err := client.Repositories.GetActionsAllowed(ctx, *owner, *name) if err != nil { log.Fatal(err) } fmt.Printf("Current ActionsAllowed %s\n", actionsAllowed.String()) actionsAllowed = &github.ActionsAllowed{GithubOwnedAllowed: github.Bool(true), VerifiedAllowed: github.Bool(false), PatternsAllowed: []string{"a/b"}} _, _, err = client.Repositories.EditActionsAllowed(ctx, *owner, *name, *actionsAllowed) if err != nil { log.Fatal(err) } fmt.Printf("Current ActionsAllowed %s\n", actionsAllowed.String()) actionsPermissionsRepository = &github.ActionsPermissionsRepository{Enabled: github.Bool(true), AllowedActions: github.String("all")} _, _, err = client.Repositories.EditActionsPermissions(ctx, *owner, *name, *actionsPermissionsRepository) if err != nil { log.Fatal(err) } fmt.Printf("Current ActionsPermissions %s\n", actionsPermissionsRepository.String()) } go-github-60.0.0/example/appengine/000077500000000000000000000000001457013574700171005ustar00rootroot00000000000000go-github-60.0.0/example/appengine/app.go000066400000000000000000000020431457013574700202060ustar00rootroot00000000000000// 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/v60/github" "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) client := github.NewClient(nil).WithAuthToken(os.Getenv("GITHUB_AUTH_TOKEN")) 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-60.0.0/example/appengine/app.yaml000066400000000000000000000004511457013574700205440ustar00rootroot00000000000000# 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-60.0.0/example/basicauth/000077500000000000000000000000001457013574700170755ustar00rootroot00000000000000go-github-60.0.0/example/basicauth/main.go000066400000000000000000000033711457013574700203540ustar00rootroot00000000000000// 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" "github.com/google/go-github/v60/github" "golang.org/x/term" ) func main() { r := bufio.NewReader(os.Stdin) fmt.Print("GitHub Username: ") username, _ := r.ReadString('\n') fmt.Print("GitHub Password: ") bytePassword, _ := term.ReadPassword(int(os.Stdin.Fd())) 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-60.0.0/example/codespaces/000077500000000000000000000000001457013574700172435ustar00rootroot00000000000000go-github-60.0.0/example/codespaces/newreposecretwithxcrypto/000077500000000000000000000000001457013574700244555ustar00rootroot00000000000000go-github-60.0.0/example/codespaces/newreposecretwithxcrypto/main.go000066400000000000000000000131051457013574700257300ustar00rootroot00000000000000// Copyright 2023 The go-github 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/v60/github" "golang.org/x/crypto/nacl/box" ) 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 := context.Background() client := github.NewClient(nil).WithAuthToken(token) 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 } // addRepoSecret will add a secret to a GitHub repo for use in GitHub Codespaces. // // 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. // // Sixth, 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.Codespaces.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.Codespaces.GetRepoPublicKey(ctx, owner, repo) if err != nil { return err } encryptedSecret, err := encryptSecretWithPublicKey(publicKey, secretName, secretValue) if err != nil { return err } if _, err := client.Codespaces.CreateOrUpdateRepoSecret(ctx, owner, repo, encryptedSecret); err != nil { return fmt.Errorf("Codespaces.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-60.0.0/example/codespaces/newusersecretwithxcrypto/000077500000000000000000000000001457013574700244665ustar00rootroot00000000000000go-github-60.0.0/example/codespaces/newusersecretwithxcrypto/main.go000066400000000000000000000134771457013574700257550ustar00rootroot00000000000000// Copyright 2023 The go-github AUTHORS. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // newusersecretwithxcrypto creates a new secret in GitHub for a given user. // newusersecretwithxcrypto 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. // // newusersecretwithxcrypto takes in one argument for the name of the secret to add, and 2 flags owner, repo. // If owner/repo are defined then it adds the secret to that repository // 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 User > Settings > left side options bar > Codespaces > Secrets. // // Usage: // // export GITHUB_AUTH_TOKEN= // export SECRET_VARIABLE= // go run main.go SECRET_VARIABLE // // Example: // // export GITHUB_AUTH_TOKEN=0000000000000000 // export SECRET_VARIABLE="my-secret" // go run main.go SECRET_VARIABLE package main import ( "context" crypto_rand "crypto/rand" "encoding/base64" "flag" "fmt" "log" "os" "github.com/google/go-github/v60/github" "golang.org/x/crypto/nacl/box" ) 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") } secretName, err := getSecretName() if err != nil { log.Fatal(err) } secretValue, err := getSecretValue(secretName) if err != nil { log.Fatal(err) } ctx := context.Background() client := github.NewClient(nil).WithAuthToken(token) if err := addUserSecret(ctx, client, secretName, secretValue, *owner, *repo); err != nil { log.Fatal(err) } fmt.Printf("Added secret %q to the authenticated user\n", secretName) } 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 } // addUserSecret will add a secret to a GitHub user for use in GitHub Codespaces. // // 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 user. This encryption is done using x/crypto/nacl/box. // // First, the public key of the user 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 user's decoded public key. // // Fifth, the encrypted secret is encoded as a base64 string to be used in a github.EncodedSecret type. // // Sixth, 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. // // Seventh, the github.EncodedSecret is passed into the GitHub client.Codespaces.CreateOrUpdateUserSecret method to // populate the secret in the GitHub user. // // Finally, if a repo and owner are passed in, it adds the repo to the user secret. func addUserSecret(ctx context.Context, client *github.Client, secretName, secretValue, owner, repo string) error { publicKey, _, err := client.Codespaces.GetUserPublicKey(ctx) if err != nil { return err } encryptedSecret, err := encryptSecretWithPublicKey(publicKey, secretName, secretValue) if err != nil { return err } if _, err := client.Codespaces.CreateOrUpdateUserSecret(ctx, encryptedSecret); err != nil { return fmt.Errorf("Codespaces.CreateOrUpdateUserSecret returned error: %v", err) } if owner != "" && repo != "" { r, _, err := client.Repositories.Get(ctx, owner, repo) if err != nil { return fmt.Errorf("Repositories.Get returned error: %v", err) } _, err = client.Codespaces.AddSelectedRepoToUserSecret(ctx, encryptedSecret.Name, r) if err != nil { return fmt.Errorf("Codespaces.AddSelectedRepoToUserSecret returned error: %v", err) } fmt.Printf("Added secret %q to %v/%v\n", secretName, owner, repo) } 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-60.0.0/example/commitpr/000077500000000000000000000000001457013574700167645ustar00rootroot00000000000000go-github-60.0.0/example/commitpr/main.go000066400000000000000000000220071457013574700202400ustar00rootroot00000000000000// 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 ( "bytes" "context" "errors" "flag" "fmt" "io" "log" "os" "strings" "time" "github.com/ProtonMail/go-crypto/openpgp" "github.com/google/go-github/v60/github" ) 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") repoBranch = flag.String("repo-branch", "", "Name of the repository where the changes in the pull request were made. This field is required for cross-repository pull requests if both repositories are owned by the same organization") 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.") privateKey = flag.String("private-key", "", "Path to the private key to use to sign 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 = os.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: &github.Timestamp{Time: date}, Name: authorName, Email: authorEmail} commit := &github.Commit{Author: author, Message: commitMessage, Tree: tree, Parents: []*github.Commit{parent.Commit}} opts := github.CreateCommitOptions{} if *privateKey != "" { armoredBlock, e := os.ReadFile(*privateKey) if e != nil { return e } keyring, e := openpgp.ReadArmoredKeyRing(bytes.NewReader(armoredBlock)) if e != nil { return e } if len(keyring) != 1 { return errors.New("expected exactly one key in the keyring") } key := keyring[0] opts.Signer = github.MessageSignerFunc(func(w io.Writer, r io.Reader) error { return openpgp.ArmoredDetachSign(w, key, r, nil) }) } newCommit, _, err := client.Git.CreateCommit(ctx, *sourceOwner, *sourceRepo, commit, &opts) 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, HeadRepo: repoBranch, 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`") } client = github.NewClient(nil).WithAuthToken(token) 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-60.0.0/example/go.mod000066400000000000000000000015231457013574700162410ustar00rootroot00000000000000module github.com/google/go-github/v60/example go 1.21 require ( github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 github.com/bradleyfalzon/ghinstallation/v2 v2.0.4 github.com/gofri/go-github-ratelimit v1.0.3 github.com/google/go-github/v60 v60.0.0 golang.org/x/crypto v0.17.0 golang.org/x/term v0.15.0 google.golang.org/appengine v1.6.7 ) require ( github.com/cloudflare/circl v1.3.7 // indirect github.com/golang-jwt/jwt/v4 v4.0.0 // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/google/go-github/v41 v41.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/sys v0.15.0 // indirect google.golang.org/protobuf v1.28.0 // indirect ) // Use version at HEAD, not the latest published. replace github.com/google/go-github/v60 => ../ go-github-60.0.0/example/go.sum000066400000000000000000000173241457013574700162740ustar00rootroot00000000000000github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/bradleyfalzon/ghinstallation/v2 v2.0.4 h1:tXKVfhE7FcSkhkv0UwkLvPDeZ4kz6OXd0PKPlFqf81M= github.com/bradleyfalzon/ghinstallation/v2 v2.0.4/go.mod h1:B40qPqJxWE0jDZgOR1JmaMy+4AY1eBP+IByOvqyAKp0= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/gofri/go-github-ratelimit v1.0.3 h1:Ocs2jaYokZDzgvqaajX+g04dqFyVqL0JQzoO7d2wmlk= github.com/gofri/go-github-ratelimit v1.0.3/go.mod h1:OnCi5gV+hAG/LMR7llGhU7yHt44se9sYgKPnafoL7RY= github.com/golang-jwt/jwt/v4 v4.0.0 h1:RAqyYixv1p7uEnocuy8P1nru5wprCh/MH2BIlW5z5/o= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= 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.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/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-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v41 v41.0.0 h1:HseJrM2JFf2vfiZJ8anY2hqBjdfY1Vlj/K27ueww4gg= github.com/google/go-github/v41 v41.0.0/go.mod h1:XgmCA5H323A9rtgExdTcnDkcqp6S30AVACCBDOonIxg= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.3.0/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.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= go-github-60.0.0/example/listenvironments/000077500000000000000000000000001457013574700205555ustar00rootroot00000000000000go-github-60.0.0/example/listenvironments/main.go000066400000000000000000000025251457013574700220340ustar00rootroot00000000000000// Copyright 2022 The go-github AUTHORS. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // listenvironments is an example of how to use ListEnvironments method with EnvironmentListOptions. // It's runnable with the following command: // // export GITHUB_TOKEN=your_token // export GITHUB_REPOSITORY_OWNER=your_owner // export GITHUB_REPOSITORY_NAME=your_repo // go run . package main import ( "context" "fmt" "log" "os" "github.com/google/go-github/v60/github" ) func main() { token := os.Getenv("GITHUB_AUTH_TOKEN") repo := os.Getenv("GITHUB_REPOSITORY_NAME") owner := os.Getenv("GITHUB_REPOSITORY_OWNER") if token == "" { log.Fatal("Unauthorized: No token present") } ctx := context.Background() client := github.NewClient(nil).WithAuthToken(token) expectedPageSize := 2 opts := &github.EnvironmentListOptions{ListOptions: github.ListOptions{PerPage: expectedPageSize}} envResponse, _, err := client.Repositories.ListEnvironments(ctx, owner, repo, opts) if err != nil { log.Fatal(err) } if len(envResponse.Environments) != expectedPageSize { log.Fatal("Unexpected number of environments returned") } // The number of environments here should be equal to expectedPageSize fmt.Printf("%d environments returned\n", len(envResponse.Environments)) } go-github-60.0.0/example/migrations/000077500000000000000000000000001457013574700173065ustar00rootroot00000000000000go-github-60.0.0/example/migrations/main.go000066400000000000000000000015741457013574700205700ustar00rootroot00000000000000// 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/v60/github" ) func fetchAllUserMigrations() ([]*github.UserMigration, error) { ctx := context.Background() client := github.NewClient(nil).WithAuthToken("") migrations, _, err := client.Migrations.ListUserMigrations(ctx, &github.ListOptions{Page: 1}) 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-60.0.0/example/newfilewithappauth/000077500000000000000000000000001457013574700210425ustar00rootroot00000000000000go-github-60.0.0/example/newfilewithappauth/main.go000066400000000000000000000044121457013574700223160ustar00rootroot00000000000000// 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. // newfilewithappauth demonstrates the functionality of GitHub's app authentication // methods by fetching an installation access token and reauthenticating to GitHub // with OAuth configurations. package main import ( "context" "log" "net/http" "os" "time" "github.com/bradleyfalzon/ghinstallation/v2" "github.com/google/go-github/v60/github" ) func main() { const gitHost = "https://git.api.com" privatePem, err := os.ReadFile("path/to/pem") if err != nil { log.Fatalf("failed to read pem: %v", err) } itr, err := ghinstallation.NewAppsTransport(http.DefaultTransport, 10, privatePem) if err != nil { log.Fatalf("failed to create app transport: %v\n", err) } itr.BaseURL = gitHost //create git client with app transport client, err := github.NewClient( &http.Client{ Transport: itr, Timeout: time.Second * 30, }, ).WithEnterpriseURLs(gitHost, gitHost) if err != nil { log.Fatalf("failed to create git client for app: %v\n", err) } installations, _, err := client.Apps.ListInstallations(context.Background(), &github.ListOptions{}) if err != nil { log.Fatalf("failed to list installations: %v\n", err) } //capture our installationId for our app //we need this for the access token var installID int64 for _, val := range installations { installID = val.GetID() } token, _, err := client.Apps.CreateInstallationToken( context.Background(), installID, &github.InstallationTokenOptions{}) if err != nil { log.Fatalf("failed to create installation token: %v\n", err) } apiClient, err := github.NewClient(nil).WithAuthToken( token.GetToken(), ).WithEnterpriseURLs(gitHost, gitHost) if err != nil { log.Fatalf("failed to create new git client with token: %v\n", err) } _, resp, err := apiClient.Repositories.CreateFile( context.Background(), "repoOwner", "sample-repo", "example/foo.txt", &github.RepositoryContentFileOptions{ Content: []byte("foo"), Message: github.String("sample commit"), SHA: nil, }) if err != nil { log.Fatalf("failed to create new file: %v\n", err) } log.Printf("file written status code: %v", resp.StatusCode) } go-github-60.0.0/example/newrepo/000077500000000000000000000000001457013574700166115ustar00rootroot00000000000000go-github-60.0.0/example/newrepo/main.go000066400000000000000000000026231457013574700200670ustar00rootroot00000000000000// 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/v60/github" ) 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.") autoInit = flag.Bool("auto-init", false, "Pass true to create an initial commit with empty README.") ) 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() client := github.NewClient(nil).WithAuthToken(token) r := &github.Repository{Name: name, Private: private, Description: description, AutoInit: autoInit} 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-60.0.0/example/newreposecretwithlibsodium/000077500000000000000000000000001457013574700226235ustar00rootroot00000000000000go-github-60.0.0/example/newreposecretwithlibsodium/go.mod000066400000000000000000000005341457013574700237330ustar00rootroot00000000000000module newreposecretwithlibsodium go 1.21 toolchain go1.22.0 require ( github.com/GoKillers/libsodium-go v0.0.0-20171022220152-dd733721c3cb github.com/google/go-github/v60 v60.0.0 ) require github.com/google/go-querystring v1.1.0 // indirect // Use version at HEAD, not the latest published. replace github.com/google/go-github/v60 => ../.. go-github-60.0.0/example/newreposecretwithlibsodium/go.sum000066400000000000000000000014251457013574700237600ustar00rootroot00000000000000github.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/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= go-github-60.0.0/example/newreposecretwithlibsodium/main.go000066400000000000000000000126041457013574700241010ustar00rootroot00000000000000// 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/v60/github" ) 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 := context.Background() client := github.NewClient(nil).WithAuthToken(token) 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 } // 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-60.0.0/example/newreposecretwithxcrypto/000077500000000000000000000000001457013574700223445ustar00rootroot00000000000000go-github-60.0.0/example/newreposecretwithxcrypto/main.go000066400000000000000000000130661457013574700236250ustar00rootroot00000000000000// 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/v60/github" "golang.org/x/crypto/nacl/box" ) 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 := context.Background() client := github.NewClient(nil).WithAuthToken(token) 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 } // addRepoSecret will add a secret to a GitHub repo for use in GitHub Actions. // // 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. // // Sixth, 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-60.0.0/example/ratelimit/000077500000000000000000000000001457013574700171245ustar00rootroot00000000000000go-github-60.0.0/example/ratelimit/main.go000066400000000000000000000020761457013574700204040ustar00rootroot00000000000000// Copyright 2023 The go-github 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 ratelimit command demonstrates using the github_ratelimit.SecondaryRateLimitWaiter. // By using the waiter, the client automatically sleeps and retry requests // when it hits secondary rate limits. package main import ( "context" "fmt" "github.com/gofri/go-github-ratelimit/github_ratelimit" "github.com/google/go-github/v60/github" ) func main() { var username string fmt.Print("Enter GitHub username: ") fmt.Scanf("%s", &username) rateLimiter, err := github_ratelimit.NewRateLimitWaiterClient(nil) if err != nil { fmt.Printf("Error: %v\n", err) return } client := github.NewClient(rateLimiter) // arbitrary usage of the client organizations, _, err := client.Organizations.List(context.Background(), username, nil) 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-60.0.0/example/simple/000077500000000000000000000000001457013574700164235ustar00rootroot00000000000000go-github-60.0.0/example/simple/main.go000066400000000000000000000020141457013574700176730ustar00rootroot00000000000000// 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/v60/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-60.0.0/example/tagprotection/000077500000000000000000000000001457013574700200145ustar00rootroot00000000000000go-github-60.0.0/example/tagprotection/main.go000066400000000000000000000036441457013574700212760ustar00rootroot00000000000000// Copyright 2022 The go-github 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 tagprotection command demonstrates the functionality that // prompts the user for GitHub owner, repo, tag protection pattern and token, // then creates a new tag protection if the user entered a pattern at the prompt. // Otherwise, it will just list all existing tag protections. package main import ( "bufio" "context" "encoding/json" "fmt" "log" "os" "strings" "github.com/google/go-github/v60/github" "golang.org/x/term" ) func main() { // read github owner, repo, token from standard input r := bufio.NewReader(os.Stdin) fmt.Print("GitHub Org/User name: ") owner, _ := r.ReadString('\n') owner = strings.TrimSpace(owner) fmt.Print("GitHub repo name: ") repo, _ := r.ReadString('\n') repo = strings.TrimSpace(repo) fmt.Print("Tag pattern(leave blank to not create new tag protection): ") pattern, _ := r.ReadString('\n') pattern = strings.TrimSpace(pattern) fmt.Print("GitHub Token: ") byteToken, _ := term.ReadPassword(int(os.Stdin.Fd())) println() token := string(byteToken) ctx := context.Background() client := github.NewClient(nil).WithAuthToken(token) // create new tag protection if pattern != "" { tagProtection, _, err := client.Repositories.CreateTagProtection(ctx, owner, repo, pattern) if err != nil { log.Fatalf("Error: %v\n", err) } println() fmt.Printf("New tag protection created in github.com/%v/%v\n", owner, repo) tp, _ := json.Marshal(tagProtection) fmt.Println(string(tp)) } // list all tag protection println() fmt.Printf("List all tag protection in github.com/%v/%v\n", owner, repo) tagProtections, _, err := client.Repositories.ListTagProtection(ctx, owner, repo) if err != nil { log.Fatalf("Error: %v\n", err) } results, _ := json.Marshal(tagProtections) fmt.Println(string(results)) } go-github-60.0.0/example/tokenauth/000077500000000000000000000000001457013574700171345ustar00rootroot00000000000000go-github-60.0.0/example/tokenauth/main.go000066400000000000000000000022401457013574700204050ustar00rootroot00000000000000// 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 a Personal Access Token (PAT) to // authenticate with GitHub. // 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" "os" "github.com/google/go-github/v60/github" "golang.org/x/term" ) func main() { fmt.Print("GitHub Token: ") byteToken, _ := term.ReadPassword(int(os.Stdin.Fd())) println() token := string(byteToken) ctx := context.Background() client := github.NewClient(nil).WithAuthToken(token) 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-60.0.0/example/topics/000077500000000000000000000000001457013574700164335ustar00rootroot00000000000000go-github-60.0.0/example/topics/main.go000066400000000000000000000017251457013574700177130ustar00rootroot00000000000000// 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/v60/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-60.0.0/github/000077500000000000000000000000001457013574700147615ustar00rootroot00000000000000go-github-60.0.0/github/actions.go000066400000000000000000000005621457013574700167530ustar00rootroot00000000000000// 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/rest/actions/ type ActionsService service go-github-60.0.0/github/actions_artifacts.go000066400000000000000000000131671457013574700210200ustar00rootroot00000000000000// 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" ) // ArtifactWorkflowRun represents a GitHub artifact's workflow run. // // GitHub API docs: https://docs.github.com/rest/actions/artifacts type ArtifactWorkflowRun struct { ID *int64 `json:"id,omitempty"` RepositoryID *int64 `json:"repository_id,omitempty"` HeadRepositoryID *int64 `json:"head_repository_id,omitempty"` HeadBranch *string `json:"head_branch,omitempty"` HeadSHA *string `json:"head_sha,omitempty"` } // Artifact represents 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/rest/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"` URL *string `json:"url,omitempty"` ArchiveDownloadURL *string `json:"archive_download_url,omitempty"` Expired *bool `json:"expired,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` ExpiresAt *Timestamp `json:"expires_at,omitempty"` WorkflowRun *ArtifactWorkflowRun `json:"workflow_run,omitempty"` } // ArtifactList represents a list of GitHub artifacts. // // GitHub API docs: https://docs.github.com/rest/actions/artifacts#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/rest/actions/artifacts#list-artifacts-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/actions/artifacts 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/rest/actions/artifacts#list-workflow-run-artifacts // //meta:operation GET /repos/{owner}/{repo}/actions/runs/{run_id}/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/rest/actions/artifacts#get-an-artifact // //meta:operation GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id} 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/rest/actions/artifacts#download-an-artifact // //meta:operation GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format} func (s *ActionsService) DownloadArtifact(ctx context.Context, owner, repo string, artifactID int64, maxRedirects int) (*url.URL, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/artifacts/%v/zip", owner, repo, artifactID) resp, err := s.client.roundTripWithOptionalFollowRedirect(ctx, u, maxRedirects) if err != nil { return nil, nil, err } defer resp.Body.Close() 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")) if err != nil { return nil, newResponse(resp), err } return parsedURL, newResponse(resp), nil } // DeleteArtifact deletes a workflow run artifact. // // GitHub API docs: https://docs.github.com/rest/actions/artifacts#delete-an-artifact // //meta:operation DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id} 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-60.0.0/github/actions_artifacts_test.go000066400000000000000000000361761457013574700220640ustar00rootroot00000000000000// 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, 1) 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, 1) 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, 1) return err }) } func TestActionsService_DownloadArtifact_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.DownloadArtifact(ctx, "%", "r", 1, 1) 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, 1) 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, 0) 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, 1) 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), URL: String("u"), ArchiveDownloadURL: String("a"), Expired: Bool(false), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, ExpiresAt: &Timestamp{referenceTime}, WorkflowRun: &ArtifactWorkflowRun{ ID: Int64(1), RepositoryID: Int64(1), HeadRepositoryID: Int64(1), HeadBranch: String("b"), HeadSHA: String("s"), }, } want := `{ "id": 1, "node_id": "nid", "name": "n", "size_in_bytes": 1, "url": "u", "archive_download_url": "a", "expired": false, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "expires_at": ` + referenceTimeStr + `, "workflow_run": { "id": 1, "repository_id": 1, "head_repository_id": 1, "head_branch": "b", "head_sha": "s" } }` 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), URL: String("u"), ArchiveDownloadURL: String("a"), Expired: Bool(false), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, ExpiresAt: &Timestamp{referenceTime}, WorkflowRun: &ArtifactWorkflowRun{ ID: Int64(1), RepositoryID: Int64(1), HeadRepositoryID: Int64(1), HeadBranch: String("b"), HeadSHA: String("s"), }, }, }, } want := `{ "total_count": 1, "artifacts": [{ "id": 1, "node_id": "nid", "name": "n", "size_in_bytes": 1, "url": "u", "archive_download_url": "a", "expired": false, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "expires_at": ` + referenceTimeStr + `, "workflow_run": { "id": 1, "repository_id": 1, "head_repository_id": 1, "head_branch": "b", "head_sha": "s" } }] }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/actions_cache.go000066400000000000000000000246011457013574700200760ustar00rootroot00000000000000// Copyright 2022 The go-github 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" ) // ActionsCache represents a GitHub action cache. // // GitHub API docs: https://docs.github.com/rest/actions/cache#about-the-cache-api type ActionsCache struct { ID *int64 `json:"id,omitempty" url:"-"` Ref *string `json:"ref,omitempty" url:"ref"` Key *string `json:"key,omitempty" url:"key"` Version *string `json:"version,omitempty" url:"-"` LastAccessedAt *Timestamp `json:"last_accessed_at,omitempty" url:"-"` CreatedAt *Timestamp `json:"created_at,omitempty" url:"-"` SizeInBytes *int64 `json:"size_in_bytes,omitempty" url:"-"` } // ActionsCacheList represents a list of GitHub actions Cache. // // GitHub API docs: https://docs.github.com/rest/actions/cache#list-github-actions-caches-for-a-repository type ActionsCacheList struct { TotalCount int `json:"total_count"` ActionsCaches []*ActionsCache `json:"actions_caches,omitempty"` } // ActionsCacheUsage represents a GitHub Actions Cache Usage object. // // GitHub API docs: https://docs.github.com/rest/actions/cache#get-github-actions-cache-usage-for-a-repository type ActionsCacheUsage struct { FullName string `json:"full_name"` ActiveCachesSizeInBytes int64 `json:"active_caches_size_in_bytes"` ActiveCachesCount int `json:"active_caches_count"` } // ActionsCacheUsageList represents a list of repositories with GitHub Actions cache usage for an organization. // // GitHub API docs: https://docs.github.com/rest/actions/cache#get-github-actions-cache-usage-for-a-repository type ActionsCacheUsageList struct { TotalCount int `json:"total_count"` RepoCacheUsage []*ActionsCacheUsage `json:"repository_cache_usages,omitempty"` } // TotalCacheUsage represents total GitHub actions cache usage of an organization or enterprise. // // GitHub API docs: https://docs.github.com/rest/actions/cache#get-github-actions-cache-usage-for-an-enterprise type TotalCacheUsage struct { TotalActiveCachesUsageSizeInBytes int64 `json:"total_active_caches_size_in_bytes"` TotalActiveCachesCount int `json:"total_active_caches_count"` } // ActionsCacheListOptions represents a list of all possible optional Query parameters for ListCaches method. // // GitHub API docs: https://docs.github.com/rest/actions/cache#list-github-actions-caches-for-a-repository type ActionsCacheListOptions struct { ListOptions // The Git reference for the results you want to list. // The ref for a branch can be formatted either as refs/heads/ // or simply . To reference a pull request use refs/pull//merge Ref *string `url:"ref,omitempty"` Key *string `url:"key,omitempty"` // Can be one of: "created_at", "last_accessed_at", "size_in_bytes". Default: "last_accessed_at" Sort *string `url:"sort,omitempty"` // Can be one of: "asc", "desc" Default: desc Direction *string `url:"direction,omitempty"` } // ListCaches lists the GitHub Actions caches for a repository. // You must authenticate using an access token with the repo scope to use this endpoint. // // Permissions: must have the actions:read permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/actions/cache#list-github-actions-caches-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/actions/caches func (s *ActionsService) ListCaches(ctx context.Context, owner, repo string, opts *ActionsCacheListOptions) (*ActionsCacheList, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/caches", 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 } actionCacheList := new(ActionsCacheList) resp, err := s.client.Do(ctx, req, actionCacheList) if err != nil { return nil, resp, err } return actionCacheList, resp, nil } // DeleteCachesByKey deletes one or more GitHub Actions caches for a repository, using a complete cache key. // By default, all caches that match the provided key are deleted, but you can optionally provide // a Git ref to restrict deletions to caches that match both the provided key and the Git ref. // The ref for a branch can be formatted either as "refs/heads/" or simply "". // To reference a pull request use "refs/pull//merge". If you don't want to use ref just pass nil in parameter. // // Permissions: You must authenticate using an access token with the repo scope to use this endpoint. GitHub Apps must have the actions:write permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/actions/cache#delete-github-actions-caches-for-a-repository-using-a-cache-key // //meta:operation DELETE /repos/{owner}/{repo}/actions/caches func (s *ActionsService) DeleteCachesByKey(ctx context.Context, owner, repo, key string, ref *string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/caches", owner, repo) u, err := addOptions(u, ActionsCache{Key: &key, Ref: ref}) if err != nil { return nil, err } req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DeleteCachesByID deletes a GitHub Actions cache for a repository, using a cache ID. // // Permissions: You must authenticate using an access token with the repo scope to use this endpoint. GitHub Apps must have the actions:write permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/actions/cache#delete-a-github-actions-cache-for-a-repository-using-a-cache-id // //meta:operation DELETE /repos/{owner}/{repo}/actions/caches/{cache_id} func (s *ActionsService) DeleteCachesByID(ctx context.Context, owner, repo string, cacheID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/caches/%v", owner, repo, cacheID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // GetCacheUsageForRepo gets GitHub Actions cache usage for a repository. The data fetched using this API is refreshed approximately every 5 minutes, // so values returned from this endpoint may take at least 5 minutes to get updated. // // Permissions: Anyone with read access to the repository can use this endpoint. If the repository is private, you must use an // access token with the repo scope. GitHub Apps must have the actions:read permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/actions/cache#get-github-actions-cache-usage-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/actions/cache/usage func (s *ActionsService) GetCacheUsageForRepo(ctx context.Context, owner, repo string) (*ActionsCacheUsage, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/cache/usage", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } cacheUsage := new(ActionsCacheUsage) res, err := s.client.Do(ctx, req, cacheUsage) if err != nil { return nil, res, err } return cacheUsage, res, err } // ListCacheUsageByRepoForOrg lists repositories and their GitHub Actions cache usage for an organization. The data fetched using this API is // refreshed approximately every 5 minutes, so values returned from this endpoint may take at least 5 minutes to get updated. // // Permissions: You must authenticate using an access token with the read:org scope to use this endpoint. // GitHub Apps must have the organization_admistration:read permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/actions/cache#list-repositories-with-github-actions-cache-usage-for-an-organization // //meta:operation GET /orgs/{org}/actions/cache/usage-by-repository func (s *ActionsService) ListCacheUsageByRepoForOrg(ctx context.Context, org string, opts *ListOptions) (*ActionsCacheUsageList, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/cache/usage-by-repository", 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 } cacheUsage := new(ActionsCacheUsageList) res, err := s.client.Do(ctx, req, cacheUsage) if err != nil { return nil, res, err } return cacheUsage, res, err } // GetTotalCacheUsageForOrg gets the total GitHub Actions cache usage for an organization. The data fetched using this API is refreshed approximately every // 5 minutes, so values returned from this endpoint may take at least 5 minutes to get updated. // // Permissions: You must authenticate using an access token with the read:org scope to use this endpoint. // GitHub Apps must have the organization_admistration:read permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/actions/cache#get-github-actions-cache-usage-for-an-organization // //meta:operation GET /orgs/{org}/actions/cache/usage func (s *ActionsService) GetTotalCacheUsageForOrg(ctx context.Context, org string) (*TotalCacheUsage, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/cache/usage", org) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } cacheUsage := new(TotalCacheUsage) res, err := s.client.Do(ctx, req, cacheUsage) if err != nil { return nil, res, err } return cacheUsage, res, err } // GetTotalCacheUsageForEnterprise gets the total GitHub Actions cache usage for an enterprise. The data fetched using this API is refreshed approximately every 5 minutes, // so values returned from this endpoint may take at least 5 minutes to get updated. // // Permissions: You must authenticate using an access token with the "admin:enterprise" scope to use this endpoint. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/cache#get-github-actions-cache-usage-for-an-enterprise // //meta:operation GET /enterprises/{enterprise}/actions/cache/usage func (s *ActionsService) GetTotalCacheUsageForEnterprise(ctx context.Context, enterprise string) (*TotalCacheUsage, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/cache/usage", enterprise) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } cacheUsage := new(TotalCacheUsage) res, err := s.client.Do(ctx, req, cacheUsage) if err != nil { return nil, res, err } return cacheUsage, res, err } go-github-60.0.0/github/actions_cache_test.go000066400000000000000000000446101457013574700211370ustar00rootroot00000000000000// Copyright 2022 The go-github 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_ListCaches(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/caches", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprint(w, `{ "total_count":1, "actions_caches":[{"id":1}] }`, ) }) opts := &ActionsCacheListOptions{ListOptions: ListOptions{Page: 2}} ctx := context.Background() cacheList, _, err := client.Actions.ListCaches(ctx, "o", "r", opts) if err != nil { t.Errorf("Actions.ListCaches returned error: %v", err) } want := &ActionsCacheList{TotalCount: 1, ActionsCaches: []*ActionsCache{{ID: Int64(1)}}} if !cmp.Equal(cacheList, want) { t.Errorf("Actions.ListCaches returned %+v, want %+v", cacheList, want) } const methodName = "ListCaches" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListCaches(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListCaches(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_ListCaches_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.ListCaches(ctx, "%", "r", nil) testURLParseError(t, err) } func TestActionsService_ListCaches_invalidRepo(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.ListCaches(ctx, "o", "%", nil) testURLParseError(t, err) } func TestActionsService_ListCaches_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/caches", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() caches, resp, err := client.Actions.ListCaches(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.ListCaches return status %d, want %d", got, want) } if caches != nil { t.Errorf("Actions.ListCaches return %+v, want nil", caches) } } func TestActionsService_DeleteCachesByKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/caches", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testFormValues(t, r, values{"key": "1", "ref": "main"}) }) ctx := context.Background() _, err := client.Actions.DeleteCachesByKey(ctx, "o", "r", "1", String("main")) if err != nil { t.Errorf("Actions.DeleteCachesByKey return error: %v", err) } const methodName = "DeleteCachesByKey" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.DeleteCachesByKey(ctx, "\n", "\n", "\n", String("\n")) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.DeleteCachesByKey(ctx, "o", "r", "1", String("main")) }) } func TestActionsService_DeleteCachesByKey_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Actions.DeleteCachesByKey(ctx, "%", "r", "1", String("main")) testURLParseError(t, err) } func TestActionsService_DeleteCachesByKey_invalidRepo(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Actions.DeleteCachesByKey(ctx, "o", "%", "1", String("main")) testURLParseError(t, err) } func TestActionsService_DeleteCachesByKey_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.DeleteCachesByKey(ctx, "o", "r", "1", String("main")) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Actions.DeleteCachesByKey return status %d, want %d", got, want) } } func TestActionsService_DeleteCachesByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/caches/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Actions.DeleteCachesByID(ctx, "o", "r", 1) if err != nil { t.Errorf("Actions.DeleteCachesByID return error: %v", err) } const methodName = "DeleteCachesByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.DeleteCachesByID(ctx, "\n", "\n", 0) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.DeleteCachesByID(ctx, "o", "r", 1) }) } func TestActionsService_DeleteCachesByID_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Actions.DeleteCachesByID(ctx, "%", "r", 1) testURLParseError(t, err) } func TestActionsService_DeleteCachesByID_invalidRepo(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Actions.DeleteCachesByID(ctx, "o", "%", 1) testURLParseError(t, err) } func TestActionsService_DeleteCachesByID_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("repos/o/r/actions/caches/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() resp, err := client.Actions.DeleteCachesByID(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.DeleteCachesByID return status %d, want %d", got, want) } } func TestActionsService_GetCacheUsageForRepo(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/cache/usage", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "full_name":"test-cache", "active_caches_size_in_bytes":1000, "active_caches_count":1 }`, ) }) ctx := context.Background() cacheUse, _, err := client.Actions.GetCacheUsageForRepo(ctx, "o", "r") if err != nil { t.Errorf("Actions.GetCacheUsageForRepo returned error: %v", err) } want := &ActionsCacheUsage{FullName: "test-cache", ActiveCachesSizeInBytes: 1000, ActiveCachesCount: 1} if !cmp.Equal(cacheUse, want) { t.Errorf("Actions.GetCacheUsageForRepo returned %+v, want %+v", cacheUse, want) } const methodName = "GetCacheUsageForRepo" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetCacheUsageForRepo(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetCacheUsageForRepo(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetCacheUsageForRepo_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.GetCacheUsageForRepo(ctx, "%", "r") testURLParseError(t, err) } func TestActionsService_GetCacheUsageForRepo_invalidRepo(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.GetCacheUsageForRepo(ctx, "o", "%") testURLParseError(t, err) } func TestActionsService_GetCacheUsageForRepo_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/cache/usage", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() caches, resp, err := client.Actions.GetCacheUsageForRepo(ctx, "o", "r") if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Actions.GetCacheUsageForRepo return status %d, want %d", got, want) } if caches != nil { t.Errorf("Actions.GetCacheUsageForRepo return %+v, want nil", caches) } } func TestActionsService_ListCacheUsageByRepoForOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/cache/usage-by-repository", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2", "per_page": "1"}) fmt.Fprint(w, `{ "total_count":1, "repository_cache_usages":[{"full_name":"test-cache","active_caches_size_in_bytes":1000,"active_caches_count":1}] }`, ) }) opts := &ListOptions{PerPage: 1, Page: 2} ctx := context.Background() cacheList, _, err := client.Actions.ListCacheUsageByRepoForOrg(ctx, "o", opts) if err != nil { t.Errorf("Actions.ListCacheUsageByRepoForOrg returned error: %v", err) } want := &ActionsCacheUsageList{TotalCount: 1, RepoCacheUsage: []*ActionsCacheUsage{{FullName: "test-cache", ActiveCachesSizeInBytes: 1000, ActiveCachesCount: 1}}} if !cmp.Equal(cacheList, want) { t.Errorf("Actions.ListCacheUsageByRepoForOrg returned %+v, want %+v", cacheList, want) } const methodName = "ListCacheUsageByRepoForOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListCacheUsageByRepoForOrg(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListCacheUsageByRepoForOrg(ctx, "o", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_ListCacheUsageByRepoForOrg_invalidOrganization(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.ListCacheUsageByRepoForOrg(ctx, "%", nil) testURLParseError(t, err) } func TestActionsService_ListCacheUsageByRepoForOrg_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/cache/usage-by-repository", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() caches, resp, err := client.Actions.ListCacheUsageByRepoForOrg(ctx, "o", nil) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Actions.ListCacheUsageByRepoForOrg return status %d, want %d", got, want) } if caches != nil { t.Errorf("Actions.ListCacheUsageByRepoForOrg return %+v, want nil", caches) } } func TestActionsService_GetCacheUsageForOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/cache/usage", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "total_active_caches_size_in_bytes":1000, "total_active_caches_count":1 }`, ) }) ctx := context.Background() cache, _, err := client.Actions.GetTotalCacheUsageForOrg(ctx, "o") if err != nil { t.Errorf("Actions.GetTotalCacheUsageForOrg returned error: %v", err) } want := &TotalCacheUsage{TotalActiveCachesUsageSizeInBytes: 1000, TotalActiveCachesCount: 1} if !cmp.Equal(cache, want) { t.Errorf("Actions.GetTotalCacheUsageForOrg returned %+v, want %+v", cache, want) } const methodName = "GetTotalCacheUsageForOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetTotalCacheUsageForOrg(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetTotalCacheUsageForOrg(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetCacheUsageForOrg_invalidOrganization(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.GetTotalCacheUsageForOrg(ctx, "%") testURLParseError(t, err) } func TestActionsService_GetCacheUsageForOrg_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/cache/usage", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() caches, resp, err := client.Actions.GetTotalCacheUsageForOrg(ctx, "o") if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Actions.GetTotalCacheUsageForOrg return status %d, want %d", got, want) } if caches != nil { t.Errorf("Actions.GetTotalCacheUsageForOrg return %+v, want nil", caches) } } func TestActionsService_GetCacheUsageForEnterprise(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/e/actions/cache/usage", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "total_active_caches_size_in_bytes":1000, "total_active_caches_count":1 }`, ) }) ctx := context.Background() cache, _, err := client.Actions.GetTotalCacheUsageForEnterprise(ctx, "e") if err != nil { t.Errorf("Actions.GetTotalCacheUsageForEnterprise returned error: %v", err) } want := &TotalCacheUsage{TotalActiveCachesUsageSizeInBytes: 1000, TotalActiveCachesCount: 1} if !cmp.Equal(cache, want) { t.Errorf("Actions.GetTotalCacheUsageForEnterprise returned %+v, want %+v", cache, want) } const methodName = "GetTotalCacheUsageForEnterprise" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetTotalCacheUsageForEnterprise(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetTotalCacheUsageForEnterprise(ctx, "e") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetCacheUsageForEnterprise_invalidEnterprise(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Actions.GetTotalCacheUsageForEnterprise(ctx, "%") testURLParseError(t, err) } func TestActionsService_GetCacheUsageForEnterprise_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/e/actions/cache/usage", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() caches, resp, err := client.Actions.GetTotalCacheUsageForEnterprise(ctx, "o") if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Actions.GetTotalCacheUsageForEnterprise return status %d, want %d", got, want) } if caches != nil { t.Errorf("Actions.GetTotalCacheUsageForEnterprise return %+v, want nil", caches) } } func TestActionsCache_Marshal(t *testing.T) { testJSONMarshal(t, &ActionsCache{}, "{}") u := &ActionsCache{ ID: Int64(1), Ref: String("refAction"), Key: String("key1"), Version: String("alpha"), LastAccessedAt: &Timestamp{referenceTime}, CreatedAt: &Timestamp{referenceTime}, SizeInBytes: Int64(1), } want := `{ "id": 1, "ref": "refAction", "key": "key1", "version": "alpha", "last_accessed_at": ` + referenceTimeStr + `, "created_at": ` + referenceTimeStr + `, "size_in_bytes": 1 }` testJSONMarshal(t, u, want) } func TestActionsCacheList_Marshal(t *testing.T) { testJSONMarshal(t, &ActionsCacheList{}, "{}") u := &ActionsCacheList{ TotalCount: 2, ActionsCaches: []*ActionsCache{ { ID: Int64(1), Key: String("key1"), Version: String("alpha"), LastAccessedAt: &Timestamp{referenceTime}, CreatedAt: &Timestamp{referenceTime}, SizeInBytes: Int64(1), }, { ID: Int64(2), Ref: String("refAction"), LastAccessedAt: &Timestamp{referenceTime}, CreatedAt: &Timestamp{referenceTime}, SizeInBytes: Int64(1), }, }, } want := `{ "total_count": 2, "actions_caches": [{ "id": 1, "key": "key1", "version": "alpha", "last_accessed_at": ` + referenceTimeStr + `, "created_at": ` + referenceTimeStr + `, "size_in_bytes": 1 }, { "id": 2, "ref": "refAction", "last_accessed_at": ` + referenceTimeStr + `, "created_at": ` + referenceTimeStr + `, "size_in_bytes": 1 }] }` testJSONMarshal(t, u, want) } func TestActionsCacheUsage_Marshal(t *testing.T) { testJSONMarshal(t, &ActionsCacheUsage{}, "{}") u := &ActionsCacheUsage{ FullName: "cache_usage1", ActiveCachesSizeInBytes: 2, ActiveCachesCount: 2, } want := `{ "full_name": "cache_usage1", "active_caches_size_in_bytes": 2, "active_caches_count": 2 }` testJSONMarshal(t, u, want) } func TestActionsCacheUsageList_Marshal(t *testing.T) { testJSONMarshal(t, &ActionsCacheUsageList{}, "{}") u := &ActionsCacheUsageList{ TotalCount: 1, RepoCacheUsage: []*ActionsCacheUsage{ { FullName: "cache_usage1", ActiveCachesSizeInBytes: 2, ActiveCachesCount: 2, }, }, } want := `{ "total_count": 1, "repository_cache_usages": [{ "full_name": "cache_usage1", "active_caches_size_in_bytes": 2, "active_caches_count": 2 }] }` testJSONMarshal(t, u, want) } func TestTotalCacheUsage_Marshal(t *testing.T) { testJSONMarshal(t, &TotalCacheUsage{}, "{}") u := &TotalCacheUsage{ TotalActiveCachesUsageSizeInBytes: 2, TotalActiveCachesCount: 2, } want := `{ "total_active_caches_size_in_bytes": 2, "total_active_caches_count": 2 }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/actions_oidc.go000066400000000000000000000067671457013574700177660ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // OIDCSubjectClaimCustomTemplate represents an OIDC subject claim customization template. type OIDCSubjectClaimCustomTemplate struct { UseDefault *bool `json:"use_default,omitempty"` IncludeClaimKeys []string `json:"include_claim_keys,omitempty"` } // GetOrgOIDCSubjectClaimCustomTemplate gets the subject claim customization template for an organization. // // GitHub API docs: https://docs.github.com/rest/actions/oidc#get-the-customization-template-for-an-oidc-subject-claim-for-an-organization // //meta:operation GET /orgs/{org}/actions/oidc/customization/sub func (s *ActionsService) GetOrgOIDCSubjectClaimCustomTemplate(ctx context.Context, org string) (*OIDCSubjectClaimCustomTemplate, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/oidc/customization/sub", org) return s.getOIDCSubjectClaimCustomTemplate(ctx, u) } // GetRepoOIDCSubjectClaimCustomTemplate gets the subject claim customization template for a repository. // // GitHub API docs: https://docs.github.com/rest/actions/oidc#get-the-customization-template-for-an-oidc-subject-claim-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/actions/oidc/customization/sub func (s *ActionsService) GetRepoOIDCSubjectClaimCustomTemplate(ctx context.Context, owner, repo string) (*OIDCSubjectClaimCustomTemplate, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/oidc/customization/sub", owner, repo) return s.getOIDCSubjectClaimCustomTemplate(ctx, u) } func (s *ActionsService) getOIDCSubjectClaimCustomTemplate(ctx context.Context, url string) (*OIDCSubjectClaimCustomTemplate, *Response, error) { req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } tmpl := new(OIDCSubjectClaimCustomTemplate) resp, err := s.client.Do(ctx, req, tmpl) if err != nil { return nil, resp, err } return tmpl, resp, nil } // SetOrgOIDCSubjectClaimCustomTemplate sets the subject claim customization for an organization. // // GitHub API docs: https://docs.github.com/rest/actions/oidc#set-the-customization-template-for-an-oidc-subject-claim-for-an-organization // //meta:operation PUT /orgs/{org}/actions/oidc/customization/sub func (s *ActionsService) SetOrgOIDCSubjectClaimCustomTemplate(ctx context.Context, org string, template *OIDCSubjectClaimCustomTemplate) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/oidc/customization/sub", org) return s.setOIDCSubjectClaimCustomTemplate(ctx, u, template) } // SetRepoOIDCSubjectClaimCustomTemplate sets the subject claim customization for a repository. // // GitHub API docs: https://docs.github.com/rest/actions/oidc#set-the-customization-template-for-an-oidc-subject-claim-for-a-repository // //meta:operation PUT /repos/{owner}/{repo}/actions/oidc/customization/sub func (s *ActionsService) SetRepoOIDCSubjectClaimCustomTemplate(ctx context.Context, owner, repo string, template *OIDCSubjectClaimCustomTemplate) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/oidc/customization/sub", owner, repo) return s.setOIDCSubjectClaimCustomTemplate(ctx, u, template) } func (s *ActionsService) setOIDCSubjectClaimCustomTemplate(ctx context.Context, url string, template *OIDCSubjectClaimCustomTemplate) (*Response, error) { req, err := s.client.NewRequest("PUT", url, template) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/actions_oidc_test.go000066400000000000000000000147201457013574700210110ustar00rootroot00000000000000// Copyright 2023 The go-github 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_GetOrgOIDCSubjectClaimCustomTemplate(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/oidc/customization/sub", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"include_claim_keys":["repo","context"]}`) }) ctx := context.Background() template, _, err := client.Actions.GetOrgOIDCSubjectClaimCustomTemplate(ctx, "o") if err != nil { t.Errorf("Actions.GetOrgOIDCSubjectClaimCustomTemplate returned error: %v", err) } want := &OIDCSubjectClaimCustomTemplate{IncludeClaimKeys: []string{"repo", "context"}} if !cmp.Equal(template, want) { t.Errorf("Actions.GetOrgOIDCSubjectClaimCustomTemplate returned %+v, want %+v", template, want) } const methodName = "GetOrgOIDCSubjectClaimCustomTemplate" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetOrgOIDCSubjectClaimCustomTemplate(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetOrgOIDCSubjectClaimCustomTemplate(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetRepoOIDCSubjectClaimCustomTemplate(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/oidc/customization/sub", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"use_default":false,"include_claim_keys":["repo","context"]}`) }) ctx := context.Background() template, _, err := client.Actions.GetRepoOIDCSubjectClaimCustomTemplate(ctx, "o", "r") if err != nil { t.Errorf("Actions.GetRepoOIDCSubjectClaimCustomTemplate returned error: %v", err) } want := &OIDCSubjectClaimCustomTemplate{UseDefault: Bool(false), IncludeClaimKeys: []string{"repo", "context"}} if !cmp.Equal(template, want) { t.Errorf("Actions.GetOrgOIDCSubjectClaimCustomTemplate returned %+v, want %+v", template, want) } const methodName = "GetRepoOIDCSubjectClaimCustomTemplate" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetRepoOIDCSubjectClaimCustomTemplate(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetRepoOIDCSubjectClaimCustomTemplate(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_SetOrgOIDCSubjectClaimCustomTemplate(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/oidc/customization/sub", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"include_claim_keys":["repo","context"]}`+"\n") w.WriteHeader(http.StatusCreated) }) input := &OIDCSubjectClaimCustomTemplate{ IncludeClaimKeys: []string{"repo", "context"}, } ctx := context.Background() _, err := client.Actions.SetOrgOIDCSubjectClaimCustomTemplate(ctx, "o", input) if err != nil { t.Errorf("Actions.SetOrgOIDCSubjectClaimCustomTemplate returned error: %v", err) } const methodName = "SetOrgOIDCSubjectClaimCustomTemplate" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.SetOrgOIDCSubjectClaimCustomTemplate(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.SetOrgOIDCSubjectClaimCustomTemplate(ctx, "o", input) }) } func TestActionsService_SetRepoOIDCSubjectClaimCustomTemplate(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/oidc/customization/sub", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"use_default":false,"include_claim_keys":["repo","context"]}`+"\n") w.WriteHeader(http.StatusCreated) }) input := &OIDCSubjectClaimCustomTemplate{ UseDefault: Bool(false), IncludeClaimKeys: []string{"repo", "context"}, } ctx := context.Background() _, err := client.Actions.SetRepoOIDCSubjectClaimCustomTemplate(ctx, "o", "r", input) if err != nil { t.Errorf("Actions.SetRepoOIDCSubjectClaimCustomTemplate returned error: %v", err) } const methodName = "SetRepoOIDCSubjectClaimCustomTemplate" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.SetRepoOIDCSubjectClaimCustomTemplate(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.SetRepoOIDCSubjectClaimCustomTemplate(ctx, "o", "r", input) }) } func TestActionService_SetRepoOIDCSubjectClaimCustomTemplateToDefault(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/oidc/customization/sub", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"use_default":true}`+"\n") w.WriteHeader(http.StatusCreated) }) input := &OIDCSubjectClaimCustomTemplate{ UseDefault: Bool(true), } ctx := context.Background() _, err := client.Actions.SetRepoOIDCSubjectClaimCustomTemplate(ctx, "o", "r", input) if err != nil { t.Errorf("Actions.SetRepoOIDCSubjectClaimCustomTemplate returned error: %v", err) } const methodName = "SetRepoOIDCSubjectClaimCustomTemplate" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.SetRepoOIDCSubjectClaimCustomTemplate(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.SetRepoOIDCSubjectClaimCustomTemplate(ctx, "o", "r", input) }) } func TestOIDCSubjectClaimCustomTemplate_Marshal(t *testing.T) { testJSONMarshal(t, &OIDCSubjectClaimCustomTemplate{}, "{}") u := &OIDCSubjectClaimCustomTemplate{ UseDefault: Bool(false), IncludeClaimKeys: []string{"s"}, } want := `{ "use_default": false, "include_claim_keys": [ "s" ] }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/actions_permissions_enterprise.go000066400000000000000000000232761457013574700236550ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // ActionsEnabledOnEnterpriseRepos represents all the repositories in an enterprise for which Actions is enabled. type ActionsEnabledOnEnterpriseRepos struct { TotalCount int `json:"total_count"` Organizations []*Organization `json:"organizations"` } // ActionsPermissionsEnterprise represents a policy for allowed actions in an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions type ActionsPermissionsEnterprise struct { EnabledOrganizations *string `json:"enabled_organizations,omitempty"` AllowedActions *string `json:"allowed_actions,omitempty"` SelectedActionsURL *string `json:"selected_actions_url,omitempty"` } func (a ActionsPermissionsEnterprise) String() string { return Stringify(a) } // DefaultWorkflowPermissionEnterprise represents the default permissions for GitHub Actions workflows for an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions type DefaultWorkflowPermissionEnterprise struct { DefaultWorkflowPermissions *string `json:"default_workflow_permissions,omitempty"` CanApprovePullRequestReviews *bool `json:"can_approve_pull_request_reviews,omitempty"` } // GetActionsPermissionsInEnterprise gets the GitHub Actions permissions policy for an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions#get-github-actions-permissions-for-an-enterprise // //meta:operation GET /enterprises/{enterprise}/actions/permissions func (s *ActionsService) GetActionsPermissionsInEnterprise(ctx context.Context, enterprise string) (*ActionsPermissionsEnterprise, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/permissions", enterprise) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } permissions := new(ActionsPermissionsEnterprise) resp, err := s.client.Do(ctx, req, permissions) if err != nil { return nil, resp, err } return permissions, resp, nil } // EditActionsPermissionsInEnterprise sets the permissions policy in an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions#set-github-actions-permissions-for-an-enterprise // //meta:operation PUT /enterprises/{enterprise}/actions/permissions func (s *ActionsService) EditActionsPermissionsInEnterprise(ctx context.Context, enterprise string, actionsPermissionsEnterprise ActionsPermissionsEnterprise) (*ActionsPermissionsEnterprise, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/permissions", enterprise) req, err := s.client.NewRequest("PUT", u, actionsPermissionsEnterprise) if err != nil { return nil, nil, err } p := new(ActionsPermissionsEnterprise) resp, err := s.client.Do(ctx, req, p) if err != nil { return nil, resp, err } return p, resp, nil } // ListEnabledOrgsInEnterprise lists the selected organizations that are enabled for GitHub Actions in an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions#list-selected-organizations-enabled-for-github-actions-in-an-enterprise // //meta:operation GET /enterprises/{enterprise}/actions/permissions/organizations func (s *ActionsService) ListEnabledOrgsInEnterprise(ctx context.Context, owner string, opts *ListOptions) (*ActionsEnabledOnEnterpriseRepos, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/permissions/organizations", 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 } orgs := &ActionsEnabledOnEnterpriseRepos{} resp, err := s.client.Do(ctx, req, orgs) if err != nil { return nil, resp, err } return orgs, resp, nil } // SetEnabledOrgsInEnterprise replaces the list of selected organizations that are enabled for GitHub Actions in an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions#set-selected-organizations-enabled-for-github-actions-in-an-enterprise // //meta:operation PUT /enterprises/{enterprise}/actions/permissions/organizations func (s *ActionsService) SetEnabledOrgsInEnterprise(ctx context.Context, owner string, organizationIDs []int64) (*Response, error) { u := fmt.Sprintf("enterprises/%v/actions/permissions/organizations", owner) req, err := s.client.NewRequest("PUT", u, struct { IDs []int64 `json:"selected_organization_ids"` }{IDs: organizationIDs}) if err != nil { return nil, err } resp, err := s.client.Do(ctx, req, nil) if err != nil { return resp, err } return resp, nil } // AddEnabledOrgInEnterprise adds an organization to the list of selected organizations that are enabled for GitHub Actions in an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions#enable-a-selected-organization-for-github-actions-in-an-enterprise // //meta:operation PUT /enterprises/{enterprise}/actions/permissions/organizations/{org_id} func (s *ActionsService) AddEnabledOrgInEnterprise(ctx context.Context, owner string, organizationID int64) (*Response, error) { u := fmt.Sprintf("enterprises/%v/actions/permissions/organizations/%v", owner, organizationID) 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 } // RemoveEnabledOrgInEnterprise removes an organization from the list of selected organizations that are enabled for GitHub Actions in an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions#disable-a-selected-organization-for-github-actions-in-an-enterprise // //meta:operation DELETE /enterprises/{enterprise}/actions/permissions/organizations/{org_id} func (s *ActionsService) RemoveEnabledOrgInEnterprise(ctx context.Context, owner string, organizationID int64) (*Response, error) { u := fmt.Sprintf("enterprises/%v/actions/permissions/organizations/%v", owner, organizationID) 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 } // GetActionsAllowedInEnterprise gets the actions that are allowed in an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions#get-allowed-actions-and-reusable-workflows-for-an-enterprise // //meta:operation GET /enterprises/{enterprise}/actions/permissions/selected-actions func (s *ActionsService) GetActionsAllowedInEnterprise(ctx context.Context, enterprise string) (*ActionsAllowed, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/permissions/selected-actions", enterprise) 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 } // EditActionsAllowedInEnterprise sets the actions that are allowed in an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions#set-allowed-actions-and-reusable-workflows-for-an-enterprise // //meta:operation PUT /enterprises/{enterprise}/actions/permissions/selected-actions func (s *ActionsService) EditActionsAllowedInEnterprise(ctx context.Context, enterprise string, actionsAllowed ActionsAllowed) (*ActionsAllowed, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/permissions/selected-actions", enterprise) 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) if err != nil { return nil, resp, err } return p, resp, nil } // GetDefaultWorkflowPermissionsInEnterprise gets the GitHub Actions default workflow permissions for an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions#get-default-workflow-permissions-for-an-enterprise // //meta:operation GET /enterprises/{enterprise}/actions/permissions/workflow func (s *ActionsService) GetDefaultWorkflowPermissionsInEnterprise(ctx context.Context, enterprise string) (*DefaultWorkflowPermissionEnterprise, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/permissions/workflow", enterprise) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } permissions := new(DefaultWorkflowPermissionEnterprise) resp, err := s.client.Do(ctx, req, permissions) if err != nil { return nil, resp, err } return permissions, resp, nil } // EditDefaultWorkflowPermissionsInEnterprise sets the GitHub Actions default workflow permissions for an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/permissions#set-default-workflow-permissions-for-an-enterprise // //meta:operation PUT /enterprises/{enterprise}/actions/permissions/workflow func (s *ActionsService) EditDefaultWorkflowPermissionsInEnterprise(ctx context.Context, enterprise string, permissions DefaultWorkflowPermissionEnterprise) (*DefaultWorkflowPermissionEnterprise, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/permissions/workflow", enterprise) req, err := s.client.NewRequest("PUT", u, permissions) if err != nil { return nil, nil, err } p := new(DefaultWorkflowPermissionEnterprise) resp, err := s.client.Do(ctx, req, p) if err != nil { return nil, resp, err } return p, resp, nil } go-github-60.0.0/github/actions_permissions_enterprise_test.go000066400000000000000000000316121457013574700247050ustar00rootroot00000000000000// Copyright 2023 The go-github 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 TestActionsService_GetActionsPermissionsInEnterprise(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/e/actions/permissions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"enabled_organizations": "all", "allowed_actions": "all"}`) }) ctx := context.Background() ent, _, err := client.Actions.GetActionsPermissionsInEnterprise(ctx, "e") if err != nil { t.Errorf("Actions.GetActionsPermissionsInEnterprise returned error: %v", err) } want := &ActionsPermissionsEnterprise{EnabledOrganizations: String("all"), AllowedActions: String("all")} if !cmp.Equal(ent, want) { t.Errorf("Actions.GetActionsPermissionsInEnterprise returned %+v, want %+v", ent, want) } const methodName = "GetActionsPermissionsInEnterprise" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetActionsPermissionsInEnterprise(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetActionsPermissionsInEnterprise(ctx, "e") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_EditActionsPermissionsInEnterprise(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ActionsPermissionsEnterprise{EnabledOrganizations: String("all"), AllowedActions: String("selected")} mux.HandleFunc("/enterprises/e/actions/permissions", func(w http.ResponseWriter, r *http.Request) { v := new(ActionsPermissionsEnterprise) assertNilError(t, 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_organizations": "all", "allowed_actions": "selected"}`) }) ctx := context.Background() ent, _, err := client.Actions.EditActionsPermissionsInEnterprise(ctx, "e", *input) if err != nil { t.Errorf("Actions.EditActionsPermissionsInEnterprise returned error: %v", err) } want := &ActionsPermissionsEnterprise{EnabledOrganizations: String("all"), AllowedActions: String("selected")} if !cmp.Equal(ent, want) { t.Errorf("Actions.EditActionsPermissionsInEnterprise returned %+v, want %+v", ent, want) } const methodName = "EditActionsPermissionsInEnterprise" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.EditActionsPermissionsInEnterprise(ctx, "\n", *input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.EditActionsPermissionsInEnterprise(ctx, "e", *input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_ListEnabledOrgsInEnterprise(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/e/actions/permissions/organizations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "1", }) fmt.Fprint(w, `{"total_count":2,"organizations":[{"id":2}, {"id":3}]}`) }) ctx := context.Background() opt := &ListOptions{ Page: 1, } got, _, err := client.Actions.ListEnabledOrgsInEnterprise(ctx, "e", opt) if err != nil { t.Errorf("Actions.ListEnabledOrgsInEnterprise returned error: %v", err) } want := &ActionsEnabledOnEnterpriseRepos{TotalCount: int(2), Organizations: []*Organization{ {ID: Int64(2)}, {ID: Int64(3)}, }} if !cmp.Equal(got, want) { t.Errorf("Actions.ListEnabledOrgsInEnterprise returned %+v, want %+v", got, want) } const methodName = "ListEnabledOrgsInEnterprise" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListEnabledOrgsInEnterprise(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListEnabledOrgsInEnterprise(ctx, "e", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_SetEnabledOrgsInEnterprise(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/e/actions/permissions/organizations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"selected_organization_ids":[123,1234]}`+"\n") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Actions.SetEnabledOrgsInEnterprise(ctx, "e", []int64{123, 1234}) if err != nil { t.Errorf("Actions.SetEnabledOrgsInEnterprise returned error: %v", err) } const methodName = "SetEnabledOrgsInEnterprise" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.SetEnabledOrgsInEnterprise(ctx, "\n", []int64{123, 1234}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.SetEnabledOrgsInEnterprise(ctx, "e", []int64{123, 1234}) }) } func TestActionsService_AddEnabledOrgInEnterprise(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/e/actions/permissions/organizations/123", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Actions.AddEnabledOrgInEnterprise(ctx, "e", 123) if err != nil { t.Errorf("Actions.AddEnabledOrgInEnterprise returned error: %v", err) } const methodName = "AddEnabledOrgInEnterprise" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.AddEnabledOrgInEnterprise(ctx, "\n", 123) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.AddEnabledOrgInEnterprise(ctx, "e", 123) }) } func TestActionsService_RemoveEnabledOrgInEnterprise(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/e/actions/permissions/organizations/123", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Actions.RemoveEnabledOrgInEnterprise(ctx, "e", 123) if err != nil { t.Errorf("Actions.RemoveEnabledOrgInEnterprise returned error: %v", err) } const methodName = "RemoveEnabledOrgInEnterprise" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.RemoveEnabledOrgInEnterprise(ctx, "\n", 123) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.RemoveEnabledOrgInEnterprise(ctx, "e", 123) }) } func TestActionsService_GetActionsAllowedInEnterprise(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/e/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() ent, _, err := client.Actions.GetActionsAllowedInEnterprise(ctx, "e") if err != nil { t.Errorf("Actions.GetActionsAllowedInEnterprise returned error: %v", err) } want := &ActionsAllowed{GithubOwnedAllowed: Bool(true), VerifiedAllowed: Bool(false), PatternsAllowed: []string{"a/b"}} if !cmp.Equal(ent, want) { t.Errorf("Actions.GetActionsAllowedInEnterprise returned %+v, want %+v", ent, want) } const methodName = "GetActionsAllowedInEnterprise" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetActionsAllowedInEnterprise(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetActionsAllowedInEnterprise(ctx, "e") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_EditActionsAllowedInEnterprise(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ActionsAllowed{GithubOwnedAllowed: Bool(true), VerifiedAllowed: Bool(false), PatternsAllowed: []string{"a/b"}} mux.HandleFunc("/enterprises/e/actions/permissions/selected-actions", func(w http.ResponseWriter, r *http.Request) { v := new(ActionsAllowed) assertNilError(t, 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() ent, _, err := client.Actions.EditActionsAllowedInEnterprise(ctx, "e", *input) if err != nil { t.Errorf("Actions.EditActionsAllowedInEnterprise returned error: %v", err) } want := &ActionsAllowed{GithubOwnedAllowed: Bool(true), VerifiedAllowed: Bool(false), PatternsAllowed: []string{"a/b"}} if !cmp.Equal(ent, want) { t.Errorf("Actions.EditActionsAllowedInEnterprise returned %+v, want %+v", ent, want) } const methodName = "EditActionsAllowedInEnterprise" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.EditActionsAllowedInEnterprise(ctx, "\n", *input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.EditActionsAllowedInEnterprise(ctx, "e", *input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetDefaultWorkflowPermissionsInEnterprise(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/e/actions/permissions/workflow", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "default_workflow_permissions": "read", "can_approve_pull_request_reviews": true }`) }) ctx := context.Background() ent, _, err := client.Actions.GetDefaultWorkflowPermissionsInEnterprise(ctx, "e") if err != nil { t.Errorf("Actions.GetDefaultWorkflowPermissionsInEnterprise returned error: %v", err) } want := &DefaultWorkflowPermissionEnterprise{DefaultWorkflowPermissions: String("read"), CanApprovePullRequestReviews: Bool(true)} if !cmp.Equal(ent, want) { t.Errorf("Actions.GetDefaultWorkflowPermissionsInEnterprise returned %+v, want %+v", ent, want) } const methodName = "GetDefaultWorkflowPermissionsInEnterprise" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetDefaultWorkflowPermissionsInEnterprise(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetDefaultWorkflowPermissionsInEnterprise(ctx, "e") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_EditDefaultWorkflowPermissionsInEnterprise(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &DefaultWorkflowPermissionEnterprise{DefaultWorkflowPermissions: String("read"), CanApprovePullRequestReviews: Bool(true)} mux.HandleFunc("/enterprises/e/actions/permissions/workflow", func(w http.ResponseWriter, r *http.Request) { v := new(DefaultWorkflowPermissionEnterprise) assertNilError(t, 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, `{ "default_workflow_permissions": "read", "can_approve_pull_request_reviews": true }`) }) ctx := context.Background() ent, _, err := client.Actions.EditDefaultWorkflowPermissionsInEnterprise(ctx, "e", *input) if err != nil { t.Errorf("Actions.EditDefaultWorkflowPermissionsInEnterprise returned error: %v", err) } want := &DefaultWorkflowPermissionEnterprise{DefaultWorkflowPermissions: String("read"), CanApprovePullRequestReviews: Bool(true)} if !cmp.Equal(ent, want) { t.Errorf("Actions.EditDefaultWorkflowPermissionsInEnterprise returned %+v, want %+v", ent, want) } const methodName = "EditDefaultWorkflowPermissionsInEnterprise" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.EditDefaultWorkflowPermissionsInEnterprise(ctx, "\n", *input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.EditDefaultWorkflowPermissionsInEnterprise(ctx, "e", *input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/actions_permissions_orgs.go000066400000000000000000000226121457013574700224400ustar00rootroot00000000000000// Copyright 2023 The go-github 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/rest/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) } // 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"` } // ActionsAllowed represents selected actions that are allowed. // // GitHub API docs: https://docs.github.com/rest/actions/permissions 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) } // DefaultWorkflowPermissionOrganization represents the default permissions for GitHub Actions workflows for an organization. // // GitHub API docs: https://docs.github.com/rest/actions/permissions type DefaultWorkflowPermissionOrganization struct { DefaultWorkflowPermissions *string `json:"default_workflow_permissions,omitempty"` CanApprovePullRequestReviews *bool `json:"can_approve_pull_request_reviews,omitempty"` } // GetActionsPermissions gets the GitHub Actions permissions policy for repositories and allowed actions in an organization. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#get-github-actions-permissions-for-an-organization // //meta:operation GET /orgs/{org}/actions/permissions func (s *ActionsService) 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/rest/actions/permissions#set-github-actions-permissions-for-an-organization // //meta:operation PUT /orgs/{org}/actions/permissions func (s *ActionsService) 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) if err != nil { return nil, resp, err } return p, resp, nil } // ListEnabledReposInOrg lists the selected repositories that are enabled for GitHub Actions in an organization. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#list-selected-repositories-enabled-for-github-actions-in-an-organization // //meta:operation GET /orgs/{org}/actions/permissions/repositories 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/rest/actions/permissions#set-selected-repositories-enabled-for-github-actions-in-an-organization // //meta:operation PUT /orgs/{org}/actions/permissions/repositories 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/rest/actions/permissions#enable-a-selected-repository-for-github-actions-in-an-organization // //meta:operation PUT /orgs/{org}/actions/permissions/repositories/{repository_id} 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 } // RemoveEnabledReposInOrg removes a single repository from the list of enabled repos for GitHub Actions in an organization. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#disable-a-selected-repository-for-github-actions-in-an-organization // //meta:operation DELETE /orgs/{org}/actions/permissions/repositories/{repository_id} func (s *ActionsService) RemoveEnabledReposInOrg(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 } // GetActionsAllowed gets the actions that are allowed in an organization. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#get-allowed-actions-and-reusable-workflows-for-an-organization // //meta:operation GET /orgs/{org}/actions/permissions/selected-actions func (s *ActionsService) 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/rest/actions/permissions#set-allowed-actions-and-reusable-workflows-for-an-organization // //meta:operation PUT /orgs/{org}/actions/permissions/selected-actions func (s *ActionsService) 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) if err != nil { return nil, resp, err } return p, resp, nil } // GetDefaultWorkflowPermissionsInOrganization gets the GitHub Actions default workflow permissions for an organization. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#get-default-workflow-permissions-for-an-organization // //meta:operation GET /orgs/{org}/actions/permissions/workflow func (s *ActionsService) GetDefaultWorkflowPermissionsInOrganization(ctx context.Context, org string) (*DefaultWorkflowPermissionOrganization, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/permissions/workflow", org) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } permissions := new(DefaultWorkflowPermissionOrganization) resp, err := s.client.Do(ctx, req, permissions) if err != nil { return nil, resp, err } return permissions, resp, nil } // EditDefaultWorkflowPermissionsInOrganization sets the GitHub Actions default workflow permissions for an organization. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#set-default-workflow-permissions-for-an-organization // //meta:operation PUT /orgs/{org}/actions/permissions/workflow func (s *ActionsService) EditDefaultWorkflowPermissionsInOrganization(ctx context.Context, org string, permissions DefaultWorkflowPermissionOrganization) (*DefaultWorkflowPermissionOrganization, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/permissions/workflow", org) req, err := s.client.NewRequest("PUT", u, permissions) if err != nil { return nil, nil, err } p := new(DefaultWorkflowPermissionOrganization) resp, err := s.client.Do(ctx, req, p) if err != nil { return nil, resp, err } return p, resp, nil } go-github-60.0.0/github/actions_permissions_orgs_test.go000066400000000000000000000320531457013574700234770ustar00rootroot00000000000000// Copyright 2023 The go-github 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 TestActionsService_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.Actions.GetActionsPermissions(ctx, "o") if err != nil { t.Errorf("Actions.GetActionsPermissions returned error: %v", err) } want := &ActionsPermissions{EnabledRepositories: String("all"), AllowedActions: String("all")} if !cmp.Equal(org, want) { t.Errorf("Actions.GetActionsPermissions returned %+v, want %+v", org, want) } const methodName = "GetActionsPermissions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetActionsPermissions(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetActionsPermissions(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_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) assertNilError(t, 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.Actions.EditActionsPermissions(ctx, "o", *input) if err != nil { t.Errorf("Actions.EditActionsPermissions returned error: %v", err) } want := &ActionsPermissions{EnabledRepositories: String("all"), AllowedActions: String("selected")} if !cmp.Equal(org, want) { t.Errorf("Actions.EditActionsPermissions returned %+v, want %+v", org, want) } const methodName = "EditActionsPermissions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.EditActionsPermissions(ctx, "\n", *input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.EditActionsPermissions(ctx, "o", *input) 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.ListEnabledRepos 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.ListEnabledRepos returned %+v, want %+v", got, want) } const methodName = "ListEnabledRepos" 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.SetEnabledRepos returned error: %v", err) } const methodName = "SetEnabledRepos" 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_RemoveEnabledReposInOrg(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.RemoveEnabledReposInOrg(ctx, "o", 123) if err != nil { t.Errorf("Actions.RemoveEnabledReposInOrg returned error: %v", err) } const methodName = "RemoveEnabledReposInOrg" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.RemoveEnabledReposInOrg(ctx, "\n", 123) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.RemoveEnabledReposInOrg(ctx, "o", 123) }) } func TestActionsService_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.Actions.GetActionsAllowed(ctx, "o") if err != nil { t.Errorf("Actions.GetActionsAllowed returned error: %v", err) } want := &ActionsAllowed{GithubOwnedAllowed: Bool(true), VerifiedAllowed: Bool(false), PatternsAllowed: []string{"a/b"}} if !cmp.Equal(org, want) { t.Errorf("Actions.GetActionsAllowed returned %+v, want %+v", org, want) } const methodName = "GetActionsAllowed" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetActionsAllowed(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetActionsAllowed(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_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) assertNilError(t, 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.Actions.EditActionsAllowed(ctx, "o", *input) if err != nil { t.Errorf("Actions.EditActionsAllowed returned error: %v", err) } want := &ActionsAllowed{GithubOwnedAllowed: Bool(true), VerifiedAllowed: Bool(false), PatternsAllowed: []string{"a/b"}} if !cmp.Equal(org, want) { t.Errorf("Actions.EditActionsAllowed returned %+v, want %+v", org, want) } const methodName = "EditActionsAllowed" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.EditActionsAllowed(ctx, "\n", *input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.EditActionsAllowed(ctx, "o", *input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, 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) } func TestActionsService_GetDefaultWorkflowPermissionsInOrganization(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/permissions/workflow", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "default_workflow_permissions": "read", "can_approve_pull_request_reviews": true }`) }) ctx := context.Background() org, _, err := client.Actions.GetDefaultWorkflowPermissionsInOrganization(ctx, "o") if err != nil { t.Errorf("Actions.GetDefaultWorkflowPermissionsInOrganization returned error: %v", err) } want := &DefaultWorkflowPermissionOrganization{DefaultWorkflowPermissions: String("read"), CanApprovePullRequestReviews: Bool(true)} if !cmp.Equal(org, want) { t.Errorf("Actions.GetDefaultWorkflowPermissionsInOrganization returned %+v, want %+v", org, want) } const methodName = "GetDefaultWorkflowPermissionsInOrganization" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetDefaultWorkflowPermissionsInOrganization(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetDefaultWorkflowPermissionsInOrganization(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_EditDefaultWorkflowPermissionsInOrganization(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &DefaultWorkflowPermissionOrganization{DefaultWorkflowPermissions: String("read"), CanApprovePullRequestReviews: Bool(true)} mux.HandleFunc("/orgs/o/actions/permissions/workflow", func(w http.ResponseWriter, r *http.Request) { v := new(DefaultWorkflowPermissionOrganization) assertNilError(t, 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, `{ "default_workflow_permissions": "read", "can_approve_pull_request_reviews": true }`) }) ctx := context.Background() org, _, err := client.Actions.EditDefaultWorkflowPermissionsInOrganization(ctx, "o", *input) if err != nil { t.Errorf("Actions.EditDefaultWorkflowPermissionsInOrganization returned error: %v", err) } want := &DefaultWorkflowPermissionOrganization{DefaultWorkflowPermissions: String("read"), CanApprovePullRequestReviews: Bool(true)} if !cmp.Equal(org, want) { t.Errorf("Actions.EditDefaultWorkflowPermissionsInOrganization returned %+v, want %+v", org, want) } const methodName = "EditDefaultWorkflowPermissionsInOrganization" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.EditDefaultWorkflowPermissionsInOrganization(ctx, "\n", *input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.EditDefaultWorkflowPermissionsInOrganization(ctx, "o", *input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/actions_required_workflows.go000066400000000000000000000245101457013574700227670ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // OrgRequiredWorkflow represents a required workflow object at the org level. type OrgRequiredWorkflow struct { ID *int64 `json:"id,omitempty"` Name *string `json:"name,omitempty"` Path *string `json:"path,omitempty"` Scope *string `json:"scope,omitempty"` Ref *string `json:"ref,omitempty"` State *string `json:"state,omitempty"` SelectedRepositoriesURL *string `json:"selected_repositories_url,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` Repository *Repository `json:"repository,omitempty"` } // OrgRequiredWorkflows represents the required workflows for the org. type OrgRequiredWorkflows struct { TotalCount *int `json:"total_count,omitempty"` RequiredWorkflows []*OrgRequiredWorkflow `json:"required_workflows,omitempty"` } // CreateUpdateRequiredWorkflowOptions represents the input object used to create or update required workflows. type CreateUpdateRequiredWorkflowOptions struct { WorkflowFilePath *string `json:"workflow_file_path,omitempty"` RepositoryID *int64 `json:"repository_id,omitempty"` Scope *string `json:"scope,omitempty"` SelectedRepositoryIDs *SelectedRepoIDs `json:"selected_repository_ids,omitempty"` } // RequiredWorkflowSelectedRepos represents the repos that a required workflow is applied to. type RequiredWorkflowSelectedRepos struct { TotalCount *int `json:"total_count,omitempty"` Repositories []*Repository `json:"repositories,omitempty"` } // RepoRequiredWorkflow represents a required workflow object at the repo level. type RepoRequiredWorkflow 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"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` BadgeURL *string `json:"badge_url,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` SourceRepository *Repository `json:"source_repository,omitempty"` } // RepoRequiredWorkflows represents the required workflows for a repo. type RepoRequiredWorkflows struct { TotalCount *int `json:"total_count,omitempty"` RequiredWorkflows []*RepoRequiredWorkflow `json:"required_workflows,omitempty"` } // ListOrgRequiredWorkflows lists the RequiredWorkflows for an org. // // GitHub API docs: https://docs.github.com/actions/using-workflows/required-workflows // //meta:operation GET /orgs/{org}/actions/required_workflows func (s *ActionsService) ListOrgRequiredWorkflows(ctx context.Context, org string, opts *ListOptions) (*OrgRequiredWorkflows, *Response, error) { url := fmt.Sprintf("orgs/%v/actions/required_workflows", org) u, err := addOptions(url, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } requiredWorkflows := new(OrgRequiredWorkflows) resp, err := s.client.Do(ctx, req, &requiredWorkflows) if err != nil { return nil, resp, err } return requiredWorkflows, resp, nil } // CreateRequiredWorkflow creates the required workflow in an org. // // GitHub API docs: https://docs.github.com/actions/using-workflows/required-workflows // //meta:operation POST /orgs/{org}/actions/required_workflows func (s *ActionsService) CreateRequiredWorkflow(ctx context.Context, org string, createRequiredWorkflowOptions *CreateUpdateRequiredWorkflowOptions) (*OrgRequiredWorkflow, *Response, error) { url := fmt.Sprintf("orgs/%v/actions/required_workflows", org) req, err := s.client.NewRequest("POST", url, createRequiredWorkflowOptions) if err != nil { return nil, nil, err } orgRequiredWorkflow := new(OrgRequiredWorkflow) resp, err := s.client.Do(ctx, req, orgRequiredWorkflow) if err != nil { return nil, resp, err } return orgRequiredWorkflow, resp, nil } // GetRequiredWorkflowByID get the RequiredWorkflows for an org by its ID. // // GitHub API docs: https://docs.github.com/actions/using-workflows/required-workflows // //meta:operation GET /orgs/{org}/actions/required_workflows/{workflow_id} func (s *ActionsService) GetRequiredWorkflowByID(ctx context.Context, owner string, requiredWorkflowID int64) (*OrgRequiredWorkflow, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/required_workflows/%v", owner, requiredWorkflowID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } requiredWorkflow := new(OrgRequiredWorkflow) resp, err := s.client.Do(ctx, req, &requiredWorkflow) if err != nil { return nil, resp, err } return requiredWorkflow, resp, nil } // UpdateRequiredWorkflow updates a required workflow in an org. // // GitHub API docs: https://docs.github.com/actions/using-workflows/required-workflows // //meta:operation PATCH /orgs/{org}/actions/required_workflows/{workflow_id} func (s *ActionsService) UpdateRequiredWorkflow(ctx context.Context, org string, requiredWorkflowID int64, updateRequiredWorkflowOptions *CreateUpdateRequiredWorkflowOptions) (*OrgRequiredWorkflow, *Response, error) { url := fmt.Sprintf("orgs/%v/actions/required_workflows/%v", org, requiredWorkflowID) req, err := s.client.NewRequest("PATCH", url, updateRequiredWorkflowOptions) if err != nil { return nil, nil, err } orgRequiredWorkflow := new(OrgRequiredWorkflow) resp, err := s.client.Do(ctx, req, orgRequiredWorkflow) if err != nil { return nil, resp, err } return orgRequiredWorkflow, resp, nil } // DeleteRequiredWorkflow deletes a required workflow in an org. // // GitHub API docs: https://docs.github.com/actions/using-workflows/required-workflows // //meta:operation DELETE /orgs/{org}/actions/required_workflows/{workflow_id} func (s *ActionsService) DeleteRequiredWorkflow(ctx context.Context, org string, requiredWorkflowID int64) (*Response, error) { url := fmt.Sprintf("orgs/%v/actions/required_workflows/%v", org, requiredWorkflowID) req, err := s.client.NewRequest("DELETE", url, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListRequiredWorkflowSelectedRepos lists the Repositories selected for a workflow. // // GitHub API docs: https://docs.github.com/actions/using-workflows/required-workflows // //meta:operation GET /orgs/{org}/actions/required_workflows/{workflow_id}/repositories func (s *ActionsService) ListRequiredWorkflowSelectedRepos(ctx context.Context, org string, requiredWorkflowID int64, opts *ListOptions) (*RequiredWorkflowSelectedRepos, *Response, error) { url := fmt.Sprintf("orgs/%v/actions/required_workflows/%v/repositories", org, requiredWorkflowID) u, err := addOptions(url, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } requiredWorkflowRepos := new(RequiredWorkflowSelectedRepos) resp, err := s.client.Do(ctx, req, &requiredWorkflowRepos) if err != nil { return nil, resp, err } return requiredWorkflowRepos, resp, nil } // SetRequiredWorkflowSelectedRepos sets the Repositories selected for a workflow. // // GitHub API docs: https://docs.github.com/actions/using-workflows/required-workflows // //meta:operation PUT /orgs/{org}/actions/required_workflows/{workflow_id}/repositories func (s *ActionsService) SetRequiredWorkflowSelectedRepos(ctx context.Context, org string, requiredWorkflowID int64, ids SelectedRepoIDs) (*Response, error) { type repoIDs struct { SelectedIDs SelectedRepoIDs `json:"selected_repository_ids"` } url := fmt.Sprintf("orgs/%v/actions/required_workflows/%v/repositories", org, requiredWorkflowID) req, err := s.client.NewRequest("PUT", url, repoIDs{SelectedIDs: ids}) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // AddRepoToRequiredWorkflow adds the Repository to a required workflow. // // GitHub API docs: https://docs.github.com/actions/using-workflows/required-workflows // //meta:operation PUT /orgs/{org}/actions/required_workflows/{workflow_id}/repositories/{repository_id} func (s *ActionsService) AddRepoToRequiredWorkflow(ctx context.Context, org string, requiredWorkflowID, repoID int64) (*Response, error) { url := fmt.Sprintf("orgs/%v/actions/required_workflows/%v/repositories/%v", org, requiredWorkflowID, repoID) req, err := s.client.NewRequest("PUT", url, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // RemoveRepoFromRequiredWorkflow removes the Repository from a required workflow. // // GitHub API docs: https://docs.github.com/actions/using-workflows/required-workflows // //meta:operation DELETE /orgs/{org}/actions/required_workflows/{workflow_id}/repositories/{repository_id} func (s *ActionsService) RemoveRepoFromRequiredWorkflow(ctx context.Context, org string, requiredWorkflowID, repoID int64) (*Response, error) { url := fmt.Sprintf("orgs/%v/actions/required_workflows/%v/repositories/%v", org, requiredWorkflowID, repoID) req, err := s.client.NewRequest("DELETE", url, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListRepoRequiredWorkflows lists the RequiredWorkflows for a repo. // // GitHub API docs: https://docs.github.com/actions/using-workflows/required-workflows // //meta:operation GET /repos/{owner}/{repo}/actions/required_workflows func (s *ActionsService) ListRepoRequiredWorkflows(ctx context.Context, owner, repo string, opts *ListOptions) (*RepoRequiredWorkflows, *Response, error) { url := fmt.Sprintf("repos/%v/%v/actions/required_workflows", owner, repo) u, err := addOptions(url, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } requiredWorkflows := new(RepoRequiredWorkflows) resp, err := s.client.Do(ctx, req, &requiredWorkflows) if err != nil { return nil, resp, err } return requiredWorkflows, resp, nil } go-github-60.0.0/github/actions_required_workflows_test.go000066400000000000000000000447101457013574700240320ustar00rootroot00000000000000// Copyright 2023 The go-github 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_ListOrgRequiredWorkflows(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/required_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,"required_workflows": [ { "id": 30433642, "name": "Required CI", "path": ".github/workflows/ci.yml", "scope": "selected", "ref": "refs/head/main", "state": "active", "selected_repositories_url": "https://api.github.com/organizations/org/actions/required_workflows/1/repositories", "created_at": "2020-01-22T19:33:08Z", "updated_at": "2020-01-22T19:33:08Z" }, { "id": 30433643, "name": "Required Linter", "path": ".github/workflows/lint.yml", "scope": "all", "ref": "refs/head/main", "state": "active", "created_at": "2020-01-22T19:33:08Z", "updated_at": "2020-01-22T19:33:08Z" } ] }`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() jobs, _, err := client.Actions.ListOrgRequiredWorkflows(ctx, "o", opts) if err != nil { t.Errorf("Actions.ListOrgRequiredWorkflows returned error: %v", err) } want := &OrgRequiredWorkflows{ TotalCount: Int(4), RequiredWorkflows: []*OrgRequiredWorkflow{ {ID: Int64(30433642), Name: String("Required CI"), Path: String(".github/workflows/ci.yml"), Scope: String("selected"), Ref: String("refs/head/main"), State: String("active"), SelectedRepositoriesURL: String("https://api.github.com/organizations/org/actions/required_workflows/1/repositories"), CreatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}}, {ID: Int64(30433643), Name: String("Required Linter"), Path: String(".github/workflows/lint.yml"), Scope: String("all"), Ref: String("refs/head/main"), State: String("active"), CreatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}}, }, } if !cmp.Equal(jobs, want) { t.Errorf("Actions.ListOrgRequiredWorkflows returned %+v, want %+v", jobs, want) } const methodName = "ListOrgRequiredWorkflows" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListOrgRequiredWorkflows(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListOrgRequiredWorkflows(ctx, "o", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_CreateRequiredWorkflow(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/required_workflows", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"workflow_file_path":".github/workflows/ci.yaml","repository_id":53,"scope":"selected","selected_repository_ids":[32,91]}`+"\n") fmt.Fprint(w, `{ "id": 2, "name": "Required CI", "path": ".github/workflows/ci.yml", "scope": "selected", "ref": "refs/head/main", "state": "active", "selected_repositories_url": "https://api.github.com/orgs/octo-org/actions/required_workflows/2/repositories", "created_at": "2020-01-22T19:33:08Z", "updated_at": "2020-01-22T19:33:08Z", "repository": { "id": 53, "name": "Hello-World", "url": "https://api.github.com/repos/o/Hello-World"}}`) }) input := &CreateUpdateRequiredWorkflowOptions{ WorkflowFilePath: String(".github/workflows/ci.yaml"), RepositoryID: Int64(53), Scope: String("selected"), SelectedRepositoryIDs: &SelectedRepoIDs{32, 91}, } ctx := context.Background() requiredWokflow, _, err := client.Actions.CreateRequiredWorkflow(ctx, "o", input) if err != nil { t.Errorf("Actions.CreateRequiredWorkflow returned error: %v", err) } want := &OrgRequiredWorkflow{ ID: Int64(2), Name: String("Required CI"), Path: String(".github/workflows/ci.yml"), Scope: String("selected"), Ref: String("refs/head/main"), State: String("active"), SelectedRepositoriesURL: String("https://api.github.com/orgs/octo-org/actions/required_workflows/2/repositories"), CreatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, Repository: &Repository{ID: Int64(53), URL: String("https://api.github.com/repos/o/Hello-World"), Name: String("Hello-World")}, } if !cmp.Equal(requiredWokflow, want) { t.Errorf("Actions.CreateRequiredWorkflow returned %+v, want %+v", requiredWokflow, want) } const methodName = "CreateRequiredWorkflow" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.CreateRequiredWorkflow(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.CreateRequiredWorkflow(ctx, "o", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetRequiredWorkflowByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/required_workflows/12345", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "id": 12345, "name": "Required CI", "path": ".github/workflows/ci.yml", "scope": "selected", "ref": "refs/head/main", "state": "active", "selected_repositories_url": "https://api.github.com/orgs/o/actions/required_workflows/12345/repositories", "created_at": "2020-01-22T19:33:08Z", "updated_at": "2020-01-22T19:33:08Z", "repository":{ "id": 1296269, "url": "https://api.github.com/repos/o/Hello-World", "name": "Hello-World" } }`) }) ctx := context.Background() jobs, _, err := client.Actions.GetRequiredWorkflowByID(ctx, "o", 12345) if err != nil { t.Errorf("Actions.GetRequiredWorkflowByID returned error: %v", err) } want := &OrgRequiredWorkflow{ ID: Int64(12345), Name: String("Required CI"), Path: String(".github/workflows/ci.yml"), Scope: String("selected"), Ref: String("refs/head/main"), State: String("active"), SelectedRepositoriesURL: String("https://api.github.com/orgs/o/actions/required_workflows/12345/repositories"), CreatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, Repository: &Repository{ID: Int64(1296269), URL: String("https://api.github.com/repos/o/Hello-World"), Name: String("Hello-World")}, } if !cmp.Equal(jobs, want) { t.Errorf("Actions.GetRequiredWorkflowByID returned %+v, want %+v", jobs, want) } const methodName = "GetRequiredWorkflowByID" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetRequiredWorkflowByID(ctx, "\n", 1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetRequiredWorkflowByID(ctx, "o", 12345) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_UpdateRequiredWorkflow(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/required_workflows/12345", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"workflow_file_path":".github/workflows/ci.yaml","repository_id":53,"scope":"selected","selected_repository_ids":[32,91]}`+"\n") fmt.Fprint(w, `{ "id": 12345, "name": "Required CI", "path": ".github/workflows/ci.yml", "scope": "selected", "ref": "refs/head/main", "state": "active", "selected_repositories_url": "https://api.github.com/orgs/octo-org/actions/required_workflows/12345/repositories", "created_at": "2020-01-22T19:33:08Z", "updated_at": "2020-01-22T19:33:08Z", "repository": { "id": 53, "name": "Hello-World", "url": "https://api.github.com/repos/o/Hello-World"}}`) }) input := &CreateUpdateRequiredWorkflowOptions{ WorkflowFilePath: String(".github/workflows/ci.yaml"), RepositoryID: Int64(53), Scope: String("selected"), SelectedRepositoryIDs: &SelectedRepoIDs{32, 91}, } ctx := context.Background() requiredWokflow, _, err := client.Actions.UpdateRequiredWorkflow(ctx, "o", 12345, input) if err != nil { t.Errorf("Actions.UpdateRequiredWorkflow returned error: %v", err) } want := &OrgRequiredWorkflow{ ID: Int64(12345), Name: String("Required CI"), Path: String(".github/workflows/ci.yml"), Scope: String("selected"), Ref: String("refs/head/main"), State: String("active"), SelectedRepositoriesURL: String("https://api.github.com/orgs/octo-org/actions/required_workflows/12345/repositories"), CreatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, Repository: &Repository{ID: Int64(53), URL: String("https://api.github.com/repos/o/Hello-World"), Name: String("Hello-World")}, } if !cmp.Equal(requiredWokflow, want) { t.Errorf("Actions.UpdateRequiredWorkflow returned %+v, want %+v", requiredWokflow, want) } const methodName = "UpdateRequiredWorkflow" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.UpdateRequiredWorkflow(ctx, "\n", 12345, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.UpdateRequiredWorkflow(ctx, "o", 12345, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_DeleteRequiredWorkflow(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/required_workflows/12345", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Actions.DeleteRequiredWorkflow(ctx, "o", 12345) if err != nil { t.Errorf("Actions.DeleteRequiredWorkflow returned error: %v", err) } const methodName = "DeleteRequiredWorkflow" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.DeleteRequiredWorkflow(ctx, "\n", 12345) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.DeleteRequiredWorkflow(ctx, "o", 12345) }) } func TestActionsService_ListRequiredWorkflowSelectedRepos(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/required_workflows/12345/repositories", 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":1, "repositories": [{ "id": 1296269, "url": "https://api.github.com/repos/o/Hello-World", "name": "Hello-World" }] }`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() jobs, _, err := client.Actions.ListRequiredWorkflowSelectedRepos(ctx, "o", 12345, opts) if err != nil { t.Errorf("Actions.ListRequiredWorkflowSelectedRepositories returned error: %v", err) } want := &RequiredWorkflowSelectedRepos{ TotalCount: Int(1), Repositories: []*Repository{ {ID: Int64(1296269), URL: String("https://api.github.com/repos/o/Hello-World"), Name: String("Hello-World")}, }, } if !cmp.Equal(jobs, want) { t.Errorf("Actions.ListRequiredWorkflowSelectedRepositories returned %+v, want %+v", jobs, want) } const methodName = "ListRequiredWorkflowSelectedRepositories" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListRequiredWorkflowSelectedRepos(ctx, "\n", 12345, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListRequiredWorkflowSelectedRepos(ctx, "o", 12345, opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_SetRequiredWorkflowSelectedRepos(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/required_workflows/12345/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":[32,91]}`+"\n") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Actions.SetRequiredWorkflowSelectedRepos(ctx, "o", 12345, SelectedRepoIDs{32, 91}) if err != nil { t.Errorf("Actions.SetRequiredWorkflowSelectedRepositories returned error: %v", err) } const methodName = "SetRequiredWorkflowSelectedRepositories" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.SetRequiredWorkflowSelectedRepos(ctx, "\n", 12345, SelectedRepoIDs{32, 91}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.SetRequiredWorkflowSelectedRepos(ctx, "o", 12345, SelectedRepoIDs{32, 91}) }) } func TestActionsService_AddRepoToRequiredWorkflow(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/required_workflows/12345/repositories/32", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Actions.AddRepoToRequiredWorkflow(ctx, "o", 12345, 32) if err != nil { t.Errorf("Actions.AddRepoToRequiredWorkflow returned error: %v", err) } const methodName = "AddRepoToRequiredWorkflow" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.AddRepoToRequiredWorkflow(ctx, "\n", 12345, 32) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.AddRepoToRequiredWorkflow(ctx, "o", 12345, 32) }) } func TestActionsService_RemoveRepoFromRequiredWorkflow(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/required_workflows/12345/repositories/32", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Actions.RemoveRepoFromRequiredWorkflow(ctx, "o", 12345, 32) if err != nil { t.Errorf("Actions.RemoveRepoFromRequiredWorkflow returned error: %v", err) } const methodName = "RemoveRepoFromRequiredWorkflow" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.RemoveRepoFromRequiredWorkflow(ctx, "\n", 12345, 32) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.RemoveRepoFromRequiredWorkflow(ctx, "o", 12345, 32) }) } func TestActionsService_ListRepoRequiredWorkflows(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/required_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":1,"required_workflows": [ { "id": 30433642, "node_id": "MDg6V29ya2Zsb3cxNjEzMzU=", "name": "Required CI", "path": ".github/workflows/ci.yml", "state": "active", "created_at": "2020-01-22T19:33:08Z", "updated_at": "2020-01-22T19:33:08Z", "url": "https://api.github.com/repos/o/r/actions/required_workflows/161335", "html_url": "https://github.com/o/r/blob/master/o/hello-world/.github/workflows/required_ci.yaml", "badge_url": "https://github.com/o/r/workflows/required/o/hello-world/.github/workflows/required_ci.yaml/badge.svg", "source_repository":{ "id": 1296269, "url": "https://api.github.com/repos/o/Hello-World", "name": "Hello-World" } } ] }`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() jobs, _, err := client.Actions.ListRepoRequiredWorkflows(ctx, "o", "r", opts) if err != nil { t.Errorf("Actions.ListRepoRequiredWorkflows returned error: %v", err) } want := &RepoRequiredWorkflows{ TotalCount: Int(1), RequiredWorkflows: []*RepoRequiredWorkflow{ {ID: Int64(30433642), NodeID: String("MDg6V29ya2Zsb3cxNjEzMzU="), Name: String("Required CI"), Path: String(".github/workflows/ci.yml"), State: String("active"), CreatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2020, time.January, 22, 19, 33, 8, 0, time.UTC)}, URL: String("https://api.github.com/repos/o/r/actions/required_workflows/161335"), BadgeURL: String("https://github.com/o/r/workflows/required/o/hello-world/.github/workflows/required_ci.yaml/badge.svg"), HTMLURL: String("https://github.com/o/r/blob/master/o/hello-world/.github/workflows/required_ci.yaml"), SourceRepository: &Repository{ID: Int64(1296269), URL: String("https://api.github.com/repos/o/Hello-World"), Name: String("Hello-World")}}, }, } if !cmp.Equal(jobs, want) { t.Errorf("Actions.ListRepoRequiredWorkflows returned %+v, want %+v", jobs, want) } const methodName = "ListRepoRequiredWorkflows" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListRepoRequiredWorkflows(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListRepoRequiredWorkflows(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/actions_runner_groups.go000066400000000000000000000340201457013574700217370ustar00rootroot00000000000000// 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"` RestrictedToWorkflows *bool `json:"restricted_to_workflows,omitempty"` SelectedWorkflows []string `json:"selected_workflows,omitempty"` WorkflowRestrictionsReadOnly *bool `json:"workflow_restrictions_read_only,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"` // If true, the runner group will be restricted to running only the workflows specified in the SelectedWorkflows slice. RestrictedToWorkflows *bool `json:"restricted_to_workflows,omitempty"` // List of workflows the runner group should be allowed to run. This setting will be ignored unless RestrictedToWorkflows is set to true. SelectedWorkflows []string `json:"selected_workflows,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"` RestrictedToWorkflows *bool `json:"restricted_to_workflows,omitempty"` SelectedWorkflows []string `json:"selected_workflows,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"` } // ListOrgRunnerGroupOptions extend ListOptions to have the optional parameters VisibleToRepository. type ListOrgRunnerGroupOptions struct { ListOptions // Only return runner groups that are allowed to be used by this repository. VisibleToRepository string `url:"visible_to_repository,omitempty"` } // ListOrganizationRunnerGroups lists all self-hosted runner groups configured in an organization. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#list-self-hosted-runner-groups-for-an-organization // //meta:operation GET /orgs/{org}/actions/runner-groups func (s *ActionsService) ListOrganizationRunnerGroups(ctx context.Context, org string, opts *ListOrgRunnerGroupOptions) (*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/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#get-a-self-hosted-runner-group-for-an-organization // //meta:operation GET /orgs/{org}/actions/runner-groups/{runner_group_id} 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/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#delete-a-self-hosted-runner-group-from-an-organization // //meta:operation DELETE /orgs/{org}/actions/runner-groups/{runner_group_id} 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/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#create-a-self-hosted-runner-group-for-an-organization // //meta:operation POST /orgs/{org}/actions/runner-groups 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/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#update-a-self-hosted-runner-group-for-an-organization // //meta:operation PATCH /orgs/{org}/actions/runner-groups/{runner_group_id} 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/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#list-repository-access-to-a-self-hosted-runner-group-in-an-organization // //meta:operation GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories func (s *ActionsService) ListRepositoryAccessRunnerGroup(ctx context.Context, org string, groupID int64, opts *ListOptions) (*ListRepositories, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runner-groups/%v/repositories", 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 } 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/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#set-repository-access-for-a-self-hosted-runner-group-in-an-organization // //meta:operation PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories 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/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#add-repository-access-to-a-self-hosted-runner-group-in-an-organization // //meta:operation PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id} 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/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#remove-repository-access-to-a-self-hosted-runner-group-in-an-organization // //meta:operation DELETE /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id} 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/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#list-self-hosted-runners-in-a-group-for-an-organization // //meta:operation GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners 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/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#set-self-hosted-runners-in-a-group-for-an-organization // //meta:operation PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/runners 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/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#add-a-self-hosted-runner-to-a-group-for-an-organization // //meta:operation PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/runners/{runner_id} 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/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#remove-a-self-hosted-runner-from-a-group-for-an-organization // //meta:operation DELETE /orgs/{org}/actions/runner-groups/{runner_group_id}/runners/{runner_id} 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-60.0.0/github/actions_runner_groups_test.go000066400000000000000000000630521457013574700230050ustar00rootroot00000000000000// 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,"restricted_to_workflows":true,"selected_workflows":["a","b"]},{"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,"restricted_to_workflows":false,"selected_workflows":[]},{"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,"restricted_to_workflows":false,"selected_workflows":[]}]}`) }) opts := &ListOrgRunnerGroupOptions{ListOptions: 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), RestrictedToWorkflows: Bool(true), SelectedWorkflows: []string{"a", "b"}}, {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), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}}, {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), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}}, }, } 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_ListOrganizationRunnerGroupsVisibleToRepo(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", "visible_to_repository": "github"}) 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,"restricted_to_workflows":false,"selected_workflows":[]},{"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,"restricted_to_workflows":false,"selected_workflows":[]},{"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,"restricted_to_workflows":false,"selected_workflows":[]}]}`) }) opts := &ListOrgRunnerGroupOptions{ListOptions: ListOptions{Page: 2, PerPage: 2}, VisibleToRepository: "github"} 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), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}}, {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), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}}, {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), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}}, }, } 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,"restricted_to_workflows":false,"selected_workflows":[]}`) }) 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), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, } 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,"restricted_to_workflows":false,"selected_workflows":[]}`) }) ctx := context.Background() req := CreateRunnerGroupRequest{ Name: String("octo-runner-group"), Visibility: String("selected"), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, } 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), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, } 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,"restricted_to_workflows":false,"selected_workflows":[]}`) }) ctx := context.Background() req := UpdateRunnerGroupRequest{ Name: String("octo-runner-group"), Visibility: String("selected"), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, } 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), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, } 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") testFormValues(t, r, values{"per_page": "1", "page": "1"}) fmt.Fprint(w, `{"total_count": 1, "repositories": [{"id": 43, "node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5", "name": "Hello-World", "full_name": "octocat/Hello-World"}]}`) }) ctx := context.Background() opts := &ListOptions{Page: 1, PerPage: 1} groups, _, err := client.Actions.ListRepositoryAccessRunnerGroup(ctx, "o", 2, opts) 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, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListRepositoryAccessRunnerGroup(ctx, "o", 2, opts) 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), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, } want := `{ "id": 1, "name": "n", "visibility": "v", "default": true, "selected_repositories_url": "s", "runners_url": "r", "inherited": true, "allows_public_repositories": true, "restricted_to_workflows": false, "selected_workflows": [] }` 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), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, }, }, } 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, "restricted_to_workflows": false, "selected_workflows": [] }] }` 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), RestrictedToWorkflows: Bool(true), SelectedWorkflows: []string{"a", "b"}, } want := `{ "name": "n", "visibility": "v", "selected_repository_ids": [1], "runners": [1], "allows_public_repositories": true, "restricted_to_workflows": true, "selected_workflows": ["a","b"] }` testJSONMarshal(t, u, want) } func TestUpdateRunnerGroupRequest_Marshal(t *testing.T) { testJSONMarshal(t, &UpdateRunnerGroupRequest{}, "{}") u := &UpdateRunnerGroupRequest{ Name: String("n"), Visibility: String("v"), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, } want := `{ "name": "n", "visibility": "v", "allows_public_repositories": true, "restricted_to_workflows": false, "selected_workflows": [] }` 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-60.0.0/github/actions_runners.go000066400000000000000000000313341457013574700205300ustar00rootroot00000000000000// 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"` } // ListRunnerApplicationDownloads lists self-hosted runner application binaries that can be downloaded and run. // // GitHub API docs: https://docs.github.com/rest/actions/self-hosted-runners#list-runner-applications-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/actions/runners/downloads 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 } // GenerateJITConfigRequest specifies body parameters to GenerateRepoJITConfig. type GenerateJITConfigRequest struct { Name string `json:"name"` RunnerGroupID int64 `json:"runner_group_id"` WorkFolder *string `json:"work_folder,omitempty"` // Labels represents the names of the custom labels to add to the runner. // Minimum items: 1. Maximum items: 100. Labels []string `json:"labels"` } // JITRunnerConfig represents encoded JIT configuration that can be used to bootstrap a self-hosted runner. type JITRunnerConfig struct { Runner *Runner `json:"runner,omitempty"` EncodedJITConfig *string `json:"encoded_jit_config,omitempty"` } // GenerateOrgJITConfig generate a just-in-time configuration for an organization. // // GitHub API docs: https://docs.github.com/rest/actions/self-hosted-runners#create-configuration-for-a-just-in-time-runner-for-an-organization // //meta:operation POST /orgs/{org}/actions/runners/generate-jitconfig func (s *ActionsService) GenerateOrgJITConfig(ctx context.Context, org string, request *GenerateJITConfigRequest) (*JITRunnerConfig, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runners/generate-jitconfig", org) req, err := s.client.NewRequest("POST", u, request) if err != nil { return nil, nil, err } jitConfig := new(JITRunnerConfig) resp, err := s.client.Do(ctx, req, jitConfig) if err != nil { return nil, resp, err } return jitConfig, resp, nil } // GenerateRepoJITConfig generates a just-in-time configuration for a repository. // // GitHub API docs: https://docs.github.com/rest/actions/self-hosted-runners#create-configuration-for-a-just-in-time-runner-for-a-repository // //meta:operation POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig func (s *ActionsService) GenerateRepoJITConfig(ctx context.Context, owner, repo string, request *GenerateJITConfigRequest) (*JITRunnerConfig, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runners/generate-jitconfig", owner, repo) req, err := s.client.NewRequest("POST", u, request) if err != nil { return nil, nil, err } jitConfig := new(JITRunnerConfig) resp, err := s.client.Do(ctx, req, jitConfig) if err != nil { return nil, resp, err } return jitConfig, 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/rest/actions/self-hosted-runners#create-a-registration-token-for-a-repository // //meta:operation POST /repos/{owner}/{repo}/actions/runners/registration-token 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/rest/actions/self-hosted-runners#list-self-hosted-runners-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/actions/runners 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/rest/actions/self-hosted-runners#get-a-self-hosted-runner-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/actions/runners/{runner_id} 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/rest/actions/self-hosted-runners#create-a-remove-token-for-a-repository // //meta:operation POST /repos/{owner}/{repo}/actions/runners/remove-token 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/rest/actions/self-hosted-runners#delete-a-self-hosted-runner-from-a-repository // //meta:operation DELETE /repos/{owner}/{repo}/actions/runners/{runner_id} 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/rest/actions/self-hosted-runners#list-runner-applications-for-an-organization // //meta:operation GET /orgs/{org}/actions/runners/downloads func (s *ActionsService) ListOrganizationRunnerApplicationDownloads(ctx context.Context, org string) ([]*RunnerApplicationDownload, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runners/downloads", org) 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/rest/actions/self-hosted-runners#create-a-registration-token-for-an-organization // //meta:operation POST /orgs/{org}/actions/runners/registration-token func (s *ActionsService) CreateOrganizationRegistrationToken(ctx context.Context, org string) (*RegistrationToken, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runners/registration-token", org) 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/rest/actions/self-hosted-runners#list-self-hosted-runners-for-an-organization // //meta:operation GET /orgs/{org}/actions/runners func (s *ActionsService) ListOrganizationRunners(ctx context.Context, org string, opts *ListOptions) (*Runners, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runners", 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 } runners := &Runners{} resp, err := s.client.Do(ctx, req, &runners) if err != nil { return nil, resp, err } return runners, resp, nil } // GetOrganizationRunner gets a specific self-hosted runner for an organization using its runner ID. // // GitHub API docs: https://docs.github.com/rest/actions/self-hosted-runners#get-a-self-hosted-runner-for-an-organization // //meta:operation GET /orgs/{org}/actions/runners/{runner_id} func (s *ActionsService) GetOrganizationRunner(ctx context.Context, org string, runnerID int64) (*Runner, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runners/%v", org, 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/rest/actions/self-hosted-runners#create-a-remove-token-for-an-organization // //meta:operation POST /orgs/{org}/actions/runners/remove-token func (s *ActionsService) CreateOrganizationRemoveToken(ctx context.Context, org string) (*RemoveToken, *Response, error) { u := fmt.Sprintf("orgs/%v/actions/runners/remove-token", org) 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/rest/actions/self-hosted-runners#delete-a-self-hosted-runner-from-an-organization // //meta:operation DELETE /orgs/{org}/actions/runners/{runner_id} func (s *ActionsService) RemoveOrganizationRunner(ctx context.Context, org string, runnerID int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/actions/runners/%v", org, runnerID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/actions_runners_test.go000066400000000000000000000604511457013574700215710ustar00rootroot00000000000000// 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_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_GenerateOrgJITConfig(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &GenerateJITConfigRequest{Name: "test", RunnerGroupID: 1, Labels: []string{"one", "two"}} mux.HandleFunc("/orgs/o/actions/runners/generate-jitconfig", func(w http.ResponseWriter, r *http.Request) { v := new(GenerateJITConfigRequest) assertNilError(t, 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, `{"encoded_jit_config":"foo"}`) }) ctx := context.Background() jitConfig, _, err := client.Actions.GenerateOrgJITConfig(ctx, "o", input) if err != nil { t.Errorf("Actions.GenerateOrgJITConfig returned error: %v", err) } want := &JITRunnerConfig{EncodedJITConfig: String("foo")} if !cmp.Equal(jitConfig, want) { t.Errorf("Actions.GenerateOrgJITConfig returned %+v, want %+v", jitConfig, want) } const methodName = "GenerateOrgJITConfig" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GenerateOrgJITConfig(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GenerateOrgJITConfig(ctx, "o", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GenerateRepoJITConfig(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &GenerateJITConfigRequest{Name: "test", RunnerGroupID: 1, Labels: []string{"one", "two"}} mux.HandleFunc("/repos/o/r/actions/runners/generate-jitconfig", func(w http.ResponseWriter, r *http.Request) { v := new(GenerateJITConfigRequest) assertNilError(t, 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, `{"encoded_jit_config":"foo"}`) }) ctx := context.Background() jitConfig, _, err := client.Actions.GenerateRepoJITConfig(ctx, "o", "r", input) if err != nil { t.Errorf("Actions.GenerateRepoJITConfig returned error: %v", err) } want := &JITRunnerConfig{EncodedJITConfig: String("foo")} if !cmp.Equal(jitConfig, want) { t.Errorf("Actions.GenerateRepoJITConfig returned %+v, want %+v", jitConfig, want) } const methodName = "GenerateRepoJITConfig" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GenerateRepoJITConfig(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GenerateRepoJITConfig(ctx, "o", "r", input) 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_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-60.0.0/github/actions_secrets.go000066400000000000000000000366441457013574700205150ustar00rootroot00000000000000// 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"` 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 } func (s *ActionsService) getPublicKey(ctx context.Context, url string) (*PublicKey, *Response, error) { req, err := s.client.NewRequest("GET", url, 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 } // GetRepoPublicKey gets a public key that should be used for secret encryption. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#get-a-repository-public-key // //meta:operation GET /repos/{owner}/{repo}/actions/secrets/public-key func (s *ActionsService) GetRepoPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { url := fmt.Sprintf("repos/%v/%v/actions/secrets/public-key", owner, repo) return s.getPublicKey(ctx, url) } // GetOrgPublicKey gets a public key that should be used for secret encryption. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#get-an-organization-public-key // //meta:operation GET /orgs/{org}/actions/secrets/public-key func (s *ActionsService) GetOrgPublicKey(ctx context.Context, org string) (*PublicKey, *Response, error) { url := fmt.Sprintf("orgs/%v/actions/secrets/public-key", org) return s.getPublicKey(ctx, url) } // GetEnvPublicKey gets a public key that should be used for secret encryption. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#get-an-environment-public-key // //meta:operation GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key func (s *ActionsService) GetEnvPublicKey(ctx context.Context, repoID int, env string) (*PublicKey, *Response, error) { url := fmt.Sprintf("repositories/%v/environments/%v/secrets/public-key", repoID, env) return s.getPublicKey(ctx, url) } // 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"` } func (s *ActionsService) listSecrets(ctx context.Context, url string, opts *ListOptions) (*Secrets, *Response, error) { u, err := addOptions(url, 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 } // ListRepoSecrets lists all secrets available in a repository // without revealing their encrypted values. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#list-repository-secrets // //meta:operation GET /repos/{owner}/{repo}/actions/secrets func (s *ActionsService) ListRepoSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { url := fmt.Sprintf("repos/%v/%v/actions/secrets", owner, repo) return s.listSecrets(ctx, url, opts) } // ListRepoOrgSecrets lists all organization secrets available in a repository // without revealing their encrypted values. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#list-repository-organization-secrets // //meta:operation GET /repos/{owner}/{repo}/actions/organization-secrets func (s *ActionsService) ListRepoOrgSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { url := fmt.Sprintf("repos/%v/%v/actions/organization-secrets", owner, repo) return s.listSecrets(ctx, url, opts) } // ListOrgSecrets lists all secrets available in an organization // without revealing their encrypted values. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#list-organization-secrets // //meta:operation GET /orgs/{org}/actions/secrets func (s *ActionsService) ListOrgSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { url := fmt.Sprintf("orgs/%v/actions/secrets", org) return s.listSecrets(ctx, url, opts) } // ListEnvSecrets lists all secrets available in an environment. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#list-environment-secrets // //meta:operation GET /repositories/{repository_id}/environments/{environment_name}/secrets func (s *ActionsService) ListEnvSecrets(ctx context.Context, repoID int, env string, opts *ListOptions) (*Secrets, *Response, error) { url := fmt.Sprintf("repositories/%v/environments/%v/secrets", repoID, env) return s.listSecrets(ctx, url, opts) } func (s *ActionsService) getSecret(ctx context.Context, url string) (*Secret, *Response, error) { req, err := s.client.NewRequest("GET", url, 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 } // GetRepoSecret gets a single repository secret without revealing its encrypted value. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#get-a-repository-secret // //meta:operation GET /repos/{owner}/{repo}/actions/secrets/{secret_name} func (s *ActionsService) GetRepoSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) return s.getSecret(ctx, url) } // GetOrgSecret gets a single organization secret without revealing its encrypted value. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#get-an-organization-secret // //meta:operation GET /orgs/{org}/actions/secrets/{secret_name} func (s *ActionsService) GetOrgSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) return s.getSecret(ctx, url) } // GetEnvSecret gets a single environment secret without revealing its encrypted value. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#get-an-environment-secret // //meta:operation GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name} func (s *ActionsService) GetEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Secret, *Response, error) { url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) return s.getSecret(ctx, url) } // SelectedRepoIDs are the repository IDs that have access to the actions secrets. 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"` } func (s *ActionsService) putSecret(ctx context.Context, url string, eSecret *EncryptedSecret) (*Response, error) { req, err := s.client.NewRequest("PUT", url, eSecret) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // CreateOrUpdateRepoSecret creates or updates a repository secret with an encrypted value. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#create-or-update-a-repository-secret // //meta:operation PUT /repos/{owner}/{repo}/actions/secrets/{secret_name} func (s *ActionsService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, eSecret.Name) return s.putSecret(ctx, url, eSecret) } // CreateOrUpdateOrgSecret creates or updates an organization secret with an encrypted value. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#create-or-update-an-organization-secret // //meta:operation PUT /orgs/{org}/actions/secrets/{secret_name} func (s *ActionsService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, eSecret.Name) return s.putSecret(ctx, url, eSecret) } // CreateOrUpdateEnvSecret creates or updates a single environment secret with an encrypted value. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#create-or-update-an-environment-secret // //meta:operation PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name} func (s *ActionsService) CreateOrUpdateEnvSecret(ctx context.Context, repoID int, env string, eSecret *EncryptedSecret) (*Response, error) { url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, eSecret.Name) return s.putSecret(ctx, url, eSecret) } func (s *ActionsService) deleteSecret(ctx context.Context, url string) (*Response, error) { req, err := s.client.NewRequest("DELETE", url, nil) 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/rest/actions/secrets#delete-a-repository-secret // //meta:operation DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name} func (s *ActionsService) DeleteRepoSecret(ctx context.Context, owner, repo, name string) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) return s.deleteSecret(ctx, url) } // DeleteOrgSecret deletes a secret in an organization using the secret name. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#delete-an-organization-secret // //meta:operation DELETE /orgs/{org}/actions/secrets/{secret_name} func (s *ActionsService) DeleteOrgSecret(ctx context.Context, org, name string) (*Response, error) { url := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) return s.deleteSecret(ctx, url) } // DeleteEnvSecret deletes a secret in an environment using the secret name. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#delete-an-environment-secret // //meta:operation DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name} func (s *ActionsService) DeleteEnvSecret(ctx context.Context, repoID int, env, secretName string) (*Response, error) { url := fmt.Sprintf("repositories/%v/environments/%v/secrets/%v", repoID, env, secretName) return s.deleteSecret(ctx, url) } // 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"` } func (s *ActionsService) listSelectedReposForSecret(ctx context.Context, url string, opts *ListOptions) (*SelectedReposList, *Response, error) { u, err := addOptions(url, 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 } // ListSelectedReposForOrgSecret lists all repositories that have access to a secret. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#list-selected-repositories-for-an-organization-secret // //meta:operation GET /orgs/{org}/actions/secrets/{secret_name}/repositories func (s *ActionsService) ListSelectedReposForOrgSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) return s.listSelectedReposForSecret(ctx, url, opts) } func (s *ActionsService) setSelectedReposForSecret(ctx context.Context, url string, ids SelectedRepoIDs) (*Response, error) { type repoIDs struct { SelectedIDs SelectedRepoIDs `json:"selected_repository_ids"` } req, err := s.client.NewRequest("PUT", url, repoIDs{SelectedIDs: ids}) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // SetSelectedReposForOrgSecret sets the repositories that have access to a secret. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#set-selected-repositories-for-an-organization-secret // //meta:operation PUT /orgs/{org}/actions/secrets/{secret_name}/repositories func (s *ActionsService) SetSelectedReposForOrgSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) return s.setSelectedReposForSecret(ctx, url, ids) } func (s *ActionsService) addSelectedRepoToSecret(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) } // AddSelectedRepoToOrgSecret adds a repository to an organization secret. // // GitHub API docs: https://docs.github.com/rest/actions/secrets#add-selected-repository-to-an-organization-secret // //meta:operation PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id} func (s *ActionsService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) return s.addSelectedRepoToSecret(ctx, url) } func (s *ActionsService) removeSelectedRepoFromSecret(ctx context.Context, url string) (*Response, error) { req, err := s.client.NewRequest("DELETE", url, 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/rest/actions/secrets#remove-selected-repository-from-an-organization-secret // //meta:operation DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id} func (s *ActionsService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { url := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) return s.removeSelectedRepoFromSecret(ctx, url) } go-github-60.0.0/github/actions_secrets_test.go000066400000000000000000000767321457013574700215560ustar00rootroot00000000000000// 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_ListRepoOrgSecrets(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/organization-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.ListRepoOrgSecrets(ctx, "o", "r", opts) if err != nil { t.Errorf("Actions.ListRepoOrgSecrets 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.ListRepoOrgSecrets returned %+v, want %+v", secrets, want) } const methodName = "ListRepoOrgSecrets" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListRepoOrgSecrets(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListRepoOrgSecrets(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-60.0.0/github/actions_variables.go000066400000000000000000000330631457013574700210050ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // ActionsVariable represents a repository action variable. type ActionsVariable struct { Name string `json:"name"` Value string `json:"value"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` Visibility *string `json:"visibility,omitempty"` // Used by ListOrgVariables and GetOrgVariables SelectedRepositoriesURL *string `json:"selected_repositories_url,omitempty"` // Used by UpdateOrgVariable and CreateOrgVariable SelectedRepositoryIDs *SelectedRepoIDs `json:"selected_repository_ids,omitempty"` } // ActionsVariables represents one item from the ListVariables response. type ActionsVariables struct { TotalCount int `json:"total_count"` Variables []*ActionsVariable `json:"variables"` } func (s *ActionsService) listVariables(ctx context.Context, url string, opts *ListOptions) (*ActionsVariables, *Response, error) { u, err := addOptions(url, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } variables := new(ActionsVariables) resp, err := s.client.Do(ctx, req, &variables) if err != nil { return nil, resp, err } return variables, resp, nil } // ListRepoVariables lists all variables available in a repository. // // GitHub API docs: https://docs.github.com/rest/actions/variables#list-repository-variables // //meta:operation GET /repos/{owner}/{repo}/actions/variables func (s *ActionsService) ListRepoVariables(ctx context.Context, owner, repo string, opts *ListOptions) (*ActionsVariables, *Response, error) { url := fmt.Sprintf("repos/%v/%v/actions/variables", owner, repo) return s.listVariables(ctx, url, opts) } // ListRepoOrgVariables lists all organization variables available in a repository. // // GitHub API docs: https://docs.github.com/rest/actions/variables#list-repository-organization-variables // //meta:operation GET /repos/{owner}/{repo}/actions/organization-variables func (s *ActionsService) ListRepoOrgVariables(ctx context.Context, owner, repo string, opts *ListOptions) (*ActionsVariables, *Response, error) { url := fmt.Sprintf("repos/%v/%v/actions/organization-variables", owner, repo) return s.listVariables(ctx, url, opts) } // ListOrgVariables lists all variables available in an organization. // // GitHub API docs: https://docs.github.com/rest/actions/variables#list-organization-variables // //meta:operation GET /orgs/{org}/actions/variables func (s *ActionsService) ListOrgVariables(ctx context.Context, org string, opts *ListOptions) (*ActionsVariables, *Response, error) { url := fmt.Sprintf("orgs/%v/actions/variables", org) return s.listVariables(ctx, url, opts) } // ListEnvVariables lists all variables available in an environment. // // GitHub API docs: https://docs.github.com/rest/actions/variables#list-environment-variables // //meta:operation GET /repositories/{repository_id}/environments/{environment_name}/variables func (s *ActionsService) ListEnvVariables(ctx context.Context, repoID int, env string, opts *ListOptions) (*ActionsVariables, *Response, error) { url := fmt.Sprintf("repositories/%v/environments/%v/variables", repoID, env) return s.listVariables(ctx, url, opts) } func (s *ActionsService) getVariable(ctx context.Context, url string) (*ActionsVariable, *Response, error) { req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } variable := new(ActionsVariable) resp, err := s.client.Do(ctx, req, variable) if err != nil { return nil, resp, err } return variable, resp, nil } // GetRepoVariable gets a single repository variable. // // GitHub API docs: https://docs.github.com/rest/actions/variables#get-a-repository-variable // //meta:operation GET /repos/{owner}/{repo}/actions/variables/{name} func (s *ActionsService) GetRepoVariable(ctx context.Context, owner, repo, name string) (*ActionsVariable, *Response, error) { url := fmt.Sprintf("repos/%v/%v/actions/variables/%v", owner, repo, name) return s.getVariable(ctx, url) } // GetOrgVariable gets a single organization variable. // // GitHub API docs: https://docs.github.com/rest/actions/variables#get-an-organization-variable // //meta:operation GET /orgs/{org}/actions/variables/{name} func (s *ActionsService) GetOrgVariable(ctx context.Context, org, name string) (*ActionsVariable, *Response, error) { url := fmt.Sprintf("orgs/%v/actions/variables/%v", org, name) return s.getVariable(ctx, url) } // GetEnvVariable gets a single environment variable. // // GitHub API docs: https://docs.github.com/rest/actions/variables#get-an-environment-variable // //meta:operation GET /repositories/{repository_id}/environments/{environment_name}/variables/{name} func (s *ActionsService) GetEnvVariable(ctx context.Context, repoID int, env, variableName string) (*ActionsVariable, *Response, error) { url := fmt.Sprintf("repositories/%v/environments/%v/variables/%v", repoID, env, variableName) return s.getVariable(ctx, url) } func (s *ActionsService) postVariable(ctx context.Context, url string, variable *ActionsVariable) (*Response, error) { req, err := s.client.NewRequest("POST", url, variable) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // CreateRepoVariable creates a repository variable. // // GitHub API docs: https://docs.github.com/rest/actions/variables#create-a-repository-variable // //meta:operation POST /repos/{owner}/{repo}/actions/variables func (s *ActionsService) CreateRepoVariable(ctx context.Context, owner, repo string, variable *ActionsVariable) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/actions/variables", owner, repo) return s.postVariable(ctx, url, variable) } // CreateOrgVariable creates an organization variable. // // GitHub API docs: https://docs.github.com/rest/actions/variables#create-an-organization-variable // //meta:operation POST /orgs/{org}/actions/variables func (s *ActionsService) CreateOrgVariable(ctx context.Context, org string, variable *ActionsVariable) (*Response, error) { url := fmt.Sprintf("orgs/%v/actions/variables", org) return s.postVariable(ctx, url, variable) } // CreateEnvVariable creates an environment variable. // // GitHub API docs: https://docs.github.com/rest/actions/variables#create-an-environment-variable // //meta:operation POST /repositories/{repository_id}/environments/{environment_name}/variables func (s *ActionsService) CreateEnvVariable(ctx context.Context, repoID int, env string, variable *ActionsVariable) (*Response, error) { url := fmt.Sprintf("repositories/%v/environments/%v/variables", repoID, env) return s.postVariable(ctx, url, variable) } func (s *ActionsService) patchVariable(ctx context.Context, url string, variable *ActionsVariable) (*Response, error) { req, err := s.client.NewRequest("PATCH", url, variable) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // UpdateRepoVariable updates a repository variable. // // GitHub API docs: https://docs.github.com/rest/actions/variables#update-a-repository-variable // //meta:operation PATCH /repos/{owner}/{repo}/actions/variables/{name} func (s *ActionsService) UpdateRepoVariable(ctx context.Context, owner, repo string, variable *ActionsVariable) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/actions/variables/%v", owner, repo, variable.Name) return s.patchVariable(ctx, url, variable) } // UpdateOrgVariable updates an organization variable. // // GitHub API docs: https://docs.github.com/rest/actions/variables#update-an-organization-variable // //meta:operation PATCH /orgs/{org}/actions/variables/{name} func (s *ActionsService) UpdateOrgVariable(ctx context.Context, org string, variable *ActionsVariable) (*Response, error) { url := fmt.Sprintf("orgs/%v/actions/variables/%v", org, variable.Name) return s.patchVariable(ctx, url, variable) } // UpdateEnvVariable updates an environment variable. // // GitHub API docs: https://docs.github.com/rest/actions/variables#update-an-environment-variable // //meta:operation PATCH /repositories/{repository_id}/environments/{environment_name}/variables/{name} func (s *ActionsService) UpdateEnvVariable(ctx context.Context, repoID int, env string, variable *ActionsVariable) (*Response, error) { url := fmt.Sprintf("repositories/%v/environments/%v/variables/%v", repoID, env, variable.Name) return s.patchVariable(ctx, url, variable) } func (s *ActionsService) deleteVariable(ctx context.Context, url string) (*Response, error) { req, err := s.client.NewRequest("DELETE", url, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DeleteRepoVariable deletes a variable in a repository. // // GitHub API docs: https://docs.github.com/rest/actions/variables#delete-a-repository-variable // //meta:operation DELETE /repos/{owner}/{repo}/actions/variables/{name} func (s *ActionsService) DeleteRepoVariable(ctx context.Context, owner, repo, name string) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/actions/variables/%v", owner, repo, name) return s.deleteVariable(ctx, url) } // DeleteOrgVariable deletes a variable in an organization. // // GitHub API docs: https://docs.github.com/rest/actions/variables#delete-an-organization-variable // //meta:operation DELETE /orgs/{org}/actions/variables/{name} func (s *ActionsService) DeleteOrgVariable(ctx context.Context, org, name string) (*Response, error) { url := fmt.Sprintf("orgs/%v/actions/variables/%v", org, name) return s.deleteVariable(ctx, url) } // DeleteEnvVariable deletes a variable in an environment. // // GitHub API docs: https://docs.github.com/rest/actions/variables#delete-an-environment-variable // //meta:operation DELETE /repositories/{repository_id}/environments/{environment_name}/variables/{name} func (s *ActionsService) DeleteEnvVariable(ctx context.Context, repoID int, env, variableName string) (*Response, error) { url := fmt.Sprintf("repositories/%v/environments/%v/variables/%v", repoID, env, variableName) return s.deleteVariable(ctx, url) } func (s *ActionsService) listSelectedReposForVariable(ctx context.Context, url string, opts *ListOptions) (*SelectedReposList, *Response, error) { u, err := addOptions(url, 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 } // ListSelectedReposForOrgVariable lists all repositories that have access to a variable. // // GitHub API docs: https://docs.github.com/rest/actions/variables#list-selected-repositories-for-an-organization-variable // //meta:operation GET /orgs/{org}/actions/variables/{name}/repositories func (s *ActionsService) ListSelectedReposForOrgVariable(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { url := fmt.Sprintf("orgs/%v/actions/variables/%v/repositories", org, name) return s.listSelectedReposForVariable(ctx, url, opts) } func (s *ActionsService) setSelectedReposForVariable(ctx context.Context, url string, ids SelectedRepoIDs) (*Response, error) { type repoIDs struct { SelectedIDs SelectedRepoIDs `json:"selected_repository_ids"` } req, err := s.client.NewRequest("PUT", url, repoIDs{SelectedIDs: ids}) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // SetSelectedReposForOrgVariable sets the repositories that have access to a variable. // // GitHub API docs: https://docs.github.com/rest/actions/variables#set-selected-repositories-for-an-organization-variable // //meta:operation PUT /orgs/{org}/actions/variables/{name}/repositories func (s *ActionsService) SetSelectedReposForOrgVariable(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { url := fmt.Sprintf("orgs/%v/actions/variables/%v/repositories", org, name) return s.setSelectedReposForVariable(ctx, url, ids) } func (s *ActionsService) addSelectedRepoToVariable(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) } // AddSelectedRepoToOrgVariable adds a repository to an organization variable. // // GitHub API docs: https://docs.github.com/rest/actions/variables#add-selected-repository-to-an-organization-variable // //meta:operation PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id} func (s *ActionsService) AddSelectedRepoToOrgVariable(ctx context.Context, org, name string, repo *Repository) (*Response, error) { url := fmt.Sprintf("orgs/%v/actions/variables/%v/repositories/%v", org, name, *repo.ID) return s.addSelectedRepoToVariable(ctx, url) } func (s *ActionsService) removeSelectedRepoFromVariable(ctx context.Context, url string) (*Response, error) { req, err := s.client.NewRequest("DELETE", url, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // RemoveSelectedRepoFromOrgVariable removes a repository from an organization variable. // // GitHub API docs: https://docs.github.com/rest/actions/variables#remove-selected-repository-from-an-organization-variable // //meta:operation DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id} func (s *ActionsService) RemoveSelectedRepoFromOrgVariable(ctx context.Context, org, name string, repo *Repository) (*Response, error) { url := fmt.Sprintf("orgs/%v/actions/variables/%v/repositories/%v", org, name, *repo.ID) return s.removeSelectedRepoFromVariable(ctx, url) } go-github-60.0.0/github/actions_variables_test.go000066400000000000000000000625261457013574700220520ustar00rootroot00000000000000// Copyright 2023 The go-github 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_ListRepoVariables(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/variables", 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,"variables":[{"name":"A","value":"AA","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"name":"B","value":"BB","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() variables, _, err := client.Actions.ListRepoVariables(ctx, "o", "r", opts) if err != nil { t.Errorf("Actions.ListRepoVariables returned error: %v", err) } want := &ActionsVariables{ TotalCount: 4, Variables: []*ActionsVariable{ {Name: "A", Value: "AA", 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", Value: "BB", 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(variables, want) { t.Errorf("Actions.ListRepoVariables returned %+v, want %+v", variables, want) } const methodName = "ListRepoVariables" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListRepoVariables(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListRepoVariables(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_ListRepoOrgVariables(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/organization-variables", 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,"variables":[{"name":"A","value":"AA","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"name":"B","value":"BB","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() variables, _, err := client.Actions.ListRepoOrgVariables(ctx, "o", "r", opts) if err != nil { t.Errorf("Actions.ListRepoOrgVariables returned error: %v", err) } want := &ActionsVariables{ TotalCount: 4, Variables: []*ActionsVariable{ {Name: "A", Value: "AA", 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", Value: "BB", 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(variables, want) { t.Errorf("Actions.ListRepoOrgVariables returned %+v, want %+v", variables, want) } const methodName = "ListRepoOrgVariables" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListRepoOrgVariables(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListRepoOrgVariables(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetRepoVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/variables/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"name":"NAME","value":"VALUE","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}`) }) ctx := context.Background() variable, _, err := client.Actions.GetRepoVariable(ctx, "o", "r", "NAME") if err != nil { t.Errorf("Actions.GetRepoVariable returned error: %v", err) } want := &ActionsVariable{ Name: "NAME", Value: "VALUE", 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(variable, want) { t.Errorf("Actions.GetRepoVariable returned %+v, want %+v", variable, want) } const methodName = "GetRepoVariable" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetRepoVariable(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetRepoVariable(ctx, "o", "r", "NAME") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_CreateRepoVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/variables", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"name":"NAME","value":"VALUE"}`+"\n") w.WriteHeader(http.StatusCreated) }) input := &ActionsVariable{ Name: "NAME", Value: "VALUE", } ctx := context.Background() _, err := client.Actions.CreateRepoVariable(ctx, "o", "r", input) if err != nil { t.Errorf("Actions.CreateRepoVariable returned error: %v", err) } const methodName = "CreateRepoVariable" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.CreateRepoVariable(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.CreateRepoVariable(ctx, "o", "r", input) }) } func TestActionsService_UpdateRepoVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/variables/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"name":"NAME","value":"VALUE"}`+"\n") w.WriteHeader(http.StatusNoContent) }) input := &ActionsVariable{ Name: "NAME", Value: "VALUE", } ctx := context.Background() _, err := client.Actions.UpdateRepoVariable(ctx, "o", "r", input) if err != nil { t.Errorf("Actions.UpdateRepoVariable returned error: %v", err) } const methodName = "UpdateRepoVariable" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.UpdateRepoVariable(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.UpdateRepoVariable(ctx, "o", "r", input) }) } func TestActionsService_DeleteRepoVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/variables/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Actions.DeleteRepoVariable(ctx, "o", "r", "NAME") if err != nil { t.Errorf("Actions.( returned error: %v", err) } const methodName = "DeleteRepoVariable" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.DeleteRepoVariable(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.DeleteRepoVariable(ctx, "o", "r", "NAME") }) } func TestActionsService_ListOrgVariables(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/variables", 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,"variables":[{"name":"A","value":"AA","created_at":"2019-08-10T14:59:22Z","updated_at":"2020-01-10T14:59:22Z","visibility":"private"},{"name":"B","value":"BB","created_at":"2019-08-10T14:59:22Z","updated_at":"2020-01-10T14:59:22Z","visibility":"all"},{"name":"C","value":"CC","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/variables/VAR/repositories"}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() variables, _, err := client.Actions.ListOrgVariables(ctx, "o", opts) if err != nil { t.Errorf("Actions.ListOrgVariables returned error: %v", err) } want := &ActionsVariables{ TotalCount: 3, Variables: []*ActionsVariable{ {Name: "A", Value: "AA", 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: String("private")}, {Name: "B", Value: "BB", 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: String("all")}, {Name: "C", Value: "CC", 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: String("selected"), SelectedRepositoriesURL: String("https://api.github.com/orgs/octo-org/actions/variables/VAR/repositories")}, }, } if !cmp.Equal(variables, want) { t.Errorf("Actions.ListOrgVariables returned %+v, want %+v", variables, want) } const methodName = "ListOrgVariables" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListOrgVariables(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListOrgVariables(ctx, "o", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetOrgVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/variables/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"name":"NAME","value":"VALUE","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/variables/VAR/repositories"}`) }) ctx := context.Background() variable, _, err := client.Actions.GetOrgVariable(ctx, "o", "NAME") if err != nil { t.Errorf("Actions.GetOrgVariable returned error: %v", err) } want := &ActionsVariable{ Name: "NAME", Value: "VALUE", 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: String("selected"), SelectedRepositoriesURL: String("https://api.github.com/orgs/octo-org/actions/variables/VAR/repositories"), } if !cmp.Equal(variable, want) { t.Errorf("Actions.GetOrgVariable returned %+v, want %+v", variable, want) } const methodName = "GetOrgVariable" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetOrgVariable(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetOrgVariable(ctx, "o", "NAME") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_CreateOrgVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/variables", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"name":"NAME","value":"VALUE","visibility":"selected","selected_repository_ids":[1296269,1269280]}`+"\n") w.WriteHeader(http.StatusCreated) }) input := &ActionsVariable{ Name: "NAME", Value: "VALUE", Visibility: String("selected"), SelectedRepositoryIDs: &SelectedRepoIDs{1296269, 1269280}, } ctx := context.Background() _, err := client.Actions.CreateOrgVariable(ctx, "o", input) if err != nil { t.Errorf("Actions.CreateOrgVariable returned error: %v", err) } const methodName = "CreateOrgVariable" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.CreateOrgVariable(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.CreateOrgVariable(ctx, "o", input) }) } func TestActionsService_UpdateOrgVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/variables/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"name":"NAME","value":"VALUE","visibility":"selected","selected_repository_ids":[1296269,1269280]}`+"\n") w.WriteHeader(http.StatusNoContent) }) input := &ActionsVariable{ Name: "NAME", Value: "VALUE", Visibility: String("selected"), SelectedRepositoryIDs: &SelectedRepoIDs{1296269, 1269280}, } ctx := context.Background() _, err := client.Actions.UpdateOrgVariable(ctx, "o", input) if err != nil { t.Errorf("Actions.UpdateOrgVariable returned error: %v", err) } const methodName = "UpdateOrgVariable" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.UpdateOrgVariable(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.UpdateOrgVariable(ctx, "o", input) }) } func TestActionsService_ListSelectedReposForOrgVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/variables/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.ListSelectedReposForOrgVariable(ctx, "o", "NAME", opts) if err != nil { t.Errorf("Actions.( returned error: %v", err) } want := &SelectedReposList{ TotalCount: Int(1), Repositories: []*Repository{ {ID: Int64(1)}, }, } if !cmp.Equal(repos, want) { t.Errorf("Actions.( returned %+v, want %+v", repos, want) } const methodName = "ListSelectedReposForOrgVariable" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListSelectedReposForOrgVariable(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListSelectedReposForOrgVariable(ctx, "o", "NAME", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_SetSelectedReposForOrgSVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/variables/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.SetSelectedReposForOrgVariable(ctx, "o", "NAME", SelectedRepoIDs{64780797}) if err != nil { t.Errorf("Actions.( returned error: %v", err) } const methodName = "SetSelectedReposForOrgVariable" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.SetSelectedReposForOrgVariable(ctx, "\n", "\n", SelectedRepoIDs{64780797}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.SetSelectedReposForOrgVariable(ctx, "o", "NAME", SelectedRepoIDs{64780797}) }) } func TestActionsService_AddSelectedRepoToOrgVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/variables/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.AddSelectedRepoToOrgVariable(ctx, "o", "NAME", repo) if err != nil { t.Errorf("Actions.AddSelectedRepoToOrgVariable returned error: %v", err) } const methodName = "AddSelectedRepoToOrgVariable" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.AddSelectedRepoToOrgVariable(ctx, "\n", "\n", repo) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.AddSelectedRepoToOrgVariable(ctx, "o", "NAME", repo) }) } func TestActionsService_RemoveSelectedRepoFromOrgVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/variables/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.RemoveSelectedRepoFromOrgVariable(ctx, "o", "NAME", repo) if err != nil { t.Errorf("Actions.RemoveSelectedRepoFromOrgVariable returned error: %v", err) } const methodName = "RemoveSelectedRepoFromOrgVariable" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.RemoveSelectedRepoFromOrgVariable(ctx, "\n", "\n", repo) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.RemoveSelectedRepoFromOrgVariable(ctx, "o", "NAME", repo) }) } func TestActionsService_DeleteOrgVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/actions/variables/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Actions.DeleteOrgVariable(ctx, "o", "NAME") if err != nil { t.Errorf("Actions.DeleteOrgVariable returned error: %v", err) } const methodName = "DeleteOrgVariable" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.DeleteOrgVariable(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.DeleteOrgVariable(ctx, "o", "NAME") }) } func TestActionsService_ListEnvVariables(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/environments/e/variables", 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,"variables":[{"name":"A","value":"AA","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"name":"B","value":"BB","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() variables, _, err := client.Actions.ListEnvVariables(ctx, 1, "e", opts) if err != nil { t.Errorf("Actions.ListEnvVariables returned error: %v", err) } want := &ActionsVariables{ TotalCount: 4, Variables: []*ActionsVariable{ {Name: "A", Value: "AA", 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", Value: "BB", 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(variables, want) { t.Errorf("Actions.ListEnvVariables returned %+v, want %+v", variables, want) } const methodName = "ListEnvVariables" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListEnvVariables(ctx, 0.0, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListEnvVariables(ctx, 1, "e", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetEnvVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/environments/e/variables/variable", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"name":"variable","value":"VAR","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}`) }) ctx := context.Background() variable, _, err := client.Actions.GetEnvVariable(ctx, 1, "e", "variable") if err != nil { t.Errorf("Actions.GetEnvVariable returned error: %v", err) } want := &ActionsVariable{ Name: "variable", Value: "VAR", 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(variable, want) { t.Errorf("Actions.GetEnvVariable returned %+v, want %+v", variable, want) } const methodName = "GetEnvVariable" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetEnvVariable(ctx, 0.0, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetEnvVariable(ctx, 1, "e", "variable") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_CreateEnvVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/environments/e/variables", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"name":"variable","value":"VAR"}`+"\n") w.WriteHeader(http.StatusCreated) }) input := &ActionsVariable{ Name: "variable", Value: "VAR", } ctx := context.Background() _, err := client.Actions.CreateEnvVariable(ctx, 1, "e", input) if err != nil { t.Errorf("Actions.CreateEnvVariable returned error: %v", err) } const methodName = "CreateEnvVariable" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.CreateEnvVariable(ctx, 0.0, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.CreateEnvVariable(ctx, 1, "e", input) }) } func TestActionsService_UpdateEnvVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/environments/e/variables/variable", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"name":"variable","value":"VAR"}`+"\n") w.WriteHeader(http.StatusNoContent) }) input := &ActionsVariable{ Name: "variable", Value: "VAR", } ctx := context.Background() _, err := client.Actions.UpdateEnvVariable(ctx, 1, "e", input) if err != nil { t.Errorf("Actions.UpdateEnvVariable returned error: %v", err) } const methodName = "UpdateEnvVariable" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.UpdateEnvVariable(ctx, 0.0, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.UpdateEnvVariable(ctx, 1, "e", input) }) } func TestActionsService_DeleteEnvVariable(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repositories/1/environments/e/variables/variable", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Actions.DeleteEnvVariable(ctx, 1, "e", "variable") if err != nil { t.Errorf("Actions.DeleteEnvVariable returned error: %v", err) } const methodName = "DeleteEnvVariable" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.DeleteEnvVariable(ctx, 0.0, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.DeleteEnvVariable(ctx, 1, "r", "variable") }) } func TestActionVariable_Marshal(t *testing.T) { testJSONMarshal(t, &ActionsVariable{}, "{}") av := &ActionsVariable{ Name: "n", Value: "v", CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, Visibility: String("v"), SelectedRepositoriesURL: String("s"), SelectedRepositoryIDs: &SelectedRepoIDs{1, 2, 3}, } want := fmt.Sprintf(`{ "name": "n", "value": "v", "created_at": %s, "updated_at": %s, "visibility": "v", "selected_repositories_url": "s", "selected_repository_ids": [1,2,3] }`, referenceTimeStr, referenceTimeStr) fmt.Println(want) testJSONMarshal(t, av, want) } go-github-60.0.0/github/actions_workflow_jobs.go000066400000000000000000000134571457013574700217310ustar00rootroot00000000000000// 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"` HeadBranch *string `json:"head_branch,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"` CreatedAt *Timestamp `json:"created_at,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"` // Labels represents runner labels from the `runs-on:` key from a GitHub Actions workflow. Labels []string `json:"labels,omitempty"` RunnerID *int64 `json:"runner_id,omitempty"` RunnerName *string `json:"runner_name,omitempty"` RunnerGroupID *int64 `json:"runner_group_id,omitempty"` RunnerGroupName *string `json:"runner_group_name,omitempty"` RunAttempt *int64 `json:"run_attempt,omitempty"` WorkflowName *string `json:"workflow_name,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/rest/actions/workflow-jobs#list-jobs-for-a-workflow-run // //meta:operation GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs 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 } // ListWorkflowJobsAttempt lists jobs for a workflow run Attempt. // // GitHub API docs: https://docs.github.com/rest/actions/workflow-jobs#list-jobs-for-a-workflow-run-attempt // //meta:operation GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs func (s *ActionsService) ListWorkflowJobsAttempt(ctx context.Context, owner, repo string, runID, attemptNumber int64, opts *ListOptions) (*Jobs, *Response, error) { u := fmt.Sprintf("repos/%s/%s/actions/runs/%v/attempts/%v/jobs", owner, repo, runID, attemptNumber) 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/rest/actions/workflow-jobs#get-a-job-for-a-workflow-run // //meta:operation GET /repos/{owner}/{repo}/actions/jobs/{job_id} 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/rest/actions/workflow-jobs#download-job-logs-for-a-workflow-run // //meta:operation GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs func (s *ActionsService) GetWorkflowJobLogs(ctx context.Context, owner, repo string, jobID int64, maxRedirects int) (*url.URL, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/jobs/%v/logs", owner, repo, jobID) resp, err := s.client.roundTripWithOptionalFollowRedirect(ctx, u, maxRedirects) if err != nil { return nil, nil, err } defer resp.Body.Close() 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 } go-github-60.0.0/github/actions_workflow_jobs_test.go000066400000000000000000000331631457013574700227640ustar00rootroot00000000000000// 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_ListWorkflowJobsAttempt(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/29679449/attempts/1/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","run_attempt":2},{"id":399444497,"run_id":29679449,"started_at":"2019-01-02T15:04:05Z","completed_at":"2020-01-02T15:04:05Z","run_attempt":2}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() jobs, _, err := client.Actions.ListWorkflowJobsAttempt(ctx, "o", "r", 29679449, 1, opts) if err != nil { t.Errorf("Actions.ListWorkflowJobsAttempt 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)}, RunAttempt: Int64(2), }, { 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)}, RunAttempt: Int64(2), }, }, } if !cmp.Equal(jobs, want) { t.Errorf("Actions.ListWorkflowJobsAttempt returned %+v, want %+v", jobs, want) } const methodName = "ListWorkflowJobsAttempt" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.ListWorkflowJobsAttempt(ctx, "\n", "\n", 29679449, 1, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.ListWorkflowJobsAttempt(ctx, "o", "r", 29679449, 1, opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } 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, 1) 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, 1) 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, 1) 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, 0) 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, 1) 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"), HeadBranch: String("b"), HeadSHA: String("h"), URL: String("u"), HTMLURL: String("h"), Status: String("s"), Conclusion: String("c"), CreatedAt: &Timestamp{referenceTime}, 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"), WorkflowName: String("w"), } want := `{ "id": 1, "run_id": 1, "run_url": "r", "node_id": "n", "head_branch": "b", "head_sha": "h", "url": "u", "html_url": "h", "status": "s", "conclusion": "c", "created_at": ` + referenceTimeStr + `, "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", "workflow_name": "w" }` 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"), HeadBranch: String("b"), HeadSHA: String("h"), URL: String("u"), HTMLURL: String("h"), Status: String("s"), Conclusion: String("c"), CreatedAt: &Timestamp{referenceTime}, 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"), RunAttempt: Int64(2), WorkflowName: String("w"), }, }, } want := `{ "total_count": 1, "jobs": [{ "id": 1, "run_id": 1, "run_url": "r", "node_id": "n", "head_branch": "b", "head_sha": "h", "url": "u", "html_url": "h", "status": "s", "conclusion": "c", "created_at": ` + referenceTimeStr + `, "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", "run_attempt": 2, "workflow_name": "w" }] }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/actions_workflow_runs.go000066400000000000000000000371541457013574700217630ustar00rootroot00000000000000// 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"` RunAttempt *int `json:"run_attempt,omitempty"` Event *string `json:"event,omitempty"` DisplayTitle *string `json:"display_title,omitempty"` Status *string `json:"status,omitempty"` Conclusion *string `json:"conclusion,omitempty"` WorkflowID *int64 `json:"workflow_id,omitempty"` CheckSuiteID *int64 `json:"check_suite_id,omitempty"` CheckSuiteNodeID *string `json:"check_suite_node_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"` RunStartedAt *Timestamp `json:"run_started_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"` PreviousAttemptURL *string `json:"previous_attempt_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"` Actor *User `json:"actor,omitempty"` TriggeringActor *User `json:"triggering_actor,omitempty"` ReferencedWorkflows []*ReferencedWorkflow `json:"referenced_workflows,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"` Created string `url:"created,omitempty"` HeadSHA string `url:"head_sha,omitempty"` ExcludePullRequests bool `url:"exclude_pull_requests,omitempty"` CheckSuiteID int64 `url:"check_suite_id,omitempty"` ListOptions } // WorkflowRunUsage represents a usage of a specific workflow run. type WorkflowRunUsage struct { Billable *WorkflowRunBillMap `json:"billable,omitempty"` RunDurationMS *int64 `json:"run_duration_ms,omitempty"` } // WorkflowRunBillMap represents different runner environments available for a workflow run. // Its key is the name of its environment, e.g. "UBUNTU", "MACOS", "WINDOWS", etc. type WorkflowRunBillMap map[string]*WorkflowRunBill // 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"` JobRuns []*WorkflowRunJobRun `json:"job_runs,omitempty"` } // WorkflowRunJobRun represents a usage of individual jobs of a specific workflow run. type WorkflowRunJobRun struct { JobID *int `json:"job_id,omitempty"` DurationMS *int64 `json:"duration_ms,omitempty"` } // WorkflowRunAttemptOptions specifies optional parameters to GetWorkflowRunAttempt. type WorkflowRunAttemptOptions struct { ExcludePullRequests *bool `url:"exclude_pull_requests,omitempty"` } // PendingDeploymentsRequest specifies body parameters to PendingDeployments. type PendingDeploymentsRequest struct { EnvironmentIDs []int64 `json:"environment_ids"` // State can be one of: "approved", "rejected". State string `json:"state"` Comment string `json:"comment"` } type ReferencedWorkflow struct { Path *string `json:"path,omitempty"` SHA *string `json:"sha,omitempty"` Ref *string `json:"ref,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/rest/actions/workflow-runs#list-workflow-runs-for-a-workflow // //meta:operation GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/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/rest/actions/workflow-runs#list-workflow-runs-for-a-workflow // //meta:operation GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/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/rest/actions/workflow-runs#list-workflow-runs-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/actions/runs 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/rest/actions/workflow-runs#get-a-workflow-run // //meta:operation GET /repos/{owner}/{repo}/actions/runs/{run_id} 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 } // GetWorkflowRunAttempt gets a specific workflow run attempt. // // GitHub API docs: https://docs.github.com/rest/actions/workflow-runs#get-a-workflow-run-attempt // //meta:operation GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number} func (s *ActionsService) GetWorkflowRunAttempt(ctx context.Context, owner, repo string, runID int64, attemptNumber int, opts *WorkflowRunAttemptOptions) (*WorkflowRun, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/attempts/%v", owner, repo, runID, attemptNumber) 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 } run := new(WorkflowRun) resp, err := s.client.Do(ctx, req, run) if err != nil { return nil, resp, err } return run, resp, nil } // GetWorkflowRunAttemptLogs gets a redirect URL to download a plain text file of logs for a workflow run for attempt number. // // GitHub API docs: https://docs.github.com/rest/actions/workflow-runs#download-workflow-run-attempt-logs // //meta:operation GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs func (s *ActionsService) GetWorkflowRunAttemptLogs(ctx context.Context, owner, repo string, runID int64, attemptNumber int, maxRedirects int) (*url.URL, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/attempts/%v/logs", owner, repo, runID, attemptNumber) resp, err := s.client.roundTripWithOptionalFollowRedirect(ctx, u, maxRedirects) if err != nil { return nil, nil, err } defer resp.Body.Close() 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 } // RerunWorkflowByID re-runs a workflow by ID. // // GitHub API docs: https://docs.github.com/rest/actions/workflow-runs#re-run-a-workflow // //meta:operation POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun 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) } // RerunFailedJobsByID re-runs all of the failed jobs and their dependent jobs in a workflow run by ID. // // GitHub API docs: https://docs.github.com/rest/actions/workflow-runs#re-run-failed-jobs-from-a-workflow-run // //meta:operation POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs func (s *ActionsService) RerunFailedJobsByID(ctx context.Context, owner, repo string, runID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/rerun-failed-jobs", owner, repo, runID) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // RerunJobByID re-runs a job and its dependent jobs in a workflow run by ID. // // GitHub API docs: https://docs.github.com/rest/actions/workflow-runs#re-run-a-job-from-a-workflow-run // //meta:operation POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun func (s *ActionsService) RerunJobByID(ctx context.Context, owner, repo string, jobID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/jobs/%v/rerun", owner, repo, jobID) 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/rest/actions/workflow-runs#cancel-a-workflow-run // //meta:operation POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel 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/rest/actions/workflow-runs#download-workflow-run-logs // //meta:operation GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs func (s *ActionsService) GetWorkflowRunLogs(ctx context.Context, owner, repo string, runID int64, maxRedirects int) (*url.URL, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/logs", owner, repo, runID) resp, err := s.client.roundTripWithOptionalFollowRedirect(ctx, u, maxRedirects) if err != nil { return nil, nil, err } defer resp.Body.Close() 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 } // DeleteWorkflowRun deletes a workflow run by ID. // // GitHub API docs: https://docs.github.com/rest/actions/workflow-runs#delete-a-workflow-run // //meta:operation DELETE /repos/{owner}/{repo}/actions/runs/{run_id} func (s *ActionsService) DeleteWorkflowRun(ctx context.Context, owner, repo string, runID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runs/%v", owner, repo, runID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DeleteWorkflowRunLogs deletes all logs for a workflow run. // // GitHub API docs: https://docs.github.com/rest/actions/workflow-runs#delete-workflow-run-logs // //meta:operation DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/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/rest/actions/workflow-runs#get-workflow-run-usage // //meta:operation GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing 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 } // PendingDeployments approve or reject pending deployments that are waiting on approval by a required reviewer. // // GitHub API docs: https://docs.github.com/rest/actions/workflow-runs#review-pending-deployments-for-a-workflow-run // //meta:operation POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments func (s *ActionsService) PendingDeployments(ctx context.Context, owner, repo string, runID int64, request *PendingDeploymentsRequest) ([]*Deployment, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/pending_deployments", owner, repo, runID) req, err := s.client.NewRequest("POST", u, request) 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 } go-github-60.0.0/github/actions_workflow_runs_test.go000066400000000000000000001116621457013574700230170ustar00rootroot00000000000000// 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" "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_GetWorkflowRunAttempt(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/29679449/attempts/3", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"exclude_pull_requests": "true"}) fmt.Fprint(w, `{"id":399444496,"run_number":296,"run_attempt":3,"created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}}`) }) opts := &WorkflowRunAttemptOptions{ExcludePullRequests: Bool(true)} ctx := context.Background() runs, _, err := client.Actions.GetWorkflowRunAttempt(ctx, "o", "r", 29679449, 3, opts) if err != nil { t.Errorf("Actions.GetWorkflowRunAttempt returned error: %v", err) } want := &WorkflowRun{ ID: Int64(399444496), RunNumber: Int(296), RunAttempt: Int(3), 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.GetWorkflowRunAttempt returned %+v, want %+v", runs, want) } const methodName = "GetWorkflowRunAttempt" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetWorkflowRunAttempt(ctx, "\n", "\n", 29679449, 3, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.GetWorkflowRunAttempt(ctx, "o", "r", 29679449, 3, opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsService_GetWorkflowRunAttemptLogs(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/399444496/attempts/2/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.GetWorkflowRunAttemptLogs(ctx, "o", "r", 399444496, 2, 1) if err != nil { t.Errorf("Actions.GetWorkflowRunAttemptLogs returned error: %v", err) } if resp.StatusCode != http.StatusFound { t.Errorf("Actions.GetWorkflowRunAttemptLogs returned status: %d, want %d", resp.StatusCode, http.StatusFound) } want := "http://github.com/a" if url.String() != want { t.Errorf("Actions.GetWorkflowRunAttemptLogs returned %+v, want %+v", url.String(), want) } const methodName = "GetWorkflowRunAttemptLogs" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetWorkflowRunAttemptLogs(ctx, "\n", "\n", 399444496, 2, 1) return err }) } func TestActionsService_GetWorkflowRunAttemptLogs_StatusMovedPermanently_dontFollowRedirects(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/399444496/attempts/2/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.GetWorkflowRunAttemptLogs(ctx, "o", "r", 399444496, 2, 0) if resp.StatusCode != http.StatusMovedPermanently { t.Errorf("Actions.GetWorkflowRunAttemptLogs returned status: %d, want %d", resp.StatusCode, http.StatusMovedPermanently) } } func TestActionsService_GetWorkflowRunAttemptLogs_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/attempts/2/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.GetWorkflowRunAttemptLogs(ctx, "o", "r", 399444496, 2, 1) if err != nil { t.Errorf("Actions.GetWorkflowRunAttemptLogs returned error: %v", err) } if resp.StatusCode != http.StatusFound { t.Errorf("Actions.GetWorkflowRunAttemptLogs returned status: %d, want %d", resp.StatusCode, http.StatusFound) } want := "http://github.com/a" if url.String() != want { t.Errorf("Actions.GetWorkflowRunAttemptLogs returned %+v, want %+v", url.String(), want) } const methodName = "GetWorkflowRunAttemptLogs" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.GetWorkflowRunAttemptLogs(ctx, "\n", "\n", 399444496, 2, 1) return 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_RerunFailedJobsByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/3434/rerun-failed-jobs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") w.WriteHeader(http.StatusCreated) }) ctx := context.Background() resp, err := client.Actions.RerunFailedJobsByID(ctx, "o", "r", 3434) if err != nil { t.Errorf("Actions.RerunFailedJobsByID returned error: %v", err) } if resp.StatusCode != http.StatusCreated { t.Errorf("Actions.RerunFailedJobsByID returned status: %d, want %d", resp.StatusCode, http.StatusCreated) } const methodName = "RerunFailedJobsByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.RerunFailedJobsByID(ctx, "\n", "\n", 3434) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.RerunFailedJobsByID(ctx, "o", "r", 3434) }) } func TestActionsService_RerunJobByID(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/jobs/3434/rerun", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") w.WriteHeader(http.StatusCreated) }) ctx := context.Background() resp, err := client.Actions.RerunJobByID(ctx, "o", "r", 3434) if err != nil { t.Errorf("Actions.RerunJobByID returned error: %v", err) } if resp.StatusCode != http.StatusCreated { t.Errorf("Actions.RerunJobByID returned status: %d, want %d", resp.StatusCode, http.StatusCreated) } const methodName = "RerunJobByID" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.RerunJobByID(ctx, "\n", "\n", 3434) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.RerunJobByID(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, 1) 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, 1) 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, 0) 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, 1) 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, 1) 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_DeleteWorkflowRun(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/runs/399444496", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Actions.DeleteWorkflowRun(ctx, "o", "r", 399444496); err != nil { t.Errorf("DeleteWorkflowRun returned error: %v", err) } const methodName = "DeleteWorkflowRun" testBadOptions(t, methodName, func() (err error) { _, err = client.Actions.DeleteWorkflowRun(ctx, "\n", "\n", 399444496) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Actions.DeleteWorkflowRun(ctx, "o", "r", 399444496) }) } 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,"job_runs":[{"job_id":1,"duration_ms":60000}]},"MACOS":{"total_ms":240000,"jobs":2,"job_runs":[{"job_id":2,"duration_ms":30000},{"job_id":3,"duration_ms":10000}]},"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: &WorkflowRunBillMap{ "UBUNTU": &WorkflowRunBill{ TotalMS: Int64(180000), Jobs: Int(1), JobRuns: []*WorkflowRunJobRun{ { JobID: Int(1), DurationMS: Int64(60000), }, }, }, "MACOS": &WorkflowRunBill{ TotalMS: Int64(240000), Jobs: Int(2), JobRuns: []*WorkflowRunJobRun{ { JobID: Int(2), DurationMS: Int64(30000), }, { JobID: Int(3), DurationMS: Int64(10000), }, }, }, "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), RunAttempt: 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}, RunStartedAt: &Timestamp{referenceTime}, JobsURL: String("j"), LogsURL: String("l"), CheckSuiteURL: String("c"), ArtifactsURL: String("a"), CancelURL: String("c"), RerunURL: String("r"), PreviousAttemptURL: String("p"), 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"), }, Actor: &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), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, URL: String("u"), }, TriggeringActor: &User{ Login: String("l2"), ID: Int64(2), AvatarURL: String("a2"), GravatarID: String("g2"), Name: String("n2"), Company: String("c2"), Blog: String("b2"), Location: String("l2"), Email: String("e2"), Hireable: Bool(false), Bio: String("b2"), TwitterUsername: String("t2"), PublicRepos: Int(2), Followers: Int(2), Following: Int(2), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, URL: String("u2"), }, ReferencedWorkflows: []*ReferencedWorkflow{ { Path: String("rwfp"), SHA: String("rwfsha"), Ref: String("rwfref"), }, }, } want := `{ "id": 1, "name": "n", "node_id": "nid", "head_branch": "hb", "head_sha": "hs", "run_number": 1, "run_attempt": 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 + `, "run_started_at": ` + referenceTimeStr + `, "jobs_url": "j", "logs_url": "l", "check_suite_url": "c", "artifacts_url": "a", "cancel_url": "c", "rerun_url": "r", "previous_attempt_url": "p", "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" }, "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" }, "triggering_actor": { "login": "l2", "id": 2, "avatar_url": "a2", "gravatar_id": "g2", "name": "n2", "company": "c2", "blog": "b2", "location": "l2", "email": "e2", "hireable": false, "bio": "b2", "twitter_username": "t2", "public_repos": 2, "followers": 2, "following": 2, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u2" }, "referenced_workflows": [ { "path": "rwfp", "sha": "rwfsha", "ref": "rwfref" } ] }` 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), RunAttempt: 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}, RunStartedAt: &Timestamp{referenceTime}, JobsURL: String("j"), LogsURL: String("l"), CheckSuiteURL: String("c"), ArtifactsURL: String("a"), CancelURL: String("c"), RerunURL: String("r"), PreviousAttemptURL: String("p"), 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"), }, Actor: &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), Bio: String("b"), TwitterUsername: String("t"), PublicRepos: Int(1), Followers: Int(1), Following: Int(1), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, URL: String("u"), }, TriggeringActor: &User{ Login: String("l2"), ID: Int64(2), AvatarURL: String("a2"), GravatarID: String("g2"), Name: String("n2"), Company: String("c2"), Blog: String("b2"), Location: String("l2"), Email: String("e2"), Hireable: Bool(false), Bio: String("b2"), TwitterUsername: String("t2"), PublicRepos: Int(2), Followers: Int(2), Following: Int(2), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, URL: String("u2"), }, }, }, } want := `{ "total_count": 1, "workflow_runs": [ { "id": 1, "name": "n", "node_id": "nid", "head_branch": "hb", "head_sha": "hs", "run_number": 1, "run_attempt": 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 + `, "run_started_at": ` + referenceTimeStr + `, "jobs_url": "j", "logs_url": "l", "check_suite_url": "c", "artifacts_url": "a", "cancel_url": "c", "rerun_url": "r", "previous_attempt_url": "p", "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" }, "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" }, "triggering_actor": { "login": "l2", "id": 2, "avatar_url": "a2", "gravatar_id": "g2", "name": "n2", "company": "c2", "blog": "b2", "location": "l2", "email": "e2", "hireable": false, "bio": "b2", "twitter_username": "t2", "public_repos": 2, "followers": 2, "following": 2, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "url": "u2" } } ] }` 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 TestWorkflowRunBillMap_Marshal(t *testing.T) { testJSONMarshal(t, &WorkflowRunBillMap{}, "{}") u := &WorkflowRunBillMap{ "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: &WorkflowRunBillMap{ "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) } func TestActionService_PendingDeployments(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &PendingDeploymentsRequest{EnvironmentIDs: []int64{3, 4}, State: "approved", Comment: ""} mux.HandleFunc("/repos/o/r/actions/runs/399444496/pending_deployments", func(w http.ResponseWriter, r *http.Request) { v := new(PendingDeploymentsRequest) assertNilError(t, 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}, {"id":2}]`) }) ctx := context.Background() deployments, _, err := client.Actions.PendingDeployments(ctx, "o", "r", 399444496, input) if err != nil { t.Errorf("Actions.PendingDeployments returned error: %v", err) } want := []*Deployment{{ID: Int64(1)}, {ID: Int64(2)}} if !cmp.Equal(deployments, want) { t.Errorf("Actions.PendingDeployments returned %+v, want %+v", deployments, want) } const methodName = "PendingDeployments" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Actions.PendingDeployments(ctx, "\n", "\n", 399444496, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Actions.PendingDeployments(ctx, "o", "r", 399444496, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/actions_workflows.go000066400000000000000000000223441457013574700210720ustar00rootroot00000000000000// 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 *WorkflowBillMap `json:"billable,omitempty"` } // WorkflowBillMap represents different runner environments available for a workflow. // Its key is the name of its environment, e.g. "UBUNTU", "MACOS", "WINDOWS", etc. type WorkflowBillMap map[string]*WorkflowBill // 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 or a tag. // 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/rest/actions/workflows#list-repository-workflows // //meta:operation GET /repos/{owner}/{repo}/actions/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/rest/actions/workflows#get-a-workflow // //meta:operation GET /repos/{owner}/{repo}/actions/workflows/{workflow_id} 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/rest/actions/workflows#get-a-workflow // //meta:operation GET /repos/{owner}/{repo}/actions/workflows/{workflow_id} 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/rest/actions/workflows#get-workflow-usage // //meta:operation GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing 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/rest/actions/workflows#get-workflow-usage // //meta:operation GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing 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/rest/actions/workflows#create-a-workflow-dispatch-event // //meta:operation POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches 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/rest/actions/workflows#create-a-workflow-dispatch-event // //meta:operation POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches 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/rest/actions/workflows#enable-a-workflow // //meta:operation PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable 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/rest/actions/workflows#enable-a-workflow // //meta:operation PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable 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/rest/actions/workflows#disable-a-workflow // //meta:operation PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable 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/rest/actions/workflows#disable-a-workflow // //meta:operation PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable 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-60.0.0/github/actions_workflows_test.go000066400000000000000000000433021457013574700221260ustar00rootroot00000000000000// 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: &WorkflowBillMap{ "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: &WorkflowBillMap{ "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 assertNilError(t, 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 assertNilError(t, 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 TestWorkflowBillMap_Marshal(t *testing.T) { testJSONMarshal(t, &WorkflowBillMap{}, "{}") u := &WorkflowBillMap{ "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: &WorkflowBillMap{ "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-60.0.0/github/activity.go000066400000000000000000000056751457013574700171610ustar00rootroot00000000000000// 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/rest/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. // // GitHub API docs: https://docs.github.com/rest/activity/feeds#get-feeds // //meta:operation GET /feeds 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-60.0.0/github/activity_events.go000066400000000000000000000150131457013574700205300ustar00rootroot00000000000000// 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/rest/activity/events#list-public-events // //meta:operation GET /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/rest/activity/events#list-repository-events // //meta:operation GET /repos/{owner}/{repo}/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/rest/issues/events#list-issue-events-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/issues/events 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/rest/activity/events#list-public-events-for-a-network-of-repositories // //meta:operation GET /networks/{owner}/{repo}/events 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/rest/activity/events#list-public-organization-events // //meta:operation GET /orgs/{org}/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/rest/activity/events#list-events-for-the-authenticated-user // GitHub API docs: https://docs.github.com/rest/activity/events#list-public-events-for-a-user // //meta:operation GET /users/{username}/events //meta:operation GET /users/{username}/events/public 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/rest/activity/events#list-events-received-by-the-authenticated-user // GitHub API docs: https://docs.github.com/rest/activity/events#list-public-events-received-by-a-user // //meta:operation GET /users/{username}/received_events //meta:operation GET /users/{username}/received_events/public 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/rest/activity/events#list-organization-events-for-the-authenticated-user // //meta:operation GET /users/{username}/events/orgs/{org} 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-60.0.0/github/activity_events_test.go000066400000000000000000000344061457013574700215760ustar00rootroot00000000000000// 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-60.0.0/github/activity_notifications.go000066400000000000000000000165611457013574700221060ustar00rootroot00000000000000// 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/rest/activity#notification-reasons Reason *string `json:"reason,omitempty"` Unread *bool `json:"unread,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` LastReadAt *Timestamp `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/rest/activity/notifications#list-notifications-for-the-authenticated-user // //meta:operation GET /notifications func (s *ActivityService) ListNotifications(ctx context.Context, opts *NotificationListOptions) ([]*Notification, *Response, error) { u := "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/rest/activity/notifications#list-repository-notifications-for-the-authenticated-user // //meta:operation GET /repos/{owner}/{repo}/notifications 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 Timestamp `json:"last_read_at,omitempty"` } // MarkNotificationsRead marks all notifications up to lastRead as read. // // GitHub API docs: https://docs.github.com/rest/activity/notifications#mark-notifications-as-read // //meta:operation PUT /notifications func (s *ActivityService) MarkNotificationsRead(ctx context.Context, lastRead Timestamp) (*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/rest/activity/notifications#mark-repository-notifications-as-read // //meta:operation PUT /repos/{owner}/{repo}/notifications func (s *ActivityService) MarkRepositoryNotificationsRead(ctx context.Context, owner, repo string, lastRead Timestamp) (*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/rest/activity/notifications#get-a-thread // //meta:operation GET /notifications/threads/{thread_id} 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/rest/activity/notifications#mark-a-thread-as-read // //meta:operation PATCH /notifications/threads/{thread_id} 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/rest/activity/notifications#get-a-thread-subscription-for-the-authenticated-user // //meta:operation GET /notifications/threads/{thread_id}/subscription 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/rest/activity/notifications#set-a-thread-subscription // //meta:operation PUT /notifications/threads/{thread_id}/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/rest/activity/notifications#delete-a-thread-subscription // //meta:operation DELETE /notifications/threads/{thread_id}/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-60.0.0/github/activity_notifications_test.go000066400000000000000000000263411457013574700231420ustar00rootroot00000000000000// 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_ListRepositoryNotifications(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", &NotificationListOptions{}) 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, Timestamp{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, Timestamp{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", Timestamp{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", Timestamp{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", Timestamp{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) assertNilError(t, 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: &Timestamp{referenceTime}, LastReadAt: &Timestamp{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: Timestamp{referenceTime}, } want := `{ "last_read_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/activity_star.go000066400000000000000000000113021457013574700201720ustar00rootroot00000000000000// 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/rest/activity/starring#list-stargazers // //meta:operation GET /repos/{owner}/{repo}/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/rest/activity/starring#list-repositories-starred-by-a-user // GitHub API docs: https://docs.github.com/rest/activity/starring#list-repositories-starred-by-the-authenticated-user // //meta:operation GET /user/starred //meta:operation GET /users/{username}/starred 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/rest/activity/starring#check-if-a-repository-is-starred-by-the-authenticated-user // //meta:operation GET /user/starred/{owner}/{repo} 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/rest/activity/starring#star-a-repository-for-the-authenticated-user // //meta:operation PUT /user/starred/{owner}/{repo} 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/rest/activity/starring#unstar-a-repository-for-the-authenticated-user // //meta:operation DELETE /user/starred/{owner}/{repo} 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-60.0.0/github/activity_star_test.go000066400000000000000000000237041457013574700212420ustar00rootroot00000000000000// 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-60.0.0/github/activity_test.go000066400000000000000000000157731457013574700202200ustar00rootroot00000000000000// 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) assertWrite(t, w, 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-60.0.0/github/activity_watching.go000066400000000000000000000116731457013574700210400ustar00rootroot00000000000000// 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/rest/activity/watching#list-watchers // //meta:operation GET /repos/{owner}/{repo}/subscribers 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/rest/activity/watching#list-repositories-watched-by-a-user // GitHub API docs: https://docs.github.com/rest/activity/watching#list-repositories-watched-by-the-authenticated-user // //meta:operation GET /user/subscriptions //meta:operation GET /users/{username}/subscriptions 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/rest/activity/watching#get-a-repository-subscription // //meta:operation GET /repos/{owner}/{repo}/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/rest/activity/watching#set-a-repository-subscription // //meta:operation PUT /repos/{owner}/{repo}/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/rest/activity/watching#delete-a-repository-subscription // //meta:operation DELETE /repos/{owner}/{repo}/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-60.0.0/github/activity_watching_test.go000066400000000000000000000177201457013574700220760ustar00rootroot00000000000000// 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) assertNilError(t, 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-60.0.0/github/admin.go000066400000000000000000000103721457013574700164030ustar00rootroot00000000000000// 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/rest/enterprise-admin 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/enterprise-server@3.11/rest/enterprise-admin/ldap#update-ldap-mapping-for-a-user // //meta:operation PATCH /admin/ldap/users/{username}/mapping 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/enterprise-server@3.11/rest/enterprise-admin/ldap#update-ldap-mapping-for-a-team // //meta:operation PATCH /admin/ldap/teams/{team_id}/mapping 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-60.0.0/github/admin_orgs.go000066400000000000000000000053551457013574700174420ustar00rootroot00000000000000// 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 API docs: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/orgs#create-an-organization // //meta:operation POST /admin/organizations 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 API docs: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/orgs#update-an-organization-name // //meta:operation PATCH /admin/organizations/{org} 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 API docs: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/orgs#update-an-organization-name // //meta:operation PATCH /admin/organizations/{org} 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-60.0.0/github/admin_orgs_test.go000066400000000000000000000120441457013574700204720ustar00rootroot00000000000000// 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) assertNilError(t, 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) assertNilError(t, 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) assertNilError(t, 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-60.0.0/github/admin_stats.go000066400000000000000000000122651457013574700176240ustar00rootroot00000000000000// 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" ) // 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/enterprise-server@3.11/rest/enterprise-admin/admin-stats#get-all-statistics // //meta:operation GET /enterprise/stats/all func (s *AdminService) GetAdminStats(ctx context.Context) (*AdminStats, *Response, error) { u := "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-60.0.0/github/admin_stats_test.go000066400000000000000000000274771457013574700206760ustar00rootroot00000000000000package 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-60.0.0/github/admin_test.go000066400000000000000000000164521457013574700174470ustar00rootroot00000000000000// 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) assertNilError(t, 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) assertNilError(t, 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-60.0.0/github/admin_users.go000066400000000000000000000100171457013574700176200ustar00rootroot00000000000000// 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 represents the fields sent to the `CreateUser` endpoint. // Note that `Login` is a required field. type CreateUserRequest struct { Login string `json:"login"` Email *string `json:"email,omitempty"` Suspended *bool `json:"suspended,omitempty"` } // CreateUser creates a new user in GitHub Enterprise. // // GitHub API docs: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#create-a-user // //meta:operation POST /admin/users func (s *AdminService) CreateUser(ctx context.Context, userReq CreateUserRequest) (*User, *Response, error) { u := "admin/users" 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 API docs: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#delete-a-user // //meta:operation DELETE /admin/users/{username} 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 API docs: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#create-an-impersonation-oauth-token // //meta:operation POST /admin/users/{username}/authorizations 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 API docs: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#delete-an-impersonation-oauth-token // //meta:operation DELETE /admin/users/{username}/authorizations 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-60.0.0/github/admin_users_test.go000066400000000000000000000155111457013574700206630ustar00rootroot00000000000000// 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) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "POST") want := &CreateUserRequest{Login: "github", Email: String("email@domain.com"), Suspended: Bool(false)} 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, CreateUserRequest{ Login: "github", Email: String("email@domain.com"), Suspended: Bool(false), }) 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, CreateUserRequest{ Login: "github", Email: String("email@domain.com"), Suspended: Bool(false), }) 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/rest/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/rest/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: "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-60.0.0/github/apps.go000066400000000000000000000411451457013574700162600ustar00rootroot00000000000000// 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" ) // AppsService provides access to the installation related functions // in the GitHub API. // // GitHub API docs: https://docs.github.com/rest/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"` InstallationsCount *int `json:"installations_count,omitempty"` } // InstallationToken represents an installation token. type InstallationToken struct { Token *string `json:"token,omitempty"` ExpiresAt *Timestamp `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 names of the repositories that the installation token can access. // Providing repository names restricts the access of an installation token to specific repositories. Repositories []string `json:"repositories,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/enterprise-server@3.0/rest/apps#create-an-installation-access-token-for-an-app // https://docs.github.com/rest/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"` OrganizationCustomRoles *string `json:"organization_custom_roles,omitempty"` OrganizationHooks *string `json:"organization_hooks,omitempty"` OrganizationPackages *string `json:"organization_packages,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"` } // InstallationRequest represents a pending GitHub App installation request. type InstallationRequest struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Account *User `json:"account,omitempty"` Requester *User `json:"requester,omitempty"` CreatedAt *Timestamp `json:"created_at,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/rest/apps/apps#get-an-app // GitHub API docs: https://docs.github.com/rest/apps/apps#get-the-authenticated-app // //meta:operation GET /app //meta:operation GET /apps/{app_slug} 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 } // ListInstallationRequests lists the pending installation requests that the current GitHub App has. // // GitHub API docs: https://docs.github.com/rest/apps/apps#list-installation-requests-for-the-authenticated-app // //meta:operation GET /app/installation-requests func (s *AppsService) ListInstallationRequests(ctx context.Context, opts *ListOptions) ([]*InstallationRequest, *Response, error) { u, err := addOptions("app/installation-requests", 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 []*InstallationRequest resp, err := s.client.Do(ctx, req, &i) if err != nil { return nil, resp, err } return i, resp, nil } // ListInstallations lists the installations that the current GitHub App has. // // GitHub API docs: https://docs.github.com/rest/apps/apps#list-installations-for-the-authenticated-app // //meta:operation GET /app/installations 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/rest/apps/apps#get-an-installation-for-the-authenticated-app // //meta:operation GET /app/installations/{installation_id} 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/rest/apps/installations#list-app-installations-accessible-to-the-user-access-token // //meta:operation GET /user/installations 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/rest/apps/apps#suspend-an-app-installation // //meta:operation PUT /app/installations/{installation_id}/suspended 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/rest/apps/apps#unsuspend-an-app-installation // //meta:operation DELETE /app/installations/{installation_id}/suspended 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/rest/apps/apps#delete-an-installation-for-the-authenticated-app // //meta:operation DELETE /app/installations/{installation_id} 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/rest/apps/apps#create-an-installation-access-token-for-an-app // //meta:operation POST /app/installations/{installation_id}/access_tokens 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/enterprise-server@3.3/rest/reference/apps#create-a-content-attachment // //meta:operation POST /repos/{owner}/{repo}/content_references/{content_reference_id}/attachments 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/rest/apps/apps#get-an-organization-installation-for-the-authenticated-app // //meta:operation GET /orgs/{org}/installation 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/rest/apps/apps#get-a-repository-installation-for-the-authenticated-app // //meta:operation GET /repos/{owner}/{repo}/installation 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 "GET /repositories/{repository_id}/installation". // //meta:operation GET /repositories/{repository_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/rest/apps/apps#get-a-user-installation-for-the-authenticated-app // //meta:operation GET /users/{username}/installation 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-60.0.0/github/apps_hooks.go000066400000000000000000000026761457013574700174710ustar00rootroot00000000000000// 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" ) // GetHookConfig returns the webhook configuration for a GitHub App. // The underlying transport must be authenticated as an app. // // GitHub API docs: https://docs.github.com/rest/apps/webhooks#get-a-webhook-configuration-for-an-app // //meta:operation GET /app/hook/config func (s *AppsService) GetHookConfig(ctx context.Context) (*HookConfig, *Response, error) { req, err := s.client.NewRequest("GET", "app/hook/config", nil) if err != nil { return nil, nil, err } config := new(HookConfig) resp, err := s.client.Do(ctx, req, &config) if err != nil { return nil, resp, err } return config, resp, nil } // UpdateHookConfig updates the webhook configuration for a GitHub App. // The underlying transport must be authenticated as an app. // // GitHub API docs: https://docs.github.com/rest/apps/webhooks#update-a-webhook-configuration-for-an-app // //meta:operation PATCH /app/hook/config func (s *AppsService) UpdateHookConfig(ctx context.Context, config *HookConfig) (*HookConfig, *Response, error) { req, err := s.client.NewRequest("PATCH", "app/hook/config", config) if err != nil { return nil, nil, err } c := new(HookConfig) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } go-github-60.0.0/github/apps_hooks_deliveries.go000066400000000000000000000041711457013574700216740ustar00rootroot00000000000000// 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 deliveries of an App webhook. // // GitHub API docs: https://docs.github.com/rest/apps/webhooks#list-deliveries-for-an-app-webhook // //meta:operation GET /app/hook/deliveries func (s *AppsService) ListHookDeliveries(ctx context.Context, opts *ListCursorOptions) ([]*HookDelivery, *Response, error) { u, err := addOptions("app/hook/deliveries", 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 the App webhook delivery with the specified ID. // // GitHub API docs: https://docs.github.com/rest/apps/webhooks#get-a-delivery-for-an-app-webhook // //meta:operation GET /app/hook/deliveries/{delivery_id} func (s *AppsService) GetHookDelivery(ctx context.Context, deliveryID int64) (*HookDelivery, *Response, error) { u := fmt.Sprintf("app/hook/deliveries/%v", 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 } // RedeliverHookDelivery redelivers a delivery for an App webhook. // // GitHub API docs: https://docs.github.com/rest/apps/webhooks#redeliver-a-delivery-for-an-app-webhook // //meta:operation POST /app/hook/deliveries/{delivery_id}/attempts func (s *AppsService) RedeliverHookDelivery(ctx context.Context, deliveryID int64) (*HookDelivery, *Response, error) { u := fmt.Sprintf("app/hook/deliveries/%v/attempts", deliveryID) req, err := s.client.NewRequest("POST", 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-60.0.0/github/apps_hooks_deliveries_test.go000066400000000000000000000063621457013574700227370ustar00rootroot00000000000000// 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 TestAppsService_ListHookDeliveries(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/app/hook/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}]`) }) opts := &ListCursorOptions{Cursor: "v1_12077215967"} ctx := context.Background() deliveries, _, err := client.Apps.ListHookDeliveries(ctx, opts) if err != nil { t.Errorf("Apps.ListHookDeliveries returned error: %v", err) } want := []*HookDelivery{{ID: Int64(1)}, {ID: Int64(2)}} if d := cmp.Diff(deliveries, want); d != "" { t.Errorf("Apps.ListHooks want (-), got (+):\n%s", d) } const methodName = "ListHookDeliveries" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.ListHookDeliveries(ctx, opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_GetHookDelivery(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/app/hook/deliveries/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() hook, _, err := client.Apps.GetHookDelivery(ctx, 1) if err != nil { t.Errorf("Apps.GetHookDelivery returned error: %v", err) } want := &HookDelivery{ID: Int64(1)} if !cmp.Equal(hook, want) { t.Errorf("Apps.GetHookDelivery returned %+v, want %+v", hook, want) } const methodName = "GetHookDelivery" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.GetHookDelivery(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.GetHookDelivery(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_RedeliverHookDelivery(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/app/hook/deliveries/1/attempts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() hook, _, err := client.Apps.RedeliverHookDelivery(ctx, 1) if err != nil { t.Errorf("Apps.RedeliverHookDelivery returned error: %v", err) } want := &HookDelivery{ID: Int64(1)} if !cmp.Equal(hook, want) { t.Errorf("Apps.RedeliverHookDelivery returned %+v, want %+v", hook, want) } const methodName = "RedeliverHookDelivery" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Apps.RedeliverHookDelivery(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.RedeliverHookDelivery(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/apps_hooks_test.go000066400000000000000000000051501457013574700205160ustar00rootroot00000000000000// 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 TestAppsService_GetHookConfig(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/app/hook/config", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "content_type": "json", "insecure_ssl": "0", "secret": "********", "url": "https://example.com/webhook" }`) }) ctx := context.Background() config, _, err := client.Apps.GetHookConfig(ctx) if err != nil { t.Errorf("Apps.GetHookConfig returned error: %v", err) } want := &HookConfig{ ContentType: String("json"), InsecureSSL: String("0"), Secret: String("********"), URL: String("https://example.com/webhook"), } if !cmp.Equal(config, want) { t.Errorf("Apps.GetHookConfig returned %+v, want %+v", config, want) } const methodName = "GetHookConfig" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.GetHookConfig(ctx) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestAppsService_UpdateHookConfig(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &HookConfig{ ContentType: String("json"), InsecureSSL: String("1"), Secret: String("s"), URL: String("u"), } mux.HandleFunc("/app/hook/config", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") testBody(t, r, `{"content_type":"json","insecure_ssl":"1","url":"u","secret":"s"}`+"\n") fmt.Fprint(w, `{ "content_type": "json", "insecure_ssl": "1", "secret": "********", "url": "u" }`) }) ctx := context.Background() config, _, err := client.Apps.UpdateHookConfig(ctx, input) if err != nil { t.Errorf("Apps.UpdateHookConfig returned error: %v", err) } want := &HookConfig{ ContentType: String("json"), InsecureSSL: String("1"), Secret: String("********"), URL: String("u"), } if !cmp.Equal(config, want) { t.Errorf("Apps.UpdateHookConfig returned %+v, want %+v", config, want) } const methodName = "UpdateHookConfig" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.UpdateHookConfig(ctx, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/apps_installation.go000066400000000000000000000101221457013574700210300ustar00rootroot00000000000000// 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/rest/apps/installations#list-repositories-accessible-to-the-app-installation // //meta:operation GET /installation/repositories 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/rest/apps/installations#list-repositories-accessible-to-the-user-access-token // //meta:operation GET /user/installations/{installation_id}/repositories 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/rest/apps/installations#add-a-repository-to-an-app-installation // //meta:operation PUT /user/installations/{installation_id}/repositories/{repository_id} 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/rest/apps/installations#remove-a-repository-from-an-app-installation // //meta:operation DELETE /user/installations/{installation_id}/repositories/{repository_id} 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/rest/apps/installations#revoke-an-installation-access-token // //meta:operation DELETE /installation/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-60.0.0/github/apps_installation_test.go000066400000000000000000000130741457013574700221000ustar00rootroot00000000000000// 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-60.0.0/github/apps_manifest.go000066400000000000000000000032361457013574700201450ustar00rootroot00000000000000// 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/rest/apps/apps#create-a-github-app-from-a-manifest // //meta:operation POST /app-manifests/{code}/conversions 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-60.0.0/github/apps_manifest_test.go000066400000000000000000000065231457013574700212060ustar00rootroot00000000000000// 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-60.0.0/github/apps_marketplace.go000066400000000000000000000176041457013574700206330ustar00rootroot00000000000000// 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/rest/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/rest/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 { Account *MarketplacePurchaseAccount `json:"account,omitempty"` // 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"` } // MarketplacePurchaseAccount represents a GitHub Account (user or organization) for a Purchase. type MarketplacePurchaseAccount 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"` Email *string `json:"email,omitempty"` NodeID *string `json:"node_id,omitempty"` } // ListPlans lists all plans for your Marketplace listing. // // GitHub API docs: https://docs.github.com/rest/apps/marketplace#list-plans // GitHub API docs: https://docs.github.com/rest/apps/marketplace#list-plans-stubbed // //meta:operation GET /marketplace_listing/plans //meta:operation GET /marketplace_listing/stubbed/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/rest/apps/marketplace#list-accounts-for-a-plan // GitHub API docs: https://docs.github.com/rest/apps/marketplace#list-accounts-for-a-plan-stubbed // //meta:operation GET /marketplace_listing/plans/{plan_id}/accounts //meta:operation GET /marketplace_listing/stubbed/plans/{plan_id}/accounts 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/rest/apps/marketplace#get-a-subscription-plan-for-an-account // GitHub API docs: https://docs.github.com/rest/apps/marketplace#get-a-subscription-plan-for-an-account-stubbed // //meta:operation GET /marketplace_listing/accounts/{account_id} //meta:operation GET /marketplace_listing/stubbed/accounts/{account_id} 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/rest/apps/marketplace#list-subscriptions-for-the-authenticated-user // GitHub API docs: https://docs.github.com/rest/apps/marketplace#list-subscriptions-for-the-authenticated-user-stubbed // //meta:operation GET /user/marketplace_purchases //meta:operation GET /user/marketplace_purchases/stubbed 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-60.0.0/github/apps_marketplace_test.go000066400000000000000000000334351457013574700216720ustar00rootroot00000000000000// 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-60.0.0/github/apps_test.go000066400000000000000000001201571457013574700173200ustar00rootroot00000000000000// 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_ListInstallationRequests(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/app/installation-requests", 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, "account": { "id": 2 }, "requester": { "id": 3 }, "created_at": "2018-01-01T00:00:00Z" }]`, ) }) opt := &ListOptions{Page: 1, PerPage: 2} ctx := context.Background() installationRequests, _, err := client.Apps.ListInstallationRequests(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 := []*InstallationRequest{{ ID: Int64(1), Account: &User{ID: Int64(2)}, Requester: &User{ID: Int64(3)}, CreatedAt: &date, }} if !cmp.Equal(installationRequests, want) { t.Errorf("Apps.ListInstallationRequests returned %+v, want %+v", installationRequests, want) } const methodName = "ListInstallationRequests" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Apps.ListInstallationRequests(ctx, opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } 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_custom_roles": "write", "organization_hooks": "write", "organization_packages": "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"), OrganizationCustomRoles: String("write"), OrganizationHooks: String("write"), OrganizationPackages: 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}, Repositories: []string{"foo"}, 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) assertNilError(t, 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) assertWrite(t, w, []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: &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"), }, 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-60.0.0/github/authorizations.go000066400000000000000000000241131457013574700203740ustar00rootroot00000000000000// 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/rest/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/rest/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/rest/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/rest/apps/oauth-applications#check-a-token // //meta:operation POST /applications/{client_id}/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/rest/apps/oauth-applications#reset-a-token // //meta:operation PATCH /applications/{client_id}/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/rest/apps/oauth-applications#delete-an-app-token // //meta:operation DELETE /applications/{client_id}/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/rest/apps/oauth-applications#delete-an-app-authorization // //meta:operation DELETE /applications/{client_id}/grant 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://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#create-an-impersonation-oauth-token // //meta:operation POST /admin/users/{username}/authorizations 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://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#delete-an-impersonation-oauth-token // //meta:operation DELETE /admin/users/{username}/authorizations 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-60.0.0/github/authorizations_test.go000066400000000000000000000233031457013574700214330ustar00rootroot00000000000000// 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-60.0.0/github/billing.go000066400000000000000000000177071457013574700167440ustar00rootroot00000000000000// 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/rest/billing type BillingService service // ActionBilling represents a GitHub Action billing. type ActionBilling struct { TotalMinutesUsed float64 `json:"total_minutes_used"` TotalPaidMinutesUsed float64 `json:"total_paid_minutes_used"` IncludedMinutes float64 `json:"included_minutes"` MinutesUsedBreakdown MinutesUsedBreakdown `json:"minutes_used_breakdown"` } // MinutesUsedBreakdown counts the actions minutes used by machine type (e.g. UBUNTU, WINDOWS, MACOS). type MinutesUsedBreakdown = map[string]int // 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 float64 `json:"included_gigabytes_bandwidth"` } // StorageBilling represents a GitHub Storage billing. type StorageBilling struct { DaysLeftInBillingCycle int `json:"days_left_in_billing_cycle"` EstimatedPaidStorageForMonth float64 `json:"estimated_paid_storage_for_month"` EstimatedStorageForMonth float64 `json:"estimated_storage_for_month"` } // ActiveCommitters represents the total active committers across all repositories in an Organization. type ActiveCommitters struct { TotalAdvancedSecurityCommitters int `json:"total_advanced_security_committers"` Repositories []*RepositoryActiveCommitters `json:"repositories,omitempty"` } // RepositoryActiveCommitters represents active committers on each repository. type RepositoryActiveCommitters struct { Name *string `json:"name,omitempty"` AdvancedSecurityCommitters *int `json:"advanced_security_committers,omitempty"` AdvancedSecurityCommittersBreakdown []*AdvancedSecurityCommittersBreakdown `json:"advanced_security_committers_breakdown,omitempty"` } // AdvancedSecurityCommittersBreakdown represents the user activity breakdown for ActiveCommitters. type AdvancedSecurityCommittersBreakdown struct { UserLogin *string `json:"user_login,omitempty"` LastPushedDate *string `json:"last_pushed_date,omitempty"` } // GetActionsBillingOrg returns the summary of the free and paid GitHub Actions minutes used for an Org. // // GitHub API docs: https://docs.github.com/rest/billing/billing#get-github-actions-billing-for-an-organization // //meta:operation GET /orgs/{org}/settings/billing/actions 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) if err != nil { return nil, resp, err } return actionsOrgBilling, resp, nil } // GetPackagesBillingOrg returns the free and paid storage used for GitHub Packages in gigabytes for an Org. // // GitHub API docs: https://docs.github.com/rest/billing/billing#get-github-packages-billing-for-an-organization // //meta:operation GET /orgs/{org}/settings/billing/packages 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) if err != nil { return nil, resp, err } return packagesOrgBilling, resp, nil } // 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/rest/billing/billing#get-shared-storage-billing-for-an-organization // //meta:operation GET /orgs/{org}/settings/billing/shared-storage 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) if err != nil { return nil, resp, err } return storageOrgBilling, resp, nil } // GetAdvancedSecurityActiveCommittersOrg returns the GitHub Advanced Security active committers for an organization per repository. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/billing#get-github-advanced-security-active-committers-for-an-organization // //meta:operation GET /orgs/{org}/settings/billing/advanced-security func (s *BillingService) GetAdvancedSecurityActiveCommittersOrg(ctx context.Context, org string, opts *ListOptions) (*ActiveCommitters, *Response, error) { u := fmt.Sprintf("orgs/%v/settings/billing/advanced-security", 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 } activeOrgCommitters := new(ActiveCommitters) resp, err := s.client.Do(ctx, req, activeOrgCommitters) if err != nil { return nil, resp, err } return activeOrgCommitters, resp, nil } // GetActionsBillingUser returns the summary of the free and paid GitHub Actions minutes used for a user. // // GitHub API docs: https://docs.github.com/rest/billing/billing#get-github-actions-billing-for-a-user // //meta:operation GET /users/{username}/settings/billing/actions 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) if err != nil { return nil, resp, err } return actionsUserBilling, resp, nil } // GetPackagesBillingUser returns the free and paid storage used for GitHub Packages in gigabytes for a user. // // GitHub API docs: https://docs.github.com/rest/billing/billing#get-github-packages-billing-for-a-user // //meta:operation GET /users/{username}/settings/billing/packages 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) if err != nil { return nil, resp, err } return packagesUserBilling, resp, nil } // 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/rest/billing/billing#get-shared-storage-billing-for-a-user // //meta:operation GET /users/{username}/settings/billing/shared-storage 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) if err != nil { return nil, resp, err } return storageUserBilling, resp, nil } go-github-60.0.0/github/billing_test.go000066400000000000000000000324331457013574700177740ustar00rootroot00000000000000// 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.0, "total_paid_minutes_used": 0.0, "included_minutes": 3000.0, "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.0, TotalPaidMinutesUsed: 0.0, IncludedMinutes: 3000.0, 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 }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Billing.GetActionsBillingOrg(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, 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 }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Billing.GetPackagesBillingOrg(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, 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.25, "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.25, 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 }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Billing.GetStorageBillingOrg(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, 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 }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Billing.GetActionsBillingUser(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, 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 }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Billing.GetPackagesBillingUser(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, 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.25, "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.25, 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 }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Billing.GetStorageBillingUser(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, 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) } func TestBillingService_GetAdvancedSecurityActiveCommittersOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/settings/billing/advanced-security", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "total_advanced_security_committers": 2, "repositories": [ { "name": "octocat-org/Hello-World", "advanced_security_committers": 2, "advanced_security_committers_breakdown": [ { "user_login": "octokitten", "last_pushed_date": "2021-10-25" } ] } ] }`) }) ctx := context.Background() opts := &ListOptions{Page: 2, PerPage: 50} hook, _, err := client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "o", opts) if err != nil { t.Errorf("Billing.GetAdvancedSecurityActiveCommittersOrg returned error: %v", err) } want := &ActiveCommitters{ TotalAdvancedSecurityCommitters: 2, Repositories: []*RepositoryActiveCommitters{ { Name: String("octocat-org/Hello-World"), AdvancedSecurityCommitters: Int(2), AdvancedSecurityCommittersBreakdown: []*AdvancedSecurityCommittersBreakdown{ { UserLogin: String("octokitten"), LastPushedDate: String("2021-10-25"), }, }, }, }, } if !cmp.Equal(hook, want) { t.Errorf("Billing.GetAdvancedSecurityActiveCommittersOrg returned %+v, want %+v", hook, want) } const methodName = "GetAdvancedSecurityActiveCommittersOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "o", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestBillingService_GetAdvancedSecurityActiveCommittersOrg_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Billing.GetAdvancedSecurityActiveCommittersOrg(ctx, "%", nil) testURLParseError(t, err) } go-github-60.0.0/github/checks.go000066400000000000000000000464751457013574700165700ustar00rootroot00000000000000// 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/rest/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/rest/checks/runs#get-a-check-run // //meta:operation GET /repos/{owner}/{repo}/check-runs/{check_run_id} 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 } req.Header.Set("Accept", mediaTypeCheckRunsPreview) 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/rest/checks/suites#get-a-check-suite // //meta:operation GET /repos/{owner}/{repo}/check-suites/{check_suite_id} 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 } req.Header.Set("Accept", mediaTypeCheckRunsPreview) 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/rest/checks/runs#create-a-check-run // //meta:operation POST /repos/{owner}/{repo}/check-runs 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 } req.Header.Set("Accept", mediaTypeCheckRunsPreview) 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/rest/checks/runs#update-a-check-run // //meta:operation PATCH /repos/{owner}/{repo}/check-runs/{check_run_id} 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 } req.Header.Set("Accept", mediaTypeCheckRunsPreview) 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/rest/checks/runs#list-check-run-annotations // //meta:operation GET /repos/{owner}/{repo}/check-runs/{check_run_id}/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 } req.Header.Set("Accept", mediaTypeCheckRunsPreview) 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" AppID *int64 `url:"app_id,omitempty"` // Filters check runs by GitHub App ID. 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/rest/checks/runs#list-check-runs-for-a-git-reference // //meta:operation GET /repos/{owner}/{repo}/commits/{ref}/check-runs 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 } req.Header.Set("Accept", mediaTypeCheckRunsPreview) 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/rest/checks/runs#list-check-runs-in-a-check-suite // //meta:operation GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs 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 } req.Header.Set("Accept", mediaTypeCheckRunsPreview) var checkRunResults *ListCheckRunsResults resp, err := s.client.Do(ctx, req, &checkRunResults) if err != nil { return nil, resp, err } return checkRunResults, resp, nil } // ReRequestCheckRun triggers GitHub to rerequest an existing check run. // // GitHub API docs: https://docs.github.com/rest/checks/runs#rerequest-a-check-run // //meta:operation POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest func (s *ChecksService) ReRequestCheckRun(ctx context.Context, owner, repo string, checkRunID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/check-runs/%v/rerequest", owner, repo, checkRunID) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, err } req.Header.Set("Accept", mediaTypeCheckRunsPreview) return s.client.Do(ctx, req, 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/rest/checks/suites#list-check-suites-for-a-git-reference // //meta:operation GET /repos/{owner}/{repo}/commits/{ref}/check-suites 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 } req.Header.Set("Accept", mediaTypeCheckRunsPreview) 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/rest/checks/suites#update-repository-preferences-for-check-suites // //meta:operation PATCH /repos/{owner}/{repo}/check-suites/preferences 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 } req.Header.Set("Accept", mediaTypeCheckRunsPreview) 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/rest/checks/suites#create-a-check-suite // //meta:operation POST /repos/{owner}/{repo}/check-suites 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 } req.Header.Set("Accept", mediaTypeCheckRunsPreview) 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/rest/checks/suites#rerequest-a-check-suite // //meta:operation POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest 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 } req.Header.Set("Accept", mediaTypeCheckRunsPreview) resp, err := s.client.Do(ctx, req, nil) return resp, err } go-github-60.0.0/github/checks_test.go000066400000000000000000001233641457013574700176200ustar00rootroot00000000000000// 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") testHeader(t, r, "Accept", mediaTypeCheckRunsPreview) 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") testHeader(t, r, "Accept", mediaTypeCheckRunsPreview) 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") testHeader(t, r, "Accept", mediaTypeCheckRunsPreview) 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") testHeader(t, r, "Accept", mediaTypeCheckRunsPreview) 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") testHeader(t, r, "Accept", mediaTypeCheckRunsPreview) 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") testHeader(t, r, "Accept", mediaTypeCheckRunsPreview) testFormValues(t, r, values{ "check_name": "testing", "page": "1", "status": "completed", "filter": "all", "app_id": "1", }) 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", "app": { "id": 1}}]}`, ) }) opt := &ListCheckRunsOptions{ CheckName: String("testing"), Status: String("completed"), Filter: String("all"), AppID: Int64(1), 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"), App: &App{ID: Int64(1)}, }}, } 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") testHeader(t, r, "Accept", mediaTypeCheckRunsPreview) 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") testHeader(t, r, "Accept", mediaTypeCheckRunsPreview) 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") testHeader(t, r, "Accept", mediaTypeCheckRunsPreview) 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") testHeader(t, r, "Accept", mediaTypeCheckRunsPreview) 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") testHeader(t, r, "Accept", mediaTypeCheckRunsPreview) 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) } func TestChecksService_ReRequestCheckRun(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/check-runs/1/rerequest", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeCheckRunsPreview) w.WriteHeader(http.StatusCreated) }) ctx := context.Background() resp, err := client.Checks.ReRequestCheckRun(ctx, "o", "r", 1) if err != nil { t.Errorf("Checks.ReRequestCheckRun return error: %v", err) } if got, want := resp.StatusCode, http.StatusCreated; got != want { t.Errorf("Checks.ReRequestCheckRun = %v, want %v", got, want) } const methodName = "ReRequestCheckRun" testBadOptions(t, methodName, func() (err error) { _, err = client.Checks.ReRequestCheckRun(ctx, "\n", "\n", 1) return err }) } go-github-60.0.0/github/code-scanning.go000066400000000000000000000632301457013574700200240ustar00rootroot00000000000000// 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" "errors" "fmt" "strconv" "strings" ) // CodeScanningService handles communication with the code scanning related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/rest/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"` Category *string `json:"category,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"` HTMLURL *string `json:"html_url,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/rest/code-scanning type Alert struct { Number *int `json:"number,omitempty"` Repository *Repository `json:"repository,omitempty"` 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"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` FixedAt *Timestamp `json:"fixed_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"` Instances []*MostRecentInstance `json:"instances,omitempty"` DismissedBy *User `json:"dismissed_by,omitempty"` DismissedAt *Timestamp `json:"dismissed_at,omitempty"` DismissedReason *string `json:"dismissed_reason,omitempty"` DismissedComment *string `json:"dismissed_comment,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 } // AlertInstancesListOptions specifies optional parameters to the CodeScanningService.ListAlertInstances method. type AlertInstancesListOptions struct { // Return code scanning alert instances for a specific branch reference. // The ref can be formatted as refs/heads/ or simply . To reference a pull request use refs/pull//merge Ref string `url:"ref,omitempty"` ListOptions } // 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 can be formatted as refs/heads/ or simply . To reference a pull request use refs/pull//merge Ref string `url:"ref,omitempty"` // If specified, only code scanning alerts with this severity will be returned. Possible values are: critical, high, medium, low, warning, note, error. Severity string `url:"severity,omitempty"` // The name of a code scanning tool. Only results by this tool will be listed. ToolName string `url:"tool_name,omitempty"` ListCursorOptions // Add ListOptions so offset pagination with integer type "page" query parameter is accepted // since ListCursorOptions accepts "page" as string only. ListOptions } // AnalysesListOptions specifies optional parameters to the CodeScanningService.ListAnalysesForRepo method. type AnalysesListOptions struct { // Return code scanning analyses belonging to the same SARIF upload. SarifID *string `url:"sarif_id,omitempty"` // Return code scanning analyses for a specific branch reference. // The ref can be formatted as refs/heads/ or simply . To reference a pull request use refs/pull//merge Ref *string `url:"ref,omitempty"` ListOptions } // CodeQLDatabase represents a metadata about the CodeQL database. // // GitHub API docs: https://docs.github.com/rest/code-scanning type CodeQLDatabase struct { ID *int64 `json:"id,omitempty"` Name *string `json:"name,omitempty"` Language *string `json:"language,omitempty"` Uploader *User `json:"uploader,omitempty"` ContentType *string `json:"content_type,omitempty"` Size *int64 `json:"size,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` URL *string `json:"url,omitempty"` } // ScanningAnalysis represents an individual GitHub Code Scanning ScanningAnalysis on a single repository. // // GitHub API docs: https://docs.github.com/rest/code-scanning type ScanningAnalysis struct { ID *int64 `json:"id,omitempty"` Ref *string `json:"ref,omitempty"` CommitSHA *string `json:"commit_sha,omitempty"` AnalysisKey *string `json:"analysis_key,omitempty"` Environment *string `json:"environment,omitempty"` Error *string `json:"error,omitempty"` Category *string `json:"category,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` ResultsCount *int `json:"results_count,omitempty"` RulesCount *int `json:"rules_count,omitempty"` URL *string `json:"url,omitempty"` SarifID *string `json:"sarif_id,omitempty"` Tool *Tool `json:"tool,omitempty"` Deletable *bool `json:"deletable,omitempty"` Warning *string `json:"warning,omitempty"` } // SarifAnalysis specifies the results of a code scanning job. // // GitHub API docs: https://docs.github.com/rest/code-scanning type SarifAnalysis struct { CommitSHA *string `json:"commit_sha,omitempty"` Ref *string `json:"ref,omitempty"` Sarif *string `json:"sarif,omitempty"` CheckoutURI *string `json:"checkout_uri,omitempty"` StartedAt *Timestamp `json:"started_at,omitempty"` ToolName *string `json:"tool_name,omitempty"` } // CodeScanningAlertState specifies the state of a code scanning alert. // // GitHub API docs: https://docs.github.com/rest/code-scanning type CodeScanningAlertState struct { // State sets the state of the code scanning alert and is a required field. // You must also provide DismissedReason when you set the state to "dismissed". // State can be one of: "open", "dismissed". State string `json:"state"` // DismissedReason represents the reason for dismissing or closing the alert. // It is required when the state is "dismissed". // It can be one of: "false positive", "won't fix", "used in tests". DismissedReason *string `json:"dismissed_reason,omitempty"` // DismissedComment is associated with the dismissal of the alert. DismissedComment *string `json:"dismissed_comment,omitempty"` } // SarifID identifies a sarif analysis upload. // // GitHub API docs: https://docs.github.com/rest/code-scanning type SarifID struct { ID *string `json:"id,omitempty"` URL *string `json:"url,omitempty"` } // ListAlertsForOrg lists code scanning alerts for an org. // // 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/rest/code-scanning/code-scanning#list-code-scanning-alerts-for-an-organization // //meta:operation GET /orgs/{org}/code-scanning/alerts func (s *CodeScanningService) ListAlertsForOrg(ctx context.Context, org string, opts *AlertListOptions) ([]*Alert, *Response, error) { u := fmt.Sprintf("orgs/%v/code-scanning/alerts", 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 alerts []*Alert resp, err := s.client.Do(ctx, req, &alerts) if err != nil { return nil, resp, err } return alerts, resp, nil } // 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/rest/code-scanning/code-scanning#list-code-scanning-alerts-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/code-scanning/alerts 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/rest/code-scanning/code-scanning#get-a-code-scanning-alert // //meta:operation GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number} 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 } // UpdateAlert updates the state of 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/rest/code-scanning/code-scanning#update-a-code-scanning-alert // //meta:operation PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number} func (s *CodeScanningService) UpdateAlert(ctx context.Context, owner, repo string, id int64, stateInfo *CodeScanningAlertState) (*Alert, *Response, error) { u := fmt.Sprintf("repos/%v/%v/code-scanning/alerts/%v", owner, repo, id) req, err := s.client.NewRequest("PATCH", u, stateInfo) 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 } // ListAlertInstances lists instances of a code scanning alert. // // 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/rest/code-scanning/code-scanning#list-instances-of-a-code-scanning-alert // //meta:operation GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances func (s *CodeScanningService) ListAlertInstances(ctx context.Context, owner, repo string, id int64, opts *AlertInstancesListOptions) ([]*MostRecentInstance, *Response, error) { u := fmt.Sprintf("repos/%v/%v/code-scanning/alerts/%v/instances", 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 alertInstances []*MostRecentInstance resp, err := s.client.Do(ctx, req, &alertInstances) if err != nil { return nil, resp, err } return alertInstances, resp, nil } // UploadSarif uploads the result of code scanning job to GitHub. // // For the parameter sarif, you must first compress your SARIF file using gzip and then translate the contents of the file into a Base64 encoding string. // You must use an access token with the security_events scope to use this endpoint. GitHub Apps must have the security_events // write permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/code-scanning/code-scanning#upload-an-analysis-as-sarif-data // //meta:operation POST /repos/{owner}/{repo}/code-scanning/sarifs func (s *CodeScanningService) UploadSarif(ctx context.Context, owner, repo string, sarif *SarifAnalysis) (*SarifID, *Response, error) { u := fmt.Sprintf("repos/%v/%v/code-scanning/sarifs", owner, repo) req, err := s.client.NewRequest("POST", u, sarif) if err != nil { return nil, nil, err } // This will always return an error without unmarshalling the data resp, err := s.client.Do(ctx, req, nil) // Even though there was an error, we still return the response // in case the caller wants to inspect it further. // However, if the error is AcceptedError, decode it below before // returning from this function and closing the response body. var acceptedError *AcceptedError if !errors.As(err, &acceptedError) { return nil, resp, err } sarifID := new(SarifID) decErr := json.Unmarshal(acceptedError.Raw, sarifID) if decErr != nil { return nil, resp, decErr } return sarifID, resp, nil } // SARIFUpload represents information about a SARIF upload. type SARIFUpload struct { // `pending` files have not yet been processed, while `complete` means results from the SARIF have been stored. // `failed` files have either not been processed at all, or could only be partially processed. ProcessingStatus *string `json:"processing_status,omitempty"` // The REST API URL for getting the analyses associated with the upload. AnalysesURL *string `json:"analyses_url,omitempty"` } // GetSARIF gets information about a SARIF upload. // // 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/rest/code-scanning/code-scanning#get-information-about-a-sarif-upload // //meta:operation GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id} func (s *CodeScanningService) GetSARIF(ctx context.Context, owner, repo, sarifID string) (*SARIFUpload, *Response, error) { u := fmt.Sprintf("repos/%v/%v/code-scanning/sarifs/%v", owner, repo, sarifID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } sarifUpload := new(SARIFUpload) resp, err := s.client.Do(ctx, req, sarifUpload) if err != nil { return nil, resp, err } return sarifUpload, resp, nil } // ListAnalysesForRepo lists code scanning analyses for a repository. // // Lists the details of all code scanning analyses for a repository, starting with the most recent. // 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/rest/code-scanning/code-scanning#list-code-scanning-analyses-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/code-scanning/analyses func (s *CodeScanningService) ListAnalysesForRepo(ctx context.Context, owner, repo string, opts *AnalysesListOptions) ([]*ScanningAnalysis, *Response, error) { u := fmt.Sprintf("repos/%v/%v/code-scanning/analyses", 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 analyses []*ScanningAnalysis resp, err := s.client.Do(ctx, req, &analyses) if err != nil { return nil, resp, err } return analyses, resp, nil } // GetAnalysis gets a single code scanning analysis 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 analysis_id is the ID of the analysis, as returned from the ListAnalysesForRepo operation. // // GitHub API docs: https://docs.github.com/rest/code-scanning/code-scanning#get-a-code-scanning-analysis-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id} func (s *CodeScanningService) GetAnalysis(ctx context.Context, owner, repo string, id int64) (*ScanningAnalysis, *Response, error) { u := fmt.Sprintf("repos/%v/%v/code-scanning/analyses/%v", owner, repo, id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } analysis := new(ScanningAnalysis) resp, err := s.client.Do(ctx, req, analysis) if err != nil { return nil, resp, err } return analysis, resp, nil } // DeleteAnalysis represents a successful deletion of a code scanning analysis. type DeleteAnalysis struct { // Next deletable analysis in chain, without last analysis deletion confirmation NextAnalysisURL *string `json:"next_analysis_url,omitempty"` // Next deletable analysis in chain, with last analysis deletion confirmation ConfirmDeleteURL *string `json:"confirm_delete_url,omitempty"` } // DeleteAnalysis deletes a single code scanning analysis from a repository. // // You must use an access token with the repo scope to use this endpoint. // GitHub Apps must have the security_events read permission to use this endpoint. // // The security analysis_id is the ID of the analysis, as returned from the ListAnalysesForRepo operation. // // GitHub API docs: https://docs.github.com/rest/code-scanning/code-scanning#delete-a-code-scanning-analysis-from-a-repository // //meta:operation DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id} func (s *CodeScanningService) DeleteAnalysis(ctx context.Context, owner, repo string, id int64) (*DeleteAnalysis, *Response, error) { u := fmt.Sprintf("repos/%v/%v/code-scanning/analyses/%v", owner, repo, id) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, nil, err } deleteAnalysis := new(DeleteAnalysis) resp, err := s.client.Do(ctx, req, deleteAnalysis) if err != nil { return nil, resp, err } return deleteAnalysis, resp, nil } // ListCodeQLDatabases lists the CodeQL databases that are available in a repository. // // You must use an access token with the security_events scope to use this endpoint. // GitHub Apps must have the contents read permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/code-scanning/code-scanning#list-codeql-databases-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/code-scanning/codeql/databases func (s *CodeScanningService) ListCodeQLDatabases(ctx context.Context, owner, repo string) ([]*CodeQLDatabase, *Response, error) { u := fmt.Sprintf("repos/%v/%v/code-scanning/codeql/databases", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var codeqlDatabases []*CodeQLDatabase resp, err := s.client.Do(ctx, req, &codeqlDatabases) if err != nil { return nil, resp, err } return codeqlDatabases, resp, nil } // GetCodeQLDatabase gets a CodeQL database for a language in a repository. // // You must use an access token with the security_events scope to use this endpoint. // GitHub Apps must have the contents read permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/code-scanning/code-scanning#get-a-codeql-database-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language} func (s *CodeScanningService) GetCodeQLDatabase(ctx context.Context, owner, repo, language string) (*CodeQLDatabase, *Response, error) { u := fmt.Sprintf("repos/%v/%v/code-scanning/codeql/databases/%v", owner, repo, language) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } codeqlDatabase := new(CodeQLDatabase) resp, err := s.client.Do(ctx, req, codeqlDatabase) if err != nil { return nil, resp, err } return codeqlDatabase, resp, nil } // DefaultSetupConfiguration represents a code scanning default setup configuration. type DefaultSetupConfiguration struct { State *string `json:"state,omitempty"` Languages []string `json:"languages,omitempty"` QuerySuite *string `json:"query_suite,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` } // GetDefaultSetupConfiguration gets a code scanning default setup configuration. // // You must use an access token with the repo scope to use this // endpoint with private repos or the public_repo scope for public repos. GitHub Apps must have the repo write // permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/code-scanning/code-scanning#get-a-code-scanning-default-setup-configuration // //meta:operation GET /repos/{owner}/{repo}/code-scanning/default-setup func (s *CodeScanningService) GetDefaultSetupConfiguration(ctx context.Context, owner, repo string) (*DefaultSetupConfiguration, *Response, error) { u := fmt.Sprintf("repos/%s/%s/code-scanning/default-setup", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } cfg := new(DefaultSetupConfiguration) resp, err := s.client.Do(ctx, req, cfg) if err != nil { return nil, resp, err } return cfg, resp, nil } // UpdateDefaultSetupConfigurationOptions specifies parameters to the CodeScanningService.UpdateDefaultSetupConfiguration // method. type UpdateDefaultSetupConfigurationOptions struct { State string `json:"state"` QuerySuite *string `json:"query_suite,omitempty"` Languages []string `json:"languages,omitempty"` } // UpdateDefaultSetupConfigurationResponse represents a response from updating a code scanning default setup configuration. type UpdateDefaultSetupConfigurationResponse struct { RunID *int64 `json:"run_id,omitempty"` RunURL *string `json:"run_url,omitempty"` } // UpdateDefaultSetupConfiguration updates a code scanning default setup configuration. // // You must use an access token with the repo scope to use this // endpoint with private repos or the public_repo scope for public repos. GitHub Apps must have the repo write // permission to use this endpoint. // // 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. // // GitHub API docs: https://docs.github.com/rest/code-scanning/code-scanning#update-a-code-scanning-default-setup-configuration // //meta:operation PATCH /repos/{owner}/{repo}/code-scanning/default-setup func (s *CodeScanningService) UpdateDefaultSetupConfiguration(ctx context.Context, owner, repo string, options *UpdateDefaultSetupConfigurationOptions) (*UpdateDefaultSetupConfigurationResponse, *Response, error) { u := fmt.Sprintf("repos/%s/%s/code-scanning/default-setup", owner, repo) req, err := s.client.NewRequest("PATCH", u, options) if err != nil { return nil, nil, err } a := new(UpdateDefaultSetupConfigurationResponse) resp, err := s.client.Do(ctx, req, a) if err != nil { return nil, resp, err } return a, resp, nil } go-github-60.0.0/github/code-scanning_test.go000066400000000000000000001426071457013574700210710ustar00rootroot00000000000000// 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 TestCodeScanningService_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 TestCodeScanningService_UploadSarif(t *testing.T) { client, mux, _, teardown := setup() defer teardown() expectedSarifID := &SarifID{ ID: String("testid"), URL: String("https://example.com/testurl"), } mux.HandleFunc("/repos/o/r/code-scanning/sarifs", func(w http.ResponseWriter, r *http.Request) { v := new(SarifAnalysis) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "POST") want := &SarifAnalysis{CommitSHA: String("abc"), Ref: String("ref/head/main"), Sarif: String("abc"), CheckoutURI: String("uri"), StartedAt: &Timestamp{time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)}, ToolName: String("codeql-cli")} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } w.WriteHeader(http.StatusAccepted) respBody, _ := json.Marshal(expectedSarifID) _, _ = w.Write(respBody) }) ctx := context.Background() sarifAnalysis := &SarifAnalysis{CommitSHA: String("abc"), Ref: String("ref/head/main"), Sarif: String("abc"), CheckoutURI: String("uri"), StartedAt: &Timestamp{time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)}, ToolName: String("codeql-cli")} respSarifID, _, err := client.CodeScanning.UploadSarif(ctx, "o", "r", sarifAnalysis) if err != nil { t.Errorf("CodeScanning.UploadSarif returned error: %v", err) } if !cmp.Equal(expectedSarifID, respSarifID) { t.Errorf("Sarif response = %+v, want %+v", respSarifID, expectedSarifID) } const methodName = "UploadSarif" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodeScanning.UploadSarif(ctx, "\n", "\n", sarifAnalysis) return err }) testNewRequestAndDoFailureCategory(t, methodName, client, codeScanningUploadCategory, func() (*Response, error) { _, resp, err := client.CodeScanning.UploadSarif(ctx, "o", "r", sarifAnalysis) return resp, err }) } func TestCodeScanningService_GetSARIF(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/code-scanning/sarifs/abc", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "processing_status": "s", "analyses_url": "u" }`) }) ctx := context.Background() sarifUpload, _, err := client.CodeScanning.GetSARIF(ctx, "o", "r", "abc") if err != nil { t.Errorf("CodeScanning.GetSARIF returned error: %v", err) } want := &SARIFUpload{ ProcessingStatus: String("s"), AnalysesURL: String("u"), } if !cmp.Equal(sarifUpload, want) { t.Errorf("CodeScanning.GetSARIF returned %+v, want %+v", sarifUpload, want) } const methodName = "GetSARIF" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodeScanning.GetSARIF(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodeScanning.GetSARIF(ctx, "o", "r", "abc") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodeScanningService_ListAlertsForOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/code-scanning/alerts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"state": "open", "ref": "heads/master", "severity": "warning", "tool_name": "CodeQL"}) fmt.Fprint(w, `[{ "repository": { "id": 1, "name": "n", "url": "url" }, "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", Severity: "warning", ToolName: "CodeQL"} ctx := context.Background() alerts, _, err := client.CodeScanning.ListAlertsForOrg(ctx, "o", opts) if err != nil { t.Errorf("CodeScanning.ListAlertsForOrg returned error: %v", err) } date := Timestamp{time.Date(2020, time.May, 06, 12, 00, 00, 0, time.UTC)} want := []*Alert{ { Repository: &Repository{ ID: Int64(1), URL: String("url"), Name: String("n"), }, 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.ListAlertsForOrg returned %+v, want %+v", alerts, want) } const methodName = "ListAlertsForOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodeScanning.ListAlertsForOrg(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodeScanning.ListAlertsForOrg(ctx, "o", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodeScanningService_ListAlertsForOrgLisCursorOptions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/code-scanning/alerts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"state": "open", "ref": "heads/master", "severity": "warning", "tool_name": "CodeQL", "per_page": "1", "before": "deadbeefb", "after": "deadbeefa"}) fmt.Fprint(w, `[{ "repository": { "id": 1, "name": "n", "url": "url" }, "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" }]`) }) opts := &AlertListOptions{State: "open", Ref: "heads/master", Severity: "warning", ToolName: "CodeQL", ListCursorOptions: ListCursorOptions{PerPage: 1, Before: "deadbeefb", After: "deadbeefa"}} ctx := context.Background() alerts, _, err := client.CodeScanning.ListAlertsForOrg(ctx, "o", opts) if err != nil { t.Errorf("CodeScanning.ListAlertsForOrg returned error: %v", err) } date := Timestamp{time.Date(2020, time.May, 06, 12, 00, 00, 0, time.UTC)} want := []*Alert{ { Repository: &Repository{ ID: Int64(1), URL: String("url"), Name: String("n"), }, 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"}, }, }, } if !cmp.Equal(alerts, want) { t.Errorf("CodeScanning.ListAlertsForOrg returned %+v, want %+v", alerts, want) } const methodName = "ListAlertsForOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodeScanning.ListAlertsForOrg(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodeScanning.ListAlertsForOrg(ctx, "o", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodeScanningService_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", "severity": "warning", "tool_name": "CodeQL"}) 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", Severity: "warning", ToolName: "CodeQL"} 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 TestCodeScanningService_UpdateAlert(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, "PATCH") 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": "dismissed", "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":"dismissed", "dismissed_reason": "false positive", "dismissed_comment": "This alert is not actually correct as sanitizer is used", "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() dismissedComment := String("This alert is not actually correct as sanitizer is used") dismissedReason := String("false positive") state := String("dismissed") stateInfo := &CodeScanningAlertState{State: *state, DismissedReason: dismissedReason, DismissedComment: dismissedComment} alert, _, err := client.CodeScanning.UpdateAlert(ctx, "o", "r", 88, stateInfo) if err != nil { t.Errorf("CodeScanning.UpdateAlert 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: state, DismissedReason: dismissedReason, DismissedComment: dismissedComment, 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("dismissed"), 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.UpdateAlert returned %+v, want %+v", alert, want) } const methodName = "UpdateAlert" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodeScanning.UpdateAlert(ctx, "\n", "\n", -88, stateInfo) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodeScanning.UpdateAlert(ctx, "o", "r", 88, stateInfo) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodeScanningService_ListAlertInstances(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/code-scanning/alerts/88/instances", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[ { "ref": "refs/heads/main", "analysis_key": ".github/workflows/codeql-analysis.yml:analyze", "environment": "", "category": ".github/workflows/codeql-analysis.yml:analyze", "state": "open", "fixed_at": null, "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" ] } ]`) }) opts := &AlertInstancesListOptions{Ref: "heads/main", ListOptions: ListOptions{Page: 1}} ctx := context.Background() instances, _, err := client.CodeScanning.ListAlertInstances(ctx, "o", "r", 88, opts) if err != nil { t.Errorf("CodeScanning.ListAlertInstances returned error: %v", err) } want := []*MostRecentInstance{ { Ref: String("refs/heads/main"), AnalysisKey: String(".github/workflows/codeql-analysis.yml:analyze"), Category: String(".github/workflows/codeql-analysis.yml:analyze"), Environment: String(""), 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(instances, want) { t.Errorf("CodeScanning.ListAlertInstances returned %+v, want %+v", instances, want) } const methodName = "ListAlertInstances" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodeScanning.ListAlertInstances(ctx, "\n", "\n", -1, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodeScanning.ListAlertInstances(ctx, "o", "r", 88, opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodeScanningService_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 TestLocation_Marshal(t *testing.T) { testJSONMarshal(t, &Location{}, "{}") u := &Location{ Path: String("path"), StartLine: Int(1), EndLine: Int(2), StartColumn: Int(3), EndColumn: Int(4), } want := `{ "path": "path", "start_line": 1, "end_line": 2, "start_column": 3, "end_column": 4 }` testJSONMarshal(t, u, want) } func TestRule_Marshal(t *testing.T) { testJSONMarshal(t, &Rule{}, "{}") u := &Rule{ ID: String("1"), Severity: String("3"), Description: String("description"), Name: String("first"), SecuritySeverityLevel: String("2"), FullDescription: String("summary"), Tags: []string{"tag1", "tag2"}, Help: String("Help Text"), } want := `{ "id": "1", "severity": "3", "description": "description", "name": "first", "security_severity_level": "2", "full_description": "summary", "tags": ["tag1", "tag2"], "help": "Help Text" }` 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) } func TestMessage_Marshal(t *testing.T) { testJSONMarshal(t, &Message{}, "{}") u := &Message{ Text: String("text"), } want := `{ "text": "text" }` testJSONMarshal(t, u, want) } func TestCodeScanningService_ListAnalysesForRepo(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/code-scanning/analyses", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"sarif_id": "8981cd8e-b078-4ac3-a3be-1dad7dbd0b582", "ref": "heads/master"}) fmt.Fprint(w, `[ { "ref": "refs/heads/main", "commit_sha": "d99612c3e1f2970085cfbaeadf8f010ef69bad83", "analysis_key": ".github/workflows/codeql-analysis.yml:analyze", "environment": "{\"language\":\"python\"}", "error": "", "category": ".github/workflows/codeql-analysis.yml:analyze/language:python", "created_at": "2020-08-27T15:05:21Z", "results_count": 17, "rules_count": 49, "id": 201, "url": "https://api.github.com/repos/o/r/code-scanning/analyses/201", "sarif_id": "8981cd8e-b078-4ac3-a3be-1dad7dbd0b582", "tool": { "name": "CodeQL", "guid": null, "version": "2.4.0" }, "deletable": true, "warning": "" }, { "ref": "refs/heads/my-branch", "commit_sha": "c8cff6510d4d084fb1b4aa13b64b97ca12b07321", "analysis_key": ".github/workflows/shiftleft.yml:build", "environment": "{}", "error": "", "category": ".github/workflows/shiftleft.yml:build/", "created_at": "2020-08-27T15:05:21Z", "results_count": 17, "rules_count": 32, "id": 200, "url": "https://api.github.com/repos/o/r/code-scanning/analyses/200", "sarif_id": "8981cd8e-b078-4ac3-a3be-1dad7dbd0b582", "tool": { "name": "Python Security ScanningAnalysis", "guid": null, "version": "1.2.0" }, "deletable": true, "warning": "" } ]`) }) opts := &AnalysesListOptions{SarifID: String("8981cd8e-b078-4ac3-a3be-1dad7dbd0b582"), Ref: String("heads/master")} ctx := context.Background() analyses, _, err := client.CodeScanning.ListAnalysesForRepo(ctx, "o", "r", opts) if err != nil { t.Errorf("CodeScanning.ListAnalysesForRepo returned error: %v", err) } date := &Timestamp{time.Date(2020, time.August, 27, 15, 05, 21, 0, time.UTC)} want := []*ScanningAnalysis{ { ID: Int64(201), Ref: String("refs/heads/main"), CommitSHA: String("d99612c3e1f2970085cfbaeadf8f010ef69bad83"), AnalysisKey: String(".github/workflows/codeql-analysis.yml:analyze"), Environment: String("{\"language\":\"python\"}"), Error: String(""), Category: String(".github/workflows/codeql-analysis.yml:analyze/language:python"), CreatedAt: date, ResultsCount: Int(17), RulesCount: Int(49), URL: String("https://api.github.com/repos/o/r/code-scanning/analyses/201"), SarifID: String("8981cd8e-b078-4ac3-a3be-1dad7dbd0b582"), Tool: &Tool{ Name: String("CodeQL"), GUID: nil, Version: String("2.4.0"), }, Deletable: Bool(true), Warning: String(""), }, { ID: Int64(200), Ref: String("refs/heads/my-branch"), CommitSHA: String("c8cff6510d4d084fb1b4aa13b64b97ca12b07321"), AnalysisKey: String(".github/workflows/shiftleft.yml:build"), Environment: String("{}"), Error: String(""), Category: String(".github/workflows/shiftleft.yml:build/"), CreatedAt: date, ResultsCount: Int(17), RulesCount: Int(32), URL: String("https://api.github.com/repos/o/r/code-scanning/analyses/200"), SarifID: String("8981cd8e-b078-4ac3-a3be-1dad7dbd0b582"), Tool: &Tool{ Name: String("Python Security ScanningAnalysis"), GUID: nil, Version: String("1.2.0"), }, Deletable: Bool(true), Warning: String(""), }, } if !cmp.Equal(analyses, want) { t.Errorf("CodeScanning.ListAnalysesForRepo returned %+v, want %+v", analyses, want) } const methodName = "ListAnalysesForRepo" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodeScanning.ListAnalysesForRepo(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodeScanning.ListAnalysesForRepo(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodeScanningService_GetAnalysis(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/code-scanning/analyses/3602840", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "ref": "refs/heads/main", "commit_sha": "c18c69115654ff0166991962832dc2bd7756e655", "analysis_key": ".github/workflows/codeql-analysis.yml:analyze", "environment": "{\"language\":\"javascript\"}", "error": "", "category": ".github/workflows/codeql-analysis.yml:analyze/language:javascript", "created_at": "2021-01-13T11:55:49Z", "results_count": 3, "rules_count": 67, "id": 3602840, "url": "https://api.github.com/repos/o/r/code-scanning/analyses/201", "sarif_id": "47177e22-5596-11eb-80a1-c1e54ef945c6", "tool": { "name": "CodeQL", "guid": null, "version": "2.4.0" }, "deletable": true, "warning": "" }`) }) ctx := context.Background() analysis, _, err := client.CodeScanning.GetAnalysis(ctx, "o", "r", 3602840) if err != nil { t.Errorf("CodeScanning.GetAnalysis returned error: %v", err) } date := &Timestamp{time.Date(2021, time.January, 13, 11, 55, 49, 0, time.UTC)} want := &ScanningAnalysis{ ID: Int64(3602840), Ref: String("refs/heads/main"), CommitSHA: String("c18c69115654ff0166991962832dc2bd7756e655"), AnalysisKey: String(".github/workflows/codeql-analysis.yml:analyze"), Environment: String("{\"language\":\"javascript\"}"), Error: String(""), Category: String(".github/workflows/codeql-analysis.yml:analyze/language:javascript"), CreatedAt: date, ResultsCount: Int(3), RulesCount: Int(67), URL: String("https://api.github.com/repos/o/r/code-scanning/analyses/201"), SarifID: String("47177e22-5596-11eb-80a1-c1e54ef945c6"), Tool: &Tool{ Name: String("CodeQL"), GUID: nil, Version: String("2.4.0"), }, Deletable: Bool(true), Warning: String(""), } if !cmp.Equal(analysis, want) { t.Errorf("CodeScanning.GetAnalysis returned %+v, want %+v", analysis, want) } const methodName = "GetAnalysis" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodeScanning.GetAnalysis(ctx, "\n", "\n", -123) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodeScanning.GetAnalysis(ctx, "o", "r", 3602840) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodeScanningService_DeleteAnalysis(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/code-scanning/analyses/40", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") fmt.Fprint(w, `{ "next_analysis_url": "a", "confirm_delete_url": "b" }`) }) ctx := context.Background() analysis, _, err := client.CodeScanning.DeleteAnalysis(ctx, "o", "r", 40) if err != nil { t.Errorf("CodeScanning.DeleteAnalysis returned error: %v", err) } want := &DeleteAnalysis{ NextAnalysisURL: String("a"), ConfirmDeleteURL: String("b"), } if !cmp.Equal(analysis, want) { t.Errorf("CodeScanning.DeleteAnalysis returned %+v, want %+v", analysis, want) } const methodName = "DeleteAnalysis" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodeScanning.DeleteAnalysis(ctx, "\n", "\n", -123) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodeScanning.DeleteAnalysis(ctx, "o", "r", 40) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodeScanningService_ListCodeQLDatabases(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/code-scanning/codeql/databases", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[ { "id": 1, "name": "name", "language": "language", "uploader": { "login": "a", "id": 1, "node_id": "b", "avatar_url": "c", "gravatar_id": "d", "url": "e", "html_url": "f", "followers_url": "g", "following_url": "h", "gists_url": "i", "starred_url": "j", "subscriptions_url": "k", "organizations_url": "l", "repos_url": "m", "events_url": "n", "received_events_url": "o", "type": "p", "site_admin": false }, "content_type": "r", "size": 1024, "created_at": "2021-01-13T11:55:49Z", "updated_at": "2021-01-13T11:55:49Z", "url": "s" } ]`) }) ctx := context.Background() databases, _, err := client.CodeScanning.ListCodeQLDatabases(ctx, "o", "r") if err != nil { t.Errorf("CodeScanning.ListCodeQLDatabases returned error: %v", err) } date := &Timestamp{time.Date(2021, time.January, 13, 11, 55, 49, 0, time.UTC)} want := []*CodeQLDatabase{ { ID: Int64(1), Name: String("name"), Language: String("language"), Uploader: &User{ Login: String("a"), ID: Int64(1), NodeID: String("b"), AvatarURL: String("c"), GravatarID: String("d"), URL: String("e"), HTMLURL: String("f"), FollowersURL: String("g"), FollowingURL: String("h"), GistsURL: String("i"), StarredURL: String("j"), SubscriptionsURL: String("k"), OrganizationsURL: String("l"), ReposURL: String("m"), EventsURL: String("n"), ReceivedEventsURL: String("o"), Type: String("p"), SiteAdmin: Bool(false), }, ContentType: String("r"), Size: Int64(1024), CreatedAt: date, UpdatedAt: date, URL: String("s"), }, } if !cmp.Equal(databases, want) { t.Errorf("CodeScanning.ListCodeQLDatabases returned %+v, want %+v", databases, want) } const methodName = "ListCodeQLDatabases" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodeScanning.ListCodeQLDatabases(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodeScanning.ListCodeQLDatabases(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodeScanningService_GetCodeQLDatabase(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/code-scanning/codeql/databases/lang", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "id": 1, "name": "name", "language": "language", "uploader": { "login": "a", "id": 1, "node_id": "b", "avatar_url": "c", "gravatar_id": "d", "url": "e", "html_url": "f", "followers_url": "g", "following_url": "h", "gists_url": "i", "starred_url": "j", "subscriptions_url": "k", "organizations_url": "l", "repos_url": "m", "events_url": "n", "received_events_url": "o", "type": "p", "site_admin": false }, "content_type": "r", "size": 1024, "created_at": "2021-01-13T11:55:49Z", "updated_at": "2021-01-13T11:55:49Z", "url": "s" }`) }) ctx := context.Background() database, _, err := client.CodeScanning.GetCodeQLDatabase(ctx, "o", "r", "lang") if err != nil { t.Errorf("CodeScanning.GetCodeQLDatabase returned error: %v", err) } date := &Timestamp{time.Date(2021, time.January, 13, 11, 55, 49, 0, time.UTC)} want := &CodeQLDatabase{ ID: Int64(1), Name: String("name"), Language: String("language"), Uploader: &User{ Login: String("a"), ID: Int64(1), NodeID: String("b"), AvatarURL: String("c"), GravatarID: String("d"), URL: String("e"), HTMLURL: String("f"), FollowersURL: String("g"), FollowingURL: String("h"), GistsURL: String("i"), StarredURL: String("j"), SubscriptionsURL: String("k"), OrganizationsURL: String("l"), ReposURL: String("m"), EventsURL: String("n"), ReceivedEventsURL: String("o"), Type: String("p"), SiteAdmin: Bool(false), }, ContentType: String("r"), Size: Int64(1024), CreatedAt: date, UpdatedAt: date, URL: String("s"), } if !cmp.Equal(database, want) { t.Errorf("CodeScanning.GetCodeQLDatabase returned %+v, want %+v", database, want) } const methodName = "GetCodeQLDatabase" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodeScanning.GetCodeQLDatabase(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodeScanning.GetCodeQLDatabase(ctx, "o", "r", "lang") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodeScanningService_GetDefaultSetupConfiguration(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/code-scanning/default-setup", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") _, err := fmt.Fprint(w, `{ "state": "configured", "languages": [ "javascript", "javascript-typescript", "typescript" ], "query_suite": "default", "updated_at": "2006-01-02T15:04:05Z" }`) if err != nil { t.Fatal(err) } }) ctx := context.Background() cfg, _, err := client.CodeScanning.GetDefaultSetupConfiguration(ctx, "o", "r") if err != nil { t.Errorf("CodeScanning.GetDefaultSetupConfiguration returned error: %v", err) } date := &Timestamp{time.Date(2006, time.January, 02, 15, 04, 05, 0, time.UTC)} want := &DefaultSetupConfiguration{ State: String("configured"), Languages: []string{"javascript", "javascript-typescript", "typescript"}, QuerySuite: String("default"), UpdatedAt: date, } if !cmp.Equal(cfg, want) { t.Errorf("CodeScanning.GetDefaultSetupConfiguration returned %+v, want %+v", cfg, want) } const methodName = "GetDefaultSetupConfiguration" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodeScanning.GetDefaultSetupConfiguration(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodeScanning.GetDefaultSetupConfiguration(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodeScanningService_UpdateDefaultSetupConfiguration(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/code-scanning/default-setup", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") _, err := fmt.Fprint(w, `{ "run_id": 5301214200, "run_url": "https://api.github.com/repos/o/r/actions/runs/5301214200" }`) if err != nil { t.Fatal(err) } }) ctx := context.Background() options := &UpdateDefaultSetupConfigurationOptions{ State: "configured", Languages: []string{"go"}, QuerySuite: String("default"), } got, _, err := client.CodeScanning.UpdateDefaultSetupConfiguration(ctx, "o", "r", options) if err != nil { t.Errorf("CodeScanning.UpdateDefaultSetupConfiguration returned error: %v", err) } want := &UpdateDefaultSetupConfigurationResponse{ RunID: Int64(5301214200), RunURL: String("https://api.github.com/repos/o/r/actions/runs/5301214200"), } if !cmp.Equal(got, want) { t.Errorf("CodeScanning.UpdateDefaultSetupConfiguration returned %+v, want %+v", got, want) } const methodName = "UpdateDefaultSetupConfiguration" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodeScanning.UpdateDefaultSetupConfiguration(ctx, "\n", "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodeScanning.UpdateDefaultSetupConfiguration(ctx, "o", "r", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/codesofconduct.go000066400000000000000000000047261457013574700203230ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // CodesOfConductService provides access to code-of-conduct-related functions in the GitHub API. type CodesOfConductService service // 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) } // List returns all codes of conduct. // // GitHub API docs: https://docs.github.com/rest/codes-of-conduct/codes-of-conduct#get-all-codes-of-conduct // //meta:operation GET /codes_of_conduct func (s *CodesOfConductService) List(ctx context.Context) ([]*CodeOfConduct, *Response, error) { req, err := s.client.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 := s.client.Do(ctx, req, &cs) if err != nil { return nil, resp, err } return cs, resp, nil } // ListCodesOfConduct returns all codes of conduct. // // Deprecated: Use CodesOfConductService.List instead func (c *Client) ListCodesOfConduct(ctx context.Context) ([]*CodeOfConduct, *Response, error) { return c.CodesOfConduct.List(ctx) } // Get returns an individual code of conduct. // // GitHub API docs: https://docs.github.com/rest/codes-of-conduct/codes-of-conduct#get-a-code-of-conduct // //meta:operation GET /codes_of_conduct/{key} func (s *CodesOfConductService) Get(ctx context.Context, key string) (*CodeOfConduct, *Response, error) { u := fmt.Sprintf("codes_of_conduct/%s", key) 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 } // GetCodeOfConduct returns an individual code of conduct. // // Deprecated: Use CodesOfConductService.Get instead func (c *Client) GetCodeOfConduct(ctx context.Context, key string) (*CodeOfConduct, *Response, error) { return c.CodesOfConduct.Get(ctx, key) } go-github-60.0.0/github/codesofconduct_test.go000066400000000000000000000051361457013574700213560ustar00rootroot00000000000000// Copyright 2023 The go-github 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 TestCodesOfConductService_List(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) assertNilError(t, err) want := []*CodeOfConduct{ { Key: String("key"), Name: String("name"), URL: String("url"), }} if !cmp.Equal(want, cs) { t.Errorf("returned %+v, want %+v", cs, want) } const methodName = "List" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodesOfConduct.List(ctx) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodesOfConductService_Get(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") assertNilError(t, err) want := &CodeOfConduct{ Key: String("key"), Name: String("name"), URL: String("url"), Body: String("body"), } if !cmp.Equal(want, coc) { t.Errorf("returned %+v, want %+v", coc, want) } const methodName = "Get" testBadOptions(t, methodName, func() (err error) { _, _, err = client.CodesOfConduct.Get(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.CodesOfConduct.Get(ctx, "k") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } 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) } go-github-60.0.0/github/codespaces.go000066400000000000000000000264601457013574700174310ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // CodespacesService handles communication with the Codespaces related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/rest/codespaces/ type CodespacesService service // Codespace represents a codespace. // // GitHub API docs: https://docs.github.com/rest/codespaces type Codespace struct { ID *int64 `json:"id,omitempty"` Name *string `json:"name,omitempty"` DisplayName *string `json:"display_name,omitempty"` EnvironmentID *string `json:"environment_id,omitempty"` Owner *User `json:"owner,omitempty"` BillableOwner *User `json:"billable_owner,omitempty"` Repository *Repository `json:"repository,omitempty"` Machine *CodespacesMachine `json:"machine,omitempty"` DevcontainerPath *string `json:"devcontainer_path,omitempty"` Prebuild *bool `json:"prebuild,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` LastUsedAt *Timestamp `json:"last_used_at,omitempty"` State *string `json:"state,omitempty"` URL *string `json:"url,omitempty"` GitStatus *CodespacesGitStatus `json:"git_status,omitempty"` Location *string `json:"location,omitempty"` IdleTimeoutMinutes *int `json:"idle_timeout_minutes,omitempty"` WebURL *string `json:"web_url,omitempty"` MachinesURL *string `json:"machines_url,omitempty"` StartURL *string `json:"start_url,omitempty"` StopURL *string `json:"stop_url,omitempty"` PullsURL *string `json:"pulls_url,omitempty"` RecentFolders []string `json:"recent_folders,omitempty"` RuntimeConstraints *CodespacesRuntimeConstraints `json:"runtime_constraints,omitempty"` PendingOperation *bool `json:"pending_operation,omitempty"` PendingOperationDisabledReason *string `json:"pending_operation_disabled_reason,omitempty"` IdleTimeoutNotice *string `json:"idle_timeout_notice,omitempty"` RetentionPeriodMinutes *int `json:"retention_period_minutes,omitempty"` RetentionExpiresAt *Timestamp `json:"retention_expires_at,omitempty"` LastKnownStopNotice *string `json:"last_known_stop_notice,omitempty"` } // CodespacesGitStatus represents the git status of a codespace. type CodespacesGitStatus struct { Ahead *int `json:"ahead,omitempty"` Behind *int `json:"behind,omitempty"` HasUnpushedChanges *bool `json:"has_unpushed_changes,omitempty"` HasUncommittedChanges *bool `json:"has_uncommitted_changes,omitempty"` Ref *string `json:"ref,omitempty"` } // CodespacesMachine represents the machine type of a codespace. type CodespacesMachine struct { Name *string `json:"name,omitempty"` DisplayName *string `json:"display_name,omitempty"` OperatingSystem *string `json:"operating_system,omitempty"` StorageInBytes *int64 `json:"storage_in_bytes,omitempty"` MemoryInBytes *int64 `json:"memory_in_bytes,omitempty"` CPUs *int `json:"cpus,omitempty"` PrebuildAvailability *string `json:"prebuild_availability,omitempty"` } // CodespacesRuntimeConstraints represents the runtime constraints of a codespace. type CodespacesRuntimeConstraints struct { AllowedPortPrivacySettings []string `json:"allowed_port_privacy_settings,omitempty"` } // ListCodespaces represents the response from the list codespaces endpoints. type ListCodespaces struct { TotalCount *int `json:"total_count,omitempty"` Codespaces []*Codespace `json:"codespaces"` } // ListInRepo lists codespaces for a user in a repository. // // Lists the codespaces associated with a specified repository and the authenticated user. // You must authenticate using an access token with the codespace scope to use this endpoint. // GitHub Apps must have read access to the codespaces repository permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/codespaces#list-codespaces-in-a-repository-for-the-authenticated-user // //meta:operation GET /repos/{owner}/{repo}/codespaces func (s *CodespacesService) ListInRepo(ctx context.Context, owner, repo string, opts *ListOptions) (*ListCodespaces, *Response, error) { u := fmt.Sprintf("repos/%v/%v/codespaces", 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 codespaces *ListCodespaces resp, err := s.client.Do(ctx, req, &codespaces) if err != nil { return nil, resp, err } return codespaces, resp, nil } // ListCodespacesOptions represents the options for listing codespaces for a user. type ListCodespacesOptions struct { ListOptions RepositoryID int64 `url:"repository_id,omitempty"` } // List lists codespaces for an authenticated user. // // Lists the authenticated user's codespaces. // You must authenticate using an access token with the codespace scope to use this endpoint. // GitHub Apps must have read access to the codespaces repository permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/codespaces#list-codespaces-for-the-authenticated-user // //meta:operation GET /user/codespaces func (s *CodespacesService) List(ctx context.Context, opts *ListCodespacesOptions) (*ListCodespaces, *Response, error) { u := "user/codespaces" 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 codespaces *ListCodespaces resp, err := s.client.Do(ctx, req, &codespaces) if err != nil { return nil, resp, err } return codespaces, resp, nil } // CreateCodespaceOptions represents options for the creation of a codespace in a repository. type CreateCodespaceOptions struct { Ref *string `json:"ref,omitempty"` // Geo represents the geographic area for this codespace. // If not specified, the value is assigned by IP. // This property replaces location, which is being deprecated. // Geo can be one of: `EuropeWest`, `SoutheastAsia`, `UsEast`, `UsWest`. Geo *string `json:"geo,omitempty"` ClientIP *string `json:"client_ip,omitempty"` Machine *string `json:"machine,omitempty"` DevcontainerPath *string `json:"devcontainer_path,omitempty"` MultiRepoPermissionsOptOut *bool `json:"multi_repo_permissions_opt_out,omitempty"` WorkingDirectory *string `json:"working_directory,omitempty"` IdleTimeoutMinutes *int `json:"idle_timeout_minutes,omitempty"` DisplayName *string `json:"display_name,omitempty"` // RetentionPeriodMinutes represents the duration in minutes after codespace has gone idle in which it will be deleted. // Must be integer minutes between 0 and 43200 (30 days). RetentionPeriodMinutes *int `json:"retention_period_minutes,omitempty"` } // CreateInRepo creates a codespace in a repository. // // Creates a codespace owned by the authenticated user in the specified repository. // You must authenticate using an access token with the codespace scope to use this endpoint. // GitHub Apps must have write access to the codespaces repository permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/codespaces#create-a-codespace-in-a-repository // //meta:operation POST /repos/{owner}/{repo}/codespaces func (s *CodespacesService) CreateInRepo(ctx context.Context, owner, repo string, request *CreateCodespaceOptions) (*Codespace, *Response, error) { u := fmt.Sprintf("repos/%v/%v/codespaces", owner, repo) req, err := s.client.NewRequest("POST", u, request) if err != nil { return nil, nil, err } var codespace *Codespace resp, err := s.client.Do(ctx, req, &codespace) if err != nil { return nil, resp, err } return codespace, resp, nil } // Start starts a codespace. // // You must authenticate using an access token with the codespace scope to use this endpoint. // GitHub Apps must have write access to the codespaces_lifecycle_admin repository permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/codespaces#start-a-codespace-for-the-authenticated-user // //meta:operation POST /user/codespaces/{codespace_name}/start func (s *CodespacesService) Start(ctx context.Context, codespaceName string) (*Codespace, *Response, error) { u := fmt.Sprintf("user/codespaces/%v/start", codespaceName) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, nil, err } var codespace *Codespace resp, err := s.client.Do(ctx, req, &codespace) if err != nil { return nil, resp, err } return codespace, resp, nil } // Stop stops a codespace. // // You must authenticate using an access token with the codespace scope to use this endpoint. // GitHub Apps must have write access to the codespaces_lifecycle_admin repository permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/codespaces#stop-a-codespace-for-the-authenticated-user // //meta:operation POST /user/codespaces/{codespace_name}/stop func (s *CodespacesService) Stop(ctx context.Context, codespaceName string) (*Codespace, *Response, error) { u := fmt.Sprintf("user/codespaces/%v/stop", codespaceName) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, nil, err } var codespace *Codespace resp, err := s.client.Do(ctx, req, &codespace) if err != nil { return nil, resp, err } return codespace, resp, nil } // Delete deletes a codespace. // // You must authenticate using an access token with the codespace scope to use this endpoint. // GitHub Apps must have write access to the codespaces repository permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/codespaces#delete-a-codespace-for-the-authenticated-user // //meta:operation DELETE /user/codespaces/{codespace_name} func (s *CodespacesService) Delete(ctx context.Context, codespaceName string) (*Response, error) { u := fmt.Sprintf("user/codespaces/%v", codespaceName) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/codespaces_secrets.go000066400000000000000000000541151457013574700211570ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // ListUserSecrets list all secrets available for a users codespace // // Lists all secrets available for a user's Codespaces without revealing their encrypted values // You must authenticate using an access token with the codespace or codespace:secrets scope to use this endpoint. User must have Codespaces access to use this endpoint // GitHub Apps must have read access to the codespaces_user_secrets user permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/secrets#list-secrets-for-the-authenticated-user // //meta:operation GET /user/codespaces/secrets func (s *CodespacesService) ListUserSecrets(ctx context.Context, opts *ListOptions) (*Secrets, *Response, error) { u, err := addOptions("user/codespaces/secrets", opts) if err != nil { return nil, nil, err } return s.listSecrets(ctx, u) } // ListOrgSecrets list all secrets available to an org // // Lists all Codespaces secrets available at the organization-level without revealing their encrypted values. You must authenticate using an access token with the admin:org scope to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/organization-secrets#list-organization-secrets // //meta:operation GET /orgs/{org}/codespaces/secrets func (s *CodespacesService) ListOrgSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { u := fmt.Sprintf("orgs/%v/codespaces/secrets", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } return s.listSecrets(ctx, u) } // ListRepoSecrets list all secrets available to a repo // // Lists all secrets available in a repository without revealing their encrypted values. You must authenticate using an access token with the repo scope to use this endpoint. GitHub Apps must have write access to the codespaces_secrets repository permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/repository-secrets#list-repository-secrets // //meta:operation GET /repos/{owner}/{repo}/codespaces/secrets func (s *CodespacesService) ListRepoSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { u := fmt.Sprintf("repos/%v/%v/codespaces/secrets", owner, repo) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } return s.listSecrets(ctx, u) } func (s *CodespacesService) listSecrets(ctx context.Context, url string) (*Secrets, *Response, error) { req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } var secrets *Secrets resp, err := s.client.Do(ctx, req, &secrets) if err != nil { return nil, resp, err } return secrets, resp, nil } // GetUserPublicKey gets the users public key for encrypting codespace secrets // // Gets your public key, which you need to encrypt secrets. You need to encrypt a secret before you can create or update secrets. // You must authenticate using an access token with the codespace or codespace:secrets scope to use this endpoint. User must have Codespaces access to use this endpoint. // GitHub Apps must have read access to the codespaces_user_secrets user permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/secrets#get-public-key-for-the-authenticated-user // //meta:operation GET /user/codespaces/secrets/public-key func (s *CodespacesService) GetUserPublicKey(ctx context.Context) (*PublicKey, *Response, error) { return s.getPublicKey(ctx, "user/codespaces/secrets/public-key") } // GetOrgPublicKey gets the org public key for encrypting codespace secrets // // Gets a public key for an organization, which is required in order to encrypt secrets. You need to encrypt the value of a secret before you can create or update secrets. You must authenticate using an access token with the admin:org scope to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/organization-secrets#get-an-organization-public-key // //meta:operation GET /orgs/{org}/codespaces/secrets/public-key func (s *CodespacesService) GetOrgPublicKey(ctx context.Context, org string) (*PublicKey, *Response, error) { return s.getPublicKey(ctx, fmt.Sprintf("orgs/%v/codespaces/secrets/public-key", org)) } // GetRepoPublicKey gets the repo public key for encrypting codespace secrets // // Gets your public key, which you need to encrypt secrets. You need to encrypt a secret before you can create or update secrets. Anyone with read access to the repository can use this endpoint. If the repository is private you must use an access token with the repo scope. GitHub Apps must have write access to the codespaces_secrets repository permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/repository-secrets#get-a-repository-public-key // //meta:operation GET /repos/{owner}/{repo}/codespaces/secrets/public-key func (s *CodespacesService) GetRepoPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { return s.getPublicKey(ctx, fmt.Sprintf("repos/%v/%v/codespaces/secrets/public-key", owner, repo)) } func (s *CodespacesService) getPublicKey(ctx context.Context, url string) (*PublicKey, *Response, error) { req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } var publicKey *PublicKey resp, err := s.client.Do(ctx, req, &publicKey) if err != nil { return nil, resp, err } return publicKey, resp, nil } // GetUserSecret gets a users codespace secret // // Gets a secret available to a user's codespaces without revealing its encrypted value. // You must authenticate using an access token with the codespace or codespace:secrets scope to use this endpoint. User must have Codespaces access to use this endpoint. // GitHub Apps must have read access to the codespaces_user_secrets user permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/secrets#get-a-secret-for-the-authenticated-user // //meta:operation GET /user/codespaces/secrets/{secret_name} func (s *CodespacesService) GetUserSecret(ctx context.Context, name string) (*Secret, *Response, error) { u := fmt.Sprintf("user/codespaces/secrets/%v", name) return s.getSecret(ctx, u) } // GetOrgSecret gets an org codespace secret // // Gets an organization secret without revealing its encrypted value. You must authenticate using an access token with the admin:org scope to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/organization-secrets#get-an-organization-secret // //meta:operation GET /orgs/{org}/codespaces/secrets/{secret_name} func (s *CodespacesService) GetOrgSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { u := fmt.Sprintf("orgs/%v/codespaces/secrets/%v", org, name) return s.getSecret(ctx, u) } // GetRepoSecret gets a repo codespace secret // // Gets a single repository secret without revealing its encrypted value. You must authenticate using an access token with the repo scope to use this endpoint. GitHub Apps must have write access to the codespaces_secrets repository permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/repository-secrets#get-a-repository-secret // //meta:operation GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name} func (s *CodespacesService) GetRepoSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { u := fmt.Sprintf("repos/%v/%v/codespaces/secrets/%v", owner, repo, name) return s.getSecret(ctx, u) } func (s *CodespacesService) getSecret(ctx context.Context, url string) (*Secret, *Response, error) { req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } var secret *Secret resp, err := s.client.Do(ctx, req, &secret) if err != nil { return nil, resp, err } return secret, resp, nil } // CreateOrUpdateUserSecret creates or updates a users codespace secret // // Creates or updates a secret for a user's codespace with an encrypted value. Encrypt your secret using LibSodium. // You must authenticate using an access token with the codespace or codespace:secrets scope to use this endpoint. User must also have Codespaces access to use this endpoint. // GitHub Apps must have write access to the codespaces_user_secrets user permission and codespaces_secrets repository permission on all referenced repositories to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/secrets#create-or-update-a-secret-for-the-authenticated-user // //meta:operation PUT /user/codespaces/secrets/{secret_name} func (s *CodespacesService) CreateOrUpdateUserSecret(ctx context.Context, eSecret *EncryptedSecret) (*Response, error) { u := fmt.Sprintf("user/codespaces/secrets/%v", eSecret.Name) return s.createOrUpdateSecret(ctx, u, eSecret) } // CreateOrUpdateOrgSecret creates or updates an orgs codespace secret // // Creates or updates an organization secret with an encrypted value. Encrypt your secret using LibSodium. You must authenticate using an access token with the admin:org scope to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/organization-secrets#create-or-update-an-organization-secret // //meta:operation PUT /orgs/{org}/codespaces/secrets/{secret_name} func (s *CodespacesService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { u := fmt.Sprintf("orgs/%v/codespaces/secrets/%v", org, eSecret.Name) return s.createOrUpdateSecret(ctx, u, eSecret) } // CreateOrUpdateRepoSecret creates or updates a repos codespace secret // // Creates or updates a repository secret with an encrypted value. Encrypt your secret using LibSodium. You must authenticate using an access token with the repo scope to use this endpoint. GitHub Apps must have write access to the codespaces_secrets repository permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/repository-secrets#create-or-update-a-repository-secret // //meta:operation PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name} func (s *CodespacesService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/codespaces/secrets/%v", owner, repo, eSecret.Name) return s.createOrUpdateSecret(ctx, u, eSecret) } func (s *CodespacesService) createOrUpdateSecret(ctx context.Context, url string, eSecret *EncryptedSecret) (*Response, error) { req, err := s.client.NewRequest("PUT", url, eSecret) if err != nil { return nil, err } resp, err := s.client.Do(ctx, req, nil) if err != nil { return resp, err } return resp, nil } // DeleteUserSecret deletes a users codespace secret // // Deletes a secret from a user's codespaces using the secret name. Deleting the secret will remove access from all codespaces that were allowed to access the secret. // You must authenticate using an access token with the codespace or codespace:secrets scope to use this endpoint. User must have Codespaces access to use this endpoint. // GitHub Apps must have write access to the codespaces_user_secrets user permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/secrets#delete-a-secret-for-the-authenticated-user // //meta:operation DELETE /user/codespaces/secrets/{secret_name} func (s *CodespacesService) DeleteUserSecret(ctx context.Context, name string) (*Response, error) { u := fmt.Sprintf("user/codespaces/secrets/%v", name) return s.deleteSecret(ctx, u) } // DeleteOrgSecret deletes an orgs codespace secret // // Deletes an organization secret using the secret name. You must authenticate using an access token with the admin:org scope to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/organization-secrets#delete-an-organization-secret // //meta:operation DELETE /orgs/{org}/codespaces/secrets/{secret_name} func (s *CodespacesService) DeleteOrgSecret(ctx context.Context, org, name string) (*Response, error) { u := fmt.Sprintf("orgs/%v/codespaces/secrets/%v", org, name) return s.deleteSecret(ctx, u) } // DeleteRepoSecret deletes a repos codespace secret // // Deletes a secret in a repository using the secret name. You must authenticate using an access token with the repo scope to use this endpoint. GitHub Apps must have write access to the codespaces_secrets repository permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/repository-secrets#delete-a-repository-secret // //meta:operation DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name} func (s *CodespacesService) DeleteRepoSecret(ctx context.Context, owner, repo, name string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/codespaces/secrets/%v", owner, repo, name) return s.deleteSecret(ctx, u) } func (s *CodespacesService) deleteSecret(ctx context.Context, url string) (*Response, error) { req, err := s.client.NewRequest("DELETE", url, nil) if err != nil { return nil, err } resp, err := s.client.Do(ctx, req, nil) if err != nil { return resp, err } return resp, nil } // ListSelectedReposForUserSecret lists the repositories that have been granted the ability to use a user's codespace secret. // // You must authenticate using an access token with the codespace or codespace:secrets scope to use this endpoint. User must have Codespaces access to use this endpoint. // GitHub Apps must have read access to the codespaces_user_secrets user permission and write access to the codespaces_secrets repository permission on all referenced repositories to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/secrets#list-selected-repositories-for-a-user-secret // //meta:operation GET /user/codespaces/secrets/{secret_name}/repositories func (s *CodespacesService) ListSelectedReposForUserSecret(ctx context.Context, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { u := fmt.Sprintf("user/codespaces/secrets/%v/repositories", name) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } return s.listSelectedReposForSecret(ctx, u) } // ListSelectedReposForOrgSecret lists the repositories that have been granted the ability to use an organization's codespace secret. // // Lists all repositories that have been selected when the visibility for repository access to a secret is set to selected. You must authenticate using an access token with the admin:org scope to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/organization-secrets#list-selected-repositories-for-an-organization-secret // //meta:operation GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories func (s *CodespacesService) ListSelectedReposForOrgSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { u := fmt.Sprintf("orgs/%v/codespaces/secrets/%v/repositories", org, name) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } return s.listSelectedReposForSecret(ctx, u) } func (s *CodespacesService) listSelectedReposForSecret(ctx context.Context, url string) (*SelectedReposList, *Response, error) { req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } var repositories *SelectedReposList resp, err := s.client.Do(ctx, req, &repositories) if err != nil { return nil, resp, err } return repositories, resp, nil } // SetSelectedReposForUserSecret sets the repositories that have been granted the ability to use a user's codespace secret. // // You must authenticate using an access token with the codespace or codespace:secrets scope to use this endpoint. User must have Codespaces access to use this endpoint. // GitHub Apps must have write access to the codespaces_user_secrets user permission and write access to the codespaces_secrets repository permission on all referenced repositories to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/secrets#set-selected-repositories-for-a-user-secret // //meta:operation PUT /user/codespaces/secrets/{secret_name}/repositories func (s *CodespacesService) SetSelectedReposForUserSecret(ctx context.Context, name string, ids SelectedRepoIDs) (*Response, error) { u := fmt.Sprintf("user/codespaces/secrets/%v/repositories", name) return s.setSelectedRepoForSecret(ctx, u, ids) } // SetSelectedReposForOrgSecret sets the repositories that have been granted the ability to use a user's codespace secret. // // Replaces all repositories for an organization secret when the visibility for repository access is set to selected. The visibility is set when you Create or update an organization secret. You must authenticate using an access token with the admin:org scope to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/organization-secrets#set-selected-repositories-for-an-organization-secret // //meta:operation PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories func (s *CodespacesService) SetSelectedReposForOrgSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { u := fmt.Sprintf("orgs/%v/codespaces/secrets/%v/repositories", org, name) return s.setSelectedRepoForSecret(ctx, u, ids) } func (s *CodespacesService) setSelectedRepoForSecret(ctx context.Context, url string, ids SelectedRepoIDs) (*Response, error) { type repoIDs struct { SelectedIDs SelectedRepoIDs `json:"selected_repository_ids"` } req, err := s.client.NewRequest("PUT", url, repoIDs{SelectedIDs: ids}) if err != nil { return nil, err } resp, err := s.client.Do(ctx, req, nil) if err != nil { return resp, err } return resp, nil } // AddSelectedRepoToUserSecret adds a repository to the list of repositories that have been granted the ability to use a user's codespace secret. // // Adds a repository to the selected repositories for a user's codespace secret. You must authenticate using an access token with the codespace or codespace:secrets scope to use this endpoint. User must have Codespaces access to use this endpoint. GitHub Apps must have write access to the codespaces_user_secrets user permission and write access to the codespaces_secrets repository permission on the referenced repository to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/secrets#add-a-selected-repository-to-a-user-secret // //meta:operation PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id} func (s *CodespacesService) AddSelectedRepoToUserSecret(ctx context.Context, name string, repo *Repository) (*Response, error) { u := fmt.Sprintf("user/codespaces/secrets/%v/repositories/%v", name, *repo.ID) return s.addSelectedRepoToSecret(ctx, u) } // AddSelectedRepoToOrgSecret adds a repository to the list of repositories that have been granted the ability to use an organization's codespace secret. // // Adds a repository to an organization secret when the visibility for repository access is set to selected. The visibility is set when you Create or update an organization secret. You must authenticate using an access token with the admin:org scope to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/organization-secrets#add-selected-repository-to-an-organization-secret // //meta:operation PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id} func (s *CodespacesService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { u := fmt.Sprintf("orgs/%v/codespaces/secrets/%v/repositories/%v", org, name, *repo.ID) return s.addSelectedRepoToSecret(ctx, u) } func (s *CodespacesService) addSelectedRepoToSecret(ctx context.Context, url string) (*Response, error) { req, err := s.client.NewRequest("PUT", url, nil) if err != nil { return nil, err } resp, err := s.client.Do(ctx, req, nil) if err != nil { return resp, err } return resp, nil } // RemoveSelectedRepoFromUserSecret removes a repository from the list of repositories that have been granted the ability to use a user's codespace secret. // // Removes a repository from the selected repositories for a user's codespace secret. You must authenticate using an access token with the codespace or codespace:secrets scope to use this endpoint. User must have Codespaces access to use this endpoint. GitHub Apps must have write access to the codespaces_user_secrets user permission to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/secrets#remove-a-selected-repository-from-a-user-secret // //meta:operation DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id} func (s *CodespacesService) RemoveSelectedRepoFromUserSecret(ctx context.Context, name string, repo *Repository) (*Response, error) { u := fmt.Sprintf("user/codespaces/secrets/%v/repositories/%v", name, *repo.ID) return s.removeSelectedRepoFromSecret(ctx, u) } // RemoveSelectedRepoFromOrgSecret removes a repository from the list of repositories that have been granted the ability to use an organization's codespace secret. // // Removes a repository from an organization secret when the visibility for repository access is set to selected. The visibility is set when you Create or update an organization secret. You must authenticate using an access token with the admin:org scope to use this endpoint. // // GitHub API docs: https://docs.github.com/rest/codespaces/organization-secrets#remove-selected-repository-from-an-organization-secret // //meta:operation DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id} func (s *CodespacesService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { u := fmt.Sprintf("orgs/%v/codespaces/secrets/%v/repositories/%v", org, name, *repo.ID) return s.removeSelectedRepoFromSecret(ctx, u) } func (s *CodespacesService) removeSelectedRepoFromSecret(ctx context.Context, url string) (*Response, error) { req, err := s.client.NewRequest("DELETE", url, 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-60.0.0/github/codespaces_secrets_test.go000066400000000000000000000631761457013574700222250ustar00rootroot00000000000000// Copyright 2023 The go-github 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 TestCodespacesService_ListSecrets(t *testing.T) { type test struct { name string handleFunc func(*http.ServeMux) call func(context.Context, *Client) (*Secrets, *Response, error) badCall func(context.Context, *Client) (*Secrets, *Response, error) methodName string } opts := &ListOptions{Page: 2, PerPage: 2} tests := []test{ { name: "User", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/user/codespaces/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"}]}`) }) }, call: func(ctx context.Context, client *Client) (*Secrets, *Response, error) { return client.Codespaces.ListUserSecrets(ctx, opts) }, methodName: "ListUserSecrets", }, { name: "Org", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/orgs/o/codespaces/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"}]}`) }) }, call: func(ctx context.Context, client *Client) (*Secrets, *Response, error) { return client.Codespaces.ListOrgSecrets(ctx, "o", opts) }, badCall: func(ctx context.Context, client *Client) (*Secrets, *Response, error) { return client.Codespaces.ListOrgSecrets(ctx, "\n", opts) }, methodName: "ListOrgSecrets", }, { name: "Repo", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/repos/o/r/codespaces/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"}]}`) }) }, call: func(ctx context.Context, client *Client) (*Secrets, *Response, error) { return client.Codespaces.ListRepoSecrets(ctx, "o", "r", opts) }, badCall: func(ctx context.Context, client *Client) (*Secrets, *Response, error) { return client.Codespaces.ListRepoSecrets(ctx, "\n", "\n", opts) }, methodName: "ListRepoSecrets", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() tt.handleFunc(mux) ctx := context.Background() secrets, _, err := tt.call(ctx, client) if err != nil { t.Errorf("Codespaces.%v returned error: %v", tt.methodName, 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("Codespaces.%v returned %+v, want %+v", tt.methodName, secrets, want) } if tt.badCall != nil { testBadOptions(t, tt.methodName, func() (err error) { _, _, err = tt.badCall(ctx, client) return err }) } testNewRequestAndDoFailure(t, tt.methodName, client, func() (*Response, error) { got, resp, err := tt.call(ctx, client) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", tt.methodName, got) } return resp, err }) }) } } func TestCodespacesService_GetSecret(t *testing.T) { type test struct { name string handleFunc func(*http.ServeMux) call func(context.Context, *Client) (*Secret, *Response, error) badCall func(context.Context, *Client) (*Secret, *Response, error) methodName string } tests := []test{ { name: "User", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/user/codespaces/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"name":"A","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}`) }) }, call: func(ctx context.Context, client *Client) (*Secret, *Response, error) { return client.Codespaces.GetUserSecret(ctx, "NAME") }, methodName: "GetUserSecret", }, { name: "Org", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/orgs/o/codespaces/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"name":"A","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}`) }) }, call: func(ctx context.Context, client *Client) (*Secret, *Response, error) { return client.Codespaces.GetOrgSecret(ctx, "o", "NAME") }, badCall: func(ctx context.Context, client *Client) (*Secret, *Response, error) { return client.Codespaces.GetOrgSecret(ctx, "\n", "\n") }, methodName: "GetOrgSecret", }, { name: "Repo", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/repos/o/r/codespaces/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"name":"A","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}`) }) }, call: func(ctx context.Context, client *Client) (*Secret, *Response, error) { return client.Codespaces.GetRepoSecret(ctx, "o", "r", "NAME") }, badCall: func(ctx context.Context, client *Client) (*Secret, *Response, error) { return client.Codespaces.GetRepoSecret(ctx, "\n", "\n", "\n") }, methodName: "GetRepoSecret", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() tt.handleFunc(mux) ctx := context.Background() secret, _, err := tt.call(ctx, client) if err != nil { t.Errorf("Codespaces.%v returned error: %v", tt.methodName, err) } want := &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)}} if !cmp.Equal(secret, want) { t.Errorf("Codespaces.%v returned %+v, want %+v", tt.methodName, secret, want) } if tt.badCall != nil { testBadOptions(t, tt.methodName, func() (err error) { _, _, err = tt.badCall(ctx, client) return err }) } testNewRequestAndDoFailure(t, tt.methodName, client, func() (*Response, error) { got, resp, err := tt.call(ctx, client) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", tt.methodName, got) } return resp, err }) }) } } func TestCodespacesService_CreateOrUpdateSecret(t *testing.T) { type test struct { name string handleFunc func(*http.ServeMux) call func(context.Context, *Client, *EncryptedSecret) (*Response, error) badCall func(context.Context, *Client, *EncryptedSecret) (*Response, error) methodName string } tests := []test{ { name: "User", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/user/codespaces/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) }) }, call: func(ctx context.Context, client *Client, e *EncryptedSecret) (*Response, error) { return client.Codespaces.CreateOrUpdateUserSecret(ctx, e) }, methodName: "CreateOrUpdateUserSecret", }, { name: "Org", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/orgs/o/codespaces/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) }) }, call: func(ctx context.Context, client *Client, e *EncryptedSecret) (*Response, error) { return client.Codespaces.CreateOrUpdateOrgSecret(ctx, "o", e) }, badCall: func(ctx context.Context, client *Client, e *EncryptedSecret) (*Response, error) { return client.Codespaces.CreateOrUpdateOrgSecret(ctx, "\n", e) }, methodName: "CreateOrUpdateOrgSecret", }, { name: "Repo", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/repos/o/r/codespaces/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) }) }, call: func(ctx context.Context, client *Client, e *EncryptedSecret) (*Response, error) { return client.Codespaces.CreateOrUpdateRepoSecret(ctx, "o", "r", e) }, badCall: func(ctx context.Context, client *Client, e *EncryptedSecret) (*Response, error) { return client.Codespaces.CreateOrUpdateRepoSecret(ctx, "\n", "\n", e) }, methodName: "CreateOrUpdateRepoSecret", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() tt.handleFunc(mux) input := &EncryptedSecret{ Name: "NAME", EncryptedValue: "QIv=", KeyID: "1234", } ctx := context.Background() _, err := tt.call(ctx, client, input) if err != nil { t.Errorf("Codespaces.%v returned error: %v", tt.methodName, err) } if tt.badCall != nil { testBadOptions(t, tt.methodName, func() (err error) { _, err = tt.badCall(ctx, client, input) return err }) } testNewRequestAndDoFailure(t, tt.methodName, client, func() (*Response, error) { return tt.call(ctx, client, input) }) }) } } func TestCodespacesService_DeleteSecret(t *testing.T) { type test struct { name string handleFunc func(*http.ServeMux) call func(context.Context, *Client) (*Response, error) badCall func(context.Context, *Client) (*Response, error) methodName string } tests := []test{ { name: "User", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/user/codespaces/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) }, call: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.DeleteUserSecret(ctx, "NAME") }, methodName: "DeleteUserSecret", }, { name: "Org", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/orgs/o/codespaces/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) }, call: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.DeleteOrgSecret(ctx, "o", "NAME") }, badCall: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.DeleteOrgSecret(ctx, "\n", "\n") }, methodName: "DeleteOrgSecret", }, { name: "Repo", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/repos/o/r/codespaces/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) }, call: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.DeleteRepoSecret(ctx, "o", "r", "NAME") }, badCall: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.DeleteRepoSecret(ctx, "\n", "\n", "\n") }, methodName: "DeleteRepoSecret", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() tt.handleFunc(mux) ctx := context.Background() _, err := tt.call(ctx, client) if err != nil { t.Errorf("Codespaces.%v returned error: %v", tt.methodName, err) } if tt.badCall != nil { testBadOptions(t, tt.methodName, func() (err error) { _, err = tt.badCall(ctx, client) return err }) } testNewRequestAndDoFailure(t, tt.methodName, client, func() (*Response, error) { return tt.call(ctx, client) }) }) } } func TestCodespacesService_GetPublicKey(t *testing.T) { type test struct { name string handleFunc func(*http.ServeMux) call func(context.Context, *Client) (*PublicKey, *Response, error) badCall func(context.Context, *Client) (*PublicKey, *Response, error) methodName string } tests := []test{ { name: "User", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/user/codespaces/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"key_id":"1234","key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) }) }, call: func(ctx context.Context, client *Client) (*PublicKey, *Response, error) { return client.Codespaces.GetUserPublicKey(ctx) }, methodName: "GetUserPublicKey", }, { name: "Org", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/orgs/o/codespaces/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"key_id":"1234","key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) }) }, call: func(ctx context.Context, client *Client) (*PublicKey, *Response, error) { return client.Codespaces.GetOrgPublicKey(ctx, "o") }, badCall: func(ctx context.Context, client *Client) (*PublicKey, *Response, error) { return client.Codespaces.GetOrgPublicKey(ctx, "\n") }, methodName: "GetOrgPublicKey", }, { name: "Repo", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/repos/o/r/codespaces/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"key_id":"1234","key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) }) }, call: func(ctx context.Context, client *Client) (*PublicKey, *Response, error) { return client.Codespaces.GetRepoPublicKey(ctx, "o", "r") }, badCall: func(ctx context.Context, client *Client) (*PublicKey, *Response, error) { return client.Codespaces.GetRepoPublicKey(ctx, "\n", "\n") }, methodName: "GetRepoPublicKey", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() tt.handleFunc(mux) ctx := context.Background() key, _, err := tt.call(ctx, client) if err != nil { t.Errorf("Codespaces.%v returned error: %v", tt.methodName, err) } want := &PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} if !cmp.Equal(key, want) { t.Errorf("Codespaces.%v returned %+v, want %+v", tt.methodName, key, want) } if tt.badCall != nil { testBadOptions(t, tt.methodName, func() (err error) { _, _, err = tt.badCall(ctx, client) return err }) } testNewRequestAndDoFailure(t, tt.methodName, client, func() (*Response, error) { got, resp, err := tt.call(ctx, client) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", tt.methodName, got) } return resp, err }) }) } } func TestCodespacesService_ListSelectedReposForSecret(t *testing.T) { type test struct { name string handleFunc func(*http.ServeMux) call func(context.Context, *Client) (*SelectedReposList, *Response, error) badCall func(context.Context, *Client) (*SelectedReposList, *Response, error) methodName string } opts := &ListOptions{Page: 2, PerPage: 2} tests := []test{ { name: "User", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/user/codespaces/secrets/NAME/repositories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprintf(w, `{"total_count":1,"repositories":[{"id":1}]}`) }) }, call: func(ctx context.Context, client *Client) (*SelectedReposList, *Response, error) { return client.Codespaces.ListSelectedReposForUserSecret(ctx, "NAME", opts) }, methodName: "ListSelectedReposForUserSecret", }, { name: "Org", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/orgs/o/codespaces/secrets/NAME/repositories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprintf(w, `{"total_count":1,"repositories":[{"id":1}]}`) }) }, call: func(ctx context.Context, client *Client) (*SelectedReposList, *Response, error) { return client.Codespaces.ListSelectedReposForOrgSecret(ctx, "o", "NAME", opts) }, badCall: func(ctx context.Context, client *Client) (*SelectedReposList, *Response, error) { return client.Codespaces.ListSelectedReposForOrgSecret(ctx, "\n", "\n", opts) }, methodName: "ListSelectedReposForOrgSecret", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() tt.handleFunc(mux) ctx := context.Background() repos, _, err := tt.call(ctx, client) if err != nil { t.Errorf("Codespaces.%v returned error: %v", tt.methodName, err) } want := &SelectedReposList{ TotalCount: Int(1), Repositories: []*Repository{ {ID: Int64(1)}, }, } if !cmp.Equal(repos, want) { t.Errorf("Codespaces.%v returned %+v, want %+v", tt.methodName, repos, want) } if tt.badCall != nil { testBadOptions(t, tt.methodName, func() (err error) { _, _, err = tt.badCall(ctx, client) return err }) } testNewRequestAndDoFailure(t, tt.methodName, client, func() (*Response, error) { got, resp, err := tt.call(ctx, client) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", tt.methodName, got) } return resp, err }) }) } } func TestCodespacesService_SetSelectedReposForSecret(t *testing.T) { type test struct { name string handleFunc func(*http.ServeMux) call func(context.Context, *Client) (*Response, error) badCall func(context.Context, *Client) (*Response, error) methodName string } ids := SelectedRepoIDs{64780797} tests := []test{ { name: "User", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/user/codespaces/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") }) }, call: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.SetSelectedReposForUserSecret(ctx, "NAME", ids) }, methodName: "SetSelectedReposForUserSecret", }, { name: "Org", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/orgs/o/codespaces/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") }) }, call: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.SetSelectedReposForOrgSecret(ctx, "o", "NAME", ids) }, badCall: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.SetSelectedReposForOrgSecret(ctx, "\n", "\n", ids) }, methodName: "SetSelectedReposForOrgSecret", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() tt.handleFunc(mux) ctx := context.Background() _, err := tt.call(ctx, client) if err != nil { t.Errorf("Codespaces.%v returned error: %v", tt.methodName, err) } if tt.badCall != nil { testBadOptions(t, tt.methodName, func() (err error) { _, err = tt.badCall(ctx, client) return err }) } testNewRequestAndDoFailure(t, tt.methodName, client, func() (*Response, error) { return tt.call(ctx, client) }) }) } } func TestCodespacesService_AddSelectedReposForSecret(t *testing.T) { type test struct { name string handleFunc func(*http.ServeMux) call func(context.Context, *Client) (*Response, error) badCall func(context.Context, *Client) (*Response, error) methodName string } repo := &Repository{ID: Int64(1234)} tests := []test{ { name: "User", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/user/codespaces/secrets/NAME/repositories/1234", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") }) }, call: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.AddSelectedRepoToUserSecret(ctx, "NAME", repo) }, methodName: "AddSelectedRepoToUserSecret", }, { name: "Org", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/orgs/o/codespaces/secrets/NAME/repositories/1234", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") }) }, call: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.AddSelectedRepoToOrgSecret(ctx, "o", "NAME", repo) }, badCall: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.AddSelectedRepoToOrgSecret(ctx, "\n", "\n", repo) }, methodName: "AddSelectedRepoToOrgSecret", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() tt.handleFunc(mux) ctx := context.Background() _, err := tt.call(ctx, client) if err != nil { t.Errorf("Codespaces.%v returned error: %v", tt.methodName, err) } if tt.badCall != nil { testBadOptions(t, tt.methodName, func() (err error) { _, err = tt.badCall(ctx, client) return err }) } testNewRequestAndDoFailure(t, tt.methodName, client, func() (*Response, error) { return tt.call(ctx, client) }) }) } } func TestCodespacesService_RemoveSelectedReposFromSecret(t *testing.T) { type test struct { name string handleFunc func(*http.ServeMux) call func(context.Context, *Client) (*Response, error) badCall func(context.Context, *Client) (*Response, error) methodName string } repo := &Repository{ID: Int64(1234)} tests := []test{ { name: "User", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/user/codespaces/secrets/NAME/repositories/1234", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) }, call: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.RemoveSelectedRepoFromUserSecret(ctx, "NAME", repo) }, methodName: "RemoveSelectedRepoFromUserSecret", }, { name: "Org", handleFunc: func(mux *http.ServeMux) { mux.HandleFunc("/orgs/o/codespaces/secrets/NAME/repositories/1234", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) }, call: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.RemoveSelectedRepoFromOrgSecret(ctx, "o", "NAME", repo) }, badCall: func(ctx context.Context, client *Client) (*Response, error) { return client.Codespaces.RemoveSelectedRepoFromOrgSecret(ctx, "\n", "\n", repo) }, methodName: "RemoveSelectedRepoFromOrgSecret", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() tt.handleFunc(mux) ctx := context.Background() _, err := tt.call(ctx, client) if err != nil { t.Errorf("Codespaces.%v returned error: %v", tt.methodName, err) } if tt.badCall != nil { testBadOptions(t, tt.methodName, func() (err error) { _, err = tt.badCall(ctx, client) return err }) } testNewRequestAndDoFailure(t, tt.methodName, client, func() (*Response, error) { return tt.call(ctx, client) }) }) } } // 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 // }) // } go-github-60.0.0/github/codespaces_test.go000066400000000000000000000240551457013574700204660ustar00rootroot00000000000000// Copyright 2023 The go-github 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 TestCodespacesService_ListInRepo(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/owner/repo/codespaces", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "1", "per_page": "2", }) fmt.Fprint(w, `{"total_count":2,"codespaces":[{"id":1,"name":"monalisa-octocat-hello-world-g4wpq6h95q","environment_id":"26a7c758-7299-4a73-b978-5a92a7ae98a0","owner":{"login":"octocat"},"billable_owner":{"login":"octocat"},"repository":{"id":1296269},"machine":{"name":"standardLinux","display_name":"4 cores, 8 GB RAM, 64 GB storage","operating_system":"linux","storage_in_bytes":68719476736,"memory_in_bytes":8589934592,"cpus":4},"prebuild":false,"devcontainer_path":".devcontainer/devcontainer.json","created_at":"2021-10-14T00:53:30-06:00","updated_at":"2021-10-14T00:53:32-06:00","last_used_at":"2021-10-14T00:53:30-06:00","state":"Available","url":"https://api.github.com/user/codespaces/monalisa-octocat-hello-world-g4wpq6h95q","git_status":{"ahead":0,"behind":0,"has_unpushed_changes":false,"has_uncommitted_changes":false,"ref":"main"},"location":"WestUs2","idle_timeout_minutes":60,"web_url":"https://monalisa-octocat-hello-world-g4wpq6h95q.github.dev","machines_url":"https://api.github.com/user/codespaces/monalisa-octocat-hello-world-g4wpq6h95q/machines","start_url":"https://api.github.com/user/codespaces/monalisa-octocat-hello-world-g4wpq6h95q/start","stop_url":"https://api.github.com/user/codespaces/monalisa-octocat-hello-world-g4wpq6h95q/stop","recent_folders":["testfolder1","testfolder2"]},{"id":2}]}`) }) opt := &ListOptions{Page: 1, PerPage: 2} ctx := context.Background() codespaces, _, err := client.Codespaces.ListInRepo(ctx, "owner", "repo", opt) if err != nil { t.Errorf("Codespaces.ListInRepo returned error: %v", err) } want := &ListCodespaces{TotalCount: Int(2), Codespaces: []*Codespace{ { ID: Int64(1), Name: String("monalisa-octocat-hello-world-g4wpq6h95q"), EnvironmentID: String("26a7c758-7299-4a73-b978-5a92a7ae98a0"), Owner: &User{ Login: String("octocat"), }, BillableOwner: &User{ Login: String("octocat"), }, Repository: &Repository{ ID: Int64(1296269), }, Machine: &CodespacesMachine{ Name: String("standardLinux"), DisplayName: String("4 cores, 8 GB RAM, 64 GB storage"), OperatingSystem: String("linux"), StorageInBytes: Int64(68719476736), MemoryInBytes: Int64(8589934592), CPUs: Int(4), }, Prebuild: Bool(false), DevcontainerPath: String(".devcontainer/devcontainer.json"), CreatedAt: &Timestamp{time.Date(2021, 10, 14, 0, 53, 30, 0, time.FixedZone("", -6*60*60))}, UpdatedAt: &Timestamp{time.Date(2021, 10, 14, 0, 53, 32, 0, time.FixedZone("", -6*60*60))}, LastUsedAt: &Timestamp{time.Date(2021, 10, 14, 0, 53, 30, 0, time.FixedZone("", -6*60*60))}, State: String("Available"), URL: String("https://api.github.com/user/codespaces/monalisa-octocat-hello-world-g4wpq6h95q"), GitStatus: &CodespacesGitStatus{ Ahead: Int(0), Behind: Int(0), HasUnpushedChanges: Bool(false), HasUncommittedChanges: Bool(false), Ref: String("main"), }, Location: String("WestUs2"), IdleTimeoutMinutes: Int(60), WebURL: String("https://monalisa-octocat-hello-world-g4wpq6h95q.github.dev"), MachinesURL: String("https://api.github.com/user/codespaces/monalisa-octocat-hello-world-g4wpq6h95q/machines"), StartURL: String("https://api.github.com/user/codespaces/monalisa-octocat-hello-world-g4wpq6h95q/start"), StopURL: String("https://api.github.com/user/codespaces/monalisa-octocat-hello-world-g4wpq6h95q/stop"), RecentFolders: []string{ "testfolder1", "testfolder2", }, }, { ID: Int64(2), }, }} if !cmp.Equal(codespaces, want) { t.Errorf("Codespaces.ListInRepo returned %+v, want %+v", codespaces, want) } const methodName = "ListInRepo" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Codespaces.ListInRepo(ctx, "", "", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodespacesService_List(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/codespaces", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "page": "1", "per_page": "2", "repository_id": "1296269", }) fmt.Fprint(w, `{"total_count":1,"codespaces":[{"id":1, "repository": {"id": 1296269}}]}`) }) opt := &ListCodespacesOptions{ListOptions: ListOptions{Page: 1, PerPage: 2}, RepositoryID: 1296269} ctx := context.Background() codespaces, _, err := client.Codespaces.List(ctx, opt) if err != nil { t.Errorf("Codespaces.List returned error: %v", err) } want := &ListCodespaces{TotalCount: Int(1), Codespaces: []*Codespace{ { ID: Int64(1), Repository: &Repository{ ID: Int64(1296269), }, }, }} if !cmp.Equal(codespaces, want) { t.Errorf("Codespaces.ListInRepo returned %+v, want %+v", codespaces, want) } const methodName = "List" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Codespaces.List(ctx, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodespacesService_CreateInRepo(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/owner/repo/codespaces", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Content-Type", "application/json") testBody(t, r, `{"ref":"main","geo":"WestUs2","machine":"standardLinux","idle_timeout_minutes":60}`+"\n") fmt.Fprint(w, `{"id":1, "repository": {"id": 1296269}}`) }) input := &CreateCodespaceOptions{ Ref: String("main"), Geo: String("WestUs2"), Machine: String("standardLinux"), IdleTimeoutMinutes: Int(60), } ctx := context.Background() codespace, _, err := client.Codespaces.CreateInRepo(ctx, "owner", "repo", input) if err != nil { t.Errorf("Codespaces.CreateInRepo returned error: %v", err) } want := &Codespace{ ID: Int64(1), Repository: &Repository{ ID: Int64(1296269), }, } if !cmp.Equal(codespace, want) { t.Errorf("Codespaces.CreateInRepo returned %+v, want %+v", codespace, want) } const methodName = "CreateInRepo" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Codespaces.CreateInRepo(ctx, "\n", "", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Codespaces.CreateInRepo(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodespacesService_Start(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/codespaces/codespace_1/start", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"id":1, "repository": {"id": 1296269}}`) }) ctx := context.Background() codespace, _, err := client.Codespaces.Start(ctx, "codespace_1") if err != nil { t.Errorf("Codespaces.Start returned error: %v", err) } want := &Codespace{ ID: Int64(1), Repository: &Repository{ ID: Int64(1296269), }, } if !cmp.Equal(codespace, want) { t.Errorf("Codespaces.Start returned %+v, want %+v", codespace, want) } const methodName = "Start" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Codespaces.Start(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Codespaces.Start(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodespacesService_Stop(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/codespaces/codespace_1/stop", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"id":1, "repository": {"id": 1296269}}`) }) ctx := context.Background() codespace, _, err := client.Codespaces.Stop(ctx, "codespace_1") if err != nil { t.Errorf("Codespaces.Stop returned error: %v", err) } want := &Codespace{ ID: Int64(1), Repository: &Repository{ ID: Int64(1296269), }, } if !cmp.Equal(codespace, want) { t.Errorf("Codespaces.Stop returned %+v, want %+v", codespace, want) } const methodName = "Stop" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Codespaces.Stop(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Codespaces.Stop(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodespacesService_Delete(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/codespaces/codespace_1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Codespaces.Delete(ctx, "codespace_1") if err != nil { t.Errorf("Codespaces.Delete return error: %v", err) } const methodName = "Delete" testBadOptions(t, methodName, func() (err error) { _, err = client.Codespaces.Delete(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Codespaces.Delete(ctx, "codespace_1") }) } go-github-60.0.0/github/copilot.go000066400000000000000000000243701457013574700167670ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // CopilotService provides access to the Copilot-related functions // in the GitHub API. // // GitHub API docs: https://docs.github.com/en/rest/copilot/ type CopilotService service // CopilotOrganizationDetails represents the details of an organization's Copilot for Business subscription. type CopilotOrganizationDetails struct { SeatBreakdown *CopilotSeatBreakdown `json:"seat_breakdown"` PublicCodeSuggestions string `json:"public_code_suggestions"` CopilotChat string `json:"copilot_chat"` SeatManagementSetting string `json:"seat_management_setting"` } // CopilotSeatBreakdown represents the breakdown of Copilot for Business seats for the organization. type CopilotSeatBreakdown struct { Total int `json:"total"` AddedThisCycle int `json:"added_this_cycle"` PendingCancellation int `json:"pending_cancellation"` PendingInvitation int `json:"pending_invitation"` ActiveThisCycle int `json:"active_this_cycle"` InactiveThisCycle int `json:"inactive_this_cycle"` } // ListCopilotSeatsResponse represents the Copilot for Business seat assignments for an organization. type ListCopilotSeatsResponse struct { TotalSeats int64 `json:"total_seats"` Seats []*CopilotSeatDetails `json:"seats"` } // CopilotSeatDetails represents the details of a Copilot for Business seat. type CopilotSeatDetails struct { // Assignee can either be a User, Team, or Organization. Assignee interface{} `json:"assignee"` AssigningTeam *Team `json:"assigning_team,omitempty"` PendingCancellationDate *string `json:"pending_cancellation_date,omitempty"` LastActivityAt *Timestamp `json:"last_activity_at,omitempty"` LastActivityEditor *string `json:"last_activity_editor,omitempty"` CreatedAt *Timestamp `json:"created_at"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` } // SeatAssignments represents the number of seats assigned. type SeatAssignments struct { SeatsCreated int `json:"seats_created"` } // SeatCancellations represents the number of seats cancelled. type SeatCancellations struct { SeatsCancelled int `json:"seats_cancelled"` } func (cp *CopilotSeatDetails) UnmarshalJSON(data []byte) error { // Using an alias to avoid infinite recursion when calling json.Unmarshal type alias CopilotSeatDetails var seatDetail alias if err := json.Unmarshal(data, &seatDetail); err != nil { return err } cp.AssigningTeam = seatDetail.AssigningTeam cp.PendingCancellationDate = seatDetail.PendingCancellationDate cp.LastActivityAt = seatDetail.LastActivityAt cp.LastActivityEditor = seatDetail.LastActivityEditor cp.CreatedAt = seatDetail.CreatedAt cp.UpdatedAt = seatDetail.UpdatedAt switch v := seatDetail.Assignee.(type) { case map[string]interface{}: jsonData, err := json.Marshal(seatDetail.Assignee) if err != nil { return err } if v["type"] == nil { return fmt.Errorf("assignee type field is not set") } if t, ok := v["type"].(string); ok && t == "User" { user := &User{} if err := json.Unmarshal(jsonData, user); err != nil { return err } cp.Assignee = user } else if t, ok := v["type"].(string); ok && t == "Team" { team := &Team{} if err := json.Unmarshal(jsonData, team); err != nil { return err } cp.Assignee = team } else if t, ok := v["type"].(string); ok && t == "Organization" { organization := &Organization{} if err := json.Unmarshal(jsonData, organization); err != nil { return err } cp.Assignee = organization } else { return fmt.Errorf("unsupported assignee type %v", v["type"]) } default: return fmt.Errorf("unsupported assignee type %T", v) } return nil } // GetUser gets the User from the CopilotSeatDetails if the assignee is a user. func (cp *CopilotSeatDetails) GetUser() (*User, bool) { u, ok := cp.Assignee.(*User); return u, ok } // GetTeam gets the Team from the CopilotSeatDetails if the assignee is a team. func (cp *CopilotSeatDetails) GetTeam() (*Team, bool) { t, ok := cp.Assignee.(*Team); return t, ok } // GetOrganization gets the Organization from the CopilotSeatDetails if the assignee is an organization. func (cp *CopilotSeatDetails) GetOrganization() (*Organization, bool) { o, ok := cp.Assignee.(*Organization) return o, ok } // GetCopilotBilling gets Copilot for Business billing information and settings for an organization. // // GitHub API docs: https://docs.github.com/rest/copilot/copilot-business#get-copilot-business-seat-information-and-settings-for-an-organization // //meta:operation GET /orgs/{org}/copilot/billing func (s *CopilotService) GetCopilotBilling(ctx context.Context, org string) (*CopilotOrganizationDetails, *Response, error) { u := fmt.Sprintf("orgs/%v/copilot/billing", org) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var copilotDetails *CopilotOrganizationDetails resp, err := s.client.Do(ctx, req, &copilotDetails) if err != nil { return nil, resp, err } return copilotDetails, resp, nil } // ListCopilotSeats lists Copilot for Business seat assignments for an organization. // // To paginate through all seats, populate 'Page' with the number of the last page. // // GitHub API docs: https://docs.github.com/rest/copilot/copilot-business#list-all-copilot-business-seat-assignments-for-an-organization // //meta:operation GET /orgs/{org}/copilot/billing/seats func (s *CopilotService) ListCopilotSeats(ctx context.Context, org string, opts *ListOptions) (*ListCopilotSeatsResponse, *Response, error) { u := fmt.Sprintf("orgs/%v/copilot/billing/seats", org) req, err := s.client.NewRequest("GET", u, opts) if err != nil { return nil, nil, err } var copilotSeats *ListCopilotSeatsResponse resp, err := s.client.Do(ctx, req, &copilotSeats) if err != nil { return nil, resp, err } return copilotSeats, resp, nil } // AddCopilotTeams adds teams to the Copilot for Business subscription for an organization. // // GitHub API docs: https://docs.github.com/rest/copilot/copilot-business#add-teams-to-the-copilot-business-subscription-for-an-organization // //meta:operation POST /orgs/{org}/copilot/billing/selected_teams func (s *CopilotService) AddCopilotTeams(ctx context.Context, org string, teamNames []string) (*SeatAssignments, *Response, error) { u := fmt.Sprintf("orgs/%v/copilot/billing/selected_teams", org) body := struct { SelectedTeams []string `json:"selected_teams"` }{ SelectedTeams: teamNames, } req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } var seatAssignments *SeatAssignments resp, err := s.client.Do(ctx, req, &seatAssignments) if err != nil { return nil, resp, err } return seatAssignments, resp, nil } // RemoveCopilotTeams removes teams from the Copilot for Business subscription for an organization. // // GitHub API docs: https://docs.github.com/rest/copilot/copilot-business#remove-teams-from-the-copilot-business-subscription-for-an-organization // //meta:operation DELETE /orgs/{org}/copilot/billing/selected_teams func (s *CopilotService) RemoveCopilotTeams(ctx context.Context, org string, teamNames []string) (*SeatCancellations, *Response, error) { u := fmt.Sprintf("orgs/%v/copilot/billing/selected_teams", org) body := struct { SelectedTeams []string `json:"selected_teams"` }{ SelectedTeams: teamNames, } req, err := s.client.NewRequest("DELETE", u, body) if err != nil { return nil, nil, err } var seatCancellations *SeatCancellations resp, err := s.client.Do(ctx, req, &seatCancellations) if err != nil { return nil, resp, err } return seatCancellations, resp, nil } // AddCopilotUsers adds users to the Copilot for Business subscription for an organization // // GitHub API docs: https://docs.github.com/rest/copilot/copilot-business#add-users-to-the-copilot-business-subscription-for-an-organization // //meta:operation POST /orgs/{org}/copilot/billing/selected_users func (s *CopilotService) AddCopilotUsers(ctx context.Context, org string, users []string) (*SeatAssignments, *Response, error) { u := fmt.Sprintf("orgs/%v/copilot/billing/selected_users", org) body := struct { SelectedUsernames []string `json:"selected_usernames"` }{ SelectedUsernames: users, } req, err := s.client.NewRequest("POST", u, body) if err != nil { return nil, nil, err } var seatAssignments *SeatAssignments resp, err := s.client.Do(ctx, req, &seatAssignments) if err != nil { return nil, resp, err } return seatAssignments, resp, nil } // RemoveCopilotUsers removes users from the Copilot for Business subscription for an organization. // // GitHub API docs: https://docs.github.com/rest/copilot/copilot-business#remove-users-from-the-copilot-business-subscription-for-an-organization // //meta:operation DELETE /orgs/{org}/copilot/billing/selected_users func (s *CopilotService) RemoveCopilotUsers(ctx context.Context, org string, users []string) (*SeatCancellations, *Response, error) { u := fmt.Sprintf("orgs/%v/copilot/billing/selected_users", org) body := struct { SelectedUsernames []string `json:"selected_usernames"` }{ SelectedUsernames: users, } req, err := s.client.NewRequest("DELETE", u, body) if err != nil { return nil, nil, err } var seatCancellations *SeatCancellations resp, err := s.client.Do(ctx, req, &seatCancellations) if err != nil { return nil, resp, err } return seatCancellations, resp, nil } // GetSeatDetails gets Copilot for Business seat assignment details for a user. // // GitHub API docs: https://docs.github.com/rest/copilot/copilot-business#get-copilot-business-seat-assignment-details-for-a-user // //meta:operation GET /orgs/{org}/members/{username}/copilot func (s *CopilotService) GetSeatDetails(ctx context.Context, org, user string) (*CopilotSeatDetails, *Response, error) { u := fmt.Sprintf("orgs/%v/members/%v/copilot", org, user) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var seatDetails *CopilotSeatDetails resp, err := s.client.Do(ctx, req, &seatDetails) if err != nil { return nil, resp, err } return seatDetails, resp, nil } go-github-60.0.0/github/copilot_test.go000066400000000000000000000665541457013574700200400ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // Test invalid JSON responses, vlaid responses are covered in the other tests func TestCopilotSeatDetails_UnmarshalJSON(t *testing.T) { tests := []struct { name string data string want *CopilotSeatDetails wantErr bool }{ { name: "Invalid JSON", data: `{`, want: &CopilotSeatDetails{ Assignee: nil, }, wantErr: true, }, { name: "Invalid top level type", data: `{ "assignee": { "type": "User", "name": "octokittens", "id": 1 }, "assigning_team": "this should be an object" }`, want: &CopilotSeatDetails{}, wantErr: true, }, { name: "No Type Field", data: `{ "assignee": { "name": "octokittens", "id": 1 } }`, want: &CopilotSeatDetails{}, wantErr: true, }, { name: "Invalid Assignee Field Type", data: `{ "assignee": "test" }`, want: &CopilotSeatDetails{}, wantErr: true, }, { name: "Invalid Assignee Type", data: `{ "assignee": { "name": "octokittens", "id": 1, "type": [] } }`, want: &CopilotSeatDetails{}, wantErr: true, }, { name: "Invalid User", data: `{ "assignee": { "type": "User", "id": "bad" } }`, want: &CopilotSeatDetails{}, wantErr: true, }, { name: "Invalid Team", data: `{ "assignee": { "type": "Team", "id": "bad" } }`, want: &CopilotSeatDetails{}, wantErr: true, }, { name: "Invalid Organization", data: `{ "assignee": { "type": "Organization", "id": "bad" } }`, want: &CopilotSeatDetails{}, wantErr: true, }, } for _, tc := range tests { seatDetails := &CopilotSeatDetails{} t.Run(tc.name, func(t *testing.T) { err := json.Unmarshal([]byte(tc.data), seatDetails) if err == nil && tc.wantErr { t.Errorf("CopilotSeatDetails.UnmarshalJSON returned nil instead of an error") } if err != nil && !tc.wantErr { t.Errorf("CopilotSeatDetails.UnmarshalJSON returned an unexpected error: %v", err) } if !cmp.Equal(tc.want, seatDetails) { t.Errorf("CopilotSeatDetails.UnmarshalJSON expected %+v, got %+v", tc.want, seatDetails) } }) } } func TestCopilotService_GetSeatDetailsUser(t *testing.T) { data := `{ "assignee": { "type": "User", "id": 1 } }` seatDetails := &CopilotSeatDetails{} err := json.Unmarshal([]byte(data), seatDetails) if err != nil { t.Errorf("CopilotSeatDetails.UnmarshalJSON returned an unexpected error: %v", err) } want := &User{ ID: Int64(1), Type: String("User"), } if got, ok := seatDetails.GetUser(); ok && !cmp.Equal(got, want) { t.Errorf("CopilotSeatDetails.GetTeam returned %+v, want %+v", got, want) } else if !ok { t.Errorf("CopilotSeatDetails.GetUser returned false, expected true") } data = `{ "assignee": { "type": "Organization", "id": 1 } }` bad := &Organization{ ID: Int64(1), Type: String("Organization"), } err = json.Unmarshal([]byte(data), seatDetails) if err != nil { t.Errorf("CopilotSeatDetails.UnmarshalJSON returned an unexpected error: %v", err) } if got, ok := seatDetails.GetUser(); ok { t.Errorf("CopilotSeatDetails.GetUser returned true, expected false. Returned %v, expected %v", got, bad) } } func TestCopilotService_GetSeatDetailsTeam(t *testing.T) { data := `{ "assignee": { "type": "Team", "id": 1 } }` seatDetails := &CopilotSeatDetails{} err := json.Unmarshal([]byte(data), seatDetails) if err != nil { t.Errorf("CopilotSeatDetails.UnmarshalJSON returned an unexpected error: %v", err) } want := &Team{ ID: Int64(1), } if got, ok := seatDetails.GetTeam(); ok && !cmp.Equal(got, want) { t.Errorf("CopilotSeatDetails.GetTeam returned %+v, want %+v", got, want) } else if !ok { t.Errorf("CopilotSeatDetails.GetTeam returned false, expected true") } data = `{ "assignee": { "type": "User", "id": 1 } }` bad := &User{ ID: Int64(1), Type: String("User"), } err = json.Unmarshal([]byte(data), seatDetails) if err != nil { t.Errorf("CopilotSeatDetails.UnmarshalJSON returned an unexpected error: %v", err) } if got, ok := seatDetails.GetTeam(); ok { t.Errorf("CopilotSeatDetails.GetTeam returned true, expected false. Returned %v, expected %v", got, bad) } } func TestCopilotService_GetSeatDetailsOrganization(t *testing.T) { data := `{ "assignee": { "type": "Organization", "id": 1 } }` seatDetails := &CopilotSeatDetails{} err := json.Unmarshal([]byte(data), seatDetails) if err != nil { t.Errorf("CopilotSeatDetails.UnmarshalJSON returned an unexpected error: %v", err) } want := &Organization{ ID: Int64(1), Type: String("Organization"), } if got, ok := seatDetails.GetOrganization(); ok && !cmp.Equal(got, want) { t.Errorf("CopilotSeatDetails.GetOrganization returned %+v, want %+v", got, want) } else if !ok { t.Errorf("CopilotSeatDetails.GetOrganization returned false, expected true") } data = `{ "assignee": { "type": "Team", "id": 1 } }` bad := &Team{ ID: Int64(1), } err = json.Unmarshal([]byte(data), seatDetails) if err != nil { t.Errorf("CopilotSeatDetails.UnmarshalJSON returned an unexpected error: %v", err) } if got, ok := seatDetails.GetOrganization(); ok { t.Errorf("CopilotSeatDetails.GetOrganization returned true, expected false. Returned %v, expected %v", got, bad) } } func TestCopilotService_GetCopilotBilling(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/copilot/billing", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "seat_breakdown": { "total": 12, "added_this_cycle": 9, "pending_invitation": 0, "pending_cancellation": 0, "active_this_cycle": 12, "inactive_this_cycle": 11 }, "seat_management_setting": "assign_selected", "public_code_suggestions": "block" }`) }) ctx := context.Background() got, _, err := client.Copilot.GetCopilotBilling(ctx, "o") if err != nil { t.Errorf("Copilot.GetCopilotBilling returned error: %v", err) } want := &CopilotOrganizationDetails{ SeatBreakdown: &CopilotSeatBreakdown{ Total: 12, AddedThisCycle: 9, PendingInvitation: 0, PendingCancellation: 0, ActiveThisCycle: 12, InactiveThisCycle: 11, }, PublicCodeSuggestions: "block", CopilotChat: "", SeatManagementSetting: "assign_selected", } if !cmp.Equal(got, want) { t.Errorf("Copilot.GetCopilotBilling returned %+v, want %+v", got, want) } const methodName = "GetCopilotBilling" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Copilot.GetCopilotBilling(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Copilot.GetCopilotBilling(ctx, "o") if got != nil { t.Errorf("Copilot.GetCopilotBilling returned %+v, want nil", got) } return resp, err }) } func TestCopilotService_ListCopilotSeats(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/copilot/billing/seats", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "total_seats": 4, "seats": [ { "created_at": "2021-08-03T18:00:00-06:00", "updated_at": "2021-09-23T15:00:00-06:00", "pending_cancellation_date": null, "last_activity_at": "2021-10-14T00:53:32-06:00", "last_activity_editor": "vscode/1.77.3/copilot/1.86.82", "assignee": { "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 }, "assigning_team": { "id": 1, "node_id": "MDQ6VGVhbTE=", "url": "https://api.github.com/teams/1", "html_url": "https://github.com/orgs/github/teams/justice-league", "name": "Justice League", "slug": "justice-league", "description": "A great team.", "privacy": "closed", "notification_setting": "notifications_enabled", "permission": "admin", "members_url": "https://api.github.com/teams/1/members{/member}", "repositories_url": "https://api.github.com/teams/1/repos", "parent": null } }, { "created_at": "2021-09-23T18:00:00-06:00", "updated_at": "2021-09-23T15:00:00-06:00", "pending_cancellation_date": "2021-11-01", "last_activity_at": "2021-10-13T00:53:32-06:00", "last_activity_editor": "vscode/1.77.3/copilot/1.86.82", "assignee": { "login": "octokitten", "id": 1, "node_id": "MDQ76VNlcjE=", "avatar_url": "https://github.com/images/error/octokitten_happy.gif", "gravatar_id": "", "url": "https://api.github.com/users/octokitten", "html_url": "https://github.com/octokitten", "followers_url": "https://api.github.com/users/octokitten/followers", "following_url": "https://api.github.com/users/octokitten/following{/other_user}", "gists_url": "https://api.github.com/users/octokitten/gists{/gist_id}", "starred_url": "https://api.github.com/users/octokitten/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/octokitten/subscriptions", "organizations_url": "https://api.github.com/users/octokitten/orgs", "repos_url": "https://api.github.com/users/octokitten/repos", "events_url": "https://api.github.com/users/octokitten/events{/privacy}", "received_events_url": "https://api.github.com/users/octokitten/received_events", "type": "User", "site_admin": false } }, { "created_at": "2021-09-23T18:00:00-06:00", "updated_at": "2021-09-23T15:00:00-06:00", "pending_cancellation_date": "2021-11-01", "last_activity_at": "2021-10-13T00:53:32-06:00", "last_activity_editor": "vscode/1.77.3/copilot/1.86.82", "assignee": { "name": "octokittens", "id": 1, "type": "Team" } }, { "created_at": "2021-09-23T18:00:00-06:00", "updated_at": "2021-09-23T15:00:00-06:00", "pending_cancellation_date": "2021-11-01", "last_activity_at": "2021-10-13T00:53:32-06:00", "last_activity_editor": "vscode/1.77.3/copilot/1.86.82", "assignee": { "name": "octocats", "id": 1, "type": "Organization" } } ] }`) }) tmp, err := time.Parse(time.RFC3339, "2021-08-03T18:00:00-06:00") if err != nil { panic(err) } createdAt1 := Timestamp{tmp} tmp, err = time.Parse(time.RFC3339, "2021-09-23T15:00:00-06:00") if err != nil { panic(err) } updatedAt1 := Timestamp{tmp} tmp, err = time.Parse(time.RFC3339, "2021-10-14T00:53:32-06:00") if err != nil { panic(err) } lastActivityAt1 := Timestamp{tmp} tmp, err = time.Parse(time.RFC3339, "2021-09-23T18:00:00-06:00") if err != nil { panic(err) } createdAt2 := Timestamp{tmp} tmp, err = time.Parse(time.RFC3339, "2021-09-23T15:00:00-06:00") if err != nil { panic(err) } updatedAt2 := Timestamp{tmp} tmp, err = time.Parse(time.RFC3339, "2021-10-13T00:53:32-06:00") if err != nil { panic(err) } lastActivityAt2 := Timestamp{tmp} ctx := context.Background() got, _, err := client.Copilot.ListCopilotSeats(ctx, "o", nil) if err != nil { t.Errorf("Copilot.ListCopilotSeats returned error: %v", err) } want := &ListCopilotSeatsResponse{ TotalSeats: 4, Seats: []*CopilotSeatDetails{ { Assignee: &User{ Login: String("octocat"), ID: Int64(1), NodeID: String("MDQ6VXNlcjE="), AvatarURL: String("https://github.com/images/error/octocat_happy.gif"), GravatarID: String(""), URL: String("https://api.github.com/users/octocat"), HTMLURL: String("https://github.com/octocat"), FollowersURL: String("https://api.github.com/users/octocat/followers"), FollowingURL: String("https://api.github.com/users/octocat/following{/other_user}"), GistsURL: String("https://api.github.com/users/octocat/gists{/gist_id}"), StarredURL: String("https://api.github.com/users/octocat/starred{/owner}{/repo}"), SubscriptionsURL: String("https://api.github.com/users/octocat/subscriptions"), OrganizationsURL: String("https://api.github.com/users/octocat/orgs"), ReposURL: String("https://api.github.com/users/octocat/repos"), EventsURL: String("https://api.github.com/users/octocat/events{/privacy}"), ReceivedEventsURL: String("https://api.github.com/users/octocat/received_events"), Type: String("User"), SiteAdmin: Bool(false), }, AssigningTeam: &Team{ ID: Int64(1), NodeID: String("MDQ6VGVhbTE="), URL: String("https://api.github.com/teams/1"), HTMLURL: String("https://github.com/orgs/github/teams/justice-league"), 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"), Parent: nil, }, CreatedAt: &createdAt1, UpdatedAt: &updatedAt1, PendingCancellationDate: nil, LastActivityAt: &lastActivityAt1, LastActivityEditor: String("vscode/1.77.3/copilot/1.86.82"), }, { Assignee: &User{ Login: String("octokitten"), ID: Int64(1), NodeID: String("MDQ76VNlcjE="), AvatarURL: String("https://github.com/images/error/octokitten_happy.gif"), GravatarID: String(""), URL: String("https://api.github.com/users/octokitten"), HTMLURL: String("https://github.com/octokitten"), FollowersURL: String("https://api.github.com/users/octokitten/followers"), FollowingURL: String("https://api.github.com/users/octokitten/following{/other_user}"), GistsURL: String("https://api.github.com/users/octokitten/gists{/gist_id}"), StarredURL: String("https://api.github.com/users/octokitten/starred{/owner}{/repo}"), SubscriptionsURL: String("https://api.github.com/users/octokitten/subscriptions"), OrganizationsURL: String("https://api.github.com/users/octokitten/orgs"), ReposURL: String("https://api.github.com/users/octokitten/repos"), EventsURL: String("https://api.github.com/users/octokitten/events{/privacy}"), ReceivedEventsURL: String("https://api.github.com/users/octokitten/received_events"), Type: String("User"), SiteAdmin: Bool(false), }, AssigningTeam: nil, CreatedAt: &createdAt2, UpdatedAt: &updatedAt2, PendingCancellationDate: String("2021-11-01"), LastActivityAt: &lastActivityAt2, LastActivityEditor: String("vscode/1.77.3/copilot/1.86.82"), }, { Assignee: &Team{ ID: Int64(1), Name: String("octokittens"), }, AssigningTeam: nil, CreatedAt: &createdAt2, UpdatedAt: &updatedAt2, PendingCancellationDate: String("2021-11-01"), LastActivityAt: &lastActivityAt2, LastActivityEditor: String("vscode/1.77.3/copilot/1.86.82"), }, { Assignee: &Organization{ ID: Int64(1), Name: String("octocats"), Type: String("Organization"), }, AssigningTeam: nil, CreatedAt: &createdAt2, UpdatedAt: &updatedAt2, PendingCancellationDate: String("2021-11-01"), LastActivityAt: &lastActivityAt2, LastActivityEditor: String("vscode/1.77.3/copilot/1.86.82"), }, }, } if !cmp.Equal(got, want) { t.Errorf("Copilot.ListCopilotSeats returned %+v, want %+v", got, want) } const methodName = "ListCopilotSeats" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Copilot.ListCopilotSeats(ctx, "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Copilot.ListCopilotSeats(ctx, "", nil) if got != nil { t.Errorf("Copilot.ListCopilotSeats returned %+v, want nil", got) } return resp, err }) } func TestCopilotService_AddCopilotTeams(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/copilot/billing/selected_teams", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testBody(t, r, `{"selected_teams":["team1","team2"]}`+"\n") fmt.Fprint(w, `{"seats_created": 2}`) }) ctx := context.Background() got, _, err := client.Copilot.AddCopilotTeams(ctx, "o", []string{"team1", "team2"}) if err != nil { t.Errorf("Copilot.AddCopilotTeams returned error: %v", err) } want := &SeatAssignments{SeatsCreated: 2} if !cmp.Equal(got, want) { t.Errorf("Copilot.AddCopilotTeams returned %+v, want %+v", got, want) } const methodName = "AddCopilotTeams" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Copilot.AddCopilotTeams(ctx, "\n", []string{"team1", "team2"}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Copilot.AddCopilotTeams(ctx, "o", []string{"team1", "team2"}) if got != nil { t.Errorf("Copilot.AddCopilotTeams returned %+v, want nil", got) } return resp, err }) } func TestCopilotService_RemoveCopilotTeams(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/copilot/billing/selected_teams", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testBody(t, r, `{"selected_teams":["team1","team2"]}`+"\n") fmt.Fprint(w, `{"seats_cancelled": 2}`) }) ctx := context.Background() got, _, err := client.Copilot.RemoveCopilotTeams(ctx, "o", []string{"team1", "team2"}) if err != nil { t.Errorf("Copilot.RemoveCopilotTeams returned error: %v", err) } want := &SeatCancellations{SeatsCancelled: 2} if !cmp.Equal(got, want) { t.Errorf("Copilot.RemoveCopilotTeams returned %+v, want %+v", got, want) } const methodName = "RemoveCopilotTeams" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Copilot.RemoveCopilotTeams(ctx, "\n", []string{"team1", "team2"}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Copilot.RemoveCopilotTeams(ctx, "o", []string{"team1", "team2"}) if got != nil { t.Errorf("Copilot.RemoveCopilotTeams returned %+v, want nil", got) } return resp, err }) } func TestCopilotService_AddCopilotUsers(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/copilot/billing/selected_users", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testBody(t, r, `{"selected_usernames":["user1","user2"]}`+"\n") fmt.Fprint(w, `{"seats_created": 2}`) }) ctx := context.Background() got, _, err := client.Copilot.AddCopilotUsers(ctx, "o", []string{"user1", "user2"}) if err != nil { t.Errorf("Copilot.AddCopilotUsers returned error: %v", err) } want := &SeatAssignments{SeatsCreated: 2} if !cmp.Equal(got, want) { t.Errorf("Copilot.AddCopilotUsers returned %+v, want %+v", got, want) } const methodName = "AddCopilotUsers" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Copilot.AddCopilotUsers(ctx, "\n", []string{"user1", "user2"}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Copilot.AddCopilotUsers(ctx, "o", []string{"user1", "user2"}) if got != nil { t.Errorf("Copilot.AddCopilotUsers returned %+v, want nil", got) } return resp, err }) } func TestCopilotService_RemoveCopilotUsers(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/copilot/billing/selected_users", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") testBody(t, r, `{"selected_usernames":["user1","user2"]}`+"\n") fmt.Fprint(w, `{"seats_cancelled": 2}`) }) ctx := context.Background() got, _, err := client.Copilot.RemoveCopilotUsers(ctx, "o", []string{"user1", "user2"}) if err != nil { t.Errorf("Copilot.RemoveCopilotUsers returned error: %v", err) } want := &SeatCancellations{SeatsCancelled: 2} if !cmp.Equal(got, want) { t.Errorf("Copilot.RemoveCopilotUsers returned %+v, want %+v", got, want) } const methodName = "RemoveCopilotUsers" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Copilot.RemoveCopilotUsers(ctx, "\n", []string{"user1", "user2"}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Copilot.RemoveCopilotUsers(ctx, "o", []string{"user1", "user2"}) if got != nil { t.Errorf("Copilot.RemoveCopilotUsers returned %+v, want nil", got) } return resp, err }) } func TestCopilotService_GetSeatDetails(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/members/u/copilot", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "created_at": "2021-08-03T18:00:00-06:00", "updated_at": "2021-09-23T15:00:00-06:00", "pending_cancellation_date": null, "last_activity_at": "2021-10-14T00:53:32-06:00", "last_activity_editor": "vscode/1.77.3/copilot/1.86.82", "assignee": { "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 }, "assigning_team": { "id": 1, "node_id": "MDQ6VGVhbTE=", "url": "https://api.github.com/teams/1", "html_url": "https://github.com/orgs/github/teams/justice-league", "name": "Justice League", "slug": "justice-league", "description": "A great team.", "privacy": "closed", "notification_setting": "notifications_enabled", "permission": "admin", "members_url": "https://api.github.com/teams/1/members{/member}", "repositories_url": "https://api.github.com/teams/1/repos", "parent": null } }`) }) tmp, err := time.Parse(time.RFC3339, "2021-08-03T18:00:00-06:00") if err != nil { panic(err) } createdAt := Timestamp{tmp} tmp, err = time.Parse(time.RFC3339, "2021-09-23T15:00:00-06:00") if err != nil { panic(err) } updatedAt := Timestamp{tmp} tmp, err = time.Parse(time.RFC3339, "2021-10-14T00:53:32-06:00") if err != nil { panic(err) } lastActivityAt := Timestamp{tmp} ctx := context.Background() got, _, err := client.Copilot.GetSeatDetails(ctx, "o", "u") if err != nil { t.Errorf("Copilot.GetSeatDetails returned error: %v", err) } want := &CopilotSeatDetails{ Assignee: &User{ Login: String("octocat"), ID: Int64(1), NodeID: String("MDQ6VXNlcjE="), AvatarURL: String("https://github.com/images/error/octocat_happy.gif"), GravatarID: String(""), URL: String("https://api.github.com/users/octocat"), HTMLURL: String("https://github.com/octocat"), FollowersURL: String("https://api.github.com/users/octocat/followers"), FollowingURL: String("https://api.github.com/users/octocat/following{/other_user}"), GistsURL: String("https://api.github.com/users/octocat/gists{/gist_id}"), StarredURL: String("https://api.github.com/users/octocat/starred{/owner}{/repo}"), SubscriptionsURL: String("https://api.github.com/users/octocat/subscriptions"), OrganizationsURL: String("https://api.github.com/users/octocat/orgs"), ReposURL: String("https://api.github.com/users/octocat/repos"), EventsURL: String("https://api.github.com/users/octocat/events{/privacy}"), ReceivedEventsURL: String("https://api.github.com/users/octocat/received_events"), Type: String("User"), SiteAdmin: Bool(false), }, AssigningTeam: &Team{ ID: Int64(1), NodeID: String("MDQ6VGVhbTE="), URL: String("https://api.github.com/teams/1"), HTMLURL: String("https://github.com/orgs/github/teams/justice-league"), 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"), Parent: nil, }, CreatedAt: &createdAt, UpdatedAt: &updatedAt, PendingCancellationDate: nil, LastActivityAt: &lastActivityAt, LastActivityEditor: String("vscode/1.77.3/copilot/1.86.82"), } if !cmp.Equal(got, want) { t.Errorf("Copilot.GetSeatDetails returned %+v, want %+v", got, want) } const methodName = "GetSeatDetails" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Copilot.GetSeatDetails(ctx, "\n", "u") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Copilot.GetSeatDetails(ctx, "o", "u") if got != nil { t.Errorf("Copilot.GetSeatDetails returned %+v, want nil", got) } return resp, err }) } go-github-60.0.0/github/dependabot.go000066400000000000000000000005761457013574700174250ustar00rootroot00000000000000// Copyright 2022 The go-github 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 // DependabotService handles communication with the Dependabot related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/rest/dependabot/ type DependabotService service go-github-60.0.0/github/dependabot_alerts.go000066400000000000000000000162051457013574700207730ustar00rootroot00000000000000// Copyright 2022 The go-github 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" ) // Dependency represents the vulnerable dependency. type Dependency struct { Package *VulnerabilityPackage `json:"package,omitempty"` ManifestPath *string `json:"manifest_path,omitempty"` Scope *string `json:"scope,omitempty"` } // AdvisoryCVSS represents the advisory pertaining to the Common Vulnerability Scoring System. type AdvisoryCVSS struct { Score *float64 `json:"score,omitempty"` VectorString *string `json:"vector_string,omitempty"` } // AdvisoryCWEs represent the advisory pertaining to Common Weakness Enumeration. type AdvisoryCWEs struct { CWEID *string `json:"cwe_id,omitempty"` Name *string `json:"name,omitempty"` } // DependabotSecurityAdvisory represents the GitHub Security Advisory. type DependabotSecurityAdvisory struct { GHSAID *string `json:"ghsa_id,omitempty"` CVEID *string `json:"cve_id,omitempty"` Summary *string `json:"summary,omitempty"` Description *string `json:"description,omitempty"` Vulnerabilities []*AdvisoryVulnerability `json:"vulnerabilities,omitempty"` Severity *string `json:"severity,omitempty"` CVSS *AdvisoryCVSS `json:"cvss,omitempty"` CWEs []*AdvisoryCWEs `json:"cwes,omitempty"` Identifiers []*AdvisoryIdentifier `json:"identifiers,omitempty"` References []*AdvisoryReference `json:"references,omitempty"` PublishedAt *Timestamp `json:"published_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` WithdrawnAt *Timestamp `json:"withdrawn_at,omitempty"` } // DependabotAlert represents a Dependabot alert. type DependabotAlert struct { Number *int `json:"number,omitempty"` State *string `json:"state,omitempty"` Dependency *Dependency `json:"dependency,omitempty"` SecurityAdvisory *DependabotSecurityAdvisory `json:"security_advisory,omitempty"` SecurityVulnerability *AdvisoryVulnerability `json:"security_vulnerability,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` DismissedAt *Timestamp `json:"dismissed_at,omitempty"` DismissedBy *User `json:"dismissed_by,omitempty"` DismissedReason *string `json:"dismissed_reason,omitempty"` DismissedComment *string `json:"dismissed_comment,omitempty"` FixedAt *Timestamp `json:"fixed_at,omitempty"` AutoDismissedAt *Timestamp `json:"auto_dismissed_at,omitempty"` // The repository is always empty for events Repository *Repository `json:"repository,omitempty"` } // DependabotAlertState represents the state of a Dependabot alert to update. type DependabotAlertState struct { // The state of the Dependabot alert. A dismissed_reason must be provided when setting the state to dismissed. State string `json:"state"` // Required when state is dismissed. A reason for dismissing the alert. // Can be one of: fix_started, inaccurate, no_bandwidth, not_used, tolerable_risk DismissedReason *string `json:"dismissed_reason,omitempty"` // An optional comment associated with dismissing the alert. DismissedComment *string `json:"dismissed_comment,omitempty"` } // ListAlertsOptions specifies the optional parameters to the DependabotService.ListRepoAlerts // and DependabotService.ListOrgAlerts methods. type ListAlertsOptions struct { State *string `url:"state,omitempty"` Severity *string `url:"severity,omitempty"` Ecosystem *string `url:"ecosystem,omitempty"` Package *string `url:"package,omitempty"` Scope *string `url:"scope,omitempty"` Sort *string `url:"sort,omitempty"` Direction *string `url:"direction,omitempty"` ListOptions ListCursorOptions } func (s *DependabotService) listAlerts(ctx context.Context, url string, opts *ListAlertsOptions) ([]*DependabotAlert, *Response, error) { u, err := addOptions(url, 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 []*DependabotAlert resp, err := s.client.Do(ctx, req, &alerts) if err != nil { return nil, resp, err } return alerts, resp, nil } // ListRepoAlerts lists all Dependabot alerts of a repository. // // GitHub API docs: https://docs.github.com/rest/dependabot/alerts#list-dependabot-alerts-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/dependabot/alerts func (s *DependabotService) ListRepoAlerts(ctx context.Context, owner, repo string, opts *ListAlertsOptions) ([]*DependabotAlert, *Response, error) { url := fmt.Sprintf("repos/%v/%v/dependabot/alerts", owner, repo) return s.listAlerts(ctx, url, opts) } // ListOrgAlerts lists all Dependabot alerts of an organization. // // GitHub API docs: https://docs.github.com/rest/dependabot/alerts#list-dependabot-alerts-for-an-organization // //meta:operation GET /orgs/{org}/dependabot/alerts func (s *DependabotService) ListOrgAlerts(ctx context.Context, org string, opts *ListAlertsOptions) ([]*DependabotAlert, *Response, error) { url := fmt.Sprintf("orgs/%v/dependabot/alerts", org) return s.listAlerts(ctx, url, opts) } // GetRepoAlert gets a single repository Dependabot alert. // // GitHub API docs: https://docs.github.com/rest/dependabot/alerts#get-a-dependabot-alert // //meta:operation GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number} func (s *DependabotService) GetRepoAlert(ctx context.Context, owner, repo string, number int) (*DependabotAlert, *Response, error) { url := fmt.Sprintf("repos/%v/%v/dependabot/alerts/%v", owner, repo, number) req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } alert := new(DependabotAlert) resp, err := s.client.Do(ctx, req, alert) if err != nil { return nil, resp, err } return alert, resp, nil } // UpdateAlert updates a Dependabot alert. // // GitHub API docs: https://docs.github.com/rest/dependabot/alerts#update-a-dependabot-alert // //meta:operation PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number} func (s *DependabotService) UpdateAlert(ctx context.Context, owner, repo string, number int, stateInfo *DependabotAlertState) (*DependabotAlert, *Response, error) { url := fmt.Sprintf("repos/%v/%v/dependabot/alerts/%v", owner, repo, number) req, err := s.client.NewRequest("PATCH", url, stateInfo) if err != nil { return nil, nil, err } alert := new(DependabotAlert) resp, err := s.client.Do(ctx, req, alert) if err != nil { return nil, resp, err } return alert, resp, nil } go-github-60.0.0/github/dependabot_alerts_test.go000066400000000000000000000126031457013574700220300ustar00rootroot00000000000000// Copyright 2022 The go-github 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 TestDependabotService_ListRepoAlerts(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/dependabot/alerts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"state": "open"}) fmt.Fprint(w, `[{"number":1,"state":"open"},{"number":42,"state":"fixed"}]`) }) opts := &ListAlertsOptions{State: String("open")} ctx := context.Background() alerts, _, err := client.Dependabot.ListRepoAlerts(ctx, "o", "r", opts) if err != nil { t.Errorf("Dependabot.ListRepoAlerts returned error: %v", err) } want := []*DependabotAlert{ {Number: Int(1), State: String("open")}, {Number: Int(42), State: String("fixed")}, } if !cmp.Equal(alerts, want) { t.Errorf("Dependabot.ListRepoAlerts returned %+v, want %+v", alerts, want) } const methodName = "ListRepoAlerts" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Dependabot.ListRepoAlerts(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Dependabot.ListRepoAlerts(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestDependabotService_GetRepoAlert(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/dependabot/alerts/42", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"number":42,"state":"fixed"}`) }) ctx := context.Background() alert, _, err := client.Dependabot.GetRepoAlert(ctx, "o", "r", 42) if err != nil { t.Errorf("Dependabot.GetRepoAlert returned error: %v", err) } want := &DependabotAlert{ Number: Int(42), State: String("fixed"), } if !cmp.Equal(alert, want) { t.Errorf("Dependabot.GetRepoAlert returned %+v, want %+v", alert, want) } const methodName = "GetRepoAlert" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Dependabot.GetRepoAlert(ctx, "\n", "\n", 0) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Dependabot.GetRepoAlert(ctx, "o", "r", 42) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestDependabotService_ListOrgAlerts(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/dependabot/alerts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"state": "open"}) fmt.Fprint(w, `[{"number":1,"state":"open"},{"number":42,"state":"fixed"}]`) }) opts := &ListAlertsOptions{State: String("open")} ctx := context.Background() alerts, _, err := client.Dependabot.ListOrgAlerts(ctx, "o", opts) if err != nil { t.Errorf("Dependabot.ListOrgAlerts returned error: %v", err) } want := []*DependabotAlert{ {Number: Int(1), State: String("open")}, {Number: Int(42), State: String("fixed")}, } if !cmp.Equal(alerts, want) { t.Errorf("Dependabot.ListOrgAlerts returned %+v, want %+v", alerts, want) } const methodName = "ListOrgAlerts" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Dependabot.ListOrgAlerts(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Dependabot.ListOrgAlerts(ctx, "o", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestDependabotService_UpdateAlert(t *testing.T) { client, mux, _, teardown := setup() defer teardown() state := String("dismissed") dismissedReason := String("no_bandwidth") dismissedComment := String("no time to fix this") alertState := &DependabotAlertState{State: *state, DismissedReason: dismissedReason, DismissedComment: dismissedComment} mux.HandleFunc("/repos/o/r/dependabot/alerts/42", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") fmt.Fprint(w, `{"number":42,"state":"dismissed","dismissed_reason":"no_bandwidth","dismissed_comment":"no time to fix this"}`) }) ctx := context.Background() alert, _, err := client.Dependabot.UpdateAlert(ctx, "o", "r", 42, alertState) if err != nil { t.Errorf("Dependabot.UpdateAlert returned error: %v", err) } want := &DependabotAlert{ Number: Int(42), State: String("dismissed"), DismissedReason: String("no_bandwidth"), DismissedComment: String("no time to fix this"), } if !cmp.Equal(alert, want) { t.Errorf("Dependabot.UpdateAlert returned %+v, want %+v", alert, want) } const methodName = "UpdateAlert" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Dependabot.UpdateAlert(ctx, "\n", "\n", 0, alertState) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Dependabot.UpdateAlert(ctx, "o", "r", 42, alertState) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/dependabot_secrets.go000066400000000000000000000257331457013574700211570ustar00rootroot00000000000000// Copyright 2022 The go-github 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" ) func (s *DependabotService) getPublicKey(ctx context.Context, url string) (*PublicKey, *Response, error) { req, err := s.client.NewRequest("GET", url, 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 } // GetRepoPublicKey gets a public key that should be used for Dependabot secret encryption. // // GitHub API docs: https://docs.github.com/rest/dependabot/secrets#get-a-repository-public-key // //meta:operation GET /repos/{owner}/{repo}/dependabot/secrets/public-key func (s *DependabotService) GetRepoPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/public-key", owner, repo) return s.getPublicKey(ctx, url) } // GetOrgPublicKey gets a public key that should be used for Dependabot secret encryption. // // GitHub API docs: https://docs.github.com/rest/dependabot/secrets#get-an-organization-public-key // //meta:operation GET /orgs/{org}/dependabot/secrets/public-key func (s *DependabotService) GetOrgPublicKey(ctx context.Context, org string) (*PublicKey, *Response, error) { url := fmt.Sprintf("orgs/%v/dependabot/secrets/public-key", org) return s.getPublicKey(ctx, url) } func (s *DependabotService) listSecrets(ctx context.Context, url string, opts *ListOptions) (*Secrets, *Response, error) { u, err := addOptions(url, 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 } // ListRepoSecrets lists all Dependabot secrets available in a repository // without revealing their encrypted values. // // GitHub API docs: https://docs.github.com/rest/dependabot/secrets#list-repository-secrets // //meta:operation GET /repos/{owner}/{repo}/dependabot/secrets func (s *DependabotService) ListRepoSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { url := fmt.Sprintf("repos/%v/%v/dependabot/secrets", owner, repo) return s.listSecrets(ctx, url, opts) } // ListOrgSecrets lists all Dependabot secrets available in an organization // without revealing their encrypted values. // // GitHub API docs: https://docs.github.com/rest/dependabot/secrets#list-organization-secrets // //meta:operation GET /orgs/{org}/dependabot/secrets func (s *DependabotService) ListOrgSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { url := fmt.Sprintf("orgs/%v/dependabot/secrets", org) return s.listSecrets(ctx, url, opts) } func (s *DependabotService) getSecret(ctx context.Context, url string) (*Secret, *Response, error) { req, err := s.client.NewRequest("GET", url, 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 } // GetRepoSecret gets a single repository Dependabot secret without revealing its encrypted value. // // GitHub API docs: https://docs.github.com/rest/dependabot/secrets#get-a-repository-secret // //meta:operation GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name} func (s *DependabotService) GetRepoSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, name) return s.getSecret(ctx, url) } // GetOrgSecret gets a single organization Dependabot secret without revealing its encrypted value. // // GitHub API docs: https://docs.github.com/rest/dependabot/secrets#get-an-organization-secret // //meta:operation GET /orgs/{org}/dependabot/secrets/{secret_name} func (s *DependabotService) GetOrgSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, name) return s.getSecret(ctx, url) } // DependabotEncryptedSecret represents a secret that is encrypted using a public key for Dependabot. // // 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 DependabotEncryptedSecret struct { Name string `json:"-"` KeyID string `json:"key_id"` EncryptedValue string `json:"encrypted_value"` Visibility string `json:"visibility,omitempty"` SelectedRepositoryIDs DependabotSecretsSelectedRepoIDs `json:"selected_repository_ids,omitempty"` } func (s *DependabotService) putSecret(ctx context.Context, url string, eSecret *DependabotEncryptedSecret) (*Response, error) { req, err := s.client.NewRequest("PUT", url, eSecret) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // CreateOrUpdateRepoSecret creates or updates a repository Dependabot secret with an encrypted value. // // GitHub API docs: https://docs.github.com/rest/dependabot/secrets#create-or-update-a-repository-secret // //meta:operation PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name} func (s *DependabotService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *DependabotEncryptedSecret) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, eSecret.Name) return s.putSecret(ctx, url, eSecret) } // CreateOrUpdateOrgSecret creates or updates an organization Dependabot secret with an encrypted value. // // GitHub API docs: https://docs.github.com/rest/dependabot/secrets#create-or-update-an-organization-secret // //meta:operation PUT /orgs/{org}/dependabot/secrets/{secret_name} func (s *DependabotService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *DependabotEncryptedSecret) (*Response, error) { repoIDs := make([]string, len(eSecret.SelectedRepositoryIDs)) for i, secret := range eSecret.SelectedRepositoryIDs { repoIDs[i] = fmt.Sprintf("%v", secret) } params := struct { *DependabotEncryptedSecret SelectedRepositoryIDs []string `json:"selected_repository_ids,omitempty"` }{ DependabotEncryptedSecret: eSecret, SelectedRepositoryIDs: repoIDs, } url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, eSecret.Name) req, err := s.client.NewRequest("PUT", url, params) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } func (s *DependabotService) deleteSecret(ctx context.Context, url string) (*Response, error) { req, err := s.client.NewRequest("DELETE", url, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DeleteRepoSecret deletes a Dependabot secret in a repository using the secret name. // // GitHub API docs: https://docs.github.com/rest/dependabot/secrets#delete-a-repository-secret // //meta:operation DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name} func (s *DependabotService) DeleteRepoSecret(ctx context.Context, owner, repo, name string) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/dependabot/secrets/%v", owner, repo, name) return s.deleteSecret(ctx, url) } // DeleteOrgSecret deletes a Dependabot secret in an organization using the secret name. // // GitHub API docs: https://docs.github.com/rest/dependabot/secrets#delete-an-organization-secret // //meta:operation DELETE /orgs/{org}/dependabot/secrets/{secret_name} func (s *DependabotService) DeleteOrgSecret(ctx context.Context, org, name string) (*Response, error) { url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v", org, name) return s.deleteSecret(ctx, url) } // ListSelectedReposForOrgSecret lists all repositories that have access to a Dependabot secret. // // GitHub API docs: https://docs.github.com/rest/dependabot/secrets#list-selected-repositories-for-an-organization-secret // //meta:operation GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories func (s *DependabotService) ListSelectedReposForOrgSecret(ctx context.Context, org, name string, opts *ListOptions) (*SelectedReposList, *Response, error) { url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories", org, name) u, err := addOptions(url, 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 } // DependabotSecretsSelectedRepoIDs are the repository IDs that have access to the dependabot secrets. type DependabotSecretsSelectedRepoIDs []int64 // SetSelectedReposForOrgSecret sets the repositories that have access to a Dependabot secret. // // GitHub API docs: https://docs.github.com/rest/dependabot/secrets#set-selected-repositories-for-an-organization-secret // //meta:operation PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories func (s *DependabotService) SetSelectedReposForOrgSecret(ctx context.Context, org, name string, ids DependabotSecretsSelectedRepoIDs) (*Response, error) { url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories", org, name) type repoIDs struct { SelectedIDs DependabotSecretsSelectedRepoIDs `json:"selected_repository_ids"` } req, err := s.client.NewRequest("PUT", url, repoIDs{SelectedIDs: ids}) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // AddSelectedRepoToOrgSecret adds a repository to an organization Dependabot secret. // // GitHub API docs: https://docs.github.com/rest/dependabot/secrets#add-selected-repository-to-an-organization-secret // //meta:operation PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id} func (s *DependabotService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories/%v", org, name, *repo.ID) req, err := s.client.NewRequest("PUT", url, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // RemoveSelectedRepoFromOrgSecret removes a repository from an organization Dependabot secret. // // GitHub API docs: https://docs.github.com/rest/dependabot/secrets#remove-selected-repository-from-an-organization-secret // //meta:operation DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id} func (s *DependabotService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { url := fmt.Sprintf("orgs/%v/dependabot/secrets/%v/repositories/%v", org, name, *repo.ID) req, err := s.client.NewRequest("DELETE", url, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/dependabot_secrets_test.go000066400000000000000000000450551457013574700222150ustar00rootroot00000000000000// Copyright 2022 The go-github 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 TestDependabotService_GetRepoPublicKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/dependabot/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.Dependabot.GetRepoPublicKey(ctx, "o", "r") if err != nil { t.Errorf("Dependabot.GetRepoPublicKey returned error: %v", err) } want := &PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} if !cmp.Equal(key, want) { t.Errorf("Dependabot.GetRepoPublicKey returned %+v, want %+v", key, want) } const methodName = "GetRepoPublicKey" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Dependabot.GetRepoPublicKey(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Dependabot.GetRepoPublicKey(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestDependabotService_GetRepoPublicKeyNumeric(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/dependabot/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.Dependabot.GetRepoPublicKey(ctx, "o", "r") if err != nil { t.Errorf("Dependabot.GetRepoPublicKey returned error: %v", err) } want := &PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} if !cmp.Equal(key, want) { t.Errorf("Dependabot.GetRepoPublicKey returned %+v, want %+v", key, want) } const methodName = "GetRepoPublicKey" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Dependabot.GetRepoPublicKey(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Dependabot.GetRepoPublicKey(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestDependabotService_ListRepoSecrets(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/dependabot/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.Dependabot.ListRepoSecrets(ctx, "o", "r", opts) if err != nil { t.Errorf("Dependabot.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("Dependabot.ListRepoSecrets returned %+v, want %+v", secrets, want) } const methodName = "ListRepoSecrets" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Dependabot.ListRepoSecrets(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Dependabot.ListRepoSecrets(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestDependabotService_GetRepoSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/dependabot/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.Dependabot.GetRepoSecret(ctx, "o", "r", "NAME") if err != nil { t.Errorf("Dependabot.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("Dependabot.GetRepoSecret returned %+v, want %+v", secret, want) } const methodName = "GetRepoSecret" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Dependabot.GetRepoSecret(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Dependabot.GetRepoSecret(ctx, "o", "r", "NAME") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestDependabotService_CreateOrUpdateRepoSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/dependabot/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 := &DependabotEncryptedSecret{ Name: "NAME", EncryptedValue: "QIv=", KeyID: "1234", } ctx := context.Background() _, err := client.Dependabot.CreateOrUpdateRepoSecret(ctx, "o", "r", input) if err != nil { t.Errorf("Dependabot.CreateOrUpdateRepoSecret returned error: %v", err) } const methodName = "CreateOrUpdateRepoSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Dependabot.CreateOrUpdateRepoSecret(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Dependabot.CreateOrUpdateRepoSecret(ctx, "o", "r", input) }) } func TestDependabotService_DeleteRepoSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/dependabot/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Dependabot.DeleteRepoSecret(ctx, "o", "r", "NAME") if err != nil { t.Errorf("Dependabot.DeleteRepoSecret returned error: %v", err) } const methodName = "DeleteRepoSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Dependabot.DeleteRepoSecret(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Dependabot.DeleteRepoSecret(ctx, "o", "r", "NAME") }) } func TestDependabotService_GetOrgPublicKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/dependabot/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.Dependabot.GetOrgPublicKey(ctx, "o") if err != nil { t.Errorf("Dependabot.GetOrgPublicKey returned error: %v", err) } want := &PublicKey{KeyID: String("012345678"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} if !cmp.Equal(key, want) { t.Errorf("Dependabot.GetOrgPublicKey returned %+v, want %+v", key, want) } const methodName = "GetOrgPublicKey" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Dependabot.GetOrgPublicKey(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Dependabot.GetOrgPublicKey(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestDependabotService_ListOrgSecrets(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/dependabot/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/dependabot/secrets/SUPER_SECRET/repositories"}]}`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() secrets, _, err := client.Dependabot.ListOrgSecrets(ctx, "o", opts) if err != nil { t.Errorf("Dependabot.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/dependabot/secrets/SUPER_SECRET/repositories"}, }, } if !cmp.Equal(secrets, want) { t.Errorf("Dependabot.ListOrgSecrets returned %+v, want %+v", secrets, want) } const methodName = "ListOrgSecrets" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Dependabot.ListOrgSecrets(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Dependabot.ListOrgSecrets(ctx, "o", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestDependabotService_GetOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/dependabot/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/dependabot/secrets/SUPER_SECRET/repositories"}`) }) ctx := context.Background() secret, _, err := client.Dependabot.GetOrgSecret(ctx, "o", "NAME") if err != nil { t.Errorf("Dependabot.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/dependabot/secrets/SUPER_SECRET/repositories", } if !cmp.Equal(secret, want) { t.Errorf("Dependabot.GetOrgSecret returned %+v, want %+v", secret, want) } const methodName = "GetOrgSecret" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Dependabot.GetOrgSecret(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Dependabot.GetOrgSecret(ctx, "o", "NAME") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestDependabotService_CreateOrUpdateOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/dependabot/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 := &DependabotEncryptedSecret{ Name: "NAME", EncryptedValue: "QIv=", KeyID: "1234", Visibility: "selected", SelectedRepositoryIDs: DependabotSecretsSelectedRepoIDs{1296269, 1269280}, } ctx := context.Background() _, err := client.Dependabot.CreateOrUpdateOrgSecret(ctx, "o", input) if err != nil { t.Errorf("Dependabot.CreateOrUpdateOrgSecret returned error: %v", err) } const methodName = "CreateOrUpdateOrgSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Dependabot.CreateOrUpdateOrgSecret(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Dependabot.CreateOrUpdateOrgSecret(ctx, "o", input) }) } func TestDependabotService_ListSelectedReposForOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/dependabot/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.Dependabot.ListSelectedReposForOrgSecret(ctx, "o", "NAME", opts) if err != nil { t.Errorf("Dependabot.ListSelectedReposForOrgSecret returned error: %v", err) } want := &SelectedReposList{ TotalCount: Int(1), Repositories: []*Repository{ {ID: Int64(1)}, }, } if !cmp.Equal(repos, want) { t.Errorf("Dependabot.ListSelectedReposForOrgSecret returned %+v, want %+v", repos, want) } const methodName = "ListSelectedReposForOrgSecret" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Dependabot.ListSelectedReposForOrgSecret(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Dependabot.ListSelectedReposForOrgSecret(ctx, "o", "NAME", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestDependabotService_SetSelectedReposForOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/dependabot/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.Dependabot.SetSelectedReposForOrgSecret(ctx, "o", "NAME", DependabotSecretsSelectedRepoIDs{64780797}) if err != nil { t.Errorf("Dependabot.SetSelectedReposForOrgSecret returned error: %v", err) } const methodName = "SetSelectedReposForOrgSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Dependabot.SetSelectedReposForOrgSecret(ctx, "\n", "\n", DependabotSecretsSelectedRepoIDs{64780797}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Dependabot.SetSelectedReposForOrgSecret(ctx, "o", "NAME", DependabotSecretsSelectedRepoIDs{64780797}) }) } func TestDependabotService_AddSelectedRepoToOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/dependabot/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.Dependabot.AddSelectedRepoToOrgSecret(ctx, "o", "NAME", repo) if err != nil { t.Errorf("Dependabot.AddSelectedRepoToOrgSecret returned error: %v", err) } const methodName = "AddSelectedRepoToOrgSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Dependabot.AddSelectedRepoToOrgSecret(ctx, "\n", "\n", repo) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Dependabot.AddSelectedRepoToOrgSecret(ctx, "o", "NAME", repo) }) } func TestDependabotService_RemoveSelectedRepoFromOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/dependabot/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.Dependabot.RemoveSelectedRepoFromOrgSecret(ctx, "o", "NAME", repo) if err != nil { t.Errorf("Dependabot.RemoveSelectedRepoFromOrgSecret returned error: %v", err) } const methodName = "RemoveSelectedRepoFromOrgSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Dependabot.RemoveSelectedRepoFromOrgSecret(ctx, "\n", "\n", repo) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Dependabot.RemoveSelectedRepoFromOrgSecret(ctx, "o", "NAME", repo) }) } func TestDependabotService_DeleteOrgSecret(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/dependabot/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Dependabot.DeleteOrgSecret(ctx, "o", "NAME") if err != nil { t.Errorf("Dependabot.DeleteOrgSecret returned error: %v", err) } const methodName = "DeleteOrgSecret" testBadOptions(t, methodName, func() (err error) { _, err = client.Dependabot.DeleteOrgSecret(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Dependabot.DeleteOrgSecret(ctx, "o", "NAME") }) } go-github-60.0.0/github/dependency_graph.go000066400000000000000000000051351457013574700206130ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) type DependencyGraphService service // SBOM represents a software bill of materials, which describes the // packages/libraries that a repository depends on. type SBOM struct { SBOM *SBOMInfo `json:"sbom,omitempty"` } // CreationInfo represents when the SBOM was created and who created it. type CreationInfo struct { Created *Timestamp `json:"created,omitempty"` Creators []string `json:"creators,omitempty"` } // RepoDependencies represents the dependencies of a repo. type RepoDependencies struct { SPDXID *string `json:"SPDXID,omitempty"` // Package name Name *string `json:"name,omitempty"` VersionInfo *string `json:"versionInfo,omitempty"` DownloadLocation *string `json:"downloadLocation,omitempty"` FilesAnalyzed *bool `json:"filesAnalyzed,omitempty"` LicenseConcluded *string `json:"licenseConcluded,omitempty"` LicenseDeclared *string `json:"licenseDeclared,omitempty"` } // SBOMInfo represents a software bill of materials (SBOM) using SPDX. // SPDX is an open standard for SBOMs that // identifies and catalogs components, licenses, copyrights, security // references, and other metadata relating to software. type SBOMInfo struct { SPDXID *string `json:"SPDXID,omitempty"` SPDXVersion *string `json:"spdxVersion,omitempty"` CreationInfo *CreationInfo `json:"creationInfo,omitempty"` // Repo name Name *string `json:"name,omitempty"` DataLicense *string `json:"dataLicense,omitempty"` DocumentDescribes []string `json:"documentDescribes,omitempty"` DocumentNamespace *string `json:"documentNamespace,omitempty"` // List of packages dependencies Packages []*RepoDependencies `json:"packages,omitempty"` } func (s SBOM) String() string { return Stringify(s) } // GetSBOM fetches the software bill of materials for a repository. // // GitHub API docs: https://docs.github.com/rest/dependency-graph/sboms#export-a-software-bill-of-materials-sbom-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/dependency-graph/sbom func (s *DependencyGraphService) GetSBOM(ctx context.Context, owner, repo string) (*SBOM, *Response, error) { u := fmt.Sprintf("repos/%v/%v/dependency-graph/sbom", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var sbom *SBOM resp, err := s.client.Do(ctx, req, &sbom) if err != nil { return nil, resp, err } return sbom, resp, nil } go-github-60.0.0/github/dependency_graph_test.go000066400000000000000000000035351457013574700216540ustar00rootroot00000000000000// Copyright 2023 The go-github 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 TestDependencyGraphService_GetSBOM(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/owner/repo/dependency-graph/sbom", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "sbom":{ "creationInfo":{ "created":"2021-09-01T00:00:00Z" }, "name":"owner/repo", "packages":[ { "name":"rubygems:rails", "versionInfo":"1.0.0" } ] } }`) }) ctx := context.Background() sbom, _, err := client.DependencyGraph.GetSBOM(ctx, "owner", "repo") if err != nil { t.Errorf("DependencyGraph.GetSBOM returned error: %v", err) } testTime := time.Date(2021, 9, 1, 0, 0, 0, 0, time.UTC) want := &SBOM{ &SBOMInfo{ CreationInfo: &CreationInfo{ Created: &Timestamp{testTime}, }, Name: String("owner/repo"), Packages: []*RepoDependencies{ { Name: String("rubygems:rails"), VersionInfo: String("1.0.0"), }, }, }, } if !cmp.Equal(sbom, want) { t.Errorf("DependencyGraph.GetSBOM returned %+v, want %+v", sbom, want) } const methodName = "GetSBOM" testBadOptions(t, methodName, func() (err error) { _, _, err = client.DependencyGraph.GetSBOM(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.DependencyGraph.GetSBOM(ctx, "owner", "repo") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/doc.go000066400000000000000000000154201457013574700160570ustar00rootroot00000000000000// 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/v60/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/rest . 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 Use Client.WithAuthToken to configure your client to authenticate using an Oauth token (for example, a personal access token). This is what is needed for a majority of use cases aside from GitHub Apps. client := github.NewClient(nil).WithAuthToken("... your access token ...") 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. 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. It supports both authentication as an installation, using an installation access token, and as an app, using a JWT. To authenticate as an installation: 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... } To authenticate as an app, using a JWT: import "github.com/bradleyfalzon/ghinstallation" func main() { // Wrap the shared transport for use with the application ID 1. atr, err := ghinstallation.NewAppsTransportKeyFromFile(http.DefaultTransport, 1, "2016-10-19.private-key.pem") if err != nil { // Handle error. } // Use app transport with client client := github.NewClient(&http.Client{Transport: atr}) // 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. For secondary rate limits, you can check if its type is *github.AbuseRateLimitError: repos, _, err := client.Repositories.List(ctx, "", nil) if _, ok := err.(*github.RateLimitError); ok { log.Println("hit rate limit") } if _, ok := err.(*github.AbuseRateLimitError); ok { log.Println("hit secondary rate limit") } Learn more about GitHub rate limiting at https://docs.github.com/rest/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: 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/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-60.0.0/github/emojis.go000066400000000000000000000020231457013574700165730ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // EmojisService provides access to emoji-related functions in the GitHub API. type EmojisService service // List returns the emojis available to use on GitHub. // // GitHub API docs: https://docs.github.com/rest/emojis/emojis#get-emojis // //meta:operation GET /emojis func (s *EmojisService) List(ctx context.Context) (map[string]string, *Response, error) { req, err := s.client.NewRequest("GET", "emojis", nil) if err != nil { return nil, nil, err } var emoji map[string]string resp, err := s.client.Do(ctx, req, &emoji) if err != nil { return nil, resp, err } return emoji, resp, nil } // ListEmojis returns the emojis available to use on GitHub. // // Deprecated: Use EmojisService.List instead func (c *Client) ListEmojis(ctx context.Context) (map[string]string, *Response, error) { return c.Emojis.List(ctx) } go-github-60.0.0/github/emojis_test.go000066400000000000000000000020361457013574700176360ustar00rootroot00000000000000// Copyright 2023 The go-github 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 TestEmojisService_List(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("List returned error: %v", err) } want := map[string]string{"+1": "+1.png"} if !cmp.Equal(want, emoji) { t.Errorf("List returned %+v, want %+v", emoji, want) } const methodName = "List" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Emojis.List(ctx) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/enterprise.go000066400000000000000000000005761457013574700175000ustar00rootroot00000000000000// 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/rest/enterprise-admin/ type EnterpriseService service go-github-60.0.0/github/enterprise_actions_runner_groups.go000066400000000000000000000351361457013574700242100ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // ListOrganizations represents the response from the list orgs endpoints. type ListOrganizations struct { TotalCount *int `json:"total_count,omitempty"` Organizations []*Organization `json:"organizations"` } // EnterpriseRunnerGroup represents a self-hosted runner group configured in an enterprise. type EnterpriseRunnerGroup struct { ID *int64 `json:"id,omitempty"` Name *string `json:"name,omitempty"` Visibility *string `json:"visibility,omitempty"` Default *bool `json:"default,omitempty"` SelectedOrganizationsURL *string `json:"selected_organizations_url,omitempty"` RunnersURL *string `json:"runners_url,omitempty"` Inherited *bool `json:"inherited,omitempty"` AllowsPublicRepositories *bool `json:"allows_public_repositories,omitempty"` RestrictedToWorkflows *bool `json:"restricted_to_workflows,omitempty"` SelectedWorkflows []string `json:"selected_workflows,omitempty"` WorkflowRestrictionsReadOnly *bool `json:"workflow_restrictions_read_only,omitempty"` } // EnterpriseRunnerGroups represents a collection of self-hosted runner groups configured for an enterprise. type EnterpriseRunnerGroups struct { TotalCount *int `json:"total_count,omitempty"` RunnerGroups []*EnterpriseRunnerGroup `json:"runner_groups"` } // CreateEnterpriseRunnerGroupRequest represents a request to create a Runner group for an enterprise. type CreateEnterpriseRunnerGroupRequest struct { Name *string `json:"name,omitempty"` Visibility *string `json:"visibility,omitempty"` // List of organization IDs that can access the runner group. SelectedOrganizationIDs []int64 `json:"selected_organization_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"` // If true, the runner group will be restricted to running only the workflows specified in the SelectedWorkflows slice. RestrictedToWorkflows *bool `json:"restricted_to_workflows,omitempty"` // List of workflows the runner group should be allowed to run. This setting will be ignored unless RestrictedToWorkflows is set to true. SelectedWorkflows []string `json:"selected_workflows,omitempty"` } // UpdateEnterpriseRunnerGroupRequest represents a request to update a Runner group for an enterprise. type UpdateEnterpriseRunnerGroupRequest struct { Name *string `json:"name,omitempty"` Visibility *string `json:"visibility,omitempty"` AllowsPublicRepositories *bool `json:"allows_public_repositories,omitempty"` RestrictedToWorkflows *bool `json:"restricted_to_workflows,omitempty"` SelectedWorkflows []string `json:"selected_workflows,omitempty"` } // SetOrgAccessRunnerGroupRequest represents a request to replace the list of organizations // that can access a self-hosted runner group configured in an enterprise. type SetOrgAccessRunnerGroupRequest struct { // Updated list of organization IDs that should be given access to the runner group. SelectedOrganizationIDs []int64 `json:"selected_organization_ids"` } // ListEnterpriseRunnerGroupOptions extend ListOptions to have the optional parameters VisibleToOrganization. type ListEnterpriseRunnerGroupOptions struct { ListOptions // Only return runner groups that are allowed to be used by this organization. VisibleToOrganization string `url:"visible_to_organization,omitempty"` } // ListRunnerGroups lists all self-hosted runner groups configured in an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#list-self-hosted-runner-groups-for-an-enterprise // //meta:operation GET /enterprises/{enterprise}/actions/runner-groups func (s *EnterpriseService) ListRunnerGroups(ctx context.Context, enterprise string, opts *ListEnterpriseRunnerGroupOptions) (*EnterpriseRunnerGroups, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runner-groups", 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 } groups := &EnterpriseRunnerGroups{} resp, err := s.client.Do(ctx, req, &groups) if err != nil { return nil, resp, err } return groups, resp, nil } // GetEnterpriseRunnerGroup gets a specific self-hosted runner group for an enterprise using its RunnerGroup ID. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#get-a-self-hosted-runner-group-for-an-enterprise // //meta:operation GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id} func (s *EnterpriseService) GetEnterpriseRunnerGroup(ctx context.Context, enterprise string, groupID int64) (*EnterpriseRunnerGroup, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runner-groups/%v", enterprise, groupID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } runnerGroup := new(EnterpriseRunnerGroup) resp, err := s.client.Do(ctx, req, runnerGroup) if err != nil { return nil, resp, err } return runnerGroup, resp, nil } // DeleteEnterpriseRunnerGroup deletes a self-hosted runner group from an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#delete-a-self-hosted-runner-group-from-an-enterprise // //meta:operation DELETE /enterprises/{enterprise}/actions/runner-groups/{runner_group_id} func (s *EnterpriseService) DeleteEnterpriseRunnerGroup(ctx context.Context, enterprise string, groupID int64) (*Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runner-groups/%v", enterprise, groupID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // CreateEnterpriseRunnerGroup creates a new self-hosted runner group for an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#create-a-self-hosted-runner-group-for-an-enterprise // //meta:operation POST /enterprises/{enterprise}/actions/runner-groups func (s *EnterpriseService) CreateEnterpriseRunnerGroup(ctx context.Context, enterprise string, createReq CreateEnterpriseRunnerGroupRequest) (*EnterpriseRunnerGroup, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runner-groups", enterprise) req, err := s.client.NewRequest("POST", u, createReq) if err != nil { return nil, nil, err } runnerGroup := new(EnterpriseRunnerGroup) resp, err := s.client.Do(ctx, req, runnerGroup) if err != nil { return nil, resp, err } return runnerGroup, resp, nil } // UpdateEnterpriseRunnerGroup updates a self-hosted runner group for an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#update-a-self-hosted-runner-group-for-an-enterprise // //meta:operation PATCH /enterprises/{enterprise}/actions/runner-groups/{runner_group_id} func (s *EnterpriseService) UpdateEnterpriseRunnerGroup(ctx context.Context, enterprise string, groupID int64, updateReq UpdateEnterpriseRunnerGroupRequest) (*EnterpriseRunnerGroup, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runner-groups/%v", enterprise, groupID) req, err := s.client.NewRequest("PATCH", u, updateReq) if err != nil { return nil, nil, err } runnerGroup := new(EnterpriseRunnerGroup) resp, err := s.client.Do(ctx, req, runnerGroup) if err != nil { return nil, resp, err } return runnerGroup, resp, nil } // ListOrganizationAccessRunnerGroup lists the organizations with access to a self-hosted runner group configured in an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#list-organization-access-to-a-self-hosted-runner-group-in-an-enterprise // //meta:operation GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations func (s *EnterpriseService) ListOrganizationAccessRunnerGroup(ctx context.Context, enterprise string, groupID int64, opts *ListOptions) (*ListOrganizations, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runner-groups/%v/organizations", enterprise, 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 } orgs := &ListOrganizations{} resp, err := s.client.Do(ctx, req, &orgs) if err != nil { return nil, resp, err } return orgs, resp, nil } // SetOrganizationAccessRunnerGroup replaces the list of organizations that have access to a self-hosted runner group configured in an enterprise // with a new List of organizations. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#set-organization-access-for-a-self-hosted-runner-group-in-an-enterprise // //meta:operation PUT /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations func (s *EnterpriseService) SetOrganizationAccessRunnerGroup(ctx context.Context, enterprise string, groupID int64, ids SetOrgAccessRunnerGroupRequest) (*Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runner-groups/%v/organizations", enterprise, groupID) req, err := s.client.NewRequest("PUT", u, ids) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // AddOrganizationAccessRunnerGroup adds an organization to the list of selected organizations that can access a self-hosted runner group. // The runner group must have visibility set to 'selected'. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#add-organization-access-to-a-self-hosted-runner-group-in-an-enterprise // //meta:operation PUT /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations/{org_id} func (s *EnterpriseService) AddOrganizationAccessRunnerGroup(ctx context.Context, enterprise string, groupID, orgID int64) (*Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runner-groups/%v/organizations/%v", enterprise, groupID, orgID) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // RemoveOrganizationAccessRunnerGroup removes an organization from the list of selected organizations that can access a self-hosted runner group. // The runner group must have visibility set to 'selected'. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#remove-organization-access-to-a-self-hosted-runner-group-in-an-enterprise // //meta:operation DELETE /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations/{org_id} func (s *EnterpriseService) RemoveOrganizationAccessRunnerGroup(ctx context.Context, enterprise string, groupID, orgID int64) (*Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runner-groups/%v/organizations/%v", enterprise, groupID, orgID) 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 enterprise group. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#list-self-hosted-runners-in-a-group-for-an-enterprise // //meta:operation GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners func (s *EnterpriseService) ListRunnerGroupRunners(ctx context.Context, enterprise string, groupID int64, opts *ListOptions) (*Runners, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runner-groups/%v/runners", enterprise, 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 enterprise runner group // with a new list of runners. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#set-self-hosted-runners-in-a-group-for-an-enterprise // //meta:operation PUT /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners func (s *EnterpriseService) SetRunnerGroupRunners(ctx context.Context, enterprise string, groupID int64, ids SetRunnerGroupRunnersRequest) (*Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runner-groups/%v/runners", enterprise, 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 enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#add-a-self-hosted-runner-to-a-group-for-an-enterprise // //meta:operation PUT /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners/{runner_id} func (s *EnterpriseService) AddRunnerGroupRunners(ctx context.Context, enterprise string, groupID, runnerID int64) (*Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runner-groups/%v/runners/%v", enterprise, 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 enterprise. // The runner is then returned to the default group. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runner-groups#remove-a-self-hosted-runner-from-a-group-for-an-enterprise // //meta:operation DELETE /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners/{runner_id} func (s *EnterpriseService) RemoveRunnerGroupRunners(ctx context.Context, enterprise string, groupID, runnerID int64) (*Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runner-groups/%v/runners/%v", enterprise, 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-60.0.0/github/enterprise_actions_runner_groups_test.go000066400000000000000000000640741457013574700252520ustar00rootroot00000000000000// Copyright 2023 The go-github 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 TestEnterpriseService_ListRunnerGroups(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/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/enterprises/octo-enterprise/actions/runner_groups/1/runners","inherited":false,"allows_public_repositories":true,"restricted_to_workflows":true,"selected_workflows":["a","b"]},{"id":2,"name":"octo-runner-group","visibility":"selected","default":false,"selected_organizations_url":"https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/organizations","runners_url":"https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/runners","inherited":true,"allows_public_repositories":true,"restricted_to_workflows":false,"selected_workflows":[]},{"id":3,"name":"expensive-hardware","visibility":"private","default":false,"runners_url":"https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/3/runners","inherited":false,"allows_public_repositories":true,"restricted_to_workflows":false,"selected_workflows":[]}]}`) }) opts := &ListEnterpriseRunnerGroupOptions{ListOptions: ListOptions{Page: 2, PerPage: 2}} ctx := context.Background() groups, _, err := client.Enterprise.ListRunnerGroups(ctx, "o", opts) if err != nil { t.Errorf("Enterprise.ListRunnerGroups returned error: %v", err) } want := &EnterpriseRunnerGroups{ TotalCount: Int(3), RunnerGroups: []*EnterpriseRunnerGroup{ {ID: Int64(1), Name: String("Default"), Visibility: String("all"), Default: Bool(true), RunnersURL: String("https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/1/runners"), Inherited: Bool(false), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(true), SelectedWorkflows: []string{"a", "b"}}, {ID: Int64(2), Name: String("octo-runner-group"), Visibility: String("selected"), Default: Bool(false), SelectedOrganizationsURL: String("https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/organizations"), RunnersURL: String("https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/runners"), Inherited: Bool(true), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}}, {ID: Int64(3), Name: String("expensive-hardware"), Visibility: String("private"), Default: Bool(false), RunnersURL: String("https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/3/runners"), Inherited: Bool(false), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}}, }, } if !cmp.Equal(groups, want) { t.Errorf("Enterprise.ListRunnerGroups returned %+v, want %+v", groups, want) } const methodName = "ListRunnerGroups" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Enterprise.ListRunnerGroups(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Enterprise.ListRunnerGroups(ctx, "o", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestEnterpriseService_ListRunnerGroupsVisibleToOrganization(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/o/actions/runner-groups", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "2", "visible_to_organization": "github"}) fmt.Fprint(w, `{"total_count":3,"runner_groups":[{"id":1,"name":"Default","visibility":"all","default":true,"runners_url":"https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/1/runners","inherited":false,"allows_public_repositories":true,"restricted_to_workflows":false,"selected_workflows":[]},{"id":2,"name":"octo-runner-group","visibility":"selected","default":false,"selected_organizations_url":"https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/organizations","runners_url":"https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/runners","inherited":true,"allows_public_repositories":true,"restricted_to_workflows":false,"selected_workflows":[]},{"id":3,"name":"expensive-hardware","visibility":"private","default":false,"runners_url":"https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/3/runners","inherited":false,"allows_public_repositories":true,"restricted_to_workflows":false,"selected_workflows":[]}]}`) }) opts := &ListEnterpriseRunnerGroupOptions{ListOptions: ListOptions{Page: 2, PerPage: 2}, VisibleToOrganization: "github"} ctx := context.Background() groups, _, err := client.Enterprise.ListRunnerGroups(ctx, "o", opts) if err != nil { t.Errorf("Enterprise.ListRunnerGroups returned error: %v", err) } want := &EnterpriseRunnerGroups{ TotalCount: Int(3), RunnerGroups: []*EnterpriseRunnerGroup{ {ID: Int64(1), Name: String("Default"), Visibility: String("all"), Default: Bool(true), RunnersURL: String("https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/1/runners"), Inherited: Bool(false), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}}, {ID: Int64(2), Name: String("octo-runner-group"), Visibility: String("selected"), Default: Bool(false), SelectedOrganizationsURL: String("https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/organizations"), RunnersURL: String("https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/runners"), Inherited: Bool(true), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}}, {ID: Int64(3), Name: String("expensive-hardware"), Visibility: String("private"), Default: Bool(false), RunnersURL: String("https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/3/runners"), Inherited: Bool(false), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}}, }, } if !cmp.Equal(groups, want) { t.Errorf("Enterprise.ListRunnerGroups returned %+v, want %+v", groups, want) } const methodName = "ListRunnerGroups" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Enterprise.ListRunnerGroups(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Enterprise.ListRunnerGroups(ctx, "o", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestEnterpriseService_GetRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/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_organizations_url":"https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/organizations","runners_url":"https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/runners","inherited":false,"allows_public_repositories":true,"restricted_to_workflows":false,"selected_workflows":[]}`) }) ctx := context.Background() group, _, err := client.Enterprise.GetEnterpriseRunnerGroup(ctx, "o", 2) if err != nil { t.Errorf("Enterprise.GetRunnerGroup returned error: %v", err) } want := &EnterpriseRunnerGroup{ ID: Int64(2), Name: String("octo-runner-group"), Visibility: String("selected"), Default: Bool(false), SelectedOrganizationsURL: String("https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/organizations"), RunnersURL: String("https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/runners"), Inherited: Bool(false), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, } if !cmp.Equal(group, want) { t.Errorf("Enterprise.GetRunnerGroup returned %+v, want %+v", group, want) } const methodName = "GetRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Enterprise.GetEnterpriseRunnerGroup(ctx, "\n", 2) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Enterprise.GetEnterpriseRunnerGroup(ctx, "o", 2) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestEnterpriseService_DeleteRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/o/actions/runner-groups/2", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Enterprise.DeleteEnterpriseRunnerGroup(ctx, "o", 2) if err != nil { t.Errorf("Enterprise.DeleteRunnerGroup returned error: %v", err) } const methodName = "DeleteRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, err = client.Enterprise.DeleteEnterpriseRunnerGroup(ctx, "\n", 2) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Enterprise.DeleteEnterpriseRunnerGroup(ctx, "o", 2) }) } func TestEnterpriseService_CreateRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/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_organizations_url":"https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/organizations","runners_url":"https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/runners","inherited":false,"allows_public_repositories":true,"restricted_to_workflows":false,"selected_workflows":[]}`) }) ctx := context.Background() req := CreateEnterpriseRunnerGroupRequest{ Name: String("octo-runner-group"), Visibility: String("selected"), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, } group, _, err := client.Enterprise.CreateEnterpriseRunnerGroup(ctx, "o", req) if err != nil { t.Errorf("Enterprise.CreateRunnerGroup returned error: %v", err) } want := &EnterpriseRunnerGroup{ ID: Int64(2), Name: String("octo-runner-group"), Visibility: String("selected"), Default: Bool(false), SelectedOrganizationsURL: String("https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/organizations"), RunnersURL: String("https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/runners"), Inherited: Bool(false), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, } if !cmp.Equal(group, want) { t.Errorf("Enterprise.CreateRunnerGroup returned %+v, want %+v", group, want) } const methodName = "CreateRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Enterprise.CreateEnterpriseRunnerGroup(ctx, "\n", req) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Enterprise.CreateEnterpriseRunnerGroup(ctx, "o", req) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestEnterpriseService_UpdateRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/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_organizations_url":"https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/organizations","runners_url":"https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/runners","inherited":false,"allows_public_repositories":true,"restricted_to_workflows":false,"selected_workflows":[]}`) }) ctx := context.Background() req := UpdateEnterpriseRunnerGroupRequest{ Name: String("octo-runner-group"), Visibility: String("selected"), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, } group, _, err := client.Enterprise.UpdateEnterpriseRunnerGroup(ctx, "o", 2, req) if err != nil { t.Errorf("Enterprise.UpdateRunnerGroup returned error: %v", err) } want := &EnterpriseRunnerGroup{ ID: Int64(2), Name: String("octo-runner-group"), Visibility: String("selected"), Default: Bool(false), SelectedOrganizationsURL: String("https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/organizations"), RunnersURL: String("https://api.github.com/enterprises/octo-enterprise/actions/runner_groups/2/runners"), Inherited: Bool(false), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, } if !cmp.Equal(group, want) { t.Errorf("Enterprise.UpdateRunnerGroup returned %+v, want %+v", group, want) } const methodName = "UpdateRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Enterprise.UpdateEnterpriseRunnerGroup(ctx, "\n", 2, req) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Enterprise.UpdateEnterpriseRunnerGroup(ctx, "o", 2, req) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestEnterpriseService_ListOrganizationAccessRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/o/actions/runner-groups/2/organizations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "1", "page": "1"}) fmt.Fprint(w, `{"total_count": 1, "organizations": [{"id": 43, "node_id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5", "name": "Hello-World", "login": "octocat"}]}`) }) ctx := context.Background() opts := &ListOptions{Page: 1, PerPage: 1} groups, _, err := client.Enterprise.ListOrganizationAccessRunnerGroup(ctx, "o", 2, opts) if err != nil { t.Errorf("Enterprise.ListOrganizationAccessRunnerGroup returned error: %v", err) } want := &ListOrganizations{ TotalCount: Int(1), Organizations: []*Organization{ {ID: Int64(43), NodeID: String("MDEwOlJlcG9zaXRvcnkxMjk2MjY5"), Name: String("Hello-World"), Login: String("octocat")}, }, } if !cmp.Equal(groups, want) { t.Errorf("Enterprise.ListOrganizationAccessRunnerGroup returned %+v, want %+v", groups, want) } const methodName = "ListOrganizationAccessRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Enterprise.ListOrganizationAccessRunnerGroup(ctx, "\n", 2, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Enterprise.ListOrganizationAccessRunnerGroup(ctx, "o", 2, opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestEnterpriseService_SetOrganizationAccessRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/o/actions/runner-groups/2/organizations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") }) req := SetOrgAccessRunnerGroupRequest{ SelectedOrganizationIDs: []int64{ 1, 2, }, } ctx := context.Background() _, err := client.Enterprise.SetOrganizationAccessRunnerGroup(ctx, "o", 2, req) if err != nil { t.Errorf("Enterprise.SetOrganizationAccessRunnerGroup returned error: %v", err) } const methodName = "SetRepositoryAccessRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, err = client.Enterprise.SetOrganizationAccessRunnerGroup(ctx, "\n", 2, req) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Enterprise.SetOrganizationAccessRunnerGroup(ctx, "o", 2, req) }) } func TestEnterpriseService_AddOrganizationAccessRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/o/actions/runner-groups/2/organizations/42", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") }) ctx := context.Background() _, err := client.Enterprise.AddOrganizationAccessRunnerGroup(ctx, "o", 2, 42) if err != nil { t.Errorf("Enterprise.AddOrganizationAccessRunnerGroup returned error: %v", err) } const methodName = "AddOrganizationAccessRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, err = client.Enterprise.AddOrganizationAccessRunnerGroup(ctx, "\n", 2, 42) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Enterprise.AddOrganizationAccessRunnerGroup(ctx, "o", 2, 42) }) } func TestEnterpriseService_RemoveOrganizationAccessRunnerGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/o/actions/runner-groups/2/organizations/42", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Enterprise.RemoveOrganizationAccessRunnerGroup(ctx, "o", 2, 42) if err != nil { t.Errorf("Enterprise.RemoveOrganizationAccessRunnerGroup returned error: %v", err) } const methodName = "RemoveOrganizationAccessRunnerGroup" testBadOptions(t, methodName, func() (err error) { _, err = client.Enterprise.RemoveOrganizationAccessRunnerGroup(ctx, "\n", 2, 42) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Enterprise.RemoveOrganizationAccessRunnerGroup(ctx, "o", 2, 42) }) } func TestEnterpriseService_ListEnterpriseRunnerGroupRunners(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/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.Enterprise.ListRunnerGroupRunners(ctx, "o", 2, opts) if err != nil { t.Errorf("Enterprise.ListEnterpriseRunnerGroupRunners 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("Enterprise.ListEnterpriseRunnerGroupRunners returned %+v, want %+v", runners, want) } const methodName = "ListEnterpriseRunnerGroupRunners" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Enterprise.ListRunnerGroupRunners(ctx, "\n", 2, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Enterprise.ListRunnerGroupRunners(ctx, "o", 2, opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestEnterpriseService_SetEnterpriseRunnerGroupRunners(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/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.Enterprise.SetRunnerGroupRunners(ctx, "o", 2, req) if err != nil { t.Errorf("Enterprise.SetEnterpriseRunnerGroupRunners returned error: %v", err) } const methodName = "SetEnterpriseRunnerGroupRunners" testBadOptions(t, methodName, func() (err error) { _, err = client.Enterprise.SetRunnerGroupRunners(ctx, "\n", 2, req) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Enterprise.SetRunnerGroupRunners(ctx, "o", 2, req) }) } func TestEnterpriseService_AddEnterpriseRunnerGroupRunners(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/o/actions/runner-groups/2/runners/42", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") }) ctx := context.Background() _, err := client.Enterprise.AddRunnerGroupRunners(ctx, "o", 2, 42) if err != nil { t.Errorf("Enterprise.AddEnterpriseRunnerGroupRunners returned error: %v", err) } const methodName = "AddEnterpriseRunnerGroupRunners" testBadOptions(t, methodName, func() (err error) { _, err = client.Enterprise.AddRunnerGroupRunners(ctx, "\n", 2, 42) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Enterprise.AddRunnerGroupRunners(ctx, "o", 2, 42) }) } func TestEnterpriseService_RemoveEnterpriseRunnerGroupRunners(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/o/actions/runner-groups/2/runners/42", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Enterprise.RemoveRunnerGroupRunners(ctx, "o", 2, 42) if err != nil { t.Errorf("Enterprise.RemoveEnterpriseRunnerGroupRunners returned error: %v", err) } const methodName = "RemoveEnterpriseRunnerGroupRunners" testBadOptions(t, methodName, func() (err error) { _, err = client.Enterprise.RemoveRunnerGroupRunners(ctx, "\n", 2, 42) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Enterprise.RemoveRunnerGroupRunners(ctx, "o", 2, 42) }) } func TestEnterpriseRunnerGroup_Marshal(t *testing.T) { testJSONMarshal(t, &EnterpriseRunnerGroup{}, "{}") u := &EnterpriseRunnerGroup{ ID: Int64(1), Name: String("n"), Visibility: String("v"), Default: Bool(true), SelectedOrganizationsURL: String("s"), RunnersURL: String("r"), Inherited: Bool(true), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, } want := `{ "id": 1, "name": "n", "visibility": "v", "default": true, "selected_organizations_url": "s", "runners_url": "r", "inherited": true, "allows_public_repositories": true, "restricted_to_workflows": false, "selected_workflows": [] }` testJSONMarshal(t, u, want) } func TestEnterpriseRunnerGroups_Marshal(t *testing.T) { testJSONMarshal(t, &EnterpriseRunnerGroups{}, "{}") u := &EnterpriseRunnerGroups{ TotalCount: Int(1), RunnerGroups: []*EnterpriseRunnerGroup{ { ID: Int64(1), Name: String("n"), Visibility: String("v"), Default: Bool(true), SelectedOrganizationsURL: String("s"), RunnersURL: String("r"), Inherited: Bool(true), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, }, }, } want := `{ "total_count": 1, "runner_groups": [{ "id": 1, "name": "n", "visibility": "v", "default": true, "selected_organizations_url": "s", "runners_url": "r", "inherited": true, "allows_public_repositories": true, "restricted_to_workflows": false, "selected_workflows": [] }] }` testJSONMarshal(t, u, want) } func TestCreateEnterpriseRunnerGroupRequest_Marshal(t *testing.T) { testJSONMarshal(t, &CreateEnterpriseRunnerGroupRequest{}, "{}") u := &CreateEnterpriseRunnerGroupRequest{ Name: String("n"), Visibility: String("v"), SelectedOrganizationIDs: []int64{1}, Runners: []int64{1}, AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(true), SelectedWorkflows: []string{"a", "b"}, } want := `{ "name": "n", "visibility": "v", "selected_organization_ids": [1], "runners": [1], "allows_public_repositories": true, "restricted_to_workflows": true, "selected_workflows": ["a","b"] }` testJSONMarshal(t, u, want) } func TestUpdateEnterpriseRunnerGroupRequest_Marshal(t *testing.T) { testJSONMarshal(t, &UpdateEnterpriseRunnerGroupRequest{}, "{}") u := &UpdateEnterpriseRunnerGroupRequest{ Name: String("n"), Visibility: String("v"), AllowsPublicRepositories: Bool(true), RestrictedToWorkflows: Bool(false), SelectedWorkflows: []string{}, } want := `{ "name": "n", "visibility": "v", "allows_public_repositories": true, "restricted_to_workflows": false, "selected_workflows": [] }` testJSONMarshal(t, u, want) } func TestSetOrgAccessRunnerGroupRequest_Marshal(t *testing.T) { testJSONMarshal(t, &SetOrgAccessRunnerGroupRequest{}, "{}") u := &SetOrgAccessRunnerGroupRequest{ SelectedOrganizationIDs: []int64{1}, } want := `{ "selected_organization_ids": [1] }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/enterprise_actions_runners.go000066400000000000000000000100461457013574700227650ustar00rootroot00000000000000// 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" ) // ListRunnerApplicationDownloads lists self-hosted runner application binaries that can be downloaded and run. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runners#list-runner-applications-for-an-enterprise // //meta:operation GET /enterprises/{enterprise}/actions/runners/downloads func (s *EnterpriseService) ListRunnerApplicationDownloads(ctx context.Context, enterprise string) ([]*RunnerApplicationDownload, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runners/downloads", enterprise) 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 } // GenerateEnterpriseJITConfig generates a just-in-time configuration for an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runners#create-configuration-for-a-just-in-time-runner-for-an-enterprise // //meta:operation POST /enterprises/{enterprise}/actions/runners/generate-jitconfig func (s *EnterpriseService) GenerateEnterpriseJITConfig(ctx context.Context, enterprise string, request *GenerateJITConfigRequest) (*JITRunnerConfig, *Response, error) { u := fmt.Sprintf("enterprises/%v/actions/runners/generate-jitconfig", enterprise) req, err := s.client.NewRequest("POST", u, request) if err != nil { return nil, nil, err } jitConfig := new(JITRunnerConfig) resp, err := s.client.Do(ctx, req, jitConfig) if err != nil { return nil, resp, err } return jitConfig, resp, nil } // CreateRegistrationToken creates a token that can be used to add a self-hosted runner. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/actions/self-hosted-runners#create-a-registration-token-for-an-enterprise // //meta:operation POST /enterprises/{enterprise}/actions/runners/registration-token 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/enterprise-cloud@latest/rest/actions/self-hosted-runners#list-self-hosted-runners-for-an-enterprise // //meta:operation GET /enterprises/{enterprise}/actions/runners 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/enterprise-cloud@latest/rest/actions/self-hosted-runners#delete-a-self-hosted-runner-from-an-enterprise // //meta:operation DELETE /enterprises/{enterprise}/actions/runners/{runner_id} 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-60.0.0/github/enterprise_actions_runners_test.go000066400000000000000000000210231457013574700240210ustar00rootroot00000000000000// 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 TestEnterpriseService_GenerateEnterpriseJITConfig(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &GenerateJITConfigRequest{Name: "test", RunnerGroupID: 1, Labels: []string{"one", "two"}} mux.HandleFunc("/enterprises/o/actions/runners/generate-jitconfig", func(w http.ResponseWriter, r *http.Request) { v := new(GenerateJITConfigRequest) err := json.NewDecoder(r.Body).Decode(v) if err != nil { t.Errorf("Request body decode failed: %v", err) } testMethod(t, r, "POST") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } fmt.Fprint(w, `{"encoded_jit_config":"foo"}`) }) ctx := context.Background() jitConfig, _, err := client.Enterprise.GenerateEnterpriseJITConfig(ctx, "o", input) if err != nil { t.Errorf("Enterprise.GenerateEnterpriseJITConfig returned error: %v", err) } want := &JITRunnerConfig{EncodedJITConfig: String("foo")} if !cmp.Equal(jitConfig, want) { t.Errorf("Enterprise.GenerateEnterpriseJITConfig returned %+v, want %+v", jitConfig, want) } const methodName = "GenerateEnterpriseJITConfig" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Enterprise.GenerateEnterpriseJITConfig(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Enterprise.GenerateEnterpriseJITConfig(ctx, "o", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } 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) }) } func TestEnterpriseService_ListRunnerApplicationDownloads(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/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.Enterprise.ListRunnerApplicationDownloads(ctx, "o") if err != nil { t.Errorf("Enterprise.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("Enterprise.ListRunnerApplicationDownloads returned %+v, want %+v", downloads, want) } const methodName = "ListRunnerApplicationDownloads" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Enterprise.ListRunnerApplicationDownloads(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Enterprise.ListRunnerApplicationDownloads(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/enterprise_audit_log.go000066400000000000000000000017571457013574700215310ustar00rootroot00000000000000// 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/enterprise-cloud@latest/rest/enterprise-admin/audit-log#get-the-audit-log-for-an-enterprise // //meta:operation GET /enterprises/{enterprise}/audit-log 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-60.0.0/github/enterprise_audit_log_test.go000066400000000000000000000053731457013574700225660ustar00rootroot00000000000000// 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" ) 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) } 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"), CreatedAt: &Timestamp{timestamp}, Org: String("o"), AdditionalFields: map[string]interface{}{ "completed_at": "2021-03-07T00:35:08.000Z", "conclusion": "success", "event": "schedule", "head_branch": "master", "head_sha": "5acdeadbeef64d1a62388e901e5cdc9358644b37", "name": "Code scanning - action", "repo": "o/blue-crayon-1", "started_at": "2021-03-07T00:33:04.000Z", "workflow_id": float64(123456), "workflow_run_id": float64(628312345), }, }, } assertNoDiff(t, want, auditEntries) 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-60.0.0/github/enterprise_code_security_and_analysis.go000066400000000000000000000070311457013574700251370ustar00rootroot00000000000000// Copyright 2022 The go-github 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" ) // EnterpriseSecurityAnalysisSettings represents security analysis settings for an enterprise. type EnterpriseSecurityAnalysisSettings struct { AdvancedSecurityEnabledForNewRepositories *bool `json:"advanced_security_enabled_for_new_repositories,omitempty"` SecretScanningEnabledForNewRepositories *bool `json:"secret_scanning_enabled_for_new_repositories,omitempty"` SecretScanningPushProtectionEnabledForNewRepositories *bool `json:"secret_scanning_push_protection_enabled_for_new_repositories,omitempty"` SecretScanningPushProtectionCustomLink *string `json:"secret_scanning_push_protection_custom_link,omitempty"` SecretScanningValidityChecksEnabled *bool `json:"secret_scanning_validity_checks_enabled,omitempty"` } // GetCodeSecurityAndAnalysis gets code security and analysis features for an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/code-security-and-analysis#get-code-security-and-analysis-features-for-an-enterprise // //meta:operation GET /enterprises/{enterprise}/code_security_and_analysis func (s *EnterpriseService) GetCodeSecurityAndAnalysis(ctx context.Context, enterprise string) (*EnterpriseSecurityAnalysisSettings, *Response, error) { u := fmt.Sprintf("enterprises/%v/code_security_and_analysis", enterprise) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } settings := new(EnterpriseSecurityAnalysisSettings) resp, err := s.client.Do(ctx, req, settings) if err != nil { return nil, resp, err } return settings, resp, nil } // UpdateCodeSecurityAndAnalysis updates code security and analysis features for new repositories in an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/code-security-and-analysis#update-code-security-and-analysis-features-for-an-enterprise // //meta:operation PATCH /enterprises/{enterprise}/code_security_and_analysis func (s *EnterpriseService) UpdateCodeSecurityAndAnalysis(ctx context.Context, enterprise string, settings *EnterpriseSecurityAnalysisSettings) (*Response, error) { u := fmt.Sprintf("enterprises/%v/code_security_and_analysis", enterprise) req, err := s.client.NewRequest("PATCH", u, settings) if err != nil { return nil, err } resp, err := s.client.Do(ctx, req, nil) if err != nil { return resp, err } return resp, nil } // EnableDisableSecurityFeature enables or disables a security feature for all repositories in an enterprise. // // Valid values for securityProduct: "advanced_security", "secret_scanning", "secret_scanning_push_protection". // Valid values for enablement: "enable_all", "disable_all". // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/code-security-and-analysis#enable-or-disable-a-security-feature // //meta:operation POST /enterprises/{enterprise}/{security_product}/{enablement} func (s *EnterpriseService) EnableDisableSecurityFeature(ctx context.Context, enterprise, securityProduct, enablement string) (*Response, error) { u := fmt.Sprintf("enterprises/%v/%v/%v", enterprise, securityProduct, enablement) req, err := s.client.NewRequest("POST", 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-60.0.0/github/enterprise_code_security_and_analysis_test.go000066400000000000000000000106571457013574700262060ustar00rootroot00000000000000// Copyright 2022 The go-github 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 TestEnterpriseService_GetCodeSecurityAndAnalysis(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/e/code_security_and_analysis", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, ` { "advanced_security_enabled_for_new_repositories": true, "secret_scanning_enabled_for_new_repositories": true, "secret_scanning_push_protection_enabled_for_new_repositories": true, "secret_scanning_push_protection_custom_link": "https://github.com/test-org/test-repo/blob/main/README.md", "secret_scanning_validity_checks_enabled": true }`) }) ctx := context.Background() const methodName = "GetCodeSecurityAndAnalysis" settings, _, err := client.Enterprise.GetCodeSecurityAndAnalysis(ctx, "e") if err != nil { t.Errorf("Enterprise.%v returned error: %v", methodName, err) } want := &EnterpriseSecurityAnalysisSettings{ AdvancedSecurityEnabledForNewRepositories: Bool(true), SecretScanningEnabledForNewRepositories: Bool(true), SecretScanningPushProtectionEnabledForNewRepositories: Bool(true), SecretScanningPushProtectionCustomLink: String("https://github.com/test-org/test-repo/blob/main/README.md"), SecretScanningValidityChecksEnabled: Bool(true), } if !cmp.Equal(settings, want) { t.Errorf("Enterprise.%v return \ngot: %+v,\nwant:%+v", methodName, settings, want) } testBadOptions(t, methodName, func() (err error) { _, _, err = client.Enterprise.GetCodeSecurityAndAnalysis(ctx, "o") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Enterprise.GetCodeSecurityAndAnalysis(ctx, "e") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestEnterpriseService_UpdateCodeSecurityAndAnalysis(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &EnterpriseSecurityAnalysisSettings{ AdvancedSecurityEnabledForNewRepositories: Bool(true), SecretScanningEnabledForNewRepositories: Bool(true), SecretScanningPushProtectionEnabledForNewRepositories: Bool(true), SecretScanningPushProtectionCustomLink: String("https://github.com/test-org/test-repo/blob/main/README.md"), SecretScanningValidityChecksEnabled: Bool(true), } mux.HandleFunc("/enterprises/e/code_security_and_analysis", func(w http.ResponseWriter, r *http.Request) { v := new(EnterpriseSecurityAnalysisSettings) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "PATCH") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } }) ctx := context.Background() const methodName = "UpdateCodeSecurityAndAnalysis" _, err := client.Enterprise.UpdateCodeSecurityAndAnalysis(ctx, "e", input) if err != nil { t.Errorf("Enterprise.%v returned error: %v", methodName, err) } testBadOptions(t, methodName, func() (err error) { _, err = client.Enterprise.UpdateCodeSecurityAndAnalysis(ctx, "o", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Enterprise.UpdateCodeSecurityAndAnalysis(ctx, "e", input) }) } func TestEnterpriseService_EnableAdvancedSecurity(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/e/advanced_security/enable_all", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") }) ctx := context.Background() const methodName = "EnableDisableSecurityFeature" _, err := client.Enterprise.EnableDisableSecurityFeature(ctx, "e", "advanced_security", "enable_all") if err != nil { t.Errorf("Enterprise.%v returned error: %v", methodName, err) } testBadOptions(t, methodName, func() (err error) { _, err = client.Enterprise.EnableDisableSecurityFeature(ctx, "o", "advanced_security", "enable_all") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Enterprise.EnableDisableSecurityFeature(ctx, "e", "advanced_security", "enable_all") }) } go-github-60.0.0/github/event.go000066400000000000000000000032061457013574700164320ustar00rootroot00000000000000// 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" ) // 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 *Timestamp `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() (interface{}, error) { // It would be nice if e.Type were the snake_case name of the event, // but the existing interface uses the struct name instead. payload := EventForType(typeToMessageMapping[e.GetType()]) if err := json.Unmarshal(e.GetRawPayload(), &payload); err != nil { return nil, err } return payload, nil } // 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-60.0.0/github/event_test.go000066400000000000000000000073161457013574700174770ustar00rootroot00000000000000// 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 TestEmptyEvent_NoPanic(t *testing.T) { e := &Event{} if _, err := e.ParsePayload(); err == nil { t.Error("ParsePayload unexpectedly succeeded on empty event") } e = nil if _, err := e.ParsePayload(); err == nil { t.Error("ParsePayload unexpectedly succeeded on nil event") } } 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: &Timestamp{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-60.0.0/github/event_types.go000066400000000000000000002446231457013574700176700ustar00rootroot00000000000000// 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. } // BranchProtectionRuleEvent triggered when a check suite is "created", "edited", or "deleted". // The Webhook event name is "branch_protection_rule". // // GitHub API docs: https://docs.github.com/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#branch_protection_rule type BranchProtectionRuleEvent struct { Action *string `json:"action,omitempty"` Rule *BranchProtectionRule `json:"rule,omitempty"` Changes *ProtectionChanges `json:"changes,omitempty"` Repo *Repository `json:"repository,omitempty"` Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // 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/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/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/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"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,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/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"` PusherType *string `json:"pusher_type,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"` } // 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/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"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,omitempty"` } // DependabotAlertEvent is triggered when there is activity relating to Dependabot alerts. // The Webhook event name is "dependabot_alert". // // GitHub API docs: https://docs.github.com/webhooks-and-events/webhooks/webhook-events-and-payloads#dependabot_alert type DependabotAlertEvent struct { Action *string `json:"action,omitempty"` Alert *DependabotAlert `json:"alert,omitempty"` // The following fields are only populated by Webhook events. Installation *Installation `json:"installation,omitempty"` Enterprise *Enterprise `json:"enterprise,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Organization *Organization `json:"organization,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/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"` // The Repository where the event occurred Repo *Repository `json:"repository,omitempty"` // 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 by Webhook events. Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,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/developers/webhooks-and-events/webhook-events-and-payloads#deployment type DeploymentEvent struct { Deployment *Deployment `json:"deployment,omitempty"` Repo *Repository `json:"repository,omitempty"` Workflow *Workflow `json:"workflow,omitempty"` WorkflowRun *WorkflowRun `json:"workflow_run,omitempty"` // The following fields are only populated by Webhook events. 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. Org *Organization `json:"organization,omitempty"` } // DeploymentProtectionRuleEvent represents a deployment protection rule event. // The Webhook event name is "deployment_protection_rule". // // GitHub API docs: https://docs.github.com/webhooks-and-events/webhooks/webhook-events-and-payloads#deployment_protection_rule type DeploymentProtectionRuleEvent struct { Action *string `json:"action,omitempty"` Environment *string `json:"environment,omitempty"` Event *string `json:"event,omitempty"` // The URL Github provides for a third-party to use in order to pass/fail a deployment gate DeploymentCallbackURL *string `json:"deployment_callback_url,omitempty"` Deployment *Deployment `json:"deployment,omitempty"` Repo *Repository `json:"repository,omitempty"` Organization *Organization `json:"organization,omitempty"` PullRequests []*PullRequest `json:"pull_requests,omitempty"` 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/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"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,omitempty"` } // DiscussionCommentEvent represents a webhook event for a comment on discussion. // The Webhook event name is "discussion_comment". // // GitHub API docs: https://docs.github.com/webhooks-and-events/webhooks/webhook-events-and-payloads#discussion_comment type DiscussionCommentEvent struct { // Action is the action that was performed on the comment. // Possible values are: "created", "edited", "deleted". ** check what all can be added Action *string `json:"action,omitempty"` Discussion *Discussion `json:"discussion,omitempty"` Comment *CommentDiscussion `json:"comment,omitempty"` Repo *Repository `json:"repository,omitempty"` Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // CommentDiscussion represents a comment in a GitHub DiscussionCommentEvent. type CommentDiscussion struct { AuthorAssociation *string `json:"author_association,omitempty"` Body *string `json:"body,omitempty"` ChildCommentCount *int `json:"child_comment_count,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` DiscussionID *int64 `json:"discussion_id,omitempty"` HTMLURL *string `json:"html_url,omitempty"` ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` ParentID *int64 `json:"parent_id,omitempty"` Reactions *Reactions `json:"reactions,omitempty"` RepositoryURL *string `json:"repository_url,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` User *User `json:"user,omitempty"` } // DiscussionEvent represents a webhook event for a discussion. // The Webhook event name is "discussion". // // GitHub API docs: https://docs.github.com/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#discussion type DiscussionEvent struct { // Action is the action that was performed. Possible values are: // created, edited, deleted, pinned, unpinned, locked, unlocked, // transferred, category_changed, answered, or unanswered. Action *string `json:"action,omitempty"` Discussion *Discussion `json:"discussion,omitempty"` Repo *Repository `json:"repository,omitempty"` Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // Discussion represents a discussion in a GitHub DiscussionEvent. type Discussion struct { RepositoryURL *string `json:"repository_url,omitempty"` DiscussionCategory *DiscussionCategory `json:"category,omitempty"` AnswerHTMLURL *string `json:"answer_html_url,omitempty"` AnswerChosenAt *Timestamp `json:"answer_chosen_at,omitempty"` AnswerChosenBy *string `json:"answer_chosen_by,omitempty"` HTMLURL *string `json:"html_url,omitempty"` ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Number *int `json:"number,omitempty"` Title *string `json:"title,omitempty"` User *User `json:"user,omitempty"` State *string `json:"state,omitempty"` Locked *bool `json:"locked,omitempty"` Comments *int `json:"comments,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` AuthorAssociation *string `json:"author_association,omitempty"` ActiveLockReason *string `json:"active_lock_reason,omitempty"` Body *string `json:"body,omitempty"` } // DiscussionCategory represents a discussion category in a GitHub DiscussionEvent. type DiscussionCategory struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` RepositoryID *int64 `json:"repository_id,omitempty"` Emoji *string `json:"emoji,omitempty"` Name *string `json:"name,omitempty"` Description *string `json:"description,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` Slug *string `json:"slug,omitempty"` IsAnswerable *bool `json:"is_answerable,omitempty"` } // ForkEvent is triggered when a user forks a repository. // The Webhook event name is "fork". // // GitHub API docs: https://docs.github.com/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/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"` Installation *Installation `json:"installation,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/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"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,omitempty"` } // EditChange represents the changes when an issue, pull request, comment, // or repository has been edited. type EditChange struct { Title *EditTitle `json:"title,omitempty"` Body *EditBody `json:"body,omitempty"` Base *EditBase `json:"base,omitempty"` Repo *EditRepo `json:"repository,omitempty"` Owner *EditOwner `json:"owner,omitempty"` DefaultBranch *EditDefaultBranch `json:"default_branch,omitempty"` Topics *EditTopics `json:"topics,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"` } // EditRepo represents a change of repository name. type EditRepo struct { Name *RepoName `json:"name,omitempty"` } // EditOwner represents a change of repository ownership. type EditOwner struct { OwnerInfo *OwnerInfo `json:"from,omitempty"` } // OwnerInfo represents the account info of the owner of the repo (could be User or Organization but both are User structs). type OwnerInfo struct { User *User `json:"user,omitempty"` Org *User `json:"organization,omitempty"` } // RepoName represents a change of repository name. type RepoName struct { From *string `json:"from,omitempty"` } // EditTopics represents a change of repository topics. type EditTopics struct { From []string `json:"from,omitempty"` } // EditSHA represents a sha change of a pull-request. type EditSHA struct { From *string `json:"from,omitempty"` } // EditDefaultBranch represents a change of repository's default branch name. type EditDefaultBranch 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/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"` Requester *User `json:"requester,omitempty"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,omitempty"` } // 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/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"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,omitempty"` } // InstallationLoginChange represents a change in login on an installation. type InstallationLoginChange struct { From *string `json:"from,omitempty"` } // InstallationSlugChange represents a change in slug on an installation. type InstallationSlugChange struct { From *string `json:"from,omitempty"` } // InstallationChanges represents a change in slug or login on an installation. type InstallationChanges struct { Login *InstallationLoginChange `json:"login,omitempty"` Slug *InstallationSlugChange `json:"slug,omitempty"` } // InstallationTargetEvent is triggered when there is activity on an installation from a user or organization account. // The Webhook event name is "installation_target". // // GitHub API docs: https://docs.github.com/webhooks-and-events/webhooks/webhook-events-and-payloads#installation_target type InstallationTargetEvent struct { Account *User `json:"account,omitempty"` Action *string `json:"action,omitempty"` Changes *InstallationChanges `json:"changes,omitempty"` Enterprise *Enterprise `json:"enterprise,omitempty"` Installation *Installation `json:"installation,omitempty"` Organization *Organization `json:"organization,omitempty"` Repository *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` TargetType *string `json:"target_type,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/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"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Organization *Organization `json:"organization,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/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"` Milestone *Milestone `json:"milestone,omitempty"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,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/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"` Changes *EditChange `json:"changes,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"` } // 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/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"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,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/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"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,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/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"` } // MergeGroup represents the merge group in a merge queue. type MergeGroup struct { // The SHA of the merge group. HeadSHA *string `json:"head_sha,omitempty"` // The full ref of the merge group. HeadRef *string `json:"head_ref,omitempty"` // The SHA of the merge group's parent commit. BaseSHA *string `json:"base_sha,omitempty"` // The full ref of the branch the merge group will be merged into. BaseRef *string `json:"base_ref,omitempty"` // An expanded representation of the head_sha commit. HeadCommit *Commit `json:"head_commit,omitempty"` } // MergeGroupEvent represents activity related to merge groups in a merge queue. The type of activity is specified // in the action property of the payload object. // // GitHub API docs: https://docs.github.com/developers/webhooks-and-events/webhook-events-and-payloads#merge_group type MergeGroupEvent struct { // The action that was performed. Currently, can only be checks_requested. Action *string `json:"action,omitempty"` // The merge group. MergeGroup *MergeGroup `json:"merge_group,omitempty"` // The following fields are only populated by Webhook events. Repo *Repository `json:"repository,omitempty"` Org *Organization `json:"organization,omitempty"` Installation *Installation `json:"installation,omitempty"` Sender *User `json:"sender,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/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"` // 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"` } // 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/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/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/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"` // The following fields are only populated by Webhook events. Installation *Installation `json:"installation,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/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"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,omitempty"` } // PersonalAccessTokenRequestEvent occurs when there is activity relating to a // request for a fine-grained personal access token to access resources that // belong to a resource owner that requires approval for token access. // The webhook event name is "personal_access_token_request". // // GitHub API docs: https://docs.github.com/webhooks-and-events/webhooks/webhook-events-and-payloads#personal_access_token_request type PersonalAccessTokenRequestEvent struct { // Action is the action that was performed. Possible values are: // "approved", "cancelled", "created" or "denied" Action *string `json:"action,omitempty"` PersonalAccessTokenRequest *PersonalAccessTokenRequest `json:"personal_access_token_request,omitempty"` Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // PersonalAccessTokenRequest contains the details of a PersonalAccessTokenRequestEvent. type PersonalAccessTokenRequest struct { // Unique identifier of the request for access via fine-grained personal // access token. Used as the pat_request_id parameter in the list and review // API calls. ID *int64 `json:"id,omitempty"` Owner *User `json:"owner,omitempty"` // New requested permissions, categorized by type of permission. PermissionsAdded *PersonalAccessTokenPermissions `json:"permissions_added,omitempty"` // Requested permissions that elevate access for a previously approved // request for access, categorized by type of permission. PermissionsUpgraded *PersonalAccessTokenPermissions `json:"permissions_upgraded,omitempty"` // Permissions requested, categorized by type of permission. // This field incorporates permissions_added and permissions_upgraded. PermissionsResult *PersonalAccessTokenPermissions `json:"permissions_result,omitempty"` // Type of repository selection requested. Possible values are: // "none", "all" or "subset" RepositorySelection *string `json:"repository_selection,omitempty"` // The number of repositories the token is requesting access to. // This field is only populated when repository_selection is subset. RepositoryCount *int64 `json:"repository_count,omitempty"` // An array of repository objects the token is requesting access to. // This field is only populated when repository_selection is subset. Repositories []*Repository `json:"repositories,omitempty"` // Date and time when the request for access was created. CreatedAt *Timestamp `json:"created_at,omitempty"` // Whether the associated fine-grained personal access token has expired. TokenExpired *bool `json:"token_expired,omitempty"` // Date and time when the associated fine-grained personal access token expires. TokenExpiresAt *Timestamp `json:"token_expires_at,omitempty"` // Date and time when the associated fine-grained personal access token was last used for authentication. TokenLastUsedAt *Timestamp `json:"token_last_used_at,omitempty"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,omitempty"` } // PersonalAccessTokenPermissions represents the original or newly requested // scope of permissions for a fine-grained personal access token within a PersonalAccessTokenRequest. type PersonalAccessTokenPermissions struct { Org map[string]string `json:"organization,omitempty"` Repo map[string]string `json:"repository,omitempty"` Other map[string]string `json:"other,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"` // 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"` } // ProjectEvent is triggered when project is created, modified or deleted. // The webhook event name is "project". // // GitHub API docs: https://docs.github.com/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/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/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"` } // ProjectV2Event is triggered when there is activity relating to an organization-level project. // The Webhook event name is "projects_v2". // // GitHub API docs: https://docs.github.com/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#projects_v2 type ProjectV2Event struct { Action *string `json:"action,omitempty"` ProjectsV2 *ProjectsV2 `json:"projects_v2,omitempty"` // The following fields are only populated by Webhook events. Installation *Installation `json:"installation,omitempty"` Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` } // ProjectsV2 represents a projects v2 project. type ProjectsV2 struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Owner *User `json:"owner,omitempty"` Creator *User `json:"creator,omitempty"` Title *string `json:"title,omitempty"` Description *string `json:"description,omitempty"` Public *bool `json:"public,omitempty"` ClosedAt *Timestamp `json:"closed_at,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` DeletedAt *Timestamp `json:"deleted_at,omitempty"` Number *int `json:"number,omitempty"` ShortDescription *string `json:"short_description,omitempty"` DeletedBy *User `json:"deleted_by,omitempty"` } // ProjectV2ItemEvent is triggered when there is activity relating to an item on an organization-level project. // The Webhook event name is "projects_v2_item". // // GitHub API docs: https://docs.github.com/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#projects_v2_item type ProjectV2ItemEvent struct { Action *string `json:"action,omitempty"` Changes *ProjectV2ItemChange `json:"changes,omitempty"` ProjectV2Item *ProjectV2Item `json:"projects_v2_item,omitempty"` // The following fields are only populated by Webhook events. Installation *Installation `json:"installation,omitempty"` Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` } // ProjectV2ItemChange represents a project v2 item change. type ProjectV2ItemChange struct { ArchivedAt *ArchivedAt `json:"archived_at,omitempty"` } // ArchivedAt represents an archiving date change. type ArchivedAt struct { From *Timestamp `json:"from,omitempty"` To *Timestamp `json:"to,omitempty"` } // ProjectV2Item represents an item belonging to a project. type ProjectV2Item struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` ProjectNodeID *string `json:"project_node_id,omitempty"` ContentNodeID *string `json:"content_node_id,omitempty"` ContentType *string `json:"content_type,omitempty"` Creator *User `json:"creator,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` ArchivedAt *Timestamp `json:"archived_at,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/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"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,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/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"` // The following will be populated if the event was performed by an App PerformedViaGithubApp *App `json:"performed_via_github_app,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/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/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"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,omitempty"` } // PullRequestReviewThreadEvent is triggered when a comment made as part of a // review of a pull request is marked resolved or unresolved. // The Webhook event name is "pull_request_review_thread". // // GitHub API docs: https://docs.github.com/developers/webhooks-and-events/webhook-events-and-payloads#pull_request_review_thread type PullRequestReviewThreadEvent struct { // Action is the action that was performed on the comment. // Possible values are: "resolved", "unresolved". Action *string `json:"action,omitempty"` Thread *PullRequestThread `json:"thread,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. Org *Organization `json:"organization,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/actions/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"` // The following will be populated if the event was performed by an App PerformedViaGithubApp *App `json:"performed_via_github_app,omitempty"` } // PushEvent represents a git push to a GitHub repository. // // GitHub API docs: https://docs.github.com/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. Action *string `json:"action,omitempty"` 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 *CommitAuthor `json:"pusher,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"` } 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 (h HeadCommit) String() string { return Stringify(h) } // 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"` Topics []string `json:"topics,omitempty"` CustomProperties map[string]string `json:"custom_properties,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/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"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,omitempty"` } // RepositoryEvent is triggered when a repository is created, archived, unarchived, // renamed, edited, transferred, made public, or made private. Organization hooks are // also triggered 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/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. Changes *EditChange `json:"changes,omitempty"` 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/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"` } // RepositoryImportEvent represents the activity related to a repository being imported to GitHub. // // GitHub API docs: https://docs.github.com/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#repository_import type RepositoryImportEvent struct { // Status represents the final state of the import. This can be one of "success", "cancelled", or "failure". Status *string `json:"status,omitempty"` Repo *Repository `json:"repository,omitempty"` Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` } // RepositoryVulnerabilityAlertEvent is triggered when a security alert is created, dismissed, or resolved. // // GitHub API docs: https://docs.github.com/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"` // The following fields are only populated by Webhook events. Installation *Installation `json:"installation,omitempty"` // The user that triggered the event. Sender *User `json:"sender,omitempty"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,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"` } // SecretScanningAlertEvent is triggered when a secret scanning alert occurs in a repository. // The Webhook name is secret_scanning_alert. // // GitHub API docs: https://docs.github.com/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#secret_scanning_alert type SecretScanningAlertEvent struct { // Action is the action that was performed. Possible values are: "created", "resolved", or "reopened". Action *string `json:"action,omitempty"` // Alert is the secret scanning alert involved in the event. Alert *SecretScanningAlert `json:"alert,omitempty"` // Only populated by the "resolved" and "reopen" actions Sender *User `json:"sender,omitempty"` // The following fields are only populated by Webhook events. Repo *Repository `json:"repository,omitempty"` Organization *Organization `json:"organization,omitempty"` Enterprise *Enterprise `json:"enterprise,omitempty"` Installation *Installation `json:"installation,omitempty"` } // SecurityAndAnalysisEvent is triggered when code security and analysis features // are enabled or disabled for a repository. // // GitHub API docs: https://docs.github.com/webhooks-and-events/webhooks/webhook-events-and-payloads#security_and_analysis type SecurityAndAnalysisEvent struct { Changes *SecurityAndAnalysisChange `json:"changes,omitempty"` Enterprise *Enterprise `json:"enterprise,omitempty"` Installation *Installation `json:"installation,omitempty"` Organization *Organization `json:"organization,omitempty"` Repository *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` } // SecurityAndAnalysisChange represents the changes when security and analysis // features are enabled or disabled for a repository. type SecurityAndAnalysisChange struct { From *SecurityAndAnalysisChangeFrom `json:"from,omitempty"` } // SecurityAndAnalysisChangeFrom represents which change was made when security // and analysis features are enabled or disabled for a repository. type SecurityAndAnalysisChangeFrom struct { SecurityAndAnalysis *SecurityAndAnalysis `json:"security_and_analysis,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/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"` Installation *Installation `json:"installation,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/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"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,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/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/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"` // The following fields are only populated by Webhook events. Installation *Installation `json:"installation,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/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"` // The following field is only present when the webhook is triggered on // a repository belonging to an organization. Org *Organization `json:"organization,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/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"` Installation *Installation `json:"installation,omitempty"` } // WorkflowJobEvent is triggered when a job is queued, started or completed. // // GitHub API docs: https://docs.github.com/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#workflow_job type WorkflowJobEvent struct { WorkflowJob *WorkflowJob `json:"workflow_job,omitempty"` Action *string `json:"action,omitempty"` // The following fields are only populated by Webhook events. // Org is not nil when the webhook is configured for an organization or the event // occurs from activity in a repository owned by an organization. Org *Organization `json:"organization,omitempty"` Repo *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } // WorkflowRunEvent is triggered when a GitHub Actions workflow run is requested or completed. // // GitHub API docs: https://docs.github.com/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"` Installation *Installation `json:"installation,omitempty"` } // SecurityAdvisory represents the advisory object in SecurityAdvisoryEvent payload. // // GitHub API docs: https://docs.github.com/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#security_advisory type SecurityAdvisory struct { CVSS *AdvisoryCVSS `json:"cvss,omitempty"` CWEs []*AdvisoryCWEs `json:"cwes,omitempty"` GHSAID *string `json:"ghsa_id,omitempty"` Summary *string `json:"summary,omitempty"` Description *string `json:"description,omitempty"` Severity *string `json:"severity,omitempty"` Identifiers []*AdvisoryIdentifier `json:"identifiers,omitempty"` References []*AdvisoryReference `json:"references,omitempty"` PublishedAt *Timestamp `json:"published_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` WithdrawnAt *Timestamp `json:"withdrawn_at,omitempty"` Vulnerabilities []*AdvisoryVulnerability `json:"vulnerabilities,omitempty"` CVEID *string `json:"cve_id,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` Author *User `json:"author,omitempty"` Publisher *User `json:"publisher,omitempty"` State *string `json:"state,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` ClosedAt *Timestamp `json:"closed_at,omitempty"` Submission *SecurityAdvisorySubmission `json:"submission,omitempty"` CWEIDs []string `json:"cwe_ids,omitempty"` Credits []*RepoAdvisoryCredit `json:"credits,omitempty"` CreditsDetailed []*RepoAdvisoryCreditDetailed `json:"credits_detailed,omitempty"` CollaboratingUsers []*User `json:"collaborating_users,omitempty"` CollaboratingTeams []*Team `json:"collaborating_teams,omitempty"` PrivateFork *Repository `json:"private_fork,omitempty"` } // AdvisoryIdentifier represents the identifier for a Security Advisory. type AdvisoryIdentifier struct { Value *string `json:"value,omitempty"` Type *string `json:"type,omitempty"` } // AdvisoryReference represents the reference url for the security advisory. type AdvisoryReference struct { URL *string `json:"url,omitempty"` } // AdvisoryVulnerability represents the vulnerability object for a Security Advisory. type AdvisoryVulnerability struct { Package *VulnerabilityPackage `json:"package,omitempty"` Severity *string `json:"severity,omitempty"` VulnerableVersionRange *string `json:"vulnerable_version_range,omitempty"` FirstPatchedVersion *FirstPatchedVersion `json:"first_patched_version,omitempty"` // PatchedVersions and VulnerableFunctions are used in the following APIs: // - https://docs.github.com/rest/security-advisories/repository-advisories#list-repository-security-advisories-for-an-organization // - https://docs.github.com/rest/security-advisories/repository-advisories#list-repository-security-advisories PatchedVersions *string `json:"patched_versions,omitempty"` VulnerableFunctions []string `json:"vulnerable_functions,omitempty"` } // VulnerabilityPackage represents the package object for an Advisory Vulnerability. type VulnerabilityPackage struct { Ecosystem *string `json:"ecosystem,omitempty"` Name *string `json:"name,omitempty"` } // FirstPatchedVersion represents the identifier for the first patched version of that vulnerability. type FirstPatchedVersion struct { Identifier *string `json:"identifier,omitempty"` } // SecurityAdvisoryEvent is triggered when a security-related vulnerability is found in software on GitHub. // // GitHub API docs: https://docs.github.com/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#security_advisory type SecurityAdvisoryEvent struct { Action *string `json:"action,omitempty"` SecurityAdvisory *SecurityAdvisory `json:"security_advisory,omitempty"` // The following fields are only populated by Webhook events. Enterprise *Enterprise `json:"enterprise,omitempty"` Installation *Installation `json:"installation,omitempty"` Organization *Organization `json:"organization,omitempty"` Repository *Repository `json:"repository,omitempty"` Sender *User `json:"sender,omitempty"` } // CodeScanningAlertEvent is triggered when a code scanning finds a potential vulnerability or error in your code. // // GitHub API docs: https://docs.github.com/developers/webhooks-and-events/webhooks/webhook-events-and-payloads#code_scanning_alert type CodeScanningAlertEvent struct { Action *string `json:"action,omitempty"` Alert *Alert `json:"alert,omitempty"` Ref *string `json:"ref,omitempty"` // CommitOID is the commit SHA of the code scanning alert CommitOID *string `json:"commit_oid,omitempty"` Repo *Repository `json:"repository,omitempty"` Org *Organization `json:"organization,omitempty"` Sender *User `json:"sender,omitempty"` Installation *Installation `json:"installation,omitempty"` } go-github-60.0.0/github/event_types_test.go000066400000000000000000017130201457013574700207200ustar00rootroot00000000000000// 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 TestEditChange_Marshal_Repo(t *testing.T) { testJSONMarshal(t, &EditChange{}, "{}") u := &EditChange{ Repo: &EditRepo{ Name: &RepoName{ From: String("old-repo-name"), }, }, Topics: &EditTopics{ From: []string{"topic1", "topic2"}, }, } want := `{ "repository": { "name": { "from": "old-repo-name" } }, "topics": { "from": [ "topic1", "topic2" ] } }` testJSONMarshal(t, u, want) } func TestEditChange_Marshal_TransferFromUser(t *testing.T) { testJSONMarshal(t, &EditChange{}, "{}") u := &EditChange{ Owner: &EditOwner{ OwnerInfo: &OwnerInfo{ User: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, }, }, } want := `{ "owner": { "from": { "user": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "repos_url": "r", "events_url": "e" } } } }` testJSONMarshal(t, u, want) } func TestEditChange_Marshal_TransferFromOrg(t *testing.T) { testJSONMarshal(t, &EditChange{}, "{}") u := &EditChange{ Owner: &EditOwner{ OwnerInfo: &OwnerInfo{ Org: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, }, }, } want := `{ "owner": { "from": { "organization": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "repos_url": "r", "events_url": "e" } } } }` 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 TestInstallationTargetEvent_Marshal(t *testing.T) { testJSONMarshal(t, &InstallationTargetEvent{}, "{}") u := &InstallationTargetEvent{ Account: &User{ Login: String("u"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("l"), }, Action: String("a"), Changes: &InstallationChanges{ Login: &InstallationLoginChange{ From: String("p"), }, Slug: &InstallationSlugChange{ From: String("j"), }, }, 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}, }, 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), }, Repository: &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"), }, TargetType: String("running"), } want := `{ "account": { "login": "u", "id": 1, "node_id": "n", "avatar_url": "l", "url": "u", "events_url": "e", "repos_url": "r" }, "action": "a", "changes": { "login": { "from": "p" }, "slug": { "from": "j" } }, "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 + ` }, "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 }, "repository": { "id": 1, "url": "s", "name": "n" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "target_type": "running" }` 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}, }, 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", "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 + ` }, "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 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: &CommitAuthor{ Login: String("l"), Date: &Timestamp{referenceTime}, Name: String("n"), Email: String("e"), }, 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 := `{ "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": { "date": ` + referenceTimeStr + `, "name": "n", "email": "e", "username": "l" }, "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 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: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{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}, }, 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), RunAttempt: 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}, RunStartedAt: &Timestamp{referenceTime}, JobsURL: String("j"), LogsURL: String("l"), CheckSuiteURL: String("c"), ArtifactsURL: String("a"), CancelURL: String("c"), RerunURL: String("r"), PreviousAttemptURL: String("p"), 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 := `{ "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 + ` }, "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, "run_attempt": 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 + `, "run_started_at": ` + referenceTimeStr + `, "jobs_url": "j", "logs_url": "l", "check_suite_url": "c", "artifacts_url": "a", "cancel_url": "c", "rerun_url": "r", "previous_attempt_url": "p", "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" } } }` testJSONMarshal(t, u, want) } func TestDeploymentProtectionRuleEvent_Marshal(t *testing.T) { testJSONMarshal(t, &DeploymentProtectionRuleEvent{}, "{}") l := make(map[string]interface{}) l["key"] = "value" jsonMsg, _ := json.Marshal(&l) u := &DeploymentProtectionRuleEvent{ Action: String("a"), Environment: String("e"), DeploymentCallbackURL: String("b"), 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"), }, 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), }, 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"), }, }, }, }, 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", "environment": "e", "deployment_callback_url": "b", "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" }, "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 }, "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" } } } ], "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 TestDiscussionCommentEvent_Marshal(t *testing.T) { testJSONMarshal(t, &DiscussionCommentEvent{}, "{}") u := &DiscussionCommentEvent{ Comment: &CommentDiscussion{ AuthorAssociation: String("aa"), Body: String("bo"), ChildCommentCount: Int(1), CreatedAt: &Timestamp{referenceTime}, DiscussionID: Int64(1), HTMLURL: String("hurl"), ID: Int64(1), NodeID: String("nid"), ParentID: Int64(1), 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"), }, RepositoryURL: String("rurl"), UpdatedAt: &Timestamp{referenceTime}, User: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, }, Discussion: &Discussion{ RepositoryURL: String("rurl"), DiscussionCategory: &DiscussionCategory{ ID: Int64(1), NodeID: String("nid"), RepositoryID: Int64(1), Emoji: String("emoji"), Name: String("name"), Description: String("description"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, Slug: String("slug"), IsAnswerable: Bool(false), }, HTMLURL: String("hurl"), ID: Int64(1), NodeID: String("nurl"), Number: Int(1), Title: String("title"), User: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, State: String("st"), Locked: Bool(false), Comments: Int(1), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, AuthorAssociation: String("aa"), Body: String("bo"), }, 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 := `{ "comment": { "author_association": "aa", "body": "bo", "child_comment_count": 1, "created_at": ` + referenceTimeStr + `, "discussion_id": 1, "html_url": "hurl", "id": 1, "node_id": "nid", "parent_id": 1, "reactions": { "total_count": 1, "+1": 1, "-1": 1, "laugh": 1, "confused": 1, "heart": 1, "hooray": 1, "rocket": 1, "eyes": 1, "url": "url" }, "repository_url": "rurl", "updated_at": ` + referenceTimeStr + `, "user": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" } }, "discussion": { "repository_url": "rurl", "category": { "id": 1, "node_id": "nid", "repository_id": 1, "emoji": "emoji", "name": "name", "description": "description", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "slug": "slug", "is_answerable": false }, "html_url": "hurl", "id": 1, "node_id": "nurl", "number": 1, "title": "title", "user": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "state": "st", "locked": false, "comments": 1, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "author_association": "aa", "body": "bo" }, "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 TestDiscussionEvent_Marshal(t *testing.T) { testJSONMarshal(t, &DiscussionEvent{}, "{}") u := &DiscussionEvent{ Discussion: &Discussion{ RepositoryURL: String("rurl"), DiscussionCategory: &DiscussionCategory{ ID: Int64(1), NodeID: String("nid"), RepositoryID: Int64(1), Emoji: String("emoji"), Name: String("name"), Description: String("description"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, Slug: String("slug"), IsAnswerable: Bool(false), }, HTMLURL: String("hurl"), ID: Int64(1), NodeID: String("nurl"), Number: Int(1), Title: String("title"), User: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, State: String("st"), Locked: Bool(false), Comments: Int(1), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, AuthorAssociation: String("aa"), Body: String("bo"), }, 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 := `{ "discussion": { "repository_url": "rurl", "category": { "id": 1, "node_id": "nid", "repository_id": 1, "emoji": "emoji", "name": "name", "description": "description", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "slug": "slug", "is_answerable": false }, "html_url": "hurl", "id": 1, "node_id": "nurl", "number": 1, "title": "title", "user": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "state": "st", "locked": false, "comments": 1, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "author_association": "aa", "body": "bo" }, "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 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 TestPersonalAccessTokenRequestEvent_Marshal(t *testing.T) { testJSONMarshal(t, &PersonalAccessTokenRequestEvent{}, "{}") event := &PersonalAccessTokenRequestEvent{ Action: String("a"), PersonalAccessTokenRequest: &PersonalAccessTokenRequest{ ID: Int64(1), Owner: &User{Login: String("l")}, PermissionsAdded: &PersonalAccessTokenPermissions{ Org: map[string]string{"organization_events": "read"}, Repo: map[string]string{"security_events": "write"}, }, CreatedAt: &Timestamp{referenceTime}, TokenExpired: Bool(false), TokenExpiresAt: &Timestamp{referenceTime}, TokenLastUsedAt: &Timestamp{referenceTime}, RepositoryCount: Int64(1), RepositorySelection: String("rs"), Repositories: []*Repository{ { Name: String("n"), }, }, }, Org: &Organization{Name: String("n")}, Sender: &User{ Login: String("l"), }, Installation: &Installation{ ID: Int64(1), }, } want := `{ "action": "a", "personal_access_token_request": { "id": 1, "owner": { "login": "l" }, "permissions_added": { "organization": { "organization_events": "read" }, "repository": { "security_events": "write" } }, "created_at": ` + referenceTimeStr + `, "token_expired": false, "token_expires_at": ` + referenceTimeStr + `, "token_last_used_at": ` + referenceTimeStr + `, "repository_count": 1, "repository_selection": "rs", "repositories": [ { "name": "n" } ] }, "organization": { "name": "n" }, "sender": { "login": "l" }, "installation": { "id": 1 } }` testJSONMarshal(t, event, want) } func TestPingEvent_Marshal(t *testing.T) { testJSONMarshal(t, &PingEvent{}, "{}") l := make(map[string]interface{}) l["key"] = "value" hookConfig := new(HookConfig) u := &PingEvent{ Zen: String("z"), HookID: Int64(1), Hook: &Hook{ CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, URL: String("url"), ID: Int64(1), Type: String("t"), Name: String("n"), TestURL: String("tu"), PingURL: String("pu"), LastResponse: l, Config: hookConfig, 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 TestRepositoryImportEvent_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryImportEvent{}, "{}") u := &RepositoryImportEvent{ Status: String("success"), 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 := `{ "status": "success", "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 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 TestMergeGroupEvent_Marshal(t *testing.T) { testJSONMarshal(t, &MergeGroupEvent{}, "{}") u := &MergeGroupEvent{ Action: String("a"), MergeGroup: &MergeGroup{ HeadSHA: String("hs"), HeadRef: String("hr"), BaseSHA: String("bs"), BaseRef: String("br"), HeadCommit: &Commit{NodeID: String("nid")}, }, 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", "merge_group": { "head_sha": "hs", "head_ref": "hr", "base_sha": "bs", "base_ref": "br", "head_commit": { "node_id": "nid" } }, "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 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), RunAttempt: 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}, RunStartedAt: &Timestamp{referenceTime}, JobsURL: String("j"), LogsURL: String("l"), CheckSuiteURL: String("c"), ArtifactsURL: String("a"), CancelURL: String("c"), RerunURL: String("r"), PreviousAttemptURL: String("p"), 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, "run_attempt": 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 + `, "run_started_at": ` + referenceTimeStr + `, "jobs_url": "j", "logs_url": "l", "check_suite_url": "c", "artifacts_url": "a", "cancel_url": "c", "rerun_url": "r", "previous_attempt_url": "p", "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}, }, 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"), AvatarURL: String("a"), URL: String("u"), EventsURL: String("e"), ReposURL: String("r"), }, } want := `{ "action": "a", "key": { "id": 1, "key": "k", "url": "k", "title": "k", "read_only": false, "verified": false, "created_at": ` + referenceTimeStr + ` }, "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 TestMetaEvent_Marshal(t *testing.T) { testJSONMarshal(t, &MetaEvent{}, "{}") v := make(map[string]interface{}) v["a"] = "b" hookConfig := &HookConfig{ ContentType: String("json"), } u := &MetaEvent{ Action: String("a"), HookID: Int64(1), Hook: &Hook{ CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, URL: String("u"), ID: Int64(1), Type: String("t"), Name: String("n"), TestURL: String("tu"), PingURL: String("pu"), LastResponse: v, Config: hookConfig, 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": { "content_type": "json" }, "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 TestDependabotAlertEvent_Marshal(t *testing.T) { testJSONMarshal(t, &DependabotAlertEvent{}, "{}") e := &DependabotAlertEvent{ Action: String("a"), Alert: &DependabotAlert{ Number: Int(1), State: String("s"), Dependency: &Dependency{ Package: &VulnerabilityPackage{ Ecosystem: String("e"), Name: String("n"), }, ManifestPath: String("mp"), Scope: String("s"), }, SecurityAdvisory: &DependabotSecurityAdvisory{ GHSAID: String("ghsaid"), CVEID: String("cveid"), Summary: String("s"), Description: String("d"), Vulnerabilities: []*AdvisoryVulnerability{ { Package: &VulnerabilityPackage{ Ecosystem: String("e"), Name: String("n"), }, Severity: String("s"), }, }, Severity: String("s"), CVSS: &AdvisoryCVSS{ Score: Float64(1.0), VectorString: String("vs"), }, CWEs: []*AdvisoryCWEs{ { CWEID: String("cweid"), Name: String("n"), }, }, Identifiers: []*AdvisoryIdentifier{ { Value: String("v"), Type: String("t"), }, }, References: []*AdvisoryReference{ { URL: String("u"), }, }, PublishedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, WithdrawnAt: &Timestamp{referenceTime}, }, SecurityVulnerability: &AdvisoryVulnerability{ Package: &VulnerabilityPackage{ Ecosystem: String("e"), Name: String("n"), }, Severity: String("s"), VulnerableVersionRange: String("vvr"), FirstPatchedVersion: &FirstPatchedVersion{ Identifier: String("i"), }, }, URL: String("u"), HTMLURL: String("hu"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, DismissedAt: &Timestamp{referenceTime}, DismissedBy: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, DismissedReason: String("dr"), DismissedComment: String("dc"), FixedAt: &Timestamp{referenceTime}, AutoDismissedAt: &Timestamp{referenceTime}, }, 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), }, 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"), }, 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", "alert": { "number": 1, "state": "s", "dependency": { "package": { "ecosystem": "e", "name": "n" }, "manifest_path": "mp", "scope": "s" }, "security_advisory": { "ghsa_id": "ghsaid", "cve_id": "cveid", "summary": "s", "description": "d", "vulnerabilities": [ { "package": { "ecosystem": "e", "name": "n" }, "severity": "s" } ], "severity": "s", "cvss": { "score": 1.0, "vector_string": "vs" }, "cwes": [ { "cwe_id": "cweid", "name": "n" } ], "identifiers": [ { "value": "v", "type": "t" } ], "references": [ { "url": "u" } ], "published_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "withdrawn_at": ` + referenceTimeStr + ` }, "security_vulnerability": { "package": { "ecosystem": "e", "name": "n" }, "severity": "s", "vulnerable_version_range": "vvr", "first_patched_version": { "identifier": "i" } }, "url": "u", "html_url": "hu", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "dismissed_at": ` + referenceTimeStr + `, "dismissed_by": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "dismissed_reason": "dr", "dismissed_comment": "dc", "fixed_at": ` + referenceTimeStr + `, "auto_dismissed_at": ` + referenceTimeStr + ` }, "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 }, "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" }, "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, e, 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: &Timestamp{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: &Timestamp{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"), Topics: []string{"octocat", "api"}, } 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", "topics": ["octocat","api"] }` 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 TestProjectV2Event_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectV2Event{}, "{}") u := &ProjectV2Event{ Action: String("a"), ProjectsV2: &ProjectsV2{ ID: Int64(1), NodeID: String("nid"), Owner: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Creator: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, Title: String("t"), Description: String("d"), Public: Bool(true), ClosedAt: &Timestamp{referenceTime}, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, DeletedAt: &Timestamp{referenceTime}, Number: Int(1), ShortDescription: String("sd"), DeletedBy: &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), }, 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}, }, }, } want := `{ "action": "a", "projects_v2": { "id": 1, "node_id": "nid", "owner": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "creator": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "title": "t", "description": "d", "public": true, "closed_at": ` + referenceTimeStr + `, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "deleted_at": ` + referenceTimeStr + `, "number": 1, "short_description": "sd", "deleted_by": { "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" } } }` testJSONMarshal(t, u, want) } func TestProjectV2ItemEvent_Marshal(t *testing.T) { testJSONMarshal(t, &ProjectV2ItemEvent{}, "{}") u := &ProjectV2ItemEvent{ Action: String("a"), Changes: &ProjectV2ItemChange{ ArchivedAt: &ArchivedAt{ From: &Timestamp{referenceTime}, To: &Timestamp{referenceTime}, }, }, ProjectV2Item: &ProjectV2Item{ ID: Int64(1), NodeID: String("nid"), ProjectNodeID: String("pnid"), ContentNodeID: String("cnid"), ContentType: String("ct"), 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}, ArchivedAt: &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), }, 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}, }, }, } want := `{ "action": "a", "changes": { "archived_at": { "from": ` + referenceTimeStr + `, "to": ` + referenceTimeStr + ` } }, "projects_v2_item": { "id": 1, "node_id": "nid", "project_node_id": "pnid", "content_node_id": "cnid", "content_type": "ct", "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 + `, "archived_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 }, "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" } } }` 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"), }, PerformedViaGithubApp: &App{ ID: Int64(1), NodeID: String("n"), Slug: String("s"), Name: String("n"), Description: String("d"), ExternalURL: String("e"), HTMLURL: String("h"), }, 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 }, "label": { "id": 1 }, "before": "before", "after": "after", "repository": { "id": 1, "name": "n", "url": "s" }, "performed_via_github_app": { "id": 1, "node_id": "n", "slug": "s", "name": "n", "description": "d", "external_url": "e", "html_url": "h" }, "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 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 TestPullRequestReviewThreadEvent_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestReviewThreadEvent{}, "{}") u := &PullRequestReviewThreadEvent{ Action: String("a"), PullRequest: &PullRequest{ID: Int64(1)}, Thread: &PullRequestThread{ Comments: []*PullRequestComment{{ID: Int64(1)}, {ID: Int64(2)}}, }, 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 }, "thread": { "comments": [ { "id": 1 }, { "id": 2 } ] }, "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"), }, PerformedViaGithubApp: &App{ ID: Int64(1), NodeID: String("n"), Slug: String("s"), Name: String("n"), Description: String("d"), ExternalURL: String("e"), HTMLURL: String("h"), }, 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 }, "label": { "id": 1 }, "before": "before", "after": "after", "repository": { "id": 1, "name": "n", "url": "s" }, "performed_via_github_app": { "id": 1, "node_id": "n", "slug": "s", "name": "n", "description": "d", "external_url": "e", "html_url": "h" }, "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 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) } func TestSecretScanningAlertEvent_Marshal(t *testing.T) { testJSONMarshal(t, &SecretScanningAlertEvent{}, "{}") u := &SecretScanningAlertEvent{ Action: String("a"), Alert: &SecretScanningAlert{ Number: Int(1), SecretType: String("t"), Resolution: String("r"), ResolvedBy: &User{ Login: String("l"), ID: Int64(1), NodeID: String("n"), URL: String("u"), ReposURL: String("r"), EventsURL: String("e"), AvatarURL: String("a"), }, ResolvedAt: &Timestamp{referenceTime}, }, 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), }, 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"), }, 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", "alert": { "number": 1, "secret_type": "t", "resolution": "r", "resolved_by": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "resolved_at": ` + referenceTimeStr + ` }, "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 }, "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" }, "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 TestSecurityAdvisoryEvent_Marshal(t *testing.T) { testJSONMarshal(t, &SecurityAdvisoryEvent{}, "{}") u := &SecurityAdvisoryEvent{ Action: String("published"), SecurityAdvisory: &SecurityAdvisory{ CVSS: &AdvisoryCVSS{ Score: Float64(1.0), VectorString: String("vs"), }, CWEs: []*AdvisoryCWEs{ { CWEID: String("cweid"), Name: String("n"), }, }, GHSAID: String("GHSA-rf4j-j272-some"), Summary: String("Siuuuuuuuuu"), Description: String("desc"), Severity: String("moderate"), Identifiers: []*AdvisoryIdentifier{ { Value: String("GHSA-rf4j-j272-some"), Type: String("GHSA"), }, }, References: []*AdvisoryReference{ { URL: String("https://some-url"), }, }, PublishedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, WithdrawnAt: nil, Vulnerabilities: []*AdvisoryVulnerability{ { Package: &VulnerabilityPackage{ Ecosystem: String("ucl"), Name: String("penaldo"), }, Severity: String("moderate"), VulnerableVersionRange: String(">= 2.0.0, < 2.0.2"), FirstPatchedVersion: &FirstPatchedVersion{ Identifier: String("2.0.2"), }, }, }, }, 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}, }, 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), }, Repository: &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": "published", "security_advisory": { "ghsa_id": "GHSA-rf4j-j272-some", "summary": "Siuuuuuuuuu", "cvss": { "score": 1.0, "vector_string": "vs" }, "cwes": [ { "cwe_id": "cweid", "name": "n" } ], "description": "desc", "severity": "moderate", "identifiers": [ { "value": "GHSA-rf4j-j272-some", "type": "GHSA" } ], "references": [ { "url": "https://some-url" } ], "published_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "withdrawn_at": null, "vulnerabilities": [ { "package": { "ecosystem": "ucl", "name": "penaldo" }, "severity": "moderate", "vulnerable_version_range": ">= 2.0.0, < 2.0.2", "first_patched_version": { "identifier": "2.0.2" } } ] }, "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 + ` }, "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 }, "repository": { "id": 1, "url": "s", "name": "n" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" } }` testJSONMarshal(t, u, want) } func TestSecurityAndAnalysisEvent_Marshal(t *testing.T) { testJSONMarshal(t, &SecurityAndAnalysisEvent{}, "{}") u := &SecurityAndAnalysisEvent{ Changes: &SecurityAndAnalysisChange{ From: &SecurityAndAnalysisChangeFrom{ SecurityAndAnalysis: &SecurityAndAnalysis{ AdvancedSecurity: &AdvancedSecurity{ Status: String("enabled"), }, SecretScanning: &SecretScanning{ Status: String("enabled"), }, SecretScanningPushProtection: &SecretScanningPushProtection{ Status: String("enabled"), }, DependabotSecurityUpdates: &DependabotSecurityUpdates{ Status: String("enabled"), }, }, }, }, 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}, }, 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), }, Repository: &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 := `{ "changes": { "from": { "security_and_analysis": { "advanced_security": { "status": "enabled" }, "secret_scanning": { "status": "enabled" }, "secret_scanning_push_protection": { "status": "enabled" }, "dependabot_security_updates": { "status": "enabled" } } } }, "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 + ` }, "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 }, "repository": { "id": 1, "url": "s", "name": "n" }, "sender": { "login": "l", "id": 1, "node_id": "n", "avatar_url": "a", "url": "u", "events_url": "e", "repos_url": "r" }, "target_type": "running" }` testJSONMarshal(t, u, want) } func TestCodeScanningAlertEvent_Marshal(t *testing.T) { testJSONMarshal(t, &CodeScanningAlertEvent{}, "{}") u := &CodeScanningAlertEvent{ Action: String("reopened"), Alert: &Alert{ Number: Int(10), Rule: &Rule{ ID: String("Style/FrozenStringLiteralComment"), Severity: String("note"), Description: String("desc"), FullDescription: String("full desc"), Tags: []string{"style"}, Help: String("help"), }, Tool: &Tool{ Name: String("Rubocop"), Version: nil, }, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, FixedAt: nil, State: String("open"), URL: String("a"), HTMLURL: String("a"), Instances: []*MostRecentInstance{ { Ref: String("refs/heads/main"), AnalysisKey: String(".github/workflows/workflow.yml:upload"), Environment: String("{}"), State: String("open"), }, }, DismissedBy: nil, DismissedAt: nil, DismissedReason: nil, }, Ref: String("refs/heads/main"), CommitOID: String("d6e4c75c141dbacecc279b721b8bsomeSHA"), Repo: &Repository{ ID: Int64(1234234535), NodeID: String("MDEwOlJlcG9zaXRvcnkxODY4NT=="), Owner: &User{ Login: String("Codertocat"), ID: Int64(21031067), NodeID: String("MDQ6VXNlcjIxMDMxMDY3"), AvatarURL: String("a"), GravatarID: String(""), URL: String("a"), HTMLURL: String("a"), Type: String("User"), SiteAdmin: Bool(false), FollowersURL: String("a"), FollowingURL: String("a"), EventsURL: String("a"), GistsURL: String("a"), OrganizationsURL: String("a"), ReceivedEventsURL: String("a"), ReposURL: String("a"), StarredURL: String("a"), SubscriptionsURL: String("a"), }, HTMLURL: String("a"), Name: String("Hello-World"), FullName: String("Codertocat/Hello-World"), Description: nil, Fork: Bool(false), Homepage: nil, DefaultBranch: String("main"), CreatedAt: &Timestamp{referenceTime}, PushedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, CloneURL: String("a"), GitURL: String("a"), MirrorURL: nil, SSHURL: String("a"), SVNURL: String("a"), Language: nil, ForksCount: Int(0), OpenIssuesCount: Int(2), OpenIssues: Int(2), StargazersCount: Int(0), WatchersCount: Int(0), Watchers: Int(0), Size: Int(0), Archived: Bool(false), Disabled: Bool(false), License: nil, Private: Bool(false), HasIssues: Bool(true), HasWiki: Bool(true), HasPages: Bool(true), HasProjects: Bool(true), HasDownloads: Bool(true), URL: String("a"), ArchiveURL: String("a"), AssigneesURL: String("a"), BlobsURL: String("a"), BranchesURL: String("a"), CollaboratorsURL: String("a"), CommentsURL: String("a"), CommitsURL: String("a"), CompareURL: String("a"), ContentsURL: String("a"), ContributorsURL: String("a"), DeploymentsURL: String("a"), DownloadsURL: String("a"), EventsURL: String("a"), ForksURL: String("a"), GitCommitsURL: String("a"), GitRefsURL: String("a"), GitTagsURL: String("a"), HooksURL: String("a"), IssueCommentURL: String("a"), IssueEventsURL: String("a"), IssuesURL: String("a"), KeysURL: String("a"), LabelsURL: String("a"), LanguagesURL: String("a"), MergesURL: String("a"), MilestonesURL: String("a"), NotificationsURL: String("a"), PullsURL: String("a"), ReleasesURL: String("a"), StargazersURL: String("a"), StatusesURL: String("a"), SubscribersURL: String("a"), SubscriptionURL: String("a"), TagsURL: String("a"), TreesURL: String("a"), TeamsURL: String("a"), }, Org: &Organization{ Login: String("Octocoders"), ID: Int64(6), NodeID: String("MDEyOk9yZ2FuaXphdGlvbjY="), AvatarURL: String("a"), Description: String(""), URL: String("a"), EventsURL: String("a"), HooksURL: String("a"), IssuesURL: String("a"), MembersURL: String("a"), PublicMembersURL: String("a"), ReposURL: String("a"), }, Sender: &User{ Login: String("github"), ID: Int64(9919), NodeID: String("MDEyOk9yZ2FuaXphdGlvbjk5MTk="), AvatarURL: String("a"), HTMLURL: String("a"), GravatarID: String(""), Type: String("Organization"), SiteAdmin: Bool(false), URL: String("a"), EventsURL: String("a"), FollowingURL: String("a"), FollowersURL: String("a"), GistsURL: String("a"), OrganizationsURL: String("a"), ReceivedEventsURL: String("a"), ReposURL: String("a"), StarredURL: String("a"), SubscriptionsURL: String("a"), }, } want := `{ "action": "reopened", "alert": { "number": 10, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "url": "a", "html_url": "a", "instances": [ { "ref": "refs/heads/main", "analysis_key": ".github/workflows/workflow.yml:upload", "environment": "{}", "state": "open" } ], "state": "open", "fixed_at": null, "dismissed_by": null, "dismissed_at": null, "dismissed_reason": null, "rule": { "id": "Style/FrozenStringLiteralComment", "severity": "note", "description": "desc", "full_description": "full desc", "tags": [ "style" ], "help": "help" }, "tool": { "name": "Rubocop", "version": null } }, "ref": "refs/heads/main", "commit_oid": "d6e4c75c141dbacecc279b721b8bsomeSHA", "repository": { "id": 1234234535, "node_id": "MDEwOlJlcG9zaXRvcnkxODY4NT==", "name": "Hello-World", "full_name": "Codertocat/Hello-World", "private": false, "owner": { "login": "Codertocat", "id": 21031067, "node_id": "MDQ6VXNlcjIxMDMxMDY3", "avatar_url": "a", "gravatar_id": "", "url": "a", "html_url": "a", "followers_url": "a", "following_url": "a", "gists_url": "a", "starred_url": "a", "subscriptions_url": "a", "organizations_url": "a", "repos_url": "a", "events_url": "a", "received_events_url": "a", "type": "User", "site_admin": false }, "html_url": "a", "description": null, "fork": false, "url": "a", "forks_url": "a", "keys_url": "a", "collaborators_url": "a", "teams_url": "a", "hooks_url": "a", "issue_events_url": "a", "events_url": "a", "assignees_url": "a", "branches_url": "a", "tags_url": "a", "blobs_url": "a", "git_tags_url": "a", "git_refs_url": "a", "trees_url": "a", "statuses_url": "a", "languages_url": "a", "stargazers_url": "a", "contributors_url": "a", "subscribers_url": "a", "subscription_url": "a", "commits_url": "a", "git_commits_url": "a", "comments_url": "a", "issue_comment_url": "a", "contents_url": "a", "compare_url": "a", "merges_url": "a", "archive_url": "a", "downloads_url": "a", "issues_url": "a", "pulls_url": "a", "milestones_url": "a", "notifications_url": "a", "labels_url": "a", "releases_url": "a", "deployments_url": "a", "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "pushed_at": ` + referenceTimeStr + `, "git_url": "a", "ssh_url": "a", "clone_url": "a", "svn_url": "a", "homepage": null, "size": 0, "stargazers_count": 0, "watchers_count": 0, "language": null, "has_issues": true, "has_projects": true, "has_downloads": true, "has_wiki": true, "has_pages": true, "forks_count": 0, "mirror_url": null, "archived": false, "disabled": false, "open_issues_count": 2, "license": null, "forks": 0, "open_issues": 2, "watchers": 0, "default_branch": "main" }, "organization": { "login": "Octocoders", "id": 6, "node_id": "MDEyOk9yZ2FuaXphdGlvbjY=", "url": "a", "repos_url": "a", "events_url": "a", "hooks_url": "a", "issues_url": "a", "members_url": "a", "public_members_url": "a", "avatar_url": "a", "description": "" }, "sender": { "login": "github", "id": 9919, "node_id": "MDEyOk9yZ2FuaXphdGlvbjk5MTk=", "avatar_url": "a", "gravatar_id": "", "url": "a", "html_url": "a", "followers_url": "a", "following_url": "a", "gists_url": "a", "starred_url": "a", "subscriptions_url": "a", "organizations_url": "a", "repos_url": "a", "events_url": "a", "received_events_url": "a", "type": "Organization", "site_admin": false } }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/examples_test.go000066400000000000000000000122311457013574700201640ustar00rootroot00000000000000// 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/v60/github" ) func ExampleMarkdownService_Render() { 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.Render(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_ListByUser() { client := github.NewClient(nil) user := "willnorris" opt := &github.RepositoryListByUserOptions{Type: "owner", Sort: "updated", Direction: "desc"} ctx := context.Background() repos, _, err := client.Repositories.ListByUser(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-60.0.0/github/gen-accessors.go000066400000000000000000000301011457013574700200370ustar00rootroot00000000000000// 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" "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, } // whitelistSliceGetters lists "struct.field" to add getter method whitelistSliceGetters = map[string]bool{ "PushEvent.Commits": 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 case *ast.ArrayType: if key := fmt.Sprintf("%v.%v", ts.Name, fieldName); whitelistSliceGetters[key] { logf("Method %v is whitelist; adding getter method.", key) t.addArrayType(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(), true) 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 := os.Chmod(filename, 0644); err != nil { return fmt.Errorf("os.Chmod(%q, 0644): %v", filename, err) } if err := os.WriteFile(filename, clean, 0444); err != nil { return err } if err := os.Chmod(filename, 0444); err != nil { return fmt.Errorf("os.Chmod(%q, 0444): %v", filename, 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, isAPointer bool) { var eltType string var ng *getter switch elt := x.Elt.(type) { case *ast.Ident: eltType = elt.String() ng = newGetter(receiverType, fieldName, "[]"+eltType, "nil", false) case *ast.StarExpr: ident, ok := elt.X.(*ast.Ident) if !ok { return } ng = newGetter(receiverType, fieldName, "[]*"+ident.String(), "nil", false) default: logf("addArrayType: type %q, field %q: unknown elt type: %T %+v; skipping.", receiverType, fieldName, elt, elt) return } ng.ArrayType = !isAPointer t.Getters = append(t.Getters, ng) } 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 ArrayType 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. // Instead, please run "go generate ./..." as described here: // https://github.com/google/go-github/blob/master/CONTRIBUTING.md#submitting-a-patch 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 or .MapType .ArrayType }} // Get{{.FieldName}} returns the {{.FieldName}} {{if .MapType}}map{{else if .ArrayType }}slice{{end}} if it's non-nil, {{if .MapType}}an empty map{{else if .ArrayType }}nil{{end}} 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. // Instead, please run "go generate ./..." as described here: // https://github.com/google/go-github/blob/master/CONTRIBUTING.md#submitting-a-patch 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 or .MapType .ArrayType}} 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-60.0.0/github/gen-stringify-test.go000066400000000000000000000253571457013574700210660ustar00rootroot00000000000000// 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" "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[]" case `[]int{0}`: return `[0]` case `[]string{""}`: return `[""]` case "[]Scope{ScopeNone}": return `["(no scope)"]` } 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 { star, ok := fn.Recv.List[0].Type.(*ast.StarExpr) if ok && fn.Name.Name == "String" { id, ok := star.X.(*ast.Ident) if ok { 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, 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 } if at, ok := field.Type.(*ast.ArrayType); ok { if id, ok := at.Elt.(*ast.Ident); ok { t.addIdentSlice(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) addIdentSlice(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}" case "string": zeroValue = `[]string{""}` case "bool": zeroValue = "[]bool{false}" case "Scope": zeroValue = "[]Scope{ScopeNone}" // 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) if err := os.Chmod(t.filename, 0644); err != nil { return fmt.Errorf("os.Chmod(%q, 0644): %v", t.filename, err) } if err := os.WriteFile(t.filename, clean, 0444); err != nil { return err } if err := os.Chmod(t.filename, 0444); err != nil { return fmt.Errorf("os.Chmod(%q, 0444): %v", t.filename, err) } return nil } 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. // Instead, please run "go generate ./..." as described here: // https://github.com/google/go-github/blob/master/CONTRIBUTING.md#submitting-a-patch 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-60.0.0/github/gists.go000066400000000000000000000246171457013574700164530ustar00rootroot00000000000000// 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/rest/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 *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `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/rest/gists/gists#list-gists-for-a-user // GitHub API docs: https://docs.github.com/rest/gists/gists#list-gists-for-the-authenticated-user // //meta:operation GET /gists //meta:operation GET /users/{username}/gists 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/rest/gists/gists#list-public-gists // //meta:operation GET /gists/public 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/rest/gists/gists#list-starred-gists // //meta:operation GET /gists/starred 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/rest/gists/gists#get-a-gist // //meta:operation GET /gists/{gist_id} 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/rest/gists/gists#get-a-gist-revision // //meta:operation GET /gists/{gist_id}/{sha} 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/rest/gists/gists#create-a-gist // //meta:operation POST /gists 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/rest/gists/gists#update-a-gist // //meta:operation PATCH /gists/{gist_id} 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/rest/gists/gists#list-gist-commits // //meta:operation GET /gists/{gist_id}/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/rest/gists/gists#delete-a-gist // //meta:operation DELETE /gists/{gist_id} 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/rest/gists/gists#star-a-gist // //meta:operation PUT /gists/{gist_id}/star 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/rest/gists/gists#unstar-a-gist // //meta:operation DELETE /gists/{gist_id}/star 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/rest/gists/gists#check-if-a-gist-is-starred // //meta:operation GET /gists/{gist_id}/star 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/rest/gists/gists#fork-a-gist // //meta:operation POST /gists/{gist_id}/forks 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/rest/gists/gists#list-gist-forks // //meta:operation GET /gists/{gist_id}/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-60.0.0/github/gists_comments.go000066400000000000000000000070101457013574700203440ustar00rootroot00000000000000// 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" ) // 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 *Timestamp `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/rest/gists/comments#list-gist-comments // //meta:operation GET /gists/{gist_id}/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/rest/gists/comments#get-a-gist-comment // //meta:operation GET /gists/{gist_id}/comments/{comment_id} 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/rest/gists/comments#create-a-gist-comment // //meta:operation POST /gists/{gist_id}/comments 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/rest/gists/comments#update-a-gist-comment // //meta:operation PATCH /gists/{gist_id}/comments/{comment_id} 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/rest/gists/comments#delete-a-gist-comment // //meta:operation DELETE /gists/{gist_id}/comments/{comment_id} 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-60.0.0/github/gists_comments_test.go000066400000000000000000000172071457013574700214140ustar00rootroot00000000000000// 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: &Timestamp{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) assertNilError(t, 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) assertNilError(t, 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-60.0.0/github/gists_test.go000066400000000000000000000627021457013574700175070ustar00rootroot00000000000000// 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: &Timestamp{createdAt}, UpdatedAt: &Timestamp{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) assertNilError(t, 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) assertNilError(t, 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-60.0.0/github/git.go000066400000000000000000000005471457013574700161010ustar00rootroot00000000000000// 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/rest/git/ type GitService service go-github-60.0.0/github/git_blobs.go000066400000000000000000000046111457013574700172560ustar00rootroot00000000000000// 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/rest/git/blobs#get-a-blob // //meta:operation GET /repos/{owner}/{repo}/git/blobs/{file_sha} 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) if err != nil { return nil, resp, err } return blob, resp, nil } // 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/rest/git/blobs#get-a-blob // //meta:operation GET /repos/{owner}/{repo}/git/blobs/{file_sha} 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) if err != nil { return nil, resp, err } return buf.Bytes(), resp, nil } // CreateBlob creates a blob object. // // GitHub API docs: https://docs.github.com/rest/git/blobs#create-a-blob // //meta:operation POST /repos/{owner}/{repo}/git/blobs 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) if err != nil { return nil, resp, err } return t, resp, nil } go-github-60.0.0/github/git_blobs_test.go000066400000000000000000000110151457013574700203110ustar00rootroot00000000000000// 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 }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.GetBlob(ctx, "o", "r", "s") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, 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) assertNilError(t, 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 }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.CreateBlob(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, 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-60.0.0/github/git_commits.go000066400000000000000000000156071457013574700176370ustar00rootroot00000000000000// 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" "io" "strings" ) // 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"` } // MessageSigner is used by GitService.CreateCommit to sign a commit. // // To create a MessageSigner that signs a commit with a [golang.org/x/crypto/openpgp.Entity], // or [github.com/ProtonMail/go-crypto/openpgp.Entity], use: // // commit.Signer = github.MessageSignerFunc(func(w io.Writer, r io.Reader) error { // return openpgp.ArmoredDetachSign(w, openpgpEntity, r, nil) // }) type MessageSigner interface { Sign(w io.Writer, r io.Reader) error } // MessageSignerFunc is a single function implementation of MessageSigner. type MessageSignerFunc func(w io.Writer, r io.Reader) error func (f MessageSignerFunc) Sign(w io.Writer, r io.Reader) error { return f(w, r) } // 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"` } 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 *Timestamp `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/rest/git/commits#get-a-commit-object // //meta:operation GET /repos/{owner}/{repo}/git/commits/{commit_sha} 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"` } type CreateCommitOptions struct { // CreateCommit will sign the commit with this signer. See MessageSigner doc for more details. // Ignored on commits where Verification.Signature is defined. Signer MessageSigner } // 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/rest/git/commits#create-a-commit // //meta:operation POST /repos/{owner}/{repo}/git/commits func (s *GitService) CreateCommit(ctx context.Context, owner string, repo string, commit *Commit, opts *CreateCommitOptions) (*Commit, *Response, error) { if commit == nil { return nil, nil, fmt.Errorf("commit must be provided") } if opts == nil { opts = &CreateCommitOptions{} } 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 } switch { case commit.Verification != nil: body.Signature = commit.Verification.Signature case opts.Signer != nil: signature, err := createSignature(opts.Signer, body) if err != nil { return nil, nil, err } body.Signature = &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(signer MessageSigner, commit *createCommit) (string, error) { if signer == nil { return "", errors.New("createSignature: invalid parameters") } message, err := createSignatureMessage(commit) if err != nil { return "", err } var writer bytes.Buffer err = signer.Sign(&writer, strings.NewReader(message)) if 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-60.0.0/github/git_commits_test.go000066400000000000000000000356601457013574700206770ustar00rootroot00000000000000// 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" "testing" "time" "github.com/google/go-cmp/cmp" ) func mockSigner(t *testing.T, signature string, emitErr error, wantMessage string) MessageSignerFunc { return func(w io.Writer, r io.Reader) error { t.Helper() message, err := io.ReadAll(r) assertNilError(t, err) if wantMessage != "" && string(message) != wantMessage { t.Errorf("MessageSignerFunc got %q, want %q", string(message), wantMessage) } assertWrite(t, w, []byte(signature)) return emitErr } } func uncalledSigner(t *testing.T) MessageSignerFunc { return func(w io.Writer, r io.Reader) error { t.Error("MessageSignerFunc should not be called") return nil } } func TestCommit_Marshal(t *testing.T) { testJSONMarshal(t, &Commit{}, "{}") u := &Commit{ SHA: String("s"), Author: &CommitAuthor{ Date: &Timestamp{referenceTime}, Name: String("n"), Email: String("e"), Login: String("u"), }, Committer: &CommitAuthor{ Date: &Timestamp{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), } 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) assertNilError(t, 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, nil) 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, nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.CreateCommit(ctx, "o", "r", input, nil) 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) assertNilError(t, 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, nil) 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, nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.CreateCommit(ctx, "o", "r", input, nil) 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{} ctx := context.Background() opts := CreateCommitOptions{Signer: uncalledSigner(t)} _, _, err := client.Git.CreateCommit(ctx, "o", "r", input, &opts) if err == nil { t.Errorf("Expected error to be returned because invalid params were passed") } } func TestGitService_CreateCommitWithNilCommit(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Git.CreateCommit(ctx, "o", "r", nil, nil) if err == nil { t.Errorf("Expected error to be returned because commit=nil") } } func TestGitService_CreateCommit_WithSigner(t *testing.T) { client, mux, _, teardown := setup() defer teardown() signature := "my voice is my password" date := time.Date(2017, time.May, 4, 0, 3, 43, 0, time.FixedZone("CEST", 2*3600)) author := CommitAuthor{ Name: String("go-github"), Email: String("go-github@github.com"), Date: &Timestamp{date}, } wantMessage := `tree t parent p author go-github 1493849023 +0200 committer go-github 1493849023 +0200 Commit Message.` sha := "commitSha" input := &Commit{ SHA: &sha, Message: String("Commit Message."), Tree: &Tree{SHA: String("t")}, Parents: []*Commit{{SHA: String("p")}}, Author: &author, } wantBody := createCommit{ Message: input.Message, Tree: String("t"), Parents: []string{"p"}, Author: &author, Signature: &signature, } var gotBody createCommit mux.HandleFunc("/repos/o/r/git/commits", func(w http.ResponseWriter, r *http.Request) { assertNilError(t, json.NewDecoder(r.Body).Decode(&gotBody)) testMethod(t, r, "POST") fmt.Fprintf(w, `{"sha":"%s"}`, sha) }) ctx := context.Background() wantCommit := &Commit{SHA: String(sha)} opts := CreateCommitOptions{Signer: mockSigner(t, signature, nil, wantMessage)} commit, _, err := client.Git.CreateCommit(ctx, "o", "r", input, &opts) assertNilError(t, err) if cmp.Diff(gotBody, wantBody) != "" { t.Errorf("Request body = %+v, want %+v\n%s", gotBody, wantBody, cmp.Diff(gotBody, wantBody)) } if cmp.Diff(commit, wantCommit) != "" { t.Errorf("Git.CreateCommit returned %+v, want %+v\n%s", commit, wantCommit, cmp.Diff(commit, wantCommit)) } } func TestGitService_createSignature_nilSigner(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(uncalledSigner(t), nil) if err == nil { t.Errorf("Expected error to be returned because no author was passed") } } func TestGitService_createSignature_signerError(t *testing.T) { a := &createCommit{ Message: String("Commit Message."), Tree: String("t"), Parents: []string{"p"}, Author: &CommitAuthor{Name: String("go-github")}, } signer := mockSigner(t, "", fmt.Errorf("signer error"), "") _, err := createSignature(signer, a) if err == nil { t.Errorf("Expected error to be returned because signer returned an error") } } 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: &Timestamp{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: &Timestamp{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: &Timestamp{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: &Timestamp{date}, }, Committer: &CommitAuthor{ Name: String("foo"), Email: String("foo@bar.com"), Date: &Timestamp{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{}, nil) testURLParseError(t, err) } 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: &Timestamp{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: &Timestamp{referenceTime}, Name: String("name"), Email: String("email"), Login: String("login"), }, Committer: &CommitAuthor{ Date: &Timestamp{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-60.0.0/github/git_refs.go000066400000000000000000000120151457013574700171110ustar00rootroot00000000000000// 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/rest/git/refs#get-a-reference // //meta:operation GET /repos/{owner}/{repo}/git/ref/{ref} 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/rest/git/refs#list-matching-references // //meta:operation GET /repos/{owner}/{repo}/git/matching-refs/{ref} 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/rest/git/refs#create-a-reference // //meta:operation POST /repos/{owner}/{repo}/git/refs 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/rest/git/refs#update-a-reference // //meta:operation PATCH /repos/{owner}/{repo}/git/refs/{ref} 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, refURLEscape(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/rest/git/refs#delete-a-reference // //meta:operation DELETE /repos/{owner}/{repo}/git/refs/{ref} 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-60.0.0/github/git_refs_test.go000066400000000000000000000526751457013574700201700ustar00rootroot00000000000000// 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) assertNilError(t, 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) assertNilError(t, 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 TestGitService_UpdateRef_pathEscape(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#1", func(w http.ResponseWriter, r *http.Request) { v := new(updateRefRequest) assertNilError(t, 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#1", "url": "https://api.github.com/repos/o/r/git/refs/heads/b%231", "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#1"), Object: &GitObject{SHA: String("aa218f56b14c9653891f9e74264a383fa43fefbd")}, }, true) if err != nil { t.Errorf("Git.UpdateRef returned error: %v", err) } want := &Reference{ Ref: String("refs/heads/b#1"), URL: String("https://api.github.com/repos/o/r/git/refs/heads/b%231"), 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) } } 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-60.0.0/github/git_tags.go000066400000000000000000000051451457013574700171160ustar00rootroot00000000000000// 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/rest/git/tags#get-a-tag // //meta:operation GET /repos/{owner}/{repo}/git/tags/{tag_sha} 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) if err != nil { return nil, resp, err } return tag, resp, nil } // CreateTag creates a tag object. // // GitHub API docs: https://docs.github.com/rest/git/tags#create-a-tag-object // //meta:operation POST /repos/{owner}/{repo}/git/tags 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) if err != nil { return nil, resp, err } return t, resp, nil } go-github-60.0.0/github/git_tags_test.go000066400000000000000000000101751457013574700201540ustar00rootroot00000000000000// 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 }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.GetTag(ctx, "o", "r", "s") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, 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) assertNilError(t, 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() inputTag := &Tag{ Tag: input.Tag, Object: &GitObject{SHA: input.Object}, } tag, _, err := client.Git.CreateTag(ctx, "o", "r", inputTag) 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", inputTag) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Git.CreateTag(ctx, "o", "r", inputTag) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, 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: &Timestamp{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: &Timestamp{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-60.0.0/github/git_trees.go000066400000000000000000000110771457013574700173030ustar00rootroot00000000000000// 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/rest/git/trees#get-a-tree // //meta:operation GET /repos/{owner}/{repo}/git/trees/{tree_sha} 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/rest/git/trees#create-a-tree // //meta:operation POST /repos/{owner}/{repo}/git/trees 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-60.0.0/github/git_trees_test.go000066400000000000000000000244041457013574700203400ustar00rootroot00000000000000// 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" "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 := io.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 := io.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 := io.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-60.0.0/github/github-accessors.go000066400000000000000000022676671457013574700206070ustar00rootroot00000000000000// 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. // Instead, please run "go generate ./..." as described here: // https://github.com/google/go-github/blob/master/CONTRIBUTING.md#submitting-a-patch 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 } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (a *ActionsCache) GetCreatedAt() Timestamp { if a == nil || a.CreatedAt == nil { return Timestamp{} } return *a.CreatedAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (a *ActionsCache) GetID() int64 { if a == nil || a.ID == nil { return 0 } return *a.ID } // GetKey returns the Key field if it's non-nil, zero value otherwise. func (a *ActionsCache) GetKey() string { if a == nil || a.Key == nil { return "" } return *a.Key } // GetLastAccessedAt returns the LastAccessedAt field if it's non-nil, zero value otherwise. func (a *ActionsCache) GetLastAccessedAt() Timestamp { if a == nil || a.LastAccessedAt == nil { return Timestamp{} } return *a.LastAccessedAt } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (a *ActionsCache) GetRef() string { if a == nil || a.Ref == nil { return "" } return *a.Ref } // GetSizeInBytes returns the SizeInBytes field if it's non-nil, zero value otherwise. func (a *ActionsCache) GetSizeInBytes() int64 { if a == nil || a.SizeInBytes == nil { return 0 } return *a.SizeInBytes } // GetVersion returns the Version field if it's non-nil, zero value otherwise. func (a *ActionsCache) GetVersion() string { if a == nil || a.Version == nil { return "" } return *a.Version } // GetDirection returns the Direction field if it's non-nil, zero value otherwise. func (a *ActionsCacheListOptions) GetDirection() string { if a == nil || a.Direction == nil { return "" } return *a.Direction } // GetKey returns the Key field if it's non-nil, zero value otherwise. func (a *ActionsCacheListOptions) GetKey() string { if a == nil || a.Key == nil { return "" } return *a.Key } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (a *ActionsCacheListOptions) GetRef() string { if a == nil || a.Ref == nil { return "" } return *a.Ref } // GetSort returns the Sort field if it's non-nil, zero value otherwise. func (a *ActionsCacheListOptions) GetSort() string { if a == nil || a.Sort == nil { return "" } return *a.Sort } // 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 } // GetAllowedActions returns the AllowedActions field if it's non-nil, zero value otherwise. func (a *ActionsPermissionsEnterprise) GetAllowedActions() string { if a == nil || a.AllowedActions == nil { return "" } return *a.AllowedActions } // GetEnabledOrganizations returns the EnabledOrganizations field if it's non-nil, zero value otherwise. func (a *ActionsPermissionsEnterprise) GetEnabledOrganizations() string { if a == nil || a.EnabledOrganizations == nil { return "" } return *a.EnabledOrganizations } // GetSelectedActionsURL returns the SelectedActionsURL field if it's non-nil, zero value otherwise. func (a *ActionsPermissionsEnterprise) GetSelectedActionsURL() string { if a == nil || a.SelectedActionsURL == nil { return "" } return *a.SelectedActionsURL } // GetAllowedActions returns the AllowedActions field if it's non-nil, zero value otherwise. func (a *ActionsPermissionsRepository) GetAllowedActions() string { if a == nil || a.AllowedActions == nil { return "" } return *a.AllowedActions } // GetEnabled returns the Enabled field if it's non-nil, zero value otherwise. func (a *ActionsPermissionsRepository) GetEnabled() bool { if a == nil || a.Enabled == nil { return false } return *a.Enabled } // GetSelectedActionsURL returns the SelectedActionsURL field if it's non-nil, zero value otherwise. func (a *ActionsPermissionsRepository) GetSelectedActionsURL() string { if a == nil || a.SelectedActionsURL == nil { return "" } return *a.SelectedActionsURL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (a *ActionsVariable) GetCreatedAt() Timestamp { if a == nil || a.CreatedAt == nil { return Timestamp{} } return *a.CreatedAt } // GetSelectedRepositoriesURL returns the SelectedRepositoriesURL field if it's non-nil, zero value otherwise. func (a *ActionsVariable) GetSelectedRepositoriesURL() string { if a == nil || a.SelectedRepositoriesURL == nil { return "" } return *a.SelectedRepositoriesURL } // GetSelectedRepositoryIDs returns the SelectedRepositoryIDs field. func (a *ActionsVariable) GetSelectedRepositoryIDs() *SelectedRepoIDs { if a == nil { return nil } return a.SelectedRepositoryIDs } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (a *ActionsVariable) GetUpdatedAt() Timestamp { if a == nil || a.UpdatedAt == nil { return Timestamp{} } return *a.UpdatedAt } // GetVisibility returns the Visibility field if it's non-nil, zero value otherwise. func (a *ActionsVariable) GetVisibility() string { if a == nil || a.Visibility == nil { return "" } return *a.Visibility } // GetCountryCode returns the CountryCode field if it's non-nil, zero value otherwise. func (a *ActorLocation) GetCountryCode() string { if a == nil || a.CountryCode == nil { return "" } return *a.CountryCode } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (a *AdminEnforcedChanges) GetFrom() bool { if a == nil || a.From == nil { return false } return *a.From } // 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 } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (a *AdvancedSecurity) GetStatus() string { if a == nil || a.Status == nil { return "" } return *a.Status } // GetLastPushedDate returns the LastPushedDate field if it's non-nil, zero value otherwise. func (a *AdvancedSecurityCommittersBreakdown) GetLastPushedDate() string { if a == nil || a.LastPushedDate == nil { return "" } return *a.LastPushedDate } // GetUserLogin returns the UserLogin field if it's non-nil, zero value otherwise. func (a *AdvancedSecurityCommittersBreakdown) GetUserLogin() string { if a == nil || a.UserLogin == nil { return "" } return *a.UserLogin } // GetScore returns the Score field. func (a *AdvisoryCVSS) GetScore() *float64 { if a == nil { return nil } return a.Score } // GetVectorString returns the VectorString field if it's non-nil, zero value otherwise. func (a *AdvisoryCVSS) GetVectorString() string { if a == nil || a.VectorString == nil { return "" } return *a.VectorString } // GetCWEID returns the CWEID field if it's non-nil, zero value otherwise. func (a *AdvisoryCWEs) GetCWEID() string { if a == nil || a.CWEID == nil { return "" } return *a.CWEID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (a *AdvisoryCWEs) GetName() string { if a == nil || a.Name == nil { return "" } return *a.Name } // GetType returns the Type field if it's non-nil, zero value otherwise. func (a *AdvisoryIdentifier) GetType() string { if a == nil || a.Type == nil { return "" } return *a.Type } // GetValue returns the Value field if it's non-nil, zero value otherwise. func (a *AdvisoryIdentifier) GetValue() string { if a == nil || a.Value == nil { return "" } return *a.Value } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (a *AdvisoryReference) GetURL() string { if a == nil || a.URL == nil { return "" } return *a.URL } // GetFirstPatchedVersion returns the FirstPatchedVersion field. func (a *AdvisoryVulnerability) GetFirstPatchedVersion() *FirstPatchedVersion { if a == nil { return nil } return a.FirstPatchedVersion } // GetPackage returns the Package field. func (a *AdvisoryVulnerability) GetPackage() *VulnerabilityPackage { if a == nil { return nil } return a.Package } // GetPatchedVersions returns the PatchedVersions field if it's non-nil, zero value otherwise. func (a *AdvisoryVulnerability) GetPatchedVersions() string { if a == nil || a.PatchedVersions == nil { return "" } return *a.PatchedVersions } // GetSeverity returns the Severity field if it's non-nil, zero value otherwise. func (a *AdvisoryVulnerability) GetSeverity() string { if a == nil || a.Severity == nil { return "" } return *a.Severity } // GetVulnerableVersionRange returns the VulnerableVersionRange field if it's non-nil, zero value otherwise. func (a *AdvisoryVulnerability) GetVulnerableVersionRange() string { if a == nil || a.VulnerableVersionRange == nil { return "" } return *a.VulnerableVersionRange } // 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 } // GetDismissedComment returns the DismissedComment field if it's non-nil, zero value otherwise. func (a *Alert) GetDismissedComment() string { if a == nil || a.DismissedComment == nil { return "" } return *a.DismissedComment } // 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 } // GetFixedAt returns the FixedAt field if it's non-nil, zero value otherwise. func (a *Alert) GetFixedAt() Timestamp { if a == nil || a.FixedAt == nil { return Timestamp{} } return *a.FixedAt } // 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 } // GetNumber returns the Number field if it's non-nil, zero value otherwise. func (a *Alert) GetNumber() int { if a == nil || a.Number == nil { return 0 } return *a.Number } // GetRepository returns the Repository field. func (a *Alert) GetRepository() *Repository { if a == nil { return nil } return a.Repository } // 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 } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (a *Alert) 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 *Alert) GetURL() string { if a == nil || a.URL == nil { return "" } return *a.URL } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (a *AllowDeletionsEnforcementLevelChanges) GetFrom() string { if a == nil || a.From == nil { return "" } return *a.From } // GetEnabled returns the Enabled field if it's non-nil, zero value otherwise. func (a *AllowForkSyncing) GetEnabled() bool { if a == nil || a.Enabled == nil { return false } return *a.Enabled } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (a *AnalysesListOptions) GetRef() string { if a == nil || a.Ref == nil { return "" } return *a.Ref } // GetSarifID returns the SarifID field if it's non-nil, zero value otherwise. func (a *AnalysesListOptions) GetSarifID() string { if a == nil || a.SarifID == nil { return "" } return *a.SarifID } // GetSSHKeyFingerprints returns the SSHKeyFingerprints map if it's non-nil, an empty map otherwise. func (a *APIMeta) GetSSHKeyFingerprints() map[string]string { if a == nil || a.SSHKeyFingerprints == nil { return map[string]string{} } return a.SSHKeyFingerprints } // 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 } // GetInstallationsCount returns the InstallationsCount field if it's non-nil, zero value otherwise. func (a *App) GetInstallationsCount() int { if a == nil || a.InstallationsCount == nil { return 0 } return *a.InstallationsCount } // 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 } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (a *ArchivedAt) GetFrom() Timestamp { if a == nil || a.From == nil { return Timestamp{} } return *a.From } // GetTo returns the To field if it's non-nil, zero value otherwise. func (a *ArchivedAt) GetTo() Timestamp { if a == nil || a.To == nil { return Timestamp{} } return *a.To } // 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 } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (a *Artifact) 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 *Artifact) GetURL() string { if a == nil || a.URL == nil { return "" } return *a.URL } // GetWorkflowRun returns the WorkflowRun field. func (a *Artifact) GetWorkflowRun() *ArtifactWorkflowRun { if a == nil { return nil } return a.WorkflowRun } // 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 } // GetHeadBranch returns the HeadBranch field if it's non-nil, zero value otherwise. func (a *ArtifactWorkflowRun) GetHeadBranch() string { if a == nil || a.HeadBranch == nil { return "" } return *a.HeadBranch } // GetHeadRepositoryID returns the HeadRepositoryID field if it's non-nil, zero value otherwise. func (a *ArtifactWorkflowRun) GetHeadRepositoryID() int64 { if a == nil || a.HeadRepositoryID == nil { return 0 } return *a.HeadRepositoryID } // GetHeadSHA returns the HeadSHA field if it's non-nil, zero value otherwise. func (a *ArtifactWorkflowRun) GetHeadSHA() string { if a == nil || a.HeadSHA == nil { return "" } return *a.HeadSHA } // GetID returns the ID field if it's non-nil, zero value otherwise. func (a *ArtifactWorkflowRun) GetID() int64 { if a == nil || a.ID == nil { return 0 } return *a.ID } // GetRepositoryID returns the RepositoryID field if it's non-nil, zero value otherwise. func (a *ArtifactWorkflowRun) GetRepositoryID() int64 { if a == nil || a.RepositoryID == nil { return 0 } return *a.RepositoryID } // 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 } // 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 } // GetActorID returns the ActorID field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetActorID() int64 { if a == nil || a.ActorID == nil { return 0 } return *a.ActorID } // GetActorLocation returns the ActorLocation field. func (a *AuditEntry) GetActorLocation() *ActorLocation { if a == nil { return nil } return a.ActorLocation } // 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 } // GetBusinessID returns the BusinessID field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetBusinessID() int64 { if a == nil || a.BusinessID == nil { return 0 } return *a.BusinessID } // 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 } // 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 } // GetExternalIdentityNameID returns the ExternalIdentityNameID field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetExternalIdentityNameID() string { if a == nil || a.ExternalIdentityNameID == nil { return "" } return *a.ExternalIdentityNameID } // GetExternalIdentityUsername returns the ExternalIdentityUsername field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetExternalIdentityUsername() string { if a == nil || a.ExternalIdentityUsername == nil { return "" } return *a.ExternalIdentityUsername } // GetHashedToken returns the HashedToken field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetHashedToken() string { if a == nil || a.HashedToken == nil { return "" } return *a.HashedToken } // 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 } // GetOrgID returns the OrgID field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetOrgID() int64 { if a == nil || a.OrgID == nil { return 0 } return *a.OrgID } // 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 } // GetTokenID returns the TokenID field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetTokenID() int64 { if a == nil || a.TokenID == nil { return 0 } return *a.TokenID } // GetTokenScopes returns the TokenScopes field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetTokenScopes() string { if a == nil || a.TokenScopes == nil { return "" } return *a.TokenScopes } // 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 } // GetUserID returns the UserID field if it's non-nil, zero value otherwise. func (a *AuditEntry) GetUserID() int64 { if a == nil || a.UserID == nil { return 0 } return *a.UserID } // 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 } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (a *AuthorizedActorsOnly) GetFrom() bool { if a == nil || a.From == nil { return false } return *a.From } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (a *AuthorizedDismissalActorsOnlyChanges) GetFrom() bool { if a == nil || a.From == nil { return false } return *a.From } // GetID returns the ID field if it's non-nil, zero value otherwise. func (a *Autolink) GetID() int64 { if a == nil || a.ID == nil { return 0 } return *a.ID } // GetIsAlphanumeric returns the IsAlphanumeric field if it's non-nil, zero value otherwise. func (a *Autolink) GetIsAlphanumeric() bool { if a == nil || a.IsAlphanumeric == nil { return false } return *a.IsAlphanumeric } // GetKeyPrefix returns the KeyPrefix field if it's non-nil, zero value otherwise. func (a *Autolink) GetKeyPrefix() string { if a == nil || a.KeyPrefix == nil { return "" } return *a.KeyPrefix } // GetURLTemplate returns the URLTemplate field if it's non-nil, zero value otherwise. func (a *Autolink) GetURLTemplate() string { if a == nil || a.URLTemplate == nil { return "" } return *a.URLTemplate } // GetIsAlphanumeric returns the IsAlphanumeric field if it's non-nil, zero value otherwise. func (a *AutolinkOptions) GetIsAlphanumeric() bool { if a == nil || a.IsAlphanumeric == nil { return false } return *a.IsAlphanumeric } // GetKeyPrefix returns the KeyPrefix field if it's non-nil, zero value otherwise. func (a *AutolinkOptions) GetKeyPrefix() string { if a == nil || a.KeyPrefix == nil { return "" } return *a.KeyPrefix } // GetURLTemplate returns the URLTemplate field if it's non-nil, zero value otherwise. func (a *AutolinkOptions) GetURLTemplate() string { if a == nil || a.URLTemplate == nil { return "" } return *a.URLTemplate } // GetEnabled returns the Enabled field if it's non-nil, zero value otherwise. func (a *AutomatedSecurityFixes) GetEnabled() bool { if a == nil || a.Enabled == nil { return false } return *a.Enabled } // GetPaused returns the Paused field if it's non-nil, zero value otherwise. func (a *AutomatedSecurityFixes) GetPaused() bool { if a == nil || a.Paused == nil { return false } return *a.Paused } // 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 } // GetEnabled returns the Enabled field if it's non-nil, zero value otherwise. func (b *BlockCreations) GetEnabled() bool { if b == nil || b.Enabled == nil { return false } return *b.Enabled } // 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 } // GetAdminEnforced returns the AdminEnforced field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetAdminEnforced() bool { if b == nil || b.AdminEnforced == nil { return false } return *b.AdminEnforced } // GetAllowDeletionsEnforcementLevel returns the AllowDeletionsEnforcementLevel field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetAllowDeletionsEnforcementLevel() string { if b == nil || b.AllowDeletionsEnforcementLevel == nil { return "" } return *b.AllowDeletionsEnforcementLevel } // GetAllowForcePushesEnforcementLevel returns the AllowForcePushesEnforcementLevel field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetAllowForcePushesEnforcementLevel() string { if b == nil || b.AllowForcePushesEnforcementLevel == nil { return "" } return *b.AllowForcePushesEnforcementLevel } // GetAuthorizedActorsOnly returns the AuthorizedActorsOnly field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetAuthorizedActorsOnly() bool { if b == nil || b.AuthorizedActorsOnly == nil { return false } return *b.AuthorizedActorsOnly } // GetAuthorizedDismissalActorsOnly returns the AuthorizedDismissalActorsOnly field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetAuthorizedDismissalActorsOnly() bool { if b == nil || b.AuthorizedDismissalActorsOnly == nil { return false } return *b.AuthorizedDismissalActorsOnly } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetCreatedAt() Timestamp { if b == nil || b.CreatedAt == nil { return Timestamp{} } return *b.CreatedAt } // GetDismissStaleReviewsOnPush returns the DismissStaleReviewsOnPush field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetDismissStaleReviewsOnPush() bool { if b == nil || b.DismissStaleReviewsOnPush == nil { return false } return *b.DismissStaleReviewsOnPush } // GetID returns the ID field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetID() int64 { if b == nil || b.ID == nil { return 0 } return *b.ID } // GetIgnoreApprovalsFromContributors returns the IgnoreApprovalsFromContributors field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetIgnoreApprovalsFromContributors() bool { if b == nil || b.IgnoreApprovalsFromContributors == nil { return false } return *b.IgnoreApprovalsFromContributors } // GetLinearHistoryRequirementEnforcementLevel returns the LinearHistoryRequirementEnforcementLevel field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetLinearHistoryRequirementEnforcementLevel() string { if b == nil || b.LinearHistoryRequirementEnforcementLevel == nil { return "" } return *b.LinearHistoryRequirementEnforcementLevel } // GetMergeQueueEnforcementLevel returns the MergeQueueEnforcementLevel field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetMergeQueueEnforcementLevel() string { if b == nil || b.MergeQueueEnforcementLevel == nil { return "" } return *b.MergeQueueEnforcementLevel } // GetName returns the Name field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetName() string { if b == nil || b.Name == nil { return "" } return *b.Name } // GetPullRequestReviewsEnforcementLevel returns the PullRequestReviewsEnforcementLevel field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetPullRequestReviewsEnforcementLevel() string { if b == nil || b.PullRequestReviewsEnforcementLevel == nil { return "" } return *b.PullRequestReviewsEnforcementLevel } // GetRepositoryID returns the RepositoryID field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetRepositoryID() int64 { if b == nil || b.RepositoryID == nil { return 0 } return *b.RepositoryID } // GetRequireCodeOwnerReview returns the RequireCodeOwnerReview field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetRequireCodeOwnerReview() bool { if b == nil || b.RequireCodeOwnerReview == nil { return false } return *b.RequireCodeOwnerReview } // GetRequiredApprovingReviewCount returns the RequiredApprovingReviewCount field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetRequiredApprovingReviewCount() int { if b == nil || b.RequiredApprovingReviewCount == nil { return 0 } return *b.RequiredApprovingReviewCount } // GetRequiredConversationResolutionLevel returns the RequiredConversationResolutionLevel field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetRequiredConversationResolutionLevel() string { if b == nil || b.RequiredConversationResolutionLevel == nil { return "" } return *b.RequiredConversationResolutionLevel } // GetRequiredDeploymentsEnforcementLevel returns the RequiredDeploymentsEnforcementLevel field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetRequiredDeploymentsEnforcementLevel() string { if b == nil || b.RequiredDeploymentsEnforcementLevel == nil { return "" } return *b.RequiredDeploymentsEnforcementLevel } // GetRequiredStatusChecksEnforcementLevel returns the RequiredStatusChecksEnforcementLevel field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetRequiredStatusChecksEnforcementLevel() string { if b == nil || b.RequiredStatusChecksEnforcementLevel == nil { return "" } return *b.RequiredStatusChecksEnforcementLevel } // GetSignatureRequirementEnforcementLevel returns the SignatureRequirementEnforcementLevel field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetSignatureRequirementEnforcementLevel() string { if b == nil || b.SignatureRequirementEnforcementLevel == nil { return "" } return *b.SignatureRequirementEnforcementLevel } // GetStrictRequiredStatusChecksPolicy returns the StrictRequiredStatusChecksPolicy field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetStrictRequiredStatusChecksPolicy() bool { if b == nil || b.StrictRequiredStatusChecksPolicy == nil { return false } return *b.StrictRequiredStatusChecksPolicy } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (b *BranchProtectionRule) GetUpdatedAt() Timestamp { if b == nil || b.UpdatedAt == nil { return Timestamp{} } return *b.UpdatedAt } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (b *BranchProtectionRuleEvent) GetAction() string { if b == nil || b.Action == nil { return "" } return *b.Action } // GetChanges returns the Changes field. func (b *BranchProtectionRuleEvent) GetChanges() *ProtectionChanges { if b == nil { return nil } return b.Changes } // GetInstallation returns the Installation field. func (b *BranchProtectionRuleEvent) GetInstallation() *Installation { if b == nil { return nil } return b.Installation } // GetOrg returns the Org field. func (b *BranchProtectionRuleEvent) GetOrg() *Organization { if b == nil { return nil } return b.Org } // GetRepo returns the Repo field. func (b *BranchProtectionRuleEvent) GetRepo() *Repository { if b == nil { return nil } return b.Repo } // GetRule returns the Rule field. func (b *BranchProtectionRuleEvent) GetRule() *BranchProtectionRule { if b == nil { return nil } return b.Rule } // GetSender returns the Sender field. func (b *BranchProtectionRuleEvent) GetSender() *User { if b == nil { return nil } return b.Sender } // GetActorID returns the ActorID field if it's non-nil, zero value otherwise. func (b *BypassActor) GetActorID() int64 { if b == nil || b.ActorID == nil { return 0 } return *b.ActorID } // GetActorType returns the ActorType field if it's non-nil, zero value otherwise. func (b *BypassActor) GetActorType() string { if b == nil || b.ActorType == nil { return "" } return *b.ActorType } // GetBypassMode returns the BypassMode field if it's non-nil, zero value otherwise. func (b *BypassActor) GetBypassMode() string { if b == nil || b.BypassMode == nil { return "" } return *b.BypassMode } // 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 } // GetSuggestion returns the Suggestion field if it's non-nil, zero value otherwise. func (c *CodeownersError) GetSuggestion() string { if c == nil || c.Suggestion == nil { return "" } return *c.Suggestion } // GetContentType returns the ContentType field if it's non-nil, zero value otherwise. func (c *CodeQLDatabase) GetContentType() string { if c == nil || c.ContentType == nil { return "" } return *c.ContentType } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (c *CodeQLDatabase) GetCreatedAt() Timestamp { if c == nil || c.CreatedAt == nil { return Timestamp{} } return *c.CreatedAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (c *CodeQLDatabase) GetID() int64 { if c == nil || c.ID == nil { return 0 } return *c.ID } // GetLanguage returns the Language field if it's non-nil, zero value otherwise. func (c *CodeQLDatabase) GetLanguage() string { if c == nil || c.Language == nil { return "" } return *c.Language } // GetName returns the Name field if it's non-nil, zero value otherwise. func (c *CodeQLDatabase) GetName() string { if c == nil || c.Name == nil { return "" } return *c.Name } // GetSize returns the Size field if it's non-nil, zero value otherwise. func (c *CodeQLDatabase) GetSize() int64 { if c == nil || c.Size == nil { return 0 } return *c.Size } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (c *CodeQLDatabase) GetUpdatedAt() Timestamp { if c == nil || c.UpdatedAt == nil { return Timestamp{} } return *c.UpdatedAt } // GetUploader returns the Uploader field. func (c *CodeQLDatabase) GetUploader() *User { if c == nil { return nil } return c.Uploader } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (c *CodeQLDatabase) 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 } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (c *CodeScanningAlertEvent) GetAction() string { if c == nil || c.Action == nil { return "" } return *c.Action } // GetAlert returns the Alert field. func (c *CodeScanningAlertEvent) GetAlert() *Alert { if c == nil { return nil } return c.Alert } // GetCommitOID returns the CommitOID field if it's non-nil, zero value otherwise. func (c *CodeScanningAlertEvent) GetCommitOID() string { if c == nil || c.CommitOID == nil { return "" } return *c.CommitOID } // GetInstallation returns the Installation field. func (c *CodeScanningAlertEvent) GetInstallation() *Installation { if c == nil { return nil } return c.Installation } // GetOrg returns the Org field. func (c *CodeScanningAlertEvent) GetOrg() *Organization { if c == nil { return nil } return c.Org } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (c *CodeScanningAlertEvent) GetRef() string { if c == nil || c.Ref == nil { return "" } return *c.Ref } // GetRepo returns the Repo field. func (c *CodeScanningAlertEvent) GetRepo() *Repository { if c == nil { return nil } return c.Repo } // GetSender returns the Sender field. func (c *CodeScanningAlertEvent) GetSender() *User { if c == nil { return nil } return c.Sender } // GetDismissedComment returns the DismissedComment field if it's non-nil, zero value otherwise. func (c *CodeScanningAlertState) GetDismissedComment() string { if c == nil || c.DismissedComment == nil { return "" } return *c.DismissedComment } // GetDismissedReason returns the DismissedReason field if it's non-nil, zero value otherwise. func (c *CodeScanningAlertState) GetDismissedReason() string { if c == nil || c.DismissedReason == nil { return "" } return *c.DismissedReason } // 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 } // GetBillableOwner returns the BillableOwner field. func (c *Codespace) GetBillableOwner() *User { if c == nil { return nil } return c.BillableOwner } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (c *Codespace) GetCreatedAt() Timestamp { if c == nil || c.CreatedAt == nil { return Timestamp{} } return *c.CreatedAt } // GetDevcontainerPath returns the DevcontainerPath field if it's non-nil, zero value otherwise. func (c *Codespace) GetDevcontainerPath() string { if c == nil || c.DevcontainerPath == nil { return "" } return *c.DevcontainerPath } // GetDisplayName returns the DisplayName field if it's non-nil, zero value otherwise. func (c *Codespace) GetDisplayName() string { if c == nil || c.DisplayName == nil { return "" } return *c.DisplayName } // GetEnvironmentID returns the EnvironmentID field if it's non-nil, zero value otherwise. func (c *Codespace) GetEnvironmentID() string { if c == nil || c.EnvironmentID == nil { return "" } return *c.EnvironmentID } // GetGitStatus returns the GitStatus field. func (c *Codespace) GetGitStatus() *CodespacesGitStatus { if c == nil { return nil } return c.GitStatus } // GetID returns the ID field if it's non-nil, zero value otherwise. func (c *Codespace) GetID() int64 { if c == nil || c.ID == nil { return 0 } return *c.ID } // GetIdleTimeoutMinutes returns the IdleTimeoutMinutes field if it's non-nil, zero value otherwise. func (c *Codespace) GetIdleTimeoutMinutes() int { if c == nil || c.IdleTimeoutMinutes == nil { return 0 } return *c.IdleTimeoutMinutes } // GetIdleTimeoutNotice returns the IdleTimeoutNotice field if it's non-nil, zero value otherwise. func (c *Codespace) GetIdleTimeoutNotice() string { if c == nil || c.IdleTimeoutNotice == nil { return "" } return *c.IdleTimeoutNotice } // GetLastKnownStopNotice returns the LastKnownStopNotice field if it's non-nil, zero value otherwise. func (c *Codespace) GetLastKnownStopNotice() string { if c == nil || c.LastKnownStopNotice == nil { return "" } return *c.LastKnownStopNotice } // GetLastUsedAt returns the LastUsedAt field if it's non-nil, zero value otherwise. func (c *Codespace) GetLastUsedAt() Timestamp { if c == nil || c.LastUsedAt == nil { return Timestamp{} } return *c.LastUsedAt } // GetLocation returns the Location field if it's non-nil, zero value otherwise. func (c *Codespace) GetLocation() string { if c == nil || c.Location == nil { return "" } return *c.Location } // GetMachine returns the Machine field. func (c *Codespace) GetMachine() *CodespacesMachine { if c == nil { return nil } return c.Machine } // GetMachinesURL returns the MachinesURL field if it's non-nil, zero value otherwise. func (c *Codespace) GetMachinesURL() string { if c == nil || c.MachinesURL == nil { return "" } return *c.MachinesURL } // GetName returns the Name field if it's non-nil, zero value otherwise. func (c *Codespace) GetName() string { if c == nil || c.Name == nil { return "" } return *c.Name } // GetOwner returns the Owner field. func (c *Codespace) GetOwner() *User { if c == nil { return nil } return c.Owner } // GetPendingOperation returns the PendingOperation field if it's non-nil, zero value otherwise. func (c *Codespace) GetPendingOperation() bool { if c == nil || c.PendingOperation == nil { return false } return *c.PendingOperation } // GetPendingOperationDisabledReason returns the PendingOperationDisabledReason field if it's non-nil, zero value otherwise. func (c *Codespace) GetPendingOperationDisabledReason() string { if c == nil || c.PendingOperationDisabledReason == nil { return "" } return *c.PendingOperationDisabledReason } // GetPrebuild returns the Prebuild field if it's non-nil, zero value otherwise. func (c *Codespace) GetPrebuild() bool { if c == nil || c.Prebuild == nil { return false } return *c.Prebuild } // GetPullsURL returns the PullsURL field if it's non-nil, zero value otherwise. func (c *Codespace) GetPullsURL() string { if c == nil || c.PullsURL == nil { return "" } return *c.PullsURL } // GetRepository returns the Repository field. func (c *Codespace) GetRepository() *Repository { if c == nil { return nil } return c.Repository } // GetRetentionExpiresAt returns the RetentionExpiresAt field if it's non-nil, zero value otherwise. func (c *Codespace) GetRetentionExpiresAt() Timestamp { if c == nil || c.RetentionExpiresAt == nil { return Timestamp{} } return *c.RetentionExpiresAt } // GetRetentionPeriodMinutes returns the RetentionPeriodMinutes field if it's non-nil, zero value otherwise. func (c *Codespace) GetRetentionPeriodMinutes() int { if c == nil || c.RetentionPeriodMinutes == nil { return 0 } return *c.RetentionPeriodMinutes } // GetRuntimeConstraints returns the RuntimeConstraints field. func (c *Codespace) GetRuntimeConstraints() *CodespacesRuntimeConstraints { if c == nil { return nil } return c.RuntimeConstraints } // GetStartURL returns the StartURL field if it's non-nil, zero value otherwise. func (c *Codespace) GetStartURL() string { if c == nil || c.StartURL == nil { return "" } return *c.StartURL } // GetState returns the State field if it's non-nil, zero value otherwise. func (c *Codespace) GetState() string { if c == nil || c.State == nil { return "" } return *c.State } // GetStopURL returns the StopURL field if it's non-nil, zero value otherwise. func (c *Codespace) GetStopURL() string { if c == nil || c.StopURL == nil { return "" } return *c.StopURL } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (c *Codespace) 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 *Codespace) GetURL() string { if c == nil || c.URL == nil { return "" } return *c.URL } // GetWebURL returns the WebURL field if it's non-nil, zero value otherwise. func (c *Codespace) GetWebURL() string { if c == nil || c.WebURL == nil { return "" } return *c.WebURL } // GetAhead returns the Ahead field if it's non-nil, zero value otherwise. func (c *CodespacesGitStatus) GetAhead() int { if c == nil || c.Ahead == nil { return 0 } return *c.Ahead } // GetBehind returns the Behind field if it's non-nil, zero value otherwise. func (c *CodespacesGitStatus) GetBehind() int { if c == nil || c.Behind == nil { return 0 } return *c.Behind } // GetHasUncommittedChanges returns the HasUncommittedChanges field if it's non-nil, zero value otherwise. func (c *CodespacesGitStatus) GetHasUncommittedChanges() bool { if c == nil || c.HasUncommittedChanges == nil { return false } return *c.HasUncommittedChanges } // GetHasUnpushedChanges returns the HasUnpushedChanges field if it's non-nil, zero value otherwise. func (c *CodespacesGitStatus) GetHasUnpushedChanges() bool { if c == nil || c.HasUnpushedChanges == nil { return false } return *c.HasUnpushedChanges } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (c *CodespacesGitStatus) GetRef() string { if c == nil || c.Ref == nil { return "" } return *c.Ref } // GetCPUs returns the CPUs field if it's non-nil, zero value otherwise. func (c *CodespacesMachine) GetCPUs() int { if c == nil || c.CPUs == nil { return 0 } return *c.CPUs } // GetDisplayName returns the DisplayName field if it's non-nil, zero value otherwise. func (c *CodespacesMachine) GetDisplayName() string { if c == nil || c.DisplayName == nil { return "" } return *c.DisplayName } // GetMemoryInBytes returns the MemoryInBytes field if it's non-nil, zero value otherwise. func (c *CodespacesMachine) GetMemoryInBytes() int64 { if c == nil || c.MemoryInBytes == nil { return 0 } return *c.MemoryInBytes } // GetName returns the Name field if it's non-nil, zero value otherwise. func (c *CodespacesMachine) GetName() string { if c == nil || c.Name == nil { return "" } return *c.Name } // GetOperatingSystem returns the OperatingSystem field if it's non-nil, zero value otherwise. func (c *CodespacesMachine) GetOperatingSystem() string { if c == nil || c.OperatingSystem == nil { return "" } return *c.OperatingSystem } // GetPrebuildAvailability returns the PrebuildAvailability field if it's non-nil, zero value otherwise. func (c *CodespacesMachine) GetPrebuildAvailability() string { if c == nil || c.PrebuildAvailability == nil { return "" } return *c.PrebuildAvailability } // GetStorageInBytes returns the StorageInBytes field if it's non-nil, zero value otherwise. func (c *CodespacesMachine) GetStorageInBytes() int64 { if c == nil || c.StorageInBytes == nil { return 0 } return *c.StorageInBytes } // 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() Timestamp { if c == nil || c.CreatedAt == nil { return Timestamp{} } return *c.CreatedAt } // GetAuthorAssociation returns the AuthorAssociation field if it's non-nil, zero value otherwise. func (c *CommentDiscussion) GetAuthorAssociation() string { if c == nil || c.AuthorAssociation == nil { return "" } return *c.AuthorAssociation } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (c *CommentDiscussion) GetBody() string { if c == nil || c.Body == nil { return "" } return *c.Body } // GetChildCommentCount returns the ChildCommentCount field if it's non-nil, zero value otherwise. func (c *CommentDiscussion) GetChildCommentCount() int { if c == nil || c.ChildCommentCount == nil { return 0 } return *c.ChildCommentCount } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (c *CommentDiscussion) GetCreatedAt() Timestamp { if c == nil || c.CreatedAt == nil { return Timestamp{} } return *c.CreatedAt } // GetDiscussionID returns the DiscussionID field if it's non-nil, zero value otherwise. func (c *CommentDiscussion) GetDiscussionID() int64 { if c == nil || c.DiscussionID == nil { return 0 } return *c.DiscussionID } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (c *CommentDiscussion) 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 *CommentDiscussion) 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 *CommentDiscussion) GetNodeID() string { if c == nil || c.NodeID == nil { return "" } return *c.NodeID } // GetParentID returns the ParentID field if it's non-nil, zero value otherwise. func (c *CommentDiscussion) GetParentID() int64 { if c == nil || c.ParentID == nil { return 0 } return *c.ParentID } // GetReactions returns the Reactions field. func (c *CommentDiscussion) GetReactions() *Reactions { if c == nil { return nil } return c.Reactions } // GetRepositoryURL returns the RepositoryURL field if it's non-nil, zero value otherwise. func (c *CommentDiscussion) GetRepositoryURL() string { if c == nil || c.RepositoryURL == nil { return "" } return *c.RepositoryURL } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (c *CommentDiscussion) GetUpdatedAt() Timestamp { if c == nil || c.UpdatedAt == nil { return Timestamp{} } return *c.UpdatedAt } // GetUser returns the User field. func (c *CommentDiscussion) GetUser() *User { if c == nil { return nil } return c.User } // 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() Timestamp { if c == nil || c.Date == nil { return Timestamp{} } 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 } // GetOrg returns the Org field. func (c *CommitCommentEvent) GetOrg() *Organization { if c == nil { return nil } return c.Org } // 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 } // GetCodeOfConductFile returns the CodeOfConductFile field. func (c *CommunityHealthFiles) GetCodeOfConductFile() *Metric { if c == nil { return nil } return c.CodeOfConductFile } // 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 } // GetContentReportsEnabled returns the ContentReportsEnabled field if it's non-nil, zero value otherwise. func (c *CommunityHealthMetrics) GetContentReportsEnabled() bool { if c == nil || c.ContentReportsEnabled == nil { return false } return *c.ContentReportsEnabled } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (c *CommunityHealthMetrics) GetDescription() string { if c == nil || c.Description == nil { return "" } return *c.Description } // GetDocumentation returns the Documentation field if it's non-nil, zero value otherwise. func (c *CommunityHealthMetrics) GetDocumentation() string { if c == nil || c.Documentation == nil { return "" } return *c.Documentation } // 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() Timestamp { if c == nil || c.UpdatedAt == nil { return Timestamp{} } 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 } // GetSeatBreakdown returns the SeatBreakdown field. func (c *CopilotOrganizationDetails) GetSeatBreakdown() *CopilotSeatBreakdown { if c == nil { return nil } return c.SeatBreakdown } // GetAssigningTeam returns the AssigningTeam field. func (c *CopilotSeatDetails) GetAssigningTeam() *Team { if c == nil { return nil } return c.AssigningTeam } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (c *CopilotSeatDetails) GetCreatedAt() Timestamp { if c == nil || c.CreatedAt == nil { return Timestamp{} } return *c.CreatedAt } // GetLastActivityAt returns the LastActivityAt field if it's non-nil, zero value otherwise. func (c *CopilotSeatDetails) GetLastActivityAt() Timestamp { if c == nil || c.LastActivityAt == nil { return Timestamp{} } return *c.LastActivityAt } // GetLastActivityEditor returns the LastActivityEditor field if it's non-nil, zero value otherwise. func (c *CopilotSeatDetails) GetLastActivityEditor() string { if c == nil || c.LastActivityEditor == nil { return "" } return *c.LastActivityEditor } // GetPendingCancellationDate returns the PendingCancellationDate field if it's non-nil, zero value otherwise. func (c *CopilotSeatDetails) GetPendingCancellationDate() string { if c == nil || c.PendingCancellationDate == nil { return "" } return *c.PendingCancellationDate } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (c *CopilotSeatDetails) GetUpdatedAt() Timestamp { if c == nil || c.UpdatedAt == nil { return Timestamp{} } return *c.UpdatedAt } // 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 } // GetClientIP returns the ClientIP field if it's non-nil, zero value otherwise. func (c *CreateCodespaceOptions) GetClientIP() string { if c == nil || c.ClientIP == nil { return "" } return *c.ClientIP } // GetDevcontainerPath returns the DevcontainerPath field if it's non-nil, zero value otherwise. func (c *CreateCodespaceOptions) GetDevcontainerPath() string { if c == nil || c.DevcontainerPath == nil { return "" } return *c.DevcontainerPath } // GetDisplayName returns the DisplayName field if it's non-nil, zero value otherwise. func (c *CreateCodespaceOptions) GetDisplayName() string { if c == nil || c.DisplayName == nil { return "" } return *c.DisplayName } // GetGeo returns the Geo field if it's non-nil, zero value otherwise. func (c *CreateCodespaceOptions) GetGeo() string { if c == nil || c.Geo == nil { return "" } return *c.Geo } // GetIdleTimeoutMinutes returns the IdleTimeoutMinutes field if it's non-nil, zero value otherwise. func (c *CreateCodespaceOptions) GetIdleTimeoutMinutes() int { if c == nil || c.IdleTimeoutMinutes == nil { return 0 } return *c.IdleTimeoutMinutes } // GetMachine returns the Machine field if it's non-nil, zero value otherwise. func (c *CreateCodespaceOptions) GetMachine() string { if c == nil || c.Machine == nil { return "" } return *c.Machine } // GetMultiRepoPermissionsOptOut returns the MultiRepoPermissionsOptOut field if it's non-nil, zero value otherwise. func (c *CreateCodespaceOptions) GetMultiRepoPermissionsOptOut() bool { if c == nil || c.MultiRepoPermissionsOptOut == nil { return false } return *c.MultiRepoPermissionsOptOut } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (c *CreateCodespaceOptions) GetRef() string { if c == nil || c.Ref == nil { return "" } return *c.Ref } // GetRetentionPeriodMinutes returns the RetentionPeriodMinutes field if it's non-nil, zero value otherwise. func (c *CreateCodespaceOptions) GetRetentionPeriodMinutes() int { if c == nil || c.RetentionPeriodMinutes == nil { return 0 } return *c.RetentionPeriodMinutes } // GetWorkingDirectory returns the WorkingDirectory field if it's non-nil, zero value otherwise. func (c *CreateCodespaceOptions) GetWorkingDirectory() string { if c == nil || c.WorkingDirectory == nil { return "" } return *c.WorkingDirectory } // GetAllowsPublicRepositories returns the AllowsPublicRepositories field if it's non-nil, zero value otherwise. func (c *CreateEnterpriseRunnerGroupRequest) 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 *CreateEnterpriseRunnerGroupRequest) GetName() string { if c == nil || c.Name == nil { return "" } return *c.Name } // GetRestrictedToWorkflows returns the RestrictedToWorkflows field if it's non-nil, zero value otherwise. func (c *CreateEnterpriseRunnerGroupRequest) GetRestrictedToWorkflows() bool { if c == nil || c.RestrictedToWorkflows == nil { return false } return *c.RestrictedToWorkflows } // GetVisibility returns the Visibility field if it's non-nil, zero value otherwise. func (c *CreateEnterpriseRunnerGroupRequest) GetVisibility() string { if c == nil || c.Visibility == nil { return "" } return *c.Visibility } // 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 } // GetOrg returns the Org field. func (c *CreateEvent) GetOrg() *Organization { if c == nil { return nil } return c.Org } // 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 } // GetBaseRole returns the BaseRole field if it's non-nil, zero value otherwise. func (c *CreateOrUpdateCustomRoleOptions) GetBaseRole() string { if c == nil || c.BaseRole == nil { return "" } return *c.BaseRole } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (c *CreateOrUpdateCustomRoleOptions) GetDescription() string { if c == nil || c.Description == nil { return "" } return *c.Description } // GetName returns the Name field if it's non-nil, zero value otherwise. func (c *CreateOrUpdateCustomRoleOptions) GetName() string { if c == nil || c.Name == nil { return "" } return *c.Name } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (c *CreateProtectedChanges) GetFrom() bool { if c == nil || c.From == nil { return false } return *c.From } // 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 } // GetRestrictedToWorkflows returns the RestrictedToWorkflows field if it's non-nil, zero value otherwise. func (c *CreateRunnerGroupRequest) GetRestrictedToWorkflows() bool { if c == nil || c.RestrictedToWorkflows == nil { return false } return *c.RestrictedToWorkflows } // 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 } // GetCanAdminsBypass returns the CanAdminsBypass field if it's non-nil, zero value otherwise. func (c *CreateUpdateEnvironment) GetCanAdminsBypass() bool { if c == nil || c.CanAdminsBypass == nil { return false } return *c.CanAdminsBypass } // GetDeploymentBranchPolicy returns the DeploymentBranchPolicy field. func (c *CreateUpdateEnvironment) GetDeploymentBranchPolicy() *BranchPolicy { if c == nil { return nil } return c.DeploymentBranchPolicy } // GetPreventSelfReview returns the PreventSelfReview field if it's non-nil, zero value otherwise. func (c *CreateUpdateEnvironment) GetPreventSelfReview() bool { if c == nil || c.PreventSelfReview == nil { return false } return *c.PreventSelfReview } // 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 } // GetRepositoryID returns the RepositoryID field if it's non-nil, zero value otherwise. func (c *CreateUpdateRequiredWorkflowOptions) GetRepositoryID() int64 { if c == nil || c.RepositoryID == nil { return 0 } return *c.RepositoryID } // GetScope returns the Scope field if it's non-nil, zero value otherwise. func (c *CreateUpdateRequiredWorkflowOptions) GetScope() string { if c == nil || c.Scope == nil { return "" } return *c.Scope } // GetSelectedRepositoryIDs returns the SelectedRepositoryIDs field. func (c *CreateUpdateRequiredWorkflowOptions) GetSelectedRepositoryIDs() *SelectedRepoIDs { if c == nil { return nil } return c.SelectedRepositoryIDs } // GetWorkflowFilePath returns the WorkflowFilePath field if it's non-nil, zero value otherwise. func (c *CreateUpdateRequiredWorkflowOptions) GetWorkflowFilePath() string { if c == nil || c.WorkflowFilePath == nil { return "" } return *c.WorkflowFilePath } // 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 } // GetEmail returns the Email field if it's non-nil, zero value otherwise. func (c *CreateUserRequest) GetEmail() string { if c == nil || c.Email == nil { return "" } return *c.Email } // GetSuspended returns the Suspended field if it's non-nil, zero value otherwise. func (c *CreateUserRequest) GetSuspended() bool { if c == nil || c.Suspended == nil { return false } return *c.Suspended } // GetCreated returns the Created field if it's non-nil, zero value otherwise. func (c *CreationInfo) GetCreated() Timestamp { if c == nil || c.Created == nil { return Timestamp{} } return *c.Created } // GetAuthorizedCredentialExpiresAt returns the AuthorizedCredentialExpiresAt field if it's non-nil, zero value otherwise. func (c *CredentialAuthorization) GetAuthorizedCredentialExpiresAt() Timestamp { if c == nil || c.AuthorizedCredentialExpiresAt == nil { return Timestamp{} } return *c.AuthorizedCredentialExpiresAt } // GetAuthorizedCredentialID returns the AuthorizedCredentialID field if it's non-nil, zero value otherwise. func (c *CredentialAuthorization) GetAuthorizedCredentialID() int64 { if c == nil || c.AuthorizedCredentialID == nil { return 0 } return *c.AuthorizedCredentialID } // GetAuthorizedCredentialNote returns the AuthorizedCredentialNote field if it's non-nil, zero value otherwise. func (c *CredentialAuthorization) GetAuthorizedCredentialNote() string { if c == nil || c.AuthorizedCredentialNote == nil { return "" } return *c.AuthorizedCredentialNote } // GetAuthorizedCredentialTitle returns the AuthorizedCredentialTitle field if it's non-nil, zero value otherwise. func (c *CredentialAuthorization) GetAuthorizedCredentialTitle() string { if c == nil || c.AuthorizedCredentialTitle == nil { return "" } return *c.AuthorizedCredentialTitle } // GetCredentialAccessedAt returns the CredentialAccessedAt field if it's non-nil, zero value otherwise. func (c *CredentialAuthorization) GetCredentialAccessedAt() Timestamp { if c == nil || c.CredentialAccessedAt == nil { return Timestamp{} } return *c.CredentialAccessedAt } // GetCredentialAuthorizedAt returns the CredentialAuthorizedAt field if it's non-nil, zero value otherwise. func (c *CredentialAuthorization) GetCredentialAuthorizedAt() Timestamp { if c == nil || c.CredentialAuthorizedAt == nil { return Timestamp{} } return *c.CredentialAuthorizedAt } // GetCredentialID returns the CredentialID field if it's non-nil, zero value otherwise. func (c *CredentialAuthorization) GetCredentialID() int64 { if c == nil || c.CredentialID == nil { return 0 } return *c.CredentialID } // GetCredentialType returns the CredentialType field if it's non-nil, zero value otherwise. func (c *CredentialAuthorization) GetCredentialType() string { if c == nil || c.CredentialType == nil { return "" } return *c.CredentialType } // GetFingerprint returns the Fingerprint field if it's non-nil, zero value otherwise. func (c *CredentialAuthorization) GetFingerprint() string { if c == nil || c.Fingerprint == nil { return "" } return *c.Fingerprint } // GetLogin returns the Login field if it's non-nil, zero value otherwise. func (c *CredentialAuthorization) GetLogin() string { if c == nil || c.Login == nil { return "" } return *c.Login } // GetTokenLastEight returns the TokenLastEight field if it's non-nil, zero value otherwise. func (c *CredentialAuthorization) GetTokenLastEight() string { if c == nil || c.TokenLastEight == nil { return "" } return *c.TokenLastEight } // GetType returns the Type field if it's non-nil, zero value otherwise. func (c *Credit) GetType() string { if c == nil || c.Type == nil { return "" } return *c.Type } // GetUser returns the User field. func (c *Credit) GetUser() *User { if c == nil { return nil } return c.User } // GetApp returns the App field. func (c *CustomDeploymentProtectionRule) GetApp() *CustomDeploymentProtectionRuleApp { if c == nil { return nil } return c.App } // GetEnabled returns the Enabled field if it's non-nil, zero value otherwise. func (c *CustomDeploymentProtectionRule) GetEnabled() bool { if c == nil || c.Enabled == nil { return false } return *c.Enabled } // GetID returns the ID field if it's non-nil, zero value otherwise. func (c *CustomDeploymentProtectionRule) 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 *CustomDeploymentProtectionRule) GetNodeID() string { if c == nil || c.NodeID == nil { return "" } return *c.NodeID } // GetID returns the ID field if it's non-nil, zero value otherwise. func (c *CustomDeploymentProtectionRuleApp) GetID() int64 { if c == nil || c.ID == nil { return 0 } return *c.ID } // GetIntegrationURL returns the IntegrationURL field if it's non-nil, zero value otherwise. func (c *CustomDeploymentProtectionRuleApp) GetIntegrationURL() string { if c == nil || c.IntegrationURL == nil { return "" } return *c.IntegrationURL } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (c *CustomDeploymentProtectionRuleApp) GetNodeID() string { if c == nil || c.NodeID == nil { return "" } return *c.NodeID } // GetSlug returns the Slug field if it's non-nil, zero value otherwise. func (c *CustomDeploymentProtectionRuleApp) GetSlug() string { if c == nil || c.Slug == nil { return "" } return *c.Slug } // GetIntegrationID returns the IntegrationID field if it's non-nil, zero value otherwise. func (c *CustomDeploymentProtectionRuleRequest) GetIntegrationID() int64 { if c == nil || c.IntegrationID == nil { return 0 } return *c.IntegrationID } // GetDefaultValue returns the DefaultValue field if it's non-nil, zero value otherwise. func (c *CustomProperty) GetDefaultValue() string { if c == nil || c.DefaultValue == nil { return "" } return *c.DefaultValue } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (c *CustomProperty) GetDescription() string { if c == nil || c.Description == nil { return "" } return *c.Description } // GetPropertyName returns the PropertyName field if it's non-nil, zero value otherwise. func (c *CustomProperty) GetPropertyName() string { if c == nil || c.PropertyName == nil { return "" } return *c.PropertyName } // GetRequired returns the Required field if it's non-nil, zero value otherwise. func (c *CustomProperty) GetRequired() bool { if c == nil || c.Required == nil { return false } return *c.Required } // GetValue returns the Value field if it's non-nil, zero value otherwise. func (c *CustomPropertyValue) GetValue() string { if c == nil || c.Value == nil { return "" } return *c.Value } // GetBaseRole returns the BaseRole field if it's non-nil, zero value otherwise. func (c *CustomRepoRoles) GetBaseRole() string { if c == nil || c.BaseRole == nil { return "" } return *c.BaseRole } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (c *CustomRepoRoles) GetDescription() string { if c == nil || c.Description == nil { return "" } return *c.Description } // GetID returns the ID field if it's non-nil, zero value otherwise. func (c *CustomRepoRoles) 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 *CustomRepoRoles) GetName() string { if c == nil || c.Name == nil { return "" } return *c.Name } // GetQuerySuite returns the QuerySuite field if it's non-nil, zero value otherwise. func (d *DefaultSetupConfiguration) GetQuerySuite() string { if d == nil || d.QuerySuite == nil { return "" } return *d.QuerySuite } // GetState returns the State field if it's non-nil, zero value otherwise. func (d *DefaultSetupConfiguration) GetState() string { if d == nil || d.State == nil { return "" } return *d.State } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (d *DefaultSetupConfiguration) GetUpdatedAt() Timestamp { if d == nil || d.UpdatedAt == nil { return Timestamp{} } return *d.UpdatedAt } // GetCanApprovePullRequestReviews returns the CanApprovePullRequestReviews field if it's non-nil, zero value otherwise. func (d *DefaultWorkflowPermissionEnterprise) GetCanApprovePullRequestReviews() bool { if d == nil || d.CanApprovePullRequestReviews == nil { return false } return *d.CanApprovePullRequestReviews } // GetDefaultWorkflowPermissions returns the DefaultWorkflowPermissions field if it's non-nil, zero value otherwise. func (d *DefaultWorkflowPermissionEnterprise) GetDefaultWorkflowPermissions() string { if d == nil || d.DefaultWorkflowPermissions == nil { return "" } return *d.DefaultWorkflowPermissions } // GetCanApprovePullRequestReviews returns the CanApprovePullRequestReviews field if it's non-nil, zero value otherwise. func (d *DefaultWorkflowPermissionOrganization) GetCanApprovePullRequestReviews() bool { if d == nil || d.CanApprovePullRequestReviews == nil { return false } return *d.CanApprovePullRequestReviews } // GetDefaultWorkflowPermissions returns the DefaultWorkflowPermissions field if it's non-nil, zero value otherwise. func (d *DefaultWorkflowPermissionOrganization) GetDefaultWorkflowPermissions() string { if d == nil || d.DefaultWorkflowPermissions == nil { return "" } return *d.DefaultWorkflowPermissions } // GetCanApprovePullRequestReviews returns the CanApprovePullRequestReviews field if it's non-nil, zero value otherwise. func (d *DefaultWorkflowPermissionRepository) GetCanApprovePullRequestReviews() bool { if d == nil || d.CanApprovePullRequestReviews == nil { return false } return *d.CanApprovePullRequestReviews } // GetDefaultWorkflowPermissions returns the DefaultWorkflowPermissions field if it's non-nil, zero value otherwise. func (d *DefaultWorkflowPermissionRepository) GetDefaultWorkflowPermissions() string { if d == nil || d.DefaultWorkflowPermissions == nil { return "" } return *d.DefaultWorkflowPermissions } // GetConfirmDeleteURL returns the ConfirmDeleteURL field if it's non-nil, zero value otherwise. func (d *DeleteAnalysis) GetConfirmDeleteURL() string { if d == nil || d.ConfirmDeleteURL == nil { return "" } return *d.ConfirmDeleteURL } // GetNextAnalysisURL returns the NextAnalysisURL field if it's non-nil, zero value otherwise. func (d *DeleteAnalysis) GetNextAnalysisURL() string { if d == nil || d.NextAnalysisURL == nil { return "" } return *d.NextAnalysisURL } // GetInstallation returns the Installation field. func (d *DeleteEvent) GetInstallation() *Installation { if d == nil { return nil } return d.Installation } // GetOrg returns the Org field. func (d *DeleteEvent) GetOrg() *Organization { if d == nil { return nil } return d.Org } // 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 } // GetAutoDismissedAt returns the AutoDismissedAt field if it's non-nil, zero value otherwise. func (d *DependabotAlert) GetAutoDismissedAt() Timestamp { if d == nil || d.AutoDismissedAt == nil { return Timestamp{} } return *d.AutoDismissedAt } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (d *DependabotAlert) GetCreatedAt() Timestamp { if d == nil || d.CreatedAt == nil { return Timestamp{} } return *d.CreatedAt } // GetDependency returns the Dependency field. func (d *DependabotAlert) GetDependency() *Dependency { if d == nil { return nil } return d.Dependency } // GetDismissedAt returns the DismissedAt field if it's non-nil, zero value otherwise. func (d *DependabotAlert) GetDismissedAt() Timestamp { if d == nil || d.DismissedAt == nil { return Timestamp{} } return *d.DismissedAt } // GetDismissedBy returns the DismissedBy field. func (d *DependabotAlert) GetDismissedBy() *User { if d == nil { return nil } return d.DismissedBy } // GetDismissedComment returns the DismissedComment field if it's non-nil, zero value otherwise. func (d *DependabotAlert) GetDismissedComment() string { if d == nil || d.DismissedComment == nil { return "" } return *d.DismissedComment } // GetDismissedReason returns the DismissedReason field if it's non-nil, zero value otherwise. func (d *DependabotAlert) GetDismissedReason() string { if d == nil || d.DismissedReason == nil { return "" } return *d.DismissedReason } // GetFixedAt returns the FixedAt field if it's non-nil, zero value otherwise. func (d *DependabotAlert) GetFixedAt() Timestamp { if d == nil || d.FixedAt == nil { return Timestamp{} } return *d.FixedAt } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (d *DependabotAlert) GetHTMLURL() string { if d == nil || d.HTMLURL == nil { return "" } return *d.HTMLURL } // GetNumber returns the Number field if it's non-nil, zero value otherwise. func (d *DependabotAlert) GetNumber() int { if d == nil || d.Number == nil { return 0 } return *d.Number } // GetRepository returns the Repository field. func (d *DependabotAlert) GetRepository() *Repository { if d == nil { return nil } return d.Repository } // GetSecurityAdvisory returns the SecurityAdvisory field. func (d *DependabotAlert) GetSecurityAdvisory() *DependabotSecurityAdvisory { if d == nil { return nil } return d.SecurityAdvisory } // GetSecurityVulnerability returns the SecurityVulnerability field. func (d *DependabotAlert) GetSecurityVulnerability() *AdvisoryVulnerability { if d == nil { return nil } return d.SecurityVulnerability } // GetState returns the State field if it's non-nil, zero value otherwise. func (d *DependabotAlert) GetState() string { if d == nil || d.State == nil { return "" } return *d.State } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (d *DependabotAlert) 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 *DependabotAlert) GetURL() string { if d == nil || d.URL == nil { return "" } return *d.URL } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (d *DependabotAlertEvent) GetAction() string { if d == nil || d.Action == nil { return "" } return *d.Action } // GetAlert returns the Alert field. func (d *DependabotAlertEvent) GetAlert() *DependabotAlert { if d == nil { return nil } return d.Alert } // GetEnterprise returns the Enterprise field. func (d *DependabotAlertEvent) GetEnterprise() *Enterprise { if d == nil { return nil } return d.Enterprise } // GetInstallation returns the Installation field. func (d *DependabotAlertEvent) GetInstallation() *Installation { if d == nil { return nil } return d.Installation } // GetOrganization returns the Organization field. func (d *DependabotAlertEvent) GetOrganization() *Organization { if d == nil { return nil } return d.Organization } // GetRepo returns the Repo field. func (d *DependabotAlertEvent) GetRepo() *Repository { if d == nil { return nil } return d.Repo } // GetSender returns the Sender field. func (d *DependabotAlertEvent) GetSender() *User { if d == nil { return nil } return d.Sender } // GetDismissedComment returns the DismissedComment field if it's non-nil, zero value otherwise. func (d *DependabotAlertState) GetDismissedComment() string { if d == nil || d.DismissedComment == nil { return "" } return *d.DismissedComment } // GetDismissedReason returns the DismissedReason field if it's non-nil, zero value otherwise. func (d *DependabotAlertState) GetDismissedReason() string { if d == nil || d.DismissedReason == nil { return "" } return *d.DismissedReason } // GetCVEID returns the CVEID field if it's non-nil, zero value otherwise. func (d *DependabotSecurityAdvisory) GetCVEID() string { if d == nil || d.CVEID == nil { return "" } return *d.CVEID } // GetCVSS returns the CVSS field. func (d *DependabotSecurityAdvisory) GetCVSS() *AdvisoryCVSS { if d == nil { return nil } return d.CVSS } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (d *DependabotSecurityAdvisory) GetDescription() string { if d == nil || d.Description == nil { return "" } return *d.Description } // GetGHSAID returns the GHSAID field if it's non-nil, zero value otherwise. func (d *DependabotSecurityAdvisory) GetGHSAID() string { if d == nil || d.GHSAID == nil { return "" } return *d.GHSAID } // GetPublishedAt returns the PublishedAt field if it's non-nil, zero value otherwise. func (d *DependabotSecurityAdvisory) GetPublishedAt() Timestamp { if d == nil || d.PublishedAt == nil { return Timestamp{} } return *d.PublishedAt } // GetSeverity returns the Severity field if it's non-nil, zero value otherwise. func (d *DependabotSecurityAdvisory) GetSeverity() string { if d == nil || d.Severity == nil { return "" } return *d.Severity } // GetSummary returns the Summary field if it's non-nil, zero value otherwise. func (d *DependabotSecurityAdvisory) GetSummary() string { if d == nil || d.Summary == nil { return "" } return *d.Summary } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (d *DependabotSecurityAdvisory) GetUpdatedAt() Timestamp { if d == nil || d.UpdatedAt == nil { return Timestamp{} } return *d.UpdatedAt } // GetWithdrawnAt returns the WithdrawnAt field if it's non-nil, zero value otherwise. func (d *DependabotSecurityAdvisory) GetWithdrawnAt() Timestamp { if d == nil || d.WithdrawnAt == nil { return Timestamp{} } return *d.WithdrawnAt } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (d *DependabotSecurityUpdates) GetStatus() string { if d == nil || d.Status == nil { return "" } return *d.Status } // GetManifestPath returns the ManifestPath field if it's non-nil, zero value otherwise. func (d *Dependency) GetManifestPath() string { if d == nil || d.ManifestPath == nil { return "" } return *d.ManifestPath } // GetPackage returns the Package field. func (d *Dependency) GetPackage() *VulnerabilityPackage { if d == nil { return nil } return d.Package } // GetScope returns the Scope field if it's non-nil, zero value otherwise. func (d *Dependency) GetScope() string { if d == nil || d.Scope == nil { return "" } return *d.Scope } // 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 } // GetInstallation returns the Installation field. func (d *DeployKeyEvent) GetInstallation() *Installation { if d == nil { return nil } return d.Installation } // GetKey returns the Key field. func (d *DeployKeyEvent) GetKey() *Key { if d == nil { return nil } return d.Key } // GetOrganization returns the Organization field. func (d *DeployKeyEvent) GetOrganization() *Organization { if d == nil { return nil } return d.Organization } // GetRepo returns the Repo field. func (d *DeployKeyEvent) GetRepo() *Repository { if d == nil { return nil } return d.Repo } // GetSender returns the Sender field. func (d *DeployKeyEvent) GetSender() *User { if d == nil { return nil } return d.Sender } // 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 } // GetID returns the ID field if it's non-nil, zero value otherwise. func (d *DeploymentBranchPolicy) GetID() int64 { if d == nil || d.ID == nil { return 0 } return *d.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (d *DeploymentBranchPolicy) GetName() string { if d == nil || d.Name == nil { return "" } return *d.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (d *DeploymentBranchPolicy) GetNodeID() string { if d == nil || d.NodeID == nil { return "" } return *d.NodeID } // GetType returns the Type field if it's non-nil, zero value otherwise. func (d *DeploymentBranchPolicy) GetType() string { if d == nil || d.Type == nil { return "" } return *d.Type } // GetName returns the Name field if it's non-nil, zero value otherwise. func (d *DeploymentBranchPolicyRequest) GetName() string { if d == nil || d.Name == nil { return "" } return *d.Name } // GetType returns the Type field if it's non-nil, zero value otherwise. func (d *DeploymentBranchPolicyRequest) GetType() string { if d == nil || d.Type == nil { return "" } return *d.Type } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (d *DeploymentBranchPolicyResponse) GetTotalCount() int { if d == nil || d.TotalCount == nil { return 0 } return *d.TotalCount } // 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 } // GetOrg returns the Org field. func (d *DeploymentEvent) GetOrg() *Organization { if d == nil { return nil } return d.Org } // 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 } // GetWorkflow returns the Workflow field. func (d *DeploymentEvent) GetWorkflow() *Workflow { if d == nil { return nil } return d.Workflow } // GetWorkflowRun returns the WorkflowRun field. func (d *DeploymentEvent) GetWorkflowRun() *WorkflowRun { if d == nil { return nil } return d.WorkflowRun } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (d *DeploymentProtectionRuleEvent) GetAction() string { if d == nil || d.Action == nil { return "" } return *d.Action } // GetDeployment returns the Deployment field. func (d *DeploymentProtectionRuleEvent) GetDeployment() *Deployment { if d == nil { return nil } return d.Deployment } // GetDeploymentCallbackURL returns the DeploymentCallbackURL field if it's non-nil, zero value otherwise. func (d *DeploymentProtectionRuleEvent) GetDeploymentCallbackURL() string { if d == nil || d.DeploymentCallbackURL == nil { return "" } return *d.DeploymentCallbackURL } // GetEnvironment returns the Environment field if it's non-nil, zero value otherwise. func (d *DeploymentProtectionRuleEvent) GetEnvironment() string { if d == nil || d.Environment == nil { return "" } return *d.Environment } // GetEvent returns the Event field if it's non-nil, zero value otherwise. func (d *DeploymentProtectionRuleEvent) GetEvent() string { if d == nil || d.Event == nil { return "" } return *d.Event } // GetInstallation returns the Installation field. func (d *DeploymentProtectionRuleEvent) GetInstallation() *Installation { if d == nil { return nil } return d.Installation } // GetOrganization returns the Organization field. func (d *DeploymentProtectionRuleEvent) GetOrganization() *Organization { if d == nil { return nil } return d.Organization } // GetRepo returns the Repo field. func (d *DeploymentProtectionRuleEvent) GetRepo() *Repository { if d == nil { return nil } return d.Repo } // GetSender returns the Sender field. func (d *DeploymentProtectionRuleEvent) 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 } // GetOrg returns the Org field. func (d *DeploymentStatusEvent) GetOrg() *Organization { if d == nil { return nil } return d.Org } // 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 } // GetActiveLockReason returns the ActiveLockReason field if it's non-nil, zero value otherwise. func (d *Discussion) GetActiveLockReason() string { if d == nil || d.ActiveLockReason == nil { return "" } return *d.ActiveLockReason } // GetAnswerChosenAt returns the AnswerChosenAt field if it's non-nil, zero value otherwise. func (d *Discussion) GetAnswerChosenAt() Timestamp { if d == nil || d.AnswerChosenAt == nil { return Timestamp{} } return *d.AnswerChosenAt } // GetAnswerChosenBy returns the AnswerChosenBy field if it's non-nil, zero value otherwise. func (d *Discussion) GetAnswerChosenBy() string { if d == nil || d.AnswerChosenBy == nil { return "" } return *d.AnswerChosenBy } // GetAnswerHTMLURL returns the AnswerHTMLURL field if it's non-nil, zero value otherwise. func (d *Discussion) GetAnswerHTMLURL() string { if d == nil || d.AnswerHTMLURL == nil { return "" } return *d.AnswerHTMLURL } // GetAuthorAssociation returns the AuthorAssociation field if it's non-nil, zero value otherwise. func (d *Discussion) GetAuthorAssociation() string { if d == nil || d.AuthorAssociation == nil { return "" } return *d.AuthorAssociation } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (d *Discussion) GetBody() string { if d == nil || d.Body == nil { return "" } return *d.Body } // GetComments returns the Comments field if it's non-nil, zero value otherwise. func (d *Discussion) GetComments() int { if d == nil || d.Comments == nil { return 0 } return *d.Comments } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (d *Discussion) GetCreatedAt() Timestamp { if d == nil || d.CreatedAt == nil { return Timestamp{} } return *d.CreatedAt } // GetDiscussionCategory returns the DiscussionCategory field. func (d *Discussion) GetDiscussionCategory() *DiscussionCategory { if d == nil { return nil } return d.DiscussionCategory } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (d *Discussion) GetHTMLURL() string { if d == nil || d.HTMLURL == nil { return "" } return *d.HTMLURL } // GetID returns the ID field if it's non-nil, zero value otherwise. func (d *Discussion) GetID() int64 { if d == nil || d.ID == nil { return 0 } return *d.ID } // GetLocked returns the Locked field if it's non-nil, zero value otherwise. func (d *Discussion) GetLocked() bool { if d == nil || d.Locked == nil { return false } return *d.Locked } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (d *Discussion) 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 *Discussion) GetNumber() int { if d == nil || d.Number == nil { return 0 } return *d.Number } // GetRepositoryURL returns the RepositoryURL field if it's non-nil, zero value otherwise. func (d *Discussion) 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 *Discussion) GetState() string { if d == nil || d.State == nil { return "" } return *d.State } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (d *Discussion) GetTitle() string { if d == nil || d.Title == nil { return "" } return *d.Title } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (d *Discussion) GetUpdatedAt() Timestamp { if d == nil || d.UpdatedAt == nil { return Timestamp{} } return *d.UpdatedAt } // GetUser returns the User field. func (d *Discussion) GetUser() *User { if d == nil { return nil } return d.User } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (d *DiscussionCategory) GetCreatedAt() Timestamp { if d == nil || d.CreatedAt == nil { return Timestamp{} } return *d.CreatedAt } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (d *DiscussionCategory) GetDescription() string { if d == nil || d.Description == nil { return "" } return *d.Description } // GetEmoji returns the Emoji field if it's non-nil, zero value otherwise. func (d *DiscussionCategory) GetEmoji() string { if d == nil || d.Emoji == nil { return "" } return *d.Emoji } // GetID returns the ID field if it's non-nil, zero value otherwise. func (d *DiscussionCategory) GetID() int64 { if d == nil || d.ID == nil { return 0 } return *d.ID } // GetIsAnswerable returns the IsAnswerable field if it's non-nil, zero value otherwise. func (d *DiscussionCategory) GetIsAnswerable() bool { if d == nil || d.IsAnswerable == nil { return false } return *d.IsAnswerable } // GetName returns the Name field if it's non-nil, zero value otherwise. func (d *DiscussionCategory) GetName() string { if d == nil || d.Name == nil { return "" } return *d.Name } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (d *DiscussionCategory) GetNodeID() string { if d == nil || d.NodeID == nil { return "" } return *d.NodeID } // GetRepositoryID returns the RepositoryID field if it's non-nil, zero value otherwise. func (d *DiscussionCategory) GetRepositoryID() int64 { if d == nil || d.RepositoryID == nil { return 0 } return *d.RepositoryID } // GetSlug returns the Slug field if it's non-nil, zero value otherwise. func (d *DiscussionCategory) GetSlug() string { if d == nil || d.Slug == nil { return "" } return *d.Slug } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (d *DiscussionCategory) GetUpdatedAt() Timestamp { if d == nil || d.UpdatedAt == nil { return Timestamp{} } return *d.UpdatedAt } // 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 } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (d *DiscussionCommentEvent) GetAction() string { if d == nil || d.Action == nil { return "" } return *d.Action } // GetComment returns the Comment field. func (d *DiscussionCommentEvent) GetComment() *CommentDiscussion { if d == nil { return nil } return d.Comment } // GetDiscussion returns the Discussion field. func (d *DiscussionCommentEvent) GetDiscussion() *Discussion { if d == nil { return nil } return d.Discussion } // GetInstallation returns the Installation field. func (d *DiscussionCommentEvent) GetInstallation() *Installation { if d == nil { return nil } return d.Installation } // GetOrg returns the Org field. func (d *DiscussionCommentEvent) GetOrg() *Organization { if d == nil { return nil } return d.Org } // GetRepo returns the Repo field. func (d *DiscussionCommentEvent) GetRepo() *Repository { if d == nil { return nil } return d.Repo } // GetSender returns the Sender field. func (d *DiscussionCommentEvent) 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 *DiscussionEvent) GetAction() string { if d == nil || d.Action == nil { return "" } return *d.Action } // GetDiscussion returns the Discussion field. func (d *DiscussionEvent) GetDiscussion() *Discussion { if d == nil { return nil } return d.Discussion } // GetInstallation returns the Installation field. func (d *DiscussionEvent) GetInstallation() *Installation { if d == nil { return nil } return d.Installation } // GetOrg returns the Org field. func (d *DiscussionEvent) GetOrg() *Organization { if d == nil { return nil } return d.Org } // GetRepo returns the Repo field. func (d *DiscussionEvent) GetRepo() *Repository { if d == nil { return nil } return d.Repo } // GetSender returns the Sender field. func (d *DiscussionEvent) GetSender() *User { if d == nil { return nil } return d.Sender } // GetApps returns the Apps field if it's non-nil, zero value otherwise. func (d *DismissalRestrictionsRequest) GetApps() []string { if d == nil || d.Apps == nil { return nil } return *d.Apps } // 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 } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (d *DismissStaleReviewsOnPushChanges) GetFrom() bool { if d == nil || d.From == nil { return false } return *d.From } // 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 } // GetDefaultBranch returns the DefaultBranch field. func (e *EditChange) GetDefaultBranch() *EditDefaultBranch { if e == nil { return nil } return e.DefaultBranch } // GetOwner returns the Owner field. func (e *EditChange) GetOwner() *EditOwner { if e == nil { return nil } return e.Owner } // GetRepo returns the Repo field. func (e *EditChange) GetRepo() *EditRepo { if e == nil { return nil } return e.Repo } // GetTitle returns the Title field. func (e *EditChange) GetTitle() *EditTitle { if e == nil { return nil } return e.Title } // GetTopics returns the Topics field. func (e *EditChange) GetTopics() *EditTopics { if e == nil { return nil } return e.Topics } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (e *EditDefaultBranch) GetFrom() string { if e == nil || e.From == nil { return "" } return *e.From } // GetOwnerInfo returns the OwnerInfo field. func (e *EditOwner) GetOwnerInfo() *OwnerInfo { if e == nil { return nil } return e.OwnerInfo } // 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 } // GetName returns the Name field. func (e *EditRepo) GetName() *RepoName { if e == nil { return nil } return e.Name } // 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 } // GetAllowsPublicRepositories returns the AllowsPublicRepositories field if it's non-nil, zero value otherwise. func (e *EnterpriseRunnerGroup) GetAllowsPublicRepositories() bool { if e == nil || e.AllowsPublicRepositories == nil { return false } return *e.AllowsPublicRepositories } // GetDefault returns the Default field if it's non-nil, zero value otherwise. func (e *EnterpriseRunnerGroup) GetDefault() bool { if e == nil || e.Default == nil { return false } return *e.Default } // GetID returns the ID field if it's non-nil, zero value otherwise. func (e *EnterpriseRunnerGroup) GetID() int64 { if e == nil || e.ID == nil { return 0 } return *e.ID } // GetInherited returns the Inherited field if it's non-nil, zero value otherwise. func (e *EnterpriseRunnerGroup) GetInherited() bool { if e == nil || e.Inherited == nil { return false } return *e.Inherited } // GetName returns the Name field if it's non-nil, zero value otherwise. func (e *EnterpriseRunnerGroup) GetName() string { if e == nil || e.Name == nil { return "" } return *e.Name } // GetRestrictedToWorkflows returns the RestrictedToWorkflows field if it's non-nil, zero value otherwise. func (e *EnterpriseRunnerGroup) GetRestrictedToWorkflows() bool { if e == nil || e.RestrictedToWorkflows == nil { return false } return *e.RestrictedToWorkflows } // GetRunnersURL returns the RunnersURL field if it's non-nil, zero value otherwise. func (e *EnterpriseRunnerGroup) GetRunnersURL() string { if e == nil || e.RunnersURL == nil { return "" } return *e.RunnersURL } // GetSelectedOrganizationsURL returns the SelectedOrganizationsURL field if it's non-nil, zero value otherwise. func (e *EnterpriseRunnerGroup) GetSelectedOrganizationsURL() string { if e == nil || e.SelectedOrganizationsURL == nil { return "" } return *e.SelectedOrganizationsURL } // GetVisibility returns the Visibility field if it's non-nil, zero value otherwise. func (e *EnterpriseRunnerGroup) GetVisibility() string { if e == nil || e.Visibility == nil { return "" } return *e.Visibility } // GetWorkflowRestrictionsReadOnly returns the WorkflowRestrictionsReadOnly field if it's non-nil, zero value otherwise. func (e *EnterpriseRunnerGroup) GetWorkflowRestrictionsReadOnly() bool { if e == nil || e.WorkflowRestrictionsReadOnly == nil { return false } return *e.WorkflowRestrictionsReadOnly } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (e *EnterpriseRunnerGroups) GetTotalCount() int { if e == nil || e.TotalCount == nil { return 0 } return *e.TotalCount } // GetAdvancedSecurityEnabledForNewRepositories returns the AdvancedSecurityEnabledForNewRepositories field if it's non-nil, zero value otherwise. func (e *EnterpriseSecurityAnalysisSettings) GetAdvancedSecurityEnabledForNewRepositories() bool { if e == nil || e.AdvancedSecurityEnabledForNewRepositories == nil { return false } return *e.AdvancedSecurityEnabledForNewRepositories } // GetSecretScanningEnabledForNewRepositories returns the SecretScanningEnabledForNewRepositories field if it's non-nil, zero value otherwise. func (e *EnterpriseSecurityAnalysisSettings) GetSecretScanningEnabledForNewRepositories() bool { if e == nil || e.SecretScanningEnabledForNewRepositories == nil { return false } return *e.SecretScanningEnabledForNewRepositories } // GetSecretScanningPushProtectionCustomLink returns the SecretScanningPushProtectionCustomLink field if it's non-nil, zero value otherwise. func (e *EnterpriseSecurityAnalysisSettings) GetSecretScanningPushProtectionCustomLink() string { if e == nil || e.SecretScanningPushProtectionCustomLink == nil { return "" } return *e.SecretScanningPushProtectionCustomLink } // GetSecretScanningPushProtectionEnabledForNewRepositories returns the SecretScanningPushProtectionEnabledForNewRepositories field if it's non-nil, zero value otherwise. func (e *EnterpriseSecurityAnalysisSettings) GetSecretScanningPushProtectionEnabledForNewRepositories() bool { if e == nil || e.SecretScanningPushProtectionEnabledForNewRepositories == nil { return false } return *e.SecretScanningPushProtectionEnabledForNewRepositories } // GetSecretScanningValidityChecksEnabled returns the SecretScanningValidityChecksEnabled field if it's non-nil, zero value otherwise. func (e *EnterpriseSecurityAnalysisSettings) GetSecretScanningValidityChecksEnabled() bool { if e == nil || e.SecretScanningValidityChecksEnabled == nil { return false } return *e.SecretScanningValidityChecksEnabled } // GetCanAdminsBypass returns the CanAdminsBypass field if it's non-nil, zero value otherwise. func (e *Environment) GetCanAdminsBypass() bool { if e == nil || e.CanAdminsBypass == nil { return false } return *e.CanAdminsBypass } // 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() Timestamp { if e == nil || e.CreatedAt == nil { return Timestamp{} } 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 } // GetGroupID returns the GroupID field if it's non-nil, zero value otherwise. func (e *ExternalGroup) GetGroupID() int64 { if e == nil || e.GroupID == nil { return 0 } return *e.GroupID } // GetGroupName returns the GroupName field if it's non-nil, zero value otherwise. func (e *ExternalGroup) GetGroupName() string { if e == nil || e.GroupName == nil { return "" } return *e.GroupName } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (e *ExternalGroup) GetUpdatedAt() Timestamp { if e == nil || e.UpdatedAt == nil { return Timestamp{} } return *e.UpdatedAt } // GetMemberEmail returns the MemberEmail field if it's non-nil, zero value otherwise. func (e *ExternalGroupMember) GetMemberEmail() string { if e == nil || e.MemberEmail == nil { return "" } return *e.MemberEmail } // GetMemberID returns the MemberID field if it's non-nil, zero value otherwise. func (e *ExternalGroupMember) GetMemberID() int64 { if e == nil || e.MemberID == nil { return 0 } return *e.MemberID } // GetMemberLogin returns the MemberLogin field if it's non-nil, zero value otherwise. func (e *ExternalGroupMember) GetMemberLogin() string { if e == nil || e.MemberLogin == nil { return "" } return *e.MemberLogin } // GetMemberName returns the MemberName field if it's non-nil, zero value otherwise. func (e *ExternalGroupMember) GetMemberName() string { if e == nil || e.MemberName == nil { return "" } return *e.MemberName } // GetTeamID returns the TeamID field if it's non-nil, zero value otherwise. func (e *ExternalGroupTeam) GetTeamID() int64 { if e == nil || e.TeamID == nil { return 0 } return *e.TeamID } // GetTeamName returns the TeamName field if it's non-nil, zero value otherwise. func (e *ExternalGroupTeam) GetTeamName() string { if e == nil || e.TeamName == nil { return "" } return *e.TeamName } // 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 } // GetIdentifier returns the Identifier field if it's non-nil, zero value otherwise. func (f *FirstPatchedVersion) GetIdentifier() string { if f == nil || f.Identifier == nil { return "" } return *f.Identifier } // 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 } // GetWorkFolder returns the WorkFolder field if it's non-nil, zero value otherwise. func (g *GenerateJITConfigRequest) GetWorkFolder() string { if g == nil || g.WorkFolder == nil { return "" } return *g.WorkFolder } // GetPreviousTagName returns the PreviousTagName field if it's non-nil, zero value otherwise. func (g *GenerateNotesOptions) GetPreviousTagName() string { if g == nil || g.PreviousTagName == nil { return "" } return *g.PreviousTagName } // GetTargetCommitish returns the TargetCommitish field if it's non-nil, zero value otherwise. func (g *GenerateNotesOptions) GetTargetCommitish() string { if g == nil || g.TargetCommitish == nil { return "" } return *g.TargetCommitish } // 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() Timestamp { if g == nil || g.CreatedAt == nil { return Timestamp{} } 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() Timestamp { if g == nil || g.UpdatedAt == nil { return Timestamp{} } 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() 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 *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 } // GetInstallation returns the Installation field. func (g *GitHubAppAuthorizationEvent) GetInstallation() *Installation { if g == nil { return nil } return g.Installation } // 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 } // GetGithubReviewedAt returns the GithubReviewedAt field if it's non-nil, zero value otherwise. func (g *GlobalSecurityAdvisory) GetGithubReviewedAt() Timestamp { if g == nil || g.GithubReviewedAt == nil { return Timestamp{} } return *g.GithubReviewedAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (g *GlobalSecurityAdvisory) GetID() int64 { if g == nil || g.ID == nil { return 0 } return *g.ID } // GetNVDPublishedAt returns the NVDPublishedAt field if it's non-nil, zero value otherwise. func (g *GlobalSecurityAdvisory) GetNVDPublishedAt() Timestamp { if g == nil || g.NVDPublishedAt == nil { return Timestamp{} } return *g.NVDPublishedAt } // GetRepositoryAdvisoryURL returns the RepositoryAdvisoryURL field if it's non-nil, zero value otherwise. func (g *GlobalSecurityAdvisory) GetRepositoryAdvisoryURL() string { if g == nil || g.RepositoryAdvisoryURL == nil { return "" } return *g.RepositoryAdvisoryURL } // GetSourceCodeLocation returns the SourceCodeLocation field if it's non-nil, zero value otherwise. func (g *GlobalSecurityAdvisory) GetSourceCodeLocation() string { if g == nil || g.SourceCodeLocation == nil { return "" } return *g.SourceCodeLocation } // GetType returns the Type field if it's non-nil, zero value otherwise. func (g *GlobalSecurityAdvisory) GetType() string { if g == nil || g.Type == nil { return "" } return *g.Type } // GetFirstPatchedVersion returns the FirstPatchedVersion field if it's non-nil, zero value otherwise. func (g *GlobalSecurityVulnerability) GetFirstPatchedVersion() string { if g == nil || g.FirstPatchedVersion == nil { return "" } return *g.FirstPatchedVersion } // GetPackage returns the Package field. func (g *GlobalSecurityVulnerability) GetPackage() *VulnerabilityPackage { if g == nil { return nil } return g.Package } // GetVulnerableVersionRange returns the VulnerableVersionRange field if it's non-nil, zero value otherwise. func (g *GlobalSecurityVulnerability) GetVulnerableVersionRange() string { if g == nil || g.VulnerableVersionRange == nil { return "" } return *g.VulnerableVersionRange } // GetInstallation returns the Installation field. func (g *GollumEvent) GetInstallation() *Installation { if g == nil { return nil } return g.Installation } // GetOrg returns the Org field. func (g *GollumEvent) GetOrg() *Organization { if g == nil { return nil } return g.Org } // 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() Timestamp { if g == nil || g.CreatedAt == nil { return Timestamp{} } return *g.CreatedAt } // GetExpiresAt returns the ExpiresAt field if it's non-nil, zero value otherwise. func (g *GPGKey) GetExpiresAt() Timestamp { if g == nil || g.ExpiresAt == nil { return Timestamp{} } 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 } // GetRawKey returns the RawKey field if it's non-nil, zero value otherwise. func (g *GPGKey) GetRawKey() string { if g == nil || g.RawKey == nil { return "" } return *g.RawKey } // 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 } // GetConfig returns the Config field. func (h *Hook) GetConfig() *HookConfig { if h == nil { return nil } return h.Config } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (h *Hook) GetCreatedAt() Timestamp { if h == nil || h.CreatedAt == nil { return Timestamp{} } 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() Timestamp { if h == nil || h.UpdatedAt == nil { return Timestamp{} } 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 } // GetSecret returns the Secret field if it's non-nil, zero value otherwise. func (h *HookConfig) GetSecret() string { if h == nil || h.Secret == nil { return "" } return *h.Secret } // 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() int64 { if h == nil || h.InstallationID == nil { return 0 } 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 } // GetLogin returns the Login field. func (i *InstallationChanges) GetLogin() *InstallationLoginChange { if i == nil { return nil } return i.Login } // GetSlug returns the Slug field. func (i *InstallationChanges) GetSlug() *InstallationSlugChange { if i == nil { return nil } return i.Slug } // 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 } // GetOrg returns the Org field. func (i *InstallationEvent) GetOrg() *Organization { if i == nil { return nil } return i.Org } // GetRequester returns the Requester field. func (i *InstallationEvent) GetRequester() *User { if i == nil { return nil } return i.Requester } // GetSender returns the Sender field. func (i *InstallationEvent) GetSender() *User { if i == nil { return nil } return i.Sender } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (i *InstallationLoginChange) GetFrom() string { if i == nil || i.From == nil { return "" } return *i.From } // 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 } // GetOrganizationCustomRoles returns the OrganizationCustomRoles field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetOrganizationCustomRoles() string { if i == nil || i.OrganizationCustomRoles == nil { return "" } return *i.OrganizationCustomRoles } // 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 } // GetOrganizationPackages returns the OrganizationPackages field if it's non-nil, zero value otherwise. func (i *InstallationPermissions) GetOrganizationPackages() string { if i == nil || i.OrganizationPackages == nil { return "" } return *i.OrganizationPackages } // 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 } // GetOrg returns the Org field. func (i *InstallationRepositoriesEvent) GetOrg() *Organization { if i == nil { return nil } return i.Org } // 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 } // GetAccount returns the Account field. func (i *InstallationRequest) GetAccount() *User { if i == nil { return nil } return i.Account } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (i *InstallationRequest) GetCreatedAt() Timestamp { if i == nil || i.CreatedAt == nil { return Timestamp{} } return *i.CreatedAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (i *InstallationRequest) 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 *InstallationRequest) GetNodeID() string { if i == nil || i.NodeID == nil { return "" } return *i.NodeID } // GetRequester returns the Requester field. func (i *InstallationRequest) GetRequester() *User { if i == nil { return nil } return i.Requester } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (i *InstallationSlugChange) GetFrom() string { if i == nil || i.From == nil { return "" } return *i.From } // GetAccount returns the Account field. func (i *InstallationTargetEvent) GetAccount() *User { if i == nil { return nil } return i.Account } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (i *InstallationTargetEvent) GetAction() string { if i == nil || i.Action == nil { return "" } return *i.Action } // GetChanges returns the Changes field. func (i *InstallationTargetEvent) GetChanges() *InstallationChanges { if i == nil { return nil } return i.Changes } // GetEnterprise returns the Enterprise field. func (i *InstallationTargetEvent) GetEnterprise() *Enterprise { if i == nil { return nil } return i.Enterprise } // GetInstallation returns the Installation field. func (i *InstallationTargetEvent) GetInstallation() *Installation { if i == nil { return nil } return i.Installation } // GetOrganization returns the Organization field. func (i *InstallationTargetEvent) GetOrganization() *Organization { if i == nil { return nil } return i.Organization } // GetRepository returns the Repository field. func (i *InstallationTargetEvent) GetRepository() *Repository { if i == nil { return nil } return i.Repository } // GetSender returns the Sender field. func (i *InstallationTargetEvent) GetSender() *User { if i == nil { return nil } return i.Sender } // GetTargetType returns the TargetType field if it's non-nil, zero value otherwise. func (i *InstallationTargetEvent) GetTargetType() string { if i == nil || i.TargetType == nil { return "" } return *i.TargetType } // GetExpiresAt returns the ExpiresAt field if it's non-nil, zero value otherwise. func (i *InstallationToken) GetExpiresAt() Timestamp { if i == nil || i.ExpiresAt == nil { return Timestamp{} } 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() Timestamp { if i == nil || i.CreatedAt == nil { return Timestamp{} } 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() Timestamp { if i == nil || i.ClosedAt == nil { return Timestamp{} } 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() Timestamp { if i == nil || i.CreatedAt == nil { return Timestamp{} } return *i.CreatedAt } // GetDraft returns the Draft field if it's non-nil, zero value otherwise. func (i *Issue) GetDraft() bool { if i == nil || i.Draft == nil { return false } return *i.Draft } // 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 } // GetStateReason returns the StateReason field if it's non-nil, zero value otherwise. func (i *Issue) GetStateReason() string { if i == nil || i.StateReason == nil { return "" } return *i.StateReason } // 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() Timestamp { if i == nil || i.UpdatedAt == nil { return Timestamp{} } 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() Timestamp { if i == nil || i.CreatedAt == nil { return Timestamp{} } 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() Timestamp { if i == nil || i.UpdatedAt == nil { return Timestamp{} } 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 } // GetOrganization returns the Organization field. func (i *IssueCommentEvent) GetOrganization() *Organization { if i == nil { return nil } return i.Organization } // 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() Timestamp { if i == nil || i.CreatedAt == nil { return Timestamp{} } 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 } // GetPerformedViaGithubApp returns the PerformedViaGithubApp field. func (i *IssueEvent) GetPerformedViaGithubApp() *App { if i == nil { return nil } return i.PerformedViaGithubApp } // 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 } // GetRepository returns the Repository field. func (i *IssueEvent) GetRepository() *Repository { if i == nil { return nil } return i.Repository } // GetRequestedReviewer returns the RequestedReviewer field. func (i *IssueEvent) GetRequestedReviewer() *User { if i == nil { return nil } return i.RequestedReviewer } // GetRequestedTeam returns the RequestedTeam field. func (i *IssueEvent) GetRequestedTeam() *Team { if i == nil { return nil } return i.RequestedTeam } // 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() Timestamp { if i == nil || i.ClosedAt == nil { return Timestamp{} } return *i.ClosedAt } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (i *IssueImport) GetCreatedAt() Timestamp { if i == nil || i.CreatedAt == nil { return Timestamp{} } 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() Timestamp { if i == nil || i.UpdatedAt == nil { return Timestamp{} } 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() Timestamp { if i == nil || i.CreatedAt == nil { return Timestamp{} } 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() Timestamp { if i == nil || i.UpdatedAt == nil { return Timestamp{} } 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 } // GetStateReason returns the StateReason field if it's non-nil, zero value otherwise. func (i *IssueRequest) GetStateReason() string { if i == nil || i.StateReason == nil { return "" } return *i.StateReason } // 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 } // GetMilestone returns the Milestone field. func (i *IssuesEvent) GetMilestone() *Milestone { if i == nil { return nil } return i.Milestone } // GetOrg returns the Org field. func (i *IssuesEvent) GetOrg() *Organization { if i == nil { return nil } return i.Org } // 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 } // GetEncodedJITConfig returns the EncodedJITConfig field if it's non-nil, zero value otherwise. func (j *JITRunnerConfig) GetEncodedJITConfig() string { if j == nil || j.EncodedJITConfig == nil { return "" } return *j.EncodedJITConfig } // GetRunner returns the Runner field. func (j *JITRunnerConfig) GetRunner() *Runner { if j == nil { return nil } return j.Runner } // 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 } // GetAddedBy returns the AddedBy field if it's non-nil, zero value otherwise. func (k *Key) GetAddedBy() string { if k == nil || k.AddedBy == nil { return "" } return *k.AddedBy } // 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 } // GetLastUsed returns the LastUsed field if it's non-nil, zero value otherwise. func (k *Key) GetLastUsed() Timestamp { if k == nil || k.LastUsed == nil { return Timestamp{} } return *k.LastUsed } // 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 } // GetSender returns the Sender field. func (l *LabelEvent) GetSender() *User { if l == nil { return nil } return l.Sender } // 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 } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (l *LinearHistoryRequirementEnforcementLevelChanges) GetFrom() string { if l == nil || l.From == nil { return "" } return *l.From } // GetDirection returns the Direction field if it's non-nil, zero value otherwise. func (l *ListAlertsOptions) GetDirection() string { if l == nil || l.Direction == nil { return "" } return *l.Direction } // GetEcosystem returns the Ecosystem field if it's non-nil, zero value otherwise. func (l *ListAlertsOptions) GetEcosystem() string { if l == nil || l.Ecosystem == nil { return "" } return *l.Ecosystem } // GetPackage returns the Package field if it's non-nil, zero value otherwise. func (l *ListAlertsOptions) GetPackage() string { if l == nil || l.Package == nil { return "" } return *l.Package } // GetScope returns the Scope field if it's non-nil, zero value otherwise. func (l *ListAlertsOptions) GetScope() string { if l == nil || l.Scope == nil { return "" } return *l.Scope } // GetSeverity returns the Severity field if it's non-nil, zero value otherwise. func (l *ListAlertsOptions) GetSeverity() string { if l == nil || l.Severity == nil { return "" } return *l.Severity } // GetSort returns the Sort field if it's non-nil, zero value otherwise. func (l *ListAlertsOptions) GetSort() string { if l == nil || l.Sort == nil { return "" } return *l.Sort } // GetState returns the State field if it's non-nil, zero value otherwise. func (l *ListAlertsOptions) GetState() string { if l == nil || l.State == nil { return "" } return *l.State } // GetAppID returns the AppID field if it's non-nil, zero value otherwise. func (l *ListCheckRunsOptions) GetAppID() int64 { 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 *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 } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (l *ListCodespaces) GetTotalCount() int { if l == nil || l.TotalCount == nil { return 0 } return *l.TotalCount } // 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 *ListCustomDeploymentRuleIntegrationsResponse) GetTotalCount() int { if l == nil || l.TotalCount == nil { return 0 } return *l.TotalCount } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (l *ListDeploymentProtectionRuleResponse) GetTotalCount() int { if l == nil || l.TotalCount == nil { return 0 } return *l.TotalCount } // GetDisplayName returns the DisplayName field if it's non-nil, zero value otherwise. func (l *ListExternalGroupsOptions) GetDisplayName() string { if l == nil || l.DisplayName == nil { return "" } return *l.DisplayName } // GetAffects returns the Affects field if it's non-nil, zero value otherwise. func (l *ListGlobalSecurityAdvisoriesOptions) GetAffects() string { if l == nil || l.Affects == nil { return "" } return *l.Affects } // GetCVEID returns the CVEID field if it's non-nil, zero value otherwise. func (l *ListGlobalSecurityAdvisoriesOptions) GetCVEID() string { if l == nil || l.CVEID == nil { return "" } return *l.CVEID } // GetEcosystem returns the Ecosystem field if it's non-nil, zero value otherwise. func (l *ListGlobalSecurityAdvisoriesOptions) GetEcosystem() string { if l == nil || l.Ecosystem == nil { return "" } return *l.Ecosystem } // GetGHSAID returns the GHSAID field if it's non-nil, zero value otherwise. func (l *ListGlobalSecurityAdvisoriesOptions) GetGHSAID() string { if l == nil || l.GHSAID == nil { return "" } return *l.GHSAID } // GetIsWithdrawn returns the IsWithdrawn field if it's non-nil, zero value otherwise. func (l *ListGlobalSecurityAdvisoriesOptions) GetIsWithdrawn() bool { if l == nil || l.IsWithdrawn == nil { return false } return *l.IsWithdrawn } // GetModified returns the Modified field if it's non-nil, zero value otherwise. func (l *ListGlobalSecurityAdvisoriesOptions) GetModified() string { if l == nil || l.Modified == nil { return "" } return *l.Modified } // GetPublished returns the Published field if it's non-nil, zero value otherwise. func (l *ListGlobalSecurityAdvisoriesOptions) GetPublished() string { if l == nil || l.Published == nil { return "" } return *l.Published } // GetSeverity returns the Severity field if it's non-nil, zero value otherwise. func (l *ListGlobalSecurityAdvisoriesOptions) GetSeverity() string { if l == nil || l.Severity == nil { return "" } return *l.Severity } // GetType returns the Type field if it's non-nil, zero value otherwise. func (l *ListGlobalSecurityAdvisoriesOptions) GetType() string { if l == nil || l.Type == nil { return "" } return *l.Type } // GetUpdated returns the Updated field if it's non-nil, zero value otherwise. func (l *ListGlobalSecurityAdvisoriesOptions) GetUpdated() string { if l == nil || l.Updated == nil { return "" } return *l.Updated } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (l *ListOrganizations) GetTotalCount() int { if l == nil || l.TotalCount == nil { return 0 } return *l.TotalCount } // 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 } // GetCount returns the Count field if it's non-nil, zero value otherwise. func (l *ListSCIMProvisionedIdentitiesOptions) GetCount() int { if l == nil || l.Count == nil { return 0 } return *l.Count } // GetFilter returns the Filter field if it's non-nil, zero value otherwise. func (l *ListSCIMProvisionedIdentitiesOptions) GetFilter() string { if l == nil || l.Filter == nil { return "" } return *l.Filter } // GetStartIndex returns the StartIndex field if it's non-nil, zero value otherwise. func (l *ListSCIMProvisionedIdentitiesOptions) GetStartIndex() int { if l == nil || l.StartIndex == nil { return 0 } return *l.StartIndex } // 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 } // GetEnabled returns the Enabled field if it's non-nil, zero value otherwise. func (l *LockBranch) GetEnabled() bool { if l == nil || l.Enabled == nil { return false } return *l.Enabled } // 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 } // GetAccount returns the Account field. func (m *MarketplacePurchase) GetAccount() *MarketplacePurchaseAccount { if m == nil { return nil } return m.Account } // 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 } // GetEmail returns the Email field if it's non-nil, zero value otherwise. func (m *MarketplacePurchaseAccount) GetEmail() string { if m == nil || m.Email == nil { return "" } return *m.Email } // GetID returns the ID field if it's non-nil, zero value otherwise. func (m *MarketplacePurchaseAccount) 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 *MarketplacePurchaseAccount) GetLogin() string { if m == nil || m.Login == nil { return "" } return *m.Login } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (m *MarketplacePurchaseAccount) GetNodeID() string { if m == nil || m.NodeID == nil { return "" } return *m.NodeID } // GetOrganizationBillingEmail returns the OrganizationBillingEmail field if it's non-nil, zero value otherwise. func (m *MarketplacePurchaseAccount) 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 *MarketplacePurchaseAccount) 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 *MarketplacePurchaseAccount) 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 *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 } // GetOrg returns the Org field. func (m *MarketplacePurchaseEvent) GetOrg() *Organization { if m == nil { return nil } return m.Org } // 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 } // GetOrg returns the Org field. func (m *MemberEvent) GetOrg() *Organization { if m == nil { return nil } return m.Org } // 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 } // GetBaseRef returns the BaseRef field if it's non-nil, zero value otherwise. func (m *MergeGroup) GetBaseRef() string { if m == nil || m.BaseRef == nil { return "" } return *m.BaseRef } // GetBaseSHA returns the BaseSHA field if it's non-nil, zero value otherwise. func (m *MergeGroup) GetBaseSHA() string { if m == nil || m.BaseSHA == nil { return "" } return *m.BaseSHA } // GetHeadCommit returns the HeadCommit field. func (m *MergeGroup) GetHeadCommit() *Commit { if m == nil { return nil } return m.HeadCommit } // GetHeadRef returns the HeadRef field if it's non-nil, zero value otherwise. func (m *MergeGroup) GetHeadRef() string { if m == nil || m.HeadRef == nil { return "" } return *m.HeadRef } // GetHeadSHA returns the HeadSHA field if it's non-nil, zero value otherwise. func (m *MergeGroup) GetHeadSHA() string { if m == nil || m.HeadSHA == nil { return "" } return *m.HeadSHA } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (m *MergeGroupEvent) GetAction() string { if m == nil || m.Action == nil { return "" } return *m.Action } // GetInstallation returns the Installation field. func (m *MergeGroupEvent) GetInstallation() *Installation { if m == nil { return nil } return m.Installation } // GetMergeGroup returns the MergeGroup field. func (m *MergeGroupEvent) GetMergeGroup() *MergeGroup { if m == nil { return nil } return m.MergeGroup } // GetOrg returns the Org field. func (m *MergeGroupEvent) GetOrg() *Organization { if m == nil { return nil } return m.Org } // GetRepo returns the Repo field. func (m *MergeGroupEvent) GetRepo() *Repository { if m == nil { return nil } return m.Repo } // GetSender returns the Sender field. func (m *MergeGroupEvent) 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 *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 } // GetInstallation returns the Installation field. func (m *MetaEvent) GetInstallation() *Installation { if m == nil { return nil } return m.Installation } // GetOrg returns the Org field. func (m *MetaEvent) GetOrg() *Organization { if m == nil { return nil } return m.Org } // GetRepo returns the Repo field. func (m *MetaEvent) GetRepo() *Repository { if m == nil { return nil } return m.Repo } // GetSender returns the Sender field. func (m *MetaEvent) GetSender() *User { if m == nil { return nil } return m.Sender } // 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 } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (m *Metric) GetNodeID() string { if m == nil || m.NodeID == nil { return "" } return *m.NodeID } // GetSPDXID returns the SPDXID field if it's non-nil, zero value otherwise. func (m *Metric) GetSPDXID() string { if m == nil || m.SPDXID == nil { return "" } return *m.SPDXID } // 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() Timestamp { if m == nil || m.ClosedAt == nil { return Timestamp{} } 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() Timestamp { if m == nil || m.CreatedAt == nil { return Timestamp{} } 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() Timestamp { if m == nil || m.DueOn == nil { return Timestamp{} } 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() Timestamp { if m == nil || m.UpdatedAt == nil { return Timestamp{} } 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 } // GetCategory returns the Category field if it's non-nil, zero value otherwise. func (m *MostRecentInstance) GetCategory() string { if m == nil || m.Category == nil { return "" } return *m.Category } // 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 } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (m *MostRecentInstance) GetHTMLURL() string { if m == nil || m.HTMLURL == nil { return "" } return *m.HTMLURL } // 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 } // GetHeadRepo returns the HeadRepo field if it's non-nil, zero value otherwise. func (n *NewPullRequest) GetHeadRepo() string { if n == nil || n.HeadRepo == nil { return "" } return *n.HeadRepo } // 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() Timestamp { if n == nil || n.LastReadAt == nil { return Timestamp{} } 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() Timestamp { if n == nil || n.UpdatedAt == nil { return Timestamp{} } 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 } // GetUseDefault returns the UseDefault field if it's non-nil, zero value otherwise. func (o *OIDCSubjectClaimCustomTemplate) GetUseDefault() bool { if o == nil || o.UseDefault == nil { return false } return *o.UseDefault } // GetAdvancedSecurityEnabledForNewRepos returns the AdvancedSecurityEnabledForNewRepos field if it's non-nil, zero value otherwise. func (o *Organization) GetAdvancedSecurityEnabledForNewRepos() bool { if o == nil || o.AdvancedSecurityEnabledForNewRepos == nil { return false } return *o.AdvancedSecurityEnabledForNewRepos } // 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() Timestamp { if o == nil || o.CreatedAt == nil { return Timestamp{} } 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 } // GetDependabotAlertsEnabledForNewRepos returns the DependabotAlertsEnabledForNewRepos field if it's non-nil, zero value otherwise. func (o *Organization) GetDependabotAlertsEnabledForNewRepos() bool { if o == nil || o.DependabotAlertsEnabledForNewRepos == nil { return false } return *o.DependabotAlertsEnabledForNewRepos } // GetDependabotSecurityUpdatesEnabledForNewRepos returns the DependabotSecurityUpdatesEnabledForNewRepos field if it's non-nil, zero value otherwise. func (o *Organization) GetDependabotSecurityUpdatesEnabledForNewRepos() bool { if o == nil || o.DependabotSecurityUpdatesEnabledForNewRepos == nil { return false } return *o.DependabotSecurityUpdatesEnabledForNewRepos } // GetDependencyGraphEnabledForNewRepos returns the DependencyGraphEnabledForNewRepos field if it's non-nil, zero value otherwise. func (o *Organization) GetDependencyGraphEnabledForNewRepos() bool { if o == nil || o.DependencyGraphEnabledForNewRepos == nil { return false } return *o.DependencyGraphEnabledForNewRepos } // 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 } // GetMembersCanForkPrivateRepos returns the MembersCanForkPrivateRepos field if it's non-nil, zero value otherwise. func (o *Organization) GetMembersCanForkPrivateRepos() bool { if o == nil || o.MembersCanForkPrivateRepos == nil { return false } return *o.MembersCanForkPrivateRepos } // 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() int64 { 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 } // GetSecretScanningEnabledForNewRepos returns the SecretScanningEnabledForNewRepos field if it's non-nil, zero value otherwise. func (o *Organization) GetSecretScanningEnabledForNewRepos() bool { if o == nil || o.SecretScanningEnabledForNewRepos == nil { return false } return *o.SecretScanningEnabledForNewRepos } // GetSecretScanningPushProtectionEnabledForNewRepos returns the SecretScanningPushProtectionEnabledForNewRepos field if it's non-nil, zero value otherwise. func (o *Organization) GetSecretScanningPushProtectionEnabledForNewRepos() bool { if o == nil || o.SecretScanningPushProtectionEnabledForNewRepos == nil { return false } return *o.SecretScanningPushProtectionEnabledForNewRepos } // GetSecretScanningValidityChecksEnabled returns the SecretScanningValidityChecksEnabled field if it's non-nil, zero value otherwise. func (o *Organization) GetSecretScanningValidityChecksEnabled() bool { if o == nil || o.SecretScanningValidityChecksEnabled == nil { return false } return *o.SecretScanningValidityChecksEnabled } // GetTotalPrivateRepos returns the TotalPrivateRepos field if it's non-nil, zero value otherwise. func (o *Organization) GetTotalPrivateRepos() int64 { 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() Timestamp { if o == nil || o.UpdatedAt == nil { return Timestamp{} } 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 } // GetWebCommitSignoffRequired returns the WebCommitSignoffRequired field if it's non-nil, zero value otherwise. func (o *Organization) GetWebCommitSignoffRequired() bool { if o == nil || o.WebCommitSignoffRequired == nil { return false } return *o.WebCommitSignoffRequired } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (o *OrganizationCustomRepoRoles) 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 *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 } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (o *OrgRequiredWorkflow) GetCreatedAt() Timestamp { if o == nil || o.CreatedAt == nil { return Timestamp{} } return *o.CreatedAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (o *OrgRequiredWorkflow) GetID() int64 { if o == nil || o.ID == nil { return 0 } return *o.ID } // GetName returns the Name field if it's non-nil, zero value otherwise. func (o *OrgRequiredWorkflow) GetName() string { if o == nil || o.Name == nil { return "" } return *o.Name } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (o *OrgRequiredWorkflow) GetPath() string { if o == nil || o.Path == nil { return "" } return *o.Path } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (o *OrgRequiredWorkflow) GetRef() string { if o == nil || o.Ref == nil { return "" } return *o.Ref } // GetRepository returns the Repository field. func (o *OrgRequiredWorkflow) GetRepository() *Repository { if o == nil { return nil } return o.Repository } // GetScope returns the Scope field if it's non-nil, zero value otherwise. func (o *OrgRequiredWorkflow) GetScope() string { if o == nil || o.Scope == nil { return "" } return *o.Scope } // GetSelectedRepositoriesURL returns the SelectedRepositoriesURL field if it's non-nil, zero value otherwise. func (o *OrgRequiredWorkflow) GetSelectedRepositoriesURL() string { if o == nil || o.SelectedRepositoriesURL == nil { return "" } return *o.SelectedRepositoriesURL } // GetState returns the State field if it's non-nil, zero value otherwise. func (o *OrgRequiredWorkflow) GetState() string { if o == nil || o.State == nil { return "" } return *o.State } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (o *OrgRequiredWorkflow) GetUpdatedAt() Timestamp { if o == nil || o.UpdatedAt == nil { return Timestamp{} } return *o.UpdatedAt } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (o *OrgRequiredWorkflows) GetTotalCount() int { if o == nil || o.TotalCount == nil { return 0 } return *o.TotalCount } // 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 } // GetOrg returns the Org field. func (o *OwnerInfo) GetOrg() *User { if o == nil { return nil } return o.Org } // GetUser returns the User field. func (o *OwnerInfo) GetUser() *User { if o == nil { return nil } return o.User } // 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 } // GetRepository returns the Repository field. func (p *Package) GetRepository() *Repository { if p == nil { return nil } return p.Repository } // 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 } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (p *Package) GetURL() string { if p == nil || p.URL == nil { return "" } return *p.URL } // GetVersionCount returns the VersionCount field if it's non-nil, zero value otherwise. func (p *Package) GetVersionCount() int64 { if p == nil || p.VersionCount == nil { return 0 } return *p.VersionCount } // GetVisibility returns the Visibility field if it's non-nil, zero value otherwise. func (p *Package) GetVisibility() string { if p == nil || p.Visibility == nil { return "" } return *p.Visibility } // 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 } // GetInstallation returns the Installation field. func (p *PackageEvent) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // 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 } // GetPackageType returns the PackageType field if it's non-nil, zero value otherwise. func (p *PackageListOptions) GetPackageType() string { if p == nil || p.PackageType == nil { return "" } return *p.PackageType } // GetState returns the State field if it's non-nil, zero value otherwise. func (p *PackageListOptions) GetState() string { if p == nil || p.State == nil { return "" } return *p.State } // GetVisibility returns the Visibility field if it's non-nil, zero value otherwise. func (p *PackageListOptions) GetVisibility() string { if p == nil || p.Visibility == nil { return "" } return *p.Visibility } // GetContainer returns the Container field. func (p *PackageMetadata) GetContainer() *PackageContainerMetadata { if p == nil { return nil } return p.Container } // GetPackageType returns the PackageType field if it's non-nil, zero value otherwise. func (p *PackageMetadata) GetPackageType() string { if p == nil || p.PackageType == nil { return "" } return *p.PackageType } // 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 } // GetMetadata returns the Metadata field. func (p *PackageVersion) GetMetadata() *PackageMetadata { if p == nil { return nil } return p.Metadata } // GetName returns the Name field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetName() string { if p == nil || p.Name == nil { return "" } return *p.Name } // GetPackageHTMLURL returns the PackageHTMLURL field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetPackageHTMLURL() string { if p == nil || p.PackageHTMLURL == nil { return "" } return *p.PackageHTMLURL } // 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 } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (p *PackageVersion) GetURL() string { if p == nil || p.URL == nil { return "" } return *p.URL } // 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 } // GetOrg returns the Org field. func (p *PageBuildEvent) GetOrg() *Organization { if p == nil { return nil } return p.Org } // 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 } // GetBuildType returns the BuildType field if it's non-nil, zero value otherwise. func (p *Pages) GetBuildType() string { if p == nil || p.BuildType == nil { return "" } return *p.BuildType } // 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 } // GetHTTPSCertificate returns the HTTPSCertificate field. func (p *Pages) GetHTTPSCertificate() *PagesHTTPSCertificate { if p == nil { return nil } return p.HTTPSCertificate } // GetHTTPSEnforced returns the HTTPSEnforced field if it's non-nil, zero value otherwise. func (p *Pages) GetHTTPSEnforced() bool { if p == nil || p.HTTPSEnforced == nil { return false } return *p.HTTPSEnforced } // GetPublic returns the Public field if it's non-nil, zero value otherwise. func (p *Pages) GetPublic() bool { if p == nil || p.Public == nil { return false } return *p.Public } // 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 } // GetCAAError returns the CAAError field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetCAAError() string { if p == nil || p.CAAError == nil { return "" } return *p.CAAError } // GetDNSResolves returns the DNSResolves field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetDNSResolves() bool { if p == nil || p.DNSResolves == nil { return false } return *p.DNSResolves } // GetEnforcesHTTPS returns the EnforcesHTTPS field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetEnforcesHTTPS() bool { if p == nil || p.EnforcesHTTPS == nil { return false } return *p.EnforcesHTTPS } // GetHasCNAMERecord returns the HasCNAMERecord field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetHasCNAMERecord() bool { if p == nil || p.HasCNAMERecord == nil { return false } return *p.HasCNAMERecord } // GetHasMXRecordsPresent returns the HasMXRecordsPresent field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetHasMXRecordsPresent() bool { if p == nil || p.HasMXRecordsPresent == nil { return false } return *p.HasMXRecordsPresent } // GetHost returns the Host field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetHost() string { if p == nil || p.Host == nil { return "" } return *p.Host } // GetHTTPSError returns the HTTPSError field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetHTTPSError() string { if p == nil || p.HTTPSError == nil { return "" } return *p.HTTPSError } // GetIsApexDomain returns the IsApexDomain field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsApexDomain() bool { if p == nil || p.IsApexDomain == nil { return false } return *p.IsApexDomain } // GetIsARecord returns the IsARecord field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsARecord() bool { if p == nil || p.IsARecord == nil { return false } return *p.IsARecord } // GetIsCloudflareIP returns the IsCloudflareIP field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsCloudflareIP() bool { if p == nil || p.IsCloudflareIP == nil { return false } return *p.IsCloudflareIP } // GetIsCNAMEToFastly returns the IsCNAMEToFastly field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsCNAMEToFastly() bool { if p == nil || p.IsCNAMEToFastly == nil { return false } return *p.IsCNAMEToFastly } // GetIsCNAMEToGithubUserDomain returns the IsCNAMEToGithubUserDomain field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsCNAMEToGithubUserDomain() bool { if p == nil || p.IsCNAMEToGithubUserDomain == nil { return false } return *p.IsCNAMEToGithubUserDomain } // GetIsCNAMEToPagesDotGithubDotCom returns the IsCNAMEToPagesDotGithubDotCom field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsCNAMEToPagesDotGithubDotCom() bool { if p == nil || p.IsCNAMEToPagesDotGithubDotCom == nil { return false } return *p.IsCNAMEToPagesDotGithubDotCom } // GetIsFastlyIP returns the IsFastlyIP field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsFastlyIP() bool { if p == nil || p.IsFastlyIP == nil { return false } return *p.IsFastlyIP } // GetIsHTTPSEligible returns the IsHTTPSEligible field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsHTTPSEligible() bool { if p == nil || p.IsHTTPSEligible == nil { return false } return *p.IsHTTPSEligible } // GetIsNonGithubPagesIPPresent returns the IsNonGithubPagesIPPresent field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsNonGithubPagesIPPresent() bool { if p == nil || p.IsNonGithubPagesIPPresent == nil { return false } return *p.IsNonGithubPagesIPPresent } // GetIsOldIPAddress returns the IsOldIPAddress field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsOldIPAddress() bool { if p == nil || p.IsOldIPAddress == nil { return false } return *p.IsOldIPAddress } // GetIsPagesDomain returns the IsPagesDomain field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsPagesDomain() bool { if p == nil || p.IsPagesDomain == nil { return false } return *p.IsPagesDomain } // GetIsPointedToGithubPagesIP returns the IsPointedToGithubPagesIP field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsPointedToGithubPagesIP() bool { if p == nil || p.IsPointedToGithubPagesIP == nil { return false } return *p.IsPointedToGithubPagesIP } // GetIsProxied returns the IsProxied field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsProxied() bool { if p == nil || p.IsProxied == nil { return false } return *p.IsProxied } // GetIsServedByPages returns the IsServedByPages field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsServedByPages() bool { if p == nil || p.IsServedByPages == nil { return false } return *p.IsServedByPages } // GetIsValid returns the IsValid field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsValid() bool { if p == nil || p.IsValid == nil { return false } return *p.IsValid } // GetIsValidDomain returns the IsValidDomain field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetIsValidDomain() bool { if p == nil || p.IsValidDomain == nil { return false } return *p.IsValidDomain } // GetNameservers returns the Nameservers field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetNameservers() string { if p == nil || p.Nameservers == nil { return "" } return *p.Nameservers } // GetReason returns the Reason field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetReason() string { if p == nil || p.Reason == nil { return "" } return *p.Reason } // GetRespondsToHTTPS returns the RespondsToHTTPS field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetRespondsToHTTPS() bool { if p == nil || p.RespondsToHTTPS == nil { return false } return *p.RespondsToHTTPS } // GetShouldBeARecord returns the ShouldBeARecord field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetShouldBeARecord() bool { if p == nil || p.ShouldBeARecord == nil { return false } return *p.ShouldBeARecord } // GetURI returns the URI field if it's non-nil, zero value otherwise. func (p *PagesDomain) GetURI() string { if p == nil || p.URI == nil { return "" } return *p.URI } // 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 } // GetAltDomain returns the AltDomain field. func (p *PagesHealthCheckResponse) GetAltDomain() *PagesDomain { if p == nil { return nil } return p.AltDomain } // GetDomain returns the Domain field. func (p *PagesHealthCheckResponse) GetDomain() *PagesDomain { if p == nil { return nil } return p.Domain } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (p *PagesHTTPSCertificate) GetDescription() string { if p == nil || p.Description == nil { return "" } return *p.Description } // GetExpiresAt returns the ExpiresAt field if it's non-nil, zero value otherwise. func (p *PagesHTTPSCertificate) GetExpiresAt() string { if p == nil || p.ExpiresAt == nil { return "" } return *p.ExpiresAt } // GetState returns the State field if it's non-nil, zero value otherwise. func (p *PagesHTTPSCertificate) GetState() string { if p == nil || p.State == nil { return "" } return *p.State } // 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 } // GetBuildType returns the BuildType field if it's non-nil, zero value otherwise. func (p *PagesUpdate) GetBuildType() string { if p == nil || p.BuildType == nil { return "" } return *p.BuildType } // 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 } // GetHTTPSEnforced returns the HTTPSEnforced field if it's non-nil, zero value otherwise. func (p *PagesUpdate) GetHTTPSEnforced() bool { if p == nil || p.HTTPSEnforced == nil { return false } return *p.HTTPSEnforced } // GetPublic returns the Public field if it's non-nil, zero value otherwise. func (p *PagesUpdate) GetPublic() bool { if p == nil || p.Public == nil { return false } return *p.Public } // GetSource returns the Source field. func (p *PagesUpdate) GetSource() *PagesSource { if p == nil { return nil } return p.Source } // GetOrg returns the Org map if it's non-nil, an empty map otherwise. func (p *PersonalAccessTokenPermissions) GetOrg() map[string]string { if p == nil || p.Org == nil { return map[string]string{} } return p.Org } // GetOther returns the Other map if it's non-nil, an empty map otherwise. func (p *PersonalAccessTokenPermissions) GetOther() map[string]string { if p == nil || p.Other == nil { return map[string]string{} } return p.Other } // GetRepo returns the Repo map if it's non-nil, an empty map otherwise. func (p *PersonalAccessTokenPermissions) GetRepo() map[string]string { if p == nil || p.Repo == nil { return map[string]string{} } return p.Repo } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (p *PersonalAccessTokenRequest) 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 *PersonalAccessTokenRequest) GetID() int64 { if p == nil || p.ID == nil { return 0 } return *p.ID } // GetOrg returns the Org field. func (p *PersonalAccessTokenRequest) GetOrg() *Organization { if p == nil { return nil } return p.Org } // GetOwner returns the Owner field. func (p *PersonalAccessTokenRequest) GetOwner() *User { if p == nil { return nil } return p.Owner } // GetPermissionsAdded returns the PermissionsAdded field. func (p *PersonalAccessTokenRequest) GetPermissionsAdded() *PersonalAccessTokenPermissions { if p == nil { return nil } return p.PermissionsAdded } // GetPermissionsResult returns the PermissionsResult field. func (p *PersonalAccessTokenRequest) GetPermissionsResult() *PersonalAccessTokenPermissions { if p == nil { return nil } return p.PermissionsResult } // GetPermissionsUpgraded returns the PermissionsUpgraded field. func (p *PersonalAccessTokenRequest) GetPermissionsUpgraded() *PersonalAccessTokenPermissions { if p == nil { return nil } return p.PermissionsUpgraded } // GetRepositoryCount returns the RepositoryCount field if it's non-nil, zero value otherwise. func (p *PersonalAccessTokenRequest) GetRepositoryCount() int64 { if p == nil || p.RepositoryCount == nil { return 0 } return *p.RepositoryCount } // GetRepositorySelection returns the RepositorySelection field if it's non-nil, zero value otherwise. func (p *PersonalAccessTokenRequest) GetRepositorySelection() string { if p == nil || p.RepositorySelection == nil { return "" } return *p.RepositorySelection } // GetTokenExpired returns the TokenExpired field if it's non-nil, zero value otherwise. func (p *PersonalAccessTokenRequest) GetTokenExpired() bool { if p == nil || p.TokenExpired == nil { return false } return *p.TokenExpired } // GetTokenExpiresAt returns the TokenExpiresAt field if it's non-nil, zero value otherwise. func (p *PersonalAccessTokenRequest) GetTokenExpiresAt() Timestamp { if p == nil || p.TokenExpiresAt == nil { return Timestamp{} } return *p.TokenExpiresAt } // GetTokenLastUsedAt returns the TokenLastUsedAt field if it's non-nil, zero value otherwise. func (p *PersonalAccessTokenRequest) GetTokenLastUsedAt() Timestamp { if p == nil || p.TokenLastUsedAt == nil { return Timestamp{} } return *p.TokenLastUsedAt } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (p *PersonalAccessTokenRequestEvent) GetAction() string { if p == nil || p.Action == nil { return "" } return *p.Action } // GetInstallation returns the Installation field. func (p *PersonalAccessTokenRequestEvent) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // GetOrg returns the Org field. func (p *PersonalAccessTokenRequestEvent) GetOrg() *Organization { if p == nil { return nil } return p.Org } // GetPersonalAccessTokenRequest returns the PersonalAccessTokenRequest field. func (p *PersonalAccessTokenRequestEvent) GetPersonalAccessTokenRequest() *PersonalAccessTokenRequest { if p == nil { return nil } return p.PersonalAccessTokenRequest } // GetSender returns the Sender field. func (p *PersonalAccessTokenRequestEvent) GetSender() *User { if p == nil { return nil } return p.Sender } // 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 } // GetOrg returns the Org field. func (p *PingEvent) GetOrg() *Organization { if p == nil { return nil } return p.Org } // GetRepo returns the Repo field. func (p *PingEvent) GetRepo() *Repository { if p == nil { return nil } return p.Repo } // GetSender returns the Sender field. func (p *PingEvent) GetSender() *User { if p == nil { return nil } return p.Sender } // 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() int64 { 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 } // GetOrganizationPermission returns the OrganizationPermission field if it's non-nil, zero value otherwise. func (p *Project) GetOrganizationPermission() string { if p == nil || p.OrganizationPermission == nil { return "" } return *p.OrganizationPermission } // 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 } // GetPrivate returns the Private field if it's non-nil, zero value otherwise. func (p *Project) GetPrivate() bool { if p == nil || p.Private == nil { return false } return *p.Private } // 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 } // GetPrivate returns the Private field if it's non-nil, zero value otherwise. func (p *ProjectOptions) GetPrivate() bool { if p == nil || p.Private == nil { return false } return *p.Private } // 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 } // GetClosedAt returns the ClosedAt field if it's non-nil, zero value otherwise. func (p *ProjectsV2) GetClosedAt() Timestamp { if p == nil || p.ClosedAt == nil { return Timestamp{} } return *p.ClosedAt } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (p *ProjectsV2) GetCreatedAt() Timestamp { if p == nil || p.CreatedAt == nil { return Timestamp{} } return *p.CreatedAt } // GetCreator returns the Creator field. func (p *ProjectsV2) GetCreator() *User { if p == nil { return nil } return p.Creator } // GetDeletedAt returns the DeletedAt field if it's non-nil, zero value otherwise. func (p *ProjectsV2) GetDeletedAt() Timestamp { if p == nil || p.DeletedAt == nil { return Timestamp{} } return *p.DeletedAt } // GetDeletedBy returns the DeletedBy field. func (p *ProjectsV2) GetDeletedBy() *User { if p == nil { return nil } return p.DeletedBy } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (p *ProjectsV2) GetDescription() string { if p == nil || p.Description == nil { return "" } return *p.Description } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *ProjectsV2) 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 *ProjectsV2) 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 *ProjectsV2) GetNumber() int { if p == nil || p.Number == nil { return 0 } return *p.Number } // GetOwner returns the Owner field. func (p *ProjectsV2) GetOwner() *User { if p == nil { return nil } return p.Owner } // GetPublic returns the Public field if it's non-nil, zero value otherwise. func (p *ProjectsV2) GetPublic() bool { if p == nil || p.Public == nil { return false } return *p.Public } // GetShortDescription returns the ShortDescription field if it's non-nil, zero value otherwise. func (p *ProjectsV2) GetShortDescription() string { if p == nil || p.ShortDescription == nil { return "" } return *p.ShortDescription } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (p *ProjectsV2) 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 *ProjectsV2) 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 *ProjectV2Event) GetAction() string { if p == nil || p.Action == nil { return "" } return *p.Action } // GetInstallation returns the Installation field. func (p *ProjectV2Event) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // GetOrg returns the Org field. func (p *ProjectV2Event) GetOrg() *Organization { if p == nil { return nil } return p.Org } // GetProjectsV2 returns the ProjectsV2 field. func (p *ProjectV2Event) GetProjectsV2() *ProjectsV2 { if p == nil { return nil } return p.ProjectsV2 } // GetSender returns the Sender field. func (p *ProjectV2Event) GetSender() *User { if p == nil { return nil } return p.Sender } // GetArchivedAt returns the ArchivedAt field if it's non-nil, zero value otherwise. func (p *ProjectV2Item) GetArchivedAt() Timestamp { if p == nil || p.ArchivedAt == nil { return Timestamp{} } return *p.ArchivedAt } // GetContentNodeID returns the ContentNodeID field if it's non-nil, zero value otherwise. func (p *ProjectV2Item) GetContentNodeID() string { if p == nil || p.ContentNodeID == nil { return "" } return *p.ContentNodeID } // GetContentType returns the ContentType field if it's non-nil, zero value otherwise. func (p *ProjectV2Item) 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 *ProjectV2Item) GetCreatedAt() Timestamp { if p == nil || p.CreatedAt == nil { return Timestamp{} } return *p.CreatedAt } // GetCreator returns the Creator field. func (p *ProjectV2Item) 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 *ProjectV2Item) 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 *ProjectV2Item) GetNodeID() string { if p == nil || p.NodeID == nil { return "" } return *p.NodeID } // GetProjectNodeID returns the ProjectNodeID field if it's non-nil, zero value otherwise. func (p *ProjectV2Item) GetProjectNodeID() string { if p == nil || p.ProjectNodeID == nil { return "" } return *p.ProjectNodeID } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (p *ProjectV2Item) GetUpdatedAt() Timestamp { if p == nil || p.UpdatedAt == nil { return Timestamp{} } return *p.UpdatedAt } // GetArchivedAt returns the ArchivedAt field. func (p *ProjectV2ItemChange) GetArchivedAt() *ArchivedAt { if p == nil { return nil } return p.ArchivedAt } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (p *ProjectV2ItemEvent) GetAction() string { if p == nil || p.Action == nil { return "" } return *p.Action } // GetChanges returns the Changes field. func (p *ProjectV2ItemEvent) GetChanges() *ProjectV2ItemChange { if p == nil { return nil } return p.Changes } // GetInstallation returns the Installation field. func (p *ProjectV2ItemEvent) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // GetOrg returns the Org field. func (p *ProjectV2ItemEvent) GetOrg() *Organization { if p == nil { return nil } return p.Org } // GetProjectV2Item returns the ProjectV2Item field. func (p *ProjectV2ItemEvent) GetProjectV2Item() *ProjectV2Item { if p == nil { return nil } return p.ProjectV2Item } // GetSender returns the Sender field. func (p *ProjectV2ItemEvent) GetSender() *User { if p == nil { return nil } return p.Sender } // 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 } // GetAllowForkSyncing returns the AllowForkSyncing field. func (p *Protection) GetAllowForkSyncing() *AllowForkSyncing { if p == nil { return nil } return p.AllowForkSyncing } // GetBlockCreations returns the BlockCreations field. func (p *Protection) GetBlockCreations() *BlockCreations { if p == nil { return nil } return p.BlockCreations } // GetEnforceAdmins returns the EnforceAdmins field. func (p *Protection) GetEnforceAdmins() *AdminEnforcement { if p == nil { return nil } return p.EnforceAdmins } // GetLockBranch returns the LockBranch field. func (p *Protection) GetLockBranch() *LockBranch { if p == nil { return nil } return p.LockBranch } // 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 } // GetRequiredSignatures returns the RequiredSignatures field. func (p *Protection) GetRequiredSignatures() *SignaturesProtectedBranch { if p == nil { return nil } return p.RequiredSignatures } // 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 } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (p *Protection) GetURL() string { if p == nil || p.URL == nil { return "" } return *p.URL } // GetAdminEnforced returns the AdminEnforced field. func (p *ProtectionChanges) GetAdminEnforced() *AdminEnforcedChanges { if p == nil { return nil } return p.AdminEnforced } // GetAllowDeletionsEnforcementLevel returns the AllowDeletionsEnforcementLevel field. func (p *ProtectionChanges) GetAllowDeletionsEnforcementLevel() *AllowDeletionsEnforcementLevelChanges { if p == nil { return nil } return p.AllowDeletionsEnforcementLevel } // GetAuthorizedActorNames returns the AuthorizedActorNames field. func (p *ProtectionChanges) GetAuthorizedActorNames() *AuthorizedActorNames { if p == nil { return nil } return p.AuthorizedActorNames } // GetAuthorizedActorsOnly returns the AuthorizedActorsOnly field. func (p *ProtectionChanges) GetAuthorizedActorsOnly() *AuthorizedActorsOnly { if p == nil { return nil } return p.AuthorizedActorsOnly } // GetAuthorizedDismissalActorsOnly returns the AuthorizedDismissalActorsOnly field. func (p *ProtectionChanges) GetAuthorizedDismissalActorsOnly() *AuthorizedDismissalActorsOnlyChanges { if p == nil { return nil } return p.AuthorizedDismissalActorsOnly } // GetCreateProtected returns the CreateProtected field. func (p *ProtectionChanges) GetCreateProtected() *CreateProtectedChanges { if p == nil { return nil } return p.CreateProtected } // GetDismissStaleReviewsOnPush returns the DismissStaleReviewsOnPush field. func (p *ProtectionChanges) GetDismissStaleReviewsOnPush() *DismissStaleReviewsOnPushChanges { if p == nil { return nil } return p.DismissStaleReviewsOnPush } // GetLinearHistoryRequirementEnforcementLevel returns the LinearHistoryRequirementEnforcementLevel field. func (p *ProtectionChanges) GetLinearHistoryRequirementEnforcementLevel() *LinearHistoryRequirementEnforcementLevelChanges { if p == nil { return nil } return p.LinearHistoryRequirementEnforcementLevel } // GetPullRequestReviewsEnforcementLevel returns the PullRequestReviewsEnforcementLevel field. func (p *ProtectionChanges) GetPullRequestReviewsEnforcementLevel() *PullRequestReviewsEnforcementLevelChanges { if p == nil { return nil } return p.PullRequestReviewsEnforcementLevel } // GetRequireCodeOwnerReview returns the RequireCodeOwnerReview field. func (p *ProtectionChanges) GetRequireCodeOwnerReview() *RequireCodeOwnerReviewChanges { if p == nil { return nil } return p.RequireCodeOwnerReview } // GetRequiredConversationResolutionLevel returns the RequiredConversationResolutionLevel field. func (p *ProtectionChanges) GetRequiredConversationResolutionLevel() *RequiredConversationResolutionLevelChanges { if p == nil { return nil } return p.RequiredConversationResolutionLevel } // GetRequiredDeploymentsEnforcementLevel returns the RequiredDeploymentsEnforcementLevel field. func (p *ProtectionChanges) GetRequiredDeploymentsEnforcementLevel() *RequiredDeploymentsEnforcementLevelChanges { if p == nil { return nil } return p.RequiredDeploymentsEnforcementLevel } // GetRequiredStatusChecks returns the RequiredStatusChecks field. func (p *ProtectionChanges) GetRequiredStatusChecks() *RequiredStatusChecksChanges { if p == nil { return nil } return p.RequiredStatusChecks } // GetRequiredStatusChecksEnforcementLevel returns the RequiredStatusChecksEnforcementLevel field. func (p *ProtectionChanges) GetRequiredStatusChecksEnforcementLevel() *RequiredStatusChecksEnforcementLevelChanges { if p == nil { return nil } return p.RequiredStatusChecksEnforcementLevel } // GetSignatureRequirementEnforcementLevel returns the SignatureRequirementEnforcementLevel field. func (p *ProtectionChanges) GetSignatureRequirementEnforcementLevel() *SignatureRequirementEnforcementLevelChanges { if p == nil { return nil } return p.SignatureRequirementEnforcementLevel } // 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 } // GetAllowForkSyncing returns the AllowForkSyncing field if it's non-nil, zero value otherwise. func (p *ProtectionRequest) GetAllowForkSyncing() bool { if p == nil || p.AllowForkSyncing == nil { return false } return *p.AllowForkSyncing } // GetBlockCreations returns the BlockCreations field if it's non-nil, zero value otherwise. func (p *ProtectionRequest) GetBlockCreations() bool { if p == nil || p.BlockCreations == nil { return false } return *p.BlockCreations } // GetLockBranch returns the LockBranch field if it's non-nil, zero value otherwise. func (p *ProtectionRequest) GetLockBranch() bool { if p == nil || p.LockBranch == nil { return false } return *p.LockBranch } // 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 } // GetPreventSelfReview returns the PreventSelfReview field if it's non-nil, zero value otherwise. func (p *ProtectionRule) GetPreventSelfReview() bool { if p == nil || p.PreventSelfReview == nil { return false } return *p.PreventSelfReview } // 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 } // GetOrg returns the Org field. func (p *PublicEvent) GetOrg() *Organization { if p == nil { return nil } return p.Org } // 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() Timestamp { if p == nil || p.ClosedAt == nil { return Timestamp{} } 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() Timestamp { if p == nil || p.CreatedAt == nil { return Timestamp{} } 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() Timestamp { if p == nil || p.MergedAt == nil { return Timestamp{} } 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() 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 *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() Timestamp { if p == nil || p.CreatedAt == nil { return Timestamp{} } 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 } // GetSubjectType returns the SubjectType field if it's non-nil, zero value otherwise. func (p *PullRequestComment) GetSubjectType() string { if p == nil || p.SubjectType == nil { return "" } return *p.SubjectType } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (p *PullRequestComment) 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 *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 } // GetPerformedViaGithubApp returns the PerformedViaGithubApp field. func (p *PullRequestEvent) GetPerformedViaGithubApp() *App { if p == nil { return nil } return p.PerformedViaGithubApp } // 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 } // GetMergedAt returns the MergedAt field if it's non-nil, zero value otherwise. func (p *PullRequestLinks) GetMergedAt() Timestamp { if p == nil || p.MergedAt == nil { return Timestamp{} } return *p.MergedAt } // 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() Timestamp { if p == nil || p.SubmittedAt == nil { return Timestamp{} } 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 } // GetOrg returns the Org field. func (p *PullRequestReviewCommentEvent) GetOrg() *Organization { if p == nil { return nil } return p.Org } // 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 } // GetBypassPullRequestAllowances returns the BypassPullRequestAllowances field. func (p *PullRequestReviewsEnforcement) GetBypassPullRequestAllowances() *BypassPullRequestAllowances { if p == nil { return nil } return p.BypassPullRequestAllowances } // GetDismissalRestrictions returns the DismissalRestrictions field. func (p *PullRequestReviewsEnforcement) GetDismissalRestrictions() *DismissalRestrictions { if p == nil { return nil } return p.DismissalRestrictions } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (p *PullRequestReviewsEnforcementLevelChanges) GetFrom() string { if p == nil || p.From == nil { return "" } return *p.From } // GetBypassPullRequestAllowancesRequest returns the BypassPullRequestAllowancesRequest field. func (p *PullRequestReviewsEnforcementRequest) GetBypassPullRequestAllowancesRequest() *BypassPullRequestAllowancesRequest { if p == nil { return nil } return p.BypassPullRequestAllowancesRequest } // GetDismissalRestrictionsRequest returns the DismissalRestrictionsRequest field. func (p *PullRequestReviewsEnforcementRequest) GetDismissalRestrictionsRequest() *DismissalRestrictionsRequest { if p == nil { return nil } return p.DismissalRestrictionsRequest } // GetRequireLastPushApproval returns the RequireLastPushApproval field if it's non-nil, zero value otherwise. func (p *PullRequestReviewsEnforcementRequest) GetRequireLastPushApproval() bool { if p == nil || p.RequireLastPushApproval == nil { return false } return *p.RequireLastPushApproval } // GetBypassPullRequestAllowancesRequest returns the BypassPullRequestAllowancesRequest field. func (p *PullRequestReviewsEnforcementUpdate) GetBypassPullRequestAllowancesRequest() *BypassPullRequestAllowancesRequest { if p == nil { return nil } return p.BypassPullRequestAllowancesRequest } // 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 } // GetRequireCodeOwnerReviews returns the RequireCodeOwnerReviews field if it's non-nil, zero value otherwise. func (p *PullRequestReviewsEnforcementUpdate) GetRequireCodeOwnerReviews() bool { if p == nil || p.RequireCodeOwnerReviews == nil { return false } return *p.RequireCodeOwnerReviews } // GetRequireLastPushApproval returns the RequireLastPushApproval field if it's non-nil, zero value otherwise. func (p *PullRequestReviewsEnforcementUpdate) GetRequireLastPushApproval() bool { if p == nil || p.RequireLastPushApproval == nil { return false } return *p.RequireLastPushApproval } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (p *PullRequestReviewThreadEvent) GetAction() string { if p == nil || p.Action == nil { return "" } return *p.Action } // GetInstallation returns the Installation field. func (p *PullRequestReviewThreadEvent) GetInstallation() *Installation { if p == nil { return nil } return p.Installation } // GetOrg returns the Org field. func (p *PullRequestReviewThreadEvent) GetOrg() *Organization { if p == nil { return nil } return p.Org } // GetPullRequest returns the PullRequest field. func (p *PullRequestReviewThreadEvent) GetPullRequest() *PullRequest { if p == nil { return nil } return p.PullRequest } // GetRepo returns the Repo field. func (p *PullRequestReviewThreadEvent) GetRepo() *Repository { if p == nil { return nil } return p.Repo } // GetSender returns the Sender field. func (p *PullRequestReviewThreadEvent) GetSender() *User { if p == nil { return nil } return p.Sender } // GetThread returns the Thread field. func (p *PullRequestReviewThreadEvent) GetThread() *PullRequestThread { if p == nil { return nil } return p.Thread } // 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 } // GetPerformedViaGithubApp returns the PerformedViaGithubApp field. func (p *PullRequestTargetEvent) GetPerformedViaGithubApp() *App { if p == nil { return nil } return p.PerformedViaGithubApp } // 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 } // GetID returns the ID field if it's non-nil, zero value otherwise. func (p *PullRequestThread) 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 *PullRequestThread) GetNodeID() string { if p == nil || p.NodeID == nil { return "" } return *p.NodeID } // 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 } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (p *PushEvent) 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 *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 } // GetCommits returns the Commits slice if it's non-nil, nil otherwise. func (p *PushEvent) GetCommits() []*HeadCommit { if p == nil || p.Commits == nil { return nil } return p.Commits } // 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 } // GetOrganization returns the Organization field. func (p *PushEvent) GetOrganization() *Organization { if p == nil { return nil } return p.Organization } // GetPusher returns the Pusher field. func (p *PushEvent) GetPusher() *CommitAuthor { 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 } // GetCustomProperties returns the CustomProperties map if it's non-nil, an empty map otherwise. func (p *PushEventRepository) GetCustomProperties() map[string]string { if p == nil || p.CustomProperties == nil { return map[string]string{} } return p.CustomProperties } // 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 } // GetActionsRunnerRegistration returns the ActionsRunnerRegistration field. func (r *RateLimits) GetActionsRunnerRegistration() *Rate { if r == nil { return nil } return r.ActionsRunnerRegistration } // GetCodeScanningUpload returns the CodeScanningUpload field. func (r *RateLimits) GetCodeScanningUpload() *Rate { if r == nil { return nil } return r.CodeScanningUpload } // GetCodeSearch returns the CodeSearch field. func (r *RateLimits) GetCodeSearch() *Rate { if r == nil { return nil } return r.CodeSearch } // GetCore returns the Core field. func (r *RateLimits) GetCore() *Rate { if r == nil { return nil } return r.Core } // GetDependencySnapshots returns the DependencySnapshots field. func (r *RateLimits) GetDependencySnapshots() *Rate { if r == nil { return nil } return r.DependencySnapshots } // GetGraphQL returns the GraphQL field. func (r *RateLimits) GetGraphQL() *Rate { if r == nil { return nil } return r.GraphQL } // GetIntegrationManifest returns the IntegrationManifest field. func (r *RateLimits) GetIntegrationManifest() *Rate { if r == nil { return nil } return r.IntegrationManifest } // GetSCIM returns the SCIM field. func (r *RateLimits) GetSCIM() *Rate { if r == nil { return nil } return r.SCIM } // GetSearch returns the Search field. func (r *RateLimits) GetSearch() *Rate { if r == nil { return nil } return r.Search } // GetSourceImport returns the SourceImport field. func (r *RateLimits) GetSourceImport() *Rate { if r == nil { return nil } return r.SourceImport } // 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 } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (r *ReferencedWorkflow) GetPath() string { if r == nil || r.Path == nil { return "" } return *r.Path } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (r *ReferencedWorkflow) GetRef() string { if r == nil || r.Ref == nil { return "" } return *r.Ref } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (r *ReferencedWorkflow) GetSHA() string { if r == nil || r.SHA == nil { return "" } return *r.SHA } // 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 } // GetOrg returns the Org field. func (r *ReleaseEvent) GetOrg() *Organization { if r == nil { return nil } return r.Org } // 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 } // GetLogin returns the Login field if it's non-nil, zero value otherwise. func (r *RepoAdvisoryCredit) GetLogin() string { if r == nil || r.Login == nil { return "" } return *r.Login } // GetType returns the Type field if it's non-nil, zero value otherwise. func (r *RepoAdvisoryCredit) GetType() string { if r == nil || r.Type == nil { return "" } return *r.Type } // GetState returns the State field if it's non-nil, zero value otherwise. func (r *RepoAdvisoryCreditDetailed) GetState() string { if r == nil || r.State == nil { return "" } return *r.State } // GetType returns the Type field if it's non-nil, zero value otherwise. func (r *RepoAdvisoryCreditDetailed) GetType() string { if r == nil || r.Type == nil { return "" } return *r.Type } // GetUser returns the User field. func (r *RepoAdvisoryCreditDetailed) GetUser() *User { if r == nil { return nil } return r.User } // GetDownloadLocation returns the DownloadLocation field if it's non-nil, zero value otherwise. func (r *RepoDependencies) GetDownloadLocation() string { if r == nil || r.DownloadLocation == nil { return "" } return *r.DownloadLocation } // GetFilesAnalyzed returns the FilesAnalyzed field if it's non-nil, zero value otherwise. func (r *RepoDependencies) GetFilesAnalyzed() bool { if r == nil || r.FilesAnalyzed == nil { return false } return *r.FilesAnalyzed } // GetLicenseConcluded returns the LicenseConcluded field if it's non-nil, zero value otherwise. func (r *RepoDependencies) GetLicenseConcluded() string { if r == nil || r.LicenseConcluded == nil { return "" } return *r.LicenseConcluded } // GetLicenseDeclared returns the LicenseDeclared field if it's non-nil, zero value otherwise. func (r *RepoDependencies) GetLicenseDeclared() string { if r == nil || r.LicenseDeclared == nil { return "" } return *r.LicenseDeclared } // GetName returns the Name field if it's non-nil, zero value otherwise. func (r *RepoDependencies) GetName() string { if r == nil || r.Name == nil { return "" } return *r.Name } // GetSPDXID returns the SPDXID field if it's non-nil, zero value otherwise. func (r *RepoDependencies) GetSPDXID() string { if r == nil || r.SPDXID == nil { return "" } return *r.SPDXID } // GetVersionInfo returns the VersionInfo field if it's non-nil, zero value otherwise. func (r *RepoDependencies) GetVersionInfo() string { if r == nil || r.VersionInfo == nil { return "" } return *r.VersionInfo } // GetBranch returns the Branch field if it's non-nil, zero value otherwise. func (r *RepoMergeUpstreamRequest) GetBranch() string { if r == nil || r.Branch == nil { return "" } return *r.Branch } // GetBaseBranch returns the BaseBranch field if it's non-nil, zero value otherwise. func (r *RepoMergeUpstreamResult) GetBaseBranch() string { if r == nil || r.BaseBranch == nil { return "" } return *r.BaseBranch } // GetMergeType returns the MergeType field if it's non-nil, zero value otherwise. func (r *RepoMergeUpstreamResult) GetMergeType() string { if r == nil || r.MergeType == nil { return "" } return *r.MergeType } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (r *RepoMergeUpstreamResult) GetMessage() string { if r == nil || r.Message == nil { return "" } return *r.Message } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (r *RepoName) GetFrom() string { if r == nil || r.From == nil { return "" } return *r.From } // GetBadgeURL returns the BadgeURL field if it's non-nil, zero value otherwise. func (r *RepoRequiredWorkflow) GetBadgeURL() string { if r == nil || r.BadgeURL == nil { return "" } return *r.BadgeURL } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (r *RepoRequiredWorkflow) 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 *RepoRequiredWorkflow) 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 *RepoRequiredWorkflow) 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 *RepoRequiredWorkflow) 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 *RepoRequiredWorkflow) 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 *RepoRequiredWorkflow) GetPath() string { if r == nil || r.Path == nil { return "" } return *r.Path } // GetSourceRepository returns the SourceRepository field. func (r *RepoRequiredWorkflow) GetSourceRepository() *Repository { if r == nil { return nil } return r.SourceRepository } // GetState returns the State field if it's non-nil, zero value otherwise. func (r *RepoRequiredWorkflow) 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 *RepoRequiredWorkflow) 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 *RepoRequiredWorkflow) GetURL() string { if r == nil || r.URL == nil { return "" } return *r.URL } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (r *RepoRequiredWorkflows) GetTotalCount() int { if r == nil || r.TotalCount == nil { return 0 } return *r.TotalCount } // 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 } // GetAllowAutoMerge returns the AllowAutoMerge field if it's non-nil, zero value otherwise. func (r *Repository) GetAllowAutoMerge() bool { if r == nil || r.AllowAutoMerge == nil { return false } return *r.AllowAutoMerge } // GetAllowForking returns the AllowForking field if it's non-nil, zero value otherwise. func (r *Repository) GetAllowForking() bool { if r == nil || r.AllowForking == nil { return false } return *r.AllowForking } // 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 } // GetAllowUpdateBranch returns the AllowUpdateBranch field if it's non-nil, zero value otherwise. func (r *Repository) GetAllowUpdateBranch() bool { if r == nil || r.AllowUpdateBranch == nil { return false } return *r.AllowUpdateBranch } // 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 } // GetCustomProperties returns the CustomProperties map if it's non-nil, an empty map otherwise. func (r *Repository) GetCustomProperties() map[string]string { if r == nil || r.CustomProperties == nil { return map[string]string{} } return r.CustomProperties } // 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 } // GetHasDiscussions returns the HasDiscussions field if it's non-nil, zero value otherwise. func (r *Repository) GetHasDiscussions() bool { if r == nil || r.HasDiscussions == nil { return false } return *r.HasDiscussions } // 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 } // GetMergeCommitMessage returns the MergeCommitMessage field if it's non-nil, zero value otherwise. func (r *Repository) GetMergeCommitMessage() string { if r == nil || r.MergeCommitMessage == nil { return "" } return *r.MergeCommitMessage } // GetMergeCommitTitle returns the MergeCommitTitle field if it's non-nil, zero value otherwise. func (r *Repository) GetMergeCommitTitle() string { if r == nil || r.MergeCommitTitle == nil { return "" } return *r.MergeCommitTitle } // 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 } // GetRoleName returns the RoleName field if it's non-nil, zero value otherwise. func (r *Repository) GetRoleName() string { if r == nil || r.RoleName == nil { return "" } return *r.RoleName } // GetSecurityAndAnalysis returns the SecurityAndAnalysis field. func (r *Repository) GetSecurityAndAnalysis() *SecurityAndAnalysis { if r == nil { return nil } return r.SecurityAndAnalysis } // 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 } // GetSquashMergeCommitMessage returns the SquashMergeCommitMessage field if it's non-nil, zero value otherwise. func (r *Repository) GetSquashMergeCommitMessage() string { if r == nil || r.SquashMergeCommitMessage == nil { return "" } return *r.SquashMergeCommitMessage } // GetSquashMergeCommitTitle returns the SquashMergeCommitTitle field if it's non-nil, zero value otherwise. func (r *Repository) GetSquashMergeCommitTitle() string { if r == nil || r.SquashMergeCommitTitle == nil { return "" } return *r.SquashMergeCommitTitle } // 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 } // GetUseSquashPRTitleAsDefault returns the UseSquashPRTitleAsDefault field if it's non-nil, zero value otherwise. func (r *Repository) GetUseSquashPRTitleAsDefault() bool { if r == nil || r.UseSquashPRTitleAsDefault == nil { return false } return *r.UseSquashPRTitleAsDefault } // 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 } // GetWebCommitSignoffRequired returns the WebCommitSignoffRequired field if it's non-nil, zero value otherwise. func (r *Repository) GetWebCommitSignoffRequired() bool { if r == nil || r.WebCommitSignoffRequired == nil { return false } return *r.WebCommitSignoffRequired } // GetAccessLevel returns the AccessLevel field if it's non-nil, zero value otherwise. func (r *RepositoryActionsAccessLevel) GetAccessLevel() string { if r == nil || r.AccessLevel == nil { return "" } return *r.AccessLevel } // GetAdvancedSecurityCommitters returns the AdvancedSecurityCommitters field if it's non-nil, zero value otherwise. func (r *RepositoryActiveCommitters) GetAdvancedSecurityCommitters() int { if r == nil || r.AdvancedSecurityCommitters == nil { return 0 } return *r.AdvancedSecurityCommitters } // GetName returns the Name field if it's non-nil, zero value otherwise. func (r *RepositoryActiveCommitters) GetName() string { if r == nil || r.Name == nil { return "" } return *r.Name } // 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() 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 *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() 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 *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 } // GetSubmoduleGitURL returns the SubmoduleGitURL field if it's non-nil, zero value otherwise. func (r *RepositoryContent) GetSubmoduleGitURL() string { if r == nil || r.SubmoduleGitURL == nil { return "" } return *r.SubmoduleGitURL } // 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 } // GetChanges returns the Changes field. func (r *RepositoryEvent) GetChanges() *EditChange { if r == nil { return nil } return r.Changes } // 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 } // GetOrg returns the Org field. func (r *RepositoryImportEvent) GetOrg() *Organization { if r == nil { return nil } return r.Org } // GetRepo returns the Repo field. func (r *RepositoryImportEvent) GetRepo() *Repository { if r == nil { return nil } return r.Repo } // GetSender returns the Sender field. func (r *RepositoryImportEvent) GetSender() *User { if r == nil { return nil } return r.Sender } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (r *RepositoryImportEvent) GetStatus() string { if r == nil || r.Status == nil { return "" } return *r.Status } // 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 } // GetGenerateReleaseNotes returns the GenerateReleaseNotes field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetGenerateReleaseNotes() bool { if r == nil || r.GenerateReleaseNotes == nil { return false } return *r.GenerateReleaseNotes } // 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 } // GetMakeLatest returns the MakeLatest field if it's non-nil, zero value otherwise. func (r *RepositoryRelease) GetMakeLatest() string { if r == nil || r.MakeLatest == nil { return "" } return *r.MakeLatest } // 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 } // GetParameters returns the Parameters field if it's non-nil, zero value otherwise. func (r *RepositoryRule) GetParameters() json.RawMessage { if r == nil || r.Parameters == nil { return json.RawMessage{} } return *r.Parameters } // 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 } // GetInstallation returns the Installation field. func (r *RepositoryVulnerabilityAlertEvent) GetInstallation() *Installation { if r == nil { return nil } return r.Installation } // GetOrg returns the Org field. func (r *RepositoryVulnerabilityAlertEvent) GetOrg() *Organization { if r == nil { return nil } return r.Org } // GetRepository returns the Repository field. func (r *RepositoryVulnerabilityAlertEvent) GetRepository() *Repository { if r == nil { return nil } return r.Repository } // GetSender returns the Sender field. func (r *RepositoryVulnerabilityAlertEvent) GetSender() *User { if r == nil { return nil } return r.Sender } // 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() Timestamp { if r == nil || r.CreatedAt == nil { return Timestamp{} } 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() 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 *RepoStatus) GetURL() string { if r == nil || r.URL == nil { return "" } return *r.URL } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (r *RequireCodeOwnerReviewChanges) GetFrom() bool { if r == nil || r.From == nil { return false } return *r.From } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (r *RequiredConversationResolutionLevelChanges) GetFrom() string { if r == nil || r.From == nil { return "" } return *r.From } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (r *RequiredDeploymentsEnforcementLevelChanges) GetFrom() string { if r == nil || r.From == nil { return "" } return *r.From } // 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 } // GetAppID returns the AppID field if it's non-nil, zero value otherwise. func (r *RequiredStatusCheck) GetAppID() int64 { if r == nil || r.AppID == nil { return 0 } return *r.AppID } // GetChecks returns the Checks field if it's non-nil, zero value otherwise. func (r *RequiredStatusChecks) GetChecks() []*RequiredStatusCheck { if r == nil || r.Checks == nil { return nil } return *r.Checks } // GetContexts returns the Contexts field if it's non-nil, zero value otherwise. func (r *RequiredStatusChecks) GetContexts() []string { if r == nil || r.Contexts == nil { return nil } return *r.Contexts } // GetContextsURL returns the ContextsURL field if it's non-nil, zero value otherwise. func (r *RequiredStatusChecks) GetContextsURL() string { if r == nil || r.ContextsURL == nil { return "" } return *r.ContextsURL } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (r *RequiredStatusChecks) GetURL() string { if r == nil || r.URL == nil { return "" } return *r.URL } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (r *RequiredStatusChecksEnforcementLevelChanges) GetFrom() string { if r == nil || r.From == nil { return "" } return *r.From } // 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 } // GetTotalCount returns the TotalCount field if it's non-nil, zero value otherwise. func (r *RequiredWorkflowSelectedRepos) GetTotalCount() int { if r == nil || r.TotalCount == nil { return 0 } return *r.TotalCount } // 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 } // GetReason returns the Reason field if it's non-nil, zero value otherwise. func (r *ReviewPersonalAccessTokenRequestOptions) GetReason() string { if r == nil || r.Reason == nil { return "" } return *r.Reason } // 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 } // GetName returns the Name field if it's non-nil, zero value otherwise. func (r *RulePatternParameters) GetName() string { if r == nil || r.Name == nil { return "" } return *r.Name } // GetNegate returns the Negate field if it's non-nil, zero value otherwise. func (r *RulePatternParameters) GetNegate() bool { if r == nil || r.Negate == nil { return false } return *r.Negate } // GetIntegrationID returns the IntegrationID field if it's non-nil, zero value otherwise. func (r *RuleRequiredStatusChecks) GetIntegrationID() int64 { if r == nil || r.IntegrationID == nil { return 0 } return *r.IntegrationID } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (r *RuleRequiredWorkflow) GetRef() string { if r == nil || r.Ref == nil { return "" } return *r.Ref } // GetRepositoryID returns the RepositoryID field if it's non-nil, zero value otherwise. func (r *RuleRequiredWorkflow) GetRepositoryID() int64 { if r == nil || r.RepositoryID == nil { return 0 } return *r.RepositoryID } // GetSha returns the Sha field if it's non-nil, zero value otherwise. func (r *RuleRequiredWorkflow) GetSha() string { if r == nil || r.Sha == nil { return "" } return *r.Sha } // GetConditions returns the Conditions field. func (r *Ruleset) GetConditions() *RulesetConditions { if r == nil { return nil } return r.Conditions } // GetID returns the ID field if it's non-nil, zero value otherwise. func (r *Ruleset) GetID() int64 { if r == nil || r.ID == nil { return 0 } return *r.ID } // GetLinks returns the Links field. func (r *Ruleset) GetLinks() *RulesetLinks { if r == nil { return nil } return r.Links } // GetNodeID returns the NodeID field if it's non-nil, zero value otherwise. func (r *Ruleset) GetNodeID() string { if r == nil || r.NodeID == nil { return "" } return *r.NodeID } // GetSourceType returns the SourceType field if it's non-nil, zero value otherwise. func (r *Ruleset) GetSourceType() string { if r == nil || r.SourceType == nil { return "" } return *r.SourceType } // GetTarget returns the Target field if it's non-nil, zero value otherwise. func (r *Ruleset) GetTarget() string { if r == nil || r.Target == nil { return "" } return *r.Target } // GetRefName returns the RefName field. func (r *RulesetConditions) GetRefName() *RulesetRefConditionParameters { if r == nil { return nil } return r.RefName } // GetRepositoryID returns the RepositoryID field. func (r *RulesetConditions) GetRepositoryID() *RulesetRepositoryIDsConditionParameters { if r == nil { return nil } return r.RepositoryID } // GetRepositoryName returns the RepositoryName field. func (r *RulesetConditions) GetRepositoryName() *RulesetRepositoryNamesConditionParameters { if r == nil { return nil } return r.RepositoryName } // GetHRef returns the HRef field if it's non-nil, zero value otherwise. func (r *RulesetLink) GetHRef() string { if r == nil || r.HRef == nil { return "" } return *r.HRef } // GetSelf returns the Self field. func (r *RulesetLinks) GetSelf() *RulesetLink { if r == nil { return nil } return r.Self } // GetProtected returns the Protected field if it's non-nil, zero value otherwise. func (r *RulesetRepositoryNamesConditionParameters) GetProtected() bool { if r == nil || r.Protected == nil { return false } return *r.Protected } // 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 } // GetRestrictedToWorkflows returns the RestrictedToWorkflows field if it's non-nil, zero value otherwise. func (r *RunnerGroup) GetRestrictedToWorkflows() bool { if r == nil || r.RestrictedToWorkflows == nil { return false } return *r.RestrictedToWorkflows } // 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 } // GetWorkflowRestrictionsReadOnly returns the WorkflowRestrictionsReadOnly field if it's non-nil, zero value otherwise. func (r *RunnerGroup) GetWorkflowRestrictionsReadOnly() bool { if r == nil || r.WorkflowRestrictionsReadOnly == nil { return false } return *r.WorkflowRestrictionsReadOnly } // 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 } // GetCheckoutURI returns the CheckoutURI field if it's non-nil, zero value otherwise. func (s *SarifAnalysis) GetCheckoutURI() string { if s == nil || s.CheckoutURI == nil { return "" } return *s.CheckoutURI } // GetCommitSHA returns the CommitSHA field if it's non-nil, zero value otherwise. func (s *SarifAnalysis) GetCommitSHA() string { if s == nil || s.CommitSHA == nil { return "" } return *s.CommitSHA } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (s *SarifAnalysis) GetRef() string { if s == nil || s.Ref == nil { return "" } return *s.Ref } // GetSarif returns the Sarif field if it's non-nil, zero value otherwise. func (s *SarifAnalysis) GetSarif() string { if s == nil || s.Sarif == nil { return "" } return *s.Sarif } // GetStartedAt returns the StartedAt field if it's non-nil, zero value otherwise. func (s *SarifAnalysis) GetStartedAt() Timestamp { if s == nil || s.StartedAt == nil { return Timestamp{} } return *s.StartedAt } // GetToolName returns the ToolName field if it's non-nil, zero value otherwise. func (s *SarifAnalysis) GetToolName() string { if s == nil || s.ToolName == nil { return "" } return *s.ToolName } // GetID returns the ID field if it's non-nil, zero value otherwise. func (s *SarifID) GetID() string { if s == nil || s.ID == nil { return "" } return *s.ID } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (s *SarifID) GetURL() string { if s == nil || s.URL == nil { return "" } return *s.URL } // GetAnalysesURL returns the AnalysesURL field if it's non-nil, zero value otherwise. func (s *SARIFUpload) GetAnalysesURL() string { if s == nil || s.AnalysesURL == nil { return "" } return *s.AnalysesURL } // GetProcessingStatus returns the ProcessingStatus field if it's non-nil, zero value otherwise. func (s *SARIFUpload) GetProcessingStatus() string { if s == nil || s.ProcessingStatus == nil { return "" } return *s.ProcessingStatus } // GetSBOM returns the SBOM field. func (s *SBOM) GetSBOM() *SBOMInfo { if s == nil { return nil } return s.SBOM } // GetCreationInfo returns the CreationInfo field. func (s *SBOMInfo) GetCreationInfo() *CreationInfo { if s == nil { return nil } return s.CreationInfo } // GetDataLicense returns the DataLicense field if it's non-nil, zero value otherwise. func (s *SBOMInfo) GetDataLicense() string { if s == nil || s.DataLicense == nil { return "" } return *s.DataLicense } // GetDocumentNamespace returns the DocumentNamespace field if it's non-nil, zero value otherwise. func (s *SBOMInfo) GetDocumentNamespace() string { if s == nil || s.DocumentNamespace == nil { return "" } return *s.DocumentNamespace } // GetName returns the Name field if it's non-nil, zero value otherwise. func (s *SBOMInfo) GetName() string { if s == nil || s.Name == nil { return "" } return *s.Name } // GetSPDXID returns the SPDXID field if it's non-nil, zero value otherwise. func (s *SBOMInfo) GetSPDXID() string { if s == nil || s.SPDXID == nil { return "" } return *s.SPDXID } // GetSPDXVersion returns the SPDXVersion field if it's non-nil, zero value otherwise. func (s *SBOMInfo) GetSPDXVersion() string { if s == nil || s.SPDXVersion == nil { return "" } return *s.SPDXVersion } // GetAnalysisKey returns the AnalysisKey field if it's non-nil, zero value otherwise. func (s *ScanningAnalysis) GetAnalysisKey() string { if s == nil || s.AnalysisKey == nil { return "" } return *s.AnalysisKey } // GetCategory returns the Category field if it's non-nil, zero value otherwise. func (s *ScanningAnalysis) GetCategory() string { if s == nil || s.Category == nil { return "" } return *s.Category } // GetCommitSHA returns the CommitSHA field if it's non-nil, zero value otherwise. func (s *ScanningAnalysis) GetCommitSHA() string { if s == nil || s.CommitSHA == nil { return "" } return *s.CommitSHA } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (s *ScanningAnalysis) GetCreatedAt() Timestamp { if s == nil || s.CreatedAt == nil { return Timestamp{} } return *s.CreatedAt } // GetDeletable returns the Deletable field if it's non-nil, zero value otherwise. func (s *ScanningAnalysis) GetDeletable() bool { if s == nil || s.Deletable == nil { return false } return *s.Deletable } // GetEnvironment returns the Environment field if it's non-nil, zero value otherwise. func (s *ScanningAnalysis) GetEnvironment() string { if s == nil || s.Environment == nil { return "" } return *s.Environment } // GetError returns the Error field if it's non-nil, zero value otherwise. func (s *ScanningAnalysis) GetError() string { if s == nil || s.Error == nil { return "" } return *s.Error } // GetID returns the ID field if it's non-nil, zero value otherwise. func (s *ScanningAnalysis) GetID() int64 { if s == nil || s.ID == nil { return 0 } return *s.ID } // GetRef returns the Ref field if it's non-nil, zero value otherwise. func (s *ScanningAnalysis) GetRef() string { if s == nil || s.Ref == nil { return "" } return *s.Ref } // GetResultsCount returns the ResultsCount field if it's non-nil, zero value otherwise. func (s *ScanningAnalysis) GetResultsCount() int { if s == nil || s.ResultsCount == nil { return 0 } return *s.ResultsCount } // GetRulesCount returns the RulesCount field if it's non-nil, zero value otherwise. func (s *ScanningAnalysis) GetRulesCount() int { if s == nil || s.RulesCount == nil { return 0 } return *s.RulesCount } // GetSarifID returns the SarifID field if it's non-nil, zero value otherwise. func (s *ScanningAnalysis) GetSarifID() string { if s == nil || s.SarifID == nil { return "" } return *s.SarifID } // GetTool returns the Tool field. func (s *ScanningAnalysis) GetTool() *Tool { if s == nil { return nil } return s.Tool } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (s *ScanningAnalysis) GetURL() string { if s == nil || s.URL == nil { return "" } return *s.URL } // GetWarning returns the Warning field if it's non-nil, zero value otherwise. func (s *ScanningAnalysis) GetWarning() string { if s == nil || s.Warning == nil { return "" } return *s.Warning } // GetCreated returns the Created field if it's non-nil, zero value otherwise. func (s *SCIMMeta) GetCreated() Timestamp { if s == nil || s.Created == nil { return Timestamp{} } return *s.Created } // GetLastModified returns the LastModified field if it's non-nil, zero value otherwise. func (s *SCIMMeta) GetLastModified() Timestamp { if s == nil || s.LastModified == nil { return Timestamp{} } return *s.LastModified } // GetLocation returns the Location field if it's non-nil, zero value otherwise. func (s *SCIMMeta) GetLocation() string { if s == nil || s.Location == nil { return "" } return *s.Location } // GetResourceType returns the ResourceType field if it's non-nil, zero value otherwise. func (s *SCIMMeta) GetResourceType() string { if s == nil || s.ResourceType == nil { return "" } return *s.ResourceType } // GetItemsPerPage returns the ItemsPerPage field if it's non-nil, zero value otherwise. func (s *SCIMProvisionedIdentities) GetItemsPerPage() int { if s == nil || s.ItemsPerPage == nil { return 0 } return *s.ItemsPerPage } // GetStartIndex returns the StartIndex field if it's non-nil, zero value otherwise. func (s *SCIMProvisionedIdentities) GetStartIndex() int { if s == nil || s.StartIndex == nil { return 0 } return *s.StartIndex } // GetTotalResults returns the TotalResults field if it's non-nil, zero value otherwise. func (s *SCIMProvisionedIdentities) GetTotalResults() int { if s == nil || s.TotalResults == nil { return 0 } return *s.TotalResults } // GetActive returns the Active field if it's non-nil, zero value otherwise. func (s *SCIMUserAttributes) GetActive() bool { if s == nil || s.Active == nil { return false } return *s.Active } // GetDisplayName returns the DisplayName field if it's non-nil, zero value otherwise. func (s *SCIMUserAttributes) GetDisplayName() string { if s == nil || s.DisplayName == nil { return "" } return *s.DisplayName } // GetExternalID returns the ExternalID field if it's non-nil, zero value otherwise. func (s *SCIMUserAttributes) GetExternalID() string { if s == nil || s.ExternalID == nil { return "" } return *s.ExternalID } // GetID returns the ID field if it's non-nil, zero value otherwise. func (s *SCIMUserAttributes) GetID() string { if s == nil || s.ID == nil { return "" } return *s.ID } // GetMeta returns the Meta field. func (s *SCIMUserAttributes) GetMeta() *SCIMMeta { if s == nil { return nil } return s.Meta } // GetPrimary returns the Primary field if it's non-nil, zero value otherwise. func (s *SCIMUserEmail) GetPrimary() bool { if s == nil || s.Primary == nil { return false } return *s.Primary } // GetType returns the Type field if it's non-nil, zero value otherwise. func (s *SCIMUserEmail) GetType() string { if s == nil || s.Type == nil { return "" } return *s.Type } // GetFormatted returns the Formatted field if it's non-nil, zero value otherwise. func (s *SCIMUserName) GetFormatted() string { if s == nil || s.Formatted == nil { return "" } return *s.Formatted } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (s *SecretScanning) GetStatus() string { if s == nil || s.Status == nil { return "" } return *s.Status } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (s *SecretScanningAlert) GetCreatedAt() Timestamp { if s == nil || s.CreatedAt == nil { return Timestamp{} } return *s.CreatedAt } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (s *SecretScanningAlert) GetHTMLURL() string { if s == nil || s.HTMLURL == nil { return "" } return *s.HTMLURL } // GetLocationsURL returns the LocationsURL field if it's non-nil, zero value otherwise. func (s *SecretScanningAlert) GetLocationsURL() string { if s == nil || s.LocationsURL == nil { return "" } return *s.LocationsURL } // GetNumber returns the Number field if it's non-nil, zero value otherwise. func (s *SecretScanningAlert) GetNumber() int { if s == nil || s.Number == nil { return 0 } return *s.Number } // GetPushProtectionBypassed returns the PushProtectionBypassed field if it's non-nil, zero value otherwise. func (s *SecretScanningAlert) GetPushProtectionBypassed() bool { if s == nil || s.PushProtectionBypassed == nil { return false } return *s.PushProtectionBypassed } // GetPushProtectionBypassedAt returns the PushProtectionBypassedAt field if it's non-nil, zero value otherwise. func (s *SecretScanningAlert) GetPushProtectionBypassedAt() Timestamp { if s == nil || s.PushProtectionBypassedAt == nil { return Timestamp{} } return *s.PushProtectionBypassedAt } // GetPushProtectionBypassedBy returns the PushProtectionBypassedBy field. func (s *SecretScanningAlert) GetPushProtectionBypassedBy() *User { if s == nil { return nil } return s.PushProtectionBypassedBy } // GetRepository returns the Repository field. func (s *SecretScanningAlert) GetRepository() *Repository { if s == nil { return nil } return s.Repository } // GetResolution returns the Resolution field if it's non-nil, zero value otherwise. func (s *SecretScanningAlert) GetResolution() string { if s == nil || s.Resolution == nil { return "" } return *s.Resolution } // GetResolutionComment returns the ResolutionComment field if it's non-nil, zero value otherwise. func (s *SecretScanningAlert) GetResolutionComment() string { if s == nil || s.ResolutionComment == nil { return "" } return *s.ResolutionComment } // GetResolvedAt returns the ResolvedAt field if it's non-nil, zero value otherwise. func (s *SecretScanningAlert) GetResolvedAt() Timestamp { if s == nil || s.ResolvedAt == nil { return Timestamp{} } return *s.ResolvedAt } // GetResolvedBy returns the ResolvedBy field. func (s *SecretScanningAlert) GetResolvedBy() *User { if s == nil { return nil } return s.ResolvedBy } // GetSecret returns the Secret field if it's non-nil, zero value otherwise. func (s *SecretScanningAlert) GetSecret() string { if s == nil || s.Secret == nil { return "" } return *s.Secret } // GetSecretType returns the SecretType field if it's non-nil, zero value otherwise. func (s *SecretScanningAlert) GetSecretType() string { if s == nil || s.SecretType == nil { return "" } return *s.SecretType } // GetSecretTypeDisplayName returns the SecretTypeDisplayName field if it's non-nil, zero value otherwise. func (s *SecretScanningAlert) GetSecretTypeDisplayName() string { if s == nil || s.SecretTypeDisplayName == nil { return "" } return *s.SecretTypeDisplayName } // GetState returns the State field if it's non-nil, zero value otherwise. func (s *SecretScanningAlert) GetState() string { if s == nil || s.State == nil { return "" } return *s.State } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (s *SecretScanningAlert) GetUpdatedAt() Timestamp { if s == nil || s.UpdatedAt == nil { return Timestamp{} } return *s.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (s *SecretScanningAlert) 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 *SecretScanningAlertEvent) GetAction() string { if s == nil || s.Action == nil { return "" } return *s.Action } // GetAlert returns the Alert field. func (s *SecretScanningAlertEvent) GetAlert() *SecretScanningAlert { if s == nil { return nil } return s.Alert } // GetEnterprise returns the Enterprise field. func (s *SecretScanningAlertEvent) GetEnterprise() *Enterprise { if s == nil { return nil } return s.Enterprise } // GetInstallation returns the Installation field. func (s *SecretScanningAlertEvent) GetInstallation() *Installation { if s == nil { return nil } return s.Installation } // GetOrganization returns the Organization field. func (s *SecretScanningAlertEvent) GetOrganization() *Organization { if s == nil { return nil } return s.Organization } // GetRepo returns the Repo field. func (s *SecretScanningAlertEvent) GetRepo() *Repository { if s == nil { return nil } return s.Repo } // GetSender returns the Sender field. func (s *SecretScanningAlertEvent) GetSender() *User { if s == nil { return nil } return s.Sender } // GetDetails returns the Details field. func (s *SecretScanningAlertLocation) GetDetails() *SecretScanningAlertLocationDetails { if s == nil { return nil } return s.Details } // GetType returns the Type field if it's non-nil, zero value otherwise. func (s *SecretScanningAlertLocation) GetType() string { if s == nil || s.Type == nil { return "" } return *s.Type } // GetBlobSHA returns the BlobSHA field if it's non-nil, zero value otherwise. func (s *SecretScanningAlertLocationDetails) GetBlobSHA() string { if s == nil || s.BlobSHA == nil { return "" } return *s.BlobSHA } // GetBlobURL returns the BlobURL field if it's non-nil, zero value otherwise. func (s *SecretScanningAlertLocationDetails) GetBlobURL() string { if s == nil || s.BlobURL == nil { return "" } return *s.BlobURL } // GetCommitSHA returns the CommitSHA field if it's non-nil, zero value otherwise. func (s *SecretScanningAlertLocationDetails) GetCommitSHA() string { if s == nil || s.CommitSHA == nil { return "" } return *s.CommitSHA } // GetCommitURL returns the CommitURL field if it's non-nil, zero value otherwise. func (s *SecretScanningAlertLocationDetails) GetCommitURL() string { if s == nil || s.CommitURL == nil { return "" } return *s.CommitURL } // GetEndColumn returns the EndColumn field if it's non-nil, zero value otherwise. func (s *SecretScanningAlertLocationDetails) GetEndColumn() int { if s == nil || s.EndColumn == nil { return 0 } return *s.EndColumn } // GetEndLine returns the EndLine field if it's non-nil, zero value otherwise. func (s *SecretScanningAlertLocationDetails) GetEndLine() int { if s == nil || s.EndLine == nil { return 0 } return *s.EndLine } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (s *SecretScanningAlertLocationDetails) GetPath() string { if s == nil || s.Path == nil { return "" } return *s.Path } // GetStartColumn returns the StartColumn field if it's non-nil, zero value otherwise. func (s *SecretScanningAlertLocationDetails) GetStartColumn() int { if s == nil || s.StartColumn == nil { return 0 } return *s.StartColumn } // GetStartline returns the Startline field if it's non-nil, zero value otherwise. func (s *SecretScanningAlertLocationDetails) GetStartline() int { if s == nil || s.Startline == nil { return 0 } return *s.Startline } // GetResolution returns the Resolution field if it's non-nil, zero value otherwise. func (s *SecretScanningAlertUpdateOptions) GetResolution() string { if s == nil || s.Resolution == nil { return "" } return *s.Resolution } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (s *SecretScanningPushProtection) GetStatus() string { if s == nil || s.Status == nil { return "" } return *s.Status } // GetStatus returns the Status field if it's non-nil, zero value otherwise. func (s *SecretScanningValidityChecks) GetStatus() string { if s == nil || s.Status == nil { return "" } return *s.Status } // GetAuthor returns the Author field. func (s *SecurityAdvisory) GetAuthor() *User { if s == nil { return nil } return s.Author } // GetClosedAt returns the ClosedAt field if it's non-nil, zero value otherwise. func (s *SecurityAdvisory) GetClosedAt() Timestamp { if s == nil || s.ClosedAt == nil { return Timestamp{} } return *s.ClosedAt } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (s *SecurityAdvisory) GetCreatedAt() Timestamp { if s == nil || s.CreatedAt == nil { return Timestamp{} } return *s.CreatedAt } // GetCVEID returns the CVEID field if it's non-nil, zero value otherwise. func (s *SecurityAdvisory) GetCVEID() string { if s == nil || s.CVEID == nil { return "" } return *s.CVEID } // GetCVSS returns the CVSS field. func (s *SecurityAdvisory) GetCVSS() *AdvisoryCVSS { if s == nil { return nil } return s.CVSS } // GetDescription returns the Description field if it's non-nil, zero value otherwise. func (s *SecurityAdvisory) GetDescription() string { if s == nil || s.Description == nil { return "" } return *s.Description } // GetGHSAID returns the GHSAID field if it's non-nil, zero value otherwise. func (s *SecurityAdvisory) GetGHSAID() string { if s == nil || s.GHSAID == nil { return "" } return *s.GHSAID } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (s *SecurityAdvisory) GetHTMLURL() string { if s == nil || s.HTMLURL == nil { return "" } return *s.HTMLURL } // GetPrivateFork returns the PrivateFork field. func (s *SecurityAdvisory) GetPrivateFork() *Repository { if s == nil { return nil } return s.PrivateFork } // GetPublishedAt returns the PublishedAt field if it's non-nil, zero value otherwise. func (s *SecurityAdvisory) GetPublishedAt() Timestamp { if s == nil || s.PublishedAt == nil { return Timestamp{} } return *s.PublishedAt } // GetPublisher returns the Publisher field. func (s *SecurityAdvisory) GetPublisher() *User { if s == nil { return nil } return s.Publisher } // GetSeverity returns the Severity field if it's non-nil, zero value otherwise. func (s *SecurityAdvisory) GetSeverity() string { if s == nil || s.Severity == nil { return "" } return *s.Severity } // GetState returns the State field if it's non-nil, zero value otherwise. func (s *SecurityAdvisory) GetState() string { if s == nil || s.State == nil { return "" } return *s.State } // GetSubmission returns the Submission field. func (s *SecurityAdvisory) GetSubmission() *SecurityAdvisorySubmission { if s == nil { return nil } return s.Submission } // GetSummary returns the Summary field if it's non-nil, zero value otherwise. func (s *SecurityAdvisory) GetSummary() string { if s == nil || s.Summary == nil { return "" } return *s.Summary } // GetUpdatedAt returns the UpdatedAt field if it's non-nil, zero value otherwise. func (s *SecurityAdvisory) GetUpdatedAt() Timestamp { if s == nil || s.UpdatedAt == nil { return Timestamp{} } return *s.UpdatedAt } // GetURL returns the URL field if it's non-nil, zero value otherwise. func (s *SecurityAdvisory) GetURL() string { if s == nil || s.URL == nil { return "" } return *s.URL } // GetWithdrawnAt returns the WithdrawnAt field if it's non-nil, zero value otherwise. func (s *SecurityAdvisory) GetWithdrawnAt() Timestamp { if s == nil || s.WithdrawnAt == nil { return Timestamp{} } return *s.WithdrawnAt } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (s *SecurityAdvisoryEvent) GetAction() string { if s == nil || s.Action == nil { return "" } return *s.Action } // GetEnterprise returns the Enterprise field. func (s *SecurityAdvisoryEvent) GetEnterprise() *Enterprise { if s == nil { return nil } return s.Enterprise } // GetInstallation returns the Installation field. func (s *SecurityAdvisoryEvent) GetInstallation() *Installation { if s == nil { return nil } return s.Installation } // GetOrganization returns the Organization field. func (s *SecurityAdvisoryEvent) GetOrganization() *Organization { if s == nil { return nil } return s.Organization } // GetRepository returns the Repository field. func (s *SecurityAdvisoryEvent) GetRepository() *Repository { if s == nil { return nil } return s.Repository } // GetSecurityAdvisory returns the SecurityAdvisory field. func (s *SecurityAdvisoryEvent) GetSecurityAdvisory() *SecurityAdvisory { if s == nil { return nil } return s.SecurityAdvisory } // GetSender returns the Sender field. func (s *SecurityAdvisoryEvent) GetSender() *User { if s == nil { return nil } return s.Sender } // GetAccepted returns the Accepted field if it's non-nil, zero value otherwise. func (s *SecurityAdvisorySubmission) GetAccepted() bool { if s == nil || s.Accepted == nil { return false } return *s.Accepted } // GetAdvancedSecurity returns the AdvancedSecurity field. func (s *SecurityAndAnalysis) GetAdvancedSecurity() *AdvancedSecurity { if s == nil { return nil } return s.AdvancedSecurity } // GetDependabotSecurityUpdates returns the DependabotSecurityUpdates field. func (s *SecurityAndAnalysis) GetDependabotSecurityUpdates() *DependabotSecurityUpdates { if s == nil { return nil } return s.DependabotSecurityUpdates } // GetSecretScanning returns the SecretScanning field. func (s *SecurityAndAnalysis) GetSecretScanning() *SecretScanning { if s == nil { return nil } return s.SecretScanning } // GetSecretScanningPushProtection returns the SecretScanningPushProtection field. func (s *SecurityAndAnalysis) GetSecretScanningPushProtection() *SecretScanningPushProtection { if s == nil { return nil } return s.SecretScanningPushProtection } // GetSecretScanningValidityChecks returns the SecretScanningValidityChecks field. func (s *SecurityAndAnalysis) GetSecretScanningValidityChecks() *SecretScanningValidityChecks { if s == nil { return nil } return s.SecretScanningValidityChecks } // GetFrom returns the From field. func (s *SecurityAndAnalysisChange) GetFrom() *SecurityAndAnalysisChangeFrom { if s == nil { return nil } return s.From } // GetSecurityAndAnalysis returns the SecurityAndAnalysis field. func (s *SecurityAndAnalysisChangeFrom) GetSecurityAndAnalysis() *SecurityAndAnalysis { if s == nil { return nil } return s.SecurityAndAnalysis } // GetChanges returns the Changes field. func (s *SecurityAndAnalysisEvent) GetChanges() *SecurityAndAnalysisChange { if s == nil { return nil } return s.Changes } // GetEnterprise returns the Enterprise field. func (s *SecurityAndAnalysisEvent) GetEnterprise() *Enterprise { if s == nil { return nil } return s.Enterprise } // GetInstallation returns the Installation field. func (s *SecurityAndAnalysisEvent) GetInstallation() *Installation { if s == nil { return nil } return s.Installation } // GetOrganization returns the Organization field. func (s *SecurityAndAnalysisEvent) GetOrganization() *Organization { if s == nil { return nil } return s.Organization } // GetRepository returns the Repository field. func (s *SecurityAndAnalysisEvent) GetRepository() *Repository { if s == nil { return nil } return s.Repository } // GetSender returns the Sender field. func (s *SecurityAndAnalysisEvent) GetSender() *User { if s == nil { return nil } return s.Sender } // 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 } // GetFrom returns the From field if it's non-nil, zero value otherwise. func (s *SignatureRequirementEnforcementLevelChanges) GetFrom() string { if s == nil || s.From == nil { return "" } return *s.From } // 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 } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (s *SSHSigningKey) GetCreatedAt() Timestamp { if s == nil || s.CreatedAt == nil { return Timestamp{} } return *s.CreatedAt } // GetID returns the ID field if it's non-nil, zero value otherwise. func (s *SSHSigningKey) GetID() int64 { if s == nil || s.ID == nil { return 0 } return *s.ID } // GetKey returns the Key field if it's non-nil, zero value otherwise. func (s *SSHSigningKey) GetKey() string { if s == nil || s.Key == nil { return "" } return *s.Key } // GetTitle returns the Title field if it's non-nil, zero value otherwise. func (s *SSHSigningKey) GetTitle() string { if s == nil || s.Title == nil { return "" } return *s.Title } // 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 } // GetInstallation returns the Installation field. func (s *StarEvent) GetInstallation() *Installation { if s == nil { return nil } return s.Installation } // 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 } // GetOrg returns the Org field. func (s *StatusEvent) GetOrg() *Organization { if s == nil { return nil } return s.Org } // 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 } // GetID returns the ID field if it's non-nil, zero value otherwise. func (t *TagProtection) GetID() int64 { if t == nil || t.ID == nil { return 0 } return *t.ID } // GetPattern returns the Pattern field if it's non-nil, zero value otherwise. func (t *TagProtection) GetPattern() string { if t == nil || t.Pattern == nil { return "" } return *t.Pattern } // 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 } // GetHTMLURL returns the HTMLURL field if it's non-nil, zero value otherwise. func (t *Team) GetHTMLURL() string { if t == nil || t.HTMLURL == nil { return "" } return *t.HTMLURL } // 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 } // GetAssigner returns the Assigner field. func (t *Timeline) GetAssigner() *User { if t == nil { return nil } return t.Assigner } // GetAuthor returns the Author field. func (t *Timeline) GetAuthor() *CommitAuthor { if t == nil { return nil } return t.Author } // GetBody returns the Body field if it's non-nil, zero value otherwise. func (t *Timeline) GetBody() string { if t == nil || t.Body == nil { return "" } return *t.Body } // 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 } // GetCommitter returns the Committer field. func (t *Timeline) GetCommitter() *CommitAuthor { if t == nil { return nil } return t.Committer } // 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() Timestamp { if t == nil || t.CreatedAt == nil { return Timestamp{} } 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 } // GetMessage returns the Message field if it's non-nil, zero value otherwise. func (t *Timeline) GetMessage() string { if t == nil || t.Message == nil { return "" } return *t.Message } // GetMilestone returns the Milestone field. func (t *Timeline) GetMilestone() *Milestone { if t == nil { return nil } return t.Milestone } // GetPerformedViaGithubApp returns the PerformedViaGithubApp field. func (t *Timeline) GetPerformedViaGithubApp() *App { if t == nil { return nil } return t.PerformedViaGithubApp } // 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 } // GetRequestedTeam returns the RequestedTeam field. func (t *Timeline) GetRequestedTeam() *Team { if t == nil { return nil } return t.RequestedTeam } // GetRequester returns the Requester field. func (t *Timeline) GetRequester() *User { if t == nil { return nil } return t.Requester } // GetReviewer returns the Reviewer field. func (t *Timeline) GetReviewer() *User { if t == nil { return nil } return t.Reviewer } // GetSHA returns the SHA field if it's non-nil, zero value otherwise. func (t *Timeline) GetSHA() string { if t == nil || t.SHA == nil { return "" } return *t.SHA } // 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 } // GetSubmittedAt returns the SubmittedAt field if it's non-nil, zero value otherwise. func (t *Timeline) GetSubmittedAt() Timestamp { if t == nil || t.SubmittedAt == nil { return Timestamp{} } return *t.SubmittedAt } // 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 } // GetUser returns the User field. func (t *Timeline) GetUser() *User { if t == nil { return nil } return t.User } // 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 } // GetNewName returns the NewName field if it's non-nil, zero value otherwise. func (t *TransferRequest) GetNewName() string { if t == nil || t.NewName == nil { return "" } return *t.NewName } // 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 } // GetPath returns the Path field if it's non-nil, zero value otherwise. func (u *UpdateAttributeForSCIMUserOperations) GetPath() string { if u == nil || u.Path == nil { return "" } return *u.Path } // 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 } // GetQuerySuite returns the QuerySuite field if it's non-nil, zero value otherwise. func (u *UpdateDefaultSetupConfigurationOptions) GetQuerySuite() string { if u == nil || u.QuerySuite == nil { return "" } return *u.QuerySuite } // GetRunID returns the RunID field if it's non-nil, zero value otherwise. func (u *UpdateDefaultSetupConfigurationResponse) GetRunID() int64 { if u == nil || u.RunID == nil { return 0 } return *u.RunID } // GetRunURL returns the RunURL field if it's non-nil, zero value otherwise. func (u *UpdateDefaultSetupConfigurationResponse) GetRunURL() string { if u == nil || u.RunURL == nil { return "" } return *u.RunURL } // GetAllowsPublicRepositories returns the AllowsPublicRepositories field if it's non-nil, zero value otherwise. func (u *UpdateEnterpriseRunnerGroupRequest) 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 *UpdateEnterpriseRunnerGroupRequest) GetName() string { if u == nil || u.Name == nil { return "" } return *u.Name } // GetRestrictedToWorkflows returns the RestrictedToWorkflows field if it's non-nil, zero value otherwise. func (u *UpdateEnterpriseRunnerGroupRequest) GetRestrictedToWorkflows() bool { if u == nil || u.RestrictedToWorkflows == nil { return false } return *u.RestrictedToWorkflows } // GetVisibility returns the Visibility field if it's non-nil, zero value otherwise. func (u *UpdateEnterpriseRunnerGroupRequest) GetVisibility() string { if u == nil || u.Visibility == nil { return "" } return *u.Visibility } // 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 } // GetRestrictedToWorkflows returns the RestrictedToWorkflows field if it's non-nil, zero value otherwise. func (u *UpdateRunnerGroupRequest) GetRestrictedToWorkflows() bool { if u == nil || u.RestrictedToWorkflows == nil { return false } return *u.RestrictedToWorkflows } // 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() int64 { 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 } // GetRoleName returns the RoleName field if it's non-nil, zero value otherwise. func (u *User) GetRoleName() string { if u == nil || u.RoleName == nil { return "" } return *u.RoleName } // 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() int64 { 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 } // GetInstallation returns the Installation field. func (u *UserEvent) GetInstallation() *Installation { if u == nil { return nil } return u.Installation } // 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 } // GetEcosystem returns the Ecosystem field if it's non-nil, zero value otherwise. func (v *VulnerabilityPackage) GetEcosystem() string { if v == nil || v.Ecosystem == nil { return "" } return *v.Ecosystem } // GetName returns the Name field if it's non-nil, zero value otherwise. func (v *VulnerabilityPackage) GetName() string { if v == nil || v.Name == nil { return "" } return *v.Name } // 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 } // GetOrg returns the Org field. func (w *WatchEvent) GetOrg() *Organization { if w == nil { return nil } return w.Org } // 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 } // 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 } // GetInstallation returns the Installation field. func (w *WorkflowDispatchEvent) GetInstallation() *Installation { if w == nil { return nil } return w.Installation } // 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 } // 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 } // GetCreatedAt returns the CreatedAt field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetCreatedAt() Timestamp { if w == nil || w.CreatedAt == nil { return Timestamp{} } return *w.CreatedAt } // GetHeadBranch returns the HeadBranch field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetHeadBranch() string { if w == nil || w.HeadBranch == nil { return "" } return *w.HeadBranch } // 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 } // GetRunAttempt returns the RunAttempt field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetRunAttempt() int64 { if w == nil || w.RunAttempt == nil { return 0 } return *w.RunAttempt } // 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 } // GetRunnerGroupID returns the RunnerGroupID field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetRunnerGroupID() int64 { if w == nil || w.RunnerGroupID == nil { return 0 } return *w.RunnerGroupID } // GetRunnerGroupName returns the RunnerGroupName field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetRunnerGroupName() string { if w == nil || w.RunnerGroupName == nil { return "" } return *w.RunnerGroupName } // GetRunnerID returns the RunnerID field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetRunnerID() int64 { if w == nil || w.RunnerID == nil { return 0 } return *w.RunnerID } // GetRunnerName returns the RunnerName field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetRunnerName() string { if w == nil || w.RunnerName == nil { return "" } return *w.RunnerName } // 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 } // GetWorkflowName returns the WorkflowName field if it's non-nil, zero value otherwise. func (w *WorkflowJob) GetWorkflowName() string { if w == nil || w.WorkflowName == nil { return "" } return *w.WorkflowName } // GetAction returns the Action field if it's non-nil, zero value otherwise. func (w *WorkflowJobEvent) GetAction() string { if w == nil || w.Action == nil { return "" } return *w.Action } // GetInstallation returns the Installation field. func (w *WorkflowJobEvent) GetInstallation() *Installation { if w == nil { return nil } return w.Installation } // GetOrg returns the Org field. func (w *WorkflowJobEvent) GetOrg() *Organization { if w == nil { return nil } return w.Org } // GetRepo returns the Repo field. func (w *WorkflowJobEvent) GetRepo() *Repository { if w == nil { return nil } return w.Repo } // GetSender returns the Sender field. func (w *WorkflowJobEvent) GetSender() *User { if w == nil { return nil } return w.Sender } // GetWorkflowJob returns the WorkflowJob field. func (w *WorkflowJobEvent) GetWorkflowJob() *WorkflowJob { if w == nil { return nil } return w.WorkflowJob } // GetActor returns the Actor field. func (w *WorkflowRun) GetActor() *User { if w == nil { return nil } return w.Actor } // 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 } // GetCheckSuiteID returns the CheckSuiteID field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetCheckSuiteID() int64 { if w == nil || w.CheckSuiteID == nil { return 0 } return *w.CheckSuiteID } // GetCheckSuiteNodeID returns the CheckSuiteNodeID field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetCheckSuiteNodeID() string { if w == nil || w.CheckSuiteNodeID == nil { return "" } return *w.CheckSuiteNodeID } // 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 } // GetDisplayTitle returns the DisplayTitle field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetDisplayTitle() string { if w == nil || w.DisplayTitle == nil { return "" } return *w.DisplayTitle } // 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 } // GetPreviousAttemptURL returns the PreviousAttemptURL field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetPreviousAttemptURL() string { if w == nil || w.PreviousAttemptURL == nil { return "" } return *w.PreviousAttemptURL } // 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 } // GetRunAttempt returns the RunAttempt field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetRunAttempt() int { if w == nil || w.RunAttempt == nil { return 0 } return *w.RunAttempt } // 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 } // GetRunStartedAt returns the RunStartedAt field if it's non-nil, zero value otherwise. func (w *WorkflowRun) GetRunStartedAt() Timestamp { if w == nil || w.RunStartedAt == nil { return Timestamp{} } return *w.RunStartedAt } // 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 } // GetTriggeringActor returns the TriggeringActor field. func (w *WorkflowRun) GetTriggeringActor() *User { if w == nil { return nil } return w.TriggeringActor } // 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 } // GetExcludePullRequests returns the ExcludePullRequests field if it's non-nil, zero value otherwise. func (w *WorkflowRunAttemptOptions) GetExcludePullRequests() bool { if w == nil || w.ExcludePullRequests == nil { return false } return *w.ExcludePullRequests } // 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 } // 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 } // GetInstallation returns the Installation field. func (w *WorkflowRunEvent) GetInstallation() *Installation { if w == nil { return nil } return w.Installation } // 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 } // GetDurationMS returns the DurationMS field if it's non-nil, zero value otherwise. func (w *WorkflowRunJobRun) GetDurationMS() int64 { if w == nil || w.DurationMS == nil { return 0 } return *w.DurationMS } // GetJobID returns the JobID field if it's non-nil, zero value otherwise. func (w *WorkflowRunJobRun) GetJobID() int { if w == nil || w.JobID == nil { return 0 } return *w.JobID } // 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() *WorkflowRunBillMap { 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() *WorkflowBillMap { if w == nil { return nil } return w.Billable } go-github-60.0.0/github/github-accessors_test.go000066400000000000000000022307371457013574700216320ustar00rootroot00000000000000// 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. // Instead, please run "go generate ./..." as described here: // https://github.com/google/go-github/blob/master/CONTRIBUTING.md#submitting-a-patch 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 TestActionsCache_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp a := &ActionsCache{CreatedAt: &zeroValue} a.GetCreatedAt() a = &ActionsCache{} a.GetCreatedAt() a = nil a.GetCreatedAt() } func TestActionsCache_GetID(tt *testing.T) { var zeroValue int64 a := &ActionsCache{ID: &zeroValue} a.GetID() a = &ActionsCache{} a.GetID() a = nil a.GetID() } func TestActionsCache_GetKey(tt *testing.T) { var zeroValue string a := &ActionsCache{Key: &zeroValue} a.GetKey() a = &ActionsCache{} a.GetKey() a = nil a.GetKey() } func TestActionsCache_GetLastAccessedAt(tt *testing.T) { var zeroValue Timestamp a := &ActionsCache{LastAccessedAt: &zeroValue} a.GetLastAccessedAt() a = &ActionsCache{} a.GetLastAccessedAt() a = nil a.GetLastAccessedAt() } func TestActionsCache_GetRef(tt *testing.T) { var zeroValue string a := &ActionsCache{Ref: &zeroValue} a.GetRef() a = &ActionsCache{} a.GetRef() a = nil a.GetRef() } func TestActionsCache_GetSizeInBytes(tt *testing.T) { var zeroValue int64 a := &ActionsCache{SizeInBytes: &zeroValue} a.GetSizeInBytes() a = &ActionsCache{} a.GetSizeInBytes() a = nil a.GetSizeInBytes() } func TestActionsCache_GetVersion(tt *testing.T) { var zeroValue string a := &ActionsCache{Version: &zeroValue} a.GetVersion() a = &ActionsCache{} a.GetVersion() a = nil a.GetVersion() } func TestActionsCacheListOptions_GetDirection(tt *testing.T) { var zeroValue string a := &ActionsCacheListOptions{Direction: &zeroValue} a.GetDirection() a = &ActionsCacheListOptions{} a.GetDirection() a = nil a.GetDirection() } func TestActionsCacheListOptions_GetKey(tt *testing.T) { var zeroValue string a := &ActionsCacheListOptions{Key: &zeroValue} a.GetKey() a = &ActionsCacheListOptions{} a.GetKey() a = nil a.GetKey() } func TestActionsCacheListOptions_GetRef(tt *testing.T) { var zeroValue string a := &ActionsCacheListOptions{Ref: &zeroValue} a.GetRef() a = &ActionsCacheListOptions{} a.GetRef() a = nil a.GetRef() } func TestActionsCacheListOptions_GetSort(tt *testing.T) { var zeroValue string a := &ActionsCacheListOptions{Sort: &zeroValue} a.GetSort() a = &ActionsCacheListOptions{} a.GetSort() a = nil a.GetSort() } 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 TestActionsPermissionsEnterprise_GetAllowedActions(tt *testing.T) { var zeroValue string a := &ActionsPermissionsEnterprise{AllowedActions: &zeroValue} a.GetAllowedActions() a = &ActionsPermissionsEnterprise{} a.GetAllowedActions() a = nil a.GetAllowedActions() } func TestActionsPermissionsEnterprise_GetEnabledOrganizations(tt *testing.T) { var zeroValue string a := &ActionsPermissionsEnterprise{EnabledOrganizations: &zeroValue} a.GetEnabledOrganizations() a = &ActionsPermissionsEnterprise{} a.GetEnabledOrganizations() a = nil a.GetEnabledOrganizations() } func TestActionsPermissionsEnterprise_GetSelectedActionsURL(tt *testing.T) { var zeroValue string a := &ActionsPermissionsEnterprise{SelectedActionsURL: &zeroValue} a.GetSelectedActionsURL() a = &ActionsPermissionsEnterprise{} a.GetSelectedActionsURL() a = nil a.GetSelectedActionsURL() } func TestActionsPermissionsRepository_GetAllowedActions(tt *testing.T) { var zeroValue string a := &ActionsPermissionsRepository{AllowedActions: &zeroValue} a.GetAllowedActions() a = &ActionsPermissionsRepository{} a.GetAllowedActions() a = nil a.GetAllowedActions() } func TestActionsPermissionsRepository_GetEnabled(tt *testing.T) { var zeroValue bool a := &ActionsPermissionsRepository{Enabled: &zeroValue} a.GetEnabled() a = &ActionsPermissionsRepository{} a.GetEnabled() a = nil a.GetEnabled() } func TestActionsPermissionsRepository_GetSelectedActionsURL(tt *testing.T) { var zeroValue string a := &ActionsPermissionsRepository{SelectedActionsURL: &zeroValue} a.GetSelectedActionsURL() a = &ActionsPermissionsRepository{} a.GetSelectedActionsURL() a = nil a.GetSelectedActionsURL() } func TestActionsVariable_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp a := &ActionsVariable{CreatedAt: &zeroValue} a.GetCreatedAt() a = &ActionsVariable{} a.GetCreatedAt() a = nil a.GetCreatedAt() } func TestActionsVariable_GetSelectedRepositoriesURL(tt *testing.T) { var zeroValue string a := &ActionsVariable{SelectedRepositoriesURL: &zeroValue} a.GetSelectedRepositoriesURL() a = &ActionsVariable{} a.GetSelectedRepositoriesURL() a = nil a.GetSelectedRepositoriesURL() } func TestActionsVariable_GetSelectedRepositoryIDs(tt *testing.T) { a := &ActionsVariable{} a.GetSelectedRepositoryIDs() a = nil a.GetSelectedRepositoryIDs() } func TestActionsVariable_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp a := &ActionsVariable{UpdatedAt: &zeroValue} a.GetUpdatedAt() a = &ActionsVariable{} a.GetUpdatedAt() a = nil a.GetUpdatedAt() } func TestActionsVariable_GetVisibility(tt *testing.T) { var zeroValue string a := &ActionsVariable{Visibility: &zeroValue} a.GetVisibility() a = &ActionsVariable{} a.GetVisibility() a = nil a.GetVisibility() } func TestActorLocation_GetCountryCode(tt *testing.T) { var zeroValue string a := &ActorLocation{CountryCode: &zeroValue} a.GetCountryCode() a = &ActorLocation{} a.GetCountryCode() a = nil a.GetCountryCode() } func TestAdminEnforcedChanges_GetFrom(tt *testing.T) { var zeroValue bool a := &AdminEnforcedChanges{From: &zeroValue} a.GetFrom() a = &AdminEnforcedChanges{} a.GetFrom() a = nil a.GetFrom() } 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 TestAdvancedSecurity_GetStatus(tt *testing.T) { var zeroValue string a := &AdvancedSecurity{Status: &zeroValue} a.GetStatus() a = &AdvancedSecurity{} a.GetStatus() a = nil a.GetStatus() } func TestAdvancedSecurityCommittersBreakdown_GetLastPushedDate(tt *testing.T) { var zeroValue string a := &AdvancedSecurityCommittersBreakdown{LastPushedDate: &zeroValue} a.GetLastPushedDate() a = &AdvancedSecurityCommittersBreakdown{} a.GetLastPushedDate() a = nil a.GetLastPushedDate() } func TestAdvancedSecurityCommittersBreakdown_GetUserLogin(tt *testing.T) { var zeroValue string a := &AdvancedSecurityCommittersBreakdown{UserLogin: &zeroValue} a.GetUserLogin() a = &AdvancedSecurityCommittersBreakdown{} a.GetUserLogin() a = nil a.GetUserLogin() } func TestAdvisoryCVSS_GetScore(tt *testing.T) { a := &AdvisoryCVSS{} a.GetScore() a = nil a.GetScore() } func TestAdvisoryCVSS_GetVectorString(tt *testing.T) { var zeroValue string a := &AdvisoryCVSS{VectorString: &zeroValue} a.GetVectorString() a = &AdvisoryCVSS{} a.GetVectorString() a = nil a.GetVectorString() } func TestAdvisoryCWEs_GetCWEID(tt *testing.T) { var zeroValue string a := &AdvisoryCWEs{CWEID: &zeroValue} a.GetCWEID() a = &AdvisoryCWEs{} a.GetCWEID() a = nil a.GetCWEID() } func TestAdvisoryCWEs_GetName(tt *testing.T) { var zeroValue string a := &AdvisoryCWEs{Name: &zeroValue} a.GetName() a = &AdvisoryCWEs{} a.GetName() a = nil a.GetName() } func TestAdvisoryIdentifier_GetType(tt *testing.T) { var zeroValue string a := &AdvisoryIdentifier{Type: &zeroValue} a.GetType() a = &AdvisoryIdentifier{} a.GetType() a = nil a.GetType() } func TestAdvisoryIdentifier_GetValue(tt *testing.T) { var zeroValue string a := &AdvisoryIdentifier{Value: &zeroValue} a.GetValue() a = &AdvisoryIdentifier{} a.GetValue() a = nil a.GetValue() } func TestAdvisoryReference_GetURL(tt *testing.T) { var zeroValue string a := &AdvisoryReference{URL: &zeroValue} a.GetURL() a = &AdvisoryReference{} a.GetURL() a = nil a.GetURL() } func TestAdvisoryVulnerability_GetFirstPatchedVersion(tt *testing.T) { a := &AdvisoryVulnerability{} a.GetFirstPatchedVersion() a = nil a.GetFirstPatchedVersion() } func TestAdvisoryVulnerability_GetPackage(tt *testing.T) { a := &AdvisoryVulnerability{} a.GetPackage() a = nil a.GetPackage() } func TestAdvisoryVulnerability_GetPatchedVersions(tt *testing.T) { var zeroValue string a := &AdvisoryVulnerability{PatchedVersions: &zeroValue} a.GetPatchedVersions() a = &AdvisoryVulnerability{} a.GetPatchedVersions() a = nil a.GetPatchedVersions() } func TestAdvisoryVulnerability_GetSeverity(tt *testing.T) { var zeroValue string a := &AdvisoryVulnerability{Severity: &zeroValue} a.GetSeverity() a = &AdvisoryVulnerability{} a.GetSeverity() a = nil a.GetSeverity() } func TestAdvisoryVulnerability_GetVulnerableVersionRange(tt *testing.T) { var zeroValue string a := &AdvisoryVulnerability{VulnerableVersionRange: &zeroValue} a.GetVulnerableVersionRange() a = &AdvisoryVulnerability{} a.GetVulnerableVersionRange() a = nil a.GetVulnerableVersionRange() } 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_GetDismissedComment(tt *testing.T) { var zeroValue string a := &Alert{DismissedComment: &zeroValue} a.GetDismissedComment() a = &Alert{} a.GetDismissedComment() a = nil a.GetDismissedComment() } 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_GetFixedAt(tt *testing.T) { var zeroValue Timestamp a := &Alert{FixedAt: &zeroValue} a.GetFixedAt() a = &Alert{} a.GetFixedAt() a = nil a.GetFixedAt() } 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_GetNumber(tt *testing.T) { var zeroValue int a := &Alert{Number: &zeroValue} a.GetNumber() a = &Alert{} a.GetNumber() a = nil a.GetNumber() } func TestAlert_GetRepository(tt *testing.T) { a := &Alert{} a.GetRepository() a = nil a.GetRepository() } 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_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp a := &Alert{UpdatedAt: &zeroValue} a.GetUpdatedAt() a = &Alert{} a.GetUpdatedAt() a = nil a.GetUpdatedAt() } func TestAlert_GetURL(tt *testing.T) { var zeroValue string a := &Alert{URL: &zeroValue} a.GetURL() a = &Alert{} a.GetURL() a = nil a.GetURL() } func TestAllowDeletionsEnforcementLevelChanges_GetFrom(tt *testing.T) { var zeroValue string a := &AllowDeletionsEnforcementLevelChanges{From: &zeroValue} a.GetFrom() a = &AllowDeletionsEnforcementLevelChanges{} a.GetFrom() a = nil a.GetFrom() } func TestAllowForkSyncing_GetEnabled(tt *testing.T) { var zeroValue bool a := &AllowForkSyncing{Enabled: &zeroValue} a.GetEnabled() a = &AllowForkSyncing{} a.GetEnabled() a = nil a.GetEnabled() } func TestAnalysesListOptions_GetRef(tt *testing.T) { var zeroValue string a := &AnalysesListOptions{Ref: &zeroValue} a.GetRef() a = &AnalysesListOptions{} a.GetRef() a = nil a.GetRef() } func TestAnalysesListOptions_GetSarifID(tt *testing.T) { var zeroValue string a := &AnalysesListOptions{SarifID: &zeroValue} a.GetSarifID() a = &AnalysesListOptions{} a.GetSarifID() a = nil a.GetSarifID() } func TestAPIMeta_GetSSHKeyFingerprints(tt *testing.T) { zeroValue := map[string]string{} a := &APIMeta{SSHKeyFingerprints: zeroValue} a.GetSSHKeyFingerprints() a = &APIMeta{} a.GetSSHKeyFingerprints() a = nil a.GetSSHKeyFingerprints() } 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_GetInstallationsCount(tt *testing.T) { var zeroValue int a := &App{InstallationsCount: &zeroValue} a.GetInstallationsCount() a = &App{} a.GetInstallationsCount() a = nil a.GetInstallationsCount() } 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 TestArchivedAt_GetFrom(tt *testing.T) { var zeroValue Timestamp a := &ArchivedAt{From: &zeroValue} a.GetFrom() a = &ArchivedAt{} a.GetFrom() a = nil a.GetFrom() } func TestArchivedAt_GetTo(tt *testing.T) { var zeroValue Timestamp a := &ArchivedAt{To: &zeroValue} a.GetTo() a = &ArchivedAt{} a.GetTo() a = nil a.GetTo() } 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 TestArtifact_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp a := &Artifact{UpdatedAt: &zeroValue} a.GetUpdatedAt() a = &Artifact{} a.GetUpdatedAt() a = nil a.GetUpdatedAt() } func TestArtifact_GetURL(tt *testing.T) { var zeroValue string a := &Artifact{URL: &zeroValue} a.GetURL() a = &Artifact{} a.GetURL() a = nil a.GetURL() } func TestArtifact_GetWorkflowRun(tt *testing.T) { a := &Artifact{} a.GetWorkflowRun() a = nil a.GetWorkflowRun() } func TestArtifactList_GetTotalCount(tt *testing.T) { var zeroValue int64 a := &ArtifactList{TotalCount: &zeroValue} a.GetTotalCount() a = &ArtifactList{} a.GetTotalCount() a = nil a.GetTotalCount() } func TestArtifactWorkflowRun_GetHeadBranch(tt *testing.T) { var zeroValue string a := &ArtifactWorkflowRun{HeadBranch: &zeroValue} a.GetHeadBranch() a = &ArtifactWorkflowRun{} a.GetHeadBranch() a = nil a.GetHeadBranch() } func TestArtifactWorkflowRun_GetHeadRepositoryID(tt *testing.T) { var zeroValue int64 a := &ArtifactWorkflowRun{HeadRepositoryID: &zeroValue} a.GetHeadRepositoryID() a = &ArtifactWorkflowRun{} a.GetHeadRepositoryID() a = nil a.GetHeadRepositoryID() } func TestArtifactWorkflowRun_GetHeadSHA(tt *testing.T) { var zeroValue string a := &ArtifactWorkflowRun{HeadSHA: &zeroValue} a.GetHeadSHA() a = &ArtifactWorkflowRun{} a.GetHeadSHA() a = nil a.GetHeadSHA() } func TestArtifactWorkflowRun_GetID(tt *testing.T) { var zeroValue int64 a := &ArtifactWorkflowRun{ID: &zeroValue} a.GetID() a = &ArtifactWorkflowRun{} a.GetID() a = nil a.GetID() } func TestArtifactWorkflowRun_GetRepositoryID(tt *testing.T) { var zeroValue int64 a := &ArtifactWorkflowRun{RepositoryID: &zeroValue} a.GetRepositoryID() a = &ArtifactWorkflowRun{} a.GetRepositoryID() a = nil a.GetRepositoryID() } 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_GetActor(tt *testing.T) { var zeroValue string a := &AuditEntry{Actor: &zeroValue} a.GetActor() a = &AuditEntry{} a.GetActor() a = nil a.GetActor() } func TestAuditEntry_GetActorID(tt *testing.T) { var zeroValue int64 a := &AuditEntry{ActorID: &zeroValue} a.GetActorID() a = &AuditEntry{} a.GetActorID() a = nil a.GetActorID() } func TestAuditEntry_GetActorLocation(tt *testing.T) { a := &AuditEntry{} a.GetActorLocation() a = nil a.GetActorLocation() } 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_GetBusinessID(tt *testing.T) { var zeroValue int64 a := &AuditEntry{BusinessID: &zeroValue} a.GetBusinessID() a = &AuditEntry{} a.GetBusinessID() a = nil a.GetBusinessID() } 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_GetDocumentID(tt *testing.T) { var zeroValue string a := &AuditEntry{DocumentID: &zeroValue} a.GetDocumentID() a = &AuditEntry{} a.GetDocumentID() a = nil a.GetDocumentID() } func TestAuditEntry_GetExternalIdentityNameID(tt *testing.T) { var zeroValue string a := &AuditEntry{ExternalIdentityNameID: &zeroValue} a.GetExternalIdentityNameID() a = &AuditEntry{} a.GetExternalIdentityNameID() a = nil a.GetExternalIdentityNameID() } func TestAuditEntry_GetExternalIdentityUsername(tt *testing.T) { var zeroValue string a := &AuditEntry{ExternalIdentityUsername: &zeroValue} a.GetExternalIdentityUsername() a = &AuditEntry{} a.GetExternalIdentityUsername() a = nil a.GetExternalIdentityUsername() } func TestAuditEntry_GetHashedToken(tt *testing.T) { var zeroValue string a := &AuditEntry{HashedToken: &zeroValue} a.GetHashedToken() a = &AuditEntry{} a.GetHashedToken() a = nil a.GetHashedToken() } 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_GetOrgID(tt *testing.T) { var zeroValue int64 a := &AuditEntry{OrgID: &zeroValue} a.GetOrgID() a = &AuditEntry{} a.GetOrgID() a = nil a.GetOrgID() } 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_GetTokenID(tt *testing.T) { var zeroValue int64 a := &AuditEntry{TokenID: &zeroValue} a.GetTokenID() a = &AuditEntry{} a.GetTokenID() a = nil a.GetTokenID() } func TestAuditEntry_GetTokenScopes(tt *testing.T) { var zeroValue string a := &AuditEntry{TokenScopes: &zeroValue} a.GetTokenScopes() a = &AuditEntry{} a.GetTokenScopes() a = nil a.GetTokenScopes() } 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_GetUserID(tt *testing.T) { var zeroValue int64 a := &AuditEntry{UserID: &zeroValue} a.GetUserID() a = &AuditEntry{} a.GetUserID() a = nil a.GetUserID() } 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 TestAuthorizedActorsOnly_GetFrom(tt *testing.T) { var zeroValue bool a := &AuthorizedActorsOnly{From: &zeroValue} a.GetFrom() a = &AuthorizedActorsOnly{} a.GetFrom() a = nil a.GetFrom() } func TestAuthorizedDismissalActorsOnlyChanges_GetFrom(tt *testing.T) { var zeroValue bool a := &AuthorizedDismissalActorsOnlyChanges{From: &zeroValue} a.GetFrom() a = &AuthorizedDismissalActorsOnlyChanges{} a.GetFrom() a = nil a.GetFrom() } func TestAutolink_GetID(tt *testing.T) { var zeroValue int64 a := &Autolink{ID: &zeroValue} a.GetID() a = &Autolink{} a.GetID() a = nil a.GetID() } func TestAutolink_GetIsAlphanumeric(tt *testing.T) { var zeroValue bool a := &Autolink{IsAlphanumeric: &zeroValue} a.GetIsAlphanumeric() a = &Autolink{} a.GetIsAlphanumeric() a = nil a.GetIsAlphanumeric() } func TestAutolink_GetKeyPrefix(tt *testing.T) { var zeroValue string a := &Autolink{KeyPrefix: &zeroValue} a.GetKeyPrefix() a = &Autolink{} a.GetKeyPrefix() a = nil a.GetKeyPrefix() } func TestAutolink_GetURLTemplate(tt *testing.T) { var zeroValue string a := &Autolink{URLTemplate: &zeroValue} a.GetURLTemplate() a = &Autolink{} a.GetURLTemplate() a = nil a.GetURLTemplate() } func TestAutolinkOptions_GetIsAlphanumeric(tt *testing.T) { var zeroValue bool a := &AutolinkOptions{IsAlphanumeric: &zeroValue} a.GetIsAlphanumeric() a = &AutolinkOptions{} a.GetIsAlphanumeric() a = nil a.GetIsAlphanumeric() } func TestAutolinkOptions_GetKeyPrefix(tt *testing.T) { var zeroValue string a := &AutolinkOptions{KeyPrefix: &zeroValue} a.GetKeyPrefix() a = &AutolinkOptions{} a.GetKeyPrefix() a = nil a.GetKeyPrefix() } func TestAutolinkOptions_GetURLTemplate(tt *testing.T) { var zeroValue string a := &AutolinkOptions{URLTemplate: &zeroValue} a.GetURLTemplate() a = &AutolinkOptions{} a.GetURLTemplate() a = nil a.GetURLTemplate() } func TestAutomatedSecurityFixes_GetEnabled(tt *testing.T) { var zeroValue bool a := &AutomatedSecurityFixes{Enabled: &zeroValue} a.GetEnabled() a = &AutomatedSecurityFixes{} a.GetEnabled() a = nil a.GetEnabled() } func TestAutomatedSecurityFixes_GetPaused(tt *testing.T) { var zeroValue bool a := &AutomatedSecurityFixes{Paused: &zeroValue} a.GetPaused() a = &AutomatedSecurityFixes{} a.GetPaused() a = nil a.GetPaused() } 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 TestBlockCreations_GetEnabled(tt *testing.T) { var zeroValue bool b := &BlockCreations{Enabled: &zeroValue} b.GetEnabled() b = &BlockCreations{} b.GetEnabled() b = nil b.GetEnabled() } 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 TestBranchProtectionRule_GetAdminEnforced(tt *testing.T) { var zeroValue bool b := &BranchProtectionRule{AdminEnforced: &zeroValue} b.GetAdminEnforced() b = &BranchProtectionRule{} b.GetAdminEnforced() b = nil b.GetAdminEnforced() } func TestBranchProtectionRule_GetAllowDeletionsEnforcementLevel(tt *testing.T) { var zeroValue string b := &BranchProtectionRule{AllowDeletionsEnforcementLevel: &zeroValue} b.GetAllowDeletionsEnforcementLevel() b = &BranchProtectionRule{} b.GetAllowDeletionsEnforcementLevel() b = nil b.GetAllowDeletionsEnforcementLevel() } func TestBranchProtectionRule_GetAllowForcePushesEnforcementLevel(tt *testing.T) { var zeroValue string b := &BranchProtectionRule{AllowForcePushesEnforcementLevel: &zeroValue} b.GetAllowForcePushesEnforcementLevel() b = &BranchProtectionRule{} b.GetAllowForcePushesEnforcementLevel() b = nil b.GetAllowForcePushesEnforcementLevel() } func TestBranchProtectionRule_GetAuthorizedActorsOnly(tt *testing.T) { var zeroValue bool b := &BranchProtectionRule{AuthorizedActorsOnly: &zeroValue} b.GetAuthorizedActorsOnly() b = &BranchProtectionRule{} b.GetAuthorizedActorsOnly() b = nil b.GetAuthorizedActorsOnly() } func TestBranchProtectionRule_GetAuthorizedDismissalActorsOnly(tt *testing.T) { var zeroValue bool b := &BranchProtectionRule{AuthorizedDismissalActorsOnly: &zeroValue} b.GetAuthorizedDismissalActorsOnly() b = &BranchProtectionRule{} b.GetAuthorizedDismissalActorsOnly() b = nil b.GetAuthorizedDismissalActorsOnly() } func TestBranchProtectionRule_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp b := &BranchProtectionRule{CreatedAt: &zeroValue} b.GetCreatedAt() b = &BranchProtectionRule{} b.GetCreatedAt() b = nil b.GetCreatedAt() } func TestBranchProtectionRule_GetDismissStaleReviewsOnPush(tt *testing.T) { var zeroValue bool b := &BranchProtectionRule{DismissStaleReviewsOnPush: &zeroValue} b.GetDismissStaleReviewsOnPush() b = &BranchProtectionRule{} b.GetDismissStaleReviewsOnPush() b = nil b.GetDismissStaleReviewsOnPush() } func TestBranchProtectionRule_GetID(tt *testing.T) { var zeroValue int64 b := &BranchProtectionRule{ID: &zeroValue} b.GetID() b = &BranchProtectionRule{} b.GetID() b = nil b.GetID() } func TestBranchProtectionRule_GetIgnoreApprovalsFromContributors(tt *testing.T) { var zeroValue bool b := &BranchProtectionRule{IgnoreApprovalsFromContributors: &zeroValue} b.GetIgnoreApprovalsFromContributors() b = &BranchProtectionRule{} b.GetIgnoreApprovalsFromContributors() b = nil b.GetIgnoreApprovalsFromContributors() } func TestBranchProtectionRule_GetLinearHistoryRequirementEnforcementLevel(tt *testing.T) { var zeroValue string b := &BranchProtectionRule{LinearHistoryRequirementEnforcementLevel: &zeroValue} b.GetLinearHistoryRequirementEnforcementLevel() b = &BranchProtectionRule{} b.GetLinearHistoryRequirementEnforcementLevel() b = nil b.GetLinearHistoryRequirementEnforcementLevel() } func TestBranchProtectionRule_GetMergeQueueEnforcementLevel(tt *testing.T) { var zeroValue string b := &BranchProtectionRule{MergeQueueEnforcementLevel: &zeroValue} b.GetMergeQueueEnforcementLevel() b = &BranchProtectionRule{} b.GetMergeQueueEnforcementLevel() b = nil b.GetMergeQueueEnforcementLevel() } func TestBranchProtectionRule_GetName(tt *testing.T) { var zeroValue string b := &BranchProtectionRule{Name: &zeroValue} b.GetName() b = &BranchProtectionRule{} b.GetName() b = nil b.GetName() } func TestBranchProtectionRule_GetPullRequestReviewsEnforcementLevel(tt *testing.T) { var zeroValue string b := &BranchProtectionRule{PullRequestReviewsEnforcementLevel: &zeroValue} b.GetPullRequestReviewsEnforcementLevel() b = &BranchProtectionRule{} b.GetPullRequestReviewsEnforcementLevel() b = nil b.GetPullRequestReviewsEnforcementLevel() } func TestBranchProtectionRule_GetRepositoryID(tt *testing.T) { var zeroValue int64 b := &BranchProtectionRule{RepositoryID: &zeroValue} b.GetRepositoryID() b = &BranchProtectionRule{} b.GetRepositoryID() b = nil b.GetRepositoryID() } func TestBranchProtectionRule_GetRequireCodeOwnerReview(tt *testing.T) { var zeroValue bool b := &BranchProtectionRule{RequireCodeOwnerReview: &zeroValue} b.GetRequireCodeOwnerReview() b = &BranchProtectionRule{} b.GetRequireCodeOwnerReview() b = nil b.GetRequireCodeOwnerReview() } func TestBranchProtectionRule_GetRequiredApprovingReviewCount(tt *testing.T) { var zeroValue int b := &BranchProtectionRule{RequiredApprovingReviewCount: &zeroValue} b.GetRequiredApprovingReviewCount() b = &BranchProtectionRule{} b.GetRequiredApprovingReviewCount() b = nil b.GetRequiredApprovingReviewCount() } func TestBranchProtectionRule_GetRequiredConversationResolutionLevel(tt *testing.T) { var zeroValue string b := &BranchProtectionRule{RequiredConversationResolutionLevel: &zeroValue} b.GetRequiredConversationResolutionLevel() b = &BranchProtectionRule{} b.GetRequiredConversationResolutionLevel() b = nil b.GetRequiredConversationResolutionLevel() } func TestBranchProtectionRule_GetRequiredDeploymentsEnforcementLevel(tt *testing.T) { var zeroValue string b := &BranchProtectionRule{RequiredDeploymentsEnforcementLevel: &zeroValue} b.GetRequiredDeploymentsEnforcementLevel() b = &BranchProtectionRule{} b.GetRequiredDeploymentsEnforcementLevel() b = nil b.GetRequiredDeploymentsEnforcementLevel() } func TestBranchProtectionRule_GetRequiredStatusChecksEnforcementLevel(tt *testing.T) { var zeroValue string b := &BranchProtectionRule{RequiredStatusChecksEnforcementLevel: &zeroValue} b.GetRequiredStatusChecksEnforcementLevel() b = &BranchProtectionRule{} b.GetRequiredStatusChecksEnforcementLevel() b = nil b.GetRequiredStatusChecksEnforcementLevel() } func TestBranchProtectionRule_GetSignatureRequirementEnforcementLevel(tt *testing.T) { var zeroValue string b := &BranchProtectionRule{SignatureRequirementEnforcementLevel: &zeroValue} b.GetSignatureRequirementEnforcementLevel() b = &BranchProtectionRule{} b.GetSignatureRequirementEnforcementLevel() b = nil b.GetSignatureRequirementEnforcementLevel() } func TestBranchProtectionRule_GetStrictRequiredStatusChecksPolicy(tt *testing.T) { var zeroValue bool b := &BranchProtectionRule{StrictRequiredStatusChecksPolicy: &zeroValue} b.GetStrictRequiredStatusChecksPolicy() b = &BranchProtectionRule{} b.GetStrictRequiredStatusChecksPolicy() b = nil b.GetStrictRequiredStatusChecksPolicy() } func TestBranchProtectionRule_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp b := &BranchProtectionRule{UpdatedAt: &zeroValue} b.GetUpdatedAt() b = &BranchProtectionRule{} b.GetUpdatedAt() b = nil b.GetUpdatedAt() } func TestBranchProtectionRuleEvent_GetAction(tt *testing.T) { var zeroValue string b := &BranchProtectionRuleEvent{Action: &zeroValue} b.GetAction() b = &BranchProtectionRuleEvent{} b.GetAction() b = nil b.GetAction() } func TestBranchProtectionRuleEvent_GetChanges(tt *testing.T) { b := &BranchProtectionRuleEvent{} b.GetChanges() b = nil b.GetChanges() } func TestBranchProtectionRuleEvent_GetInstallation(tt *testing.T) { b := &BranchProtectionRuleEvent{} b.GetInstallation() b = nil b.GetInstallation() } func TestBranchProtectionRuleEvent_GetOrg(tt *testing.T) { b := &BranchProtectionRuleEvent{} b.GetOrg() b = nil b.GetOrg() } func TestBranchProtectionRuleEvent_GetRepo(tt *testing.T) { b := &BranchProtectionRuleEvent{} b.GetRepo() b = nil b.GetRepo() } func TestBranchProtectionRuleEvent_GetRule(tt *testing.T) { b := &BranchProtectionRuleEvent{} b.GetRule() b = nil b.GetRule() } func TestBranchProtectionRuleEvent_GetSender(tt *testing.T) { b := &BranchProtectionRuleEvent{} b.GetSender() b = nil b.GetSender() } func TestBypassActor_GetActorID(tt *testing.T) { var zeroValue int64 b := &BypassActor{ActorID: &zeroValue} b.GetActorID() b = &BypassActor{} b.GetActorID() b = nil b.GetActorID() } func TestBypassActor_GetActorType(tt *testing.T) { var zeroValue string b := &BypassActor{ActorType: &zeroValue} b.GetActorType() b = &BypassActor{} b.GetActorType() b = nil b.GetActorType() } func TestBypassActor_GetBypassMode(tt *testing.T) { var zeroValue string b := &BypassActor{BypassMode: &zeroValue} b.GetBypassMode() b = &BypassActor{} b.GetBypassMode() b = nil b.GetBypassMode() } 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 TestCodeownersError_GetSuggestion(tt *testing.T) { var zeroValue string c := &CodeownersError{Suggestion: &zeroValue} c.GetSuggestion() c = &CodeownersError{} c.GetSuggestion() c = nil c.GetSuggestion() } func TestCodeQLDatabase_GetContentType(tt *testing.T) { var zeroValue string c := &CodeQLDatabase{ContentType: &zeroValue} c.GetContentType() c = &CodeQLDatabase{} c.GetContentType() c = nil c.GetContentType() } func TestCodeQLDatabase_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp c := &CodeQLDatabase{CreatedAt: &zeroValue} c.GetCreatedAt() c = &CodeQLDatabase{} c.GetCreatedAt() c = nil c.GetCreatedAt() } func TestCodeQLDatabase_GetID(tt *testing.T) { var zeroValue int64 c := &CodeQLDatabase{ID: &zeroValue} c.GetID() c = &CodeQLDatabase{} c.GetID() c = nil c.GetID() } func TestCodeQLDatabase_GetLanguage(tt *testing.T) { var zeroValue string c := &CodeQLDatabase{Language: &zeroValue} c.GetLanguage() c = &CodeQLDatabase{} c.GetLanguage() c = nil c.GetLanguage() } func TestCodeQLDatabase_GetName(tt *testing.T) { var zeroValue string c := &CodeQLDatabase{Name: &zeroValue} c.GetName() c = &CodeQLDatabase{} c.GetName() c = nil c.GetName() } func TestCodeQLDatabase_GetSize(tt *testing.T) { var zeroValue int64 c := &CodeQLDatabase{Size: &zeroValue} c.GetSize() c = &CodeQLDatabase{} c.GetSize() c = nil c.GetSize() } func TestCodeQLDatabase_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp c := &CodeQLDatabase{UpdatedAt: &zeroValue} c.GetUpdatedAt() c = &CodeQLDatabase{} c.GetUpdatedAt() c = nil c.GetUpdatedAt() } func TestCodeQLDatabase_GetUploader(tt *testing.T) { c := &CodeQLDatabase{} c.GetUploader() c = nil c.GetUploader() } func TestCodeQLDatabase_GetURL(tt *testing.T) { var zeroValue string c := &CodeQLDatabase{URL: &zeroValue} c.GetURL() c = &CodeQLDatabase{} 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 TestCodeScanningAlertEvent_GetAction(tt *testing.T) { var zeroValue string c := &CodeScanningAlertEvent{Action: &zeroValue} c.GetAction() c = &CodeScanningAlertEvent{} c.GetAction() c = nil c.GetAction() } func TestCodeScanningAlertEvent_GetAlert(tt *testing.T) { c := &CodeScanningAlertEvent{} c.GetAlert() c = nil c.GetAlert() } func TestCodeScanningAlertEvent_GetCommitOID(tt *testing.T) { var zeroValue string c := &CodeScanningAlertEvent{CommitOID: &zeroValue} c.GetCommitOID() c = &CodeScanningAlertEvent{} c.GetCommitOID() c = nil c.GetCommitOID() } func TestCodeScanningAlertEvent_GetInstallation(tt *testing.T) { c := &CodeScanningAlertEvent{} c.GetInstallation() c = nil c.GetInstallation() } func TestCodeScanningAlertEvent_GetOrg(tt *testing.T) { c := &CodeScanningAlertEvent{} c.GetOrg() c = nil c.GetOrg() } func TestCodeScanningAlertEvent_GetRef(tt *testing.T) { var zeroValue string c := &CodeScanningAlertEvent{Ref: &zeroValue} c.GetRef() c = &CodeScanningAlertEvent{} c.GetRef() c = nil c.GetRef() } func TestCodeScanningAlertEvent_GetRepo(tt *testing.T) { c := &CodeScanningAlertEvent{} c.GetRepo() c = nil c.GetRepo() } func TestCodeScanningAlertEvent_GetSender(tt *testing.T) { c := &CodeScanningAlertEvent{} c.GetSender() c = nil c.GetSender() } func TestCodeScanningAlertState_GetDismissedComment(tt *testing.T) { var zeroValue string c := &CodeScanningAlertState{DismissedComment: &zeroValue} c.GetDismissedComment() c = &CodeScanningAlertState{} c.GetDismissedComment() c = nil c.GetDismissedComment() } func TestCodeScanningAlertState_GetDismissedReason(tt *testing.T) { var zeroValue string c := &CodeScanningAlertState{DismissedReason: &zeroValue} c.GetDismissedReason() c = &CodeScanningAlertState{} c.GetDismissedReason() c = nil c.GetDismissedReason() } 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 TestCodespace_GetBillableOwner(tt *testing.T) { c := &Codespace{} c.GetBillableOwner() c = nil c.GetBillableOwner() } func TestCodespace_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp c := &Codespace{CreatedAt: &zeroValue} c.GetCreatedAt() c = &Codespace{} c.GetCreatedAt() c = nil c.GetCreatedAt() } func TestCodespace_GetDevcontainerPath(tt *testing.T) { var zeroValue string c := &Codespace{DevcontainerPath: &zeroValue} c.GetDevcontainerPath() c = &Codespace{} c.GetDevcontainerPath() c = nil c.GetDevcontainerPath() } func TestCodespace_GetDisplayName(tt *testing.T) { var zeroValue string c := &Codespace{DisplayName: &zeroValue} c.GetDisplayName() c = &Codespace{} c.GetDisplayName() c = nil c.GetDisplayName() } func TestCodespace_GetEnvironmentID(tt *testing.T) { var zeroValue string c := &Codespace{EnvironmentID: &zeroValue} c.GetEnvironmentID() c = &Codespace{} c.GetEnvironmentID() c = nil c.GetEnvironmentID() } func TestCodespace_GetGitStatus(tt *testing.T) { c := &Codespace{} c.GetGitStatus() c = nil c.GetGitStatus() } func TestCodespace_GetID(tt *testing.T) { var zeroValue int64 c := &Codespace{ID: &zeroValue} c.GetID() c = &Codespace{} c.GetID() c = nil c.GetID() } func TestCodespace_GetIdleTimeoutMinutes(tt *testing.T) { var zeroValue int c := &Codespace{IdleTimeoutMinutes: &zeroValue} c.GetIdleTimeoutMinutes() c = &Codespace{} c.GetIdleTimeoutMinutes() c = nil c.GetIdleTimeoutMinutes() } func TestCodespace_GetIdleTimeoutNotice(tt *testing.T) { var zeroValue string c := &Codespace{IdleTimeoutNotice: &zeroValue} c.GetIdleTimeoutNotice() c = &Codespace{} c.GetIdleTimeoutNotice() c = nil c.GetIdleTimeoutNotice() } func TestCodespace_GetLastKnownStopNotice(tt *testing.T) { var zeroValue string c := &Codespace{LastKnownStopNotice: &zeroValue} c.GetLastKnownStopNotice() c = &Codespace{} c.GetLastKnownStopNotice() c = nil c.GetLastKnownStopNotice() } func TestCodespace_GetLastUsedAt(tt *testing.T) { var zeroValue Timestamp c := &Codespace{LastUsedAt: &zeroValue} c.GetLastUsedAt() c = &Codespace{} c.GetLastUsedAt() c = nil c.GetLastUsedAt() } func TestCodespace_GetLocation(tt *testing.T) { var zeroValue string c := &Codespace{Location: &zeroValue} c.GetLocation() c = &Codespace{} c.GetLocation() c = nil c.GetLocation() } func TestCodespace_GetMachine(tt *testing.T) { c := &Codespace{} c.GetMachine() c = nil c.GetMachine() } func TestCodespace_GetMachinesURL(tt *testing.T) { var zeroValue string c := &Codespace{MachinesURL: &zeroValue} c.GetMachinesURL() c = &Codespace{} c.GetMachinesURL() c = nil c.GetMachinesURL() } func TestCodespace_GetName(tt *testing.T) { var zeroValue string c := &Codespace{Name: &zeroValue} c.GetName() c = &Codespace{} c.GetName() c = nil c.GetName() } func TestCodespace_GetOwner(tt *testing.T) { c := &Codespace{} c.GetOwner() c = nil c.GetOwner() } func TestCodespace_GetPendingOperation(tt *testing.T) { var zeroValue bool c := &Codespace{PendingOperation: &zeroValue} c.GetPendingOperation() c = &Codespace{} c.GetPendingOperation() c = nil c.GetPendingOperation() } func TestCodespace_GetPendingOperationDisabledReason(tt *testing.T) { var zeroValue string c := &Codespace{PendingOperationDisabledReason: &zeroValue} c.GetPendingOperationDisabledReason() c = &Codespace{} c.GetPendingOperationDisabledReason() c = nil c.GetPendingOperationDisabledReason() } func TestCodespace_GetPrebuild(tt *testing.T) { var zeroValue bool c := &Codespace{Prebuild: &zeroValue} c.GetPrebuild() c = &Codespace{} c.GetPrebuild() c = nil c.GetPrebuild() } func TestCodespace_GetPullsURL(tt *testing.T) { var zeroValue string c := &Codespace{PullsURL: &zeroValue} c.GetPullsURL() c = &Codespace{} c.GetPullsURL() c = nil c.GetPullsURL() } func TestCodespace_GetRepository(tt *testing.T) { c := &Codespace{} c.GetRepository() c = nil c.GetRepository() } func TestCodespace_GetRetentionExpiresAt(tt *testing.T) { var zeroValue Timestamp c := &Codespace{RetentionExpiresAt: &zeroValue} c.GetRetentionExpiresAt() c = &Codespace{} c.GetRetentionExpiresAt() c = nil c.GetRetentionExpiresAt() } func TestCodespace_GetRetentionPeriodMinutes(tt *testing.T) { var zeroValue int c := &Codespace{RetentionPeriodMinutes: &zeroValue} c.GetRetentionPeriodMinutes() c = &Codespace{} c.GetRetentionPeriodMinutes() c = nil c.GetRetentionPeriodMinutes() } func TestCodespace_GetRuntimeConstraints(tt *testing.T) { c := &Codespace{} c.GetRuntimeConstraints() c = nil c.GetRuntimeConstraints() } func TestCodespace_GetStartURL(tt *testing.T) { var zeroValue string c := &Codespace{StartURL: &zeroValue} c.GetStartURL() c = &Codespace{} c.GetStartURL() c = nil c.GetStartURL() } func TestCodespace_GetState(tt *testing.T) { var zeroValue string c := &Codespace{State: &zeroValue} c.GetState() c = &Codespace{} c.GetState() c = nil c.GetState() } func TestCodespace_GetStopURL(tt *testing.T) { var zeroValue string c := &Codespace{StopURL: &zeroValue} c.GetStopURL() c = &Codespace{} c.GetStopURL() c = nil c.GetStopURL() } func TestCodespace_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp c := &Codespace{UpdatedAt: &zeroValue} c.GetUpdatedAt() c = &Codespace{} c.GetUpdatedAt() c = nil c.GetUpdatedAt() } func TestCodespace_GetURL(tt *testing.T) { var zeroValue string c := &Codespace{URL: &zeroValue} c.GetURL() c = &Codespace{} c.GetURL() c = nil c.GetURL() } func TestCodespace_GetWebURL(tt *testing.T) { var zeroValue string c := &Codespace{WebURL: &zeroValue} c.GetWebURL() c = &Codespace{} c.GetWebURL() c = nil c.GetWebURL() } func TestCodespacesGitStatus_GetAhead(tt *testing.T) { var zeroValue int c := &CodespacesGitStatus{Ahead: &zeroValue} c.GetAhead() c = &CodespacesGitStatus{} c.GetAhead() c = nil c.GetAhead() } func TestCodespacesGitStatus_GetBehind(tt *testing.T) { var zeroValue int c := &CodespacesGitStatus{Behind: &zeroValue} c.GetBehind() c = &CodespacesGitStatus{} c.GetBehind() c = nil c.GetBehind() } func TestCodespacesGitStatus_GetHasUncommittedChanges(tt *testing.T) { var zeroValue bool c := &CodespacesGitStatus{HasUncommittedChanges: &zeroValue} c.GetHasUncommittedChanges() c = &CodespacesGitStatus{} c.GetHasUncommittedChanges() c = nil c.GetHasUncommittedChanges() } func TestCodespacesGitStatus_GetHasUnpushedChanges(tt *testing.T) { var zeroValue bool c := &CodespacesGitStatus{HasUnpushedChanges: &zeroValue} c.GetHasUnpushedChanges() c = &CodespacesGitStatus{} c.GetHasUnpushedChanges() c = nil c.GetHasUnpushedChanges() } func TestCodespacesGitStatus_GetRef(tt *testing.T) { var zeroValue string c := &CodespacesGitStatus{Ref: &zeroValue} c.GetRef() c = &CodespacesGitStatus{} c.GetRef() c = nil c.GetRef() } func TestCodespacesMachine_GetCPUs(tt *testing.T) { var zeroValue int c := &CodespacesMachine{CPUs: &zeroValue} c.GetCPUs() c = &CodespacesMachine{} c.GetCPUs() c = nil c.GetCPUs() } func TestCodespacesMachine_GetDisplayName(tt *testing.T) { var zeroValue string c := &CodespacesMachine{DisplayName: &zeroValue} c.GetDisplayName() c = &CodespacesMachine{} c.GetDisplayName() c = nil c.GetDisplayName() } func TestCodespacesMachine_GetMemoryInBytes(tt *testing.T) { var zeroValue int64 c := &CodespacesMachine{MemoryInBytes: &zeroValue} c.GetMemoryInBytes() c = &CodespacesMachine{} c.GetMemoryInBytes() c = nil c.GetMemoryInBytes() } func TestCodespacesMachine_GetName(tt *testing.T) { var zeroValue string c := &CodespacesMachine{Name: &zeroValue} c.GetName() c = &CodespacesMachine{} c.GetName() c = nil c.GetName() } func TestCodespacesMachine_GetOperatingSystem(tt *testing.T) { var zeroValue string c := &CodespacesMachine{OperatingSystem: &zeroValue} c.GetOperatingSystem() c = &CodespacesMachine{} c.GetOperatingSystem() c = nil c.GetOperatingSystem() } func TestCodespacesMachine_GetPrebuildAvailability(tt *testing.T) { var zeroValue string c := &CodespacesMachine{PrebuildAvailability: &zeroValue} c.GetPrebuildAvailability() c = &CodespacesMachine{} c.GetPrebuildAvailability() c = nil c.GetPrebuildAvailability() } func TestCodespacesMachine_GetStorageInBytes(tt *testing.T) { var zeroValue int64 c := &CodespacesMachine{StorageInBytes: &zeroValue} c.GetStorageInBytes() c = &CodespacesMachine{} c.GetStorageInBytes() c = nil c.GetStorageInBytes() } 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 Timestamp c := &Comment{CreatedAt: &zeroValue} c.GetCreatedAt() c = &Comment{} c.GetCreatedAt() c = nil c.GetCreatedAt() } func TestCommentDiscussion_GetAuthorAssociation(tt *testing.T) { var zeroValue string c := &CommentDiscussion{AuthorAssociation: &zeroValue} c.GetAuthorAssociation() c = &CommentDiscussion{} c.GetAuthorAssociation() c = nil c.GetAuthorAssociation() } func TestCommentDiscussion_GetBody(tt *testing.T) { var zeroValue string c := &CommentDiscussion{Body: &zeroValue} c.GetBody() c = &CommentDiscussion{} c.GetBody() c = nil c.GetBody() } func TestCommentDiscussion_GetChildCommentCount(tt *testing.T) { var zeroValue int c := &CommentDiscussion{ChildCommentCount: &zeroValue} c.GetChildCommentCount() c = &CommentDiscussion{} c.GetChildCommentCount() c = nil c.GetChildCommentCount() } func TestCommentDiscussion_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp c := &CommentDiscussion{CreatedAt: &zeroValue} c.GetCreatedAt() c = &CommentDiscussion{} c.GetCreatedAt() c = nil c.GetCreatedAt() } func TestCommentDiscussion_GetDiscussionID(tt *testing.T) { var zeroValue int64 c := &CommentDiscussion{DiscussionID: &zeroValue} c.GetDiscussionID() c = &CommentDiscussion{} c.GetDiscussionID() c = nil c.GetDiscussionID() } func TestCommentDiscussion_GetHTMLURL(tt *testing.T) { var zeroValue string c := &CommentDiscussion{HTMLURL: &zeroValue} c.GetHTMLURL() c = &CommentDiscussion{} c.GetHTMLURL() c = nil c.GetHTMLURL() } func TestCommentDiscussion_GetID(tt *testing.T) { var zeroValue int64 c := &CommentDiscussion{ID: &zeroValue} c.GetID() c = &CommentDiscussion{} c.GetID() c = nil c.GetID() } func TestCommentDiscussion_GetNodeID(tt *testing.T) { var zeroValue string c := &CommentDiscussion{NodeID: &zeroValue} c.GetNodeID() c = &CommentDiscussion{} c.GetNodeID() c = nil c.GetNodeID() } func TestCommentDiscussion_GetParentID(tt *testing.T) { var zeroValue int64 c := &CommentDiscussion{ParentID: &zeroValue} c.GetParentID() c = &CommentDiscussion{} c.GetParentID() c = nil c.GetParentID() } func TestCommentDiscussion_GetReactions(tt *testing.T) { c := &CommentDiscussion{} c.GetReactions() c = nil c.GetReactions() } func TestCommentDiscussion_GetRepositoryURL(tt *testing.T) { var zeroValue string c := &CommentDiscussion{RepositoryURL: &zeroValue} c.GetRepositoryURL() c = &CommentDiscussion{} c.GetRepositoryURL() c = nil c.GetRepositoryURL() } func TestCommentDiscussion_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp c := &CommentDiscussion{UpdatedAt: &zeroValue} c.GetUpdatedAt() c = &CommentDiscussion{} c.GetUpdatedAt() c = nil c.GetUpdatedAt() } func TestCommentDiscussion_GetUser(tt *testing.T) { c := &CommentDiscussion{} c.GetUser() c = nil c.GetUser() } 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 Timestamp 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_GetOrg(tt *testing.T) { c := &CommitCommentEvent{} c.GetOrg() c = nil c.GetOrg() } 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_GetCodeOfConductFile(tt *testing.T) { c := &CommunityHealthFiles{} c.GetCodeOfConductFile() c = nil c.GetCodeOfConductFile() } 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_GetContentReportsEnabled(tt *testing.T) { var zeroValue bool c := &CommunityHealthMetrics{ContentReportsEnabled: &zeroValue} c.GetContentReportsEnabled() c = &CommunityHealthMetrics{} c.GetContentReportsEnabled() c = nil c.GetContentReportsEnabled() } func TestCommunityHealthMetrics_GetDescription(tt *testing.T) { var zeroValue string c := &CommunityHealthMetrics{Description: &zeroValue} c.GetDescription() c = &CommunityHealthMetrics{} c.GetDescription() c = nil c.GetDescription() } func TestCommunityHealthMetrics_GetDocumentation(tt *testing.T) { var zeroValue string c := &CommunityHealthMetrics{Documentation: &zeroValue} c.GetDocumentation() c = &CommunityHealthMetrics{} c.GetDocumentation() c = nil c.GetDocumentation() } 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 Timestamp 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 TestCopilotOrganizationDetails_GetSeatBreakdown(tt *testing.T) { c := &CopilotOrganizationDetails{} c.GetSeatBreakdown() c = nil c.GetSeatBreakdown() } func TestCopilotSeatDetails_GetAssigningTeam(tt *testing.T) { c := &CopilotSeatDetails{} c.GetAssigningTeam() c = nil c.GetAssigningTeam() } func TestCopilotSeatDetails_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp c := &CopilotSeatDetails{CreatedAt: &zeroValue} c.GetCreatedAt() c = &CopilotSeatDetails{} c.GetCreatedAt() c = nil c.GetCreatedAt() } func TestCopilotSeatDetails_GetLastActivityAt(tt *testing.T) { var zeroValue Timestamp c := &CopilotSeatDetails{LastActivityAt: &zeroValue} c.GetLastActivityAt() c = &CopilotSeatDetails{} c.GetLastActivityAt() c = nil c.GetLastActivityAt() } func TestCopilotSeatDetails_GetLastActivityEditor(tt *testing.T) { var zeroValue string c := &CopilotSeatDetails{LastActivityEditor: &zeroValue} c.GetLastActivityEditor() c = &CopilotSeatDetails{} c.GetLastActivityEditor() c = nil c.GetLastActivityEditor() } func TestCopilotSeatDetails_GetPendingCancellationDate(tt *testing.T) { var zeroValue string c := &CopilotSeatDetails{PendingCancellationDate: &zeroValue} c.GetPendingCancellationDate() c = &CopilotSeatDetails{} c.GetPendingCancellationDate() c = nil c.GetPendingCancellationDate() } func TestCopilotSeatDetails_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp c := &CopilotSeatDetails{UpdatedAt: &zeroValue} c.GetUpdatedAt() c = &CopilotSeatDetails{} c.GetUpdatedAt() c = nil c.GetUpdatedAt() } 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 TestCreateCodespaceOptions_GetClientIP(tt *testing.T) { var zeroValue string c := &CreateCodespaceOptions{ClientIP: &zeroValue} c.GetClientIP() c = &CreateCodespaceOptions{} c.GetClientIP() c = nil c.GetClientIP() } func TestCreateCodespaceOptions_GetDevcontainerPath(tt *testing.T) { var zeroValue string c := &CreateCodespaceOptions{DevcontainerPath: &zeroValue} c.GetDevcontainerPath() c = &CreateCodespaceOptions{} c.GetDevcontainerPath() c = nil c.GetDevcontainerPath() } func TestCreateCodespaceOptions_GetDisplayName(tt *testing.T) { var zeroValue string c := &CreateCodespaceOptions{DisplayName: &zeroValue} c.GetDisplayName() c = &CreateCodespaceOptions{} c.GetDisplayName() c = nil c.GetDisplayName() } func TestCreateCodespaceOptions_GetGeo(tt *testing.T) { var zeroValue string c := &CreateCodespaceOptions{Geo: &zeroValue} c.GetGeo() c = &CreateCodespaceOptions{} c.GetGeo() c = nil c.GetGeo() } func TestCreateCodespaceOptions_GetIdleTimeoutMinutes(tt *testing.T) { var zeroValue int c := &CreateCodespaceOptions{IdleTimeoutMinutes: &zeroValue} c.GetIdleTimeoutMinutes() c = &CreateCodespaceOptions{} c.GetIdleTimeoutMinutes() c = nil c.GetIdleTimeoutMinutes() } func TestCreateCodespaceOptions_GetMachine(tt *testing.T) { var zeroValue string c := &CreateCodespaceOptions{Machine: &zeroValue} c.GetMachine() c = &CreateCodespaceOptions{} c.GetMachine() c = nil c.GetMachine() } func TestCreateCodespaceOptions_GetMultiRepoPermissionsOptOut(tt *testing.T) { var zeroValue bool c := &CreateCodespaceOptions{MultiRepoPermissionsOptOut: &zeroValue} c.GetMultiRepoPermissionsOptOut() c = &CreateCodespaceOptions{} c.GetMultiRepoPermissionsOptOut() c = nil c.GetMultiRepoPermissionsOptOut() } func TestCreateCodespaceOptions_GetRef(tt *testing.T) { var zeroValue string c := &CreateCodespaceOptions{Ref: &zeroValue} c.GetRef() c = &CreateCodespaceOptions{} c.GetRef() c = nil c.GetRef() } func TestCreateCodespaceOptions_GetRetentionPeriodMinutes(tt *testing.T) { var zeroValue int c := &CreateCodespaceOptions{RetentionPeriodMinutes: &zeroValue} c.GetRetentionPeriodMinutes() c = &CreateCodespaceOptions{} c.GetRetentionPeriodMinutes() c = nil c.GetRetentionPeriodMinutes() } func TestCreateCodespaceOptions_GetWorkingDirectory(tt *testing.T) { var zeroValue string c := &CreateCodespaceOptions{WorkingDirectory: &zeroValue} c.GetWorkingDirectory() c = &CreateCodespaceOptions{} c.GetWorkingDirectory() c = nil c.GetWorkingDirectory() } func TestCreateEnterpriseRunnerGroupRequest_GetAllowsPublicRepositories(tt *testing.T) { var zeroValue bool c := &CreateEnterpriseRunnerGroupRequest{AllowsPublicRepositories: &zeroValue} c.GetAllowsPublicRepositories() c = &CreateEnterpriseRunnerGroupRequest{} c.GetAllowsPublicRepositories() c = nil c.GetAllowsPublicRepositories() } func TestCreateEnterpriseRunnerGroupRequest_GetName(tt *testing.T) { var zeroValue string c := &CreateEnterpriseRunnerGroupRequest{Name: &zeroValue} c.GetName() c = &CreateEnterpriseRunnerGroupRequest{} c.GetName() c = nil c.GetName() } func TestCreateEnterpriseRunnerGroupRequest_GetRestrictedToWorkflows(tt *testing.T) { var zeroValue bool c := &CreateEnterpriseRunnerGroupRequest{RestrictedToWorkflows: &zeroValue} c.GetRestrictedToWorkflows() c = &CreateEnterpriseRunnerGroupRequest{} c.GetRestrictedToWorkflows() c = nil c.GetRestrictedToWorkflows() } func TestCreateEnterpriseRunnerGroupRequest_GetVisibility(tt *testing.T) { var zeroValue string c := &CreateEnterpriseRunnerGroupRequest{Visibility: &zeroValue} c.GetVisibility() c = &CreateEnterpriseRunnerGroupRequest{} c.GetVisibility() c = nil c.GetVisibility() } 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_GetOrg(tt *testing.T) { c := &CreateEvent{} c.GetOrg() c = nil c.GetOrg() } 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 TestCreateOrUpdateCustomRoleOptions_GetBaseRole(tt *testing.T) { var zeroValue string c := &CreateOrUpdateCustomRoleOptions{BaseRole: &zeroValue} c.GetBaseRole() c = &CreateOrUpdateCustomRoleOptions{} c.GetBaseRole() c = nil c.GetBaseRole() } func TestCreateOrUpdateCustomRoleOptions_GetDescription(tt *testing.T) { var zeroValue string c := &CreateOrUpdateCustomRoleOptions{Description: &zeroValue} c.GetDescription() c = &CreateOrUpdateCustomRoleOptions{} c.GetDescription() c = nil c.GetDescription() } func TestCreateOrUpdateCustomRoleOptions_GetName(tt *testing.T) { var zeroValue string c := &CreateOrUpdateCustomRoleOptions{Name: &zeroValue} c.GetName() c = &CreateOrUpdateCustomRoleOptions{} c.GetName() c = nil c.GetName() } func TestCreateProtectedChanges_GetFrom(tt *testing.T) { var zeroValue bool c := &CreateProtectedChanges{From: &zeroValue} c.GetFrom() c = &CreateProtectedChanges{} c.GetFrom() c = nil c.GetFrom() } 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_GetRestrictedToWorkflows(tt *testing.T) { var zeroValue bool c := &CreateRunnerGroupRequest{RestrictedToWorkflows: &zeroValue} c.GetRestrictedToWorkflows() c = &CreateRunnerGroupRequest{} c.GetRestrictedToWorkflows() c = nil c.GetRestrictedToWorkflows() } 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_GetCanAdminsBypass(tt *testing.T) { var zeroValue bool c := &CreateUpdateEnvironment{CanAdminsBypass: &zeroValue} c.GetCanAdminsBypass() c = &CreateUpdateEnvironment{} c.GetCanAdminsBypass() c = nil c.GetCanAdminsBypass() } func TestCreateUpdateEnvironment_GetDeploymentBranchPolicy(tt *testing.T) { c := &CreateUpdateEnvironment{} c.GetDeploymentBranchPolicy() c = nil c.GetDeploymentBranchPolicy() } func TestCreateUpdateEnvironment_GetPreventSelfReview(tt *testing.T) { var zeroValue bool c := &CreateUpdateEnvironment{PreventSelfReview: &zeroValue} c.GetPreventSelfReview() c = &CreateUpdateEnvironment{} c.GetPreventSelfReview() c = nil c.GetPreventSelfReview() } func TestCreateUpdateEnvironment_GetWaitTimer(tt *testing.T) { var zeroValue int c := &CreateUpdateEnvironment{WaitTimer: &zeroValue} c.GetWaitTimer() c = &CreateUpdateEnvironment{} c.GetWaitTimer() c = nil c.GetWaitTimer() } func TestCreateUpdateRequiredWorkflowOptions_GetRepositoryID(tt *testing.T) { var zeroValue int64 c := &CreateUpdateRequiredWorkflowOptions{RepositoryID: &zeroValue} c.GetRepositoryID() c = &CreateUpdateRequiredWorkflowOptions{} c.GetRepositoryID() c = nil c.GetRepositoryID() } func TestCreateUpdateRequiredWorkflowOptions_GetScope(tt *testing.T) { var zeroValue string c := &CreateUpdateRequiredWorkflowOptions{Scope: &zeroValue} c.GetScope() c = &CreateUpdateRequiredWorkflowOptions{} c.GetScope() c = nil c.GetScope() } func TestCreateUpdateRequiredWorkflowOptions_GetSelectedRepositoryIDs(tt *testing.T) { c := &CreateUpdateRequiredWorkflowOptions{} c.GetSelectedRepositoryIDs() c = nil c.GetSelectedRepositoryIDs() } func TestCreateUpdateRequiredWorkflowOptions_GetWorkflowFilePath(tt *testing.T) { var zeroValue string c := &CreateUpdateRequiredWorkflowOptions{WorkflowFilePath: &zeroValue} c.GetWorkflowFilePath() c = &CreateUpdateRequiredWorkflowOptions{} c.GetWorkflowFilePath() c = nil c.GetWorkflowFilePath() } func TestCreateUserProjectOptions_GetBody(tt *testing.T) { var zeroValue string c := &CreateUserProjectOptions{Body: &zeroValue} c.GetBody() c = &CreateUserProjectOptions{} c.GetBody() c = nil c.GetBody() } func TestCreateUserRequest_GetEmail(tt *testing.T) { var zeroValue string c := &CreateUserRequest{Email: &zeroValue} c.GetEmail() c = &CreateUserRequest{} c.GetEmail() c = nil c.GetEmail() } func TestCreateUserRequest_GetSuspended(tt *testing.T) { var zeroValue bool c := &CreateUserRequest{Suspended: &zeroValue} c.GetSuspended() c = &CreateUserRequest{} c.GetSuspended() c = nil c.GetSuspended() } func TestCreationInfo_GetCreated(tt *testing.T) { var zeroValue Timestamp c := &CreationInfo{Created: &zeroValue} c.GetCreated() c = &CreationInfo{} c.GetCreated() c = nil c.GetCreated() } func TestCredentialAuthorization_GetAuthorizedCredentialExpiresAt(tt *testing.T) { var zeroValue Timestamp c := &CredentialAuthorization{AuthorizedCredentialExpiresAt: &zeroValue} c.GetAuthorizedCredentialExpiresAt() c = &CredentialAuthorization{} c.GetAuthorizedCredentialExpiresAt() c = nil c.GetAuthorizedCredentialExpiresAt() } func TestCredentialAuthorization_GetAuthorizedCredentialID(tt *testing.T) { var zeroValue int64 c := &CredentialAuthorization{AuthorizedCredentialID: &zeroValue} c.GetAuthorizedCredentialID() c = &CredentialAuthorization{} c.GetAuthorizedCredentialID() c = nil c.GetAuthorizedCredentialID() } func TestCredentialAuthorization_GetAuthorizedCredentialNote(tt *testing.T) { var zeroValue string c := &CredentialAuthorization{AuthorizedCredentialNote: &zeroValue} c.GetAuthorizedCredentialNote() c = &CredentialAuthorization{} c.GetAuthorizedCredentialNote() c = nil c.GetAuthorizedCredentialNote() } func TestCredentialAuthorization_GetAuthorizedCredentialTitle(tt *testing.T) { var zeroValue string c := &CredentialAuthorization{AuthorizedCredentialTitle: &zeroValue} c.GetAuthorizedCredentialTitle() c = &CredentialAuthorization{} c.GetAuthorizedCredentialTitle() c = nil c.GetAuthorizedCredentialTitle() } func TestCredentialAuthorization_GetCredentialAccessedAt(tt *testing.T) { var zeroValue Timestamp c := &CredentialAuthorization{CredentialAccessedAt: &zeroValue} c.GetCredentialAccessedAt() c = &CredentialAuthorization{} c.GetCredentialAccessedAt() c = nil c.GetCredentialAccessedAt() } func TestCredentialAuthorization_GetCredentialAuthorizedAt(tt *testing.T) { var zeroValue Timestamp c := &CredentialAuthorization{CredentialAuthorizedAt: &zeroValue} c.GetCredentialAuthorizedAt() c = &CredentialAuthorization{} c.GetCredentialAuthorizedAt() c = nil c.GetCredentialAuthorizedAt() } func TestCredentialAuthorization_GetCredentialID(tt *testing.T) { var zeroValue int64 c := &CredentialAuthorization{CredentialID: &zeroValue} c.GetCredentialID() c = &CredentialAuthorization{} c.GetCredentialID() c = nil c.GetCredentialID() } func TestCredentialAuthorization_GetCredentialType(tt *testing.T) { var zeroValue string c := &CredentialAuthorization{CredentialType: &zeroValue} c.GetCredentialType() c = &CredentialAuthorization{} c.GetCredentialType() c = nil c.GetCredentialType() } func TestCredentialAuthorization_GetFingerprint(tt *testing.T) { var zeroValue string c := &CredentialAuthorization{Fingerprint: &zeroValue} c.GetFingerprint() c = &CredentialAuthorization{} c.GetFingerprint() c = nil c.GetFingerprint() } func TestCredentialAuthorization_GetLogin(tt *testing.T) { var zeroValue string c := &CredentialAuthorization{Login: &zeroValue} c.GetLogin() c = &CredentialAuthorization{} c.GetLogin() c = nil c.GetLogin() } func TestCredentialAuthorization_GetTokenLastEight(tt *testing.T) { var zeroValue string c := &CredentialAuthorization{TokenLastEight: &zeroValue} c.GetTokenLastEight() c = &CredentialAuthorization{} c.GetTokenLastEight() c = nil c.GetTokenLastEight() } func TestCredit_GetType(tt *testing.T) { var zeroValue string c := &Credit{Type: &zeroValue} c.GetType() c = &Credit{} c.GetType() c = nil c.GetType() } func TestCredit_GetUser(tt *testing.T) { c := &Credit{} c.GetUser() c = nil c.GetUser() } func TestCustomDeploymentProtectionRule_GetApp(tt *testing.T) { c := &CustomDeploymentProtectionRule{} c.GetApp() c = nil c.GetApp() } func TestCustomDeploymentProtectionRule_GetEnabled(tt *testing.T) { var zeroValue bool c := &CustomDeploymentProtectionRule{Enabled: &zeroValue} c.GetEnabled() c = &CustomDeploymentProtectionRule{} c.GetEnabled() c = nil c.GetEnabled() } func TestCustomDeploymentProtectionRule_GetID(tt *testing.T) { var zeroValue int64 c := &CustomDeploymentProtectionRule{ID: &zeroValue} c.GetID() c = &CustomDeploymentProtectionRule{} c.GetID() c = nil c.GetID() } func TestCustomDeploymentProtectionRule_GetNodeID(tt *testing.T) { var zeroValue string c := &CustomDeploymentProtectionRule{NodeID: &zeroValue} c.GetNodeID() c = &CustomDeploymentProtectionRule{} c.GetNodeID() c = nil c.GetNodeID() } func TestCustomDeploymentProtectionRuleApp_GetID(tt *testing.T) { var zeroValue int64 c := &CustomDeploymentProtectionRuleApp{ID: &zeroValue} c.GetID() c = &CustomDeploymentProtectionRuleApp{} c.GetID() c = nil c.GetID() } func TestCustomDeploymentProtectionRuleApp_GetIntegrationURL(tt *testing.T) { var zeroValue string c := &CustomDeploymentProtectionRuleApp{IntegrationURL: &zeroValue} c.GetIntegrationURL() c = &CustomDeploymentProtectionRuleApp{} c.GetIntegrationURL() c = nil c.GetIntegrationURL() } func TestCustomDeploymentProtectionRuleApp_GetNodeID(tt *testing.T) { var zeroValue string c := &CustomDeploymentProtectionRuleApp{NodeID: &zeroValue} c.GetNodeID() c = &CustomDeploymentProtectionRuleApp{} c.GetNodeID() c = nil c.GetNodeID() } func TestCustomDeploymentProtectionRuleApp_GetSlug(tt *testing.T) { var zeroValue string c := &CustomDeploymentProtectionRuleApp{Slug: &zeroValue} c.GetSlug() c = &CustomDeploymentProtectionRuleApp{} c.GetSlug() c = nil c.GetSlug() } func TestCustomDeploymentProtectionRuleRequest_GetIntegrationID(tt *testing.T) { var zeroValue int64 c := &CustomDeploymentProtectionRuleRequest{IntegrationID: &zeroValue} c.GetIntegrationID() c = &CustomDeploymentProtectionRuleRequest{} c.GetIntegrationID() c = nil c.GetIntegrationID() } func TestCustomProperty_GetDefaultValue(tt *testing.T) { var zeroValue string c := &CustomProperty{DefaultValue: &zeroValue} c.GetDefaultValue() c = &CustomProperty{} c.GetDefaultValue() c = nil c.GetDefaultValue() } func TestCustomProperty_GetDescription(tt *testing.T) { var zeroValue string c := &CustomProperty{Description: &zeroValue} c.GetDescription() c = &CustomProperty{} c.GetDescription() c = nil c.GetDescription() } func TestCustomProperty_GetPropertyName(tt *testing.T) { var zeroValue string c := &CustomProperty{PropertyName: &zeroValue} c.GetPropertyName() c = &CustomProperty{} c.GetPropertyName() c = nil c.GetPropertyName() } func TestCustomProperty_GetRequired(tt *testing.T) { var zeroValue bool c := &CustomProperty{Required: &zeroValue} c.GetRequired() c = &CustomProperty{} c.GetRequired() c = nil c.GetRequired() } func TestCustomPropertyValue_GetValue(tt *testing.T) { var zeroValue string c := &CustomPropertyValue{Value: &zeroValue} c.GetValue() c = &CustomPropertyValue{} c.GetValue() c = nil c.GetValue() } func TestCustomRepoRoles_GetBaseRole(tt *testing.T) { var zeroValue string c := &CustomRepoRoles{BaseRole: &zeroValue} c.GetBaseRole() c = &CustomRepoRoles{} c.GetBaseRole() c = nil c.GetBaseRole() } func TestCustomRepoRoles_GetDescription(tt *testing.T) { var zeroValue string c := &CustomRepoRoles{Description: &zeroValue} c.GetDescription() c = &CustomRepoRoles{} c.GetDescription() c = nil c.GetDescription() } func TestCustomRepoRoles_GetID(tt *testing.T) { var zeroValue int64 c := &CustomRepoRoles{ID: &zeroValue} c.GetID() c = &CustomRepoRoles{} c.GetID() c = nil c.GetID() } func TestCustomRepoRoles_GetName(tt *testing.T) { var zeroValue string c := &CustomRepoRoles{Name: &zeroValue} c.GetName() c = &CustomRepoRoles{} c.GetName() c = nil c.GetName() } func TestDefaultSetupConfiguration_GetQuerySuite(tt *testing.T) { var zeroValue string d := &DefaultSetupConfiguration{QuerySuite: &zeroValue} d.GetQuerySuite() d = &DefaultSetupConfiguration{} d.GetQuerySuite() d = nil d.GetQuerySuite() } func TestDefaultSetupConfiguration_GetState(tt *testing.T) { var zeroValue string d := &DefaultSetupConfiguration{State: &zeroValue} d.GetState() d = &DefaultSetupConfiguration{} d.GetState() d = nil d.GetState() } func TestDefaultSetupConfiguration_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp d := &DefaultSetupConfiguration{UpdatedAt: &zeroValue} d.GetUpdatedAt() d = &DefaultSetupConfiguration{} d.GetUpdatedAt() d = nil d.GetUpdatedAt() } func TestDefaultWorkflowPermissionEnterprise_GetCanApprovePullRequestReviews(tt *testing.T) { var zeroValue bool d := &DefaultWorkflowPermissionEnterprise{CanApprovePullRequestReviews: &zeroValue} d.GetCanApprovePullRequestReviews() d = &DefaultWorkflowPermissionEnterprise{} d.GetCanApprovePullRequestReviews() d = nil d.GetCanApprovePullRequestReviews() } func TestDefaultWorkflowPermissionEnterprise_GetDefaultWorkflowPermissions(tt *testing.T) { var zeroValue string d := &DefaultWorkflowPermissionEnterprise{DefaultWorkflowPermissions: &zeroValue} d.GetDefaultWorkflowPermissions() d = &DefaultWorkflowPermissionEnterprise{} d.GetDefaultWorkflowPermissions() d = nil d.GetDefaultWorkflowPermissions() } func TestDefaultWorkflowPermissionOrganization_GetCanApprovePullRequestReviews(tt *testing.T) { var zeroValue bool d := &DefaultWorkflowPermissionOrganization{CanApprovePullRequestReviews: &zeroValue} d.GetCanApprovePullRequestReviews() d = &DefaultWorkflowPermissionOrganization{} d.GetCanApprovePullRequestReviews() d = nil d.GetCanApprovePullRequestReviews() } func TestDefaultWorkflowPermissionOrganization_GetDefaultWorkflowPermissions(tt *testing.T) { var zeroValue string d := &DefaultWorkflowPermissionOrganization{DefaultWorkflowPermissions: &zeroValue} d.GetDefaultWorkflowPermissions() d = &DefaultWorkflowPermissionOrganization{} d.GetDefaultWorkflowPermissions() d = nil d.GetDefaultWorkflowPermissions() } func TestDefaultWorkflowPermissionRepository_GetCanApprovePullRequestReviews(tt *testing.T) { var zeroValue bool d := &DefaultWorkflowPermissionRepository{CanApprovePullRequestReviews: &zeroValue} d.GetCanApprovePullRequestReviews() d = &DefaultWorkflowPermissionRepository{} d.GetCanApprovePullRequestReviews() d = nil d.GetCanApprovePullRequestReviews() } func TestDefaultWorkflowPermissionRepository_GetDefaultWorkflowPermissions(tt *testing.T) { var zeroValue string d := &DefaultWorkflowPermissionRepository{DefaultWorkflowPermissions: &zeroValue} d.GetDefaultWorkflowPermissions() d = &DefaultWorkflowPermissionRepository{} d.GetDefaultWorkflowPermissions() d = nil d.GetDefaultWorkflowPermissions() } func TestDeleteAnalysis_GetConfirmDeleteURL(tt *testing.T) { var zeroValue string d := &DeleteAnalysis{ConfirmDeleteURL: &zeroValue} d.GetConfirmDeleteURL() d = &DeleteAnalysis{} d.GetConfirmDeleteURL() d = nil d.GetConfirmDeleteURL() } func TestDeleteAnalysis_GetNextAnalysisURL(tt *testing.T) { var zeroValue string d := &DeleteAnalysis{NextAnalysisURL: &zeroValue} d.GetNextAnalysisURL() d = &DeleteAnalysis{} d.GetNextAnalysisURL() d = nil d.GetNextAnalysisURL() } func TestDeleteEvent_GetInstallation(tt *testing.T) { d := &DeleteEvent{} d.GetInstallation() d = nil d.GetInstallation() } func TestDeleteEvent_GetOrg(tt *testing.T) { d := &DeleteEvent{} d.GetOrg() d = nil d.GetOrg() } 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 TestDependabotAlert_GetAutoDismissedAt(tt *testing.T) { var zeroValue Timestamp d := &DependabotAlert{AutoDismissedAt: &zeroValue} d.GetAutoDismissedAt() d = &DependabotAlert{} d.GetAutoDismissedAt() d = nil d.GetAutoDismissedAt() } func TestDependabotAlert_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp d := &DependabotAlert{CreatedAt: &zeroValue} d.GetCreatedAt() d = &DependabotAlert{} d.GetCreatedAt() d = nil d.GetCreatedAt() } func TestDependabotAlert_GetDependency(tt *testing.T) { d := &DependabotAlert{} d.GetDependency() d = nil d.GetDependency() } func TestDependabotAlert_GetDismissedAt(tt *testing.T) { var zeroValue Timestamp d := &DependabotAlert{DismissedAt: &zeroValue} d.GetDismissedAt() d = &DependabotAlert{} d.GetDismissedAt() d = nil d.GetDismissedAt() } func TestDependabotAlert_GetDismissedBy(tt *testing.T) { d := &DependabotAlert{} d.GetDismissedBy() d = nil d.GetDismissedBy() } func TestDependabotAlert_GetDismissedComment(tt *testing.T) { var zeroValue string d := &DependabotAlert{DismissedComment: &zeroValue} d.GetDismissedComment() d = &DependabotAlert{} d.GetDismissedComment() d = nil d.GetDismissedComment() } func TestDependabotAlert_GetDismissedReason(tt *testing.T) { var zeroValue string d := &DependabotAlert{DismissedReason: &zeroValue} d.GetDismissedReason() d = &DependabotAlert{} d.GetDismissedReason() d = nil d.GetDismissedReason() } func TestDependabotAlert_GetFixedAt(tt *testing.T) { var zeroValue Timestamp d := &DependabotAlert{FixedAt: &zeroValue} d.GetFixedAt() d = &DependabotAlert{} d.GetFixedAt() d = nil d.GetFixedAt() } func TestDependabotAlert_GetHTMLURL(tt *testing.T) { var zeroValue string d := &DependabotAlert{HTMLURL: &zeroValue} d.GetHTMLURL() d = &DependabotAlert{} d.GetHTMLURL() d = nil d.GetHTMLURL() } func TestDependabotAlert_GetNumber(tt *testing.T) { var zeroValue int d := &DependabotAlert{Number: &zeroValue} d.GetNumber() d = &DependabotAlert{} d.GetNumber() d = nil d.GetNumber() } func TestDependabotAlert_GetRepository(tt *testing.T) { d := &DependabotAlert{} d.GetRepository() d = nil d.GetRepository() } func TestDependabotAlert_GetSecurityAdvisory(tt *testing.T) { d := &DependabotAlert{} d.GetSecurityAdvisory() d = nil d.GetSecurityAdvisory() } func TestDependabotAlert_GetSecurityVulnerability(tt *testing.T) { d := &DependabotAlert{} d.GetSecurityVulnerability() d = nil d.GetSecurityVulnerability() } func TestDependabotAlert_GetState(tt *testing.T) { var zeroValue string d := &DependabotAlert{State: &zeroValue} d.GetState() d = &DependabotAlert{} d.GetState() d = nil d.GetState() } func TestDependabotAlert_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp d := &DependabotAlert{UpdatedAt: &zeroValue} d.GetUpdatedAt() d = &DependabotAlert{} d.GetUpdatedAt() d = nil d.GetUpdatedAt() } func TestDependabotAlert_GetURL(tt *testing.T) { var zeroValue string d := &DependabotAlert{URL: &zeroValue} d.GetURL() d = &DependabotAlert{} d.GetURL() d = nil d.GetURL() } func TestDependabotAlertEvent_GetAction(tt *testing.T) { var zeroValue string d := &DependabotAlertEvent{Action: &zeroValue} d.GetAction() d = &DependabotAlertEvent{} d.GetAction() d = nil d.GetAction() } func TestDependabotAlertEvent_GetAlert(tt *testing.T) { d := &DependabotAlertEvent{} d.GetAlert() d = nil d.GetAlert() } func TestDependabotAlertEvent_GetEnterprise(tt *testing.T) { d := &DependabotAlertEvent{} d.GetEnterprise() d = nil d.GetEnterprise() } func TestDependabotAlertEvent_GetInstallation(tt *testing.T) { d := &DependabotAlertEvent{} d.GetInstallation() d = nil d.GetInstallation() } func TestDependabotAlertEvent_GetOrganization(tt *testing.T) { d := &DependabotAlertEvent{} d.GetOrganization() d = nil d.GetOrganization() } func TestDependabotAlertEvent_GetRepo(tt *testing.T) { d := &DependabotAlertEvent{} d.GetRepo() d = nil d.GetRepo() } func TestDependabotAlertEvent_GetSender(tt *testing.T) { d := &DependabotAlertEvent{} d.GetSender() d = nil d.GetSender() } func TestDependabotAlertState_GetDismissedComment(tt *testing.T) { var zeroValue string d := &DependabotAlertState{DismissedComment: &zeroValue} d.GetDismissedComment() d = &DependabotAlertState{} d.GetDismissedComment() d = nil d.GetDismissedComment() } func TestDependabotAlertState_GetDismissedReason(tt *testing.T) { var zeroValue string d := &DependabotAlertState{DismissedReason: &zeroValue} d.GetDismissedReason() d = &DependabotAlertState{} d.GetDismissedReason() d = nil d.GetDismissedReason() } func TestDependabotSecurityAdvisory_GetCVEID(tt *testing.T) { var zeroValue string d := &DependabotSecurityAdvisory{CVEID: &zeroValue} d.GetCVEID() d = &DependabotSecurityAdvisory{} d.GetCVEID() d = nil d.GetCVEID() } func TestDependabotSecurityAdvisory_GetCVSS(tt *testing.T) { d := &DependabotSecurityAdvisory{} d.GetCVSS() d = nil d.GetCVSS() } func TestDependabotSecurityAdvisory_GetDescription(tt *testing.T) { var zeroValue string d := &DependabotSecurityAdvisory{Description: &zeroValue} d.GetDescription() d = &DependabotSecurityAdvisory{} d.GetDescription() d = nil d.GetDescription() } func TestDependabotSecurityAdvisory_GetGHSAID(tt *testing.T) { var zeroValue string d := &DependabotSecurityAdvisory{GHSAID: &zeroValue} d.GetGHSAID() d = &DependabotSecurityAdvisory{} d.GetGHSAID() d = nil d.GetGHSAID() } func TestDependabotSecurityAdvisory_GetPublishedAt(tt *testing.T) { var zeroValue Timestamp d := &DependabotSecurityAdvisory{PublishedAt: &zeroValue} d.GetPublishedAt() d = &DependabotSecurityAdvisory{} d.GetPublishedAt() d = nil d.GetPublishedAt() } func TestDependabotSecurityAdvisory_GetSeverity(tt *testing.T) { var zeroValue string d := &DependabotSecurityAdvisory{Severity: &zeroValue} d.GetSeverity() d = &DependabotSecurityAdvisory{} d.GetSeverity() d = nil d.GetSeverity() } func TestDependabotSecurityAdvisory_GetSummary(tt *testing.T) { var zeroValue string d := &DependabotSecurityAdvisory{Summary: &zeroValue} d.GetSummary() d = &DependabotSecurityAdvisory{} d.GetSummary() d = nil d.GetSummary() } func TestDependabotSecurityAdvisory_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp d := &DependabotSecurityAdvisory{UpdatedAt: &zeroValue} d.GetUpdatedAt() d = &DependabotSecurityAdvisory{} d.GetUpdatedAt() d = nil d.GetUpdatedAt() } func TestDependabotSecurityAdvisory_GetWithdrawnAt(tt *testing.T) { var zeroValue Timestamp d := &DependabotSecurityAdvisory{WithdrawnAt: &zeroValue} d.GetWithdrawnAt() d = &DependabotSecurityAdvisory{} d.GetWithdrawnAt() d = nil d.GetWithdrawnAt() } func TestDependabotSecurityUpdates_GetStatus(tt *testing.T) { var zeroValue string d := &DependabotSecurityUpdates{Status: &zeroValue} d.GetStatus() d = &DependabotSecurityUpdates{} d.GetStatus() d = nil d.GetStatus() } func TestDependency_GetManifestPath(tt *testing.T) { var zeroValue string d := &Dependency{ManifestPath: &zeroValue} d.GetManifestPath() d = &Dependency{} d.GetManifestPath() d = nil d.GetManifestPath() } func TestDependency_GetPackage(tt *testing.T) { d := &Dependency{} d.GetPackage() d = nil d.GetPackage() } func TestDependency_GetScope(tt *testing.T) { var zeroValue string d := &Dependency{Scope: &zeroValue} d.GetScope() d = &Dependency{} d.GetScope() d = nil d.GetScope() } 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_GetInstallation(tt *testing.T) { d := &DeployKeyEvent{} d.GetInstallation() d = nil d.GetInstallation() } func TestDeployKeyEvent_GetKey(tt *testing.T) { d := &DeployKeyEvent{} d.GetKey() d = nil d.GetKey() } func TestDeployKeyEvent_GetOrganization(tt *testing.T) { d := &DeployKeyEvent{} d.GetOrganization() d = nil d.GetOrganization() } func TestDeployKeyEvent_GetRepo(tt *testing.T) { d := &DeployKeyEvent{} d.GetRepo() d = nil d.GetRepo() } func TestDeployKeyEvent_GetSender(tt *testing.T) { d := &DeployKeyEvent{} d.GetSender() d = nil d.GetSender() } 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 TestDeploymentBranchPolicy_GetID(tt *testing.T) { var zeroValue int64 d := &DeploymentBranchPolicy{ID: &zeroValue} d.GetID() d = &DeploymentBranchPolicy{} d.GetID() d = nil d.GetID() } func TestDeploymentBranchPolicy_GetName(tt *testing.T) { var zeroValue string d := &DeploymentBranchPolicy{Name: &zeroValue} d.GetName() d = &DeploymentBranchPolicy{} d.GetName() d = nil d.GetName() } func TestDeploymentBranchPolicy_GetNodeID(tt *testing.T) { var zeroValue string d := &DeploymentBranchPolicy{NodeID: &zeroValue} d.GetNodeID() d = &DeploymentBranchPolicy{} d.GetNodeID() d = nil d.GetNodeID() } func TestDeploymentBranchPolicy_GetType(tt *testing.T) { var zeroValue string d := &DeploymentBranchPolicy{Type: &zeroValue} d.GetType() d = &DeploymentBranchPolicy{} d.GetType() d = nil d.GetType() } func TestDeploymentBranchPolicyRequest_GetName(tt *testing.T) { var zeroValue string d := &DeploymentBranchPolicyRequest{Name: &zeroValue} d.GetName() d = &DeploymentBranchPolicyRequest{} d.GetName() d = nil d.GetName() } func TestDeploymentBranchPolicyRequest_GetType(tt *testing.T) { var zeroValue string d := &DeploymentBranchPolicyRequest{Type: &zeroValue} d.GetType() d = &DeploymentBranchPolicyRequest{} d.GetType() d = nil d.GetType() } func TestDeploymentBranchPolicyResponse_GetTotalCount(tt *testing.T) { var zeroValue int d := &DeploymentBranchPolicyResponse{TotalCount: &zeroValue} d.GetTotalCount() d = &DeploymentBranchPolicyResponse{} d.GetTotalCount() d = nil d.GetTotalCount() } 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_GetOrg(tt *testing.T) { d := &DeploymentEvent{} d.GetOrg() d = nil d.GetOrg() } 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 TestDeploymentEvent_GetWorkflow(tt *testing.T) { d := &DeploymentEvent{} d.GetWorkflow() d = nil d.GetWorkflow() } func TestDeploymentEvent_GetWorkflowRun(tt *testing.T) { d := &DeploymentEvent{} d.GetWorkflowRun() d = nil d.GetWorkflowRun() } func TestDeploymentProtectionRuleEvent_GetAction(tt *testing.T) { var zeroValue string d := &DeploymentProtectionRuleEvent{Action: &zeroValue} d.GetAction() d = &DeploymentProtectionRuleEvent{} d.GetAction() d = nil d.GetAction() } func TestDeploymentProtectionRuleEvent_GetDeployment(tt *testing.T) { d := &DeploymentProtectionRuleEvent{} d.GetDeployment() d = nil d.GetDeployment() } func TestDeploymentProtectionRuleEvent_GetDeploymentCallbackURL(tt *testing.T) { var zeroValue string d := &DeploymentProtectionRuleEvent{DeploymentCallbackURL: &zeroValue} d.GetDeploymentCallbackURL() d = &DeploymentProtectionRuleEvent{} d.GetDeploymentCallbackURL() d = nil d.GetDeploymentCallbackURL() } func TestDeploymentProtectionRuleEvent_GetEnvironment(tt *testing.T) { var zeroValue string d := &DeploymentProtectionRuleEvent{Environment: &zeroValue} d.GetEnvironment() d = &DeploymentProtectionRuleEvent{} d.GetEnvironment() d = nil d.GetEnvironment() } func TestDeploymentProtectionRuleEvent_GetEvent(tt *testing.T) { var zeroValue string d := &DeploymentProtectionRuleEvent{Event: &zeroValue} d.GetEvent() d = &DeploymentProtectionRuleEvent{} d.GetEvent() d = nil d.GetEvent() } func TestDeploymentProtectionRuleEvent_GetInstallation(tt *testing.T) { d := &DeploymentProtectionRuleEvent{} d.GetInstallation() d = nil d.GetInstallation() } func TestDeploymentProtectionRuleEvent_GetOrganization(tt *testing.T) { d := &DeploymentProtectionRuleEvent{} d.GetOrganization() d = nil d.GetOrganization() } func TestDeploymentProtectionRuleEvent_GetRepo(tt *testing.T) { d := &DeploymentProtectionRuleEvent{} d.GetRepo() d = nil d.GetRepo() } func TestDeploymentProtectionRuleEvent_GetSender(tt *testing.T) { d := &DeploymentProtectionRuleEvent{} 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_GetOrg(tt *testing.T) { d := &DeploymentStatusEvent{} d.GetOrg() d = nil d.GetOrg() } 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 TestDiscussion_GetActiveLockReason(tt *testing.T) { var zeroValue string d := &Discussion{ActiveLockReason: &zeroValue} d.GetActiveLockReason() d = &Discussion{} d.GetActiveLockReason() d = nil d.GetActiveLockReason() } func TestDiscussion_GetAnswerChosenAt(tt *testing.T) { var zeroValue Timestamp d := &Discussion{AnswerChosenAt: &zeroValue} d.GetAnswerChosenAt() d = &Discussion{} d.GetAnswerChosenAt() d = nil d.GetAnswerChosenAt() } func TestDiscussion_GetAnswerChosenBy(tt *testing.T) { var zeroValue string d := &Discussion{AnswerChosenBy: &zeroValue} d.GetAnswerChosenBy() d = &Discussion{} d.GetAnswerChosenBy() d = nil d.GetAnswerChosenBy() } func TestDiscussion_GetAnswerHTMLURL(tt *testing.T) { var zeroValue string d := &Discussion{AnswerHTMLURL: &zeroValue} d.GetAnswerHTMLURL() d = &Discussion{} d.GetAnswerHTMLURL() d = nil d.GetAnswerHTMLURL() } func TestDiscussion_GetAuthorAssociation(tt *testing.T) { var zeroValue string d := &Discussion{AuthorAssociation: &zeroValue} d.GetAuthorAssociation() d = &Discussion{} d.GetAuthorAssociation() d = nil d.GetAuthorAssociation() } func TestDiscussion_GetBody(tt *testing.T) { var zeroValue string d := &Discussion{Body: &zeroValue} d.GetBody() d = &Discussion{} d.GetBody() d = nil d.GetBody() } func TestDiscussion_GetComments(tt *testing.T) { var zeroValue int d := &Discussion{Comments: &zeroValue} d.GetComments() d = &Discussion{} d.GetComments() d = nil d.GetComments() } func TestDiscussion_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp d := &Discussion{CreatedAt: &zeroValue} d.GetCreatedAt() d = &Discussion{} d.GetCreatedAt() d = nil d.GetCreatedAt() } func TestDiscussion_GetDiscussionCategory(tt *testing.T) { d := &Discussion{} d.GetDiscussionCategory() d = nil d.GetDiscussionCategory() } func TestDiscussion_GetHTMLURL(tt *testing.T) { var zeroValue string d := &Discussion{HTMLURL: &zeroValue} d.GetHTMLURL() d = &Discussion{} d.GetHTMLURL() d = nil d.GetHTMLURL() } func TestDiscussion_GetID(tt *testing.T) { var zeroValue int64 d := &Discussion{ID: &zeroValue} d.GetID() d = &Discussion{} d.GetID() d = nil d.GetID() } func TestDiscussion_GetLocked(tt *testing.T) { var zeroValue bool d := &Discussion{Locked: &zeroValue} d.GetLocked() d = &Discussion{} d.GetLocked() d = nil d.GetLocked() } func TestDiscussion_GetNodeID(tt *testing.T) { var zeroValue string d := &Discussion{NodeID: &zeroValue} d.GetNodeID() d = &Discussion{} d.GetNodeID() d = nil d.GetNodeID() } func TestDiscussion_GetNumber(tt *testing.T) { var zeroValue int d := &Discussion{Number: &zeroValue} d.GetNumber() d = &Discussion{} d.GetNumber() d = nil d.GetNumber() } func TestDiscussion_GetRepositoryURL(tt *testing.T) { var zeroValue string d := &Discussion{RepositoryURL: &zeroValue} d.GetRepositoryURL() d = &Discussion{} d.GetRepositoryURL() d = nil d.GetRepositoryURL() } func TestDiscussion_GetState(tt *testing.T) { var zeroValue string d := &Discussion{State: &zeroValue} d.GetState() d = &Discussion{} d.GetState() d = nil d.GetState() } func TestDiscussion_GetTitle(tt *testing.T) { var zeroValue string d := &Discussion{Title: &zeroValue} d.GetTitle() d = &Discussion{} d.GetTitle() d = nil d.GetTitle() } func TestDiscussion_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp d := &Discussion{UpdatedAt: &zeroValue} d.GetUpdatedAt() d = &Discussion{} d.GetUpdatedAt() d = nil d.GetUpdatedAt() } func TestDiscussion_GetUser(tt *testing.T) { d := &Discussion{} d.GetUser() d = nil d.GetUser() } func TestDiscussionCategory_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp d := &DiscussionCategory{CreatedAt: &zeroValue} d.GetCreatedAt() d = &DiscussionCategory{} d.GetCreatedAt() d = nil d.GetCreatedAt() } func TestDiscussionCategory_GetDescription(tt *testing.T) { var zeroValue string d := &DiscussionCategory{Description: &zeroValue} d.GetDescription() d = &DiscussionCategory{} d.GetDescription() d = nil d.GetDescription() } func TestDiscussionCategory_GetEmoji(tt *testing.T) { var zeroValue string d := &DiscussionCategory{Emoji: &zeroValue} d.GetEmoji() d = &DiscussionCategory{} d.GetEmoji() d = nil d.GetEmoji() } func TestDiscussionCategory_GetID(tt *testing.T) { var zeroValue int64 d := &DiscussionCategory{ID: &zeroValue} d.GetID() d = &DiscussionCategory{} d.GetID() d = nil d.GetID() } func TestDiscussionCategory_GetIsAnswerable(tt *testing.T) { var zeroValue bool d := &DiscussionCategory{IsAnswerable: &zeroValue} d.GetIsAnswerable() d = &DiscussionCategory{} d.GetIsAnswerable() d = nil d.GetIsAnswerable() } func TestDiscussionCategory_GetName(tt *testing.T) { var zeroValue string d := &DiscussionCategory{Name: &zeroValue} d.GetName() d = &DiscussionCategory{} d.GetName() d = nil d.GetName() } func TestDiscussionCategory_GetNodeID(tt *testing.T) { var zeroValue string d := &DiscussionCategory{NodeID: &zeroValue} d.GetNodeID() d = &DiscussionCategory{} d.GetNodeID() d = nil d.GetNodeID() } func TestDiscussionCategory_GetRepositoryID(tt *testing.T) { var zeroValue int64 d := &DiscussionCategory{RepositoryID: &zeroValue} d.GetRepositoryID() d = &DiscussionCategory{} d.GetRepositoryID() d = nil d.GetRepositoryID() } func TestDiscussionCategory_GetSlug(tt *testing.T) { var zeroValue string d := &DiscussionCategory{Slug: &zeroValue} d.GetSlug() d = &DiscussionCategory{} d.GetSlug() d = nil d.GetSlug() } func TestDiscussionCategory_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp d := &DiscussionCategory{UpdatedAt: &zeroValue} d.GetUpdatedAt() d = &DiscussionCategory{} d.GetUpdatedAt() d = nil d.GetUpdatedAt() } 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 TestDiscussionCommentEvent_GetAction(tt *testing.T) { var zeroValue string d := &DiscussionCommentEvent{Action: &zeroValue} d.GetAction() d = &DiscussionCommentEvent{} d.GetAction() d = nil d.GetAction() } func TestDiscussionCommentEvent_GetComment(tt *testing.T) { d := &DiscussionCommentEvent{} d.GetComment() d = nil d.GetComment() } func TestDiscussionCommentEvent_GetDiscussion(tt *testing.T) { d := &DiscussionCommentEvent{} d.GetDiscussion() d = nil d.GetDiscussion() } func TestDiscussionCommentEvent_GetInstallation(tt *testing.T) { d := &DiscussionCommentEvent{} d.GetInstallation() d = nil d.GetInstallation() } func TestDiscussionCommentEvent_GetOrg(tt *testing.T) { d := &DiscussionCommentEvent{} d.GetOrg() d = nil d.GetOrg() } func TestDiscussionCommentEvent_GetRepo(tt *testing.T) { d := &DiscussionCommentEvent{} d.GetRepo() d = nil d.GetRepo() } func TestDiscussionCommentEvent_GetSender(tt *testing.T) { d := &DiscussionCommentEvent{} d.GetSender() d = nil d.GetSender() } func TestDiscussionEvent_GetAction(tt *testing.T) { var zeroValue string d := &DiscussionEvent{Action: &zeroValue} d.GetAction() d = &DiscussionEvent{} d.GetAction() d = nil d.GetAction() } func TestDiscussionEvent_GetDiscussion(tt *testing.T) { d := &DiscussionEvent{} d.GetDiscussion() d = nil d.GetDiscussion() } func TestDiscussionEvent_GetInstallation(tt *testing.T) { d := &DiscussionEvent{} d.GetInstallation() d = nil d.GetInstallation() } func TestDiscussionEvent_GetOrg(tt *testing.T) { d := &DiscussionEvent{} d.GetOrg() d = nil d.GetOrg() } func TestDiscussionEvent_GetRepo(tt *testing.T) { d := &DiscussionEvent{} d.GetRepo() d = nil d.GetRepo() } func TestDiscussionEvent_GetSender(tt *testing.T) { d := &DiscussionEvent{} d.GetSender() d = nil d.GetSender() } func TestDismissalRestrictionsRequest_GetApps(tt *testing.T) { var zeroValue []string d := &DismissalRestrictionsRequest{Apps: &zeroValue} d.GetApps() d = &DismissalRestrictionsRequest{} d.GetApps() d = nil d.GetApps() } 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 TestDismissStaleReviewsOnPushChanges_GetFrom(tt *testing.T) { var zeroValue bool d := &DismissStaleReviewsOnPushChanges{From: &zeroValue} d.GetFrom() d = &DismissStaleReviewsOnPushChanges{} d.GetFrom() d = nil d.GetFrom() } 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_GetDefaultBranch(tt *testing.T) { e := &EditChange{} e.GetDefaultBranch() e = nil e.GetDefaultBranch() } func TestEditChange_GetOwner(tt *testing.T) { e := &EditChange{} e.GetOwner() e = nil e.GetOwner() } func TestEditChange_GetRepo(tt *testing.T) { e := &EditChange{} e.GetRepo() e = nil e.GetRepo() } func TestEditChange_GetTitle(tt *testing.T) { e := &EditChange{} e.GetTitle() e = nil e.GetTitle() } func TestEditChange_GetTopics(tt *testing.T) { e := &EditChange{} e.GetTopics() e = nil e.GetTopics() } func TestEditDefaultBranch_GetFrom(tt *testing.T) { var zeroValue string e := &EditDefaultBranch{From: &zeroValue} e.GetFrom() e = &EditDefaultBranch{} e.GetFrom() e = nil e.GetFrom() } func TestEditOwner_GetOwnerInfo(tt *testing.T) { e := &EditOwner{} e.GetOwnerInfo() e = nil e.GetOwnerInfo() } func TestEditRef_GetFrom(tt *testing.T) { var zeroValue string e := &EditRef{From: &zeroValue} e.GetFrom() e = &EditRef{} e.GetFrom() e = nil e.GetFrom() } func TestEditRepo_GetName(tt *testing.T) { e := &EditRepo{} e.GetName() e = nil e.GetName() } 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 TestEnterpriseRunnerGroup_GetAllowsPublicRepositories(tt *testing.T) { var zeroValue bool e := &EnterpriseRunnerGroup{AllowsPublicRepositories: &zeroValue} e.GetAllowsPublicRepositories() e = &EnterpriseRunnerGroup{} e.GetAllowsPublicRepositories() e = nil e.GetAllowsPublicRepositories() } func TestEnterpriseRunnerGroup_GetDefault(tt *testing.T) { var zeroValue bool e := &EnterpriseRunnerGroup{Default: &zeroValue} e.GetDefault() e = &EnterpriseRunnerGroup{} e.GetDefault() e = nil e.GetDefault() } func TestEnterpriseRunnerGroup_GetID(tt *testing.T) { var zeroValue int64 e := &EnterpriseRunnerGroup{ID: &zeroValue} e.GetID() e = &EnterpriseRunnerGroup{} e.GetID() e = nil e.GetID() } func TestEnterpriseRunnerGroup_GetInherited(tt *testing.T) { var zeroValue bool e := &EnterpriseRunnerGroup{Inherited: &zeroValue} e.GetInherited() e = &EnterpriseRunnerGroup{} e.GetInherited() e = nil e.GetInherited() } func TestEnterpriseRunnerGroup_GetName(tt *testing.T) { var zeroValue string e := &EnterpriseRunnerGroup{Name: &zeroValue} e.GetName() e = &EnterpriseRunnerGroup{} e.GetName() e = nil e.GetName() } func TestEnterpriseRunnerGroup_GetRestrictedToWorkflows(tt *testing.T) { var zeroValue bool e := &EnterpriseRunnerGroup{RestrictedToWorkflows: &zeroValue} e.GetRestrictedToWorkflows() e = &EnterpriseRunnerGroup{} e.GetRestrictedToWorkflows() e = nil e.GetRestrictedToWorkflows() } func TestEnterpriseRunnerGroup_GetRunnersURL(tt *testing.T) { var zeroValue string e := &EnterpriseRunnerGroup{RunnersURL: &zeroValue} e.GetRunnersURL() e = &EnterpriseRunnerGroup{} e.GetRunnersURL() e = nil e.GetRunnersURL() } func TestEnterpriseRunnerGroup_GetSelectedOrganizationsURL(tt *testing.T) { var zeroValue string e := &EnterpriseRunnerGroup{SelectedOrganizationsURL: &zeroValue} e.GetSelectedOrganizationsURL() e = &EnterpriseRunnerGroup{} e.GetSelectedOrganizationsURL() e = nil e.GetSelectedOrganizationsURL() } func TestEnterpriseRunnerGroup_GetVisibility(tt *testing.T) { var zeroValue string e := &EnterpriseRunnerGroup{Visibility: &zeroValue} e.GetVisibility() e = &EnterpriseRunnerGroup{} e.GetVisibility() e = nil e.GetVisibility() } func TestEnterpriseRunnerGroup_GetWorkflowRestrictionsReadOnly(tt *testing.T) { var zeroValue bool e := &EnterpriseRunnerGroup{WorkflowRestrictionsReadOnly: &zeroValue} e.GetWorkflowRestrictionsReadOnly() e = &EnterpriseRunnerGroup{} e.GetWorkflowRestrictionsReadOnly() e = nil e.GetWorkflowRestrictionsReadOnly() } func TestEnterpriseRunnerGroups_GetTotalCount(tt *testing.T) { var zeroValue int e := &EnterpriseRunnerGroups{TotalCount: &zeroValue} e.GetTotalCount() e = &EnterpriseRunnerGroups{} e.GetTotalCount() e = nil e.GetTotalCount() } func TestEnterpriseSecurityAnalysisSettings_GetAdvancedSecurityEnabledForNewRepositories(tt *testing.T) { var zeroValue bool e := &EnterpriseSecurityAnalysisSettings{AdvancedSecurityEnabledForNewRepositories: &zeroValue} e.GetAdvancedSecurityEnabledForNewRepositories() e = &EnterpriseSecurityAnalysisSettings{} e.GetAdvancedSecurityEnabledForNewRepositories() e = nil e.GetAdvancedSecurityEnabledForNewRepositories() } func TestEnterpriseSecurityAnalysisSettings_GetSecretScanningEnabledForNewRepositories(tt *testing.T) { var zeroValue bool e := &EnterpriseSecurityAnalysisSettings{SecretScanningEnabledForNewRepositories: &zeroValue} e.GetSecretScanningEnabledForNewRepositories() e = &EnterpriseSecurityAnalysisSettings{} e.GetSecretScanningEnabledForNewRepositories() e = nil e.GetSecretScanningEnabledForNewRepositories() } func TestEnterpriseSecurityAnalysisSettings_GetSecretScanningPushProtectionCustomLink(tt *testing.T) { var zeroValue string e := &EnterpriseSecurityAnalysisSettings{SecretScanningPushProtectionCustomLink: &zeroValue} e.GetSecretScanningPushProtectionCustomLink() e = &EnterpriseSecurityAnalysisSettings{} e.GetSecretScanningPushProtectionCustomLink() e = nil e.GetSecretScanningPushProtectionCustomLink() } func TestEnterpriseSecurityAnalysisSettings_GetSecretScanningPushProtectionEnabledForNewRepositories(tt *testing.T) { var zeroValue bool e := &EnterpriseSecurityAnalysisSettings{SecretScanningPushProtectionEnabledForNewRepositories: &zeroValue} e.GetSecretScanningPushProtectionEnabledForNewRepositories() e = &EnterpriseSecurityAnalysisSettings{} e.GetSecretScanningPushProtectionEnabledForNewRepositories() e = nil e.GetSecretScanningPushProtectionEnabledForNewRepositories() } func TestEnterpriseSecurityAnalysisSettings_GetSecretScanningValidityChecksEnabled(tt *testing.T) { var zeroValue bool e := &EnterpriseSecurityAnalysisSettings{SecretScanningValidityChecksEnabled: &zeroValue} e.GetSecretScanningValidityChecksEnabled() e = &EnterpriseSecurityAnalysisSettings{} e.GetSecretScanningValidityChecksEnabled() e = nil e.GetSecretScanningValidityChecksEnabled() } func TestEnvironment_GetCanAdminsBypass(tt *testing.T) { var zeroValue bool e := &Environment{CanAdminsBypass: &zeroValue} e.GetCanAdminsBypass() e = &Environment{} e.GetCanAdminsBypass() e = nil e.GetCanAdminsBypass() } 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 Timestamp 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 TestExternalGroup_GetGroupID(tt *testing.T) { var zeroValue int64 e := &ExternalGroup{GroupID: &zeroValue} e.GetGroupID() e = &ExternalGroup{} e.GetGroupID() e = nil e.GetGroupID() } func TestExternalGroup_GetGroupName(tt *testing.T) { var zeroValue string e := &ExternalGroup{GroupName: &zeroValue} e.GetGroupName() e = &ExternalGroup{} e.GetGroupName() e = nil e.GetGroupName() } func TestExternalGroup_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp e := &ExternalGroup{UpdatedAt: &zeroValue} e.GetUpdatedAt() e = &ExternalGroup{} e.GetUpdatedAt() e = nil e.GetUpdatedAt() } func TestExternalGroupMember_GetMemberEmail(tt *testing.T) { var zeroValue string e := &ExternalGroupMember{MemberEmail: &zeroValue} e.GetMemberEmail() e = &ExternalGroupMember{} e.GetMemberEmail() e = nil e.GetMemberEmail() } func TestExternalGroupMember_GetMemberID(tt *testing.T) { var zeroValue int64 e := &ExternalGroupMember{MemberID: &zeroValue} e.GetMemberID() e = &ExternalGroupMember{} e.GetMemberID() e = nil e.GetMemberID() } func TestExternalGroupMember_GetMemberLogin(tt *testing.T) { var zeroValue string e := &ExternalGroupMember{MemberLogin: &zeroValue} e.GetMemberLogin() e = &ExternalGroupMember{} e.GetMemberLogin() e = nil e.GetMemberLogin() } func TestExternalGroupMember_GetMemberName(tt *testing.T) { var zeroValue string e := &ExternalGroupMember{MemberName: &zeroValue} e.GetMemberName() e = &ExternalGroupMember{} e.GetMemberName() e = nil e.GetMemberName() } func TestExternalGroupTeam_GetTeamID(tt *testing.T) { var zeroValue int64 e := &ExternalGroupTeam{TeamID: &zeroValue} e.GetTeamID() e = &ExternalGroupTeam{} e.GetTeamID() e = nil e.GetTeamID() } func TestExternalGroupTeam_GetTeamName(tt *testing.T) { var zeroValue string e := &ExternalGroupTeam{TeamName: &zeroValue} e.GetTeamName() e = &ExternalGroupTeam{} e.GetTeamName() e = nil e.GetTeamName() } 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 TestFirstPatchedVersion_GetIdentifier(tt *testing.T) { var zeroValue string f := &FirstPatchedVersion{Identifier: &zeroValue} f.GetIdentifier() f = &FirstPatchedVersion{} f.GetIdentifier() f = nil f.GetIdentifier() } 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 TestGenerateJITConfigRequest_GetWorkFolder(tt *testing.T) { var zeroValue string g := &GenerateJITConfigRequest{WorkFolder: &zeroValue} g.GetWorkFolder() g = &GenerateJITConfigRequest{} g.GetWorkFolder() g = nil g.GetWorkFolder() } func TestGenerateNotesOptions_GetPreviousTagName(tt *testing.T) { var zeroValue string g := &GenerateNotesOptions{PreviousTagName: &zeroValue} g.GetPreviousTagName() g = &GenerateNotesOptions{} g.GetPreviousTagName() g = nil g.GetPreviousTagName() } func TestGenerateNotesOptions_GetTargetCommitish(tt *testing.T) { var zeroValue string g := &GenerateNotesOptions{TargetCommitish: &zeroValue} g.GetTargetCommitish() g = &GenerateNotesOptions{} g.GetTargetCommitish() g = nil g.GetTargetCommitish() } 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 Timestamp 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 Timestamp 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 Timestamp 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_GetInstallation(tt *testing.T) { g := &GitHubAppAuthorizationEvent{} g.GetInstallation() g = nil g.GetInstallation() } 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 TestGlobalSecurityAdvisory_GetGithubReviewedAt(tt *testing.T) { var zeroValue Timestamp g := &GlobalSecurityAdvisory{GithubReviewedAt: &zeroValue} g.GetGithubReviewedAt() g = &GlobalSecurityAdvisory{} g.GetGithubReviewedAt() g = nil g.GetGithubReviewedAt() } func TestGlobalSecurityAdvisory_GetID(tt *testing.T) { var zeroValue int64 g := &GlobalSecurityAdvisory{ID: &zeroValue} g.GetID() g = &GlobalSecurityAdvisory{} g.GetID() g = nil g.GetID() } func TestGlobalSecurityAdvisory_GetNVDPublishedAt(tt *testing.T) { var zeroValue Timestamp g := &GlobalSecurityAdvisory{NVDPublishedAt: &zeroValue} g.GetNVDPublishedAt() g = &GlobalSecurityAdvisory{} g.GetNVDPublishedAt() g = nil g.GetNVDPublishedAt() } func TestGlobalSecurityAdvisory_GetRepositoryAdvisoryURL(tt *testing.T) { var zeroValue string g := &GlobalSecurityAdvisory{RepositoryAdvisoryURL: &zeroValue} g.GetRepositoryAdvisoryURL() g = &GlobalSecurityAdvisory{} g.GetRepositoryAdvisoryURL() g = nil g.GetRepositoryAdvisoryURL() } func TestGlobalSecurityAdvisory_GetSourceCodeLocation(tt *testing.T) { var zeroValue string g := &GlobalSecurityAdvisory{SourceCodeLocation: &zeroValue} g.GetSourceCodeLocation() g = &GlobalSecurityAdvisory{} g.GetSourceCodeLocation() g = nil g.GetSourceCodeLocation() } func TestGlobalSecurityAdvisory_GetType(tt *testing.T) { var zeroValue string g := &GlobalSecurityAdvisory{Type: &zeroValue} g.GetType() g = &GlobalSecurityAdvisory{} g.GetType() g = nil g.GetType() } func TestGlobalSecurityVulnerability_GetFirstPatchedVersion(tt *testing.T) { var zeroValue string g := &GlobalSecurityVulnerability{FirstPatchedVersion: &zeroValue} g.GetFirstPatchedVersion() g = &GlobalSecurityVulnerability{} g.GetFirstPatchedVersion() g = nil g.GetFirstPatchedVersion() } func TestGlobalSecurityVulnerability_GetPackage(tt *testing.T) { g := &GlobalSecurityVulnerability{} g.GetPackage() g = nil g.GetPackage() } func TestGlobalSecurityVulnerability_GetVulnerableVersionRange(tt *testing.T) { var zeroValue string g := &GlobalSecurityVulnerability{VulnerableVersionRange: &zeroValue} g.GetVulnerableVersionRange() g = &GlobalSecurityVulnerability{} g.GetVulnerableVersionRange() g = nil g.GetVulnerableVersionRange() } func TestGollumEvent_GetInstallation(tt *testing.T) { g := &GollumEvent{} g.GetInstallation() g = nil g.GetInstallation() } func TestGollumEvent_GetOrg(tt *testing.T) { g := &GollumEvent{} g.GetOrg() g = nil g.GetOrg() } 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 Timestamp g := &GPGKey{CreatedAt: &zeroValue} g.GetCreatedAt() g = &GPGKey{} g.GetCreatedAt() g = nil g.GetCreatedAt() } func TestGPGKey_GetExpiresAt(tt *testing.T) { var zeroValue Timestamp 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 TestGPGKey_GetRawKey(tt *testing.T) { var zeroValue string g := &GPGKey{RawKey: &zeroValue} g.GetRawKey() g = &GPGKey{} g.GetRawKey() g = nil g.GetRawKey() } 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_GetConfig(tt *testing.T) { h := &Hook{} h.GetConfig() h = nil h.GetConfig() } func TestHook_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp 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 Timestamp 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_GetSecret(tt *testing.T) { var zeroValue string h := &HookConfig{Secret: &zeroValue} h.GetSecret() h = &HookConfig{} h.GetSecret() h = nil h.GetSecret() } 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 int64 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 TestInstallationChanges_GetLogin(tt *testing.T) { i := &InstallationChanges{} i.GetLogin() i = nil i.GetLogin() } func TestInstallationChanges_GetSlug(tt *testing.T) { i := &InstallationChanges{} i.GetSlug() i = nil i.GetSlug() } 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_GetOrg(tt *testing.T) { i := &InstallationEvent{} i.GetOrg() i = nil i.GetOrg() } func TestInstallationEvent_GetRequester(tt *testing.T) { i := &InstallationEvent{} i.GetRequester() i = nil i.GetRequester() } func TestInstallationEvent_GetSender(tt *testing.T) { i := &InstallationEvent{} i.GetSender() i = nil i.GetSender() } func TestInstallationLoginChange_GetFrom(tt *testing.T) { var zeroValue string i := &InstallationLoginChange{From: &zeroValue} i.GetFrom() i = &InstallationLoginChange{} i.GetFrom() i = nil i.GetFrom() } 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_GetOrganizationCustomRoles(tt *testing.T) { var zeroValue string i := &InstallationPermissions{OrganizationCustomRoles: &zeroValue} i.GetOrganizationCustomRoles() i = &InstallationPermissions{} i.GetOrganizationCustomRoles() i = nil i.GetOrganizationCustomRoles() } 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_GetOrganizationPackages(tt *testing.T) { var zeroValue string i := &InstallationPermissions{OrganizationPackages: &zeroValue} i.GetOrganizationPackages() i = &InstallationPermissions{} i.GetOrganizationPackages() i = nil i.GetOrganizationPackages() } 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_GetOrg(tt *testing.T) { i := &InstallationRepositoriesEvent{} i.GetOrg() i = nil i.GetOrg() } 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 TestInstallationRequest_GetAccount(tt *testing.T) { i := &InstallationRequest{} i.GetAccount() i = nil i.GetAccount() } func TestInstallationRequest_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp i := &InstallationRequest{CreatedAt: &zeroValue} i.GetCreatedAt() i = &InstallationRequest{} i.GetCreatedAt() i = nil i.GetCreatedAt() } func TestInstallationRequest_GetID(tt *testing.T) { var zeroValue int64 i := &InstallationRequest{ID: &zeroValue} i.GetID() i = &InstallationRequest{} i.GetID() i = nil i.GetID() } func TestInstallationRequest_GetNodeID(tt *testing.T) { var zeroValue string i := &InstallationRequest{NodeID: &zeroValue} i.GetNodeID() i = &InstallationRequest{} i.GetNodeID() i = nil i.GetNodeID() } func TestInstallationRequest_GetRequester(tt *testing.T) { i := &InstallationRequest{} i.GetRequester() i = nil i.GetRequester() } func TestInstallationSlugChange_GetFrom(tt *testing.T) { var zeroValue string i := &InstallationSlugChange{From: &zeroValue} i.GetFrom() i = &InstallationSlugChange{} i.GetFrom() i = nil i.GetFrom() } func TestInstallationTargetEvent_GetAccount(tt *testing.T) { i := &InstallationTargetEvent{} i.GetAccount() i = nil i.GetAccount() } func TestInstallationTargetEvent_GetAction(tt *testing.T) { var zeroValue string i := &InstallationTargetEvent{Action: &zeroValue} i.GetAction() i = &InstallationTargetEvent{} i.GetAction() i = nil i.GetAction() } func TestInstallationTargetEvent_GetChanges(tt *testing.T) { i := &InstallationTargetEvent{} i.GetChanges() i = nil i.GetChanges() } func TestInstallationTargetEvent_GetEnterprise(tt *testing.T) { i := &InstallationTargetEvent{} i.GetEnterprise() i = nil i.GetEnterprise() } func TestInstallationTargetEvent_GetInstallation(tt *testing.T) { i := &InstallationTargetEvent{} i.GetInstallation() i = nil i.GetInstallation() } func TestInstallationTargetEvent_GetOrganization(tt *testing.T) { i := &InstallationTargetEvent{} i.GetOrganization() i = nil i.GetOrganization() } func TestInstallationTargetEvent_GetRepository(tt *testing.T) { i := &InstallationTargetEvent{} i.GetRepository() i = nil i.GetRepository() } func TestInstallationTargetEvent_GetSender(tt *testing.T) { i := &InstallationTargetEvent{} i.GetSender() i = nil i.GetSender() } func TestInstallationTargetEvent_GetTargetType(tt *testing.T) { var zeroValue string i := &InstallationTargetEvent{TargetType: &zeroValue} i.GetTargetType() i = &InstallationTargetEvent{} i.GetTargetType() i = nil i.GetTargetType() } func TestInstallationToken_GetExpiresAt(tt *testing.T) { var zeroValue Timestamp 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 Timestamp 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 Timestamp 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 Timestamp i := &Issue{CreatedAt: &zeroValue} i.GetCreatedAt() i = &Issue{} i.GetCreatedAt() i = nil i.GetCreatedAt() } func TestIssue_GetDraft(tt *testing.T) { var zeroValue bool i := &Issue{Draft: &zeroValue} i.GetDraft() i = &Issue{} i.GetDraft() i = nil i.GetDraft() } 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_GetStateReason(tt *testing.T) { var zeroValue string i := &Issue{StateReason: &zeroValue} i.GetStateReason() i = &Issue{} i.GetStateReason() i = nil i.GetStateReason() } 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 Timestamp 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 Timestamp 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 Timestamp 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_GetOrganization(tt *testing.T) { i := &IssueCommentEvent{} i.GetOrganization() i = nil i.GetOrganization() } 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 Timestamp 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_GetPerformedViaGithubApp(tt *testing.T) { i := &IssueEvent{} i.GetPerformedViaGithubApp() i = nil i.GetPerformedViaGithubApp() } 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_GetRepository(tt *testing.T) { i := &IssueEvent{} i.GetRepository() i = nil i.GetRepository() } func TestIssueEvent_GetRequestedReviewer(tt *testing.T) { i := &IssueEvent{} i.GetRequestedReviewer() i = nil i.GetRequestedReviewer() } func TestIssueEvent_GetRequestedTeam(tt *testing.T) { i := &IssueEvent{} i.GetRequestedTeam() i = nil i.GetRequestedTeam() } 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 Timestamp i := &IssueImport{ClosedAt: &zeroValue} i.GetClosedAt() i = &IssueImport{} i.GetClosedAt() i = nil i.GetClosedAt() } func TestIssueImport_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp 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 Timestamp 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 Timestamp 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 Timestamp 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_GetStateReason(tt *testing.T) { var zeroValue string i := &IssueRequest{StateReason: &zeroValue} i.GetStateReason() i = &IssueRequest{} i.GetStateReason() i = nil i.GetStateReason() } 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_GetMilestone(tt *testing.T) { i := &IssuesEvent{} i.GetMilestone() i = nil i.GetMilestone() } func TestIssuesEvent_GetOrg(tt *testing.T) { i := &IssuesEvent{} i.GetOrg() i = nil i.GetOrg() } 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 TestJITRunnerConfig_GetEncodedJITConfig(tt *testing.T) { var zeroValue string j := &JITRunnerConfig{EncodedJITConfig: &zeroValue} j.GetEncodedJITConfig() j = &JITRunnerConfig{} j.GetEncodedJITConfig() j = nil j.GetEncodedJITConfig() } func TestJITRunnerConfig_GetRunner(tt *testing.T) { j := &JITRunnerConfig{} j.GetRunner() j = nil j.GetRunner() } 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_GetAddedBy(tt *testing.T) { var zeroValue string k := &Key{AddedBy: &zeroValue} k.GetAddedBy() k = &Key{} k.GetAddedBy() k = nil k.GetAddedBy() } 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_GetLastUsed(tt *testing.T) { var zeroValue Timestamp k := &Key{LastUsed: &zeroValue} k.GetLastUsed() k = &Key{} k.GetLastUsed() k = nil k.GetLastUsed() } 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 TestLabelEvent_GetSender(tt *testing.T) { l := &LabelEvent{} l.GetSender() l = nil l.GetSender() } 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 TestLinearHistoryRequirementEnforcementLevelChanges_GetFrom(tt *testing.T) { var zeroValue string l := &LinearHistoryRequirementEnforcementLevelChanges{From: &zeroValue} l.GetFrom() l = &LinearHistoryRequirementEnforcementLevelChanges{} l.GetFrom() l = nil l.GetFrom() } func TestListAlertsOptions_GetDirection(tt *testing.T) { var zeroValue string l := &ListAlertsOptions{Direction: &zeroValue} l.GetDirection() l = &ListAlertsOptions{} l.GetDirection() l = nil l.GetDirection() } func TestListAlertsOptions_GetEcosystem(tt *testing.T) { var zeroValue string l := &ListAlertsOptions{Ecosystem: &zeroValue} l.GetEcosystem() l = &ListAlertsOptions{} l.GetEcosystem() l = nil l.GetEcosystem() } func TestListAlertsOptions_GetPackage(tt *testing.T) { var zeroValue string l := &ListAlertsOptions{Package: &zeroValue} l.GetPackage() l = &ListAlertsOptions{} l.GetPackage() l = nil l.GetPackage() } func TestListAlertsOptions_GetScope(tt *testing.T) { var zeroValue string l := &ListAlertsOptions{Scope: &zeroValue} l.GetScope() l = &ListAlertsOptions{} l.GetScope() l = nil l.GetScope() } func TestListAlertsOptions_GetSeverity(tt *testing.T) { var zeroValue string l := &ListAlertsOptions{Severity: &zeroValue} l.GetSeverity() l = &ListAlertsOptions{} l.GetSeverity() l = nil l.GetSeverity() } func TestListAlertsOptions_GetSort(tt *testing.T) { var zeroValue string l := &ListAlertsOptions{Sort: &zeroValue} l.GetSort() l = &ListAlertsOptions{} l.GetSort() l = nil l.GetSort() } func TestListAlertsOptions_GetState(tt *testing.T) { var zeroValue string l := &ListAlertsOptions{State: &zeroValue} l.GetState() l = &ListAlertsOptions{} l.GetState() l = nil l.GetState() } func TestListCheckRunsOptions_GetAppID(tt *testing.T) { var zeroValue int64 l := &ListCheckRunsOptions{AppID: &zeroValue} l.GetAppID() l = &ListCheckRunsOptions{} l.GetAppID() l = nil l.GetAppID() } 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 TestListCodespaces_GetTotalCount(tt *testing.T) { var zeroValue int l := &ListCodespaces{TotalCount: &zeroValue} l.GetTotalCount() l = &ListCodespaces{} l.GetTotalCount() l = nil l.GetTotalCount() } func TestListCollaboratorOptions_GetAffiliation(tt *testing.T) { var zeroValue string l := &ListCollaboratorOptions{Affiliation: &zeroValue} l.GetAffiliation() l = &ListCollaboratorOptions{} l.GetAffiliation() l = nil l.GetAffiliation() } func TestListCustomDeploymentRuleIntegrationsResponse_GetTotalCount(tt *testing.T) { var zeroValue int l := &ListCustomDeploymentRuleIntegrationsResponse{TotalCount: &zeroValue} l.GetTotalCount() l = &ListCustomDeploymentRuleIntegrationsResponse{} l.GetTotalCount() l = nil l.GetTotalCount() } func TestListDeploymentProtectionRuleResponse_GetTotalCount(tt *testing.T) { var zeroValue int l := &ListDeploymentProtectionRuleResponse{TotalCount: &zeroValue} l.GetTotalCount() l = &ListDeploymentProtectionRuleResponse{} l.GetTotalCount() l = nil l.GetTotalCount() } func TestListExternalGroupsOptions_GetDisplayName(tt *testing.T) { var zeroValue string l := &ListExternalGroupsOptions{DisplayName: &zeroValue} l.GetDisplayName() l = &ListExternalGroupsOptions{} l.GetDisplayName() l = nil l.GetDisplayName() } func TestListGlobalSecurityAdvisoriesOptions_GetAffects(tt *testing.T) { var zeroValue string l := &ListGlobalSecurityAdvisoriesOptions{Affects: &zeroValue} l.GetAffects() l = &ListGlobalSecurityAdvisoriesOptions{} l.GetAffects() l = nil l.GetAffects() } func TestListGlobalSecurityAdvisoriesOptions_GetCVEID(tt *testing.T) { var zeroValue string l := &ListGlobalSecurityAdvisoriesOptions{CVEID: &zeroValue} l.GetCVEID() l = &ListGlobalSecurityAdvisoriesOptions{} l.GetCVEID() l = nil l.GetCVEID() } func TestListGlobalSecurityAdvisoriesOptions_GetEcosystem(tt *testing.T) { var zeroValue string l := &ListGlobalSecurityAdvisoriesOptions{Ecosystem: &zeroValue} l.GetEcosystem() l = &ListGlobalSecurityAdvisoriesOptions{} l.GetEcosystem() l = nil l.GetEcosystem() } func TestListGlobalSecurityAdvisoriesOptions_GetGHSAID(tt *testing.T) { var zeroValue string l := &ListGlobalSecurityAdvisoriesOptions{GHSAID: &zeroValue} l.GetGHSAID() l = &ListGlobalSecurityAdvisoriesOptions{} l.GetGHSAID() l = nil l.GetGHSAID() } func TestListGlobalSecurityAdvisoriesOptions_GetIsWithdrawn(tt *testing.T) { var zeroValue bool l := &ListGlobalSecurityAdvisoriesOptions{IsWithdrawn: &zeroValue} l.GetIsWithdrawn() l = &ListGlobalSecurityAdvisoriesOptions{} l.GetIsWithdrawn() l = nil l.GetIsWithdrawn() } func TestListGlobalSecurityAdvisoriesOptions_GetModified(tt *testing.T) { var zeroValue string l := &ListGlobalSecurityAdvisoriesOptions{Modified: &zeroValue} l.GetModified() l = &ListGlobalSecurityAdvisoriesOptions{} l.GetModified() l = nil l.GetModified() } func TestListGlobalSecurityAdvisoriesOptions_GetPublished(tt *testing.T) { var zeroValue string l := &ListGlobalSecurityAdvisoriesOptions{Published: &zeroValue} l.GetPublished() l = &ListGlobalSecurityAdvisoriesOptions{} l.GetPublished() l = nil l.GetPublished() } func TestListGlobalSecurityAdvisoriesOptions_GetSeverity(tt *testing.T) { var zeroValue string l := &ListGlobalSecurityAdvisoriesOptions{Severity: &zeroValue} l.GetSeverity() l = &ListGlobalSecurityAdvisoriesOptions{} l.GetSeverity() l = nil l.GetSeverity() } func TestListGlobalSecurityAdvisoriesOptions_GetType(tt *testing.T) { var zeroValue string l := &ListGlobalSecurityAdvisoriesOptions{Type: &zeroValue} l.GetType() l = &ListGlobalSecurityAdvisoriesOptions{} l.GetType() l = nil l.GetType() } func TestListGlobalSecurityAdvisoriesOptions_GetUpdated(tt *testing.T) { var zeroValue string l := &ListGlobalSecurityAdvisoriesOptions{Updated: &zeroValue} l.GetUpdated() l = &ListGlobalSecurityAdvisoriesOptions{} l.GetUpdated() l = nil l.GetUpdated() } func TestListOrganizations_GetTotalCount(tt *testing.T) { var zeroValue int l := &ListOrganizations{TotalCount: &zeroValue} l.GetTotalCount() l = &ListOrganizations{} l.GetTotalCount() l = nil l.GetTotalCount() } func TestListRepositories_GetTotalCount(tt *testing.T) { var zeroValue int l := &ListRepositories{TotalCount: &zeroValue} l.GetTotalCount() l = &ListRepositories{} l.GetTotalCount() l = nil l.GetTotalCount() } func TestListSCIMProvisionedIdentitiesOptions_GetCount(tt *testing.T) { var zeroValue int l := &ListSCIMProvisionedIdentitiesOptions{Count: &zeroValue} l.GetCount() l = &ListSCIMProvisionedIdentitiesOptions{} l.GetCount() l = nil l.GetCount() } func TestListSCIMProvisionedIdentitiesOptions_GetFilter(tt *testing.T) { var zeroValue string l := &ListSCIMProvisionedIdentitiesOptions{Filter: &zeroValue} l.GetFilter() l = &ListSCIMProvisionedIdentitiesOptions{} l.GetFilter() l = nil l.GetFilter() } func TestListSCIMProvisionedIdentitiesOptions_GetStartIndex(tt *testing.T) { var zeroValue int l := &ListSCIMProvisionedIdentitiesOptions{StartIndex: &zeroValue} l.GetStartIndex() l = &ListSCIMProvisionedIdentitiesOptions{} l.GetStartIndex() l = nil l.GetStartIndex() } 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 TestLockBranch_GetEnabled(tt *testing.T) { var zeroValue bool l := &LockBranch{Enabled: &zeroValue} l.GetEnabled() l = &LockBranch{} l.GetEnabled() l = nil l.GetEnabled() } 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_GetAccount(tt *testing.T) { m := &MarketplacePurchase{} m.GetAccount() m = nil m.GetAccount() } 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 TestMarketplacePurchaseAccount_GetEmail(tt *testing.T) { var zeroValue string m := &MarketplacePurchaseAccount{Email: &zeroValue} m.GetEmail() m = &MarketplacePurchaseAccount{} m.GetEmail() m = nil m.GetEmail() } func TestMarketplacePurchaseAccount_GetID(tt *testing.T) { var zeroValue int64 m := &MarketplacePurchaseAccount{ID: &zeroValue} m.GetID() m = &MarketplacePurchaseAccount{} m.GetID() m = nil m.GetID() } func TestMarketplacePurchaseAccount_GetLogin(tt *testing.T) { var zeroValue string m := &MarketplacePurchaseAccount{Login: &zeroValue} m.GetLogin() m = &MarketplacePurchaseAccount{} m.GetLogin() m = nil m.GetLogin() } func TestMarketplacePurchaseAccount_GetNodeID(tt *testing.T) { var zeroValue string m := &MarketplacePurchaseAccount{NodeID: &zeroValue} m.GetNodeID() m = &MarketplacePurchaseAccount{} m.GetNodeID() m = nil m.GetNodeID() } func TestMarketplacePurchaseAccount_GetOrganizationBillingEmail(tt *testing.T) { var zeroValue string m := &MarketplacePurchaseAccount{OrganizationBillingEmail: &zeroValue} m.GetOrganizationBillingEmail() m = &MarketplacePurchaseAccount{} m.GetOrganizationBillingEmail() m = nil m.GetOrganizationBillingEmail() } func TestMarketplacePurchaseAccount_GetType(tt *testing.T) { var zeroValue string m := &MarketplacePurchaseAccount{Type: &zeroValue} m.GetType() m = &MarketplacePurchaseAccount{} m.GetType() m = nil m.GetType() } func TestMarketplacePurchaseAccount_GetURL(tt *testing.T) { var zeroValue string m := &MarketplacePurchaseAccount{URL: &zeroValue} m.GetURL() m = &MarketplacePurchaseAccount{} m.GetURL() m = nil m.GetURL() } 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_GetOrg(tt *testing.T) { m := &MarketplacePurchaseEvent{} m.GetOrg() m = nil m.GetOrg() } 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_GetOrg(tt *testing.T) { m := &MemberEvent{} m.GetOrg() m = nil m.GetOrg() } 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 TestMergeGroup_GetBaseRef(tt *testing.T) { var zeroValue string m := &MergeGroup{BaseRef: &zeroValue} m.GetBaseRef() m = &MergeGroup{} m.GetBaseRef() m = nil m.GetBaseRef() } func TestMergeGroup_GetBaseSHA(tt *testing.T) { var zeroValue string m := &MergeGroup{BaseSHA: &zeroValue} m.GetBaseSHA() m = &MergeGroup{} m.GetBaseSHA() m = nil m.GetBaseSHA() } func TestMergeGroup_GetHeadCommit(tt *testing.T) { m := &MergeGroup{} m.GetHeadCommit() m = nil m.GetHeadCommit() } func TestMergeGroup_GetHeadRef(tt *testing.T) { var zeroValue string m := &MergeGroup{HeadRef: &zeroValue} m.GetHeadRef() m = &MergeGroup{} m.GetHeadRef() m = nil m.GetHeadRef() } func TestMergeGroup_GetHeadSHA(tt *testing.T) { var zeroValue string m := &MergeGroup{HeadSHA: &zeroValue} m.GetHeadSHA() m = &MergeGroup{} m.GetHeadSHA() m = nil m.GetHeadSHA() } func TestMergeGroupEvent_GetAction(tt *testing.T) { var zeroValue string m := &MergeGroupEvent{Action: &zeroValue} m.GetAction() m = &MergeGroupEvent{} m.GetAction() m = nil m.GetAction() } func TestMergeGroupEvent_GetInstallation(tt *testing.T) { m := &MergeGroupEvent{} m.GetInstallation() m = nil m.GetInstallation() } func TestMergeGroupEvent_GetMergeGroup(tt *testing.T) { m := &MergeGroupEvent{} m.GetMergeGroup() m = nil m.GetMergeGroup() } func TestMergeGroupEvent_GetOrg(tt *testing.T) { m := &MergeGroupEvent{} m.GetOrg() m = nil m.GetOrg() } func TestMergeGroupEvent_GetRepo(tt *testing.T) { m := &MergeGroupEvent{} m.GetRepo() m = nil m.GetRepo() } func TestMergeGroupEvent_GetSender(tt *testing.T) { m := &MergeGroupEvent{} m.GetSender() m = nil m.GetSender() } 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 TestMetaEvent_GetInstallation(tt *testing.T) { m := &MetaEvent{} m.GetInstallation() m = nil m.GetInstallation() } func TestMetaEvent_GetOrg(tt *testing.T) { m := &MetaEvent{} m.GetOrg() m = nil m.GetOrg() } func TestMetaEvent_GetRepo(tt *testing.T) { m := &MetaEvent{} m.GetRepo() m = nil m.GetRepo() } func TestMetaEvent_GetSender(tt *testing.T) { m := &MetaEvent{} m.GetSender() m = nil m.GetSender() } 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_GetNodeID(tt *testing.T) { var zeroValue string m := &Metric{NodeID: &zeroValue} m.GetNodeID() m = &Metric{} m.GetNodeID() m = nil m.GetNodeID() } func TestMetric_GetSPDXID(tt *testing.T) { var zeroValue string m := &Metric{SPDXID: &zeroValue} m.GetSPDXID() m = &Metric{} m.GetSPDXID() m = nil m.GetSPDXID() } 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 Timestamp 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 Timestamp 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 Timestamp 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 Timestamp 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_GetCategory(tt *testing.T) { var zeroValue string m := &MostRecentInstance{Category: &zeroValue} m.GetCategory() m = &MostRecentInstance{} m.GetCategory() m = nil m.GetCategory() } 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_GetHTMLURL(tt *testing.T) { var zeroValue string m := &MostRecentInstance{HTMLURL: &zeroValue} m.GetHTMLURL() m = &MostRecentInstance{} m.GetHTMLURL() m = nil m.GetHTMLURL() } 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_GetHeadRepo(tt *testing.T) { var zeroValue string n := &NewPullRequest{HeadRepo: &zeroValue} n.GetHeadRepo() n = &NewPullRequest{} n.GetHeadRepo() n = nil n.GetHeadRepo() } 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 Timestamp 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 Timestamp 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 TestOIDCSubjectClaimCustomTemplate_GetUseDefault(tt *testing.T) { var zeroValue bool o := &OIDCSubjectClaimCustomTemplate{UseDefault: &zeroValue} o.GetUseDefault() o = &OIDCSubjectClaimCustomTemplate{} o.GetUseDefault() o = nil o.GetUseDefault() } func TestOrganization_GetAdvancedSecurityEnabledForNewRepos(tt *testing.T) { var zeroValue bool o := &Organization{AdvancedSecurityEnabledForNewRepos: &zeroValue} o.GetAdvancedSecurityEnabledForNewRepos() o = &Organization{} o.GetAdvancedSecurityEnabledForNewRepos() o = nil o.GetAdvancedSecurityEnabledForNewRepos() } 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 Timestamp 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_GetDependabotAlertsEnabledForNewRepos(tt *testing.T) { var zeroValue bool o := &Organization{DependabotAlertsEnabledForNewRepos: &zeroValue} o.GetDependabotAlertsEnabledForNewRepos() o = &Organization{} o.GetDependabotAlertsEnabledForNewRepos() o = nil o.GetDependabotAlertsEnabledForNewRepos() } func TestOrganization_GetDependabotSecurityUpdatesEnabledForNewRepos(tt *testing.T) { var zeroValue bool o := &Organization{DependabotSecurityUpdatesEnabledForNewRepos: &zeroValue} o.GetDependabotSecurityUpdatesEnabledForNewRepos() o = &Organization{} o.GetDependabotSecurityUpdatesEnabledForNewRepos() o = nil o.GetDependabotSecurityUpdatesEnabledForNewRepos() } func TestOrganization_GetDependencyGraphEnabledForNewRepos(tt *testing.T) { var zeroValue bool o := &Organization{DependencyGraphEnabledForNewRepos: &zeroValue} o.GetDependencyGraphEnabledForNewRepos() o = &Organization{} o.GetDependencyGraphEnabledForNewRepos() o = nil o.GetDependencyGraphEnabledForNewRepos() } 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_GetMembersCanForkPrivateRepos(tt *testing.T) { var zeroValue bool o := &Organization{MembersCanForkPrivateRepos: &zeroValue} o.GetMembersCanForkPrivateRepos() o = &Organization{} o.GetMembersCanForkPrivateRepos() o = nil o.GetMembersCanForkPrivateRepos() } 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 int64 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_GetSecretScanningEnabledForNewRepos(tt *testing.T) { var zeroValue bool o := &Organization{SecretScanningEnabledForNewRepos: &zeroValue} o.GetSecretScanningEnabledForNewRepos() o = &Organization{} o.GetSecretScanningEnabledForNewRepos() o = nil o.GetSecretScanningEnabledForNewRepos() } func TestOrganization_GetSecretScanningPushProtectionEnabledForNewRepos(tt *testing.T) { var zeroValue bool o := &Organization{SecretScanningPushProtectionEnabledForNewRepos: &zeroValue} o.GetSecretScanningPushProtectionEnabledForNewRepos() o = &Organization{} o.GetSecretScanningPushProtectionEnabledForNewRepos() o = nil o.GetSecretScanningPushProtectionEnabledForNewRepos() } func TestOrganization_GetSecretScanningValidityChecksEnabled(tt *testing.T) { var zeroValue bool o := &Organization{SecretScanningValidityChecksEnabled: &zeroValue} o.GetSecretScanningValidityChecksEnabled() o = &Organization{} o.GetSecretScanningValidityChecksEnabled() o = nil o.GetSecretScanningValidityChecksEnabled() } func TestOrganization_GetTotalPrivateRepos(tt *testing.T) { var zeroValue int64 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 Timestamp 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 TestOrganization_GetWebCommitSignoffRequired(tt *testing.T) { var zeroValue bool o := &Organization{WebCommitSignoffRequired: &zeroValue} o.GetWebCommitSignoffRequired() o = &Organization{} o.GetWebCommitSignoffRequired() o = nil o.GetWebCommitSignoffRequired() } func TestOrganizationCustomRepoRoles_GetTotalCount(tt *testing.T) { var zeroValue int o := &OrganizationCustomRepoRoles{TotalCount: &zeroValue} o.GetTotalCount() o = &OrganizationCustomRepoRoles{} o.GetTotalCount() o = nil o.GetTotalCount() } 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 TestOrgRequiredWorkflow_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp o := &OrgRequiredWorkflow{CreatedAt: &zeroValue} o.GetCreatedAt() o = &OrgRequiredWorkflow{} o.GetCreatedAt() o = nil o.GetCreatedAt() } func TestOrgRequiredWorkflow_GetID(tt *testing.T) { var zeroValue int64 o := &OrgRequiredWorkflow{ID: &zeroValue} o.GetID() o = &OrgRequiredWorkflow{} o.GetID() o = nil o.GetID() } func TestOrgRequiredWorkflow_GetName(tt *testing.T) { var zeroValue string o := &OrgRequiredWorkflow{Name: &zeroValue} o.GetName() o = &OrgRequiredWorkflow{} o.GetName() o = nil o.GetName() } func TestOrgRequiredWorkflow_GetPath(tt *testing.T) { var zeroValue string o := &OrgRequiredWorkflow{Path: &zeroValue} o.GetPath() o = &OrgRequiredWorkflow{} o.GetPath() o = nil o.GetPath() } func TestOrgRequiredWorkflow_GetRef(tt *testing.T) { var zeroValue string o := &OrgRequiredWorkflow{Ref: &zeroValue} o.GetRef() o = &OrgRequiredWorkflow{} o.GetRef() o = nil o.GetRef() } func TestOrgRequiredWorkflow_GetRepository(tt *testing.T) { o := &OrgRequiredWorkflow{} o.GetRepository() o = nil o.GetRepository() } func TestOrgRequiredWorkflow_GetScope(tt *testing.T) { var zeroValue string o := &OrgRequiredWorkflow{Scope: &zeroValue} o.GetScope() o = &OrgRequiredWorkflow{} o.GetScope() o = nil o.GetScope() } func TestOrgRequiredWorkflow_GetSelectedRepositoriesURL(tt *testing.T) { var zeroValue string o := &OrgRequiredWorkflow{SelectedRepositoriesURL: &zeroValue} o.GetSelectedRepositoriesURL() o = &OrgRequiredWorkflow{} o.GetSelectedRepositoriesURL() o = nil o.GetSelectedRepositoriesURL() } func TestOrgRequiredWorkflow_GetState(tt *testing.T) { var zeroValue string o := &OrgRequiredWorkflow{State: &zeroValue} o.GetState() o = &OrgRequiredWorkflow{} o.GetState() o = nil o.GetState() } func TestOrgRequiredWorkflow_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp o := &OrgRequiredWorkflow{UpdatedAt: &zeroValue} o.GetUpdatedAt() o = &OrgRequiredWorkflow{} o.GetUpdatedAt() o = nil o.GetUpdatedAt() } func TestOrgRequiredWorkflows_GetTotalCount(tt *testing.T) { var zeroValue int o := &OrgRequiredWorkflows{TotalCount: &zeroValue} o.GetTotalCount() o = &OrgRequiredWorkflows{} o.GetTotalCount() o = nil o.GetTotalCount() } 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 TestOwnerInfo_GetOrg(tt *testing.T) { o := &OwnerInfo{} o.GetOrg() o = nil o.GetOrg() } func TestOwnerInfo_GetUser(tt *testing.T) { o := &OwnerInfo{} o.GetUser() o = nil o.GetUser() } 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_GetRepository(tt *testing.T) { p := &Package{} p.GetRepository() p = nil p.GetRepository() } func TestPackage_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp p := &Package{UpdatedAt: &zeroValue} p.GetUpdatedAt() p = &Package{} p.GetUpdatedAt() p = nil p.GetUpdatedAt() } func TestPackage_GetURL(tt *testing.T) { var zeroValue string p := &Package{URL: &zeroValue} p.GetURL() p = &Package{} p.GetURL() p = nil p.GetURL() } func TestPackage_GetVersionCount(tt *testing.T) { var zeroValue int64 p := &Package{VersionCount: &zeroValue} p.GetVersionCount() p = &Package{} p.GetVersionCount() p = nil p.GetVersionCount() } func TestPackage_GetVisibility(tt *testing.T) { var zeroValue string p := &Package{Visibility: &zeroValue} p.GetVisibility() p = &Package{} p.GetVisibility() p = nil p.GetVisibility() } 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_GetInstallation(tt *testing.T) { p := &PackageEvent{} p.GetInstallation() p = nil p.GetInstallation() } 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 TestPackageListOptions_GetPackageType(tt *testing.T) { var zeroValue string p := &PackageListOptions{PackageType: &zeroValue} p.GetPackageType() p = &PackageListOptions{} p.GetPackageType() p = nil p.GetPackageType() } func TestPackageListOptions_GetState(tt *testing.T) { var zeroValue string p := &PackageListOptions{State: &zeroValue} p.GetState() p = &PackageListOptions{} p.GetState() p = nil p.GetState() } func TestPackageListOptions_GetVisibility(tt *testing.T) { var zeroValue string p := &PackageListOptions{Visibility: &zeroValue} p.GetVisibility() p = &PackageListOptions{} p.GetVisibility() p = nil p.GetVisibility() } func TestPackageMetadata_GetContainer(tt *testing.T) { p := &PackageMetadata{} p.GetContainer() p = nil p.GetContainer() } func TestPackageMetadata_GetPackageType(tt *testing.T) { var zeroValue string p := &PackageMetadata{PackageType: &zeroValue} p.GetPackageType() p = &PackageMetadata{} p.GetPackageType() p = nil p.GetPackageType() } 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_GetMetadata(tt *testing.T) { p := &PackageVersion{} p.GetMetadata() p = nil p.GetMetadata() } func TestPackageVersion_GetName(tt *testing.T) { var zeroValue string p := &PackageVersion{Name: &zeroValue} p.GetName() p = &PackageVersion{} p.GetName() p = nil p.GetName() } func TestPackageVersion_GetPackageHTMLURL(tt *testing.T) { var zeroValue string p := &PackageVersion{PackageHTMLURL: &zeroValue} p.GetPackageHTMLURL() p = &PackageVersion{} p.GetPackageHTMLURL() p = nil p.GetPackageHTMLURL() } 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_GetURL(tt *testing.T) { var zeroValue string p := &PackageVersion{URL: &zeroValue} p.GetURL() p = &PackageVersion{} p.GetURL() p = nil p.GetURL() } 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_GetOrg(tt *testing.T) { p := &PageBuildEvent{} p.GetOrg() p = nil p.GetOrg() } 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_GetBuildType(tt *testing.T) { var zeroValue string p := &Pages{BuildType: &zeroValue} p.GetBuildType() p = &Pages{} p.GetBuildType() p = nil p.GetBuildType() } 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_GetHTTPSCertificate(tt *testing.T) { p := &Pages{} p.GetHTTPSCertificate() p = nil p.GetHTTPSCertificate() } func TestPages_GetHTTPSEnforced(tt *testing.T) { var zeroValue bool p := &Pages{HTTPSEnforced: &zeroValue} p.GetHTTPSEnforced() p = &Pages{} p.GetHTTPSEnforced() p = nil p.GetHTTPSEnforced() } func TestPages_GetPublic(tt *testing.T) { var zeroValue bool p := &Pages{Public: &zeroValue} p.GetPublic() p = &Pages{} p.GetPublic() p = nil p.GetPublic() } 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 TestPagesDomain_GetCAAError(tt *testing.T) { var zeroValue string p := &PagesDomain{CAAError: &zeroValue} p.GetCAAError() p = &PagesDomain{} p.GetCAAError() p = nil p.GetCAAError() } func TestPagesDomain_GetDNSResolves(tt *testing.T) { var zeroValue bool p := &PagesDomain{DNSResolves: &zeroValue} p.GetDNSResolves() p = &PagesDomain{} p.GetDNSResolves() p = nil p.GetDNSResolves() } func TestPagesDomain_GetEnforcesHTTPS(tt *testing.T) { var zeroValue bool p := &PagesDomain{EnforcesHTTPS: &zeroValue} p.GetEnforcesHTTPS() p = &PagesDomain{} p.GetEnforcesHTTPS() p = nil p.GetEnforcesHTTPS() } func TestPagesDomain_GetHasCNAMERecord(tt *testing.T) { var zeroValue bool p := &PagesDomain{HasCNAMERecord: &zeroValue} p.GetHasCNAMERecord() p = &PagesDomain{} p.GetHasCNAMERecord() p = nil p.GetHasCNAMERecord() } func TestPagesDomain_GetHasMXRecordsPresent(tt *testing.T) { var zeroValue bool p := &PagesDomain{HasMXRecordsPresent: &zeroValue} p.GetHasMXRecordsPresent() p = &PagesDomain{} p.GetHasMXRecordsPresent() p = nil p.GetHasMXRecordsPresent() } func TestPagesDomain_GetHost(tt *testing.T) { var zeroValue string p := &PagesDomain{Host: &zeroValue} p.GetHost() p = &PagesDomain{} p.GetHost() p = nil p.GetHost() } func TestPagesDomain_GetHTTPSError(tt *testing.T) { var zeroValue string p := &PagesDomain{HTTPSError: &zeroValue} p.GetHTTPSError() p = &PagesDomain{} p.GetHTTPSError() p = nil p.GetHTTPSError() } func TestPagesDomain_GetIsApexDomain(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsApexDomain: &zeroValue} p.GetIsApexDomain() p = &PagesDomain{} p.GetIsApexDomain() p = nil p.GetIsApexDomain() } func TestPagesDomain_GetIsARecord(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsARecord: &zeroValue} p.GetIsARecord() p = &PagesDomain{} p.GetIsARecord() p = nil p.GetIsARecord() } func TestPagesDomain_GetIsCloudflareIP(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsCloudflareIP: &zeroValue} p.GetIsCloudflareIP() p = &PagesDomain{} p.GetIsCloudflareIP() p = nil p.GetIsCloudflareIP() } func TestPagesDomain_GetIsCNAMEToFastly(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsCNAMEToFastly: &zeroValue} p.GetIsCNAMEToFastly() p = &PagesDomain{} p.GetIsCNAMEToFastly() p = nil p.GetIsCNAMEToFastly() } func TestPagesDomain_GetIsCNAMEToGithubUserDomain(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsCNAMEToGithubUserDomain: &zeroValue} p.GetIsCNAMEToGithubUserDomain() p = &PagesDomain{} p.GetIsCNAMEToGithubUserDomain() p = nil p.GetIsCNAMEToGithubUserDomain() } func TestPagesDomain_GetIsCNAMEToPagesDotGithubDotCom(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsCNAMEToPagesDotGithubDotCom: &zeroValue} p.GetIsCNAMEToPagesDotGithubDotCom() p = &PagesDomain{} p.GetIsCNAMEToPagesDotGithubDotCom() p = nil p.GetIsCNAMEToPagesDotGithubDotCom() } func TestPagesDomain_GetIsFastlyIP(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsFastlyIP: &zeroValue} p.GetIsFastlyIP() p = &PagesDomain{} p.GetIsFastlyIP() p = nil p.GetIsFastlyIP() } func TestPagesDomain_GetIsHTTPSEligible(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsHTTPSEligible: &zeroValue} p.GetIsHTTPSEligible() p = &PagesDomain{} p.GetIsHTTPSEligible() p = nil p.GetIsHTTPSEligible() } func TestPagesDomain_GetIsNonGithubPagesIPPresent(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsNonGithubPagesIPPresent: &zeroValue} p.GetIsNonGithubPagesIPPresent() p = &PagesDomain{} p.GetIsNonGithubPagesIPPresent() p = nil p.GetIsNonGithubPagesIPPresent() } func TestPagesDomain_GetIsOldIPAddress(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsOldIPAddress: &zeroValue} p.GetIsOldIPAddress() p = &PagesDomain{} p.GetIsOldIPAddress() p = nil p.GetIsOldIPAddress() } func TestPagesDomain_GetIsPagesDomain(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsPagesDomain: &zeroValue} p.GetIsPagesDomain() p = &PagesDomain{} p.GetIsPagesDomain() p = nil p.GetIsPagesDomain() } func TestPagesDomain_GetIsPointedToGithubPagesIP(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsPointedToGithubPagesIP: &zeroValue} p.GetIsPointedToGithubPagesIP() p = &PagesDomain{} p.GetIsPointedToGithubPagesIP() p = nil p.GetIsPointedToGithubPagesIP() } func TestPagesDomain_GetIsProxied(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsProxied: &zeroValue} p.GetIsProxied() p = &PagesDomain{} p.GetIsProxied() p = nil p.GetIsProxied() } func TestPagesDomain_GetIsServedByPages(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsServedByPages: &zeroValue} p.GetIsServedByPages() p = &PagesDomain{} p.GetIsServedByPages() p = nil p.GetIsServedByPages() } func TestPagesDomain_GetIsValid(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsValid: &zeroValue} p.GetIsValid() p = &PagesDomain{} p.GetIsValid() p = nil p.GetIsValid() } func TestPagesDomain_GetIsValidDomain(tt *testing.T) { var zeroValue bool p := &PagesDomain{IsValidDomain: &zeroValue} p.GetIsValidDomain() p = &PagesDomain{} p.GetIsValidDomain() p = nil p.GetIsValidDomain() } func TestPagesDomain_GetNameservers(tt *testing.T) { var zeroValue string p := &PagesDomain{Nameservers: &zeroValue} p.GetNameservers() p = &PagesDomain{} p.GetNameservers() p = nil p.GetNameservers() } func TestPagesDomain_GetReason(tt *testing.T) { var zeroValue string p := &PagesDomain{Reason: &zeroValue} p.GetReason() p = &PagesDomain{} p.GetReason() p = nil p.GetReason() } func TestPagesDomain_GetRespondsToHTTPS(tt *testing.T) { var zeroValue bool p := &PagesDomain{RespondsToHTTPS: &zeroValue} p.GetRespondsToHTTPS() p = &PagesDomain{} p.GetRespondsToHTTPS() p = nil p.GetRespondsToHTTPS() } func TestPagesDomain_GetShouldBeARecord(tt *testing.T) { var zeroValue bool p := &PagesDomain{ShouldBeARecord: &zeroValue} p.GetShouldBeARecord() p = &PagesDomain{} p.GetShouldBeARecord() p = nil p.GetShouldBeARecord() } func TestPagesDomain_GetURI(tt *testing.T) { var zeroValue string p := &PagesDomain{URI: &zeroValue} p.GetURI() p = &PagesDomain{} p.GetURI() p = nil p.GetURI() } func TestPagesError_GetMessage(tt *testing.T) { var zeroValue string p := &PagesError{Message: &zeroValue} p.GetMessage() p = &PagesError{} p.GetMessage() p = nil p.GetMessage() } func TestPagesHealthCheckResponse_GetAltDomain(tt *testing.T) { p := &PagesHealthCheckResponse{} p.GetAltDomain() p = nil p.GetAltDomain() } func TestPagesHealthCheckResponse_GetDomain(tt *testing.T) { p := &PagesHealthCheckResponse{} p.GetDomain() p = nil p.GetDomain() } func TestPagesHTTPSCertificate_GetDescription(tt *testing.T) { var zeroValue string p := &PagesHTTPSCertificate{Description: &zeroValue} p.GetDescription() p = &PagesHTTPSCertificate{} p.GetDescription() p = nil p.GetDescription() } func TestPagesHTTPSCertificate_GetExpiresAt(tt *testing.T) { var zeroValue string p := &PagesHTTPSCertificate{ExpiresAt: &zeroValue} p.GetExpiresAt() p = &PagesHTTPSCertificate{} p.GetExpiresAt() p = nil p.GetExpiresAt() } func TestPagesHTTPSCertificate_GetState(tt *testing.T) { var zeroValue string p := &PagesHTTPSCertificate{State: &zeroValue} p.GetState() p = &PagesHTTPSCertificate{} p.GetState() p = nil p.GetState() } 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_GetBuildType(tt *testing.T) { var zeroValue string p := &PagesUpdate{BuildType: &zeroValue} p.GetBuildType() p = &PagesUpdate{} p.GetBuildType() p = nil p.GetBuildType() } 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_GetHTTPSEnforced(tt *testing.T) { var zeroValue bool p := &PagesUpdate{HTTPSEnforced: &zeroValue} p.GetHTTPSEnforced() p = &PagesUpdate{} p.GetHTTPSEnforced() p = nil p.GetHTTPSEnforced() } func TestPagesUpdate_GetPublic(tt *testing.T) { var zeroValue bool p := &PagesUpdate{Public: &zeroValue} p.GetPublic() p = &PagesUpdate{} p.GetPublic() p = nil p.GetPublic() } func TestPagesUpdate_GetSource(tt *testing.T) { p := &PagesUpdate{} p.GetSource() p = nil p.GetSource() } func TestPersonalAccessTokenPermissions_GetOrg(tt *testing.T) { zeroValue := map[string]string{} p := &PersonalAccessTokenPermissions{Org: zeroValue} p.GetOrg() p = &PersonalAccessTokenPermissions{} p.GetOrg() p = nil p.GetOrg() } func TestPersonalAccessTokenPermissions_GetOther(tt *testing.T) { zeroValue := map[string]string{} p := &PersonalAccessTokenPermissions{Other: zeroValue} p.GetOther() p = &PersonalAccessTokenPermissions{} p.GetOther() p = nil p.GetOther() } func TestPersonalAccessTokenPermissions_GetRepo(tt *testing.T) { zeroValue := map[string]string{} p := &PersonalAccessTokenPermissions{Repo: zeroValue} p.GetRepo() p = &PersonalAccessTokenPermissions{} p.GetRepo() p = nil p.GetRepo() } func TestPersonalAccessTokenRequest_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp p := &PersonalAccessTokenRequest{CreatedAt: &zeroValue} p.GetCreatedAt() p = &PersonalAccessTokenRequest{} p.GetCreatedAt() p = nil p.GetCreatedAt() } func TestPersonalAccessTokenRequest_GetID(tt *testing.T) { var zeroValue int64 p := &PersonalAccessTokenRequest{ID: &zeroValue} p.GetID() p = &PersonalAccessTokenRequest{} p.GetID() p = nil p.GetID() } func TestPersonalAccessTokenRequest_GetOrg(tt *testing.T) { p := &PersonalAccessTokenRequest{} p.GetOrg() p = nil p.GetOrg() } func TestPersonalAccessTokenRequest_GetOwner(tt *testing.T) { p := &PersonalAccessTokenRequest{} p.GetOwner() p = nil p.GetOwner() } func TestPersonalAccessTokenRequest_GetPermissionsAdded(tt *testing.T) { p := &PersonalAccessTokenRequest{} p.GetPermissionsAdded() p = nil p.GetPermissionsAdded() } func TestPersonalAccessTokenRequest_GetPermissionsResult(tt *testing.T) { p := &PersonalAccessTokenRequest{} p.GetPermissionsResult() p = nil p.GetPermissionsResult() } func TestPersonalAccessTokenRequest_GetPermissionsUpgraded(tt *testing.T) { p := &PersonalAccessTokenRequest{} p.GetPermissionsUpgraded() p = nil p.GetPermissionsUpgraded() } func TestPersonalAccessTokenRequest_GetRepositoryCount(tt *testing.T) { var zeroValue int64 p := &PersonalAccessTokenRequest{RepositoryCount: &zeroValue} p.GetRepositoryCount() p = &PersonalAccessTokenRequest{} p.GetRepositoryCount() p = nil p.GetRepositoryCount() } func TestPersonalAccessTokenRequest_GetRepositorySelection(tt *testing.T) { var zeroValue string p := &PersonalAccessTokenRequest{RepositorySelection: &zeroValue} p.GetRepositorySelection() p = &PersonalAccessTokenRequest{} p.GetRepositorySelection() p = nil p.GetRepositorySelection() } func TestPersonalAccessTokenRequest_GetTokenExpired(tt *testing.T) { var zeroValue bool p := &PersonalAccessTokenRequest{TokenExpired: &zeroValue} p.GetTokenExpired() p = &PersonalAccessTokenRequest{} p.GetTokenExpired() p = nil p.GetTokenExpired() } func TestPersonalAccessTokenRequest_GetTokenExpiresAt(tt *testing.T) { var zeroValue Timestamp p := &PersonalAccessTokenRequest{TokenExpiresAt: &zeroValue} p.GetTokenExpiresAt() p = &PersonalAccessTokenRequest{} p.GetTokenExpiresAt() p = nil p.GetTokenExpiresAt() } func TestPersonalAccessTokenRequest_GetTokenLastUsedAt(tt *testing.T) { var zeroValue Timestamp p := &PersonalAccessTokenRequest{TokenLastUsedAt: &zeroValue} p.GetTokenLastUsedAt() p = &PersonalAccessTokenRequest{} p.GetTokenLastUsedAt() p = nil p.GetTokenLastUsedAt() } func TestPersonalAccessTokenRequestEvent_GetAction(tt *testing.T) { var zeroValue string p := &PersonalAccessTokenRequestEvent{Action: &zeroValue} p.GetAction() p = &PersonalAccessTokenRequestEvent{} p.GetAction() p = nil p.GetAction() } func TestPersonalAccessTokenRequestEvent_GetInstallation(tt *testing.T) { p := &PersonalAccessTokenRequestEvent{} p.GetInstallation() p = nil p.GetInstallation() } func TestPersonalAccessTokenRequestEvent_GetOrg(tt *testing.T) { p := &PersonalAccessTokenRequestEvent{} p.GetOrg() p = nil p.GetOrg() } func TestPersonalAccessTokenRequestEvent_GetPersonalAccessTokenRequest(tt *testing.T) { p := &PersonalAccessTokenRequestEvent{} p.GetPersonalAccessTokenRequest() p = nil p.GetPersonalAccessTokenRequest() } func TestPersonalAccessTokenRequestEvent_GetSender(tt *testing.T) { p := &PersonalAccessTokenRequestEvent{} p.GetSender() p = nil p.GetSender() } 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_GetOrg(tt *testing.T) { p := &PingEvent{} p.GetOrg() p = nil p.GetOrg() } func TestPingEvent_GetRepo(tt *testing.T) { p := &PingEvent{} p.GetRepo() p = nil p.GetRepo() } func TestPingEvent_GetSender(tt *testing.T) { p := &PingEvent{} p.GetSender() p = nil p.GetSender() } 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 int64 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_GetOrganizationPermission(tt *testing.T) { var zeroValue string p := &Project{OrganizationPermission: &zeroValue} p.GetOrganizationPermission() p = &Project{} p.GetOrganizationPermission() p = nil p.GetOrganizationPermission() } 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_GetPrivate(tt *testing.T) { var zeroValue bool p := &Project{Private: &zeroValue} p.GetPrivate() p = &Project{} p.GetPrivate() p = nil p.GetPrivate() } 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_GetPrivate(tt *testing.T) { var zeroValue bool p := &ProjectOptions{Private: &zeroValue} p.GetPrivate() p = &ProjectOptions{} p.GetPrivate() p = nil p.GetPrivate() } 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 TestProjectsV2_GetClosedAt(tt *testing.T) { var zeroValue Timestamp p := &ProjectsV2{ClosedAt: &zeroValue} p.GetClosedAt() p = &ProjectsV2{} p.GetClosedAt() p = nil p.GetClosedAt() } func TestProjectsV2_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp p := &ProjectsV2{CreatedAt: &zeroValue} p.GetCreatedAt() p = &ProjectsV2{} p.GetCreatedAt() p = nil p.GetCreatedAt() } func TestProjectsV2_GetCreator(tt *testing.T) { p := &ProjectsV2{} p.GetCreator() p = nil p.GetCreator() } func TestProjectsV2_GetDeletedAt(tt *testing.T) { var zeroValue Timestamp p := &ProjectsV2{DeletedAt: &zeroValue} p.GetDeletedAt() p = &ProjectsV2{} p.GetDeletedAt() p = nil p.GetDeletedAt() } func TestProjectsV2_GetDeletedBy(tt *testing.T) { p := &ProjectsV2{} p.GetDeletedBy() p = nil p.GetDeletedBy() } func TestProjectsV2_GetDescription(tt *testing.T) { var zeroValue string p := &ProjectsV2{Description: &zeroValue} p.GetDescription() p = &ProjectsV2{} p.GetDescription() p = nil p.GetDescription() } func TestProjectsV2_GetID(tt *testing.T) { var zeroValue int64 p := &ProjectsV2{ID: &zeroValue} p.GetID() p = &ProjectsV2{} p.GetID() p = nil p.GetID() } func TestProjectsV2_GetNodeID(tt *testing.T) { var zeroValue string p := &ProjectsV2{NodeID: &zeroValue} p.GetNodeID() p = &ProjectsV2{} p.GetNodeID() p = nil p.GetNodeID() } func TestProjectsV2_GetNumber(tt *testing.T) { var zeroValue int p := &ProjectsV2{Number: &zeroValue} p.GetNumber() p = &ProjectsV2{} p.GetNumber() p = nil p.GetNumber() } func TestProjectsV2_GetOwner(tt *testing.T) { p := &ProjectsV2{} p.GetOwner() p = nil p.GetOwner() } func TestProjectsV2_GetPublic(tt *testing.T) { var zeroValue bool p := &ProjectsV2{Public: &zeroValue} p.GetPublic() p = &ProjectsV2{} p.GetPublic() p = nil p.GetPublic() } func TestProjectsV2_GetShortDescription(tt *testing.T) { var zeroValue string p := &ProjectsV2{ShortDescription: &zeroValue} p.GetShortDescription() p = &ProjectsV2{} p.GetShortDescription() p = nil p.GetShortDescription() } func TestProjectsV2_GetTitle(tt *testing.T) { var zeroValue string p := &ProjectsV2{Title: &zeroValue} p.GetTitle() p = &ProjectsV2{} p.GetTitle() p = nil p.GetTitle() } func TestProjectsV2_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp p := &ProjectsV2{UpdatedAt: &zeroValue} p.GetUpdatedAt() p = &ProjectsV2{} p.GetUpdatedAt() p = nil p.GetUpdatedAt() } func TestProjectV2Event_GetAction(tt *testing.T) { var zeroValue string p := &ProjectV2Event{Action: &zeroValue} p.GetAction() p = &ProjectV2Event{} p.GetAction() p = nil p.GetAction() } func TestProjectV2Event_GetInstallation(tt *testing.T) { p := &ProjectV2Event{} p.GetInstallation() p = nil p.GetInstallation() } func TestProjectV2Event_GetOrg(tt *testing.T) { p := &ProjectV2Event{} p.GetOrg() p = nil p.GetOrg() } func TestProjectV2Event_GetProjectsV2(tt *testing.T) { p := &ProjectV2Event{} p.GetProjectsV2() p = nil p.GetProjectsV2() } func TestProjectV2Event_GetSender(tt *testing.T) { p := &ProjectV2Event{} p.GetSender() p = nil p.GetSender() } func TestProjectV2Item_GetArchivedAt(tt *testing.T) { var zeroValue Timestamp p := &ProjectV2Item{ArchivedAt: &zeroValue} p.GetArchivedAt() p = &ProjectV2Item{} p.GetArchivedAt() p = nil p.GetArchivedAt() } func TestProjectV2Item_GetContentNodeID(tt *testing.T) { var zeroValue string p := &ProjectV2Item{ContentNodeID: &zeroValue} p.GetContentNodeID() p = &ProjectV2Item{} p.GetContentNodeID() p = nil p.GetContentNodeID() } func TestProjectV2Item_GetContentType(tt *testing.T) { var zeroValue string p := &ProjectV2Item{ContentType: &zeroValue} p.GetContentType() p = &ProjectV2Item{} p.GetContentType() p = nil p.GetContentType() } func TestProjectV2Item_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp p := &ProjectV2Item{CreatedAt: &zeroValue} p.GetCreatedAt() p = &ProjectV2Item{} p.GetCreatedAt() p = nil p.GetCreatedAt() } func TestProjectV2Item_GetCreator(tt *testing.T) { p := &ProjectV2Item{} p.GetCreator() p = nil p.GetCreator() } func TestProjectV2Item_GetID(tt *testing.T) { var zeroValue int64 p := &ProjectV2Item{ID: &zeroValue} p.GetID() p = &ProjectV2Item{} p.GetID() p = nil p.GetID() } func TestProjectV2Item_GetNodeID(tt *testing.T) { var zeroValue string p := &ProjectV2Item{NodeID: &zeroValue} p.GetNodeID() p = &ProjectV2Item{} p.GetNodeID() p = nil p.GetNodeID() } func TestProjectV2Item_GetProjectNodeID(tt *testing.T) { var zeroValue string p := &ProjectV2Item{ProjectNodeID: &zeroValue} p.GetProjectNodeID() p = &ProjectV2Item{} p.GetProjectNodeID() p = nil p.GetProjectNodeID() } func TestProjectV2Item_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp p := &ProjectV2Item{UpdatedAt: &zeroValue} p.GetUpdatedAt() p = &ProjectV2Item{} p.GetUpdatedAt() p = nil p.GetUpdatedAt() } func TestProjectV2ItemChange_GetArchivedAt(tt *testing.T) { p := &ProjectV2ItemChange{} p.GetArchivedAt() p = nil p.GetArchivedAt() } func TestProjectV2ItemEvent_GetAction(tt *testing.T) { var zeroValue string p := &ProjectV2ItemEvent{Action: &zeroValue} p.GetAction() p = &ProjectV2ItemEvent{} p.GetAction() p = nil p.GetAction() } func TestProjectV2ItemEvent_GetChanges(tt *testing.T) { p := &ProjectV2ItemEvent{} p.GetChanges() p = nil p.GetChanges() } func TestProjectV2ItemEvent_GetInstallation(tt *testing.T) { p := &ProjectV2ItemEvent{} p.GetInstallation() p = nil p.GetInstallation() } func TestProjectV2ItemEvent_GetOrg(tt *testing.T) { p := &ProjectV2ItemEvent{} p.GetOrg() p = nil p.GetOrg() } func TestProjectV2ItemEvent_GetProjectV2Item(tt *testing.T) { p := &ProjectV2ItemEvent{} p.GetProjectV2Item() p = nil p.GetProjectV2Item() } func TestProjectV2ItemEvent_GetSender(tt *testing.T) { p := &ProjectV2ItemEvent{} p.GetSender() p = nil p.GetSender() } 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_GetAllowForkSyncing(tt *testing.T) { p := &Protection{} p.GetAllowForkSyncing() p = nil p.GetAllowForkSyncing() } func TestProtection_GetBlockCreations(tt *testing.T) { p := &Protection{} p.GetBlockCreations() p = nil p.GetBlockCreations() } func TestProtection_GetEnforceAdmins(tt *testing.T) { p := &Protection{} p.GetEnforceAdmins() p = nil p.GetEnforceAdmins() } func TestProtection_GetLockBranch(tt *testing.T) { p := &Protection{} p.GetLockBranch() p = nil p.GetLockBranch() } 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_GetRequiredSignatures(tt *testing.T) { p := &Protection{} p.GetRequiredSignatures() p = nil p.GetRequiredSignatures() } 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 TestProtection_GetURL(tt *testing.T) { var zeroValue string p := &Protection{URL: &zeroValue} p.GetURL() p = &Protection{} p.GetURL() p = nil p.GetURL() } func TestProtectionChanges_GetAdminEnforced(tt *testing.T) { p := &ProtectionChanges{} p.GetAdminEnforced() p = nil p.GetAdminEnforced() } func TestProtectionChanges_GetAllowDeletionsEnforcementLevel(tt *testing.T) { p := &ProtectionChanges{} p.GetAllowDeletionsEnforcementLevel() p = nil p.GetAllowDeletionsEnforcementLevel() } func TestProtectionChanges_GetAuthorizedActorNames(tt *testing.T) { p := &ProtectionChanges{} p.GetAuthorizedActorNames() p = nil p.GetAuthorizedActorNames() } func TestProtectionChanges_GetAuthorizedActorsOnly(tt *testing.T) { p := &ProtectionChanges{} p.GetAuthorizedActorsOnly() p = nil p.GetAuthorizedActorsOnly() } func TestProtectionChanges_GetAuthorizedDismissalActorsOnly(tt *testing.T) { p := &ProtectionChanges{} p.GetAuthorizedDismissalActorsOnly() p = nil p.GetAuthorizedDismissalActorsOnly() } func TestProtectionChanges_GetCreateProtected(tt *testing.T) { p := &ProtectionChanges{} p.GetCreateProtected() p = nil p.GetCreateProtected() } func TestProtectionChanges_GetDismissStaleReviewsOnPush(tt *testing.T) { p := &ProtectionChanges{} p.GetDismissStaleReviewsOnPush() p = nil p.GetDismissStaleReviewsOnPush() } func TestProtectionChanges_GetLinearHistoryRequirementEnforcementLevel(tt *testing.T) { p := &ProtectionChanges{} p.GetLinearHistoryRequirementEnforcementLevel() p = nil p.GetLinearHistoryRequirementEnforcementLevel() } func TestProtectionChanges_GetPullRequestReviewsEnforcementLevel(tt *testing.T) { p := &ProtectionChanges{} p.GetPullRequestReviewsEnforcementLevel() p = nil p.GetPullRequestReviewsEnforcementLevel() } func TestProtectionChanges_GetRequireCodeOwnerReview(tt *testing.T) { p := &ProtectionChanges{} p.GetRequireCodeOwnerReview() p = nil p.GetRequireCodeOwnerReview() } func TestProtectionChanges_GetRequiredConversationResolutionLevel(tt *testing.T) { p := &ProtectionChanges{} p.GetRequiredConversationResolutionLevel() p = nil p.GetRequiredConversationResolutionLevel() } func TestProtectionChanges_GetRequiredDeploymentsEnforcementLevel(tt *testing.T) { p := &ProtectionChanges{} p.GetRequiredDeploymentsEnforcementLevel() p = nil p.GetRequiredDeploymentsEnforcementLevel() } func TestProtectionChanges_GetRequiredStatusChecks(tt *testing.T) { p := &ProtectionChanges{} p.GetRequiredStatusChecks() p = nil p.GetRequiredStatusChecks() } func TestProtectionChanges_GetRequiredStatusChecksEnforcementLevel(tt *testing.T) { p := &ProtectionChanges{} p.GetRequiredStatusChecksEnforcementLevel() p = nil p.GetRequiredStatusChecksEnforcementLevel() } func TestProtectionChanges_GetSignatureRequirementEnforcementLevel(tt *testing.T) { p := &ProtectionChanges{} p.GetSignatureRequirementEnforcementLevel() p = nil p.GetSignatureRequirementEnforcementLevel() } 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_GetAllowForkSyncing(tt *testing.T) { var zeroValue bool p := &ProtectionRequest{AllowForkSyncing: &zeroValue} p.GetAllowForkSyncing() p = &ProtectionRequest{} p.GetAllowForkSyncing() p = nil p.GetAllowForkSyncing() } func TestProtectionRequest_GetBlockCreations(tt *testing.T) { var zeroValue bool p := &ProtectionRequest{BlockCreations: &zeroValue} p.GetBlockCreations() p = &ProtectionRequest{} p.GetBlockCreations() p = nil p.GetBlockCreations() } func TestProtectionRequest_GetLockBranch(tt *testing.T) { var zeroValue bool p := &ProtectionRequest{LockBranch: &zeroValue} p.GetLockBranch() p = &ProtectionRequest{} p.GetLockBranch() p = nil p.GetLockBranch() } 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_GetPreventSelfReview(tt *testing.T) { var zeroValue bool p := &ProtectionRule{PreventSelfReview: &zeroValue} p.GetPreventSelfReview() p = &ProtectionRule{} p.GetPreventSelfReview() p = nil p.GetPreventSelfReview() } 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_GetOrg(tt *testing.T) { p := &PublicEvent{} p.GetOrg() p = nil p.GetOrg() } 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 Timestamp 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 Timestamp 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 Timestamp 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 Timestamp 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 Timestamp 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_GetSubjectType(tt *testing.T) { var zeroValue string p := &PullRequestComment{SubjectType: &zeroValue} p.GetSubjectType() p = &PullRequestComment{} p.GetSubjectType() p = nil p.GetSubjectType() } func TestPullRequestComment_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp 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_GetPerformedViaGithubApp(tt *testing.T) { p := &PullRequestEvent{} p.GetPerformedViaGithubApp() p = nil p.GetPerformedViaGithubApp() } 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_GetMergedAt(tt *testing.T) { var zeroValue Timestamp p := &PullRequestLinks{MergedAt: &zeroValue} p.GetMergedAt() p = &PullRequestLinks{} p.GetMergedAt() p = nil p.GetMergedAt() } 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 Timestamp 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_GetOrg(tt *testing.T) { p := &PullRequestReviewCommentEvent{} p.GetOrg() p = nil p.GetOrg() } 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_GetBypassPullRequestAllowances(tt *testing.T) { p := &PullRequestReviewsEnforcement{} p.GetBypassPullRequestAllowances() p = nil p.GetBypassPullRequestAllowances() } func TestPullRequestReviewsEnforcement_GetDismissalRestrictions(tt *testing.T) { p := &PullRequestReviewsEnforcement{} p.GetDismissalRestrictions() p = nil p.GetDismissalRestrictions() } func TestPullRequestReviewsEnforcementLevelChanges_GetFrom(tt *testing.T) { var zeroValue string p := &PullRequestReviewsEnforcementLevelChanges{From: &zeroValue} p.GetFrom() p = &PullRequestReviewsEnforcementLevelChanges{} p.GetFrom() p = nil p.GetFrom() } func TestPullRequestReviewsEnforcementRequest_GetBypassPullRequestAllowancesRequest(tt *testing.T) { p := &PullRequestReviewsEnforcementRequest{} p.GetBypassPullRequestAllowancesRequest() p = nil p.GetBypassPullRequestAllowancesRequest() } func TestPullRequestReviewsEnforcementRequest_GetDismissalRestrictionsRequest(tt *testing.T) { p := &PullRequestReviewsEnforcementRequest{} p.GetDismissalRestrictionsRequest() p = nil p.GetDismissalRestrictionsRequest() } func TestPullRequestReviewsEnforcementRequest_GetRequireLastPushApproval(tt *testing.T) { var zeroValue bool p := &PullRequestReviewsEnforcementRequest{RequireLastPushApproval: &zeroValue} p.GetRequireLastPushApproval() p = &PullRequestReviewsEnforcementRequest{} p.GetRequireLastPushApproval() p = nil p.GetRequireLastPushApproval() } func TestPullRequestReviewsEnforcementUpdate_GetBypassPullRequestAllowancesRequest(tt *testing.T) { p := &PullRequestReviewsEnforcementUpdate{} p.GetBypassPullRequestAllowancesRequest() p = nil p.GetBypassPullRequestAllowancesRequest() } 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 TestPullRequestReviewsEnforcementUpdate_GetRequireCodeOwnerReviews(tt *testing.T) { var zeroValue bool p := &PullRequestReviewsEnforcementUpdate{RequireCodeOwnerReviews: &zeroValue} p.GetRequireCodeOwnerReviews() p = &PullRequestReviewsEnforcementUpdate{} p.GetRequireCodeOwnerReviews() p = nil p.GetRequireCodeOwnerReviews() } func TestPullRequestReviewsEnforcementUpdate_GetRequireLastPushApproval(tt *testing.T) { var zeroValue bool p := &PullRequestReviewsEnforcementUpdate{RequireLastPushApproval: &zeroValue} p.GetRequireLastPushApproval() p = &PullRequestReviewsEnforcementUpdate{} p.GetRequireLastPushApproval() p = nil p.GetRequireLastPushApproval() } func TestPullRequestReviewThreadEvent_GetAction(tt *testing.T) { var zeroValue string p := &PullRequestReviewThreadEvent{Action: &zeroValue} p.GetAction() p = &PullRequestReviewThreadEvent{} p.GetAction() p = nil p.GetAction() } func TestPullRequestReviewThreadEvent_GetInstallation(tt *testing.T) { p := &PullRequestReviewThreadEvent{} p.GetInstallation() p = nil p.GetInstallation() } func TestPullRequestReviewThreadEvent_GetOrg(tt *testing.T) { p := &PullRequestReviewThreadEvent{} p.GetOrg() p = nil p.GetOrg() } func TestPullRequestReviewThreadEvent_GetPullRequest(tt *testing.T) { p := &PullRequestReviewThreadEvent{} p.GetPullRequest() p = nil p.GetPullRequest() } func TestPullRequestReviewThreadEvent_GetRepo(tt *testing.T) { p := &PullRequestReviewThreadEvent{} p.GetRepo() p = nil p.GetRepo() } func TestPullRequestReviewThreadEvent_GetSender(tt *testing.T) { p := &PullRequestReviewThreadEvent{} p.GetSender() p = nil p.GetSender() } func TestPullRequestReviewThreadEvent_GetThread(tt *testing.T) { p := &PullRequestReviewThreadEvent{} p.GetThread() p = nil p.GetThread() } 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_GetPerformedViaGithubApp(tt *testing.T) { p := &PullRequestTargetEvent{} p.GetPerformedViaGithubApp() p = nil p.GetPerformedViaGithubApp() } 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 TestPullRequestThread_GetID(tt *testing.T) { var zeroValue int64 p := &PullRequestThread{ID: &zeroValue} p.GetID() p = &PullRequestThread{} p.GetID() p = nil p.GetID() } func TestPullRequestThread_GetNodeID(tt *testing.T) { var zeroValue string p := &PullRequestThread{NodeID: &zeroValue} p.GetNodeID() p = &PullRequestThread{} p.GetNodeID() p = nil p.GetNodeID() } 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_GetAction(tt *testing.T) { var zeroValue string p := &PushEvent{Action: &zeroValue} p.GetAction() p = &PushEvent{} p.GetAction() p = nil p.GetAction() } 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_GetCommits(tt *testing.T) { zeroValue := []*HeadCommit{} p := &PushEvent{Commits: zeroValue} p.GetCommits() p = &PushEvent{} p.GetCommits() p = nil p.GetCommits() } 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_GetOrganization(tt *testing.T) { p := &PushEvent{} p.GetOrganization() p = nil p.GetOrganization() } 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_GetCustomProperties(tt *testing.T) { zeroValue := map[string]string{} p := &PushEventRepository{CustomProperties: zeroValue} p.GetCustomProperties() p = &PushEventRepository{} p.GetCustomProperties() p = nil p.GetCustomProperties() } 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_GetActionsRunnerRegistration(tt *testing.T) { r := &RateLimits{} r.GetActionsRunnerRegistration() r = nil r.GetActionsRunnerRegistration() } func TestRateLimits_GetCodeScanningUpload(tt *testing.T) { r := &RateLimits{} r.GetCodeScanningUpload() r = nil r.GetCodeScanningUpload() } func TestRateLimits_GetCodeSearch(tt *testing.T) { r := &RateLimits{} r.GetCodeSearch() r = nil r.GetCodeSearch() } func TestRateLimits_GetCore(tt *testing.T) { r := &RateLimits{} r.GetCore() r = nil r.GetCore() } func TestRateLimits_GetDependencySnapshots(tt *testing.T) { r := &RateLimits{} r.GetDependencySnapshots() r = nil r.GetDependencySnapshots() } func TestRateLimits_GetGraphQL(tt *testing.T) { r := &RateLimits{} r.GetGraphQL() r = nil r.GetGraphQL() } func TestRateLimits_GetIntegrationManifest(tt *testing.T) { r := &RateLimits{} r.GetIntegrationManifest() r = nil r.GetIntegrationManifest() } func TestRateLimits_GetSCIM(tt *testing.T) { r := &RateLimits{} r.GetSCIM() r = nil r.GetSCIM() } func TestRateLimits_GetSearch(tt *testing.T) { r := &RateLimits{} r.GetSearch() r = nil r.GetSearch() } func TestRateLimits_GetSourceImport(tt *testing.T) { r := &RateLimits{} r.GetSourceImport() r = nil r.GetSourceImport() } 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 TestReferencedWorkflow_GetPath(tt *testing.T) { var zeroValue string r := &ReferencedWorkflow{Path: &zeroValue} r.GetPath() r = &ReferencedWorkflow{} r.GetPath() r = nil r.GetPath() } func TestReferencedWorkflow_GetRef(tt *testing.T) { var zeroValue string r := &ReferencedWorkflow{Ref: &zeroValue} r.GetRef() r = &ReferencedWorkflow{} r.GetRef() r = nil r.GetRef() } func TestReferencedWorkflow_GetSHA(tt *testing.T) { var zeroValue string r := &ReferencedWorkflow{SHA: &zeroValue} r.GetSHA() r = &ReferencedWorkflow{} r.GetSHA() r = nil r.GetSHA() } 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_GetOrg(tt *testing.T) { r := &ReleaseEvent{} r.GetOrg() r = nil r.GetOrg() } 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 TestRepoAdvisoryCredit_GetLogin(tt *testing.T) { var zeroValue string r := &RepoAdvisoryCredit{Login: &zeroValue} r.GetLogin() r = &RepoAdvisoryCredit{} r.GetLogin() r = nil r.GetLogin() } func TestRepoAdvisoryCredit_GetType(tt *testing.T) { var zeroValue string r := &RepoAdvisoryCredit{Type: &zeroValue} r.GetType() r = &RepoAdvisoryCredit{} r.GetType() r = nil r.GetType() } func TestRepoAdvisoryCreditDetailed_GetState(tt *testing.T) { var zeroValue string r := &RepoAdvisoryCreditDetailed{State: &zeroValue} r.GetState() r = &RepoAdvisoryCreditDetailed{} r.GetState() r = nil r.GetState() } func TestRepoAdvisoryCreditDetailed_GetType(tt *testing.T) { var zeroValue string r := &RepoAdvisoryCreditDetailed{Type: &zeroValue} r.GetType() r = &RepoAdvisoryCreditDetailed{} r.GetType() r = nil r.GetType() } func TestRepoAdvisoryCreditDetailed_GetUser(tt *testing.T) { r := &RepoAdvisoryCreditDetailed{} r.GetUser() r = nil r.GetUser() } func TestRepoDependencies_GetDownloadLocation(tt *testing.T) { var zeroValue string r := &RepoDependencies{DownloadLocation: &zeroValue} r.GetDownloadLocation() r = &RepoDependencies{} r.GetDownloadLocation() r = nil r.GetDownloadLocation() } func TestRepoDependencies_GetFilesAnalyzed(tt *testing.T) { var zeroValue bool r := &RepoDependencies{FilesAnalyzed: &zeroValue} r.GetFilesAnalyzed() r = &RepoDependencies{} r.GetFilesAnalyzed() r = nil r.GetFilesAnalyzed() } func TestRepoDependencies_GetLicenseConcluded(tt *testing.T) { var zeroValue string r := &RepoDependencies{LicenseConcluded: &zeroValue} r.GetLicenseConcluded() r = &RepoDependencies{} r.GetLicenseConcluded() r = nil r.GetLicenseConcluded() } func TestRepoDependencies_GetLicenseDeclared(tt *testing.T) { var zeroValue string r := &RepoDependencies{LicenseDeclared: &zeroValue} r.GetLicenseDeclared() r = &RepoDependencies{} r.GetLicenseDeclared() r = nil r.GetLicenseDeclared() } func TestRepoDependencies_GetName(tt *testing.T) { var zeroValue string r := &RepoDependencies{Name: &zeroValue} r.GetName() r = &RepoDependencies{} r.GetName() r = nil r.GetName() } func TestRepoDependencies_GetSPDXID(tt *testing.T) { var zeroValue string r := &RepoDependencies{SPDXID: &zeroValue} r.GetSPDXID() r = &RepoDependencies{} r.GetSPDXID() r = nil r.GetSPDXID() } func TestRepoDependencies_GetVersionInfo(tt *testing.T) { var zeroValue string r := &RepoDependencies{VersionInfo: &zeroValue} r.GetVersionInfo() r = &RepoDependencies{} r.GetVersionInfo() r = nil r.GetVersionInfo() } func TestRepoMergeUpstreamRequest_GetBranch(tt *testing.T) { var zeroValue string r := &RepoMergeUpstreamRequest{Branch: &zeroValue} r.GetBranch() r = &RepoMergeUpstreamRequest{} r.GetBranch() r = nil r.GetBranch() } func TestRepoMergeUpstreamResult_GetBaseBranch(tt *testing.T) { var zeroValue string r := &RepoMergeUpstreamResult{BaseBranch: &zeroValue} r.GetBaseBranch() r = &RepoMergeUpstreamResult{} r.GetBaseBranch() r = nil r.GetBaseBranch() } func TestRepoMergeUpstreamResult_GetMergeType(tt *testing.T) { var zeroValue string r := &RepoMergeUpstreamResult{MergeType: &zeroValue} r.GetMergeType() r = &RepoMergeUpstreamResult{} r.GetMergeType() r = nil r.GetMergeType() } func TestRepoMergeUpstreamResult_GetMessage(tt *testing.T) { var zeroValue string r := &RepoMergeUpstreamResult{Message: &zeroValue} r.GetMessage() r = &RepoMergeUpstreamResult{} r.GetMessage() r = nil r.GetMessage() } func TestRepoName_GetFrom(tt *testing.T) { var zeroValue string r := &RepoName{From: &zeroValue} r.GetFrom() r = &RepoName{} r.GetFrom() r = nil r.GetFrom() } func TestRepoRequiredWorkflow_GetBadgeURL(tt *testing.T) { var zeroValue string r := &RepoRequiredWorkflow{BadgeURL: &zeroValue} r.GetBadgeURL() r = &RepoRequiredWorkflow{} r.GetBadgeURL() r = nil r.GetBadgeURL() } func TestRepoRequiredWorkflow_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp r := &RepoRequiredWorkflow{CreatedAt: &zeroValue} r.GetCreatedAt() r = &RepoRequiredWorkflow{} r.GetCreatedAt() r = nil r.GetCreatedAt() } func TestRepoRequiredWorkflow_GetHTMLURL(tt *testing.T) { var zeroValue string r := &RepoRequiredWorkflow{HTMLURL: &zeroValue} r.GetHTMLURL() r = &RepoRequiredWorkflow{} r.GetHTMLURL() r = nil r.GetHTMLURL() } func TestRepoRequiredWorkflow_GetID(tt *testing.T) { var zeroValue int64 r := &RepoRequiredWorkflow{ID: &zeroValue} r.GetID() r = &RepoRequiredWorkflow{} r.GetID() r = nil r.GetID() } func TestRepoRequiredWorkflow_GetName(tt *testing.T) { var zeroValue string r := &RepoRequiredWorkflow{Name: &zeroValue} r.GetName() r = &RepoRequiredWorkflow{} r.GetName() r = nil r.GetName() } func TestRepoRequiredWorkflow_GetNodeID(tt *testing.T) { var zeroValue string r := &RepoRequiredWorkflow{NodeID: &zeroValue} r.GetNodeID() r = &RepoRequiredWorkflow{} r.GetNodeID() r = nil r.GetNodeID() } func TestRepoRequiredWorkflow_GetPath(tt *testing.T) { var zeroValue string r := &RepoRequiredWorkflow{Path: &zeroValue} r.GetPath() r = &RepoRequiredWorkflow{} r.GetPath() r = nil r.GetPath() } func TestRepoRequiredWorkflow_GetSourceRepository(tt *testing.T) { r := &RepoRequiredWorkflow{} r.GetSourceRepository() r = nil r.GetSourceRepository() } func TestRepoRequiredWorkflow_GetState(tt *testing.T) { var zeroValue string r := &RepoRequiredWorkflow{State: &zeroValue} r.GetState() r = &RepoRequiredWorkflow{} r.GetState() r = nil r.GetState() } func TestRepoRequiredWorkflow_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp r := &RepoRequiredWorkflow{UpdatedAt: &zeroValue} r.GetUpdatedAt() r = &RepoRequiredWorkflow{} r.GetUpdatedAt() r = nil r.GetUpdatedAt() } func TestRepoRequiredWorkflow_GetURL(tt *testing.T) { var zeroValue string r := &RepoRequiredWorkflow{URL: &zeroValue} r.GetURL() r = &RepoRequiredWorkflow{} r.GetURL() r = nil r.GetURL() } func TestRepoRequiredWorkflows_GetTotalCount(tt *testing.T) { var zeroValue int r := &RepoRequiredWorkflows{TotalCount: &zeroValue} r.GetTotalCount() r = &RepoRequiredWorkflows{} r.GetTotalCount() r = nil r.GetTotalCount() } 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_GetAllowAutoMerge(tt *testing.T) { var zeroValue bool r := &Repository{AllowAutoMerge: &zeroValue} r.GetAllowAutoMerge() r = &Repository{} r.GetAllowAutoMerge() r = nil r.GetAllowAutoMerge() } func TestRepository_GetAllowForking(tt *testing.T) { var zeroValue bool r := &Repository{AllowForking: &zeroValue} r.GetAllowForking() r = &Repository{} r.GetAllowForking() r = nil r.GetAllowForking() } 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_GetAllowUpdateBranch(tt *testing.T) { var zeroValue bool r := &Repository{AllowUpdateBranch: &zeroValue} r.GetAllowUpdateBranch() r = &Repository{} r.GetAllowUpdateBranch() r = nil r.GetAllowUpdateBranch() } 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_GetCustomProperties(tt *testing.T) { zeroValue := map[string]string{} r := &Repository{CustomProperties: zeroValue} r.GetCustomProperties() r = &Repository{} r.GetCustomProperties() r = nil r.GetCustomProperties() } 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_GetHasDiscussions(tt *testing.T) { var zeroValue bool r := &Repository{HasDiscussions: &zeroValue} r.GetHasDiscussions() r = &Repository{} r.GetHasDiscussions() r = nil r.GetHasDiscussions() } 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_GetMergeCommitMessage(tt *testing.T) { var zeroValue string r := &Repository{MergeCommitMessage: &zeroValue} r.GetMergeCommitMessage() r = &Repository{} r.GetMergeCommitMessage() r = nil r.GetMergeCommitMessage() } func TestRepository_GetMergeCommitTitle(tt *testing.T) { var zeroValue string r := &Repository{MergeCommitTitle: &zeroValue} r.GetMergeCommitTitle() r = &Repository{} r.GetMergeCommitTitle() r = nil r.GetMergeCommitTitle() } 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_GetRoleName(tt *testing.T) { var zeroValue string r := &Repository{RoleName: &zeroValue} r.GetRoleName() r = &Repository{} r.GetRoleName() r = nil r.GetRoleName() } func TestRepository_GetSecurityAndAnalysis(tt *testing.T) { r := &Repository{} r.GetSecurityAndAnalysis() r = nil r.GetSecurityAndAnalysis() } 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_GetSquashMergeCommitMessage(tt *testing.T) { var zeroValue string r := &Repository{SquashMergeCommitMessage: &zeroValue} r.GetSquashMergeCommitMessage() r = &Repository{} r.GetSquashMergeCommitMessage() r = nil r.GetSquashMergeCommitMessage() } func TestRepository_GetSquashMergeCommitTitle(tt *testing.T) { var zeroValue string r := &Repository{SquashMergeCommitTitle: &zeroValue} r.GetSquashMergeCommitTitle() r = &Repository{} r.GetSquashMergeCommitTitle() r = nil r.GetSquashMergeCommitTitle() } 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_GetUseSquashPRTitleAsDefault(tt *testing.T) { var zeroValue bool r := &Repository{UseSquashPRTitleAsDefault: &zeroValue} r.GetUseSquashPRTitleAsDefault() r = &Repository{} r.GetUseSquashPRTitleAsDefault() r = nil r.GetUseSquashPRTitleAsDefault() } 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 TestRepository_GetWebCommitSignoffRequired(tt *testing.T) { var zeroValue bool r := &Repository{WebCommitSignoffRequired: &zeroValue} r.GetWebCommitSignoffRequired() r = &Repository{} r.GetWebCommitSignoffRequired() r = nil r.GetWebCommitSignoffRequired() } func TestRepositoryActionsAccessLevel_GetAccessLevel(tt *testing.T) { var zeroValue string r := &RepositoryActionsAccessLevel{AccessLevel: &zeroValue} r.GetAccessLevel() r = &RepositoryActionsAccessLevel{} r.GetAccessLevel() r = nil r.GetAccessLevel() } func TestRepositoryActiveCommitters_GetAdvancedSecurityCommitters(tt *testing.T) { var zeroValue int r := &RepositoryActiveCommitters{AdvancedSecurityCommitters: &zeroValue} r.GetAdvancedSecurityCommitters() r = &RepositoryActiveCommitters{} r.GetAdvancedSecurityCommitters() r = nil r.GetAdvancedSecurityCommitters() } func TestRepositoryActiveCommitters_GetName(tt *testing.T) { var zeroValue string r := &RepositoryActiveCommitters{Name: &zeroValue} r.GetName() r = &RepositoryActiveCommitters{} r.GetName() r = nil r.GetName() } 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 Timestamp 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 Timestamp 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_GetSubmoduleGitURL(tt *testing.T) { var zeroValue string r := &RepositoryContent{SubmoduleGitURL: &zeroValue} r.GetSubmoduleGitURL() r = &RepositoryContent{} r.GetSubmoduleGitURL() r = nil r.GetSubmoduleGitURL() } 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_GetChanges(tt *testing.T) { r := &RepositoryEvent{} r.GetChanges() r = nil r.GetChanges() } 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 TestRepositoryImportEvent_GetOrg(tt *testing.T) { r := &RepositoryImportEvent{} r.GetOrg() r = nil r.GetOrg() } func TestRepositoryImportEvent_GetRepo(tt *testing.T) { r := &RepositoryImportEvent{} r.GetRepo() r = nil r.GetRepo() } func TestRepositoryImportEvent_GetSender(tt *testing.T) { r := &RepositoryImportEvent{} r.GetSender() r = nil r.GetSender() } func TestRepositoryImportEvent_GetStatus(tt *testing.T) { var zeroValue string r := &RepositoryImportEvent{Status: &zeroValue} r.GetStatus() r = &RepositoryImportEvent{} r.GetStatus() r = nil r.GetStatus() } 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_GetGenerateReleaseNotes(tt *testing.T) { var zeroValue bool r := &RepositoryRelease{GenerateReleaseNotes: &zeroValue} r.GetGenerateReleaseNotes() r = &RepositoryRelease{} r.GetGenerateReleaseNotes() r = nil r.GetGenerateReleaseNotes() } 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_GetMakeLatest(tt *testing.T) { var zeroValue string r := &RepositoryRelease{MakeLatest: &zeroValue} r.GetMakeLatest() r = &RepositoryRelease{} r.GetMakeLatest() r = nil r.GetMakeLatest() } 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 TestRepositoryRule_GetParameters(tt *testing.T) { var zeroValue json.RawMessage r := &RepositoryRule{Parameters: &zeroValue} r.GetParameters() r = &RepositoryRule{} r.GetParameters() r = nil r.GetParameters() } 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_GetInstallation(tt *testing.T) { r := &RepositoryVulnerabilityAlertEvent{} r.GetInstallation() r = nil r.GetInstallation() } func TestRepositoryVulnerabilityAlertEvent_GetOrg(tt *testing.T) { r := &RepositoryVulnerabilityAlertEvent{} r.GetOrg() r = nil r.GetOrg() } func TestRepositoryVulnerabilityAlertEvent_GetRepository(tt *testing.T) { r := &RepositoryVulnerabilityAlertEvent{} r.GetRepository() r = nil r.GetRepository() } func TestRepositoryVulnerabilityAlertEvent_GetSender(tt *testing.T) { r := &RepositoryVulnerabilityAlertEvent{} r.GetSender() r = nil r.GetSender() } 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 Timestamp 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 Timestamp 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 TestRequireCodeOwnerReviewChanges_GetFrom(tt *testing.T) { var zeroValue bool r := &RequireCodeOwnerReviewChanges{From: &zeroValue} r.GetFrom() r = &RequireCodeOwnerReviewChanges{} r.GetFrom() r = nil r.GetFrom() } func TestRequiredConversationResolutionLevelChanges_GetFrom(tt *testing.T) { var zeroValue string r := &RequiredConversationResolutionLevelChanges{From: &zeroValue} r.GetFrom() r = &RequiredConversationResolutionLevelChanges{} r.GetFrom() r = nil r.GetFrom() } func TestRequiredDeploymentsEnforcementLevelChanges_GetFrom(tt *testing.T) { var zeroValue string r := &RequiredDeploymentsEnforcementLevelChanges{From: &zeroValue} r.GetFrom() r = &RequiredDeploymentsEnforcementLevelChanges{} r.GetFrom() r = nil r.GetFrom() } func TestRequiredReviewer_GetType(tt *testing.T) { var zeroValue string r := &RequiredReviewer{Type: &zeroValue} r.GetType() r = &RequiredReviewer{} r.GetType() r = nil r.GetType() } func TestRequiredStatusCheck_GetAppID(tt *testing.T) { var zeroValue int64 r := &RequiredStatusCheck{AppID: &zeroValue} r.GetAppID() r = &RequiredStatusCheck{} r.GetAppID() r = nil r.GetAppID() } func TestRequiredStatusChecks_GetChecks(tt *testing.T) { var zeroValue []*RequiredStatusCheck r := &RequiredStatusChecks{Checks: &zeroValue} r.GetChecks() r = &RequiredStatusChecks{} r.GetChecks() r = nil r.GetChecks() } func TestRequiredStatusChecks_GetContexts(tt *testing.T) { var zeroValue []string r := &RequiredStatusChecks{Contexts: &zeroValue} r.GetContexts() r = &RequiredStatusChecks{} r.GetContexts() r = nil r.GetContexts() } func TestRequiredStatusChecks_GetContextsURL(tt *testing.T) { var zeroValue string r := &RequiredStatusChecks{ContextsURL: &zeroValue} r.GetContextsURL() r = &RequiredStatusChecks{} r.GetContextsURL() r = nil r.GetContextsURL() } func TestRequiredStatusChecks_GetURL(tt *testing.T) { var zeroValue string r := &RequiredStatusChecks{URL: &zeroValue} r.GetURL() r = &RequiredStatusChecks{} r.GetURL() r = nil r.GetURL() } func TestRequiredStatusChecksEnforcementLevelChanges_GetFrom(tt *testing.T) { var zeroValue string r := &RequiredStatusChecksEnforcementLevelChanges{From: &zeroValue} r.GetFrom() r = &RequiredStatusChecksEnforcementLevelChanges{} r.GetFrom() r = nil r.GetFrom() } func TestRequiredStatusChecksRequest_GetStrict(tt *testing.T) { var zeroValue bool r := &RequiredStatusChecksRequest{Strict: &zeroValue} r.GetStrict() r = &RequiredStatusChecksRequest{} r.GetStrict() r = nil r.GetStrict() } func TestRequiredWorkflowSelectedRepos_GetTotalCount(tt *testing.T) { var zeroValue int r := &RequiredWorkflowSelectedRepos{TotalCount: &zeroValue} r.GetTotalCount() r = &RequiredWorkflowSelectedRepos{} r.GetTotalCount() r = nil r.GetTotalCount() } func TestReviewersRequest_GetNodeID(tt *testing.T) { var zeroValue string r := &ReviewersRequest{NodeID: &zeroValue} r.GetNodeID() r = &ReviewersRequest{} r.GetNodeID() r = nil r.GetNodeID() } func TestReviewPersonalAccessTokenRequestOptions_GetReason(tt *testing.T) { var zeroValue string r := &ReviewPersonalAccessTokenRequestOptions{Reason: &zeroValue} r.GetReason() r = &ReviewPersonalAccessTokenRequestOptions{} r.GetReason() r = nil r.GetReason() } 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 TestRulePatternParameters_GetName(tt *testing.T) { var zeroValue string r := &RulePatternParameters{Name: &zeroValue} r.GetName() r = &RulePatternParameters{} r.GetName() r = nil r.GetName() } func TestRulePatternParameters_GetNegate(tt *testing.T) { var zeroValue bool r := &RulePatternParameters{Negate: &zeroValue} r.GetNegate() r = &RulePatternParameters{} r.GetNegate() r = nil r.GetNegate() } func TestRuleRequiredStatusChecks_GetIntegrationID(tt *testing.T) { var zeroValue int64 r := &RuleRequiredStatusChecks{IntegrationID: &zeroValue} r.GetIntegrationID() r = &RuleRequiredStatusChecks{} r.GetIntegrationID() r = nil r.GetIntegrationID() } func TestRuleRequiredWorkflow_GetRef(tt *testing.T) { var zeroValue string r := &RuleRequiredWorkflow{Ref: &zeroValue} r.GetRef() r = &RuleRequiredWorkflow{} r.GetRef() r = nil r.GetRef() } func TestRuleRequiredWorkflow_GetRepositoryID(tt *testing.T) { var zeroValue int64 r := &RuleRequiredWorkflow{RepositoryID: &zeroValue} r.GetRepositoryID() r = &RuleRequiredWorkflow{} r.GetRepositoryID() r = nil r.GetRepositoryID() } func TestRuleRequiredWorkflow_GetSha(tt *testing.T) { var zeroValue string r := &RuleRequiredWorkflow{Sha: &zeroValue} r.GetSha() r = &RuleRequiredWorkflow{} r.GetSha() r = nil r.GetSha() } func TestRuleset_GetConditions(tt *testing.T) { r := &Ruleset{} r.GetConditions() r = nil r.GetConditions() } func TestRuleset_GetID(tt *testing.T) { var zeroValue int64 r := &Ruleset{ID: &zeroValue} r.GetID() r = &Ruleset{} r.GetID() r = nil r.GetID() } func TestRuleset_GetLinks(tt *testing.T) { r := &Ruleset{} r.GetLinks() r = nil r.GetLinks() } func TestRuleset_GetNodeID(tt *testing.T) { var zeroValue string r := &Ruleset{NodeID: &zeroValue} r.GetNodeID() r = &Ruleset{} r.GetNodeID() r = nil r.GetNodeID() } func TestRuleset_GetSourceType(tt *testing.T) { var zeroValue string r := &Ruleset{SourceType: &zeroValue} r.GetSourceType() r = &Ruleset{} r.GetSourceType() r = nil r.GetSourceType() } func TestRuleset_GetTarget(tt *testing.T) { var zeroValue string r := &Ruleset{Target: &zeroValue} r.GetTarget() r = &Ruleset{} r.GetTarget() r = nil r.GetTarget() } func TestRulesetConditions_GetRefName(tt *testing.T) { r := &RulesetConditions{} r.GetRefName() r = nil r.GetRefName() } func TestRulesetConditions_GetRepositoryID(tt *testing.T) { r := &RulesetConditions{} r.GetRepositoryID() r = nil r.GetRepositoryID() } func TestRulesetConditions_GetRepositoryName(tt *testing.T) { r := &RulesetConditions{} r.GetRepositoryName() r = nil r.GetRepositoryName() } func TestRulesetLink_GetHRef(tt *testing.T) { var zeroValue string r := &RulesetLink{HRef: &zeroValue} r.GetHRef() r = &RulesetLink{} r.GetHRef() r = nil r.GetHRef() } func TestRulesetLinks_GetSelf(tt *testing.T) { r := &RulesetLinks{} r.GetSelf() r = nil r.GetSelf() } func TestRulesetRepositoryNamesConditionParameters_GetProtected(tt *testing.T) { var zeroValue bool r := &RulesetRepositoryNamesConditionParameters{Protected: &zeroValue} r.GetProtected() r = &RulesetRepositoryNamesConditionParameters{} r.GetProtected() r = nil r.GetProtected() } 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_GetRestrictedToWorkflows(tt *testing.T) { var zeroValue bool r := &RunnerGroup{RestrictedToWorkflows: &zeroValue} r.GetRestrictedToWorkflows() r = &RunnerGroup{} r.GetRestrictedToWorkflows() r = nil r.GetRestrictedToWorkflows() } 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 TestRunnerGroup_GetWorkflowRestrictionsReadOnly(tt *testing.T) { var zeroValue bool r := &RunnerGroup{WorkflowRestrictionsReadOnly: &zeroValue} r.GetWorkflowRestrictionsReadOnly() r = &RunnerGroup{} r.GetWorkflowRestrictionsReadOnly() r = nil r.GetWorkflowRestrictionsReadOnly() } 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 TestSarifAnalysis_GetCheckoutURI(tt *testing.T) { var zeroValue string s := &SarifAnalysis{CheckoutURI: &zeroValue} s.GetCheckoutURI() s = &SarifAnalysis{} s.GetCheckoutURI() s = nil s.GetCheckoutURI() } func TestSarifAnalysis_GetCommitSHA(tt *testing.T) { var zeroValue string s := &SarifAnalysis{CommitSHA: &zeroValue} s.GetCommitSHA() s = &SarifAnalysis{} s.GetCommitSHA() s = nil s.GetCommitSHA() } func TestSarifAnalysis_GetRef(tt *testing.T) { var zeroValue string s := &SarifAnalysis{Ref: &zeroValue} s.GetRef() s = &SarifAnalysis{} s.GetRef() s = nil s.GetRef() } func TestSarifAnalysis_GetSarif(tt *testing.T) { var zeroValue string s := &SarifAnalysis{Sarif: &zeroValue} s.GetSarif() s = &SarifAnalysis{} s.GetSarif() s = nil s.GetSarif() } func TestSarifAnalysis_GetStartedAt(tt *testing.T) { var zeroValue Timestamp s := &SarifAnalysis{StartedAt: &zeroValue} s.GetStartedAt() s = &SarifAnalysis{} s.GetStartedAt() s = nil s.GetStartedAt() } func TestSarifAnalysis_GetToolName(tt *testing.T) { var zeroValue string s := &SarifAnalysis{ToolName: &zeroValue} s.GetToolName() s = &SarifAnalysis{} s.GetToolName() s = nil s.GetToolName() } func TestSarifID_GetID(tt *testing.T) { var zeroValue string s := &SarifID{ID: &zeroValue} s.GetID() s = &SarifID{} s.GetID() s = nil s.GetID() } func TestSarifID_GetURL(tt *testing.T) { var zeroValue string s := &SarifID{URL: &zeroValue} s.GetURL() s = &SarifID{} s.GetURL() s = nil s.GetURL() } func TestSARIFUpload_GetAnalysesURL(tt *testing.T) { var zeroValue string s := &SARIFUpload{AnalysesURL: &zeroValue} s.GetAnalysesURL() s = &SARIFUpload{} s.GetAnalysesURL() s = nil s.GetAnalysesURL() } func TestSARIFUpload_GetProcessingStatus(tt *testing.T) { var zeroValue string s := &SARIFUpload{ProcessingStatus: &zeroValue} s.GetProcessingStatus() s = &SARIFUpload{} s.GetProcessingStatus() s = nil s.GetProcessingStatus() } func TestSBOM_GetSBOM(tt *testing.T) { s := &SBOM{} s.GetSBOM() s = nil s.GetSBOM() } func TestSBOMInfo_GetCreationInfo(tt *testing.T) { s := &SBOMInfo{} s.GetCreationInfo() s = nil s.GetCreationInfo() } func TestSBOMInfo_GetDataLicense(tt *testing.T) { var zeroValue string s := &SBOMInfo{DataLicense: &zeroValue} s.GetDataLicense() s = &SBOMInfo{} s.GetDataLicense() s = nil s.GetDataLicense() } func TestSBOMInfo_GetDocumentNamespace(tt *testing.T) { var zeroValue string s := &SBOMInfo{DocumentNamespace: &zeroValue} s.GetDocumentNamespace() s = &SBOMInfo{} s.GetDocumentNamespace() s = nil s.GetDocumentNamespace() } func TestSBOMInfo_GetName(tt *testing.T) { var zeroValue string s := &SBOMInfo{Name: &zeroValue} s.GetName() s = &SBOMInfo{} s.GetName() s = nil s.GetName() } func TestSBOMInfo_GetSPDXID(tt *testing.T) { var zeroValue string s := &SBOMInfo{SPDXID: &zeroValue} s.GetSPDXID() s = &SBOMInfo{} s.GetSPDXID() s = nil s.GetSPDXID() } func TestSBOMInfo_GetSPDXVersion(tt *testing.T) { var zeroValue string s := &SBOMInfo{SPDXVersion: &zeroValue} s.GetSPDXVersion() s = &SBOMInfo{} s.GetSPDXVersion() s = nil s.GetSPDXVersion() } func TestScanningAnalysis_GetAnalysisKey(tt *testing.T) { var zeroValue string s := &ScanningAnalysis{AnalysisKey: &zeroValue} s.GetAnalysisKey() s = &ScanningAnalysis{} s.GetAnalysisKey() s = nil s.GetAnalysisKey() } func TestScanningAnalysis_GetCategory(tt *testing.T) { var zeroValue string s := &ScanningAnalysis{Category: &zeroValue} s.GetCategory() s = &ScanningAnalysis{} s.GetCategory() s = nil s.GetCategory() } func TestScanningAnalysis_GetCommitSHA(tt *testing.T) { var zeroValue string s := &ScanningAnalysis{CommitSHA: &zeroValue} s.GetCommitSHA() s = &ScanningAnalysis{} s.GetCommitSHA() s = nil s.GetCommitSHA() } func TestScanningAnalysis_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp s := &ScanningAnalysis{CreatedAt: &zeroValue} s.GetCreatedAt() s = &ScanningAnalysis{} s.GetCreatedAt() s = nil s.GetCreatedAt() } func TestScanningAnalysis_GetDeletable(tt *testing.T) { var zeroValue bool s := &ScanningAnalysis{Deletable: &zeroValue} s.GetDeletable() s = &ScanningAnalysis{} s.GetDeletable() s = nil s.GetDeletable() } func TestScanningAnalysis_GetEnvironment(tt *testing.T) { var zeroValue string s := &ScanningAnalysis{Environment: &zeroValue} s.GetEnvironment() s = &ScanningAnalysis{} s.GetEnvironment() s = nil s.GetEnvironment() } func TestScanningAnalysis_GetError(tt *testing.T) { var zeroValue string s := &ScanningAnalysis{Error: &zeroValue} s.GetError() s = &ScanningAnalysis{} s.GetError() s = nil s.GetError() } func TestScanningAnalysis_GetID(tt *testing.T) { var zeroValue int64 s := &ScanningAnalysis{ID: &zeroValue} s.GetID() s = &ScanningAnalysis{} s.GetID() s = nil s.GetID() } func TestScanningAnalysis_GetRef(tt *testing.T) { var zeroValue string s := &ScanningAnalysis{Ref: &zeroValue} s.GetRef() s = &ScanningAnalysis{} s.GetRef() s = nil s.GetRef() } func TestScanningAnalysis_GetResultsCount(tt *testing.T) { var zeroValue int s := &ScanningAnalysis{ResultsCount: &zeroValue} s.GetResultsCount() s = &ScanningAnalysis{} s.GetResultsCount() s = nil s.GetResultsCount() } func TestScanningAnalysis_GetRulesCount(tt *testing.T) { var zeroValue int s := &ScanningAnalysis{RulesCount: &zeroValue} s.GetRulesCount() s = &ScanningAnalysis{} s.GetRulesCount() s = nil s.GetRulesCount() } func TestScanningAnalysis_GetSarifID(tt *testing.T) { var zeroValue string s := &ScanningAnalysis{SarifID: &zeroValue} s.GetSarifID() s = &ScanningAnalysis{} s.GetSarifID() s = nil s.GetSarifID() } func TestScanningAnalysis_GetTool(tt *testing.T) { s := &ScanningAnalysis{} s.GetTool() s = nil s.GetTool() } func TestScanningAnalysis_GetURL(tt *testing.T) { var zeroValue string s := &ScanningAnalysis{URL: &zeroValue} s.GetURL() s = &ScanningAnalysis{} s.GetURL() s = nil s.GetURL() } func TestScanningAnalysis_GetWarning(tt *testing.T) { var zeroValue string s := &ScanningAnalysis{Warning: &zeroValue} s.GetWarning() s = &ScanningAnalysis{} s.GetWarning() s = nil s.GetWarning() } func TestSCIMMeta_GetCreated(tt *testing.T) { var zeroValue Timestamp s := &SCIMMeta{Created: &zeroValue} s.GetCreated() s = &SCIMMeta{} s.GetCreated() s = nil s.GetCreated() } func TestSCIMMeta_GetLastModified(tt *testing.T) { var zeroValue Timestamp s := &SCIMMeta{LastModified: &zeroValue} s.GetLastModified() s = &SCIMMeta{} s.GetLastModified() s = nil s.GetLastModified() } func TestSCIMMeta_GetLocation(tt *testing.T) { var zeroValue string s := &SCIMMeta{Location: &zeroValue} s.GetLocation() s = &SCIMMeta{} s.GetLocation() s = nil s.GetLocation() } func TestSCIMMeta_GetResourceType(tt *testing.T) { var zeroValue string s := &SCIMMeta{ResourceType: &zeroValue} s.GetResourceType() s = &SCIMMeta{} s.GetResourceType() s = nil s.GetResourceType() } func TestSCIMProvisionedIdentities_GetItemsPerPage(tt *testing.T) { var zeroValue int s := &SCIMProvisionedIdentities{ItemsPerPage: &zeroValue} s.GetItemsPerPage() s = &SCIMProvisionedIdentities{} s.GetItemsPerPage() s = nil s.GetItemsPerPage() } func TestSCIMProvisionedIdentities_GetStartIndex(tt *testing.T) { var zeroValue int s := &SCIMProvisionedIdentities{StartIndex: &zeroValue} s.GetStartIndex() s = &SCIMProvisionedIdentities{} s.GetStartIndex() s = nil s.GetStartIndex() } func TestSCIMProvisionedIdentities_GetTotalResults(tt *testing.T) { var zeroValue int s := &SCIMProvisionedIdentities{TotalResults: &zeroValue} s.GetTotalResults() s = &SCIMProvisionedIdentities{} s.GetTotalResults() s = nil s.GetTotalResults() } func TestSCIMUserAttributes_GetActive(tt *testing.T) { var zeroValue bool s := &SCIMUserAttributes{Active: &zeroValue} s.GetActive() s = &SCIMUserAttributes{} s.GetActive() s = nil s.GetActive() } func TestSCIMUserAttributes_GetDisplayName(tt *testing.T) { var zeroValue string s := &SCIMUserAttributes{DisplayName: &zeroValue} s.GetDisplayName() s = &SCIMUserAttributes{} s.GetDisplayName() s = nil s.GetDisplayName() } func TestSCIMUserAttributes_GetExternalID(tt *testing.T) { var zeroValue string s := &SCIMUserAttributes{ExternalID: &zeroValue} s.GetExternalID() s = &SCIMUserAttributes{} s.GetExternalID() s = nil s.GetExternalID() } func TestSCIMUserAttributes_GetID(tt *testing.T) { var zeroValue string s := &SCIMUserAttributes{ID: &zeroValue} s.GetID() s = &SCIMUserAttributes{} s.GetID() s = nil s.GetID() } func TestSCIMUserAttributes_GetMeta(tt *testing.T) { s := &SCIMUserAttributes{} s.GetMeta() s = nil s.GetMeta() } func TestSCIMUserEmail_GetPrimary(tt *testing.T) { var zeroValue bool s := &SCIMUserEmail{Primary: &zeroValue} s.GetPrimary() s = &SCIMUserEmail{} s.GetPrimary() s = nil s.GetPrimary() } func TestSCIMUserEmail_GetType(tt *testing.T) { var zeroValue string s := &SCIMUserEmail{Type: &zeroValue} s.GetType() s = &SCIMUserEmail{} s.GetType() s = nil s.GetType() } func TestSCIMUserName_GetFormatted(tt *testing.T) { var zeroValue string s := &SCIMUserName{Formatted: &zeroValue} s.GetFormatted() s = &SCIMUserName{} s.GetFormatted() s = nil s.GetFormatted() } func TestSecretScanning_GetStatus(tt *testing.T) { var zeroValue string s := &SecretScanning{Status: &zeroValue} s.GetStatus() s = &SecretScanning{} s.GetStatus() s = nil s.GetStatus() } func TestSecretScanningAlert_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp s := &SecretScanningAlert{CreatedAt: &zeroValue} s.GetCreatedAt() s = &SecretScanningAlert{} s.GetCreatedAt() s = nil s.GetCreatedAt() } func TestSecretScanningAlert_GetHTMLURL(tt *testing.T) { var zeroValue string s := &SecretScanningAlert{HTMLURL: &zeroValue} s.GetHTMLURL() s = &SecretScanningAlert{} s.GetHTMLURL() s = nil s.GetHTMLURL() } func TestSecretScanningAlert_GetLocationsURL(tt *testing.T) { var zeroValue string s := &SecretScanningAlert{LocationsURL: &zeroValue} s.GetLocationsURL() s = &SecretScanningAlert{} s.GetLocationsURL() s = nil s.GetLocationsURL() } func TestSecretScanningAlert_GetNumber(tt *testing.T) { var zeroValue int s := &SecretScanningAlert{Number: &zeroValue} s.GetNumber() s = &SecretScanningAlert{} s.GetNumber() s = nil s.GetNumber() } func TestSecretScanningAlert_GetPushProtectionBypassed(tt *testing.T) { var zeroValue bool s := &SecretScanningAlert{PushProtectionBypassed: &zeroValue} s.GetPushProtectionBypassed() s = &SecretScanningAlert{} s.GetPushProtectionBypassed() s = nil s.GetPushProtectionBypassed() } func TestSecretScanningAlert_GetPushProtectionBypassedAt(tt *testing.T) { var zeroValue Timestamp s := &SecretScanningAlert{PushProtectionBypassedAt: &zeroValue} s.GetPushProtectionBypassedAt() s = &SecretScanningAlert{} s.GetPushProtectionBypassedAt() s = nil s.GetPushProtectionBypassedAt() } func TestSecretScanningAlert_GetPushProtectionBypassedBy(tt *testing.T) { s := &SecretScanningAlert{} s.GetPushProtectionBypassedBy() s = nil s.GetPushProtectionBypassedBy() } func TestSecretScanningAlert_GetRepository(tt *testing.T) { s := &SecretScanningAlert{} s.GetRepository() s = nil s.GetRepository() } func TestSecretScanningAlert_GetResolution(tt *testing.T) { var zeroValue string s := &SecretScanningAlert{Resolution: &zeroValue} s.GetResolution() s = &SecretScanningAlert{} s.GetResolution() s = nil s.GetResolution() } func TestSecretScanningAlert_GetResolutionComment(tt *testing.T) { var zeroValue string s := &SecretScanningAlert{ResolutionComment: &zeroValue} s.GetResolutionComment() s = &SecretScanningAlert{} s.GetResolutionComment() s = nil s.GetResolutionComment() } func TestSecretScanningAlert_GetResolvedAt(tt *testing.T) { var zeroValue Timestamp s := &SecretScanningAlert{ResolvedAt: &zeroValue} s.GetResolvedAt() s = &SecretScanningAlert{} s.GetResolvedAt() s = nil s.GetResolvedAt() } func TestSecretScanningAlert_GetResolvedBy(tt *testing.T) { s := &SecretScanningAlert{} s.GetResolvedBy() s = nil s.GetResolvedBy() } func TestSecretScanningAlert_GetSecret(tt *testing.T) { var zeroValue string s := &SecretScanningAlert{Secret: &zeroValue} s.GetSecret() s = &SecretScanningAlert{} s.GetSecret() s = nil s.GetSecret() } func TestSecretScanningAlert_GetSecretType(tt *testing.T) { var zeroValue string s := &SecretScanningAlert{SecretType: &zeroValue} s.GetSecretType() s = &SecretScanningAlert{} s.GetSecretType() s = nil s.GetSecretType() } func TestSecretScanningAlert_GetSecretTypeDisplayName(tt *testing.T) { var zeroValue string s := &SecretScanningAlert{SecretTypeDisplayName: &zeroValue} s.GetSecretTypeDisplayName() s = &SecretScanningAlert{} s.GetSecretTypeDisplayName() s = nil s.GetSecretTypeDisplayName() } func TestSecretScanningAlert_GetState(tt *testing.T) { var zeroValue string s := &SecretScanningAlert{State: &zeroValue} s.GetState() s = &SecretScanningAlert{} s.GetState() s = nil s.GetState() } func TestSecretScanningAlert_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp s := &SecretScanningAlert{UpdatedAt: &zeroValue} s.GetUpdatedAt() s = &SecretScanningAlert{} s.GetUpdatedAt() s = nil s.GetUpdatedAt() } func TestSecretScanningAlert_GetURL(tt *testing.T) { var zeroValue string s := &SecretScanningAlert{URL: &zeroValue} s.GetURL() s = &SecretScanningAlert{} s.GetURL() s = nil s.GetURL() } func TestSecretScanningAlertEvent_GetAction(tt *testing.T) { var zeroValue string s := &SecretScanningAlertEvent{Action: &zeroValue} s.GetAction() s = &SecretScanningAlertEvent{} s.GetAction() s = nil s.GetAction() } func TestSecretScanningAlertEvent_GetAlert(tt *testing.T) { s := &SecretScanningAlertEvent{} s.GetAlert() s = nil s.GetAlert() } func TestSecretScanningAlertEvent_GetEnterprise(tt *testing.T) { s := &SecretScanningAlertEvent{} s.GetEnterprise() s = nil s.GetEnterprise() } func TestSecretScanningAlertEvent_GetInstallation(tt *testing.T) { s := &SecretScanningAlertEvent{} s.GetInstallation() s = nil s.GetInstallation() } func TestSecretScanningAlertEvent_GetOrganization(tt *testing.T) { s := &SecretScanningAlertEvent{} s.GetOrganization() s = nil s.GetOrganization() } func TestSecretScanningAlertEvent_GetRepo(tt *testing.T) { s := &SecretScanningAlertEvent{} s.GetRepo() s = nil s.GetRepo() } func TestSecretScanningAlertEvent_GetSender(tt *testing.T) { s := &SecretScanningAlertEvent{} s.GetSender() s = nil s.GetSender() } func TestSecretScanningAlertLocation_GetDetails(tt *testing.T) { s := &SecretScanningAlertLocation{} s.GetDetails() s = nil s.GetDetails() } func TestSecretScanningAlertLocation_GetType(tt *testing.T) { var zeroValue string s := &SecretScanningAlertLocation{Type: &zeroValue} s.GetType() s = &SecretScanningAlertLocation{} s.GetType() s = nil s.GetType() } func TestSecretScanningAlertLocationDetails_GetBlobSHA(tt *testing.T) { var zeroValue string s := &SecretScanningAlertLocationDetails{BlobSHA: &zeroValue} s.GetBlobSHA() s = &SecretScanningAlertLocationDetails{} s.GetBlobSHA() s = nil s.GetBlobSHA() } func TestSecretScanningAlertLocationDetails_GetBlobURL(tt *testing.T) { var zeroValue string s := &SecretScanningAlertLocationDetails{BlobURL: &zeroValue} s.GetBlobURL() s = &SecretScanningAlertLocationDetails{} s.GetBlobURL() s = nil s.GetBlobURL() } func TestSecretScanningAlertLocationDetails_GetCommitSHA(tt *testing.T) { var zeroValue string s := &SecretScanningAlertLocationDetails{CommitSHA: &zeroValue} s.GetCommitSHA() s = &SecretScanningAlertLocationDetails{} s.GetCommitSHA() s = nil s.GetCommitSHA() } func TestSecretScanningAlertLocationDetails_GetCommitURL(tt *testing.T) { var zeroValue string s := &SecretScanningAlertLocationDetails{CommitURL: &zeroValue} s.GetCommitURL() s = &SecretScanningAlertLocationDetails{} s.GetCommitURL() s = nil s.GetCommitURL() } func TestSecretScanningAlertLocationDetails_GetEndColumn(tt *testing.T) { var zeroValue int s := &SecretScanningAlertLocationDetails{EndColumn: &zeroValue} s.GetEndColumn() s = &SecretScanningAlertLocationDetails{} s.GetEndColumn() s = nil s.GetEndColumn() } func TestSecretScanningAlertLocationDetails_GetEndLine(tt *testing.T) { var zeroValue int s := &SecretScanningAlertLocationDetails{EndLine: &zeroValue} s.GetEndLine() s = &SecretScanningAlertLocationDetails{} s.GetEndLine() s = nil s.GetEndLine() } func TestSecretScanningAlertLocationDetails_GetPath(tt *testing.T) { var zeroValue string s := &SecretScanningAlertLocationDetails{Path: &zeroValue} s.GetPath() s = &SecretScanningAlertLocationDetails{} s.GetPath() s = nil s.GetPath() } func TestSecretScanningAlertLocationDetails_GetStartColumn(tt *testing.T) { var zeroValue int s := &SecretScanningAlertLocationDetails{StartColumn: &zeroValue} s.GetStartColumn() s = &SecretScanningAlertLocationDetails{} s.GetStartColumn() s = nil s.GetStartColumn() } func TestSecretScanningAlertLocationDetails_GetStartline(tt *testing.T) { var zeroValue int s := &SecretScanningAlertLocationDetails{Startline: &zeroValue} s.GetStartline() s = &SecretScanningAlertLocationDetails{} s.GetStartline() s = nil s.GetStartline() } func TestSecretScanningAlertUpdateOptions_GetResolution(tt *testing.T) { var zeroValue string s := &SecretScanningAlertUpdateOptions{Resolution: &zeroValue} s.GetResolution() s = &SecretScanningAlertUpdateOptions{} s.GetResolution() s = nil s.GetResolution() } func TestSecretScanningPushProtection_GetStatus(tt *testing.T) { var zeroValue string s := &SecretScanningPushProtection{Status: &zeroValue} s.GetStatus() s = &SecretScanningPushProtection{} s.GetStatus() s = nil s.GetStatus() } func TestSecretScanningValidityChecks_GetStatus(tt *testing.T) { var zeroValue string s := &SecretScanningValidityChecks{Status: &zeroValue} s.GetStatus() s = &SecretScanningValidityChecks{} s.GetStatus() s = nil s.GetStatus() } func TestSecurityAdvisory_GetAuthor(tt *testing.T) { s := &SecurityAdvisory{} s.GetAuthor() s = nil s.GetAuthor() } func TestSecurityAdvisory_GetClosedAt(tt *testing.T) { var zeroValue Timestamp s := &SecurityAdvisory{ClosedAt: &zeroValue} s.GetClosedAt() s = &SecurityAdvisory{} s.GetClosedAt() s = nil s.GetClosedAt() } func TestSecurityAdvisory_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp s := &SecurityAdvisory{CreatedAt: &zeroValue} s.GetCreatedAt() s = &SecurityAdvisory{} s.GetCreatedAt() s = nil s.GetCreatedAt() } func TestSecurityAdvisory_GetCVEID(tt *testing.T) { var zeroValue string s := &SecurityAdvisory{CVEID: &zeroValue} s.GetCVEID() s = &SecurityAdvisory{} s.GetCVEID() s = nil s.GetCVEID() } func TestSecurityAdvisory_GetCVSS(tt *testing.T) { s := &SecurityAdvisory{} s.GetCVSS() s = nil s.GetCVSS() } func TestSecurityAdvisory_GetDescription(tt *testing.T) { var zeroValue string s := &SecurityAdvisory{Description: &zeroValue} s.GetDescription() s = &SecurityAdvisory{} s.GetDescription() s = nil s.GetDescription() } func TestSecurityAdvisory_GetGHSAID(tt *testing.T) { var zeroValue string s := &SecurityAdvisory{GHSAID: &zeroValue} s.GetGHSAID() s = &SecurityAdvisory{} s.GetGHSAID() s = nil s.GetGHSAID() } func TestSecurityAdvisory_GetHTMLURL(tt *testing.T) { var zeroValue string s := &SecurityAdvisory{HTMLURL: &zeroValue} s.GetHTMLURL() s = &SecurityAdvisory{} s.GetHTMLURL() s = nil s.GetHTMLURL() } func TestSecurityAdvisory_GetPrivateFork(tt *testing.T) { s := &SecurityAdvisory{} s.GetPrivateFork() s = nil s.GetPrivateFork() } func TestSecurityAdvisory_GetPublishedAt(tt *testing.T) { var zeroValue Timestamp s := &SecurityAdvisory{PublishedAt: &zeroValue} s.GetPublishedAt() s = &SecurityAdvisory{} s.GetPublishedAt() s = nil s.GetPublishedAt() } func TestSecurityAdvisory_GetPublisher(tt *testing.T) { s := &SecurityAdvisory{} s.GetPublisher() s = nil s.GetPublisher() } func TestSecurityAdvisory_GetSeverity(tt *testing.T) { var zeroValue string s := &SecurityAdvisory{Severity: &zeroValue} s.GetSeverity() s = &SecurityAdvisory{} s.GetSeverity() s = nil s.GetSeverity() } func TestSecurityAdvisory_GetState(tt *testing.T) { var zeroValue string s := &SecurityAdvisory{State: &zeroValue} s.GetState() s = &SecurityAdvisory{} s.GetState() s = nil s.GetState() } func TestSecurityAdvisory_GetSubmission(tt *testing.T) { s := &SecurityAdvisory{} s.GetSubmission() s = nil s.GetSubmission() } func TestSecurityAdvisory_GetSummary(tt *testing.T) { var zeroValue string s := &SecurityAdvisory{Summary: &zeroValue} s.GetSummary() s = &SecurityAdvisory{} s.GetSummary() s = nil s.GetSummary() } func TestSecurityAdvisory_GetUpdatedAt(tt *testing.T) { var zeroValue Timestamp s := &SecurityAdvisory{UpdatedAt: &zeroValue} s.GetUpdatedAt() s = &SecurityAdvisory{} s.GetUpdatedAt() s = nil s.GetUpdatedAt() } func TestSecurityAdvisory_GetURL(tt *testing.T) { var zeroValue string s := &SecurityAdvisory{URL: &zeroValue} s.GetURL() s = &SecurityAdvisory{} s.GetURL() s = nil s.GetURL() } func TestSecurityAdvisory_GetWithdrawnAt(tt *testing.T) { var zeroValue Timestamp s := &SecurityAdvisory{WithdrawnAt: &zeroValue} s.GetWithdrawnAt() s = &SecurityAdvisory{} s.GetWithdrawnAt() s = nil s.GetWithdrawnAt() } func TestSecurityAdvisoryEvent_GetAction(tt *testing.T) { var zeroValue string s := &SecurityAdvisoryEvent{Action: &zeroValue} s.GetAction() s = &SecurityAdvisoryEvent{} s.GetAction() s = nil s.GetAction() } func TestSecurityAdvisoryEvent_GetEnterprise(tt *testing.T) { s := &SecurityAdvisoryEvent{} s.GetEnterprise() s = nil s.GetEnterprise() } func TestSecurityAdvisoryEvent_GetInstallation(tt *testing.T) { s := &SecurityAdvisoryEvent{} s.GetInstallation() s = nil s.GetInstallation() } func TestSecurityAdvisoryEvent_GetOrganization(tt *testing.T) { s := &SecurityAdvisoryEvent{} s.GetOrganization() s = nil s.GetOrganization() } func TestSecurityAdvisoryEvent_GetRepository(tt *testing.T) { s := &SecurityAdvisoryEvent{} s.GetRepository() s = nil s.GetRepository() } func TestSecurityAdvisoryEvent_GetSecurityAdvisory(tt *testing.T) { s := &SecurityAdvisoryEvent{} s.GetSecurityAdvisory() s = nil s.GetSecurityAdvisory() } func TestSecurityAdvisoryEvent_GetSender(tt *testing.T) { s := &SecurityAdvisoryEvent{} s.GetSender() s = nil s.GetSender() } func TestSecurityAdvisorySubmission_GetAccepted(tt *testing.T) { var zeroValue bool s := &SecurityAdvisorySubmission{Accepted: &zeroValue} s.GetAccepted() s = &SecurityAdvisorySubmission{} s.GetAccepted() s = nil s.GetAccepted() } func TestSecurityAndAnalysis_GetAdvancedSecurity(tt *testing.T) { s := &SecurityAndAnalysis{} s.GetAdvancedSecurity() s = nil s.GetAdvancedSecurity() } func TestSecurityAndAnalysis_GetDependabotSecurityUpdates(tt *testing.T) { s := &SecurityAndAnalysis{} s.GetDependabotSecurityUpdates() s = nil s.GetDependabotSecurityUpdates() } func TestSecurityAndAnalysis_GetSecretScanning(tt *testing.T) { s := &SecurityAndAnalysis{} s.GetSecretScanning() s = nil s.GetSecretScanning() } func TestSecurityAndAnalysis_GetSecretScanningPushProtection(tt *testing.T) { s := &SecurityAndAnalysis{} s.GetSecretScanningPushProtection() s = nil s.GetSecretScanningPushProtection() } func TestSecurityAndAnalysis_GetSecretScanningValidityChecks(tt *testing.T) { s := &SecurityAndAnalysis{} s.GetSecretScanningValidityChecks() s = nil s.GetSecretScanningValidityChecks() } func TestSecurityAndAnalysisChange_GetFrom(tt *testing.T) { s := &SecurityAndAnalysisChange{} s.GetFrom() s = nil s.GetFrom() } func TestSecurityAndAnalysisChangeFrom_GetSecurityAndAnalysis(tt *testing.T) { s := &SecurityAndAnalysisChangeFrom{} s.GetSecurityAndAnalysis() s = nil s.GetSecurityAndAnalysis() } func TestSecurityAndAnalysisEvent_GetChanges(tt *testing.T) { s := &SecurityAndAnalysisEvent{} s.GetChanges() s = nil s.GetChanges() } func TestSecurityAndAnalysisEvent_GetEnterprise(tt *testing.T) { s := &SecurityAndAnalysisEvent{} s.GetEnterprise() s = nil s.GetEnterprise() } func TestSecurityAndAnalysisEvent_GetInstallation(tt *testing.T) { s := &SecurityAndAnalysisEvent{} s.GetInstallation() s = nil s.GetInstallation() } func TestSecurityAndAnalysisEvent_GetOrganization(tt *testing.T) { s := &SecurityAndAnalysisEvent{} s.GetOrganization() s = nil s.GetOrganization() } func TestSecurityAndAnalysisEvent_GetRepository(tt *testing.T) { s := &SecurityAndAnalysisEvent{} s.GetRepository() s = nil s.GetRepository() } func TestSecurityAndAnalysisEvent_GetSender(tt *testing.T) { s := &SecurityAndAnalysisEvent{} s.GetSender() s = nil s.GetSender() } func TestSelectedReposList_GetTotalCount(tt *testing.T) { var zeroValue int s := &SelectedReposList{TotalCount: &zeroValue} s.GetTotalCount() s = &SelectedReposList{} s.GetTotalCount() s = nil s.GetTotalCount() } func TestSignatureRequirementEnforcementLevelChanges_GetFrom(tt *testing.T) { var zeroValue string s := &SignatureRequirementEnforcementLevelChanges{From: &zeroValue} s.GetFrom() s = &SignatureRequirementEnforcementLevelChanges{} s.GetFrom() s = nil s.GetFrom() } 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 TestSSHSigningKey_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp s := &SSHSigningKey{CreatedAt: &zeroValue} s.GetCreatedAt() s = &SSHSigningKey{} s.GetCreatedAt() s = nil s.GetCreatedAt() } func TestSSHSigningKey_GetID(tt *testing.T) { var zeroValue int64 s := &SSHSigningKey{ID: &zeroValue} s.GetID() s = &SSHSigningKey{} s.GetID() s = nil s.GetID() } func TestSSHSigningKey_GetKey(tt *testing.T) { var zeroValue string s := &SSHSigningKey{Key: &zeroValue} s.GetKey() s = &SSHSigningKey{} s.GetKey() s = nil s.GetKey() } func TestSSHSigningKey_GetTitle(tt *testing.T) { var zeroValue string s := &SSHSigningKey{Title: &zeroValue} s.GetTitle() s = &SSHSigningKey{} s.GetTitle() s = nil s.GetTitle() } 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_GetInstallation(tt *testing.T) { s := &StarEvent{} s.GetInstallation() s = nil s.GetInstallation() } 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_GetOrg(tt *testing.T) { s := &StatusEvent{} s.GetOrg() s = nil s.GetOrg() } 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 TestTagProtection_GetID(tt *testing.T) { var zeroValue int64 t := &TagProtection{ID: &zeroValue} t.GetID() t = &TagProtection{} t.GetID() t = nil t.GetID() } func TestTagProtection_GetPattern(tt *testing.T) { var zeroValue string t := &TagProtection{Pattern: &zeroValue} t.GetPattern() t = &TagProtection{} t.GetPattern() t = nil t.GetPattern() } 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_GetHTMLURL(tt *testing.T) { var zeroValue string t := &Team{HTMLURL: &zeroValue} t.GetHTMLURL() t = &Team{} t.GetHTMLURL() t = nil t.GetHTMLURL() } 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_GetAssigner(tt *testing.T) { t := &Timeline{} t.GetAssigner() t = nil t.GetAssigner() } func TestTimeline_GetAuthor(tt *testing.T) { t := &Timeline{} t.GetAuthor() t = nil t.GetAuthor() } func TestTimeline_GetBody(tt *testing.T) { var zeroValue string t := &Timeline{Body: &zeroValue} t.GetBody() t = &Timeline{} t.GetBody() t = nil t.GetBody() } 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_GetCommitter(tt *testing.T) { t := &Timeline{} t.GetCommitter() t = nil t.GetCommitter() } 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 Timestamp 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_GetMessage(tt *testing.T) { var zeroValue string t := &Timeline{Message: &zeroValue} t.GetMessage() t = &Timeline{} t.GetMessage() t = nil t.GetMessage() } func TestTimeline_GetMilestone(tt *testing.T) { t := &Timeline{} t.GetMilestone() t = nil t.GetMilestone() } func TestTimeline_GetPerformedViaGithubApp(tt *testing.T) { t := &Timeline{} t.GetPerformedViaGithubApp() t = nil t.GetPerformedViaGithubApp() } 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_GetRequestedTeam(tt *testing.T) { t := &Timeline{} t.GetRequestedTeam() t = nil t.GetRequestedTeam() } func TestTimeline_GetRequester(tt *testing.T) { t := &Timeline{} t.GetRequester() t = nil t.GetRequester() } func TestTimeline_GetReviewer(tt *testing.T) { t := &Timeline{} t.GetReviewer() t = nil t.GetReviewer() } func TestTimeline_GetSHA(tt *testing.T) { var zeroValue string t := &Timeline{SHA: &zeroValue} t.GetSHA() t = &Timeline{} t.GetSHA() t = nil t.GetSHA() } 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_GetSubmittedAt(tt *testing.T) { var zeroValue Timestamp t := &Timeline{SubmittedAt: &zeroValue} t.GetSubmittedAt() t = &Timeline{} t.GetSubmittedAt() t = nil t.GetSubmittedAt() } func TestTimeline_GetURL(tt *testing.T) { var zeroValue string t := &Timeline{URL: &zeroValue} t.GetURL() t = &Timeline{} t.GetURL() t = nil t.GetURL() } func TestTimeline_GetUser(tt *testing.T) { t := &Timeline{} t.GetUser() t = nil t.GetUser() } 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 TestTransferRequest_GetNewName(tt *testing.T) { var zeroValue string t := &TransferRequest{NewName: &zeroValue} t.GetNewName() t = &TransferRequest{} t.GetNewName() t = nil t.GetNewName() } 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 TestUpdateAttributeForSCIMUserOperations_GetPath(tt *testing.T) { var zeroValue string u := &UpdateAttributeForSCIMUserOperations{Path: &zeroValue} u.GetPath() u = &UpdateAttributeForSCIMUserOperations{} u.GetPath() u = nil u.GetPath() } 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 TestUpdateDefaultSetupConfigurationOptions_GetQuerySuite(tt *testing.T) { var zeroValue string u := &UpdateDefaultSetupConfigurationOptions{QuerySuite: &zeroValue} u.GetQuerySuite() u = &UpdateDefaultSetupConfigurationOptions{} u.GetQuerySuite() u = nil u.GetQuerySuite() } func TestUpdateDefaultSetupConfigurationResponse_GetRunID(tt *testing.T) { var zeroValue int64 u := &UpdateDefaultSetupConfigurationResponse{RunID: &zeroValue} u.GetRunID() u = &UpdateDefaultSetupConfigurationResponse{} u.GetRunID() u = nil u.GetRunID() } func TestUpdateDefaultSetupConfigurationResponse_GetRunURL(tt *testing.T) { var zeroValue string u := &UpdateDefaultSetupConfigurationResponse{RunURL: &zeroValue} u.GetRunURL() u = &UpdateDefaultSetupConfigurationResponse{} u.GetRunURL() u = nil u.GetRunURL() } func TestUpdateEnterpriseRunnerGroupRequest_GetAllowsPublicRepositories(tt *testing.T) { var zeroValue bool u := &UpdateEnterpriseRunnerGroupRequest{AllowsPublicRepositories: &zeroValue} u.GetAllowsPublicRepositories() u = &UpdateEnterpriseRunnerGroupRequest{} u.GetAllowsPublicRepositories() u = nil u.GetAllowsPublicRepositories() } func TestUpdateEnterpriseRunnerGroupRequest_GetName(tt *testing.T) { var zeroValue string u := &UpdateEnterpriseRunnerGroupRequest{Name: &zeroValue} u.GetName() u = &UpdateEnterpriseRunnerGroupRequest{} u.GetName() u = nil u.GetName() } func TestUpdateEnterpriseRunnerGroupRequest_GetRestrictedToWorkflows(tt *testing.T) { var zeroValue bool u := &UpdateEnterpriseRunnerGroupRequest{RestrictedToWorkflows: &zeroValue} u.GetRestrictedToWorkflows() u = &UpdateEnterpriseRunnerGroupRequest{} u.GetRestrictedToWorkflows() u = nil u.GetRestrictedToWorkflows() } func TestUpdateEnterpriseRunnerGroupRequest_GetVisibility(tt *testing.T) { var zeroValue string u := &UpdateEnterpriseRunnerGroupRequest{Visibility: &zeroValue} u.GetVisibility() u = &UpdateEnterpriseRunnerGroupRequest{} u.GetVisibility() u = nil u.GetVisibility() } 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_GetRestrictedToWorkflows(tt *testing.T) { var zeroValue bool u := &UpdateRunnerGroupRequest{RestrictedToWorkflows: &zeroValue} u.GetRestrictedToWorkflows() u = &UpdateRunnerGroupRequest{} u.GetRestrictedToWorkflows() u = nil u.GetRestrictedToWorkflows() } 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 int64 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_GetRoleName(tt *testing.T) { var zeroValue string u := &User{RoleName: &zeroValue} u.GetRoleName() u = &User{} u.GetRoleName() u = nil u.GetRoleName() } 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 int64 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_GetInstallation(tt *testing.T) { u := &UserEvent{} u.GetInstallation() u = nil u.GetInstallation() } 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 TestVulnerabilityPackage_GetEcosystem(tt *testing.T) { var zeroValue string v := &VulnerabilityPackage{Ecosystem: &zeroValue} v.GetEcosystem() v = &VulnerabilityPackage{} v.GetEcosystem() v = nil v.GetEcosystem() } func TestVulnerabilityPackage_GetName(tt *testing.T) { var zeroValue string v := &VulnerabilityPackage{Name: &zeroValue} v.GetName() v = &VulnerabilityPackage{} v.GetName() v = nil v.GetName() } 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_GetOrg(tt *testing.T) { w := &WatchEvent{} w.GetOrg() w = nil w.GetOrg() } 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 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_GetInstallation(tt *testing.T) { w := &WorkflowDispatchEvent{} w.GetInstallation() w = nil w.GetInstallation() } 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 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_GetCreatedAt(tt *testing.T) { var zeroValue Timestamp w := &WorkflowJob{CreatedAt: &zeroValue} w.GetCreatedAt() w = &WorkflowJob{} w.GetCreatedAt() w = nil w.GetCreatedAt() } func TestWorkflowJob_GetHeadBranch(tt *testing.T) { var zeroValue string w := &WorkflowJob{HeadBranch: &zeroValue} w.GetHeadBranch() w = &WorkflowJob{} w.GetHeadBranch() w = nil w.GetHeadBranch() } 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_GetRunAttempt(tt *testing.T) { var zeroValue int64 w := &WorkflowJob{RunAttempt: &zeroValue} w.GetRunAttempt() w = &WorkflowJob{} w.GetRunAttempt() w = nil w.GetRunAttempt() } 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_GetRunnerGroupID(tt *testing.T) { var zeroValue int64 w := &WorkflowJob{RunnerGroupID: &zeroValue} w.GetRunnerGroupID() w = &WorkflowJob{} w.GetRunnerGroupID() w = nil w.GetRunnerGroupID() } func TestWorkflowJob_GetRunnerGroupName(tt *testing.T) { var zeroValue string w := &WorkflowJob{RunnerGroupName: &zeroValue} w.GetRunnerGroupName() w = &WorkflowJob{} w.GetRunnerGroupName() w = nil w.GetRunnerGroupName() } func TestWorkflowJob_GetRunnerID(tt *testing.T) { var zeroValue int64 w := &WorkflowJob{RunnerID: &zeroValue} w.GetRunnerID() w = &WorkflowJob{} w.GetRunnerID() w = nil w.GetRunnerID() } func TestWorkflowJob_GetRunnerName(tt *testing.T) { var zeroValue string w := &WorkflowJob{RunnerName: &zeroValue} w.GetRunnerName() w = &WorkflowJob{} w.GetRunnerName() w = nil w.GetRunnerName() } 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 TestWorkflowJob_GetWorkflowName(tt *testing.T) { var zeroValue string w := &WorkflowJob{WorkflowName: &zeroValue} w.GetWorkflowName() w = &WorkflowJob{} w.GetWorkflowName() w = nil w.GetWorkflowName() } func TestWorkflowJobEvent_GetAction(tt *testing.T) { var zeroValue string w := &WorkflowJobEvent{Action: &zeroValue} w.GetAction() w = &WorkflowJobEvent{} w.GetAction() w = nil w.GetAction() } func TestWorkflowJobEvent_GetInstallation(tt *testing.T) { w := &WorkflowJobEvent{} w.GetInstallation() w = nil w.GetInstallation() } func TestWorkflowJobEvent_GetOrg(tt *testing.T) { w := &WorkflowJobEvent{} w.GetOrg() w = nil w.GetOrg() } func TestWorkflowJobEvent_GetRepo(tt *testing.T) { w := &WorkflowJobEvent{} w.GetRepo() w = nil w.GetRepo() } func TestWorkflowJobEvent_GetSender(tt *testing.T) { w := &WorkflowJobEvent{} w.GetSender() w = nil w.GetSender() } func TestWorkflowJobEvent_GetWorkflowJob(tt *testing.T) { w := &WorkflowJobEvent{} w.GetWorkflowJob() w = nil w.GetWorkflowJob() } func TestWorkflowRun_GetActor(tt *testing.T) { w := &WorkflowRun{} w.GetActor() w = nil w.GetActor() } 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_GetCheckSuiteID(tt *testing.T) { var zeroValue int64 w := &WorkflowRun{CheckSuiteID: &zeroValue} w.GetCheckSuiteID() w = &WorkflowRun{} w.GetCheckSuiteID() w = nil w.GetCheckSuiteID() } func TestWorkflowRun_GetCheckSuiteNodeID(tt *testing.T) { var zeroValue string w := &WorkflowRun{CheckSuiteNodeID: &zeroValue} w.GetCheckSuiteNodeID() w = &WorkflowRun{} w.GetCheckSuiteNodeID() w = nil w.GetCheckSuiteNodeID() } 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_GetDisplayTitle(tt *testing.T) { var zeroValue string w := &WorkflowRun{DisplayTitle: &zeroValue} w.GetDisplayTitle() w = &WorkflowRun{} w.GetDisplayTitle() w = nil w.GetDisplayTitle() } 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_GetPreviousAttemptURL(tt *testing.T) { var zeroValue string w := &WorkflowRun{PreviousAttemptURL: &zeroValue} w.GetPreviousAttemptURL() w = &WorkflowRun{} w.GetPreviousAttemptURL() w = nil w.GetPreviousAttemptURL() } 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_GetRunAttempt(tt *testing.T) { var zeroValue int w := &WorkflowRun{RunAttempt: &zeroValue} w.GetRunAttempt() w = &WorkflowRun{} w.GetRunAttempt() w = nil w.GetRunAttempt() } 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_GetRunStartedAt(tt *testing.T) { var zeroValue Timestamp w := &WorkflowRun{RunStartedAt: &zeroValue} w.GetRunStartedAt() w = &WorkflowRun{} w.GetRunStartedAt() w = nil w.GetRunStartedAt() } 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_GetTriggeringActor(tt *testing.T) { w := &WorkflowRun{} w.GetTriggeringActor() w = nil w.GetTriggeringActor() } 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 TestWorkflowRunAttemptOptions_GetExcludePullRequests(tt *testing.T) { var zeroValue bool w := &WorkflowRunAttemptOptions{ExcludePullRequests: &zeroValue} w.GetExcludePullRequests() w = &WorkflowRunAttemptOptions{} w.GetExcludePullRequests() w = nil w.GetExcludePullRequests() } 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 TestWorkflowRunEvent_GetAction(tt *testing.T) { var zeroValue string w := &WorkflowRunEvent{Action: &zeroValue} w.GetAction() w = &WorkflowRunEvent{} w.GetAction() w = nil w.GetAction() } func TestWorkflowRunEvent_GetInstallation(tt *testing.T) { w := &WorkflowRunEvent{} w.GetInstallation() w = nil w.GetInstallation() } 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 TestWorkflowRunJobRun_GetDurationMS(tt *testing.T) { var zeroValue int64 w := &WorkflowRunJobRun{DurationMS: &zeroValue} w.GetDurationMS() w = &WorkflowRunJobRun{} w.GetDurationMS() w = nil w.GetDurationMS() } func TestWorkflowRunJobRun_GetJobID(tt *testing.T) { var zeroValue int w := &WorkflowRunJobRun{JobID: &zeroValue} w.GetJobID() w = &WorkflowRunJobRun{} w.GetJobID() w = nil w.GetJobID() } 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-60.0.0/github/github-stringify_test.go000066400000000000000000002311451457013574700216530ustar00rootroot00000000000000// 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. // Instead, please run "go generate ./..." as described here: // https://github.com/google/go-github/blob/master/CONTRIBUTING.md#submitting-a-patch 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), PatternsAllowed: []string{""}, } want := `github.ActionsAllowed{GithubOwnedAllowed:false, VerifiedAllowed:false, PatternsAllowed:[""]}` 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 TestActionsPermissionsEnterprise_String(t *testing.T) { v := ActionsPermissionsEnterprise{ EnabledOrganizations: String(""), AllowedActions: String(""), SelectedActionsURL: String(""), } want := `github.ActionsPermissionsEnterprise{EnabledOrganizations:"", AllowedActions:"", SelectedActionsURL:""}` if got := v.String(); got != want { t.Errorf("ActionsPermissionsEnterprise.String = %v, want %v", got, want) } } func TestActionsPermissionsRepository_String(t *testing.T) { v := ActionsPermissionsRepository{ Enabled: Bool(false), AllowedActions: String(""), SelectedActionsURL: String(""), } want := `github.ActionsPermissionsRepository{Enabled:false, AllowedActions:"", SelectedActionsURL:""}` if got := v.String(); got != want { t.Errorf("ActionsPermissionsRepository.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 TestAdvancedSecurity_String(t *testing.T) { v := AdvancedSecurity{ Status: String(""), } want := `github.AdvancedSecurity{Status:""}` if got := v.String(); got != want { t.Errorf("AdvancedSecurity.String = %v, want %v", got, want) } } func TestAuthorization_String(t *testing.T) { v := Authorization{ ID: Int64(0), URL: String(""), Scopes: []Scope{ScopeNone}, 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:"", Scopes:["(no scope)"], 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{ Scopes: []Scope{ScopeNone}, Note: String(""), NoteURL: String(""), ClientID: String(""), ClientSecret: String(""), Fingerprint: String(""), } want := `github.AuthorizationRequest{Scopes:["(no scope)"], 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{ Scopes: []string{""}, AddScopes: []string{""}, RemoveScopes: []string{""}, Note: String(""), NoteURL: String(""), Fingerprint: String(""), } want := `github.AuthorizationUpdateRequest{Scopes:[""], AddScopes:[""], RemoveScopes:[""], 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 TestCodeOfConduct_String(t *testing.T) { v := CodeOfConduct{ Name: String(""), Key: String(""), URL: String(""), Body: String(""), } want := `github.CodeOfConduct{Name:"", Key:"", URL:"", Body:""}` if got := v.String(); got != want { t.Errorf("CodeOfConduct.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{ Date: &Timestamp{}, Name: String(""), Email: String(""), Login: String(""), } want := `github.CommitAuthor{Date:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, 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 TestDependabotSecurityUpdates_String(t *testing.T) { v := DependabotSecurityUpdates{ Status: String(""), } want := `github.DependabotSecurityUpdates{Status:""}` if got := v.String(); got != want { t.Errorf("DependabotSecurityUpdates.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{}, CreatedAt: &Timestamp{}, ID: String(""), } want := `github.Event{Type:"", Public:false, Repo:github.Repository{}, Actor:github.User{}, Org:github.Organization{}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, 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(""), RawKey: String(""), PublicKey: String(""), CanSign: Bool(false), CanEncryptComms: Bool(false), CanEncryptStorage: Bool(false), CanCertify: Bool(false), CreatedAt: &Timestamp{}, ExpiresAt: &Timestamp{}, } want := `github.GPGKey{ID:0, PrimaryKeyID:0, KeyID:"", RawKey:"", PublicKey:"", CanSign:false, CanEncryptComms:false, CanEncryptStorage:false, CanCertify:false, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, ExpiresAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}` 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(""), CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, NodeID: String(""), } want := `github.Gist{ID:"", Description:"", Public:false, Owner:github.User{}, Comments:0, HTMLURL:"", GitPullURL:"", GitPushURL:"", 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("Gist.String = %v, want %v", got, want) } } func TestGistComment_String(t *testing.T) { v := GistComment{ ID: Int64(0), URL: String(""), Body: String(""), User: &User{}, CreatedAt: &Timestamp{}, } want := `github.GistComment{ID:0, URL:"", Body:"", User:github.User{}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}` 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{}, Scopes: []string{""}, } 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}, Scopes:[""]}` 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{}, Added: []string{""}, Removed: []string{""}, Modified: []string{""}, } 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{}, Added:[""], Removed:[""], Modified:[""]}` if got := v.String(); got != want { t.Errorf("HeadCommit.String = %v, want %v", got, want) } } func TestHook_String(t *testing.T) { v := Hook{ CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, URL: String(""), ID: Int64(0), Type: String(""), Name: String(""), TestURL: String(""), PingURL: String(""), Config: &HookConfig{}, Events: []string{""}, Active: Bool(false), } want := `github.Hook{CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, URL:"", ID:0, Type:"", Name:"", TestURL:"", PingURL:"", Config:github.HookConfig{}, Events:[""], 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: Int64(0), 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:0, 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(""), Events: []string{""}, SingleFilePaths: []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:"", Events:[""], SingleFilePaths:[""], 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(""), CreatedAt: &Timestamp{}, Inviter: &User{}, TeamCount: Int(0), InvitationTeamURL: String(""), FailedAt: &Timestamp{}, FailedReason: String(""), } want := `github.Invitation{ID:0, NodeID:"", Login:"", Email:"", Role:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, 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(""), StateReason: String(""), Locked: Bool(false), Title: String(""), Body: String(""), AuthorAssociation: String(""), User: &User{}, Assignee: &User{}, Comments: Int(0), ClosedAt: &Timestamp{}, CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, ClosedBy: &User{}, URL: String(""), HTMLURL: String(""), CommentsURL: String(""), EventsURL: String(""), LabelsURL: String(""), RepositoryURL: String(""), Milestone: &Milestone{}, PullRequestLinks: &PullRequestLinks{}, Repository: &Repository{}, Reactions: &Reactions{}, NodeID: String(""), Draft: Bool(false), ActiveLockReason: String(""), } want := `github.Issue{ID:0, Number:0, State:"", StateReason:"", Locked:false, Title:"", Body:"", AuthorAssociation:"", User:github.User{}, Assignee:github.User{}, Comments:0, ClosedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, ClosedBy:github.User{}, URL:"", HTMLURL:"", CommentsURL:"", EventsURL:"", LabelsURL:"", RepositoryURL:"", Milestone:github.Milestone{}, PullRequestLinks:github.PullRequestLinks{}, Repository:github.Repository{}, Reactions:github.Reactions{}, NodeID:"", Draft:false, 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{}, CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, AuthorAssociation: String(""), URL: String(""), HTMLURL: String(""), IssueURL: String(""), } want := `github.IssueComment{ID:0, NodeID:"", Body:"", User:github.User{}, Reactions:github.Reactions{}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, 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{}, AddedBy: String(""), LastUsed: &Timestamp{}, } want := `github.Key{ID:0, Key:"", URL:"", Title:"", ReadOnly:false, Verified:false, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, AddedBy:"", LastUsed: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), CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, ClosedAt: &Timestamp{}, DueOn: &Timestamp{}, NodeID: String(""), } want := `github.Milestone{URL:"", HTMLURL:"", LabelsURL:"", ID:0, Number:0, State:"", Title:"", Description:"", Creator:github.User{}, OpenIssues:0, ClosedIssues:0, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, ClosedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, DueOn:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, 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(""), Maintainers: []string{""}, RepoNames: []string{""}, ParentTeamID: Int64(0), Permission: String(""), Privacy: String(""), LDAPDN: String(""), } want := `github.NewTeam{Name:"", Description:"", Maintainers:[""], RepoNames:[""], 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), CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, TotalPrivateRepos: Int64(0), OwnedPrivateRepos: Int64(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), MembersCanForkPrivateRepos: Bool(false), MembersAllowedRepositoryCreationType: String(""), MembersCanCreatePages: Bool(false), MembersCanCreatePublicPages: Bool(false), MembersCanCreatePrivatePages: Bool(false), WebCommitSignoffRequired: Bool(false), AdvancedSecurityEnabledForNewRepos: Bool(false), DependabotAlertsEnabledForNewRepos: Bool(false), DependabotSecurityUpdatesEnabledForNewRepos: Bool(false), DependencyGraphEnabledForNewRepos: Bool(false), SecretScanningEnabledForNewRepos: Bool(false), SecretScanningPushProtectionEnabledForNewRepos: Bool(false), SecretScanningValidityChecksEnabled: 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, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, 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, MembersCanForkPrivateRepos:false, MembersAllowedRepositoryCreationType:"", MembersCanCreatePages:false, MembersCanCreatePublicPages:false, MembersCanCreatePrivatePages:false, WebCommitSignoffRequired:false, AdvancedSecurityEnabledForNewRepos:false, DependabotAlertsEnabledForNewRepos:false, DependabotSecurityUpdatesEnabledForNewRepos:false, DependencyGraphEnabledForNewRepos:false, SecretScanningEnabledForNewRepos:false, SecretScanningPushProtectionEnabledForNewRepos:false, SecretScanningValidityChecksEnabled: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{}, URL: String(""), VersionCount: Int64(0), Visibility: String(""), Repository: &Repository{}, } 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{}, URL:"", VersionCount:0, Visibility:"", Repository:github.Repository{}}` if got := v.String(); got != want { t.Errorf("Package.String = %v, want %v", got, want) } } func TestPackageContainerMetadata_String(t *testing.T) { v := PackageContainerMetadata{ Tags: []string{""}, } want := `github.PackageContainerMetadata{Tags:[""]}` if got := v.String(); got != want { t.Errorf("PackageContainerMetadata.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 TestPackageMetadata_String(t *testing.T) { v := PackageMetadata{ PackageType: String(""), Container: &PackageContainerMetadata{}, } want := `github.PackageMetadata{PackageType:"", Container:github.PackageContainerMetadata{}}` if got := v.String(); got != want { t.Errorf("PackageMetadata.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(""), Metadata: &PackageMetadata{}, PackageHTMLURL: String(""), Name: String(""), URL: 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:"", Metadata:github.PackageMetadata{}, PackageHTMLURL:"", Name:"", URL:""}` 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: Int64(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(""), OrganizationPermission: String(""), Private: Bool(false), 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:"", OrganizationPermission:"", Private:false, 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(""), CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, ClosedAt: &Timestamp{}, MergedAt: &Timestamp{}, 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:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, ClosedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, MergedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, 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{}, CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, AuthorAssociation: String(""), URL: String(""), HTMLURL: String(""), PullRequestURL: String(""), SubjectType: 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{}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, AuthorAssociation:"", URL:"", HTMLURL:"", PullRequestURL:"", SubjectType:""}` 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(""), SubmittedAt: &Timestamp{}, CommitID: String(""), HTMLURL: String(""), PullRequestURL: String(""), State: String(""), AuthorAssociation: String(""), } want := `github.PullRequestReview{ID:0, NodeID:"", User:github.User{}, Body:"", SubmittedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, 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 TestPullRequestThread_String(t *testing.T) { v := PullRequestThread{ ID: Int64(0), NodeID: String(""), } want := `github.PullRequestThread{ID:0, NodeID:""}` if got := v.String(); got != want { t.Errorf("PullRequestThread.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), Action: String(""), After: String(""), Created: Bool(false), Deleted: Bool(false), Forced: Bool(false), BaseRef: String(""), Compare: String(""), Repo: &PushEventRepository{}, HeadCommit: &HeadCommit{}, Pusher: &CommitAuthor{}, Sender: &User{}, Installation: &Installation{}, Organization: &Organization{}, } want := `github.PushEvent{PushID:0, Head:"", Ref:"", Size:0, Before:"", DistinctSize:0, Action:"", After:"", Created:false, Deleted:false, Forced:false, BaseRef:"", Compare:"", Repo:github.PushEventRepository{}, HeadCommit:github.HeadCommit{}, Pusher:github.CommitAuthor{}, Sender:github.User{}, Installation:github.Installation{}, Organization:github.Organization{}}` 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{}, CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, } want := `github.RepoStatus{ID:0, NodeID:"", URL:"", State:"", TargetURL:"", Description:"", Context:"", AvatarURL:"", Creator:github.User{}, 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("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), AllowUpdateBranch: Bool(false), AllowSquashMerge: Bool(false), AllowMergeCommit: Bool(false), AllowAutoMerge: Bool(false), AllowForking: Bool(false), WebCommitSignoffRequired: Bool(false), DeleteBranchOnMerge: Bool(false), UseSquashPRTitleAsDefault: Bool(false), SquashMergeCommitTitle: String(""), SquashMergeCommitMessage: String(""), MergeCommitTitle: String(""), MergeCommitMessage: String(""), Topics: []string{""}, 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), HasDiscussions: Bool(false), IsTemplate: Bool(false), LicenseTemplate: String(""), GitignoreTemplate: String(""), SecurityAndAnalysis: &SecurityAndAnalysis{}, 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(""), RoleName: 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, AllowUpdateBranch:false, AllowSquashMerge:false, AllowMergeCommit:false, AllowAutoMerge:false, AllowForking:false, WebCommitSignoffRequired:false, DeleteBranchOnMerge:false, UseSquashPRTitleAsDefault:false, SquashMergeCommitTitle:"", SquashMergeCommitMessage:"", MergeCommitTitle:"", MergeCommitMessage:"", Topics:[""], Archived:false, Disabled:false, License:github.License{}, Private:false, HasIssues:false, HasWiki:false, HasPages:false, HasProjects:false, HasDownloads:false, HasDiscussions:false, IsTemplate:false, LicenseTemplate:"", GitignoreTemplate:"", SecurityAndAnalysis:github.SecurityAndAnalysis{}, 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:"", RoleName:""}` 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{}, CreatedAt: &Timestamp{}, UpdatedAt: &Timestamp{}, Body: String(""), Path: String(""), Position: Int(0), } want := `github.RepositoryComment{HTMLURL:"", URL:"", ID:0, NodeID:"", CommitID:"", User:github.User{}, Reactions:github.Reactions{}, CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, UpdatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}, 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(""), SubmoduleGitURL: String(""), } want := `github.RepositoryContent{Type:"", Target:"", Encoding:"", Size:0, Name:"", Path:"", Content:"", SHA:"", URL:"", GitURL:"", HTMLURL:"", DownloadURL:"", SubmoduleGitURL:""}` 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 TestRepositoryParticipation_String(t *testing.T) { v := RepositoryParticipation{ All: []int{0}, Owner: []int{0}, } want := `github.RepositoryParticipation{All:[0], Owner:[0]}` if got := v.String(); got != want { t.Errorf("RepositoryParticipation.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), MakeLatest: String(""), DiscussionCategoryName: String(""), GenerateReleaseNotes: Bool(false), 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, MakeLatest:"", DiscussionCategoryName:"", GenerateReleaseNotes:false, 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 TestSBOM_String(t *testing.T) { v := SBOM{ SBOM: &SBOMInfo{}, } want := `github.SBOM{SBOM:github.SBOMInfo{}}` if got := v.String(); got != want { t.Errorf("SBOM.String = %v, want %v", got, want) } } func TestSSHSigningKey_String(t *testing.T) { v := SSHSigningKey{ ID: Int64(0), Key: String(""), Title: String(""), CreatedAt: &Timestamp{}, } want := `github.SSHSigningKey{ID:0, Key:"", Title:"", CreatedAt:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}` if got := v.String(); got != want { t.Errorf("SSHSigningKey.String = %v, want %v", got, want) } } func TestSecretScanning_String(t *testing.T) { v := SecretScanning{ Status: String(""), } want := `github.SecretScanning{Status:""}` if got := v.String(); got != want { t.Errorf("SecretScanning.String = %v, want %v", got, want) } } func TestSecretScanningPushProtection_String(t *testing.T) { v := SecretScanningPushProtection{ Status: String(""), } want := `github.SecretScanningPushProtection{Status:""}` if got := v.String(); got != want { t.Errorf("SecretScanningPushProtection.String = %v, want %v", got, want) } } func TestSecurityAndAnalysis_String(t *testing.T) { v := SecurityAndAnalysis{ AdvancedSecurity: &AdvancedSecurity{}, SecretScanning: &SecretScanning{}, SecretScanningPushProtection: &SecretScanningPushProtection{}, DependabotSecurityUpdates: &DependabotSecurityUpdates{}, SecretScanningValidityChecks: &SecretScanningValidityChecks{}, } want := `github.SecurityAndAnalysis{AdvancedSecurity:github.AdvancedSecurity{}, SecretScanning:github.SecretScanning{}, SecretScanningPushProtection:github.SecretScanningPushProtection{}, DependabotSecurityUpdates:github.DependabotSecurityUpdates{}, SecretScanningValidityChecks:github.SecretScanningValidityChecks{}}` if got := v.String(); got != want { t.Errorf("SecurityAndAnalysis.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{}, HTMLURL: String(""), 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{}, HTMLURL:"", 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: Int64(0), OwnedPrivateRepos: Int64(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(""), RoleName: 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:"", RoleName:""}` 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 TestWeeklyCommitActivity_String(t *testing.T) { v := WeeklyCommitActivity{ Days: []int{0}, Total: Int(0), Week: &Timestamp{}, } want := `github.WeeklyCommitActivity{Days:[0], 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-60.0.0/github/github.go000066400000000000000000001514341457013574700166020ustar00rootroot00000000000000// 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 //go:generate ../script/metadata.sh update-go package github import ( "bytes" "context" "encoding/json" "errors" "fmt" "io" "net/http" "net/url" "reflect" "strconv" "strings" "sync" "time" "github.com/google/go-querystring/query" ) const ( Version = "v60.0.0" defaultAPIVersion = "2022-11-28" defaultBaseURL = "https://api.github.com/" defaultUserAgent = "go-github" + "/" + Version uploadBaseURL = "https://uploads.github.com/" headerAPIVersion = "X-GitHub-Api-Version" headerRateLimit = "X-RateLimit-Limit" headerRateRemaining = "X-RateLimit-Remaining" headerRateReset = "X-RateLimit-Reset" headerOTP = "X-GitHub-OTP" headerRetryAfter = "Retry-After" 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 // These media types will be added to the API request as headers // and used to enable particular features on GitHub API that are still in preview. // After some time, specific media types will be promoted (to a "stable" state). // From then on, the preview headers are not required anymore to activate the additional // feature on GitHub.com's API. However, this API header might still be needed for users // to run a GitHub Enterprise Server on-premise. // It's not uncommon for GitHub Enterprise Server customers to run older versions which // would probably rely on the preview headers for some time. // While the header promotion is going out for GitHub.com, it may be some time before it // even arrives in GitHub Enterprise Server. // We keep those preview headers around to avoid breaking older GitHub Enterprise Server // versions. Additionally, non-functional (preview) headers don't create any side effects // on GitHub Cloud version. // // See https://github.com/google/go-github/pull/2125 for full context. // 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-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/changes/2018-05-07-new-checks-api-public-beta/ mediaTypeCheckRunsPreview = "application/vnd.github.antiope-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-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/rest/previews/#repository-creation-permissions mediaTypeMemberAllowedRepoCreationTypePreview = "application/vnd.github.surtur-preview+json" // https://docs.github.com/rest/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. secondaryRateLimitReset time.Time // Secondary rate limit reset 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 CodesOfConduct *CodesOfConductService Codespaces *CodespacesService Copilot *CopilotService Dependabot *DependabotService DependencyGraph *DependencyGraphService Emojis *EmojisService Enterprise *EnterpriseService Gists *GistsService Git *GitService Gitignores *GitignoresService Interactions *InteractionsService IssueImport *IssueImportService Issues *IssuesService Licenses *LicensesService Markdown *MarkdownService Marketplace *MarketplaceService Meta *MetaService Migrations *MigrationService Organizations *OrganizationsService Projects *ProjectsService PullRequests *PullRequestsService RateLimit *RateLimitService Reactions *ReactionsService Repositories *RepositoriesService SCIM *SCIMService Search *SearchService SecretScanning *SecretScanningService SecurityAdvisories *SecurityAdvisoriesService Teams *TeamsService Users *UsersService } type service struct { client *Client } // Client returns the http.Client used by this GitHub client. // This should only be used for requests to the GitHub API because // request headers will contain an authorization token. 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"` // For paginated result sets, the number of results per page (max 100), starting from the first matching result. // This parameter must not be used in combination with last. First int `url:"first,omitempty"` // For paginated result sets, the number of results per page (max 100), starting from the last matching result. // This parameter must not be used in combination with first. Last int `url:"last,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, either use Client.WithAuthToken or provide NewClient with // 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{} } httpClient2 := *httpClient c := &Client{client: &httpClient2} c.initialize() return c } // WithAuthToken returns a copy of the client configured to use the provided token for the Authorization header. func (c *Client) WithAuthToken(token string) *Client { c2 := c.copy() defer c2.initialize() transport := c2.client.Transport if transport == nil { transport = http.DefaultTransport } c2.client.Transport = roundTripperFunc( func(req *http.Request) (*http.Response, error) { req = req.Clone(req.Context()) req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token)) return transport.RoundTrip(req) }, ) return c2 } // WithEnterpriseURLs returns a copy of the client configured to use the provided base and // upload URLs. 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. // // Note that WithEnterpriseURLs is a convenience helper only; // its behavior is equivalent to 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 (c *Client) WithEnterpriseURLs(baseURL, uploadURL string) (*Client, error) { c2 := c.copy() defer c2.initialize() var err error c2.BaseURL, err = url.Parse(baseURL) if err != nil { return nil, err } if !strings.HasSuffix(c2.BaseURL.Path, "/") { c2.BaseURL.Path += "/" } if !strings.HasSuffix(c2.BaseURL.Path, "/api/v3/") && !strings.HasPrefix(c2.BaseURL.Host, "api.") && !strings.Contains(c2.BaseURL.Host, ".api.") { c2.BaseURL.Path += "api/v3/" } c2.UploadURL, err = url.Parse(uploadURL) if err != nil { return nil, err } if !strings.HasSuffix(c2.UploadURL.Path, "/") { c2.UploadURL.Path += "/" } if !strings.HasSuffix(c2.UploadURL.Path, "/api/uploads/") && !strings.HasPrefix(c2.UploadURL.Host, "api.") && !strings.Contains(c2.UploadURL.Host, ".api.") { c2.UploadURL.Path += "api/uploads/" } return c2, nil } // initialize sets default values and initializes services. func (c *Client) initialize() { if c.client == nil { c.client = &http.Client{} } if c.BaseURL == nil { c.BaseURL, _ = url.Parse(defaultBaseURL) } if c.UploadURL == nil { c.UploadURL, _ = url.Parse(uploadBaseURL) } if c.UserAgent == "" { c.UserAgent = defaultUserAgent } 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.Codespaces = (*CodespacesService)(&c.common) c.CodesOfConduct = (*CodesOfConductService)(&c.common) c.Copilot = (*CopilotService)(&c.common) c.Dependabot = (*DependabotService)(&c.common) c.DependencyGraph = (*DependencyGraphService)(&c.common) c.Emojis = (*EmojisService)(&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.Markdown = (*MarkdownService)(&c.common) c.Marketplace = &MarketplaceService{client: c} c.Meta = (*MetaService)(&c.common) c.Migrations = (*MigrationService)(&c.common) c.Organizations = (*OrganizationsService)(&c.common) c.Projects = (*ProjectsService)(&c.common) c.PullRequests = (*PullRequestsService)(&c.common) c.RateLimit = (*RateLimitService)(&c.common) c.Reactions = (*ReactionsService)(&c.common) c.Repositories = (*RepositoriesService)(&c.common) c.SCIM = (*SCIMService)(&c.common) c.Search = (*SearchService)(&c.common) c.SecretScanning = (*SecretScanningService)(&c.common) c.SecurityAdvisories = (*SecurityAdvisoriesService)(&c.common) c.Teams = (*TeamsService)(&c.common) c.Users = (*UsersService)(&c.common) } // copy returns a copy of the current client. It must be initialized before use. func (c *Client) copy() *Client { c.clientMu.Lock() // can't use *c here because that would copy mutexes by value. clone := Client{ client: &http.Client{}, UserAgent: c.UserAgent, BaseURL: c.BaseURL, UploadURL: c.UploadURL, secondaryRateLimitReset: c.secondaryRateLimitReset, } c.clientMu.Unlock() if c.client != nil { clone.client.Transport = c.client.Transport clone.client.CheckRedirect = c.client.CheckRedirect clone.client.Jar = c.client.Jar clone.client.Timeout = c.client.Timeout } c.rateMu.Lock() copy(clone.rateLimits[:], c.rateLimits[:]) c.rateMu.Unlock() return &clone } // NewClientWithEnvProxy enhances NewClient with the HttpProxy env. func NewClientWithEnvProxy() *Client { return NewClient(&http.Client{Transport: &http.Transport{Proxy: http.ProxyFromEnvironment}}) } // NewTokenClient returns a new GitHub API client authenticated with the provided token. // Deprecated: Use NewClient(nil).WithAuthToken(token) instead. func NewTokenClient(_ context.Context, token string) *Client { // This always returns a nil error. return NewClient(nil).WithAuthToken(token) } // NewEnterpriseClient returns a new GitHub API client with provided // base URL and upload URL (often is your GitHub Enterprise hostname). // // Deprecated: Use NewClient(httpClient).WithEnterpriseURLs(baseURL, uploadURL) instead. func NewEnterpriseClient(baseURL, uploadURL string, httpClient *http.Client) (*Client, error) { return NewClient(httpClient).WithEnterpriseURLs(baseURL, uploadURL) } // RequestOption represents an option that can modify an http.Request. type RequestOption func(req *http.Request) // WithVersion overrides the GitHub v3 API version for this individual request. // For more information, see: // https://github.blog/2022-11-28-to-infinity-and-beyond-enabling-the-future-of-githubs-rest-api-with-api-versioning/ func WithVersion(version string) RequestOption { return func(req *http.Request) { req.Header.Set(headerAPIVersion, version) } } // 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{}, opts ...RequestOption) (*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) } req.Header.Set(headerAPIVersion, defaultAPIVersion) for _, opt := range opts { opt(req) } return req, nil } // NewFormRequest 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. // Body is sent with Content-Type: application/x-www-form-urlencoded. func (c *Client) NewFormRequest(urlStr string, body io.Reader, opts ...RequestOption) (*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 } req, err := http.NewRequest(http.MethodPost, u.String(), body) if err != nil { return nil, err } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.Header.Set("Accept", mediaTypeV3) if c.UserAgent != "" { req.Header.Set("User-Agent", c.UserAgent) } req.Header.Set(headerAPIVersion, defaultAPIVersion) for _, opt := range opts { opt(req) } 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, opts ...RequestOption) (*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) req.Header.Set(headerAPIVersion, defaultAPIVersion) for _, opt := range opts { opt(req) } 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 RepositoriesService.ListHookDeliveries, // 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 // For APIs that support before/after pagination, such as OrganizationsService.AuditLog. Before string After string // Explicitly specify the Rate type so Rate's String() receiver doesn't // propagate to Response. Rate Rate // token's expiration date. Timestamp is 0001-01-01 when token doesn't expire. // So it is valid for TokenExpiration.Equal(Timestamp{}) or TokenExpiration.Time.After(time.Now()) 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") since := q.Get("since") before := q.Get("before") after := q.Get("after") if page == "" && before == "" && after == "" && since == "" { continue } if since != "" && page == "" { page = since } for _, segment := range segments[1:] { switch strings.TrimSpace(segment) { case `rel="next"`: if r.NextPage, err = strconv.Atoi(page); err != nil { r.NextPageToken = page } r.After = after case `rel="prev"`: r.PrevPage, _ = strconv.Atoi(page) r.Before = before 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 } // parseSecondaryRate parses the secondary rate related headers, // and returns the time to retry after. func parseSecondaryRate(r *http.Response) *time.Duration { // 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. if v := r.Header.Get(headerRetryAfter); v != "" { retryAfterSeconds, _ := strconv.ParseInt(v, 10, 64) // Error handling is noop. retryAfter := time.Duration(retryAfterSeconds) * time.Second return &retryAfter } // According to GitHub support, endpoints might return x-ratelimit-reset instead, // as an integer which represents the number of seconds since epoch UTC, // represting the time to resume making requests. if v := r.Header.Get(headerRateReset); v != "" { secondsSinceEpoch, _ := strconv.ParseInt(v, 10, 64) // Error handling is noop. retryAfter := time.Until(time.Unix(secondsSinceEpoch, 0)) return &retryAfter } return nil } // parseTokenExpiration parses the TokenExpiration related headers. // Returns 0001-01-01 if the header is not defined or could not be parsed. func parseTokenExpiration(r *http.Response) Timestamp { if v := r.Header.Get(headerTokenExpiration); v != "" { if t, err := time.Parse("2006-01-02 15:04:05 MST", v); err == nil { return Timestamp{t.Local()} } // Some tokens include the timezone offset instead of the timezone. // https://github.com/google/go-github/issues/2649 if t, err := time.Parse("2006-01-02 15:04:05 -0700", v); err == nil { return Timestamp{t.Local()} } } return Timestamp{} // 0001-01-01 00:00:00 } 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.Method, 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 } // If we've hit a secondary rate limit, don't make further requests before Retry After. if err := c.checkSecondaryRateLimitBeforeDo(req); err != nil { return &Response{ Response: err.Response, }, 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) // Don't update the rate limits if this was a cached response. // X-From-Cache is set by https://github.com/gregjones/httpcache if response.Header.Get("X-From-Cache") == "" { 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 := io.ReadAll(resp.Body) if readErr != nil { return response, readErr } aerr.Raw = b err = aerr } // Update the secondary rate limit if we hit it. rerr, ok := err.(*AbuseRateLimitError) if ok && rerr.RetryAfter != nil { c.rateMu.Lock() c.secondaryRateLimitReset = time.Now().Add(*rerr.RetryAfter) c.rateMu.Unlock() } } 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 happens, 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: io.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 } // checkSecondaryRateLimitBeforeDo does not make any network calls, but uses existing knowledge from // current client state in order to quickly check if *AbuseRateLimitError 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) checkSecondaryRateLimitBeforeDo(req *http.Request) *AbuseRateLimitError { c.rateMu.Lock() secondary := c.secondaryRateLimitReset c.rateMu.Unlock() if !secondary.IsZero() && time.Now().Before(secondary) { // Create a fake response. resp := &http.Response{ Status: http.StatusText(http.StatusForbidden), StatusCode: http.StatusForbidden, Request: req, Header: make(http.Header), Body: io.NopCloser(strings.NewReader("")), } retryAfter := time.Until(secondary) return &AbuseRateLimitError{ Response: resp, Message: fmt.Sprintf("API secondary rate limit exceeded until %v, not making remote request.", secondary), RetryAfter: &retryAfter, } } 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/rest/#client-errors */ type ErrorResponse struct { Response *http.Response `json:"-"` // 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/rest/#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 { if r.Response != nil && r.Response.Request != nil { return fmt.Sprintf("%v %v: %d %v %+v", r.Response.Request.Method, sanitizeURL(r.Response.Request.URL), r.Response.StatusCode, r.Message, r.Errors) } if r.Response != nil { return fmt.Sprintf("%d %v %+v", r.Response.StatusCode, r.Message, r.Errors) } return fmt.Sprintf("%v %+v", 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.Equal(ae.Raw, v.Raw) } // AbuseRateLimitError occurs when GitHub returns 403 Forbidden response with the // "documentation_url" field value equal to "https://docs.github.com/rest/overview/rate-limits-for-the-rest-api#about-secondary-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/rest/#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 := io.ReadAll(r.Body) if err == nil && data != nil { err = json.Unmarshal(data, errorResponse) if err != nil { // reset the response as if this never happened errorResponse = &ErrorResponse{Response: r} } } // Re-populate error response body because GitHub error responses are often // undocumented and inconsistent. // Issue #1136, #540. r.Body = io.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") || strings.HasSuffix(errorResponse.DocumentationURL, "secondary-rate-limits")): abuseRateLimitError := &AbuseRateLimitError{ Response: errorResponse.Response, Message: errorResponse.Message, } if retryAfter := parseSecondaryRate(r); retryAfter != nil { 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 } type rateLimitCategory uint8 const ( coreCategory rateLimitCategory = iota searchCategory graphqlCategory integrationManifestCategory sourceImportCategory codeScanningUploadCategory actionsRunnerRegistrationCategory scimCategory dependencySnapshotsCategory codeSearchCategory 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 HTTP method and Request.URL.Path. func category(method, path string) rateLimitCategory { switch { // https://docs.github.com/rest/rate-limit#about-rate-limits default: // NOTE: coreCategory is returned for actionsRunnerRegistrationCategory too, // because no API found for this category. return coreCategory // https://docs.github.com/en/rest/search/search#search-code case strings.HasPrefix(path, "/search/code") && method == http.MethodGet: return codeSearchCategory case strings.HasPrefix(path, "/search/"): return searchCategory case path == "/graphql": return graphqlCategory case strings.HasPrefix(path, "/app-manifests/") && strings.HasSuffix(path, "/conversions") && method == http.MethodPost: return integrationManifestCategory // https://docs.github.com/rest/migrations/source-imports#start-an-import case strings.HasPrefix(path, "/repos/") && strings.HasSuffix(path, "/import") && method == http.MethodPut: return sourceImportCategory // https://docs.github.com/rest/code-scanning#upload-an-analysis-as-sarif-data case strings.HasSuffix(path, "/code-scanning/sarifs"): return codeScanningUploadCategory // https://docs.github.com/enterprise-cloud@latest/rest/scim case strings.HasPrefix(path, "/scim/"): return scimCategory // https://docs.github.com/en/rest/dependency-graph/dependency-submission#create-a-snapshot-of-dependencies-for-a-repository case strings.HasPrefix(path, "/repos/") && strings.HasSuffix(path, "/dependency-graph/snapshots") && method == http.MethodPost: return dependencySnapshotsCategory } } // RateLimits returns the rate limits for the current client. // // Deprecated: Use RateLimitService.Get instead. func (c *Client) RateLimits(ctx context.Context) (*RateLimits, *Response, error) { return c.RateLimit.Get(ctx) } 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/rest/#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) } // When using roundTripWithOptionalFollowRedirect, note that it // is the responsibility of the caller to close the response body. func (c *Client) roundTripWithOptionalFollowRedirect(ctx context.Context, u string, maxRedirects int, opts ...RequestOption) (*http.Response, error) { req, err := c.NewRequest("GET", u, nil, opts...) if err != nil { return nil, err } var resp *http.Response // Use http.DefaultTransport if no custom Transport is configured req = withContext(ctx, req) if c.client.Transport == nil { resp, err = http.DefaultTransport.RoundTrip(req) } else { resp, err = c.client.Transport.RoundTrip(req) } if err != nil { return nil, err } // If redirect response is returned, follow it if maxRedirects > 0 && resp.StatusCode == http.StatusMovedPermanently { _ = resp.Body.Close() u = resp.Header.Get("Location") resp, err = c.roundTripWithOptionalFollowRedirect(ctx, u, maxRedirects-1, opts...) } return resp, err } // 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 } // roundTripperFunc creates a RoundTripper (transport) type roundTripperFunc func(*http.Request) (*http.Response, error) func (fn roundTripperFunc) RoundTrip(r *http.Request) (*http.Response, error) { return fn(r) } go-github-60.0.0/github/github_test.go000066400000000000000000002303731457013574700176410ustar00rootroot00000000000000// 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" "net/http" "net/http/httptest" "net/url" "os" "path" "reflect" "strconv" "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 = os.MkdirTemp("", "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) } assertNilError(t, 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 := io.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.MarshalIndent(u, "", " ") if err != nil { t.Errorf("Unable to marshal JSON for %#v", u) } // Marshal the target value. got, err := json.MarshalIndent(v, "", " ") if err != nil { t.Errorf("Unable to marshal JSON for %#v", v) } if diff := cmp.Diff(string(w), string(got)); diff != "" { t.Errorf("json.Marshal returned:\n%s\nwant:\n%s\ndiff:\n%v", got, w, diff) } } // Test whether the v fields have the url tag and the parsing of v // produces query parameters that corresponds to the want string. func testAddURLOptions(t *testing.T, url string, v interface{}, want string) { t.Helper() vt := reflect.Indirect(reflect.ValueOf(v)).Type() for i := 0; i < vt.NumField(); i++ { field := vt.Field(i) if alias, ok := field.Tag.Lookup("url"); ok { if alias == "" { t.Errorf("The field %+v has a blank url tag", field) } } else { t.Errorf("The field %+v has no url tag specified", field) } } got, err := addOptions(url, v) if err != nil { t.Errorf("Unable to add %#v as query parameters", v) } if got != want { t.Errorf("addOptions(%q, %#v) returned %v, want %v", url, v, got, want) } } // 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)) { testNewRequestAndDoFailureCategory(t, methodName, client, coreCategory, f) } // testNewRequestAndDoFailureCategory works Like testNewRequestAndDoFailure, but allows setting the category func testNewRequestAndDoFailureCategory(t *testing.T, methodName string, client *Client, category rateLimitCategory, 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[category].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) } } // Test that all error response types contain the status code. func testErrorResponseForStatusCode(t *testing.T, code int) { t.Helper() client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/hooks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(code) }) ctx := context.Background() _, _, err := client.Repositories.ListHooks(ctx, "o", "r", nil) switch e := err.(type) { case *ErrorResponse: case *RateLimitError: case *AbuseRateLimitError: if code != e.Response.StatusCode { t.Error("Error response does not contain status code") } default: t.Error("Unknown error response type") } } func assertNoDiff(t *testing.T, want, got interface{}) { t.Helper() if diff := cmp.Diff(want, got); diff != "" { t.Errorf("diff mismatch (-want +got):\n%v", diff) } } func assertNilError(t *testing.T, err error) { t.Helper() if err != nil { t.Errorf("unexpected error: %v", err) } } func assertWrite(t *testing.T, w io.Writer, data []byte) { t.Helper() _, err := w.Write(data) assertNilError(t, err) } 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, defaultUserAgent; 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 TestNewClientWithEnvProxy(t *testing.T) { client := NewClientWithEnvProxy() if got, want := client.BaseURL.String(), defaultBaseURL; got != want { t.Errorf("NewClient BaseURL is %v, want %v", got, want) } } 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 TestWithAuthToken(t *testing.T) { token := "gh_test_token" validate := func(t *testing.T, c *http.Client, token string) { t.Helper() want := token if want != "" { want = "Bearer " + want } gotReq := false headerVal := "" srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { gotReq = true headerVal = r.Header.Get("Authorization") })) _, err := c.Get(srv.URL) assertNilError(t, err) if !gotReq { t.Error("request not sent") } if headerVal != want { t.Errorf("Authorization header is %v, want %v", headerVal, want) } } t.Run("zero-value Client", func(t *testing.T) { c := new(Client).WithAuthToken(token) validate(t, c.Client(), token) }) t.Run("NewClient", func(t *testing.T) { httpClient := &http.Client{} client := NewClient(httpClient).WithAuthToken(token) validate(t, client.Client(), token) // make sure the original client isn't setting auth headers now validate(t, httpClient, "") }) t.Run("NewTokenClient", func(t *testing.T) { validate(t, NewTokenClient(context.Background(), token).Client(), token) }) } func TestWithEnterpriseURLs(t *testing.T) { for _, test := range []struct { name string baseURL string wantBaseURL string uploadURL string wantUploadURL string wantErr string }{ { name: "does not modify properly formed URLs", baseURL: "https://custom-url/api/v3/", wantBaseURL: "https://custom-url/api/v3/", uploadURL: "https://custom-upload-url/api/uploads/", wantUploadURL: "https://custom-upload-url/api/uploads/", }, { name: "adds trailing slash", baseURL: "https://custom-url/api/v3", wantBaseURL: "https://custom-url/api/v3/", uploadURL: "https://custom-upload-url/api/uploads", wantUploadURL: "https://custom-upload-url/api/uploads/", }, { name: "adds enterprise suffix", baseURL: "https://custom-url/", wantBaseURL: "https://custom-url/api/v3/", uploadURL: "https://custom-upload-url/", wantUploadURL: "https://custom-upload-url/api/uploads/", }, { name: "adds enterprise suffix and trailing slash", baseURL: "https://custom-url", wantBaseURL: "https://custom-url/api/v3/", uploadURL: "https://custom-upload-url", wantUploadURL: "https://custom-upload-url/api/uploads/", }, { name: "bad base URL", baseURL: "bogus\nbase\nURL", uploadURL: "https://custom-upload-url/api/uploads/", wantErr: `invalid control character in URL`, }, { name: "bad upload URL", baseURL: "https://custom-url/api/v3/", uploadURL: "bogus\nupload\nURL", wantErr: `invalid control character in URL`, }, { name: "URL has existing API prefix, adds trailing slash", baseURL: "https://api.custom-url", wantBaseURL: "https://api.custom-url/", uploadURL: "https://api.custom-upload-url", wantUploadURL: "https://api.custom-upload-url/", }, { name: "URL has existing API prefix and trailing slash", baseURL: "https://api.custom-url/", wantBaseURL: "https://api.custom-url/", uploadURL: "https://api.custom-upload-url/", wantUploadURL: "https://api.custom-upload-url/", }, { name: "URL has API subdomain, adds trailing slash", baseURL: "https://catalog.api.custom-url", wantBaseURL: "https://catalog.api.custom-url/", uploadURL: "https://catalog.api.custom-upload-url", wantUploadURL: "https://catalog.api.custom-upload-url/", }, { name: "URL has API subdomain and trailing slash", baseURL: "https://catalog.api.custom-url/", wantBaseURL: "https://catalog.api.custom-url/", uploadURL: "https://catalog.api.custom-upload-url/", wantUploadURL: "https://catalog.api.custom-upload-url/", }, { name: "URL is not a proper API subdomain, adds enterprise suffix and slash", baseURL: "https://cloud-api.custom-url", wantBaseURL: "https://cloud-api.custom-url/api/v3/", uploadURL: "https://cloud-api.custom-upload-url", wantUploadURL: "https://cloud-api.custom-upload-url/api/uploads/", }, { name: "URL is not a proper API subdomain, adds enterprise suffix", baseURL: "https://cloud-api.custom-url/", wantBaseURL: "https://cloud-api.custom-url/api/v3/", uploadURL: "https://cloud-api.custom-upload-url/", wantUploadURL: "https://cloud-api.custom-upload-url/api/uploads/", }, } { t.Run(test.name, func(t *testing.T) { validate := func(c *Client, err error) { t.Helper() if test.wantErr != "" { if err == nil || !strings.Contains(err.Error(), test.wantErr) { t.Fatalf("error does not contain expected string %q: %v", test.wantErr, err) } return } if err != nil { t.Fatalf("got unexpected error: %v", err) } if c.BaseURL.String() != test.wantBaseURL { t.Errorf("BaseURL is %v, want %v", c.BaseURL.String(), test.wantBaseURL) } if c.UploadURL.String() != test.wantUploadURL { t.Errorf("UploadURL is %v, want %v", c.UploadURL.String(), test.wantUploadURL) } } validate(NewClient(nil).WithEnterpriseURLs(test.baseURL, test.uploadURL)) validate(new(Client).WithEnterpriseURLs(test.baseURL, test.uploadURL)) validate(NewEnterpriseClient(test.baseURL, test.uploadURL, nil)) }) } } // 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 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, _ := io.ReadAll(req.Body) if got, want := string(body), outBody; got != want { t.Errorf("NewRequest(%q) Body is %v, want %v", inBody, got, want) } userAgent := req.Header.Get("User-Agent") // test that default user-agent is attached to the request if got, want := userAgent, c.UserAgent; got != want { t.Errorf("NewRequest() User-Agent is %v, want %v", got, want) } if !strings.Contains(userAgent, Version) { t.Errorf("NewRequest() User-Agent should contain %v, found %v", Version, userAgent) } apiVersion := req.Header.Get(headerAPIVersion) if got, want := apiVersion, defaultAPIVersion; got != want { t.Errorf("NewRequest() %v header is %v, want %v", headerAPIVersion, got, want) } req, _ = c.NewRequest("GET", inURL, inBody, WithVersion("2022-11-29")) apiVersion = req.Header.Get(headerAPIVersion) if got, want := apiVersion, "2022-11-29"; got != want { t.Errorf("NewRequest() %v header is %v, want %v", headerAPIVersion, 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 TestNewFormRequest(t *testing.T) { c := NewClient(nil) inURL, outURL := "/foo", defaultBaseURL+"foo" form := url.Values{} form.Add("login", "l") inBody, outBody := strings.NewReader(form.Encode()), "login=l" req, _ := c.NewFormRequest(inURL, inBody) // test that relative URL was expanded if got, want := req.URL.String(), outURL; got != want { t.Errorf("NewFormRequest(%q) URL is %v, want %v", inURL, got, want) } // test that body was form encoded body, _ := io.ReadAll(req.Body) if got, want := string(body), outBody; got != want { t.Errorf("NewFormRequest(%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("NewFormRequest() User-Agent is %v, want %v", got, want) } apiVersion := req.Header.Get(headerAPIVersion) if got, want := apiVersion, defaultAPIVersion; got != want { t.Errorf("NewRequest() %v header is %v, want %v", headerAPIVersion, got, want) } req, _ = c.NewFormRequest(inURL, inBody, WithVersion("2022-11-29")) apiVersion = req.Header.Get(headerAPIVersion) if got, want := apiVersion, "2022-11-29"; got != want { t.Errorf("NewRequest() %v header is %v, want %v", headerAPIVersion, got, want) } } func TestNewFormRequest_badURL(t *testing.T) { c := NewClient(nil) _, err := c.NewFormRequest(":", nil) testURLParseError(t, err) } func TestNewFormRequest_emptyUserAgent(t *testing.T) { c := NewClient(nil) c.UserAgent = "" req, err := c.NewFormRequest(".", nil) if err != nil { t.Fatalf("NewFormRequest returned unexpected error: %v", err) } if _, ok := req.Header["User-Agent"]; ok { t.Fatal("constructed request contains unexpected User-Agent header") } } func TestNewFormRequest_emptyBody(t *testing.T) { c := NewClient(nil) req, err := c.NewFormRequest(".", nil) if err != nil { t.Fatalf("NewFormRequest returned unexpected error: %v", err) } if req.Body != nil { t.Fatalf("constructed request contains a non-nil Body") } } func TestNewFormRequest_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.NewFormRequest("test", nil); test.wantError && err == nil { t.Fatalf("Expected error to be returned.") } else if !test.wantError && err != nil { t.Fatalf("NewFormRequest returned unexpected error: %v.", err) } } } func TestNewUploadRequest_WithVersion(t *testing.T) { c := NewClient(nil) req, _ := c.NewUploadRequest("https://example.com/", nil, 0, "") apiVersion := req.Header.Get(headerAPIVersion) if got, want := apiVersion, defaultAPIVersion; got != want { t.Errorf("NewRequest() %v header is %v, want %v", headerAPIVersion, got, want) } req, _ = c.NewUploadRequest("https://example.com/", nil, 0, "", WithVersion("2022-11-29")) apiVersion = req.Header.Get(headerAPIVersion) if got, want := apiVersion, "2022-11-29"; got != want { t.Errorf("NewRequest() %v header is %v, want %v", headerAPIVersion, got, want) } } func TestNewUploadRequest_badURL(t *testing.T) { c := NewClient(nil) _, err := c.NewUploadRequest(":", nil, 0, "") testURLParseError(t, err) const methodName = "NewUploadRequest" testBadOptions(t, methodName, func() (err error) { _, err = c.NewUploadRequest("\n", nil, -1, "\n") return 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_populateSinceValues(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_SinceWithPage(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_beforeAfterPagination(t *testing.T) { r := http.Response{ Header: http.Header{ "Link": {`; rel="next",` + ` ; rel="first",` + ` ; rel="prev",`, }, }, } response := newResponse(&r) if got, want := response.Before, "d4e5f6"; got != want { t.Errorf("response.Before: %v, want %v", got, want) } if got, want := response.After, "a1b2c3"; got != want { t.Errorf("response.After: %v, want %v", got, want) } 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, ""; want != got { t.Errorf("response.NextPageToken: %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 TestResponse_populateSinceValues_invalid(t *testing.T) { r := http.Response{ Header: http.Header{ "Link": {`,` + `; rel="first",` + `https://api.github.com/?since=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() _, err := client.Do(ctx, req, body) assertNilError(t, err) 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) } } func TestDo_rateLimitCategory(t *testing.T) { tests := []struct { method string url string category rateLimitCategory }{ { method: http.MethodGet, url: "/", category: coreCategory, }, { method: http.MethodGet, url: "/search/issues?q=rate", category: searchCategory, }, { method: http.MethodGet, url: "/graphql", category: graphqlCategory, }, { method: http.MethodPost, url: "/app-manifests/code/conversions", category: integrationManifestCategory, }, { method: http.MethodGet, url: "/app-manifests/code/conversions", category: coreCategory, // only POST requests are in the integration manifest category }, { method: http.MethodPut, url: "/repos/google/go-github/import", category: sourceImportCategory, }, { method: http.MethodGet, url: "/repos/google/go-github/import", category: coreCategory, // only PUT requests are in the source import category }, { method: http.MethodPost, url: "/repos/google/go-github/code-scanning/sarifs", category: codeScanningUploadCategory, }, { method: http.MethodGet, url: "/scim/v2/organizations/ORG/Users", category: scimCategory, }, { method: http.MethodPost, url: "/repos/google/go-github/dependency-graph/snapshots", category: dependencySnapshotsCategory, }, { method: http.MethodGet, url: "/search/code?q=rate", category: codeSearchCategory, }, // missing a check for actionsRunnerRegistrationCategory: API not found } for _, tt := range tests { if got, want := category(tt.method, tt.url), tt.category; got != want { t.Errorf("expecting category %v, found %v", got, want) } } } // 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/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/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() _, err := client.Do(ctx, req, nil) if err == nil { t.Error("Expected error to be returned.") } // 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) } } // Ignore rate limit headers if the response was served from cache. func TestDo_rateLimit_ignoredFromCache(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. // By adding the X-From-Cache header we pretend this is served from a cache. mux.HandleFunc("/first", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("X-From-Cache", "1") 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/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 so afterwards we can check the returned rate limit headers were ignored. req, _ := client.NewRequest("GET", "first", nil) ctx := context.Background() _, err := client.Do(ctx, req, nil) if err == nil { t.Error("Expected error to be returned.") } // Second request should not by hindered by rate limits. req, _ = client.NewRequest("GET", "second", nil) _, err = client.Do(ctx, req, nil) if err != nil { t.Fatalf("Second request failed, even though the rate limits from the cache should've been ignored: %v", err) } if !madeNetworkCall { t.Fatal("Network call was not made, even though the rate limits from the cache should've been ignored") } } // 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/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/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 for the Retry-After header. 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(headerRetryAfter, "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/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) } // expect prevention of a following request if _, err = client.Do(ctx, req, nil); 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") } // the saved duration might be a bit smaller than Retry-After because the duration is calculated from the expected end-of-cooldown time if got, want := *abuseRateLimitErr.RetryAfter, 123*time.Second; want-got > 1*time.Second { t.Errorf("abuseRateLimitErr RetryAfter = %v, want %v", got, want) } if got, wantSuffix := abuseRateLimitErr.Message, "not making remote request."; !strings.HasSuffix(got, wantSuffix) { t.Errorf("Expected request to be prevented because of secondary rate limit, got: %v.", got) } } // Ensure *AbuseRateLimitError.RetryAfter is parsed correctly for the x-ratelimit-reset header. func TestDo_rateLimit_abuseRateLimitError_xRateLimitReset(t *testing.T) { client, mux, _, teardown := setup() defer teardown() // x-ratelimit-reset value of 123 seconds into the future. blockUntil := time.Now().Add(time.Duration(123) * time.Second).Unix() mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") w.Header().Set(headerRateReset, strconv.Itoa(int(blockUntil))) w.Header().Set(headerRateRemaining, "1") // set remaining to a value > 0 to distinct from a primary rate limit w.WriteHeader(http.StatusForbidden) fmt.Fprintln(w, `{ "message": "You have triggered an abuse detection mechanism ...", "documentation_url": "https://docs.github.com/en/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") } // the retry after value might be a bit smaller than the original duration because the duration is calculated from the expected end-of-cooldown time if got, want := *abuseRateLimitErr.RetryAfter, 123*time.Second; want-got > 1*time.Second { t.Errorf("abuseRateLimitErr RetryAfter = %v, want %v", got, want) } // expect prevention of a following request if _, err = client.Do(ctx, req, nil); 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") } // the saved duration might be a bit smaller than Retry-After because the duration is calculated from the expected end-of-cooldown time if got, want := *abuseRateLimitErr.RetryAfter, 123*time.Second; want-got > 1*time.Second { t.Errorf("abuseRateLimitErr RetryAfter = %v, want %v", got, want) } if got, wantSuffix := abuseRateLimitErr.Message, "not making remote request."; !strings.HasSuffix(got, wantSuffix) { t.Errorf("Expected request to be prevented because of secondary rate limit, got: %v.", got) } } 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: io.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: io.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: io.NopCloser(strings.NewReader(`{"message":"m", "documentation_url": "docs.github.com/en/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: io.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: io.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 := io.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()") } //dont panic if request is nil res = &http.Response{} err = ErrorResponse{Message: "m", Response: res} if err.Error() == "" { t.Errorf("Expected non-empty ErrorResponse.Error()") } //dont panic if response is nil err = ErrorResponse{Message: "m"} 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 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() _, err := unauthedClient.Do(ctx, req, nil) assertNilError(t, err) } 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() _, err := basicAuthClient.Do(ctx, req, nil) assertNilError(t, err) } 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 := io.ReadAll(resp.Body) if err != nil { t.Fatalf("io.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) } } 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 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)}, }, { header: "2021-09-03 14:34:04 UTC", want: Timestamp{time.Date(2021, time.September, 3, 14, 34, 4, 0, time.UTC)}, }, // Some tokens include the timezone offset instead of the timezone. // https://github.com/google/go-github/issues/2649 { header: "2023-04-26 20:23:26 +0200", want: Timestamp{time.Date(2023, time.April, 26, 18, 23, 26, 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 of %q\nreturned %#v\n want %#v", tt.header, exp, tt.want) } } } func TestClientCopy_leak_transport(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") accessToken := r.Header.Get("Authorization") _, _ = fmt.Fprintf(w, `{"login": "%s"}`, accessToken) })) clientPreconfiguredWithURLs, err := NewClient(nil).WithEnterpriseURLs(srv.URL, srv.URL) if err != nil { t.Fatal(err) } aliceClient := clientPreconfiguredWithURLs.WithAuthToken("alice") bobClient := clientPreconfiguredWithURLs.WithAuthToken("bob") alice, _, err := aliceClient.Users.Get(context.Background(), "") if err != nil { t.Fatal(err) } assertNoDiff(t, "Bearer alice", alice.GetLogin()) bob, _, err := bobClient.Users.Get(context.Background(), "") if err != nil { t.Fatal(err) } assertNoDiff(t, "Bearer bob", bob.GetLogin()) } go-github-60.0.0/github/gitignore.go000066400000000000000000000033631457013574700173040ustar00rootroot00000000000000// 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/rest/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/rest/gitignore/gitignore#get-all-gitignore-templates // //meta:operation GET /gitignore/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/rest/gitignore/gitignore#get-a-gitignore-template // //meta:operation GET /gitignore/templates/{name} 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-60.0.0/github/gitignore_test.go000066400000000000000000000050511457013574700203370ustar00rootroot00000000000000// 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-60.0.0/github/interactions.go000066400000000000000000000022271457013574700200150ustar00rootroot00000000000000// 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/rest/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-60.0.0/github/interactions_orgs.go000066400000000000000000000057631457013574700210570ustar00rootroot00000000000000// 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/rest/interactions/orgs#get-interaction-restrictions-for-an-organization // //meta:operation GET /orgs/{org}/interaction-limits 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/rest/interactions/orgs#set-interaction-restrictions-for-an-organization // //meta:operation PUT /orgs/{org}/interaction-limits 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/rest/interactions/orgs#remove-interaction-restrictions-for-an-organization // //meta:operation DELETE /orgs/{org}/interaction-limits 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-60.0.0/github/interactions_orgs_test.go000066400000000000000000000076041457013574700221120ustar00rootroot00000000000000// 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) assertNilError(t, 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-60.0.0/github/interactions_repos.go000066400000000000000000000057511457013574700212320ustar00rootroot00000000000000// 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/rest/interactions/repos#get-interaction-restrictions-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/interaction-limits 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/rest/interactions/repos#set-interaction-restrictions-for-a-repository // //meta:operation PUT /repos/{owner}/{repo}/interaction-limits 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/rest/interactions/repos#remove-interaction-restrictions-for-a-repository // //meta:operation DELETE /repos/{owner}/{repo}/interaction-limits 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-60.0.0/github/interactions_repos_test.go000066400000000000000000000076301457013574700222670ustar00rootroot00000000000000// 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) assertNilError(t, 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-60.0.0/github/interactions_test.go000066400000000000000000000011051457013574700210460ustar00rootroot00000000000000// 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-60.0.0/github/issue_import.go000066400000000000000000000121371457013574700200360ustar00rootroot00000000000000// 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" ) // 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 *Timestamp `json:"created_at,omitempty"` ClosedAt *Timestamp `json:"closed_at,omitempty"` UpdatedAt *Timestamp `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 *Timestamp `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 *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `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. // // GitHub API docs: https://gist.github.com/jonmagic/5282384165e0f86ef105#start-an-issue-import // //meta:operation POST /repos/{owner}/{repo}/import/issues 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 { if err := json.Unmarshal(aerr.Raw, i); err != nil { return i, resp, err } return i, resp, err } return nil, resp, err } return i, resp, nil } // CheckStatus checks the status of an imported issue. // // GitHub API docs: https://gist.github.com/jonmagic/5282384165e0f86ef105#import-status-request // //meta:operation GET /repos/{owner}/{repo}/import/issues/{issue_number} 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. // // GitHub API docs: https://gist.github.com/jonmagic/5282384165e0f86ef105#check-status-of-multiple-issues // //meta:operation GET /repos/{owner}/{repo}/import/issues func (s *IssueImportService) CheckStatusSince(ctx context.Context, owner, repo string, since Timestamp) ([]*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-60.0.0/github/issue_import_test.go000066400000000000000000000275401457013574700211010ustar00rootroot00000000000000// 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: &Timestamp{createdAt}, Labels: []string{"l1", "l2"}, Milestone: Int(1), Title: "Dummy Issue", }, Comments: []*Comment{{ CreatedAt: &Timestamp{createdAt}, Body: "Comment body", }}, } mux.HandleFunc("/repos/o/r/import/issues", func(w http.ResponseWriter, r *http.Request) { v := new(IssueImportRequest) assertNilError(t, 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) } assertWrite(t, w, 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_defered(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: &Timestamp{createdAt}, Labels: []string{"l1", "l2"}, Milestone: Int(1), Title: "Dummy Issue", }, Comments: []*Comment{{ CreatedAt: &Timestamp{createdAt}, Body: "Comment body", }}, } mux.HandleFunc("/repos/o/r/import/issues", func(w http.ResponseWriter, r *http.Request) { v := new(IssueImportRequest) assertNilError(t, 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) assertWrite(t, w, issueImportResponseJSON) }) ctx := context.Background() got, _, err := client.IssueImport.Create(ctx, "o", "r", input) if _, ok := err.(*AcceptedError); !ok { t.Errorf("Create returned error: %v (want AcceptedError)", err) } want := wantIssueImportResponse if !cmp.Equal(got, want) { t.Errorf("Create = %+v, want %+v", got, want) } } func TestIssueImportService_Create_badResponse(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: &Timestamp{createdAt}, Labels: []string{"l1", "l2"}, Milestone: Int(1), Title: "Dummy Issue", }, Comments: []*Comment{{ CreatedAt: &Timestamp{createdAt}, Body: "Comment body", }}, } mux.HandleFunc("/repos/o/r/import/issues", func(w http.ResponseWriter, r *http.Request) { v := new(IssueImportRequest) assertNilError(t, 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) assertWrite(t, w, []byte("{[}")) }) ctx := context.Background() _, _, err := client.IssueImport.Create(ctx, "o", "r", input) if err == nil || err.Error() != "invalid character '[' looking for beginning of object key string" { t.Errorf("unexpected error: %v", 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) assertWrite(t, w, 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) assertWrite(t, w, []byte(fmt.Sprintf("[%s]", issueImportResponseJSON))) }) ctx := context.Background() got, _, err := client.IssueImport.CheckStatusSince(ctx, "o", "r", Timestamp{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", Timestamp{time.Now()}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.IssueImport.CheckStatusSince(ctx, "o", "r", Timestamp{time.Now()}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestIssueImportService_CheckStatusSince_badResponse(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) assertWrite(t, w, []byte("{badly-formed JSON")) }) ctx := context.Background() if _, _, err := client.IssueImport.CheckStatusSince(ctx, "o", "r", Timestamp{time.Now()}); err == nil { t.Errorf("CheckStatusSince returned no error, want JSON err") } } func TestIssueImportService_CheckStatusSince_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.IssueImport.CheckStatusSince(ctx, "%", "r", Timestamp{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: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{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: &Timestamp{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: &Timestamp{referenceTime}, ClosedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{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: &Timestamp{referenceTime}, ClosedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, Assignee: String("a"), Milestone: Int(1), Closed: Bool(false), Labels: []string{"l"}, }, Comments: []*Comment{ { CreatedAt: &Timestamp{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-60.0.0/github/issues.go000066400000000000000000000326341457013574700166330ustar00rootroot00000000000000// 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/rest/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"` // StateReason can be one of: "completed", "not_planned", "reopened". StateReason *string `json:"state_reason,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 *Timestamp `json:"closed_at,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `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"` Draft *bool `json:"draft,omitempty"` // TextMatches is only populated from search results that request text matches // See: search.go and https://docs.github.com/rest/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"` // StateReason can be 'completed' or 'not_planned'. StateReason *string `json:"state_reason,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"` MergedAt *Timestamp `json:"merged_at,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/rest/issues/issues#list-issues-assigned-to-the-authenticated-user // GitHub API docs: https://docs.github.com/rest/issues/issues#list-user-account-issues-assigned-to-the-authenticated-user // //meta:operation GET /issues //meta:operation GET /user/issues 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/rest/issues/issues#list-organization-issues-assigned-to-the-authenticated-user // //meta:operation GET /orgs/{org}/issues 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/rest/issues/issues#list-repository-issues // //meta:operation GET /repos/{owner}/{repo}/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/rest/issues/issues#get-an-issue // //meta:operation GET /repos/{owner}/{repo}/issues/{issue_number} 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/rest/issues/issues#create-an-issue // //meta:operation POST /repos/{owner}/{repo}/issues 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 (update) an issue. // // GitHub API docs: https://docs.github.com/rest/issues/issues#update-an-issue // //meta:operation PATCH /repos/{owner}/{repo}/issues/{issue_number} 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 } // RemoveMilestone removes a milestone from an issue. // // This is a helper method to explicitly update an issue with a `null` milestone, thereby removing it. // // GitHub API docs: https://docs.github.com/rest/issues/issues#update-an-issue // //meta:operation PATCH /repos/{owner}/{repo}/issues/{issue_number} func (s *IssuesService) RemoveMilestone(ctx context.Context, owner, repo string, issueNumber int) (*Issue, *Response, error) { u := fmt.Sprintf("repos/%v/%v/issues/%v", owner, repo, issueNumber) req, err := s.client.NewRequest("PATCH", u, &struct { Milestone *Milestone `json:"milestone"` }{}) 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/rest/issues/issues#lock-an-issue // //meta:operation PUT /repos/{owner}/{repo}/issues/{issue_number}/lock 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/rest/issues/issues#unlock-an-issue // //meta:operation DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock 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-60.0.0/github/issues_assignees.go000066400000000000000000000061571457013574700206750ustar00rootroot00000000000000// 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/rest/issues/assignees#list-assignees // //meta:operation GET /repos/{owner}/{repo}/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/rest/issues/assignees#check-if-a-user-can-be-assigned // //meta:operation GET /repos/{owner}/{repo}/assignees/{assignee} 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/rest/issues/assignees#add-assignees-to-an-issue // //meta:operation POST /repos/{owner}/{repo}/issues/{issue_number}/assignees 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) if err != nil { return nil, resp, err } return issue, resp, nil } // RemoveAssignees removes the provided GitHub users as assignees from the issue. // // GitHub API docs: https://docs.github.com/rest/issues/assignees#remove-assignees-from-an-issue // //meta:operation DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees 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) if err != nil { return nil, resp, err } return issue, resp, nil } go-github-60.0.0/github/issues_assignees_test.go000066400000000000000000000170051457013574700217260ustar00rootroot00000000000000// 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"` } assertNilError(t, 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 }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.AddAssignees(ctx, "o", "r", 1, []string{"user1", "user2"}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, 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"` } assertNilError(t, 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 }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.RemoveAssignees(ctx, "o", "r", 1, []string{"user1", "user2"}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/issues_comments.go000066400000000000000000000130611457013574700205310ustar00rootroot00000000000000// 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 *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `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/rest/issues/comments#list-issue-comments // GitHub API docs: https://docs.github.com/rest/issues/comments#list-issue-comments-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/issues/comments //meta:operation GET /repos/{owner}/{repo}/issues/{issue_number}/comments 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/rest/issues/comments#get-an-issue-comment // //meta:operation GET /repos/{owner}/{repo}/issues/comments/{comment_id} 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/rest/issues/comments#create-an-issue-comment // //meta:operation POST /repos/{owner}/{repo}/issues/{issue_number}/comments 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/rest/issues/comments#update-an-issue-comment // //meta:operation PATCH /repos/{owner}/{repo}/issues/comments/{comment_id} 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/rest/issues/comments#delete-an-issue-comment // //meta:operation DELETE /repos/{owner}/{repo}/issues/comments/{comment_id} 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-60.0.0/github/issues_comments_test.go000066400000000000000000000237031457013574700215740ustar00rootroot00000000000000// 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) assertNilError(t, 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) assertNilError(t, 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: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{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-60.0.0/github/issues_events.go000066400000000000000000000145041457013574700202130ustar00rootroot00000000000000// 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" ) // 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"` // The action corresponding to the event. Action string `json:"action,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 or RequestedTeam, and ReviewRequester will be populated below. // Event *string `json:"event,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` Issue *Issue `json:"issue,omitempty"` // Only present on certain events; see above. Repository *Repository `json:"repository,omitempty"` 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"` RequestedTeam *Team `json:"requested_team,omitempty"` ReviewRequester *User `json:"review_requester,omitempty"` PerformedViaGithubApp *App `json:"performed_via_github_app,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/rest/issues/events#list-issue-events // //meta:operation GET /repos/{owner}/{repo}/issues/{issue_number}/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/rest/issues/events#list-issue-events-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/issues/events 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/rest/issues/events#get-an-issue-event // //meta:operation GET /repos/{owner}/{repo}/issues/events/{event_id} 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-60.0.0/github/issues_events_test.go000066400000000000000000000316501457013574700212530ustar00rootroot00000000000000// 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: &Timestamp{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}, }, RequestedTeam: &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"), }, PerformedViaGithubApp: &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"), }, 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" }, "requested_team": { "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" }, "performed_via_github_app": { "id": 1, "node_id": "n", "owner": { "login": "l", "id": 1, "node_id": "n", "url": "u", "repos_url": "r", "events_url": "e", "avatar_url": "a" }, "name": "n", "description": "d", "html_url": "h", "external_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-60.0.0/github/issues_labels.go000066400000000000000000000167051457013574700201560ustar00rootroot00000000000000// 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/rest/issues/labels#list-labels-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/labels 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/rest/issues/labels#get-a-label // //meta:operation GET /repos/{owner}/{repo}/labels/{name} 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/rest/issues/labels#create-a-label // //meta:operation POST /repos/{owner}/{repo}/labels 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/rest/issues/labels#update-a-label // //meta:operation PATCH /repos/{owner}/{repo}/labels/{name} 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/rest/issues/labels#delete-a-label // //meta:operation DELETE /repos/{owner}/{repo}/labels/{name} 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/rest/issues/labels#list-labels-for-an-issue // //meta:operation GET /repos/{owner}/{repo}/issues/{issue_number}/labels 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/rest/issues/labels#add-labels-to-an-issue // //meta:operation POST /repos/{owner}/{repo}/issues/{issue_number}/labels 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/rest/issues/labels#remove-a-label-from-an-issue // //meta:operation DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name} 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/rest/issues/labels#set-labels-for-an-issue // //meta:operation PUT /repos/{owner}/{repo}/issues/{issue_number}/labels 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/rest/issues/labels#remove-all-labels-from-an-issue // //meta:operation DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels 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/rest/issues/labels#list-labels-for-issues-in-a-milestone // //meta:operation GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels 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-60.0.0/github/issues_labels_test.go000066400000000000000000000356751457013574700212240ustar00rootroot00000000000000// 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) assertNilError(t, 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) assertNilError(t, 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 assertNilError(t, 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 assertNilError(t, 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-60.0.0/github/issues_milestones.go000066400000000000000000000116211457013574700210660ustar00rootroot00000000000000// 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" ) // 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 *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` ClosedAt *Timestamp `json:"closed_at,omitempty"` DueOn *Timestamp `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/rest/issues/milestones#list-milestones // //meta:operation GET /repos/{owner}/{repo}/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/rest/issues/milestones#get-a-milestone // //meta:operation GET /repos/{owner}/{repo}/milestones/{milestone_number} 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/rest/issues/milestones#create-a-milestone // //meta:operation POST /repos/{owner}/{repo}/milestones 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/rest/issues/milestones#update-a-milestone // //meta:operation PATCH /repos/{owner}/{repo}/milestones/{milestone_number} 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/rest/issues/milestones#delete-a-milestone // //meta:operation DELETE /repos/{owner}/{repo}/milestones/{milestone_number} 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-60.0.0/github/issues_milestones_test.go000066400000000000000000000216541457013574700221340ustar00rootroot00000000000000// 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) assertNilError(t, 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) assertNilError(t, 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: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, ClosedAt: &Timestamp{referenceTime}, DueOn: &Timestamp{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-60.0.0/github/issues_test.go000066400000000000000000000377611457013574700177000ustar00rootroot00000000000000// 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_ListByOrg_badOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Issues.ListByOrg(ctx, "\n", 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) assertNilError(t, 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) assertNilError(t, 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_RemoveMilestone(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, "PATCH") fmt.Fprint(w, `{"number":1}`) }) ctx := context.Background() issue, _, err := client.Issues.RemoveMilestone(ctx, "o", "r", 1) if err != nil { t.Errorf("Issues.RemoveMilestone returned error: %v", err) } want := &Issue{Number: Int(1)} if !cmp.Equal(issue, want) { t.Errorf("Issues.RemoveMilestone returned %+v, want %+v", issue, want) } const methodName = "RemoveMilestone" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Issues.RemoveMilestone(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Issues.RemoveMilestone(ctx, "o", "r", 1) 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"), MergedAt: &Timestamp{referenceTime}, } want := `{ "url": "url", "html_url": "hurl", "diff_url": "durl", "patch_url": "purl", "merged_at": ` + referenceTimeStr + ` }` 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: &Timestamp{referenceTime}, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{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-60.0.0/github/issues_timeline.go000066400000000000000000000146731457013574700205240ustar00rootroot00000000000000// 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" ) // 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/developers/webhooks-and-events/events/issue-event-types 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"` // The person who commented on the issue. User *User `json:"user,omitempty"` // The person who authored the commit. Author *CommitAuthor `json:"author,omitempty"` // The person who committed the commit on behalf of the author. Committer *CommitAuthor `json:"committer,omitempty"` // The SHA of the commit in the pull request. SHA *string `json:"sha,omitempty"` // The commit message. Message *string `json:"message,omitempty"` // A list of parent commits. Parents []*Commit `json:"parents,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 *Timestamp `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"` Assigner *User `json:"assigner,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"` // The person requested to review the pull request. Reviewer *User `json:"requested_reviewer,omitempty"` // RequestedTeam contains the team requested to review the pull request. RequestedTeam *Team `json:"requested_team,omitempty"` // The person who requested a review. Requester *User `json:"review_requester,omitempty"` // The review summary text. Body *string `json:"body,omitempty"` SubmittedAt *Timestamp `json:"submitted_at,omitempty"` PerformedViaGithubApp *App `json:"performed_via_github_app,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/rest/issues/timeline#list-timeline-events-for-an-issue // //meta:operation GET /repos/{owner}/{repo}/issues/{issue_number}/timeline 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) if err != nil { return nil, resp, err } return events, resp, nil } go-github-60.0.0/github/issues_timeline_test.go000066400000000000000000000132461457013574700215560ustar00rootroot00000000000000// 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: &Timestamp{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-60.0.0/github/licenses.go000066400000000000000000000055651457013574700171300ustar00rootroot00000000000000// 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/rest/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/rest/licenses/licenses#get-all-commonly-used-licenses // //meta:operation GET /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/rest/licenses/licenses#get-a-license // //meta:operation GET /licenses/{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-60.0.0/github/licenses_test.go000066400000000000000000000110111457013574700201460ustar00rootroot00000000000000// 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-60.0.0/github/markdown.go000066400000000000000000000035701457013574700171370ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // MarkdownService provides access to markdown-related functions in the GitHub API. type MarkdownService service // MarkdownOptions specifies optional parameters to the Render method. type MarkdownOptions struct { // Mode identifies the rendering mode. Possible values are: // markdown - render a document as plain Render, 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 markdownRenderRequest struct { Text *string `json:"text,omitempty"` Mode *string `json:"mode,omitempty"` Context *string `json:"context,omitempty"` } // Render renders an arbitrary Render document. // // GitHub API docs: https://docs.github.com/rest/markdown/markdown#render-a-markdown-document // //meta:operation POST /markdown func (s *MarkdownService) Render(ctx context.Context, text string, opts *MarkdownOptions) (string, *Response, error) { request := &markdownRenderRequest{Text: String(text)} if opts != nil { if opts.Mode != "" { request.Mode = String(opts.Mode) } if opts.Context != "" { request.Context = String(opts.Context) } } req, err := s.client.NewRequest("POST", "markdown", request) if err != nil { return "", nil, err } buf := new(bytes.Buffer) resp, err := s.client.Do(ctx, req, buf) if err != nil { return "", resp, err } return buf.String(), resp, nil } go-github-60.0.0/github/markdown_test.go000066400000000000000000000035001457013574700201670ustar00rootroot00000000000000// Copyright 2023 The go-github 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 TestMarkdownService_Markdown(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &markdownRenderRequest{ Text: String("# text #"), Mode: String("gfm"), Context: String("google/go-github"), } mux.HandleFunc("/markdown", func(w http.ResponseWriter, r *http.Request) { v := new(markdownRenderRequest) assertNilError(t, 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.Render(ctx, "# text #", &MarkdownOptions{ Mode: "gfm", Context: "google/go-github", }) if err != nil { t.Errorf("Render returned error: %v", err) } if want := "

text

"; want != md { t.Errorf("Render returned %+v, want %+v", md, want) } const methodName = "Render" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Markdown.Render(ctx, "# text #", &MarkdownOptions{ Mode: "gfm", Context: "google/go-github", }) if got != "" { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMarkdownRenderRequest_Marshal(t *testing.T) { testJSONMarshal(t, &markdownRenderRequest{}, "{}") a := &markdownRenderRequest{ Text: String("txt"), Mode: String("mode"), Context: String("ctx"), } want := `{ "text": "txt", "mode": "mode", "context": "ctx" }` testJSONMarshal(t, a, want) } go-github-60.0.0/github/messages.go000066400000000000000000000324001457013574700171160ustar00rootroot00000000000000// 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" "mime" "net/http" "net/url" "reflect" "sort" "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]interface{}{ "branch_protection_rule": &BranchProtectionRuleEvent{}, "check_run": &CheckRunEvent{}, "check_suite": &CheckSuiteEvent{}, "code_scanning_alert": &CodeScanningAlertEvent{}, "commit_comment": &CommitCommentEvent{}, "content_reference": &ContentReferenceEvent{}, "create": &CreateEvent{}, "delete": &DeleteEvent{}, "dependabot_alert": &DependabotAlertEvent{}, "deploy_key": &DeployKeyEvent{}, "deployment": &DeploymentEvent{}, "deployment_status": &DeploymentStatusEvent{}, "deployment_protection_rule": &DeploymentProtectionRuleEvent{}, "discussion": &DiscussionEvent{}, "discussion_comment": &DiscussionCommentEvent{}, "fork": &ForkEvent{}, "github_app_authorization": &GitHubAppAuthorizationEvent{}, "gollum": &GollumEvent{}, "installation": &InstallationEvent{}, "installation_repositories": &InstallationRepositoriesEvent{}, "installation_target": &InstallationTargetEvent{}, "issue_comment": &IssueCommentEvent{}, "issues": &IssuesEvent{}, "label": &LabelEvent{}, "marketplace_purchase": &MarketplacePurchaseEvent{}, "member": &MemberEvent{}, "membership": &MembershipEvent{}, "merge_group": &MergeGroupEvent{}, "meta": &MetaEvent{}, "milestone": &MilestoneEvent{}, "organization": &OrganizationEvent{}, "org_block": &OrgBlockEvent{}, "package": &PackageEvent{}, "page_build": &PageBuildEvent{}, "personal_access_token_request": &PersonalAccessTokenRequestEvent{}, "ping": &PingEvent{}, "project": &ProjectEvent{}, "project_card": &ProjectCardEvent{}, "project_column": &ProjectColumnEvent{}, "projects_v2": &ProjectV2Event{}, "projects_v2_item": &ProjectV2ItemEvent{}, "public": &PublicEvent{}, "pull_request": &PullRequestEvent{}, "pull_request_review": &PullRequestReviewEvent{}, "pull_request_review_comment": &PullRequestReviewCommentEvent{}, "pull_request_review_thread": &PullRequestReviewThreadEvent{}, "pull_request_target": &PullRequestTargetEvent{}, "push": &PushEvent{}, "repository": &RepositoryEvent{}, "repository_dispatch": &RepositoryDispatchEvent{}, "repository_import": &RepositoryImportEvent{}, "repository_vulnerability_alert": &RepositoryVulnerabilityAlertEvent{}, "release": &ReleaseEvent{}, "secret_scanning_alert": &SecretScanningAlertEvent{}, "security_advisory": &SecurityAdvisoryEvent{}, "security_and_analysis": &SecurityAndAnalysisEvent{}, "star": &StarEvent{}, "status": &StatusEvent{}, "team": &TeamEvent{}, "team_add": &TeamAddEvent{}, "user": &UserEvent{}, "watch": &WatchEvent{}, "workflow_dispatch": &WorkflowDispatchEvent{}, "workflow_job": &WorkflowJobEvent{}, "workflow_run": &WorkflowRunEvent{}, } // forward mapping of event types to the string names of the structs messageToTypeName = make(map[string]string, len(eventTypeMapping)) // Inverse map of the above typeToMessageMapping = make(map[string]string, len(eventTypeMapping)) ) func init() { for k, v := range eventTypeMapping { typename := reflect.TypeOf(v).Elem().Name() messageToTypeName[k] = typename typeToMessageMapping[typename] = k } } // 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 } // ValidatePayloadFromBody 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 an empty secretToken. // Webhooks without a secret token are not secure and should be avoided. // // 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 = io.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 = io.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) } // Validate the signature if present or if one is expected (secretToken is non-empty). if len(secretToken) > 0 || len(signature) > 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/developers/webhooks-and-events/events/github-event-types 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/developers/webhooks-and-events/events/github-event-types 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 := messageToTypeName[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() } // MessageTypes returns a sorted list of all the known GitHub event type strings // supported by go-github. func MessageTypes() []string { types := make([]string, 0, len(eventTypeMapping)) for t := range eventTypeMapping { types = append(types, t) } sort.Strings(types) return types } // EventForType returns an empty struct matching the specified GitHub event type. // If messageType does not match any known event types, it returns nil. func EventForType(messageType string) interface{} { prototype := eventTypeMapping[messageType] if prototype == nil { return nil } // return a _copy_ of the pointed-to-object. Unfortunately, for this we // need to use reflection. If we store the actual objects in the map, // we still need to use reflection to convert from `any` to the actual // type, so this was deemed the lesser of two evils. (#2865) return reflect.New(reflect.TypeOf(prototype).Elem()).Interface() } go-github-60.0.0/github/messages_test.go000066400000000000000000000347241457013574700201700ustar00rootroot00000000000000// 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 { secretKey []byte signature string signatureHeader string wantPayload string }{ // The following tests generate expected errors: {secretKey: secretKey}, // Missing signature {secretKey: secretKey, signature: "yo"}, // Missing signature prefix {secretKey: secretKey, signature: "sha1=yo"}, // Signature not hex string {secretKey: secretKey, signature: "sha1=012345"}, // Invalid signature {signature: defaultSignature}, // signature without secretKey // The following tests expect err=nil: { // no secretKey and no signature still passes validation wantPayload: defaultBody, }, { secretKey: secretKey, signature: defaultSignature, wantPayload: defaultBody, }, { secretKey: secretKey, signature: "sha256=b1f8020f5b4cd42042f807dd939015c4a418bc1ff7f604dd55b0a19b5d953d9b", wantPayload: defaultBody, }, { secretKey: secretKey, signature: "sha256=b1f8020f5b4cd42042f807dd939015c4a418bc1ff7f604dd55b0a19b5d953d9b", signatureHeader: SHA256SignatureHeader, wantPayload: defaultBody, }, { secretKey: secretKey, signature: "sha512=8456767023c1195682e182a23b3f5d19150ecea598fde8cb85918f7281b16079471b1329f92b912c4d8bd7455cb159777db8f29608b20c7c87323ba65ae62e1f", 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, test.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: &BranchProtectionRuleEvent{}, messageType: "branch_protection_rule", }, { payload: &CheckRunEvent{}, messageType: "check_run", }, { payload: &CheckSuiteEvent{}, messageType: "check_suite", }, { payload: &CodeScanningAlertEvent{}, messageType: "code_scanning_alert", }, { payload: &CommitCommentEvent{}, messageType: "commit_comment", }, { payload: &ContentReferenceEvent{}, messageType: "content_reference", }, { payload: &CreateEvent{}, messageType: "create", }, { payload: &DeleteEvent{}, messageType: "delete", }, { payload: &DependabotAlertEvent{}, messageType: "dependabot_alert", }, { payload: &DeployKeyEvent{}, messageType: "deploy_key", }, { payload: &DeploymentEvent{}, messageType: "deployment", }, { payload: &DeploymentProtectionRuleEvent{}, messageType: "deployment_protection_rule", }, { payload: &DeploymentStatusEvent{}, messageType: "deployment_status", }, { payload: &DiscussionCommentEvent{}, messageType: "discussion_comment", }, { payload: &DiscussionEvent{}, messageType: "discussion", }, { payload: &ForkEvent{}, messageType: "fork", }, { payload: &GitHubAppAuthorizationEvent{}, messageType: "github_app_authorization", }, { payload: &GollumEvent{}, messageType: "gollum", }, { payload: &InstallationEvent{}, messageType: "installation", }, { payload: &InstallationRepositoriesEvent{}, messageType: "installation_repositories", }, { payload: &InstallationTargetEvent{}, messageType: "installation_target", }, { 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: &MergeGroupEvent{}, messageType: "merge_group", }, { 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: &PersonalAccessTokenRequestEvent{}, messageType: "personal_access_token_request", }, { payload: &PingEvent{}, messageType: "ping", }, { payload: &ProjectEvent{}, messageType: "project", }, { payload: &ProjectCardEvent{}, messageType: "project_card", }, { payload: &ProjectColumnEvent{}, messageType: "project_column", }, { payload: &ProjectV2Event{}, messageType: "projects_v2", }, { payload: &ProjectV2ItemEvent{}, messageType: "projects_v2_item", }, { payload: &PublicEvent{}, messageType: "public", }, { payload: &PullRequestEvent{}, messageType: "pull_request", }, { payload: &PullRequestReviewEvent{}, messageType: "pull_request_review", }, { payload: &PullRequestReviewCommentEvent{}, messageType: "pull_request_review_comment", }, { payload: &PullRequestReviewThreadEvent{}, messageType: "pull_request_review_thread", }, { 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: &SecretScanningAlertEvent{}, messageType: "secret_scanning_alert", }, { payload: &SecurityAdvisoryEvent{}, messageType: "security_advisory", }, { payload: &SecurityAndAnalysisEvent{}, messageType: "security_and_analysis", }, { 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: &RepositoryImportEvent{}, messageType: "repository_import", }, { payload: &RepositoryDispatchEvent{}, messageType: "repository_dispatch", }, { payload: &WorkflowDispatchEvent{}, messageType: "workflow_dispatch", }, { payload: &WorkflowJobEvent{}, messageType: "workflow_job", }, { 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 TestAllMessageTypesMapped(t *testing.T) { for _, mt := range MessageTypes() { if obj := EventForType(mt); obj == nil { t.Errorf("messageMap missing message type %q", mt) } } } func TestUnknownMessageType(t *testing.T) { if obj := EventForType("unknown"); obj != nil { t.Errorf("EventForType(unknown) = %#v, want nil", obj) } if obj := EventForType(""); obj != nil { t.Errorf(`EventForType("") = %#v, want nil`, obj) } } 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-60.0.0/github/meta.go000066400000000000000000000115651457013574700162460ustar00rootroot00000000000000// 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" ) // MetaService provides access to functions in the GitHub API that GitHub categorizes as "meta". type MetaService service // 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 Packages. Packages []string `json:"packages,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"` // A map of algorithms to SSH key fingerprints. SSHKeyFingerprints map[string]string `json:"ssh_key_fingerprints,omitempty"` // An array of SSH keys. SSHKeys []string `json:"ssh_keys,omitempty"` // An array of IP addresses in CIDR format specifying the addresses // which serve GitHub websites. Web []string `json:"web,omitempty"` // An array of IP addresses in CIDR format specifying the addresses // which serve GitHub APIs. API []string `json:"api,omitempty"` } // Get 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/rest/meta/meta#get-github-meta-information // //meta:operation GET /meta func (s *MetaService) Get(ctx context.Context) (*APIMeta, *Response, error) { req, err := s.client.NewRequest("GET", "meta", nil) if err != nil { return nil, nil, err } meta := new(APIMeta) resp, err := s.client.Do(ctx, req, meta) if err != nil { return nil, resp, err } return meta, resp, nil } // APIMeta returns information about GitHub.com. // // Deprecated: Use MetaService.Get instead. func (c *Client) APIMeta(ctx context.Context) (*APIMeta, *Response, error) { return c.Meta.Get(ctx) } // Octocat returns an ASCII art octocat with the specified message in a speech // bubble. If message is empty, a random zen phrase is used. // // GitHub API docs: https://docs.github.com/rest/meta/meta#get-octocat // //meta:operation GET /octocat func (s *MetaService) 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 := s.client.NewRequest("GET", u, nil) if err != nil { return "", nil, err } buf := new(bytes.Buffer) resp, err := s.client.Do(ctx, req, buf) if err != nil { return "", resp, err } return buf.String(), 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. // // Deprecated: Use MetaService.Octocat instead. func (c *Client) Octocat(ctx context.Context, message string) (string, *Response, error) { return c.Meta.Octocat(ctx, message) } // Zen returns a random line from The Zen of GitHub. // // See also: http://warpspire.com/posts/taste/ // // GitHub API docs: https://docs.github.com/rest/meta/meta#get-the-zen-of-github // //meta:operation GET /zen func (s *MetaService) Zen(ctx context.Context) (string, *Response, error) { req, err := s.client.NewRequest("GET", "zen", nil) if err != nil { return "", nil, err } buf := new(bytes.Buffer) resp, err := s.client.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. // // Deprecated: Use MetaService.Zen instead. func (c *Client) Zen(ctx context.Context) (string, *Response, error) { return c.Meta.Zen(ctx) } go-github-60.0.0/github/meta_test.go000066400000000000000000000100211457013574700172670ustar00rootroot00000000000000// 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 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"}, SSHKeyFingerprints: map[string]string{"a": "f"}, SSHKeys: []string{"k"}, API: []string{"a"}, Web: []string{"w"}, } want := `{ "hooks":["h"], "git":["g"], "verifiable_password_authentication":true, "pages":["p"], "importer":["i"], "actions":["a"], "dependabot":["d"], "ssh_key_fingerprints":{"a":"f"}, "ssh_keys":["k"], "api":["a"], "web":["w"] }` testJSONMarshal(t, a, want) } func TestMetaService_Get(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, `{"web":["w"],"api":["a"],"hooks":["h"], "git":["g"], "pages":["p"], "importer":["i"], "actions":["a"], "dependabot":["d"], "verifiable_password_authentication": true}`) }) ctx := context.Background() meta, _, err := client.Meta.Get(ctx) if err != nil { t.Errorf("Get returned error: %v", err) } want := &APIMeta{ Hooks: []string{"h"}, Git: []string{"g"}, Pages: []string{"p"}, Importer: []string{"i"}, Actions: []string{"a"}, Dependabot: []string{"d"}, API: []string{"a"}, Web: []string{"w"}, VerifiablePasswordAuthentication: Bool(true), } if !cmp.Equal(want, meta) { t.Errorf("Get returned %+v, want %+v", meta, want) } const methodName = "Get" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Meta.Get(ctx) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMetaService_Octocat(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.Meta.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.Meta.Octocat(ctx, input) if got != "" { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestMetaService_Zen(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.Meta.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.Meta.Zen(ctx) if got != "" { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/migrations.go000066400000000000000000000176321457013574700174750ustar00rootroot00000000000000// 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/rest/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/rest/migrations/orgs#start-an-organization-migration // //meta:operation POST /orgs/{org}/migrations 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/rest/migrations/orgs#list-organization-migrations // //meta:operation GET /orgs/{org}/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/rest/migrations/orgs#get-an-organization-migration-status // //meta:operation GET /orgs/{org}/migrations/{migration_id} 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/rest/migrations/orgs#download-an-organization-migration-archive // //meta:operation GET /orgs/{org}/migrations/{migration_id}/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/rest/migrations/orgs#delete-an-organization-migration-archive // //meta:operation DELETE /orgs/{org}/migrations/{migration_id}/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/rest/migrations/orgs#unlock-an-organization-repository // //meta:operation DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock 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-60.0.0/github/migrations_source_import.go000066400000000000000000000277041457013574700224500ustar00rootroot00000000000000// 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/rest/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/rest/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/rest/migrations/source-imports#start-an-import // //meta:operation PUT /repos/{owner}/{repo}/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/rest/migrations/source-imports#get-an-import-status // //meta:operation GET /repos/{owner}/{repo}/import 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/rest/migrations/source-imports#update-an-import // //meta:operation PATCH /repos/{owner}/{repo}/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/rest/migrations/source-imports#get-commit-authors // //meta:operation GET /repos/{owner}/{repo}/import/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/rest/migrations/source-imports#map-a-commit-author // //meta:operation PATCH /repos/{owner}/{repo}/import/authors/{author_id} 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/rest/migrations/source-imports#update-git-lfs-preference // //meta:operation PATCH /repos/{owner}/{repo}/import/lfs 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/rest/migrations/source-imports#get-large-files // //meta:operation GET /repos/{owner}/{repo}/import/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/rest/migrations/source-imports#cancel-an-import // //meta:operation DELETE /repos/{owner}/{repo}/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-60.0.0/github/migrations_source_import_test.go000066400000000000000000000267751457013574700235160ustar00rootroot00000000000000// 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) assertNilError(t, 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) assertNilError(t, 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) assertNilError(t, 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) assertNilError(t, 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-60.0.0/github/migrations_test.go000066400000000000000000000206551457013574700205330ustar00rootroot00000000000000// 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) assertWrite(t, w, 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) assertWrite(t, w, []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) assertWrite(t, w, 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) assertWrite(t, w, []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-60.0.0/github/migrations_user.go000066400000000000000000000166401457013574700205310ustar00rootroot00000000000000// 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/rest/migrations/users#start-a-user-migration // //meta:operation POST /user/migrations 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/rest/migrations/users#list-user-migrations // //meta:operation GET /user/migrations func (s *MigrationService) ListUserMigrations(ctx context.Context, opts *ListOptions) ([]*UserMigration, *Response, error) { u := "user/migrations" 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 []*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/rest/migrations/users#get-a-user-migration-status // //meta:operation GET /user/migrations/{migration_id} 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/rest/migrations/users#download-a-user-migration-archive // //meta:operation GET /user/migrations/{migration_id}/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/rest/migrations/users#delete-a-user-migration-archive // //meta:operation DELETE /user/migrations/{migration_id}/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/rest/migrations/users#unlock-a-user-repository // //meta:operation DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock 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-60.0.0/github/migrations_user_test.go000066400000000000000000000203301457013574700215570ustar00rootroot00000000000000// 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) assertWrite(t, w, 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) assertWrite(t, w, []byte(fmt.Sprintf("[%s]", userMigrationJSON))) }) ctx := context.Background() got, _, err := client.Migrations.ListUserMigrations(ctx, &ListOptions{Page: 1, PerPage: 2}) 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, &ListOptions{Page: 1, PerPage: 2}) 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) assertWrite(t, w, 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-60.0.0/github/orgs.go000066400000000000000000000315211457013574700162640ustar00rootroot00000000000000// 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" ) // OrganizationsService provides access to the organization related functions // in the GitHub API. // // GitHub API docs: https://docs.github.com/rest/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 *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` TotalPrivateRepos *int64 `json:"total_private_repos,omitempty"` OwnedPrivateRepos *int64 `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"` // MembersCanForkPrivateRepos toggles whether organization members can fork private organization repositories. MembersCanForkPrivateRepos *bool `json:"members_can_fork_private_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"` // WebCommitSignoffRequire toggles WebCommitSignoffRequired *bool `json:"web_commit_signoff_required,omitempty"` // AdvancedSecurityAuditLogEnabled toggles whether the advanced security audit log is enabled. AdvancedSecurityEnabledForNewRepos *bool `json:"advanced_security_enabled_for_new_repositories,omitempty"` // DependabotAlertsEnabled toggles whether dependabot alerts are enabled. DependabotAlertsEnabledForNewRepos *bool `json:"dependabot_alerts_enabled_for_new_repositories,omitempty"` // DependabotSecurityUpdatesEnabled toggles whether dependabot security updates are enabled. DependabotSecurityUpdatesEnabledForNewRepos *bool `json:"dependabot_security_updates_enabled_for_new_repositories,omitempty"` // DependabotGraphEnabledForNewRepos toggles whether dependabot graph is enabled on new repositories. DependencyGraphEnabledForNewRepos *bool `json:"dependency_graph_enabled_for_new_repositories,omitempty"` // SecretScanningEnabled toggles whether secret scanning is enabled on new repositories. SecretScanningEnabledForNewRepos *bool `json:"secret_scanning_enabled_for_new_repositories,omitempty"` // SecretScanningPushProtectionEnabledForNewRepos toggles whether secret scanning push protection is enabled on new repositories. SecretScanningPushProtectionEnabledForNewRepos *bool `json:"secret_scanning_push_protection_enabled_for_new_repositories,omitempty"` // SecretScanningValidityChecksEnabled toggles whether secret scanning validity check is enabled. SecretScanningValidityChecksEnabled *bool `json:"secret_scanning_validity_checks_enabled,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 *int64 `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/rest/orgs/orgs#list-organizations // //meta:operation GET /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/rest/orgs/orgs#list-organizations-for-a-user // GitHub API docs: https://docs.github.com/rest/orgs/orgs#list-organizations-for-the-authenticated-user // //meta:operation GET /user/orgs //meta:operation GET /users/{username}/orgs 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/rest/orgs/orgs#get-an-organization // //meta:operation GET /orgs/{org} 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 "GET /organizations/{organization_id}". // //meta:operation GET /organizations/{organization_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/rest/orgs/orgs#update-an-organization // //meta:operation PATCH /orgs/{org} 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 } // Delete an organization by name. // // GitHub API docs: https://docs.github.com/rest/orgs/orgs#delete-an-organization // //meta:operation DELETE /orgs/{org} func (s *OrganizationsService) Delete(ctx context.Context, org string) (*Response, error) { u := fmt.Sprintf("orgs/%v", org) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListInstallations lists installations for an organization. // // GitHub API docs: https://docs.github.com/rest/orgs/orgs#list-app-installations-for-an-organization // //meta:operation GET /orgs/{org}/installations 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-60.0.0/github/orgs_actions_allowed.go000066400000000000000000000025071457013574700215150ustar00rootroot00000000000000// 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" ) // GetActionsAllowed gets the actions that are allowed in an organization. // // Deprecated: please use `client.Actions.GetActionsAllowed` instead. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#get-allowed-actions-and-reusable-workflows-for-an-organization // //meta:operation GET /orgs/{org}/actions/permissions/selected-actions func (s *OrganizationsService) GetActionsAllowed(ctx context.Context, org string) (*ActionsAllowed, *Response, error) { s2 := (*ActionsService)(s) return s2.GetActionsAllowed(ctx, org) } // EditActionsAllowed sets the actions that are allowed in an organization. // // Deprecated: please use `client.Actions.EditActionsAllowed` instead. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#set-allowed-actions-and-reusable-workflows-for-an-organization // //meta:operation PUT /orgs/{org}/actions/permissions/selected-actions func (s *OrganizationsService) EditActionsAllowed(ctx context.Context, org string, actionsAllowed ActionsAllowed) (*ActionsAllowed, *Response, error) { s2 := (*ActionsService)(s) return s2.EditActionsAllowed(ctx, org, actionsAllowed) } go-github-60.0.0/github/orgs_actions_allowed_test.go000066400000000000000000000060001457013574700225440ustar00rootroot00000000000000// 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) assertNilError(t, 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 }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.EditActionsAllowed(ctx, "o", *input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/orgs_actions_permissions.go000066400000000000000000000026161457013574700224420ustar00rootroot00000000000000// 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" ) // GetActionsPermissions gets the GitHub Actions permissions policy for repositories and allowed actions in an organization. // // Deprecated: please use `client.Actions.GetActionsPermissions` instead. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#get-github-actions-permissions-for-an-organization // //meta:operation GET /orgs/{org}/actions/permissions func (s *OrganizationsService) GetActionsPermissions(ctx context.Context, org string) (*ActionsPermissions, *Response, error) { s2 := (*ActionsService)(s) return s2.GetActionsPermissions(ctx, org) } // EditActionsPermissions sets the permissions policy for repositories and allowed actions in an organization. // // Deprecated: please use `client.Actions.EditActionsPermissions` instead. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#set-github-actions-permissions-for-an-organization // //meta:operation PUT /orgs/{org}/actions/permissions func (s *OrganizationsService) EditActionsPermissions(ctx context.Context, org string, actionsPermissions ActionsPermissions) (*ActionsPermissions, *Response, error) { s2 := (*ActionsService)(s) return s2.EditActionsPermissions(ctx, org, actionsPermissions) } go-github-60.0.0/github/orgs_actions_permissions_test.go000066400000000000000000000056531457013574700235050ustar00rootroot00000000000000// 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) assertNilError(t, 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 }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.EditActionsPermissions(ctx, "o", *input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/orgs_audit_log.go000066400000000000000000000121271457013574700203140ustar00rootroot00000000000000// 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" ) // GetAuditLogOptions sets up optional parameters to query audit-log endpoint. type GetAuditLogOptions struct { Phrase *string `url:"phrase,omitempty"` // A search phrase. (Optional.) Include *string `url:"include,omitempty"` // Event type includes. Can be one of "web", "git", "all". Default: "web". (Optional.) Order *string `url:"order,omitempty"` // The order of audit log events. Can be one of "asc" or "desc". Default: "desc". (Optional.) ListCursorOptions } // ActorLocation contains information about reported location for an actor. type ActorLocation struct { CountryCode *string `json:"country_code,omitempty"` } // AuditEntry describes the fields that may be represented by various audit-log "action" entries. // There are many other fields that may be present depending on the action. You can access those // in AdditionalFields. // For a list of actions see - https://docs.github.com/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`. Actor *string `json:"actor,omitempty"` // The actor who performed the action. ActorID *int64 `json:"actor_id,omitempty"` ActorLocation *ActorLocation `json:"actor_location,omitempty"` Business *string `json:"business,omitempty"` BusinessID *int64 `json:"business_id,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` DocumentID *string `json:"_document_id,omitempty"` ExternalIdentityNameID *string `json:"external_identity_nameid,omitempty"` ExternalIdentityUsername *string `json:"external_identity_username,omitempty"` HashedToken *string `json:"hashed_token,omitempty"` Org *string `json:"org,omitempty"` OrgID *int64 `json:"org_id,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). TokenID *int64 `json:"token_id,omitempty"` TokenScopes *string `json:"token_scopes,omitempty"` User *string `json:"user,omitempty"` // The user that was affected by the action performed (if available). UserID *int64 `json:"user_id,omitempty"` // Some events types have a data field that contains additional information about the event. Data map[string]interface{} `json:"data,omitempty"` // All fields that are not explicitly defined in the struct are captured here. AdditionalFields map[string]interface{} `json:"-"` } func (a *AuditEntry) UnmarshalJSON(data []byte) error { type entryAlias AuditEntry var v entryAlias if err := json.Unmarshal(data, &v); err != nil { return err } rawDefinedFields, err := json.Marshal(v) if err != nil { return err } definedFields := map[string]interface{}{} if err := json.Unmarshal(rawDefinedFields, &definedFields); err != nil { return err } if err := json.Unmarshal(data, &v.AdditionalFields); err != nil { return err } for key, val := range v.AdditionalFields { if _, ok := definedFields[key]; ok || val == nil { delete(v.AdditionalFields, key) } } *a = AuditEntry(v) if len(v.AdditionalFields) == 0 { a.AdditionalFields = nil } return nil } func (a *AuditEntry) MarshalJSON() ([]byte, error) { type entryAlias AuditEntry v := entryAlias(*a) defBytes, err := json.Marshal(v) if err != nil { return nil, err } if len(a.AdditionalFields) == 0 { return defBytes, err } resMap := map[string]interface{}{} if err := json.Unmarshal(defBytes, &resMap); err != nil { return nil, err } for key, val := range a.AdditionalFields { if val == nil { continue } if _, ok := resMap[key]; ok { return nil, fmt.Errorf("unexpected field in AdditionalFields: %v", key) } resMap[key] = val } return json.Marshal(resMap) } // GetAuditLog gets the audit-log entries for an organization. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/orgs/orgs#get-the-audit-log-for-an-organization // //meta:operation GET /orgs/{org}/audit-log 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-60.0.0/github/orgs_audit_log_test.go000066400000000000000000000272001457013574700213510ustar00rootroot00000000000000// 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" "strings" "testing" "time" ) 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, `[ { "@timestamp": 1615077308538, "_document_id": "beeZYapIUe-wKg5-beadb33", "action": "workflows.completed_workflow_run", "active": true, "actor": "testactor", "actor_ip": "10.0.0.1", "actor_location": { "country_code": "US" }, "cancelled_at": "2021-03-07T00:35:08.000Z", "completed_at": "2021-03-07T00:35:08.000Z", "conclusion": "success", "config": { "content_type": "json", "insecure_ssl": "0", "url": "https://example.com/deadbeef-new-hook" }, "created_at": 1615077308538, "event": "schedule", "events": ["code_scanning_alert"], "hashed_token": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", "head_branch": "master", "head_sha": "5acdeadbeef64d1a62388e901e5cdc9358644b37", "job_workflow_ref": "testorg/testrepo/.github/workflows/testjob.yml@refs/pull/1/merge", "name": "Code scanning - action", "oauth_application_id": 1, "old_permission": "read", "org": "o", "org_id": 1, "overridden_codes": [ "review_policy_not_satisfied" ], "permission": "admin", "pull_request_id": 1, "pull_request_title": "a pr title", "pull_request_url": "https://github.com/testorg/testrepo/pull/1", "reasons": [ { "code": "a code", "message": "a message" } ], "programmatic_access_type": "GitHub App server-to-server token", "referrer": "a referrer", "repo": "o/blue-crayon-1", "run_attempt": 1, "run_number": 1, "started_at": "2021-03-07T00:33:04.000Z", "token_id": 1, "token_scopes": "gist,repo:read", "topic": "cp1-iad.ingest.github.actions.v0.WorkflowUpdate", "trigger_id": null, "user_agent": "a user agent", "workflow_id": 123456, "workflow_run_id": 628312345 }]`) }) ctx := context.Background() getOpts := GetAuditLogOptions{ Include: String("all"), Phrase: String("action:workflows"), Order: String("asc"), } auditEntries, resp, err := client.Organizations.GetAuditLog(ctx, "o", &getOpts) if err != nil { t.Errorf("Organizations.GetAuditLog returned error: %v", err) } 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"), ActorLocation: &ActorLocation{ CountryCode: String("US"), }, CreatedAt: &Timestamp{timestamp}, HashedToken: String("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="), Org: String("o"), OrgID: Int64(1), TokenID: Int64(1), TokenScopes: String("gist,repo:read"), AdditionalFields: map[string]interface{}{ "actor_ip": "10.0.0.1", "active": true, "cancelled_at": "2021-03-07T00:35:08.000Z", "completed_at": "2021-03-07T00:35:08.000Z", "conclusion": "success", "event": "schedule", "head_branch": "master", "head_sha": "5acdeadbeef64d1a62388e901e5cdc9358644b37", "job_workflow_ref": "testorg/testrepo/.github/workflows/testjob.yml@refs/pull/1/merge", "name": "Code scanning - action", "oauth_application_id": float64(1), "old_permission": "read", "overridden_codes": []interface{}{"review_policy_not_satisfied"}, "permission": "admin", "programmatic_access_type": "GitHub App server-to-server token", "pull_request_id": float64(1), "pull_request_title": "a pr title", "pull_request_url": "https://github.com/testorg/testrepo/pull/1", "reasons": []interface{}{map[string]interface{}{ "code": "a code", "message": "a message", }}, "referrer": "a referrer", "repo": "o/blue-crayon-1", "run_attempt": float64(1), "run_number": float64(1), "started_at": "2021-03-07T00:33:04.000Z", "topic": "cp1-iad.ingest.github.actions.v0.WorkflowUpdate", "user_agent": "a user agent", "workflow_id": float64(123456), "workflow_run_id": float64(628312345), "events": []interface{}{"code_scanning_alert"}, "config": map[string]interface{}{ "content_type": "json", "insecure_ssl": "0", "url": "https://example.com/deadbeef-new-hook", }, }, }, } assertNoDiff(t, want, auditEntries) // assert query string has lower case params requestedQuery := resp.Request.URL.RawQuery if !strings.Contains(requestedQuery, "phrase") { t.Errorf("Organizations.GetAuditLog query string \ngot: %+v,\nwant:%+v", requestedQuery, "phrase") } 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"), Actor: String("ac"), ActorLocation: &ActorLocation{CountryCode: String("alcc")}, Business: String("b"), CreatedAt: &Timestamp{referenceTime}, DocumentID: String("did"), ExternalIdentityNameID: String("ein"), ExternalIdentityUsername: String("eiu"), HashedToken: String("ht"), Org: String("o"), OrgID: Int64(1), Timestamp: &Timestamp{referenceTime}, TokenID: Int64(1), TokenScopes: String("ts"), User: String("u"), Data: map[string]interface{}{ "old_name": "on", "old_login": "ol", }, AdditionalFields: map[string]interface{}{ "active": false, "active_was": false, "actor_ip": "aip", "blocked_user": "bu", "cancelled_at": "2021-03-07T00:35:08.000Z", "completed_at": "2021-03-07T00:35:08.000Z", "conclusion": "c", "config": map[string]interface{}{ "url": "s", }, "config_was": map[string]interface{}{ "url": "s", }, "content_type": "ct", "deploy_key_fingerprint": "dkf", "emoji": "e", "environment_name": "en", "event": "e", "events": []interface{}{"s"}, "events_were": []interface{}{"s"}, "explanation": "e", "fingerprint": "f", "head_branch": "hb", "head_sha": "hsha", "hook_id": float64(1), "is_hosted_runner": false, "job_name": "jn", "limited_availability": false, "message": "m", "name": "n", "old_permission": "op", "old_user": "ou", "openssh_public_key": "osshpk", "permission": "p", "previous_visibility": "pv", "programmatic_access_type": "pat", "pull_request_id": float64(1), "pull_request_title": "prt", "pull_request_url": "pru", "read_only": "ro", "reasons": []interface{}{ map[string]interface{}{ "code": "c", "message": "m", }, }, "referrer": "a referrer", "repo": "r", "repository": "repo", "repository_public": false, "run_attempt": 1, "runner_group_id": 1, "runner_group_name": "rgn", "runner_id": 1, "runner_labels": []interface{}{"s"}, "runner_name": "rn", "secrets_passed": []interface{}{"s"}, "source_version": "sv", "started_at": "2006-01-02T15:04:05Z", "target_login": "tl", "target_version": "tv", "team": "t", "topic": "cp1-iad.ingest.github.actions.v0.WorkflowUpdate", "transport_protocol": 1, "transport_protocol_name": "tpn", "trigger_id": 1, "user_agent": "ua", "visibility": "v", "workflow_id": 1, "workflow_run_id": 1, }, } want := `{ "action": "a", "active": false, "active_was": false, "actor": "ac", "actor_ip": "aip", "actor_location": { "country_code": "alcc" }, "blocked_user": "bu", "business": "b", "cancelled_at": "2021-03-07T00:35:08.000Z", "completed_at": "2021-03-07T00:35:08.000Z", "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", "external_identity_nameid": "ein", "external_identity_username": "eiu", "fingerprint": "f", "hashed_token": "ht", "head_branch": "hb", "head_sha": "hsha", "hook_id": 1, "is_hosted_runner": false, "job_name": "jn", "limited_availability": false, "message": "m", "name": "n", "old_permission": "op", "old_user": "ou", "openssh_public_key": "osshpk", "org": "o", "org_id": 1, "permission": "p", "previous_visibility": "pv", "programmatic_access_type": "pat", "pull_request_id": 1, "pull_request_title": "prt", "pull_request_url": "pru", "reasons": [{ "code": "c", "message": "m" }], "referrer": "a referrer", "read_only": "ro", "repo": "r", "repository": "repo", "repository_public": false, "run_attempt": 1, "runner_group_id": 1, "runner_group_name": "rgn", "runner_id": 1, "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 + `, "token_id": 1, "token_scopes": "ts", "topic": "cp1-iad.ingest.github.actions.v0.WorkflowUpdate", "transport_protocol_name": "tpn", "transport_protocol": 1, "trigger_id": 1, "user": "u", "user_agent": "ua", "visibility": "v", "workflow_id": 1, "workflow_run_id": 1, "data": { "old_name": "on", "old_login": "ol" } }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/orgs_credential_authorizations.go000066400000000000000000000071051457013574700236220ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // CredentialAuthorization represents a credential authorized through SAML SSO. type CredentialAuthorization struct { // User login that owns the underlying credential. Login *string `json:"login,omitempty"` // Unique identifier for the credential. CredentialID *int64 `json:"credential_id,omitempty"` // Human-readable description of the credential type. CredentialType *string `json:"credential_type,omitempty"` // Last eight characters of the credential. // Only included in responses with credential_type of personal access token. TokenLastEight *string `json:"token_last_eight,omitempty"` // Date when the credential was authorized for use. CredentialAuthorizedAt *Timestamp `json:"credential_authorized_at,omitempty"` // Date when the credential was last accessed. // May be null if it was never accessed. CredentialAccessedAt *Timestamp `json:"credential_accessed_at,omitempty"` // List of oauth scopes the token has been granted. Scopes []string `json:"scopes,omitempty"` // Unique string to distinguish the credential. // Only included in responses with credential_type of SSH Key. Fingerprint *string `json:"fingerprint,omitempty"` AuthorizedCredentialID *int64 `json:"authorized_credential_id,omitempty"` // The title given to the ssh key. // This will only be present when the credential is an ssh key. AuthorizedCredentialTitle *string `json:"authorized_credential_title,omitempty"` // The note given to the token. // This will only be present when the credential is a token. AuthorizedCredentialNote *string `json:"authorized_credential_note,omitempty"` // The expiry for the token. // This will only be present when the credential is a token. AuthorizedCredentialExpiresAt *Timestamp `json:"authorized_credential_expires_at,omitempty"` } // ListCredentialAuthorizations lists credentials authorized through SAML SSO // for a given organization. Only available with GitHub Enterprise Cloud. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/orgs/orgs#list-saml-sso-authorizations-for-an-organization // //meta:operation GET /orgs/{org}/credential-authorizations func (s *OrganizationsService) ListCredentialAuthorizations(ctx context.Context, org string, opts *ListOptions) ([]*CredentialAuthorization, *Response, error) { u := fmt.Sprintf("orgs/%v/credential-authorizations", org) u, err := addOptions(u, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest(http.MethodGet, u, nil) if err != nil { return nil, nil, err } var creds []*CredentialAuthorization resp, err := s.client.Do(ctx, req, &creds) if err != nil { return nil, resp, err } return creds, resp, nil } // RemoveCredentialAuthorization revokes the SAML SSO authorization for a given // credential within an organization. Only available with GitHub Enterprise Cloud. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/orgs/orgs#remove-a-saml-sso-authorization-for-an-organization // //meta:operation DELETE /orgs/{org}/credential-authorizations/{credential_id} func (s *OrganizationsService) RemoveCredentialAuthorization(ctx context.Context, org string, credentialID int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/credential-authorizations/%v", org, credentialID) req, err := s.client.NewRequest(http.MethodDelete, u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/orgs_credential_authorizations_test.go000066400000000000000000000057361457013574700246710ustar00rootroot00000000000000// Copyright 2023 The go-github 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 TestOrganizationsService_ListCredentialAuthorizations(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/credential-authorizations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, http.MethodGet) testFormValues(t, r, values{"per_page": "2", "page": "2"}) fmt.Fprint(w, `[ { "login": "l", "credential_id": 1, "credential_type": "t", "credential_authorized_at": "2017-01-21T00:00:00Z", "credential_accessed_at": "2017-01-21T00:00:00Z", "authorized_credential_id": 1 } ]`) }) opts := &ListOptions{Page: 2, PerPage: 2} ctx := context.Background() creds, _, err := client.Organizations.ListCredentialAuthorizations(ctx, "o", opts) if err != nil { t.Errorf("Organizations.ListCredentialAuthorizations returned error: %v", err) } ts := time.Date(2017, time.January, 21, 0, 0, 0, 0, time.UTC) want := []*CredentialAuthorization{ { Login: String("l"), CredentialID: Int64(1), CredentialType: String("t"), CredentialAuthorizedAt: &Timestamp{ts}, CredentialAccessedAt: &Timestamp{ts}, AuthorizedCredentialID: Int64(1), }, } if !cmp.Equal(creds, want) { t.Errorf("Organizations.ListCredentialAuthorizations returned %+v, want %+v", creds, want) } const methodName = "ListCredentialAuthorizations" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListCredentialAuthorizations(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { _, resp, err := client.Organizations.ListCredentialAuthorizations(ctx, "o", opts) return resp, err }) } func TestOrganizationsService_RemoveCredentialAuthorization(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/credential-authorizations/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, http.MethodDelete) w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() resp, err := client.Organizations.RemoveCredentialAuthorization(ctx, "o", 1) if err != nil { t.Errorf("Organizations.RemoveCredentialAuthorization returned error: %v", err) } if resp.StatusCode != http.StatusNoContent { t.Errorf("Organizations.RemoveCredentialAuthorization returned %v, want %v", resp.StatusCode, http.StatusNoContent) } const methodName = "RemoveCredentialAuthorization" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.RemoveCredentialAuthorization(ctx, "\n", 0) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.RemoveCredentialAuthorization(ctx, "o", 1) }) } go-github-60.0.0/github/orgs_custom_roles.go000066400000000000000000000114561457013574700210670ustar00rootroot00000000000000// Copyright 2022 The go-github 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" ) // OrganizationCustomRepoRoles represents custom repository roles available in specified organization. type OrganizationCustomRepoRoles struct { TotalCount *int `json:"total_count,omitempty"` CustomRepoRoles []*CustomRepoRoles `json:"custom_roles,omitempty"` } // CustomRepoRoles represents custom repository roles for an organization. // See https://docs.github.com/enterprise-cloud@latest/organizations/managing-peoples-access-to-your-organization-with-roles/managing-custom-repository-roles-for-an-organization // for more information. type CustomRepoRoles struct { ID *int64 `json:"id,omitempty"` Name *string `json:"name,omitempty"` Description *string `json:"description,omitempty"` BaseRole *string `json:"base_role,omitempty"` Permissions []string `json:"permissions,omitempty"` } // ListCustomRepoRoles lists the custom repository roles available in this organization. // In order to see custom repository roles in an organization, the authenticated user must be an organization owner. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/orgs/custom-roles#list-custom-repository-roles-in-an-organization // //meta:operation GET /orgs/{org}/custom-repository-roles func (s *OrganizationsService) ListCustomRepoRoles(ctx context.Context, org string) (*OrganizationCustomRepoRoles, *Response, error) { u := fmt.Sprintf("orgs/%v/custom-repository-roles", org) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } customRepoRoles := new(OrganizationCustomRepoRoles) resp, err := s.client.Do(ctx, req, customRepoRoles) if err != nil { return nil, resp, err } return customRepoRoles, resp, nil } // CreateOrUpdateCustomRoleOptions represents options required to create or update a custom repository role. type CreateOrUpdateCustomRoleOptions struct { Name *string `json:"name,omitempty"` Description *string `json:"description,omitempty"` BaseRole *string `json:"base_role,omitempty"` Permissions []string `json:"permissions,omitempty"` } // CreateCustomRepoRole creates a custom repository role in this organization. // In order to create custom repository roles in an organization, the authenticated user must be an organization owner. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/orgs/custom-roles#create-a-custom-repository-role // //meta:operation POST /orgs/{org}/custom-repository-roles func (s *OrganizationsService) CreateCustomRepoRole(ctx context.Context, org string, opts *CreateOrUpdateCustomRoleOptions) (*CustomRepoRoles, *Response, error) { u := fmt.Sprintf("orgs/%v/custom-repository-roles", org) req, err := s.client.NewRequest("POST", u, opts) if err != nil { return nil, nil, err } resultingRole := new(CustomRepoRoles) resp, err := s.client.Do(ctx, req, resultingRole) if err != nil { return nil, resp, err } return resultingRole, resp, err } // UpdateCustomRepoRole updates a custom repository role in this organization. // In order to update custom repository roles in an organization, the authenticated user must be an organization owner. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/orgs/custom-roles#update-a-custom-repository-role // //meta:operation PATCH /orgs/{org}/custom-repository-roles/{role_id} func (s *OrganizationsService) UpdateCustomRepoRole(ctx context.Context, org, roleID string, opts *CreateOrUpdateCustomRoleOptions) (*CustomRepoRoles, *Response, error) { u := fmt.Sprintf("orgs/%v/custom-repository-roles/%v", org, roleID) req, err := s.client.NewRequest("PATCH", u, opts) if err != nil { return nil, nil, err } resultingRole := new(CustomRepoRoles) resp, err := s.client.Do(ctx, req, resultingRole) if err != nil { return nil, resp, err } return resultingRole, resp, err } // DeleteCustomRepoRole deletes an existing custom repository role in this organization. // In order to delete custom repository roles in an organization, the authenticated user must be an organization owner. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/orgs/custom-roles#delete-a-custom-repository-role // //meta:operation DELETE /orgs/{org}/custom-repository-roles/{role_id} func (s *OrganizationsService) DeleteCustomRepoRole(ctx context.Context, org, roleID string) (*Response, error) { u := fmt.Sprintf("orgs/%v/custom-repository-roles/%v", org, roleID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } resultingRole := new(CustomRepoRoles) resp, err := s.client.Do(ctx, req, resultingRole) if err != nil { return resp, err } return resp, nil } go-github-60.0.0/github/orgs_custom_roles_test.go000066400000000000000000000127241457013574700221250ustar00rootroot00000000000000// Copyright 2022 The go-github 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_ListCustomRepoRoles(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/custom-repository-roles", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"total_count": 1, "custom_roles": [{ "id": 1, "name": "Developer", "base_role": "write", "permissions": ["delete_alerts_code_scanning"]}]}`) }) ctx := context.Background() apps, _, err := client.Organizations.ListCustomRepoRoles(ctx, "o") if err != nil { t.Errorf("Organizations.ListCustomRepoRoles returned error: %v", err) } want := &OrganizationCustomRepoRoles{TotalCount: Int(1), CustomRepoRoles: []*CustomRepoRoles{{ID: Int64(1), Name: String("Developer"), BaseRole: String("write"), Permissions: []string{"delete_alerts_code_scanning"}}}} if !cmp.Equal(apps, want) { t.Errorf("Organizations.ListCustomRepoRoles returned %+v, want %+v", apps, want) } const methodName = "ListCustomRepoRoles" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListCustomRepoRoles(ctx, "\no") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListCustomRepoRoles(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_CreateCustomRepoRole(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/custom-repository-roles", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"id":8030,"name":"Labeler","description":"A role for issue and PR labelers","base_role":"read","permissions":["add_label"]}`) }) ctx := context.Background() opts := &CreateOrUpdateCustomRoleOptions{ Name: String("Labeler"), Description: String("A role for issue and PR labelers"), BaseRole: String("read"), Permissions: []string{"add_label"}, } apps, _, err := client.Organizations.CreateCustomRepoRole(ctx, "o", opts) if err != nil { t.Errorf("Organizations.CreateCustomRepoRole returned error: %v", err) } want := &CustomRepoRoles{ID: Int64(8030), Name: String("Labeler"), BaseRole: String("read"), Permissions: []string{"add_label"}, Description: String("A role for issue and PR labelers")} if !cmp.Equal(apps, want) { t.Errorf("Organizations.CreateCustomRepoRole returned %+v, want %+v", apps, want) } const methodName = "CreateCustomRepoRole" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.CreateCustomRepoRole(ctx, "\no", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.CreateCustomRepoRole(ctx, "o", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_UpdateCustomRepoRole(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/custom-repository-roles/8030", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") fmt.Fprint(w, `{"id":8030,"name":"Updated Name","description":"Updated Description","base_role":"read","permissions":["add_label"]}`) }) ctx := context.Background() opts := &CreateOrUpdateCustomRoleOptions{ Name: String("Updated Name"), Description: String("Updated Description"), } apps, _, err := client.Organizations.UpdateCustomRepoRole(ctx, "o", "8030", opts) if err != nil { t.Errorf("Organizations.UpdateCustomRepoRole returned error: %v", err) } want := &CustomRepoRoles{ID: Int64(8030), Name: String("Updated Name"), BaseRole: String("read"), Permissions: []string{"add_label"}, Description: String("Updated Description")} if !cmp.Equal(apps, want) { t.Errorf("Organizations.UpdateCustomRepoRole returned %+v, want %+v", apps, want) } const methodName = "UpdateCustomRepoRole" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.UpdateCustomRepoRole(ctx, "\no", "8030", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.UpdateCustomRepoRole(ctx, "o", "8030", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_DeleteCustomRepoRole(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/custom-repository-roles/8030", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() resp, err := client.Organizations.DeleteCustomRepoRole(ctx, "o", "8030") if err != nil { t.Errorf("Organizations.DeleteCustomRepoRole returned error: %v", err) } if !cmp.Equal(resp.StatusCode, 204) { t.Errorf("Organizations.DeleteCustomRepoRole returned status code %+v, want %+v", resp.StatusCode, "204") } const methodName = "DeleteCustomRepoRole" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.DeleteCustomRepoRole(ctx, "\no", "8030") return err }) } go-github-60.0.0/github/orgs_hooks.go000066400000000000000000000073361457013574700174760ustar00rootroot00000000000000// 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/rest/orgs/webhooks#list-organization-webhooks // //meta:operation GET /orgs/{org}/hooks 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/rest/orgs/webhooks#get-an-organization-webhook // //meta:operation GET /orgs/{org}/hooks/{hook_id} 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) if err != nil { return nil, resp, err } return hook, resp, nil } // 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/rest/orgs/webhooks#create-an-organization-webhook // //meta:operation POST /orgs/{org}/hooks 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/rest/orgs/webhooks#update-an-organization-webhook // //meta:operation PATCH /orgs/{org}/hooks/{hook_id} 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) if err != nil { return nil, resp, err } return h, resp, nil } // PingHook triggers a 'ping' event to be sent to the Hook. // // GitHub API docs: https://docs.github.com/rest/orgs/webhooks#ping-an-organization-webhook // //meta:operation POST /orgs/{org}/hooks/{hook_id}/pings 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/rest/orgs/webhooks#delete-an-organization-webhook // //meta:operation DELETE /orgs/{org}/hooks/{hook_id} 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-60.0.0/github/orgs_hooks_configuration.go000066400000000000000000000030761457013574700224220ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // GetHookConfiguration returns the configuration for the specified organization webhook. // // GitHub API docs: https://docs.github.com/rest/orgs/webhooks#get-a-webhook-configuration-for-an-organization // //meta:operation GET /orgs/{org}/hooks/{hook_id}/config func (s *OrganizationsService) GetHookConfiguration(ctx context.Context, org string, id int64) (*HookConfig, *Response, error) { u := fmt.Sprintf("orgs/%v/hooks/%v/config", org, id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } config := new(HookConfig) resp, err := s.client.Do(ctx, req, config) if err != nil { return nil, resp, err } return config, resp, nil } // EditHookConfiguration updates the configuration for the specified organization webhook. // // GitHub API docs: https://docs.github.com/rest/orgs/webhooks#update-a-webhook-configuration-for-an-organization // //meta:operation PATCH /orgs/{org}/hooks/{hook_id}/config func (s *OrganizationsService) EditHookConfiguration(ctx context.Context, org string, id int64, config *HookConfig) (*HookConfig, *Response, error) { u := fmt.Sprintf("orgs/%v/hooks/%v/config", org, id) req, err := s.client.NewRequest("PATCH", u, config) if err != nil { return nil, nil, err } c := new(HookConfig) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } go-github-60.0.0/github/orgs_hooks_configuration_test.go000066400000000000000000000071421457013574700234570ustar00rootroot00000000000000// Copyright 2023 The go-github 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_GetHookConfiguration(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/hooks/1/config", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"content_type": "json", "insecure_ssl": "0", "secret": "********", "url": "https://example.com/webhook"}`) }) ctx := context.Background() config, _, err := client.Organizations.GetHookConfiguration(ctx, "o", 1) if err != nil { t.Errorf("Organizations.GetHookConfiguration returned error: %v", err) } want := &HookConfig{ ContentType: String("json"), InsecureSSL: String("0"), Secret: String("********"), URL: String("https://example.com/webhook"), } if !cmp.Equal(config, want) { t.Errorf("Organizations.GetHookConfiguration returned %+v, want %+v", config, want) } const methodName = "GetHookConfiguration" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.GetHookConfiguration(ctx, "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.GetHookConfiguration(ctx, "o", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_GetHookConfiguration_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.GetHookConfiguration(ctx, "%", 1) testURLParseError(t, err) } func TestOrganizationsService_EditHookConfiguration(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &HookConfig{} mux.HandleFunc("/orgs/o/hooks/1/config", func(w http.ResponseWriter, r *http.Request) { v := new(HookConfig) assertNilError(t, 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, `{"content_type": "json", "insecure_ssl": "0", "secret": "********", "url": "https://example.com/webhook"}`) }) ctx := context.Background() config, _, err := client.Organizations.EditHookConfiguration(ctx, "o", 1, input) if err != nil { t.Errorf("Organizations.EditHookConfiguration returned error: %v", err) } want := &HookConfig{ ContentType: String("json"), InsecureSSL: String("0"), Secret: String("********"), URL: String("https://example.com/webhook"), } if !cmp.Equal(config, want) { t.Errorf("Organizations.EditHookConfiguration returned %+v, want %+v", config, want) } const methodName = "EditHookConfiguration" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.EditHookConfiguration(ctx, "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.EditHookConfiguration(ctx, "o", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_EditHookConfiguration_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.EditHookConfiguration(ctx, "%", 1, nil) testURLParseError(t, err) } go-github-60.0.0/github/orgs_hooks_deliveries.go000066400000000000000000000047061457013574700217070ustar00rootroot00000000000000// 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/rest/orgs/webhooks#list-deliveries-for-an-organization-webhook // //meta:operation GET /orgs/{org}/hooks/{hook_id}/deliveries 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/rest/orgs/webhooks#get-a-webhook-delivery-for-an-organization-webhook // //meta:operation GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id} 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 } // RedeliverHookDelivery redelivers a delivery for a webhook configured in an organization. // // GitHub API docs: https://docs.github.com/rest/orgs/webhooks#redeliver-a-delivery-for-an-organization-webhook // //meta:operation POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts func (s *OrganizationsService) RedeliverHookDelivery(ctx context.Context, owner string, hookID, deliveryID int64) (*HookDelivery, *Response, error) { u := fmt.Sprintf("orgs/%v/hooks/%v/deliveries/%v/attempts", owner, hookID, deliveryID) req, err := s.client.NewRequest("POST", 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-60.0.0/github/orgs_hooks_deliveries_test.go000066400000000000000000000105641457013574700227450ustar00rootroot00000000000000// 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) } func TestOrganizationsService_RedeliverHookDelivery(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/hooks/1/deliveries/1/attempts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() hook, _, err := client.Organizations.RedeliverHookDelivery(ctx, "o", 1, 1) if err != nil { t.Errorf("Organizations.RedeliverHookDelivery returned error: %v", err) } want := &HookDelivery{ID: Int64(1)} if !cmp.Equal(hook, want) { t.Errorf("Organizations.RedeliverHookDelivery returned %+v, want %+v", hook, want) } const methodName = "Rede;overHookDelivery" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.RedeliverHookDelivery(ctx, "\n", -1, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.RedeliverHookDelivery(ctx, "o", 1, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_RedeliverHookDelivery_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.RedeliverHookDelivery(ctx, "%", 1, 1) testURLParseError(t, err) } go-github-60.0.0/github/orgs_hooks_test.go000066400000000000000000000160111457013574700205230ustar00rootroot00000000000000// 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: &Timestamp{referenceTime}} mux.HandleFunc("/orgs/o/hooks", func(w http.ResponseWriter, r *http.Request) { v := new(createHookRequest) assertNilError(t, 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 }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.GetHook(ctx, "o", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, 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) assertNilError(t, 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 }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.EditHook(ctx, "o", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, 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-60.0.0/github/orgs_members.go000066400000000000000000000337021457013574700200010ustar00rootroot00000000000000// 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/rest/orgs/members#list-organization-members // GitHub API docs: https://docs.github.com/rest/orgs/members#list-public-organization-members // //meta:operation GET /orgs/{org}/members //meta:operation GET /orgs/{org}/public_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/rest/orgs/members#check-organization-membership-for-a-user // //meta:operation GET /orgs/{org}/members/{username} 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/rest/orgs/members#check-public-organization-membership-for-a-user // //meta:operation GET /orgs/{org}/public_members/{username} 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/rest/orgs/members#remove-an-organization-member // //meta:operation DELETE /orgs/{org}/members/{username} 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/rest/orgs/members#set-public-organization-membership-for-the-authenticated-user // //meta:operation PUT /orgs/{org}/public_members/{username} 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/rest/orgs/members#remove-public-organization-membership-for-the-authenticated-user // //meta:operation DELETE /orgs/{org}/public_members/{username} 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/rest/orgs/members#list-organization-memberships-for-the-authenticated-user // //meta:operation GET /user/memberships/orgs 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/rest/orgs/members#get-an-organization-membership-for-the-authenticated-user // GitHub API docs: https://docs.github.com/rest/orgs/members#get-organization-membership-for-a-user // //meta:operation GET /orgs/{org}/memberships/{username} //meta:operation GET /user/memberships/orgs/{org} 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/rest/orgs/members#set-organization-membership-for-a-user // GitHub API docs: https://docs.github.com/rest/orgs/members#update-an-organization-membership-for-the-authenticated-user // //meta:operation PUT /orgs/{org}/memberships/{username} //meta:operation PATCH /user/memberships/orgs/{org} 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/rest/orgs/members#remove-organization-membership-for-a-user // //meta:operation DELETE /orgs/{org}/memberships/{username} 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/rest/orgs/members#list-pending-organization-invitations // //meta:operation GET /orgs/{org}/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,omitempty"` TeamID []int64 `json:"team_ids,omitempty"` } // 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/rest/orgs/members#create-an-organization-invitation // //meta:operation POST /orgs/{org}/invitations 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/rest/orgs/members#list-organization-invitation-teams // //meta:operation GET /orgs/{org}/invitations/{invitation_id}/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/rest/orgs/members#list-failed-organization-invitations // //meta:operation GET /orgs/{org}/failed_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-60.0.0/github/orgs_members_test.go000066400000000000000000000751041457013574700210420ustar00rootroot00000000000000// 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) assertNilError(t, 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) assertNilError(t, 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: &Timestamp{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) assertNilError(t, 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: &Timestamp{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-60.0.0/github/orgs_outside_collaborators.go000066400000000000000000000061151457013574700227470ustar00rootroot00000000000000// 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/rest/orgs/outside-collaborators#list-outside-collaborators-for-an-organization // //meta:operation GET /orgs/{org}/outside_collaborators 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/rest/orgs/outside-collaborators#remove-outside-collaborator-from-an-organization // //meta:operation DELETE /orgs/{org}/outside_collaborators/{username} 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/rest/orgs/outside-collaborators#convert-an-organization-member-to-outside-collaborator // //meta:operation PUT /orgs/{org}/outside_collaborators/{username} 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-60.0.0/github/orgs_outside_collaborators_test.go000066400000000000000000000131651457013574700240110ustar00rootroot00000000000000// 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-60.0.0/github/orgs_packages.go000066400000000000000000000145541457013574700201310ustar00rootroot00000000000000// 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/url" ) // ListPackages lists the packages for an organization. // // GitHub API docs: https://docs.github.com/rest/packages/packages#list-packages-for-an-organization // //meta:operation GET /orgs/{org}/packages func (s *OrganizationsService) ListPackages(ctx context.Context, org string, opts *PackageListOptions) ([]*Package, *Response, error) { u := fmt.Sprintf("orgs/%v/packages", 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 packages []*Package resp, err := s.client.Do(ctx, req, &packages) if err != nil { return nil, resp, err } return packages, resp, nil } // GetPackage gets a package by name from an organization. // // Note that packageName is escaped for the URL path so that you don't need to. // // GitHub API docs: https://docs.github.com/rest/packages/packages#get-a-package-for-an-organization // //meta:operation GET /orgs/{org}/packages/{package_type}/{package_name} func (s *OrganizationsService) GetPackage(ctx context.Context, org, packageType, packageName string) (*Package, *Response, error) { u := fmt.Sprintf("orgs/%v/packages/%v/%v", org, packageType, url.PathEscape(packageName)) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var pack *Package resp, err := s.client.Do(ctx, req, &pack) if err != nil { return nil, resp, err } return pack, resp, nil } // DeletePackage deletes a package from an organization. // // Note that packageName is escaped for the URL path so that you don't need to. // // GitHub API docs: https://docs.github.com/rest/packages/packages#delete-a-package-for-an-organization // //meta:operation DELETE /orgs/{org}/packages/{package_type}/{package_name} func (s *OrganizationsService) DeletePackage(ctx context.Context, org, packageType, packageName string) (*Response, error) { u := fmt.Sprintf("orgs/%v/packages/%v/%v", org, packageType, url.PathEscape(packageName)) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // RestorePackage restores a package to an organization. // // Note that packageName is escaped for the URL path so that you don't need to. // // GitHub API docs: https://docs.github.com/rest/packages/packages#restore-a-package-for-an-organization // //meta:operation POST /orgs/{org}/packages/{package_type}/{package_name}/restore func (s *OrganizationsService) RestorePackage(ctx context.Context, org, packageType, packageName string) (*Response, error) { u := fmt.Sprintf("orgs/%v/packages/%v/%v/restore", org, packageType, url.PathEscape(packageName)) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // PackageGetAllVersions gets all versions of a package in an organization. // // Note that packageName is escaped for the URL path so that you don't need to. // // GitHub API docs: https://docs.github.com/rest/packages/packages#list-package-versions-for-a-package-owned-by-an-organization // //meta:operation GET /orgs/{org}/packages/{package_type}/{package_name}/versions func (s *OrganizationsService) PackageGetAllVersions(ctx context.Context, org, packageType, packageName string, opts *PackageListOptions) ([]*PackageVersion, *Response, error) { u := fmt.Sprintf("orgs/%v/packages/%v/%v/versions", org, packageType, url.PathEscape(packageName)) 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 versions []*PackageVersion resp, err := s.client.Do(ctx, req, &versions) if err != nil { return nil, resp, err } return versions, resp, nil } // PackageGetVersion gets a specific version of a package in an organization. // // Note that packageName is escaped for the URL path so that you don't need to. // // GitHub API docs: https://docs.github.com/rest/packages/packages#get-a-package-version-for-an-organization // //meta:operation GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id} func (s *OrganizationsService) PackageGetVersion(ctx context.Context, org, packageType, packageName string, packageVersionID int64) (*PackageVersion, *Response, error) { u := fmt.Sprintf("orgs/%v/packages/%v/%v/versions/%v", org, packageType, url.PathEscape(packageName), packageVersionID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var version *PackageVersion resp, err := s.client.Do(ctx, req, &version) if err != nil { return nil, resp, err } return version, resp, nil } // PackageDeleteVersion deletes a package version from an organization. // // Note that packageName is escaped for the URL path so that you don't need to. // // GitHub API docs: https://docs.github.com/rest/packages/packages#delete-package-version-for-an-organization // //meta:operation DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id} func (s *OrganizationsService) PackageDeleteVersion(ctx context.Context, org, packageType, packageName string, packageVersionID int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/packages/%v/%v/versions/%v", org, packageType, url.PathEscape(packageName), packageVersionID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // PackageRestoreVersion restores a package version to an organization. // // Note that packageName is escaped for the URL path so that you don't need to. // // GitHub API docs: https://docs.github.com/rest/packages/packages#restore-package-version-for-an-organization // //meta:operation POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore func (s *OrganizationsService) PackageRestoreVersion(ctx context.Context, org, packageType, packageName string, packageVersionID int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/packages/%v/%v/versions/%v/restore", org, packageType, url.PathEscape(packageName), packageVersionID) req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/orgs_packages_test.go000066400000000000000000000374671457013574700212000ustar00rootroot00000000000000// 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" "io" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestOrganizationsService_ListPackages(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/packages", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") _, err := io.WriteString(w, `[{ "id": 197, "name": "hello_docker", "package_type": "container", "owner": { "login": "github", "id": 9919, "node_id": "MDEyOk9yZ2FuaXphdGlvbjk5MTk=", "avatar_url": "https://avatars.githubusercontent.com/u/9919?v=4", "gravatar_id": "", "url": "https://api.github.com/users/github", "html_url": "https://github.com/github", "followers_url": "https://api.github.com/users/github/followers", "following_url": "https://api.github.com/users/github/following{/other_user}", "gists_url": "https://api.github.com/users/github/gists{/gist_id}", "starred_url": "https://api.github.com/users/github/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/github/subscriptions", "organizations_url": "https://api.github.com/users/github/orgs", "repos_url": "https://api.github.com/users/github/repos", "events_url": "https://api.github.com/users/github/events{/privacy}", "received_events_url": "https://api.github.com/users/github/received_events", "type": "Organization", "site_admin": false }, "version_count": 1, "visibility": "private", "url": "https://api.github.com/orgs/github/packages/container/hello_docker", "created_at": `+referenceTimeStr+`, "updated_at": `+referenceTimeStr+`, "html_url": "https://github.com/orgs/github/packages/container/package/hello_docker" } ]`) if err != nil { t.Fatal("Failed to write test response: ", err) } }) ctx := context.Background() packages, _, err := client.Organizations.ListPackages(ctx, "o", &PackageListOptions{}) if err != nil { t.Errorf("Organizations.ListPackages returned error: %v", err) } want := []*Package{{ ID: Int64(197), Name: String("hello_docker"), PackageType: String("container"), VersionCount: Int64(1), Visibility: String("private"), URL: String("https://api.github.com/orgs/github/packages/container/hello_docker"), HTMLURL: String("https://github.com/orgs/github/packages/container/package/hello_docker"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, Owner: &User{ Login: String("github"), ID: Int64(9919), NodeID: String("MDEyOk9yZ2FuaXphdGlvbjk5MTk="), AvatarURL: String("https://avatars.githubusercontent.com/u/9919?v=4"), GravatarID: String(""), URL: String("https://api.github.com/users/github"), HTMLURL: String("https://github.com/github"), FollowersURL: String("https://api.github.com/users/github/followers"), FollowingURL: String("https://api.github.com/users/github/following{/other_user}"), GistsURL: String("https://api.github.com/users/github/gists{/gist_id}"), StarredURL: String("https://api.github.com/users/github/starred{/owner}{/repo}"), SubscriptionsURL: String("https://api.github.com/users/github/subscriptions"), OrganizationsURL: String("https://api.github.com/users/github/orgs"), ReposURL: String("https://api.github.com/users/github/repos"), EventsURL: String("https://api.github.com/users/github/events{/privacy}"), ReceivedEventsURL: String("https://api.github.com/users/github/received_events"), Type: String("Organization"), SiteAdmin: Bool(false), }, }} if !cmp.Equal(packages, want) { t.Errorf("Organizations.ListPackages returned %+v, want %+v", packages, want) } const methodName = "ListPackages" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListPackages(ctx, "\n", &PackageListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListPackages(ctx, "o", &PackageListOptions{}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_GetPackage(t *testing.T) { client, mux, _, teardown := setup() defer teardown() // don't url escape the package name here since mux will convert it to a slash automatically mux.HandleFunc("/orgs/o/packages/container/hello/hello_docker", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") _, err := io.WriteString(w, `{ "id": 197, "name": "hello/hello_docker", "package_type": "container", "version_count": 1, "visibility": "private", "url": "https://api.github.com/orgs/github/packages/container/hello%2Fhello_docker", "created_at": `+referenceTimeStr+`, "updated_at": `+referenceTimeStr+`, "html_url": "https://github.com/orgs/github/packages/container/package/hello%2Fhello_docker" }`) if err != nil { t.Fatal("Failed to write test response: ", err) } }) ctx := context.Background() packages, _, err := client.Organizations.GetPackage(ctx, "o", "container", "hello/hello_docker") if err != nil { t.Errorf("Organizations.GetPackage returned error: %v", err) } want := &Package{ ID: Int64(197), Name: String("hello/hello_docker"), PackageType: String("container"), VersionCount: Int64(1), Visibility: String("private"), URL: String("https://api.github.com/orgs/github/packages/container/hello%2Fhello_docker"), HTMLURL: String("https://github.com/orgs/github/packages/container/package/hello%2Fhello_docker"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, } if !cmp.Equal(packages, want) { t.Errorf("Organizations.GetPackage returned %+v, want %+v", packages, want) } const methodName = "GetPackage" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.GetPackage(ctx, "\n", "", "") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.GetPackage(ctx, "", "", "") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_DeletePackage(t *testing.T) { client, mux, _, teardown := setup() defer teardown() // don't url escape the package name here since mux will convert it to a slash automatically mux.HandleFunc("/orgs/o/packages/container/hello/hello_docker", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Organizations.DeletePackage(ctx, "o", "container", "hello/hello_docker") if err != nil { t.Errorf("Organizations.DeletePackage returned error: %v", err) } const methodName = "DeletePackage" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.GetPackage(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.GetPackage(ctx, "", "", "") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_RestorePackage(t *testing.T) { client, mux, _, teardown := setup() defer teardown() // don't url escape the package name here since mux will convert it to a slash automatically mux.HandleFunc("/orgs/o/packages/container/hello/hello_docker/restore", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") }) ctx := context.Background() _, err := client.Organizations.RestorePackage(ctx, "o", "container", "hello/hello_docker") if err != nil { t.Errorf("Organizations.RestorePackage returned error: %v", err) } const methodName = "RestorePackage" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.RestorePackage(ctx, "\n", "", "") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.RestorePackage(ctx, "", "container", "hello/hello_docker") }) } func TestOrganizationsService_ListPackagesVersions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() // don't url escape the package name here since mux will convert it to a slash automatically mux.HandleFunc("/orgs/o/packages/container/hello/hello_docker/versions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"per_page": "2", "page": "1", "state": "deleted", "visibility": "internal", "package_type": "container"}) _, err := io.WriteString(w, `[ { "id": 45763, "name": "sha256:08a44bab0bddaddd8837a8b381aebc2e4b933768b981685a9e088360af0d3dd9", "url": "https://api.github.com/users/octocat/packages/container/hello%2Fhello_docker/versions/45763", "package_html_url": "https://github.com/users/octocat/packages/container/package/hello%2Fhello_docker", "created_at": `+referenceTimeStr+`, "updated_at": `+referenceTimeStr+`, "html_url": "https://github.com/users/octocat/packages/container/hello%2Fhello_docker/45763", "metadata": { "package_type": "container", "container": { "tags": [ "latest" ] } } }]`) if err != nil { t.Fatal("Failed to write test response: ", err) } }) ctx := context.Background() opts := &PackageListOptions{ String("internal"), String("container"), String("deleted"), ListOptions{Page: 1, PerPage: 2}, } packages, _, err := client.Organizations.PackageGetAllVersions(ctx, "o", "container", "hello/hello_docker", opts) if err != nil { t.Errorf("Organizations.PackageGetAllVersions returned error: %v", err) } want := []*PackageVersion{{ ID: Int64(45763), Name: String("sha256:08a44bab0bddaddd8837a8b381aebc2e4b933768b981685a9e088360af0d3dd9"), URL: String("https://api.github.com/users/octocat/packages/container/hello%2Fhello_docker/versions/45763"), PackageHTMLURL: String("https://github.com/users/octocat/packages/container/package/hello%2Fhello_docker"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HTMLURL: String("https://github.com/users/octocat/packages/container/hello%2Fhello_docker/45763"), Metadata: &PackageMetadata{ PackageType: String("container"), Container: &PackageContainerMetadata{ Tags: []string{"latest"}, }, }, }} if !cmp.Equal(packages, want) { t.Errorf("Organizations.PackageGetAllVersions returned %+v, want %+v", packages, want) } const methodName = "PackageGetAllVersions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.PackageGetAllVersions(ctx, "\n", "", "", &PackageListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.PackageGetAllVersions(ctx, "", "", "", &PackageListOptions{}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_PackageGetVersion(t *testing.T) { client, mux, _, teardown := setup() defer teardown() // don't url escape the package name here since mux will convert it to a slash automatically mux.HandleFunc("/orgs/o/packages/container/hello/hello_docker/versions/45763", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") _, err := io.WriteString(w, ` { "id": 45763, "name": "sha256:08a44bab0bddaddd8837a8b381aebc2e4b933768b981685a9e088360af0d3dd9", "url": "https://api.github.com/users/octocat/packages/container/hello%2Fhello_docker/versions/45763", "package_html_url": "https://github.com/users/octocat/packages/container/package/hello%2Fhello_docker", "created_at": `+referenceTimeStr+`, "updated_at": `+referenceTimeStr+`, "html_url": "https://github.com/users/octocat/packages/container/hello%2Fhello_docker/45763", "metadata": { "package_type": "container", "container": { "tags": [ "latest" ] } } }`) if err != nil { t.Fatal("Failed to write test response: ", err) } }) ctx := context.Background() packages, _, err := client.Organizations.PackageGetVersion(ctx, "o", "container", "hello/hello_docker", 45763) if err != nil { t.Errorf("Organizations.PackageGetVersion returned error: %v", err) } want := &PackageVersion{ ID: Int64(45763), Name: String("sha256:08a44bab0bddaddd8837a8b381aebc2e4b933768b981685a9e088360af0d3dd9"), URL: String("https://api.github.com/users/octocat/packages/container/hello%2Fhello_docker/versions/45763"), PackageHTMLURL: String("https://github.com/users/octocat/packages/container/package/hello%2Fhello_docker"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HTMLURL: String("https://github.com/users/octocat/packages/container/hello%2Fhello_docker/45763"), Metadata: &PackageMetadata{ PackageType: String("container"), Container: &PackageContainerMetadata{ Tags: []string{"latest"}, }, }, } if !cmp.Equal(packages, want) { t.Errorf("Organizations.PackageGetVersion returned %+v, want %+v", packages, want) } const methodName = "PackageGetVersion" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.PackageGetVersion(ctx, "\n", "", "", 0) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.PackageGetVersion(ctx, "", "", "", 45763) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_PackageDeleteVersion(t *testing.T) { client, mux, _, teardown := setup() defer teardown() // don't url escape the package name here since mux will convert it to a slash automatically mux.HandleFunc("/orgs/o/packages/container/hello/hello_docker/versions/45763", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Organizations.PackageDeleteVersion(ctx, "o", "container", "hello/hello_docker", 45763) if err != nil { t.Errorf("Organizations.PackageDeleteVersion returned error: %v", err) } const methodName = "PackageDeleteVersion" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.PackageDeleteVersion(ctx, "\n", "", "", 0) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.PackageDeleteVersion(ctx, "", "", "", 45763) }) } func TestOrganizationsService_PackageRestoreVersion(t *testing.T) { client, mux, _, teardown := setup() defer teardown() // don't url escape the package name here since mux will convert it to a slash automatically mux.HandleFunc("/orgs/o/packages/container/hello/hello_docker/versions/45763/restore", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") }) ctx := context.Background() _, err := client.Organizations.PackageRestoreVersion(ctx, "o", "container", "hello/hello_docker", 45763) if err != nil { t.Errorf("Organizations.PackageRestoreVersion returned error: %v", err) } const methodName = "PackageRestoreVersion" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.PackageRestoreVersion(ctx, "\n", "", "", 0) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.PackageRestoreVersion(ctx, "", "", "", 45763) }) } go-github-60.0.0/github/orgs_personal_access_tokens.go000066400000000000000000000026361457013574700231000ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // ReviewPersonalAccessTokenRequestOptions specifies the parameters to the ReviewPersonalAccessTokenRequest method. type ReviewPersonalAccessTokenRequestOptions struct { Action string `json:"action"` Reason *string `json:"reason,omitempty"` } // ReviewPersonalAccessTokenRequest approves or denies a pending request to access organization resources via a fine-grained personal access token. // Only GitHub Apps can call this API, using the `organization_personal_access_token_requests: write` permission. // `action` can be one of `approve` or `deny`. // // GitHub API docs: https://docs.github.com/rest/orgs/personal-access-tokens#review-a-request-to-access-organization-resources-with-a-fine-grained-personal-access-token // //meta:operation POST /orgs/{org}/personal-access-token-requests/{pat_request_id} func (s *OrganizationsService) ReviewPersonalAccessTokenRequest(ctx context.Context, org string, requestID int64, opts ReviewPersonalAccessTokenRequestOptions) (*Response, error) { u := fmt.Sprintf("orgs/%v/personal-access-token-requests/%v", org, requestID) req, err := s.client.NewRequest(http.MethodPost, u, &opts) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/orgs_personal_access_tokens_test.go000066400000000000000000000036721457013574700241400ustar00rootroot00000000000000// Copyright 2023 The go-github 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 TestOrganizationsService_ReviewPersonalAccessTokenRequest(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := ReviewPersonalAccessTokenRequestOptions{ Action: "a", Reason: String("r"), } mux.HandleFunc("/orgs/o/personal-access-token-requests/1", func(w http.ResponseWriter, r *http.Request) { v := new(ReviewPersonalAccessTokenRequestOptions) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, http.MethodPost) if !cmp.Equal(v, &input) { t.Errorf("Request body = %+v, want %+v", v, input) } w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() res, err := client.Organizations.ReviewPersonalAccessTokenRequest(ctx, "o", 1, input) if err != nil { t.Errorf("Organizations.ReviewPersonalAccessTokenRequest returned error: %v", err) } if res.StatusCode != http.StatusNoContent { t.Errorf("Organizations.ReviewPersonalAccessTokenRequest returned %v, want %v", res.StatusCode, http.StatusNoContent) } const methodName = "ReviewPersonalAccessTokenRequest" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.ReviewPersonalAccessTokenRequest(ctx, "\n", 0, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.ReviewPersonalAccessTokenRequest(ctx, "o", 1, input) }) } func TestReviewPersonalAccessTokenRequestOptions_Marshal(t *testing.T) { testJSONMarshal(t, &ReviewPersonalAccessTokenRequestOptions{}, "{}") u := &ReviewPersonalAccessTokenRequestOptions{ Action: "a", Reason: String("r"), } want := `{ "action": "a", "reason": "r" }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/orgs_projects.go000066400000000000000000000033651457013574700202020ustar00rootroot00000000000000// 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/rest/projects/projects#list-organization-projects // //meta:operation GET /orgs/{org}/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/rest/projects/projects#create-an-organization-project // //meta:operation POST /orgs/{org}/projects 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-60.0.0/github/orgs_projects_test.go000066400000000000000000000054761457013574700212460ustar00rootroot00000000000000// 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{} assertNilError(t, 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-60.0.0/github/orgs_properties.go000066400000000000000000000157231457013574700205460ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // CustomProperty represents an organization custom property object. type CustomProperty struct { // PropertyName is required for most endpoints except when calling CreateOrUpdateCustomProperty; // where this is sent in the path and thus can be omitted. PropertyName *string `json:"property_name,omitempty"` // Possible values for ValueType are: string, single_select ValueType string `json:"value_type"` Required *bool `json:"required,omitempty"` DefaultValue *string `json:"default_value,omitempty"` Description *string `json:"description,omitempty"` AllowedValues []string `json:"allowed_values,omitempty"` } // RepoCustomPropertyValue represents a repository custom property value. type RepoCustomPropertyValue struct { RepositoryID int64 `json:"repository_id"` RepositoryName string `json:"repository_name"` RepositoryFullName string `json:"repository_full_name"` Properties []*CustomPropertyValue `json:"properties"` } // CustomPropertyValue represents a custom property value. type CustomPropertyValue struct { PropertyName string `json:"property_name"` Value *string `json:"value,omitempty"` } // GetAllCustomProperties gets all custom properties that are defined for the specified organization. // // GitHub API docs: https://docs.github.com/rest/orgs/custom-properties#get-all-custom-properties-for-an-organization // //meta:operation GET /orgs/{org}/properties/schema func (s *OrganizationsService) GetAllCustomProperties(ctx context.Context, org string) ([]*CustomProperty, *Response, error) { u := fmt.Sprintf("orgs/%v/properties/schema", org) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var customProperties []*CustomProperty resp, err := s.client.Do(ctx, req, &customProperties) if err != nil { return nil, resp, err } return customProperties, resp, nil } // CreateOrUpdateCustomProperties creates new or updates existing custom properties that are defined for the specified organization. // // GitHub API docs: https://docs.github.com/rest/orgs/custom-properties#create-or-update-custom-properties-for-an-organization // //meta:operation PATCH /orgs/{org}/properties/schema func (s *OrganizationsService) CreateOrUpdateCustomProperties(ctx context.Context, org string, properties []*CustomProperty) ([]*CustomProperty, *Response, error) { u := fmt.Sprintf("orgs/%v/properties/schema", org) params := struct { Properties []*CustomProperty `json:"properties"` }{ Properties: properties, } req, err := s.client.NewRequest("PATCH", u, params) if err != nil { return nil, nil, err } var customProperties []*CustomProperty resp, err := s.client.Do(ctx, req, &customProperties) if err != nil { return nil, resp, err } return customProperties, resp, nil } // GetCustomProperty gets a custom property that is defined for the specified organization. // // GitHub API docs: https://docs.github.com/rest/orgs/custom-properties#get-a-custom-property-for-an-organization // //meta:operation GET /orgs/{org}/properties/schema/{custom_property_name} func (s *OrganizationsService) GetCustomProperty(ctx context.Context, org, name string) (*CustomProperty, *Response, error) { u := fmt.Sprintf("orgs/%v/properties/schema/%v", org, name) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var customProperty *CustomProperty resp, err := s.client.Do(ctx, req, &customProperty) if err != nil { return nil, resp, err } return customProperty, resp, nil } // CreateOrUpdateCustomProperty creates a new or updates an existing custom property that is defined for the specified organization. // // GitHub API docs: https://docs.github.com/rest/orgs/custom-properties#create-or-update-a-custom-property-for-an-organization // //meta:operation PUT /orgs/{org}/properties/schema/{custom_property_name} func (s *OrganizationsService) CreateOrUpdateCustomProperty(ctx context.Context, org, customPropertyName string, property *CustomProperty) (*CustomProperty, *Response, error) { u := fmt.Sprintf("orgs/%v/properties/schema/%v", org, customPropertyName) req, err := s.client.NewRequest("PUT", u, property) if err != nil { return nil, nil, err } var customProperty *CustomProperty resp, err := s.client.Do(ctx, req, &customProperty) if err != nil { return nil, resp, err } return customProperty, resp, nil } // RemoveCustomProperty removes a custom property that is defined for the specified organization. // // GitHub API docs: https://docs.github.com/rest/orgs/custom-properties#remove-a-custom-property-for-an-organization // //meta:operation DELETE /orgs/{org}/properties/schema/{custom_property_name} func (s *OrganizationsService) RemoveCustomProperty(ctx context.Context, org, customPropertyName string) (*Response, error) { u := fmt.Sprintf("orgs/%v/properties/schema/%v", org, customPropertyName) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // ListCustomPropertyValues lists all custom property values for repositories in the specified organization. // // GitHub API docs: https://docs.github.com/rest/orgs/custom-properties#list-custom-property-values-for-organization-repositories // //meta:operation GET /orgs/{org}/properties/values func (s *OrganizationsService) ListCustomPropertyValues(ctx context.Context, org string, opts *ListOptions) ([]*RepoCustomPropertyValue, *Response, error) { u := fmt.Sprintf("orgs/%v/properties/values", 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 repoCustomPropertyValues []*RepoCustomPropertyValue resp, err := s.client.Do(ctx, req, &repoCustomPropertyValues) if err != nil { return nil, resp, err } return repoCustomPropertyValues, resp, nil } // CreateOrUpdateRepoCustomPropertyValues creates new or updates existing custom property values across multiple repositories for the specified organization. // // GitHub API docs: https://docs.github.com/rest/orgs/custom-properties#create-or-update-custom-property-values-for-organization-repositories // //meta:operation PATCH /orgs/{org}/properties/values func (s *OrganizationsService) CreateOrUpdateRepoCustomPropertyValues(ctx context.Context, org string, repoNames []string, properties []*CustomPropertyValue) (*Response, error) { u := fmt.Sprintf("orgs/%v/properties/values", org) params := struct { RepositoryNames []string `json:"repository_names"` Properties []*CustomPropertyValue `json:"properties"` }{ RepositoryNames: repoNames, Properties: properties, } req, err := s.client.NewRequest("PATCH", u, params) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/orgs_properties_test.go000066400000000000000000000246521457013574700216060ustar00rootroot00000000000000// Copyright 2023 The go-github 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_GetAllCustomProperties(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/properties/schema", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[ { "property_name": "name", "value_type": "single_select", "required": true, "default_value": "production", "description": "Prod or dev environment", "allowed_values":[ "production", "development" ] }, { "property_name": "service", "value_type": "string" }, { "property_name": "team", "value_type": "string", "description": "Team owning the repository" } ]`) }) ctx := context.Background() properties, _, err := client.Organizations.GetAllCustomProperties(ctx, "o") if err != nil { t.Errorf("Organizations.GetAllCustomProperties returned error: %v", err) } want := []*CustomProperty{ { PropertyName: String("name"), ValueType: "single_select", Required: Bool(true), DefaultValue: String("production"), Description: String("Prod or dev environment"), AllowedValues: []string{"production", "development"}, }, { PropertyName: String("service"), ValueType: "string", }, { PropertyName: String("team"), ValueType: "string", Description: String("Team owning the repository"), }, } if !cmp.Equal(properties, want) { t.Errorf("Organizations.GetAllCustomProperties returned %+v, want %+v", properties, want) } const methodName = "GetAllCustomProperties" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.GetAllCustomProperties(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_CreateOrUpdateCustomProperties(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/properties/schema", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") testBody(t, r, `{"properties":[{"property_name":"name","value_type":"single_select","required":true},{"property_name":"service","value_type":"string"}]}`+"\n") fmt.Fprint(w, `[ { "property_name": "name", "value_type": "single_select", "required": true }, { "property_name": "service", "value_type": "string" } ]`) }) ctx := context.Background() properties, _, err := client.Organizations.CreateOrUpdateCustomProperties(ctx, "o", []*CustomProperty{ { PropertyName: String("name"), ValueType: "single_select", Required: Bool(true), }, { PropertyName: String("service"), ValueType: "string", }, }) if err != nil { t.Errorf("Organizations.CreateOrUpdateCustomProperties returned error: %v", err) } want := []*CustomProperty{ { PropertyName: String("name"), ValueType: "single_select", Required: Bool(true), }, { PropertyName: String("service"), ValueType: "string", }, } if !cmp.Equal(properties, want) { t.Errorf("Organizations.CreateOrUpdateCustomProperties returned %+v, want %+v", properties, want) } const methodName = "CreateOrUpdateCustomProperties" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.CreateOrUpdateCustomProperties(ctx, "o", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_GetCustomProperty(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/properties/schema/name", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "property_name": "name", "value_type": "single_select", "required": true, "default_value": "production", "description": "Prod or dev environment", "allowed_values":[ "production", "development" ] }`) }) ctx := context.Background() property, _, err := client.Organizations.GetCustomProperty(ctx, "o", "name") if err != nil { t.Errorf("Organizations.GetCustomProperty returned error: %v", err) } want := &CustomProperty{ PropertyName: String("name"), ValueType: "single_select", Required: Bool(true), DefaultValue: String("production"), Description: String("Prod or dev environment"), AllowedValues: []string{"production", "development"}, } if !cmp.Equal(property, want) { t.Errorf("Organizations.GetCustomProperty returned %+v, want %+v", property, want) } const methodName = "GetCustomProperty" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.GetCustomProperty(ctx, "o", "name") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_CreateOrUpdateCustomProperty(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/properties/schema/name", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") fmt.Fprint(w, `{ "property_name": "name", "value_type": "single_select", "required": true, "default_value": "production", "description": "Prod or dev environment", "allowed_values":[ "production", "development" ] }`) }) ctx := context.Background() property, _, err := client.Organizations.CreateOrUpdateCustomProperty(ctx, "o", "name", &CustomProperty{ ValueType: "single_select", Required: Bool(true), DefaultValue: String("production"), Description: String("Prod or dev environment"), AllowedValues: []string{"production", "development"}, }) if err != nil { t.Errorf("Organizations.CreateOrUpdateCustomProperty returned error: %v", err) } want := &CustomProperty{ PropertyName: String("name"), ValueType: "single_select", Required: Bool(true), DefaultValue: String("production"), Description: String("Prod or dev environment"), AllowedValues: []string{"production", "development"}, } if !cmp.Equal(property, want) { t.Errorf("Organizations.CreateOrUpdateCustomProperty returned %+v, want %+v", property, want) } const methodName = "CreateOrUpdateCustomProperty" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.CreateOrUpdateCustomProperty(ctx, "o", "name", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_RemoveCustomProperty(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/properties/schema/name", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Organizations.RemoveCustomProperty(ctx, "o", "name") if err != nil { t.Errorf("Organizations.RemoveCustomProperty returned error: %v", err) } const methodName = "RemoveCustomProperty" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.RemoveCustomProperty(ctx, "0", "name") }) } func TestOrganizationsService_ListCustomPropertyValues(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/properties/values", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "1", "per_page": "100"}) fmt.Fprint(w, `[{ "repository_id": 1296269, "repository_name": "Hello-World", "repository_full_name": "octocat/Hello-World", "properties": [ { "property_name": "environment", "value": "production" }, { "property_name": "service", "value": "web" } ] }]`) }) ctx := context.Background() repoPropertyValues, _, err := client.Organizations.ListCustomPropertyValues(ctx, "o", &ListOptions{ Page: 1, PerPage: 100, }) if err != nil { t.Errorf("Organizations.ListCustomPropertyValues returned error: %v", err) } want := []*RepoCustomPropertyValue{ { RepositoryID: 1296269, RepositoryName: "Hello-World", RepositoryFullName: "octocat/Hello-World", Properties: []*CustomPropertyValue{ { PropertyName: "environment", Value: String("production"), }, { PropertyName: "service", Value: String("web"), }, }, }, } if !cmp.Equal(repoPropertyValues, want) { t.Errorf("Organizations.ListCustomPropertyValues returned %+v, want %+v", repoPropertyValues, want) } const methodName = "ListCustomPropertyValues" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListCustomPropertyValues(ctx, "\n", &ListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListCustomPropertyValues(ctx, "o", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_CreateOrUpdateRepoCustomPropertyValues(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/properties/values", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") testBody(t, r, `{"repository_names":["repo"],"properties":[{"property_name":"service","value":"string"}]}`+"\n") }) ctx := context.Background() _, err := client.Organizations.CreateOrUpdateRepoCustomPropertyValues(ctx, "o", []string{"repo"}, []*CustomPropertyValue{ { PropertyName: "service", Value: String("string"), }, }) if err != nil { t.Errorf("Organizations.CreateOrUpdateCustomPropertyValuesForRepos returned error: %v", err) } const methodName = "CreateOrUpdateCustomPropertyValuesForRepos" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.CreateOrUpdateRepoCustomPropertyValues(ctx, "o", nil, nil) }) } go-github-60.0.0/github/orgs_rules.go000066400000000000000000000065171457013574700175050ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // GetAllOrganizationRulesets gets all the rulesets for the specified organization. // // GitHub API docs: https://docs.github.com/rest/orgs/rules#get-all-organization-repository-rulesets // //meta:operation GET /orgs/{org}/rulesets func (s *OrganizationsService) GetAllOrganizationRulesets(ctx context.Context, org string) ([]*Ruleset, *Response, error) { u := fmt.Sprintf("orgs/%v/rulesets", org) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var rulesets []*Ruleset resp, err := s.client.Do(ctx, req, &rulesets) if err != nil { return nil, resp, err } return rulesets, resp, nil } // CreateOrganizationRuleset creates a ruleset for the specified organization. // // GitHub API docs: https://docs.github.com/rest/orgs/rules#create-an-organization-repository-ruleset // //meta:operation POST /orgs/{org}/rulesets func (s *OrganizationsService) CreateOrganizationRuleset(ctx context.Context, org string, rs *Ruleset) (*Ruleset, *Response, error) { u := fmt.Sprintf("orgs/%v/rulesets", org) req, err := s.client.NewRequest("POST", u, rs) if err != nil { return nil, nil, err } var ruleset *Ruleset resp, err := s.client.Do(ctx, req, &ruleset) if err != nil { return nil, resp, err } return ruleset, resp, nil } // GetOrganizationRuleset gets a ruleset from the specified organization. // // GitHub API docs: https://docs.github.com/rest/orgs/rules#get-an-organization-repository-ruleset // //meta:operation GET /orgs/{org}/rulesets/{ruleset_id} func (s *OrganizationsService) GetOrganizationRuleset(ctx context.Context, org string, rulesetID int64) (*Ruleset, *Response, error) { u := fmt.Sprintf("orgs/%v/rulesets/%v", org, rulesetID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var ruleset *Ruleset resp, err := s.client.Do(ctx, req, &ruleset) if err != nil { return nil, resp, err } return ruleset, resp, nil } // UpdateOrganizationRuleset updates a ruleset from the specified organization. // // GitHub API docs: https://docs.github.com/rest/orgs/rules#update-an-organization-repository-ruleset // //meta:operation PUT /orgs/{org}/rulesets/{ruleset_id} func (s *OrganizationsService) UpdateOrganizationRuleset(ctx context.Context, org string, rulesetID int64, rs *Ruleset) (*Ruleset, *Response, error) { u := fmt.Sprintf("orgs/%v/rulesets/%v", org, rulesetID) req, err := s.client.NewRequest("PUT", u, rs) if err != nil { return nil, nil, err } var ruleset *Ruleset resp, err := s.client.Do(ctx, req, &ruleset) if err != nil { return nil, resp, err } return ruleset, resp, nil } // DeleteOrganizationRuleset deletes a ruleset from the specified organization. // // GitHub API docs: https://docs.github.com/rest/orgs/rules#delete-an-organization-repository-ruleset // //meta:operation DELETE /orgs/{org}/rulesets/{ruleset_id} func (s *OrganizationsService) DeleteOrganizationRuleset(ctx context.Context, org string, rulesetID int64) (*Response, error) { u := fmt.Sprintf("orgs/%v/rulesets/%v", org, rulesetID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/orgs_rules_test.go000066400000000000000000000577711457013574700205540ustar00rootroot00000000000000// Copyright 2023 The go-github 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_GetAllOrganizationRulesets(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/rulesets", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{ "id": 26110, "name": "test ruleset", "target": "branch", "source_type": "Organization", "source": "o", "enforcement": "active", "bypass_mode": "none", "node_id": "nid", "_links": { "self": { "href": "https://api.github.com/orgs/o/rulesets/26110" } } }]`) }) ctx := context.Background() rulesets, _, err := client.Organizations.GetAllOrganizationRulesets(ctx, "o") if err != nil { t.Errorf("Organizations.GetAllOrganizationRulesets returned error: %v", err) } want := []*Ruleset{{ ID: Int64(26110), Name: "test ruleset", Target: String("branch"), SourceType: String("Organization"), Source: "o", Enforcement: "active", NodeID: String("nid"), Links: &RulesetLinks{ Self: &RulesetLink{HRef: String("https://api.github.com/orgs/o/rulesets/26110")}, }, }} if !cmp.Equal(rulesets, want) { t.Errorf("Organizations.GetAllOrganizationRulesets returned %+v, want %+v", rulesets, want) } const methodName = "GetAllOrganizationRulesets" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.GetAllOrganizationRulesets(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_CreateOrganizationRuleset_RepoNames(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/rulesets", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{ "id": 21, "name": "ruleset", "target": "branch", "source_type": "Organization", "source": "o", "enforcement": "active", "bypass_actors": [ { "actor_id": 234, "actor_type": "Team" } ], "conditions": { "ref_name": { "include": [ "refs/heads/main", "refs/heads/master" ], "exclude": [ "refs/heads/dev*" ] }, "repository_name": { "include": [ "important_repository", "another_important_repository" ], "exclude": [ "unimportant_repository" ], "protected": true } }, "rules": [ { "type": "creation" }, { "type": "update", "parameters": { "update_allows_fetch_and_merge": true } }, { "type": "deletion" }, { "type": "required_linear_history" }, { "type": "required_deployments", "parameters": { "required_deployment_environments": ["test"] } }, { "type": "required_signatures" }, { "type": "pull_request", "parameters": { "dismiss_stale_reviews_on_push": true, "require_code_owner_review": true, "require_last_push_approval": true, "required_approving_review_count": 1, "required_review_thread_resolution": true } }, { "type": "required_status_checks", "parameters": { "required_status_checks": [ { "context": "test", "integration_id": 1 } ], "strict_required_status_checks_policy": true } }, { "type": "non_fast_forward" }, { "type": "commit_message_pattern", "parameters": { "name": "avoid test commits", "negate": true, "operator": "starts_with", "pattern": "[test]" } }, { "type": "commit_author_email_pattern", "parameters": { "operator": "contains", "pattern": "github" } }, { "type": "committer_email_pattern", "parameters": { "name": "avoid commit emails", "negate": true, "operator": "ends_with", "pattern": "abc" } }, { "type": "branch_name_pattern", "parameters": { "name": "avoid branch names", "negate": true, "operator": "regex", "pattern": "github$" } }, { "type": "tag_name_pattern", "parameters": { "name": "avoid tag names", "negate": true, "operator": "contains", "pattern": "github" } } ] }`) }) ctx := context.Background() ruleset, _, err := client.Organizations.CreateOrganizationRuleset(ctx, "o", &Ruleset{ ID: Int64(21), Name: "ruleset", Target: String("branch"), SourceType: String("Organization"), Source: "o", Enforcement: "active", BypassActors: []*BypassActor{ { ActorID: Int64(234), ActorType: String("Team"), }, }, Conditions: &RulesetConditions{ RefName: &RulesetRefConditionParameters{ Include: []string{"refs/heads/main", "refs/heads/master"}, Exclude: []string{"refs/heads/dev*"}, }, RepositoryName: &RulesetRepositoryNamesConditionParameters{ Include: []string{"important_repository", "another_important_repository"}, Exclude: []string{"unimportant_repository"}, Protected: Bool(true), }, }, Rules: []*RepositoryRule{ NewCreationRule(), NewUpdateRule(&UpdateAllowsFetchAndMergeRuleParameters{ UpdateAllowsFetchAndMerge: true, }), NewDeletionRule(), NewRequiredLinearHistoryRule(), NewRequiredDeploymentsRule(&RequiredDeploymentEnvironmentsRuleParameters{ RequiredDeploymentEnvironments: []string{"test"}, }), NewRequiredSignaturesRule(), NewPullRequestRule(&PullRequestRuleParameters{ RequireCodeOwnerReview: true, RequireLastPushApproval: true, RequiredApprovingReviewCount: 1, RequiredReviewThreadResolution: true, DismissStaleReviewsOnPush: true, }), NewRequiredStatusChecksRule(&RequiredStatusChecksRuleParameters{ RequiredStatusChecks: []RuleRequiredStatusChecks{ { Context: "test", IntegrationID: Int64(1), }, }, StrictRequiredStatusChecksPolicy: true, }), NewNonFastForwardRule(), NewCommitMessagePatternRule(&RulePatternParameters{ Name: String("avoid test commits"), Negate: Bool(true), Operator: "starts_with", Pattern: "[test]", }), NewCommitAuthorEmailPatternRule(&RulePatternParameters{ Operator: "contains", Pattern: "github", }), NewCommitterEmailPatternRule(&RulePatternParameters{ Name: String("avoid commit emails"), Negate: Bool(true), Operator: "ends_with", Pattern: "abc", }), NewBranchNamePatternRule(&RulePatternParameters{ Name: String("avoid branch names"), Negate: Bool(true), Operator: "regex", Pattern: "github$", }), NewTagNamePatternRule(&RulePatternParameters{ Name: String("avoid tag names"), Negate: Bool(true), Operator: "contains", Pattern: "github", }), }, }) if err != nil { t.Errorf("Organizations.CreateOrganizationRuleset returned error: %v", err) } want := &Ruleset{ ID: Int64(21), Name: "ruleset", Target: String("branch"), SourceType: String("Organization"), Source: "o", Enforcement: "active", BypassActors: []*BypassActor{ { ActorID: Int64(234), ActorType: String("Team"), }, }, Conditions: &RulesetConditions{ RefName: &RulesetRefConditionParameters{ Include: []string{"refs/heads/main", "refs/heads/master"}, Exclude: []string{"refs/heads/dev*"}, }, RepositoryName: &RulesetRepositoryNamesConditionParameters{ Include: []string{"important_repository", "another_important_repository"}, Exclude: []string{"unimportant_repository"}, Protected: Bool(true), }, }, Rules: []*RepositoryRule{ NewCreationRule(), NewUpdateRule(&UpdateAllowsFetchAndMergeRuleParameters{ UpdateAllowsFetchAndMerge: true, }), NewDeletionRule(), NewRequiredLinearHistoryRule(), NewRequiredDeploymentsRule(&RequiredDeploymentEnvironmentsRuleParameters{ RequiredDeploymentEnvironments: []string{"test"}, }), NewRequiredSignaturesRule(), NewPullRequestRule(&PullRequestRuleParameters{ RequireCodeOwnerReview: true, RequireLastPushApproval: true, RequiredApprovingReviewCount: 1, RequiredReviewThreadResolution: true, DismissStaleReviewsOnPush: true, }), NewRequiredStatusChecksRule(&RequiredStatusChecksRuleParameters{ RequiredStatusChecks: []RuleRequiredStatusChecks{ { Context: "test", IntegrationID: Int64(1), }, }, StrictRequiredStatusChecksPolicy: true, }), NewNonFastForwardRule(), NewCommitMessagePatternRule(&RulePatternParameters{ Name: String("avoid test commits"), Negate: Bool(true), Operator: "starts_with", Pattern: "[test]", }), NewCommitAuthorEmailPatternRule(&RulePatternParameters{ Operator: "contains", Pattern: "github", }), NewCommitterEmailPatternRule(&RulePatternParameters{ Name: String("avoid commit emails"), Negate: Bool(true), Operator: "ends_with", Pattern: "abc", }), NewBranchNamePatternRule(&RulePatternParameters{ Name: String("avoid branch names"), Negate: Bool(true), Operator: "regex", Pattern: "github$", }), NewTagNamePatternRule(&RulePatternParameters{ Name: String("avoid tag names"), Negate: Bool(true), Operator: "contains", Pattern: "github", }), }, } if !cmp.Equal(ruleset, want) { t.Errorf("Organizations.CreateOrganizationRuleset returned %+v, want %+v", ruleset, want) } const methodName = "CreateOrganizationRuleset" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.CreateOrganizationRuleset(ctx, "o", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_CreateOrganizationRuleset_RepoIDs(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/rulesets", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{ "id": 21, "name": "ruleset", "target": "branch", "source_type": "Organization", "source": "o", "enforcement": "active", "bypass_actors": [ { "actor_id": 234, "actor_type": "Team" } ], "conditions": { "ref_name": { "include": [ "refs/heads/main", "refs/heads/master" ], "exclude": [ "refs/heads/dev*" ] }, "repository_id": { "repository_ids": [ 123, 456 ] } }, "rules": [ { "type": "creation" }, { "type": "update", "parameters": { "update_allows_fetch_and_merge": true } }, { "type": "deletion" }, { "type": "required_linear_history" }, { "type": "required_deployments", "parameters": { "required_deployment_environments": ["test"] } }, { "type": "required_signatures" }, { "type": "pull_request", "parameters": { "dismiss_stale_reviews_on_push": true, "require_code_owner_review": true, "require_last_push_approval": true, "required_approving_review_count": 1, "required_review_thread_resolution": true } }, { "type": "required_status_checks", "parameters": { "required_status_checks": [ { "context": "test", "integration_id": 1 } ], "strict_required_status_checks_policy": true } }, { "type": "non_fast_forward" }, { "type": "commit_message_pattern", "parameters": { "name": "avoid test commits", "negate": true, "operator": "starts_with", "pattern": "[test]" } }, { "type": "commit_author_email_pattern", "parameters": { "operator": "contains", "pattern": "github" } }, { "type": "committer_email_pattern", "parameters": { "name": "avoid commit emails", "negate": true, "operator": "ends_with", "pattern": "abc" } }, { "type": "branch_name_pattern", "parameters": { "name": "avoid branch names", "negate": true, "operator": "regex", "pattern": "github$" } }, { "type": "tag_name_pattern", "parameters": { "name": "avoid tag names", "negate": true, "operator": "contains", "pattern": "github" } } ] }`) }) ctx := context.Background() ruleset, _, err := client.Organizations.CreateOrganizationRuleset(ctx, "o", &Ruleset{ ID: Int64(21), Name: "ruleset", Target: String("branch"), SourceType: String("Organization"), Source: "o", Enforcement: "active", BypassActors: []*BypassActor{ { ActorID: Int64(234), ActorType: String("Team"), }, }, Conditions: &RulesetConditions{ RefName: &RulesetRefConditionParameters{ Include: []string{"refs/heads/main", "refs/heads/master"}, Exclude: []string{"refs/heads/dev*"}, }, RepositoryID: &RulesetRepositoryIDsConditionParameters{ RepositoryIDs: []int64{123, 456}, }, }, Rules: []*RepositoryRule{ NewCreationRule(), NewUpdateRule(&UpdateAllowsFetchAndMergeRuleParameters{ UpdateAllowsFetchAndMerge: true, }), NewDeletionRule(), NewRequiredLinearHistoryRule(), NewRequiredDeploymentsRule(&RequiredDeploymentEnvironmentsRuleParameters{ RequiredDeploymentEnvironments: []string{"test"}, }), NewRequiredSignaturesRule(), NewPullRequestRule(&PullRequestRuleParameters{ RequireCodeOwnerReview: true, RequireLastPushApproval: true, RequiredApprovingReviewCount: 1, RequiredReviewThreadResolution: true, DismissStaleReviewsOnPush: true, }), NewRequiredStatusChecksRule(&RequiredStatusChecksRuleParameters{ RequiredStatusChecks: []RuleRequiredStatusChecks{ { Context: "test", IntegrationID: Int64(1), }, }, StrictRequiredStatusChecksPolicy: true, }), NewNonFastForwardRule(), NewCommitMessagePatternRule(&RulePatternParameters{ Name: String("avoid test commits"), Negate: Bool(true), Operator: "starts_with", Pattern: "[test]", }), NewCommitAuthorEmailPatternRule(&RulePatternParameters{ Operator: "contains", Pattern: "github", }), NewCommitterEmailPatternRule(&RulePatternParameters{ Name: String("avoid commit emails"), Negate: Bool(true), Operator: "ends_with", Pattern: "abc", }), NewBranchNamePatternRule(&RulePatternParameters{ Name: String("avoid branch names"), Negate: Bool(true), Operator: "regex", Pattern: "github$", }), NewTagNamePatternRule(&RulePatternParameters{ Name: String("avoid tag names"), Negate: Bool(true), Operator: "contains", Pattern: "github", }), }, }) if err != nil { t.Errorf("Organizations.CreateOrganizationRuleset returned error: %v", err) } want := &Ruleset{ ID: Int64(21), Name: "ruleset", Target: String("branch"), SourceType: String("Organization"), Source: "o", Enforcement: "active", BypassActors: []*BypassActor{ { ActorID: Int64(234), ActorType: String("Team"), }, }, Conditions: &RulesetConditions{ RefName: &RulesetRefConditionParameters{ Include: []string{"refs/heads/main", "refs/heads/master"}, Exclude: []string{"refs/heads/dev*"}, }, RepositoryID: &RulesetRepositoryIDsConditionParameters{ RepositoryIDs: []int64{123, 456}, }, }, Rules: []*RepositoryRule{ NewCreationRule(), NewUpdateRule(&UpdateAllowsFetchAndMergeRuleParameters{ UpdateAllowsFetchAndMerge: true, }), NewDeletionRule(), NewRequiredLinearHistoryRule(), NewRequiredDeploymentsRule(&RequiredDeploymentEnvironmentsRuleParameters{ RequiredDeploymentEnvironments: []string{"test"}, }), NewRequiredSignaturesRule(), NewPullRequestRule(&PullRequestRuleParameters{ RequireCodeOwnerReview: true, RequireLastPushApproval: true, RequiredApprovingReviewCount: 1, RequiredReviewThreadResolution: true, DismissStaleReviewsOnPush: true, }), NewRequiredStatusChecksRule(&RequiredStatusChecksRuleParameters{ RequiredStatusChecks: []RuleRequiredStatusChecks{ { Context: "test", IntegrationID: Int64(1), }, }, StrictRequiredStatusChecksPolicy: true, }), NewNonFastForwardRule(), NewCommitMessagePatternRule(&RulePatternParameters{ Name: String("avoid test commits"), Negate: Bool(true), Operator: "starts_with", Pattern: "[test]", }), NewCommitAuthorEmailPatternRule(&RulePatternParameters{ Operator: "contains", Pattern: "github", }), NewCommitterEmailPatternRule(&RulePatternParameters{ Name: String("avoid commit emails"), Negate: Bool(true), Operator: "ends_with", Pattern: "abc", }), NewBranchNamePatternRule(&RulePatternParameters{ Name: String("avoid branch names"), Negate: Bool(true), Operator: "regex", Pattern: "github$", }), NewTagNamePatternRule(&RulePatternParameters{ Name: String("avoid tag names"), Negate: Bool(true), Operator: "contains", Pattern: "github", }), }, } if !cmp.Equal(ruleset, want) { t.Errorf("Organizations.CreateOrganizationRuleset returned %+v, want %+v", ruleset, want) } const methodName = "CreateOrganizationRuleset" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.CreateOrganizationRuleset(ctx, "o", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_GetOrganizationRuleset(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/rulesets/26110", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "id": 26110, "name": "test ruleset", "target": "branch", "source_type": "Organization", "source": "o", "enforcement": "active", "bypass_mode": "none", "node_id": "nid", "_links": { "self": { "href": "https://api.github.com/orgs/o/rulesets/26110" } }, "conditions": { "ref_name": { "include": [ "refs/heads/main", "refs/heads/master" ], "exclude": [ "refs/heads/dev*" ] }, "repository_name": { "include": [ "important_repository", "another_important_repository" ], "exclude": [ "unimportant_repository" ], "protected": true } }, "rules": [ { "type": "creation" } ] }`) }) ctx := context.Background() rulesets, _, err := client.Organizations.GetOrganizationRuleset(ctx, "o", 26110) if err != nil { t.Errorf("Organizations.GetOrganizationRepositoryRuleset returned error: %v", err) } want := &Ruleset{ ID: Int64(26110), Name: "test ruleset", Target: String("branch"), SourceType: String("Organization"), Source: "o", Enforcement: "active", NodeID: String("nid"), Links: &RulesetLinks{ Self: &RulesetLink{HRef: String("https://api.github.com/orgs/o/rulesets/26110")}, }, Conditions: &RulesetConditions{ RefName: &RulesetRefConditionParameters{ Include: []string{"refs/heads/main", "refs/heads/master"}, Exclude: []string{"refs/heads/dev*"}, }, RepositoryName: &RulesetRepositoryNamesConditionParameters{ Include: []string{"important_repository", "another_important_repository"}, Exclude: []string{"unimportant_repository"}, Protected: Bool(true), }, }, Rules: []*RepositoryRule{ NewCreationRule(), }, } if !cmp.Equal(rulesets, want) { t.Errorf("Organizations.GetOrganizationRuleset returned %+v, want %+v", rulesets, want) } const methodName = "GetOrganizationRuleset" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.GetOrganizationRuleset(ctx, "o", 26110) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_UpdateOrganizationRuleset(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/rulesets/26110", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") fmt.Fprint(w, `{ "id": 26110, "name": "test ruleset", "target": "branch", "source_type": "Organization", "source": "o", "enforcement": "active", "bypass_mode": "none", "node_id": "nid", "_links": { "self": { "href": "https://api.github.com/orgs/o/rulesets/26110" } }, "conditions": { "ref_name": { "include": [ "refs/heads/main", "refs/heads/master" ], "exclude": [ "refs/heads/dev*" ] }, "repository_name": { "include": [ "important_repository", "another_important_repository" ], "exclude": [ "unimportant_repository" ], "protected": true } }, "rules": [ { "type": "creation" } ] }`) }) ctx := context.Background() rulesets, _, err := client.Organizations.UpdateOrganizationRuleset(ctx, "o", 26110, &Ruleset{ Name: "test ruleset", Target: String("branch"), Enforcement: "active", Conditions: &RulesetConditions{ RefName: &RulesetRefConditionParameters{ Include: []string{"refs/heads/main", "refs/heads/master"}, Exclude: []string{"refs/heads/dev*"}, }, RepositoryName: &RulesetRepositoryNamesConditionParameters{ Include: []string{"important_repository", "another_important_repository"}, Exclude: []string{"unimportant_repository"}, Protected: Bool(true), }, }, Rules: []*RepositoryRule{ NewCreationRule(), }, }) if err != nil { t.Errorf("Organizations.UpdateOrganizationRuleset returned error: %v", err) } want := &Ruleset{ ID: Int64(26110), Name: "test ruleset", Target: String("branch"), SourceType: String("Organization"), Source: "o", Enforcement: "active", NodeID: String("nid"), Links: &RulesetLinks{ Self: &RulesetLink{HRef: String("https://api.github.com/orgs/o/rulesets/26110")}, }, Conditions: &RulesetConditions{ RefName: &RulesetRefConditionParameters{ Include: []string{"refs/heads/main", "refs/heads/master"}, Exclude: []string{"refs/heads/dev*"}, }, RepositoryName: &RulesetRepositoryNamesConditionParameters{ Include: []string{"important_repository", "another_important_repository"}, Exclude: []string{"unimportant_repository"}, Protected: Bool(true), }, }, Rules: []*RepositoryRule{ NewCreationRule(), }, } if !cmp.Equal(rulesets, want) { t.Errorf("Organizations.UpdateOrganizationRuleset returned %+v, want %+v", rulesets, want) } const methodName = "UpdateOrganizationRuleset" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.UpdateOrganizationRuleset(ctx, "o", 26110, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_DeleteOrganizationRuleset(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/rulesets/26110", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Organizations.DeleteOrganizationRuleset(ctx, "o", 26110) if err != nil { t.Errorf("Organizations.DeleteOrganizationRuleset returned error: %v", err) } const methodName = "DeleteOrganizationRuleset" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.DeleteOrganizationRuleset(ctx, "0", 26110) }) } go-github-60.0.0/github/orgs_security_managers.go000066400000000000000000000037441457013574700220760ustar00rootroot00000000000000// Copyright 2022 The go-github 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" ) // ListSecurityManagerTeams lists all security manager teams for an organization. // // GitHub API docs: https://docs.github.com/rest/orgs/security-managers#list-security-manager-teams // //meta:operation GET /orgs/{org}/security-managers func (s *OrganizationsService) ListSecurityManagerTeams(ctx context.Context, org string) ([]*Team, *Response, error) { u := fmt.Sprintf("orgs/%v/security-managers", org) 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 } // AddSecurityManagerTeam adds a team to the list of security managers for an organization. // // GitHub API docs: https://docs.github.com/rest/orgs/security-managers#add-a-security-manager-team // //meta:operation PUT /orgs/{org}/security-managers/teams/{team_slug} func (s *OrganizationsService) AddSecurityManagerTeam(ctx context.Context, org, team string) (*Response, error) { u := fmt.Sprintf("orgs/%v/security-managers/teams/%v", org, team) req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // RemoveSecurityManagerTeam removes a team from the list of security managers for an organization. // // GitHub API docs: https://docs.github.com/rest/orgs/security-managers#remove-a-security-manager-team // //meta:operation DELETE /orgs/{org}/security-managers/teams/{team_slug} func (s *OrganizationsService) RemoveSecurityManagerTeam(ctx context.Context, org, team string) (*Response, error) { u := fmt.Sprintf("orgs/%v/security-managers/teams/%v", org, team) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/orgs_security_managers_test.go000066400000000000000000000103311457013574700231230ustar00rootroot00000000000000// Copyright 2022 The go-github 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_ListSecurityManagerTeams(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/security-managers", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":1}]`) }) ctx := context.Background() teams, _, err := client.Organizations.ListSecurityManagerTeams(ctx, "o") if err != nil { t.Errorf("Organizations.ListSecurityManagerTeams returned error: %v", err) } want := []*Team{{ID: Int64(1)}} if !cmp.Equal(teams, want) { t.Errorf("Organizations.ListSecurityManagerTeams returned %+v, want %+v", teams, want) } const methodName = "ListSecurityManagerTeams" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Organizations.ListSecurityManagerTeams(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Organizations.ListSecurityManagerTeams(ctx, "o") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestOrganizationsService_ListSecurityManagerTeams_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Organizations.ListSecurityManagerTeams(ctx, "%") testURLParseError(t, err) } func TestOrganizationsService_AddSecurityManagerTeam(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/security-managers/teams/t", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") }) ctx := context.Background() _, err := client.Organizations.AddSecurityManagerTeam(ctx, "o", "t") if err != nil { t.Errorf("Organizations.AddSecurityManagerTeam returned error: %v", err) } const methodName = "AddSecurityManagerTeam" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.AddSecurityManagerTeam(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.AddSecurityManagerTeam(ctx, "o", "t") }) } func TestOrganizationsService_AddSecurityManagerTeam_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Organizations.AddSecurityManagerTeam(ctx, "%", "t") testURLParseError(t, err) } func TestOrganizationsService_AddSecurityManagerTeam_invalidTeam(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Organizations.AddSecurityManagerTeam(ctx, "%", "t") testURLParseError(t, err) } func TestOrganizationsService_RemoveSecurityManagerTeam(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/security-managers/teams/t", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Organizations.RemoveSecurityManagerTeam(ctx, "o", "t") if err != nil { t.Errorf("Organizations.RemoveSecurityManagerTeam returned error: %v", err) } const methodName = "RemoveSecurityManagerTeam" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.RemoveSecurityManagerTeam(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.RemoveSecurityManagerTeam(ctx, "o", "t") }) } func TestOrganizationsService_RemoveSecurityManagerTeam_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Organizations.RemoveSecurityManagerTeam(ctx, "%", "t") testURLParseError(t, err) } func TestOrganizationsService_RemoveSecurityManagerTeam_invalidTeam(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, err := client.Organizations.RemoveSecurityManagerTeam(ctx, "%", "t") testURLParseError(t, err) } go-github-60.0.0/github/orgs_test.go000066400000000000000000000334131457013574700173250ustar00rootroot00000000000000// 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) assertNilError(t, 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_Delete(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Organizations.Delete(ctx, "o") if err != nil { t.Errorf("Organizations.Delete returned error: %v", err) } const methodName = "Delete" testBadOptions(t, methodName, func() (err error) { _, err = client.Organizations.Delete(ctx, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Organizations.Delete(ctx, "o") }) } 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: Int64(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-60.0.0/github/orgs_users_blocking.go000066400000000000000000000057361457013574700213660ustar00rootroot00000000000000// 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/rest/orgs/blocking#list-users-blocked-by-an-organization // //meta:operation GET /orgs/{org}/blocks 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/rest/orgs/blocking#check-if-a-user-is-blocked-by-an-organization // //meta:operation GET /orgs/{org}/blocks/{username} 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/rest/orgs/blocking#block-a-user-from-an-organization // //meta:operation PUT /orgs/{org}/blocks/{username} 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/rest/orgs/blocking#unblock-a-user-from-an-organization // //meta:operation DELETE /orgs/{org}/blocks/{username} 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-60.0.0/github/orgs_users_blocking_test.go000066400000000000000000000100731457013574700224130ustar00rootroot00000000000000// 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-60.0.0/github/packages.go000066400000000000000000000130741457013574700170730ustar00rootroot00000000000000// 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"` URL *string `json:"url,omitempty"` VersionCount *int64 `json:"version_count,omitempty"` Visibility *string `json:"visibility,omitempty"` Repository *Repository `json:"repository,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"` Metadata *PackageMetadata `json:"metadata,omitempty"` PackageHTMLURL *string `json:"package_html_url,omitempty"` Name *string `json:"name,omitempty"` URL *string `json:"url,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) } // PackageListOptions represents the optional list options for a package. type PackageListOptions struct { // Visibility of packages "public", "internal" or "private". Visibility *string `url:"visibility,omitempty"` // PackageType represents the type of package. // It can be one of "npm", "maven", "rubygems", "nuget", "docker", or "container". PackageType *string `url:"package_type,omitempty"` // State of package either "active" or "deleted". State *string `url:"state,omitempty"` ListOptions } // PackageMetadata represents metadata from a package. type PackageMetadata struct { PackageType *string `json:"package_type,omitempty"` Container *PackageContainerMetadata `json:"container,omitempty"` } func (r PackageMetadata) String() string { return Stringify(r) } // PackageContainerMetadata represents container metadata for docker container packages. type PackageContainerMetadata struct { Tags []string `json:"tags,omitempty"` } func (r PackageContainerMetadata) String() string { return Stringify(r) } go-github-60.0.0/github/packages_test.go000066400000000000000000000420421457013574700201270ustar00rootroot00000000000000// 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}, Visibility: String("private"), 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 + `, "visibility": "private", "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-60.0.0/github/projects.go000066400000000000000000000541261457013574700171510ustar00rootroot00000000000000// 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/rest/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"` OrganizationPermission *string `json:"organization_permission,omitempty"` Private *bool `json:"private,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/rest/projects/projects#get-a-project // //meta:operation GET /projects/{project_id} 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.) Private *bool `json:"private,omitempty"` } // UpdateProject updates a repository project. // // GitHub API docs: https://docs.github.com/rest/projects/projects#update-a-project // //meta:operation PATCH /projects/{project_id} 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/rest/projects/projects#delete-a-project // //meta:operation DELETE /projects/{project_id} 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/rest/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/rest/projects/columns#list-project-columns // //meta:operation GET /projects/{project_id}/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/rest/projects/columns#get-a-project-column // //meta:operation GET /projects/columns/{column_id} 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/rest/projects/columns#create-a-project-column // //meta:operation POST /projects/{project_id}/columns 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/rest/projects/columns#update-an-existing-project-column // //meta:operation PATCH /projects/columns/{column_id} 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/rest/projects/columns#delete-a-project-column // //meta:operation DELETE /projects/columns/{column_id} 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/rest/projects/columns#move-a-project-column // //meta:operation POST /projects/columns/{column_id}/moves 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/rest/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/rest/projects/cards#list-project-cards // //meta:operation GET /projects/columns/{column_id}/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/rest/projects/cards#get-a-project-card // //meta:operation GET /projects/columns/cards/{card_id} 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/rest/projects/cards#create-a-project-card // //meta:operation POST /projects/columns/{column_id}/cards 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/rest/projects/cards#update-an-existing-project-card // //meta:operation PATCH /projects/columns/cards/{card_id} 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/rest/projects/cards#delete-a-project-card // //meta:operation DELETE /projects/columns/cards/{card_id} 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/rest/projects/cards#move-a-project-card // //meta:operation POST /projects/columns/cards/{card_id}/moves 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/rest/projects/collaborators#add-project-collaborator // //meta:operation PUT /projects/{project_id}/collaborators/{username} 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/rest/projects/collaborators#remove-user-as-a-collaborator // //meta:operation DELETE /projects/{project_id}/collaborators/{username} 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/rest/projects/collaborators#list-project-collaborators // //meta:operation GET /projects/{project_id}/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/rest/projects/collaborators#get-project-permission-for-a-user // //meta:operation GET /projects/{project_id}/collaborators/{username}/permission 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-60.0.0/github/projects_test.go000066400000000000000000000731771457013574700202170ustar00rootroot00000000000000// 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"), Private: Bool(false), 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{} assertNilError(t, 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{} assertNilError(t, 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{} assertNilError(t, 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{} assertNilError(t, 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{} assertNilError(t, 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{} assertNilError(t, 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{} assertNilError(t, 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{} assertNilError(t, 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"), Private: Bool(false), } want := `{ "name": "name", "body": "body", "state": "state", "organization_permission": "op", "private": false }` 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-60.0.0/github/pulls.go000066400000000000000000000447601457013574700164620ustar00rootroot00000000000000// 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" ) // PullRequestsService handles communication with the pull request related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/rest/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 *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` ClosedAt *Timestamp `json:"closed_at,omitempty"` MergedAt *Timestamp `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/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/rest/pulls/pulls#list-pull-requests // //meta:operation GET /repos/{owner}/{repo}/pulls 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 may include open and closed pull requests. // By default, the PullRequestListOptions State filters for "open". // // GitHub API docs: https://docs.github.com/rest/commits/commits#list-pull-requests-associated-with-a-commit // //meta:operation GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls func (s *PullRequestsService) ListPullRequestsWithCommit(ctx context.Context, owner, repo, sha string, opts *ListOptions) ([]*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/rest/pulls/pulls#get-a-pull-request // //meta:operation GET /repos/{owner}/{repo}/pulls/{pull_number} 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/rest/pulls/pulls#get-a-pull-request // //meta:operation GET /repos/{owner}/{repo}/pulls/{pull_number} 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"` HeadRepo *string `json:"head_repo,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/rest/pulls/pulls#create-a-pull-request // //meta:operation POST /repos/{owner}/{repo}/pulls 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/rest/pulls/pulls#update-a-pull-request-branch // //meta:operation PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-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/rest/pulls/pulls#update-a-pull-request // //meta:operation PATCH /repos/{owner}/{repo}/pulls/{pull_number} 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/rest/pulls/pulls#list-commits-on-a-pull-request // //meta:operation GET /repos/{owner}/{repo}/pulls/{pull_number}/commits 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/rest/pulls/pulls#list-pull-requests-files // //meta:operation GET /repos/{owner}/{repo}/pulls/{pull_number}/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/rest/pulls/pulls#check-if-a-pull-request-has-been-merged // //meta:operation GET /repos/{owner}/{repo}/pulls/{pull_number}/merge 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/rest/pulls/pulls#merge-a-pull-request // //meta:operation PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge 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-60.0.0/github/pulls_comments.go000066400000000000000000000203461457013574700203610ustar00rootroot00000000000000// 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 *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `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"` // Can be one of: LINE, FILE from https://docs.github.com/rest/pulls/comments#create-a-review-comment-for-a-pull-request SubjectType *string `json:"subject_type,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/rest/pulls/comments#list-review-comments-in-a-repository // GitHub API docs: https://docs.github.com/rest/pulls/comments#list-review-comments-on-a-pull-request // //meta:operation GET /repos/{owner}/{repo}/pulls/comments //meta:operation GET /repos/{owner}/{repo}/pulls/{pull_number}/comments 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/rest/pulls/comments#get-a-review-comment-for-a-pull-request // //meta:operation GET /repos/{owner}/{repo}/pulls/comments/{comment_id} 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/rest/pulls/comments#create-a-review-comment-for-a-pull-request // //meta:operation POST /repos/{owner}/{repo}/pulls/{pull_number}/comments 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/rest/pulls/comments#create-a-review-comment-for-a-pull-request // //meta:operation POST /repos/{owner}/{repo}/pulls/{pull_number}/comments 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/rest/pulls/comments#update-a-review-comment-for-a-pull-request // //meta:operation PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id} 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/rest/pulls/comments#delete-a-review-comment-for-a-pull-request // //meta:operation DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id} 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-60.0.0/github/pulls_comments_test.go000066400000000000000000000315771457013574700214300ustar00rootroot00000000000000// 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 := Timestamp{time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC)} updatedAt := Timestamp{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) assertNilError(t, 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) assertNilError(t, 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) assertNilError(t, 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-60.0.0/github/pulls_reviewers.go000066400000000000000000000056311457013574700205470ustar00rootroot00000000000000// 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/rest/pulls/review-requests#request-reviewers-for-a-pull-request // //meta:operation POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers 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/rest/pulls/review-requests#get-all-requested-reviewers-for-a-pull-request // //meta:operation GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers 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/rest/pulls/review-requests#remove-requested-reviewers-from-a-pull-request // //meta:operation DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers 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-60.0.0/github/pulls_reviewers_test.go000066400000000000000000000152331457013574700216050ustar00rootroot00000000000000// 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-60.0.0/github/pulls_reviews.go000066400000000000000000000253201457013574700202150ustar00rootroot00000000000000// 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" ) 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 *Timestamp `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/rest/pulls/reviews#list-reviews-for-a-pull-request // //meta:operation GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews 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. // // GitHub API docs: https://docs.github.com/rest/pulls/reviews#get-a-review-for-a-pull-request // //meta:operation GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id} 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. // // GitHub API docs: https://docs.github.com/rest/pulls/reviews#delete-a-pending-review-for-a-pull-request // //meta:operation DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id} 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. // // GitHub API docs: https://docs.github.com/rest/pulls/reviews#list-comments-for-a-pull-request-review // //meta:operation GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments 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. // // 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. // ``` // // GitHub API docs: https://docs.github.com/rest/pulls/reviews#create-a-review-for-a-pull-request // //meta:operation POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews 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/rest/pulls/reviews#update-a-review-for-a-pull-request // //meta:operation PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id} 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. // // GitHub API docs: https://docs.github.com/rest/pulls/reviews#submit-a-review-for-a-pull-request // //meta:operation POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events 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. // // GitHub API docs: https://docs.github.com/rest/pulls/reviews#dismiss-a-review-for-a-pull-request // //meta:operation PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals 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-60.0.0/github/pulls_reviews_test.go000066400000000000000000000500611457013574700212540ustar00rootroot00000000000000// 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) assertNilError(t, 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) assertNilError(t, 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) assertNilError(t, 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) assertNilError(t, 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: &Timestamp{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-60.0.0/github/pulls_test.go000066400000000000000000001216201457013574700175100ustar00rootroot00000000000000// 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{ "page": "2", }) fmt.Fprint(w, `[{"number":1}]`) }) opts := &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) assertNilError(t, 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") _, err := io.WriteString(w, tt.sendResponse) assertNilError(t, err) 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"), HeadRepo: String("eh"), Base: String("eh"), Body: String("eh"), Issue: Int(1), MaintainerCanModify: Bool(false), Draft: Bool(false), } want := `{ "title": "eh", "head": "eh", "head_repo": "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: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, ClosedAt: &Timestamp{referenceTime}, MergedAt: &Timestamp{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-60.0.0/github/pulls_threads.go000066400000000000000000000010261457013574700201600ustar00rootroot00000000000000// Copyright 2022 The go-github 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 // PullRequestThread represents a thread of comments on a pull request. type PullRequestThread struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Comments []*PullRequestComment `json:"comments,omitempty"` } func (p PullRequestThread) String() string { return Stringify(p) } go-github-60.0.0/github/pulls_threads_test.go000066400000000000000000000112441457013574700212220ustar00rootroot00000000000000// Copyright 2022 The go-github 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" "time" ) func TestPullRequestThread_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestThread{}, "{}") createdAt := Timestamp{time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC)} updatedAt := Timestamp{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"), } 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"), } comment := &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, Reactions: reactions, CreatedAt: &createdAt, UpdatedAt: &updatedAt, URL: String("pullrequestcommentUrl"), HTMLURL: String("pullrequestcommentHTMLUrl"), PullRequestURL: String("pullrequestcommentPullRequestURL"), } u := &PullRequestThread{ ID: Int64(1), NodeID: String("nid"), Comments: []*PullRequestComment{comment, comment}, } want := `{ "id": 1, "node_id": "nid", "comments": [ { "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" }, { "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) } go-github-60.0.0/github/rate_limit.go000066400000000000000000000101331457013574700174370ustar00rootroot00000000000000// Copyright 2023 The go-github 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" // RateLimitService provides access to rate limit functions in the GitHub API. type RateLimitService service // 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/rest/overview/resources-in-the-rest-api#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/rest/search#rate-limit Search *Rate `json:"search"` // GitHub API docs: https://docs.github.com/en/graphql/overview/resource-limitations#rate-limit GraphQL *Rate `json:"graphql"` // GitHub API dos: https://docs.github.com/en/rest/rate-limit IntegrationManifest *Rate `json:"integration_manifest"` SourceImport *Rate `json:"source_import"` CodeScanningUpload *Rate `json:"code_scanning_upload"` ActionsRunnerRegistration *Rate `json:"actions_runner_registration"` SCIM *Rate `json:"scim"` DependencySnapshots *Rate `json:"dependency_snapshots"` CodeSearch *Rate `json:"code_search"` } func (r RateLimits) String() string { return Stringify(r) } // Get returns the rate limits for the current client. // // GitHub API docs: https://docs.github.com/rest/rate-limit/rate-limit#get-rate-limit-status-for-the-authenticated-user // //meta:operation GET /rate_limit func (s *RateLimitService) Get(ctx context.Context) (*RateLimits, *Response, error) { req, err := s.client.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 := s.client.Do(ctx, req, response) if err != nil { return nil, resp, err } if response.Resources != nil { s.client.rateMu.Lock() if response.Resources.Core != nil { s.client.rateLimits[coreCategory] = *response.Resources.Core } if response.Resources.Search != nil { s.client.rateLimits[searchCategory] = *response.Resources.Search } if response.Resources.GraphQL != nil { s.client.rateLimits[graphqlCategory] = *response.Resources.GraphQL } if response.Resources.IntegrationManifest != nil { s.client.rateLimits[integrationManifestCategory] = *response.Resources.IntegrationManifest } if response.Resources.SourceImport != nil { s.client.rateLimits[sourceImportCategory] = *response.Resources.SourceImport } if response.Resources.CodeScanningUpload != nil { s.client.rateLimits[codeScanningUploadCategory] = *response.Resources.CodeScanningUpload } if response.Resources.ActionsRunnerRegistration != nil { s.client.rateLimits[actionsRunnerRegistrationCategory] = *response.Resources.ActionsRunnerRegistration } if response.Resources.SCIM != nil { s.client.rateLimits[scimCategory] = *response.Resources.SCIM } if response.Resources.DependencySnapshots != nil { s.client.rateLimits[dependencySnapshotsCategory] = *response.Resources.DependencySnapshots } if response.Resources.CodeSearch != nil { s.client.rateLimits[codeSearchCategory] = *response.Resources.CodeSearch } s.client.rateMu.Unlock() } return response.Resources, resp, nil } go-github-60.0.0/github/rate_limit_test.go000066400000000000000000000276121457013574700205100ustar00rootroot00000000000000// Copyright 2023 The go-github 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 TestRateLimits_String(t *testing.T) { v := RateLimits{ Core: &Rate{}, Search: &Rate{}, GraphQL: &Rate{}, IntegrationManifest: &Rate{}, SourceImport: &Rate{}, CodeScanningUpload: &Rate{}, ActionsRunnerRegistration: &Rate{}, SCIM: &Rate{}, DependencySnapshots: &Rate{}, CodeSearch: &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}}, GraphQL:github.Rate{Limit:0, Remaining:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}, IntegrationManifest:github.Rate{Limit:0, Remaining:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}, SourceImport:github.Rate{Limit:0, Remaining:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}, CodeScanningUpload:github.Rate{Limit:0, Remaining:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}, ActionsRunnerRegistration:github.Rate{Limit:0, Remaining:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}, SCIM:github.Rate{Limit:0, Remaining:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}, DependencySnapshots:github.Rate{Limit:0, Remaining:0, Reset:github.Timestamp{0001-01-01 00:00:00 +0000 UTC}}, CodeSearch: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 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}, "graphql": {"limit":4,"remaining":3,"reset":1372700875}, "integration_manifest": {"limit":5,"remaining":4,"reset":1372700876}, "source_import": {"limit":6,"remaining":5,"reset":1372700877}, "code_scanning_upload": {"limit":7,"remaining":6,"reset":1372700878}, "actions_runner_registration": {"limit":8,"remaining":7,"reset":1372700879}, "scim": {"limit":9,"remaining":8,"reset":1372700880}, "dependency_snapshots": {"limit":10,"remaining":9,"reset":1372700881}, "code_search": {"limit":11,"remaining":10,"reset":1372700882} }}`) }) ctx := context.Background() rate, _, err := client.RateLimit.Get(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()}, }, GraphQL: &Rate{ Limit: 4, Remaining: 3, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 47, 55, 0, time.UTC).Local()}, }, IntegrationManifest: &Rate{ Limit: 5, Remaining: 4, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 47, 56, 0, time.UTC).Local()}, }, SourceImport: &Rate{ Limit: 6, Remaining: 5, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 47, 57, 0, time.UTC).Local()}, }, CodeScanningUpload: &Rate{ Limit: 7, Remaining: 6, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 47, 58, 0, time.UTC).Local()}, }, ActionsRunnerRegistration: &Rate{ Limit: 8, Remaining: 7, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 47, 59, 0, time.UTC).Local()}, }, SCIM: &Rate{ Limit: 9, Remaining: 8, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 48, 00, 0, time.UTC).Local()}, }, DependencySnapshots: &Rate{ Limit: 10, Remaining: 9, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 48, 1, 0, time.UTC).Local()}, }, CodeSearch: &Rate{ Limit: 11, Remaining: 10, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 48, 2, 0, time.UTC).Local()}, }, } if !cmp.Equal(rate, want) { t.Errorf("RateLimits returned %+v, want %+v", rate, want) } tests := []struct { category rateLimitCategory rate *Rate }{ { category: coreCategory, rate: want.Core, }, { category: searchCategory, rate: want.Search, }, { category: graphqlCategory, rate: want.GraphQL, }, { category: integrationManifestCategory, rate: want.IntegrationManifest, }, { category: sourceImportCategory, rate: want.SourceImport, }, { category: codeScanningUploadCategory, rate: want.CodeScanningUpload, }, { category: actionsRunnerRegistrationCategory, rate: want.ActionsRunnerRegistration, }, { category: scimCategory, rate: want.SCIM, }, { category: dependencySnapshotsCategory, rate: want.DependencySnapshots, }, { category: codeSearchCategory, rate: want.CodeSearch, }, } for _, tt := range tests { if got, want := client.rateLimits[tt.category], *tt.rate; got != want { t.Errorf("client.rateLimits[%v] is %+v, want %+v", tt.category, 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.RateLimit.Get(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}, "graphql": {"limit":4,"remaining":3,"reset":1372700875}, "integration_manifest": {"limit":5,"remaining":4,"reset":1372700876}, "source_import": {"limit":6,"remaining":5,"reset":1372700877}, "code_scanning_upload": {"limit":7,"remaining":6,"reset":1372700878}, "actions_runner_registration": {"limit":8,"remaining":7,"reset":1372700879}, "scim": {"limit":9,"remaining":8,"reset":1372700880}, "dependency_snapshots": {"limit":10,"remaining":9,"reset":1372700881}, "code_search": {"limit":11,"remaining":10,"reset":1372700882} }}`) }) ctx := context.Background() rate, _, err := client.RateLimit.Get(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()}, }, GraphQL: &Rate{ Limit: 4, Remaining: 3, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 47, 55, 0, time.UTC).Local()}, }, IntegrationManifest: &Rate{ Limit: 5, Remaining: 4, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 47, 56, 0, time.UTC).Local()}, }, SourceImport: &Rate{ Limit: 6, Remaining: 5, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 47, 57, 0, time.UTC).Local()}, }, CodeScanningUpload: &Rate{ Limit: 7, Remaining: 6, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 47, 58, 0, time.UTC).Local()}, }, ActionsRunnerRegistration: &Rate{ Limit: 8, Remaining: 7, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 47, 59, 0, time.UTC).Local()}, }, SCIM: &Rate{ Limit: 9, Remaining: 8, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 48, 00, 0, time.UTC).Local()}, }, DependencySnapshots: &Rate{ Limit: 10, Remaining: 9, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 48, 1, 0, time.UTC).Local()}, }, CodeSearch: &Rate{ Limit: 11, Remaining: 10, Reset: Timestamp{time.Date(2013, time.July, 1, 17, 48, 2, 0, time.UTC).Local()}, }, } if !cmp.Equal(rate, want) { t.Errorf("RateLimits returned %+v, want %+v", rate, want) } tests := []struct { category rateLimitCategory rate *Rate }{ { category: coreCategory, rate: want.Core, }, { category: searchCategory, rate: want.Search, }, { category: graphqlCategory, rate: want.GraphQL, }, { category: integrationManifestCategory, rate: want.IntegrationManifest, }, { category: sourceImportCategory, rate: want.SourceImport, }, { category: codeScanningUploadCategory, rate: want.CodeScanningUpload, }, { category: actionsRunnerRegistrationCategory, rate: want.ActionsRunnerRegistration, }, { category: scimCategory, rate: want.SCIM, }, { category: dependencySnapshotsCategory, rate: want.DependencySnapshots, }, { category: codeSearchCategory, rate: want.CodeSearch, }, } for _, tt := range tests { if got, want := client.rateLimits[tt.category], *tt.rate; got != want { t.Errorf("client.rateLimits[%v] is %+v, want %+v", tt.category, got, 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}, }, GraphQL: &Rate{ Limit: 1, Remaining: 1, Reset: Timestamp{referenceTime}, }, IntegrationManifest: &Rate{ Limit: 1, Remaining: 1, Reset: Timestamp{referenceTime}, }, SourceImport: &Rate{ Limit: 1, Remaining: 1, Reset: Timestamp{referenceTime}, }, CodeScanningUpload: &Rate{ Limit: 1, Remaining: 1, Reset: Timestamp{referenceTime}, }, ActionsRunnerRegistration: &Rate{ Limit: 1, Remaining: 1, Reset: Timestamp{referenceTime}, }, SCIM: &Rate{ Limit: 1, Remaining: 1, Reset: Timestamp{referenceTime}, }, DependencySnapshots: &Rate{ Limit: 1, Remaining: 1, Reset: Timestamp{referenceTime}, }, CodeSearch: &Rate{ Limit: 1, Remaining: 1, Reset: Timestamp{referenceTime}, }, } want := `{ "core": { "limit": 1, "remaining": 1, "reset": ` + referenceTimeStr + ` }, "search": { "limit": 1, "remaining": 1, "reset": ` + referenceTimeStr + ` }, "graphql": { "limit": 1, "remaining": 1, "reset": ` + referenceTimeStr + ` }, "integration_manifest": { "limit": 1, "remaining": 1, "reset": ` + referenceTimeStr + ` }, "source_import": { "limit": 1, "remaining": 1, "reset": ` + referenceTimeStr + ` }, "code_scanning_upload": { "limit": 1, "remaining": 1, "reset": ` + referenceTimeStr + ` }, "actions_runner_registration": { "limit": 1, "remaining": 1, "reset": ` + referenceTimeStr + ` }, "scim": { "limit": 1, "remaining": 1, "reset": ` + referenceTimeStr + ` }, "dependency_snapshots": { "limit": 1, "remaining": 1, "reset": ` + referenceTimeStr + ` }, "code_search": { "limit": 1, "remaining": 1, "reset": ` + referenceTimeStr + ` } }` 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) } go-github-60.0.0/github/reactions.go000066400000000000000000000540541457013574700173070ustar00rootroot00000000000000// 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/rest/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/rest/reactions/reactions#list-reactions-for-a-commit-comment // //meta:operation GET /repos/{owner}/{repo}/comments/{comment_id}/reactions 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/rest/reactions/reactions#create-reaction-for-a-commit-comment // //meta:operation POST /repos/{owner}/{repo}/comments/{comment_id}/reactions 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/rest/reactions/reactions#delete-a-commit-comment-reaction // //meta:operation DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id} 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/rest/reactions/reactions#delete-a-commit-comment-reaction // //meta:operation DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id} 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/rest/reactions/reactions#list-reactions-for-an-issue // //meta:operation GET /repos/{owner}/{repo}/issues/{issue_number}/reactions 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/rest/reactions/reactions#create-reaction-for-an-issue // //meta:operation POST /repos/{owner}/{repo}/issues/{issue_number}/reactions 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/rest/reactions/reactions#delete-an-issue-reaction // //meta:operation DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id} 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/rest/reactions/reactions#delete-an-issue-reaction // //meta:operation DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id} 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/rest/reactions/reactions#list-reactions-for-an-issue-comment // //meta:operation GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions 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/rest/reactions/reactions#create-reaction-for-an-issue-comment // //meta:operation POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions 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/rest/reactions/reactions#delete-an-issue-comment-reaction // //meta:operation DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id} 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/rest/reactions/reactions#delete-an-issue-comment-reaction // //meta:operation DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id} 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/rest/reactions/reactions#list-reactions-for-a-pull-request-review-comment // //meta:operation GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions 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/rest/reactions/reactions#create-reaction-for-a-pull-request-review-comment // //meta:operation POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions 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/rest/reactions/reactions#delete-a-pull-request-comment-reaction // //meta:operation DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id} 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/rest/reactions/reactions#delete-a-pull-request-comment-reaction // //meta:operation DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id} 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/rest/reactions/reactions#list-reactions-for-a-team-discussion-legacy // //meta:operation GET /teams/{team_id}/discussions/{discussion_number}/reactions 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/rest/reactions/reactions#create-reaction-for-a-team-discussion-legacy // //meta:operation POST /teams/{team_id}/discussions/{discussion_number}/reactions 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/rest/reactions/reactions#delete-team-discussion-reaction // //meta:operation DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id} 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/rest/reactions/reactions#create-reaction-for-a-team-discussion // //meta:operation POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions 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/rest/reactions/reactions#list-reactions-for-a-team-discussion-comment-legacy // //meta:operation GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions 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/rest/reactions/reactions#create-reaction-for-a-team-discussion-comment-legacy // //meta:operation POST /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions 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/rest/reactions/reactions#delete-team-discussion-comment-reaction // //meta:operation DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id} 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/rest/reactions/reactions#create-reaction-for-a-team-discussion-comment // //meta:operation POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions 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) } // CreateReleaseReaction creates a reaction to a release. // Note that a response with a Status: 200 OK means that you already // added the reaction type to this release. // 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/rest/reactions/reactions#create-reaction-for-a-release // //meta:operation POST /repos/{owner}/{repo}/releases/{release_id}/reactions func (s *ReactionsService) CreateReleaseReaction(ctx context.Context, owner, repo string, releaseID int64, content string) (*Reaction, *Response, error) { u := fmt.Sprintf("repos/%v/%v/releases/%v/reactions", owner, repo, releaseID) 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 } go-github-60.0.0/github/reactions_test.go000066400000000000000000000734761457013574700203570ustar00rootroot00000000000000// 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) assertWrite(t, w, []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) assertWrite(t, w, []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) assertWrite(t, w, []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) assertWrite(t, w, []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) assertWrite(t, w, []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) assertWrite(t, w, []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) assertWrite(t, w, []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) assertWrite(t, w, []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) assertWrite(t, w, []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) assertWrite(t, w, []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) assertWrite(t, w, []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) }) } func TestReactionService_CreateReleaseReaction(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/releases/1/reactions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeReactionsPreview) w.WriteHeader(http.StatusCreated) assertWrite(t, w, []byte(`{"id":1,"user":{"login":"l","id":2},"content":"rocket"}`)) }) const methodName = "CreateReleaseReaction" ctx := context.Background() got, _, err := client.Reactions.CreateReleaseReaction(ctx, "o", "r", 1, "rocket") if err != nil { t.Errorf("%v returned error: %v", methodName, err) } want := &Reaction{ID: Int64(1), User: &User{Login: String("l"), ID: Int64(2)}, Content: String("rocket")} if !cmp.Equal(got, want) { t.Errorf("%v = %+v, want %+v", methodName, got, want) } testBadOptions(t, methodName, func() (err error) { _, _, err = client.Reactions.CreateReleaseReaction(ctx, "\n", "\n", -1, "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Reactions.CreateReleaseReaction(ctx, "o", "r", 1, "rocket") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/repos.go000066400000000000000000003036711457013574700164520ustar00rootroot00000000000000// 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" ) const githubBranchNotProtected string = "Branch not protected" var ErrBranchNotProtected = errors.New("branch is not protected") // RepositoriesService handles communication with the repository related // methods of the GitHub API. // // GitHub API docs: https://docs.github.com/rest/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"` AllowUpdateBranch *bool `json:"allow_update_branch,omitempty"` AllowSquashMerge *bool `json:"allow_squash_merge,omitempty"` AllowMergeCommit *bool `json:"allow_merge_commit,omitempty"` AllowAutoMerge *bool `json:"allow_auto_merge,omitempty"` AllowForking *bool `json:"allow_forking,omitempty"` WebCommitSignoffRequired *bool `json:"web_commit_signoff_required,omitempty"` DeleteBranchOnMerge *bool `json:"delete_branch_on_merge,omitempty"` UseSquashPRTitleAsDefault *bool `json:"use_squash_pr_title_as_default,omitempty"` SquashMergeCommitTitle *string `json:"squash_merge_commit_title,omitempty"` // Can be one of: "PR_TITLE", "COMMIT_OR_PR_TITLE" SquashMergeCommitMessage *string `json:"squash_merge_commit_message,omitempty"` // Can be one of: "PR_BODY", "COMMIT_MESSAGES", "BLANK" MergeCommitTitle *string `json:"merge_commit_title,omitempty"` // Can be one of: "PR_TITLE", "MERGE_MESSAGE" MergeCommitMessage *string `json:"merge_commit_message,omitempty"` // Can be one of: "PR_BODY", "PR_TITLE", "BLANK" Topics []string `json:"topics,omitempty"` CustomProperties map[string]string `json:"custom_properties,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"` HasDiscussions *bool `json:"has_discussions,omitempty"` IsTemplate *bool `json:"is_template,omitempty"` LicenseTemplate *string `json:"license_template,omitempty"` GitignoreTemplate *string `json:"gitignore_template,omitempty"` // Options for configuring Advanced Security and Secret Scanning SecurityAndAnalysis *SecurityAndAnalysis `json:"security_and_analysis,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/rest/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"` // RoleName is only returned by the API 'check team permissions for a repository'. // See: teams.go (IsTeamRepoByID) https://docs.github.com/rest/teams/teams#check-team-permissions-for-a-repository RoleName *string `json:"role_name,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 { // See RepositoryListByAuthenticatedUserOptions.Visibility Visibility string `url:"visibility,omitempty"` // See RepositoryListByAuthenticatedUserOptions.Affiliation Affiliation string `url:"affiliation,omitempty"` // See RepositoryListByUserOptions.Type or RepositoryListByAuthenticatedUserOptions.Type Type string `url:"type,omitempty"` // See RepositoryListByUserOptions.Sort or RepositoryListByAuthenticatedUserOptions.Sort Sort string `url:"sort,omitempty"` // See RepositoryListByUserOptions.Direction or RepositoryListByAuthenticatedUserOptions.Direction Direction string `url:"direction,omitempty"` ListOptions } // SecurityAndAnalysis specifies the optional advanced security features // that are enabled on a given repository. type SecurityAndAnalysis struct { AdvancedSecurity *AdvancedSecurity `json:"advanced_security,omitempty"` SecretScanning *SecretScanning `json:"secret_scanning,omitempty"` SecretScanningPushProtection *SecretScanningPushProtection `json:"secret_scanning_push_protection,omitempty"` DependabotSecurityUpdates *DependabotSecurityUpdates `json:"dependabot_security_updates,omitempty"` SecretScanningValidityChecks *SecretScanningValidityChecks `json:"secret_scanning_validity_checks,omitempty"` } func (s SecurityAndAnalysis) String() string { return Stringify(s) } // AdvancedSecurity specifies the state of advanced security on a repository. // // GitHub API docs: https://docs.github.com/github/getting-started-with-github/learning-about-github/about-github-advanced-security type AdvancedSecurity struct { Status *string `json:"status,omitempty"` } func (a AdvancedSecurity) String() string { return Stringify(a) } // SecretScanning specifies the state of secret scanning on a repository. // // GitHub API docs: https://docs.github.com/code-security/secret-security/about-secret-scanning type SecretScanning struct { Status *string `json:"status,omitempty"` } func (s SecretScanning) String() string { return Stringify(s) } // SecretScanningPushProtection specifies the state of secret scanning push protection on a repository. // // GitHub API docs: https://docs.github.com/code-security/secret-scanning/about-secret-scanning#about-secret-scanning-for-partner-patterns type SecretScanningPushProtection struct { Status *string `json:"status,omitempty"` } func (s SecretScanningPushProtection) String() string { return Stringify(s) } // DependabotSecurityUpdates specifies the state of Dependabot security updates on a repository. // // GitHub API docs: https://docs.github.com/code-security/dependabot/dependabot-security-updates/about-dependabot-security-updates type DependabotSecurityUpdates struct { Status *string `json:"status,omitempty"` } func (d DependabotSecurityUpdates) String() string { return Stringify(d) } // SecretScanningValidityChecks represents the state of secret scanning validity checks on a repository. // // GitHub API docs: https://docs.github.com/en/enterprise-cloud@latest/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-security-and-analysis-settings-for-your-repository#allowing-validity-checks-for-partner-patterns-in-a-repository type SecretScanningValidityChecks struct { Status *string `json:"status,omitempty"` } // List calls either RepositoriesService.ListByUser or RepositoriesService.ListByAuthenticatedUser // depending on whether user is empty. // // Deprecated: Use RepositoriesService.ListByUser or RepositoriesService.ListByAuthenticatedUser instead. // // GitHub API docs: https://docs.github.com/rest/repos/repos#list-repositories-for-a-user // GitHub API docs: https://docs.github.com/rest/repos/repos#list-repositories-for-the-authenticated-user // //meta:operation GET /user/repos //meta:operation GET /users/{username}/repos func (s *RepositoriesService) List(ctx context.Context, user string, opts *RepositoryListOptions) ([]*Repository, *Response, error) { if opts == nil { opts = &RepositoryListOptions{} } if user != "" { return s.ListByUser(ctx, user, &RepositoryListByUserOptions{ Type: opts.Type, Sort: opts.Sort, Direction: opts.Direction, ListOptions: opts.ListOptions, }) } return s.ListByAuthenticatedUser(ctx, &RepositoryListByAuthenticatedUserOptions{ Visibility: opts.Visibility, Affiliation: opts.Affiliation, Type: opts.Type, Sort: opts.Sort, Direction: opts.Direction, ListOptions: opts.ListOptions, }) } // RepositoryListByUserOptions specifies the optional parameters to the // RepositoriesService.ListByUser method. type RepositoryListByUserOptions struct { // Limit results to repositories of the specified type. // Default: owner // Can be one of: all, owner, member Type string `url:"type,omitempty"` // The property to sort the results by. // Default: full_name // Can be one of: created, updated, pushed, full_name Sort string `url:"sort,omitempty"` // The order to sort by. // Default: asc when using full_name, otherwise desc. // Can be one of: asc, desc Direction string `url:"direction,omitempty"` ListOptions } // ListByUser lists public repositories for the specified user. // // GitHub API docs: https://docs.github.com/rest/repos/repos#list-repositories-for-a-user // //meta:operation GET /users/{username}/repos func (s *RepositoriesService) ListByUser(ctx context.Context, user string, opts *RepositoryListByUserOptions) ([]*Repository, *Response, error) { u := fmt.Sprintf("users/%v/repos", 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 repos []*Repository resp, err := s.client.Do(ctx, req, &repos) if err != nil { return nil, resp, err } return repos, resp, nil } // RepositoryListByAuthenticatedUserOptions specifies the optional parameters to the // RepositoriesService.ListByAuthenticatedUser method. type RepositoryListByAuthenticatedUserOptions struct { // Limit results to repositories with the specified visibility. // Default: all // Can be one of: all, public, private 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"` // Limit results to repositories of the specified type. Will cause a 422 error if // used in the same request as visibility or affiliation. // Default: all // Can be one of: all, owner, public, private, member Type string `url:"type,omitempty"` // The property to sort the results by. // Default: full_name // Can be one of: created, updated, pushed, 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 } // ListByAuthenticatedUser lists repositories for the authenticated user. // // GitHub API docs: https://docs.github.com/rest/repos/repos#list-repositories-for-the-authenticated-user // //meta:operation GET /user/repos func (s *RepositoriesService) ListByAuthenticatedUser(ctx context.Context, opts *RepositoryListByAuthenticatedUserOptions) ([]*Repository, *Response, error) { 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 } 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/rest/repos/repos#list-organization-repositories // //meta:operation GET /orgs/{org}/repos 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/rest/repos/repos#list-public-repositories // //meta:operation GET /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"` HasDiscussions *bool `json:"has_discussions,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"` AllowUpdateBranch *bool `json:"allow_update_branch,omitempty"` AllowAutoMerge *bool `json:"allow_auto_merge,omitempty"` AllowForking *bool `json:"allow_forking,omitempty"` DeleteBranchOnMerge *bool `json:"delete_branch_on_merge,omitempty"` UseSquashPRTitleAsDefault *bool `json:"use_squash_pr_title_as_default,omitempty"` SquashMergeCommitTitle *string `json:"squash_merge_commit_title,omitempty"` SquashMergeCommitMessage *string `json:"squash_merge_commit_message,omitempty"` MergeCommitTitle *string `json:"merge_commit_title,omitempty"` MergeCommitMessage *string `json:"merge_commit_message,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/rest/repos/repos#create-a-repository-for-the-authenticated-user // GitHub API docs: https://docs.github.com/rest/repos/repos#create-an-organization-repository // //meta:operation POST /orgs/{org}/repos //meta:operation POST /user/repos 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, HasDiscussions: repo.HasDiscussions, IsTemplate: repo.IsTemplate, TeamID: repo.TeamID, AutoInit: repo.AutoInit, GitignoreTemplate: repo.GitignoreTemplate, LicenseTemplate: repo.LicenseTemplate, AllowSquashMerge: repo.AllowSquashMerge, AllowMergeCommit: repo.AllowMergeCommit, AllowRebaseMerge: repo.AllowRebaseMerge, AllowUpdateBranch: repo.AllowUpdateBranch, AllowAutoMerge: repo.AllowAutoMerge, AllowForking: repo.AllowForking, DeleteBranchOnMerge: repo.DeleteBranchOnMerge, UseSquashPRTitleAsDefault: repo.UseSquashPRTitleAsDefault, SquashMergeCommitTitle: repo.SquashMergeCommitTitle, SquashMergeCommitMessage: repo.SquashMergeCommitMessage, MergeCommitTitle: repo.MergeCommitTitle, MergeCommitMessage: repo.MergeCommitMessage, } 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/rest/repos/repos#create-a-repository-using-a-template // //meta:operation POST /repos/{template_owner}/{template_repo}/generate 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/rest/repos/repos#get-a-repository // //meta:operation GET /repos/{owner}/{repo} 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/rest/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. // Note that https://docs.github.com/rest/codes-of-conduct#about-the-codes-of-conduct-api // says to use the GET /repos/{owner}/{repo} endpoint. // // GitHub API docs: https://docs.github.com/rest/repos/repos#get-a-repository // //meta:operation GET /repos/{owner}/{repo} func (s *RepositoriesService) GetCodeOfConduct(ctx context.Context, owner, repo string) (*CodeOfConduct, *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 this API fully launches. req.Header.Set("Accept", mediaTypeCodesOfConductPreview) r := new(Repository) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r.GetCodeOfConduct(), resp, nil } // GetByID fetches a repository. // // Note: GetByID uses the undocumented GitHub API endpoint "GET /repositories/{repository_id}". // //meta:operation GET /repositories/{repository_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/rest/repos/repos#update-a-repository // //meta:operation PATCH /repos/{owner}/{repo} 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/rest/repos/repos#delete-a-repository // //meta:operation DELETE /repos/{owner}/{repo} 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/rest/repos/repos#check-if-vulnerability-alerts-are-enabled-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/vulnerability-alerts 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/rest/repos/repos#enable-vulnerability-alerts // //meta:operation PUT /repos/{owner}/{repo}/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/rest/repos/repos#disable-vulnerability-alerts // //meta:operation DELETE /repos/{owner}/{repo}/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) } // GetAutomatedSecurityFixes checks if the automated security fixes for a repository are enabled. // // GitHub API docs: https://docs.github.com/rest/repos/repos#check-if-automated-security-fixes-are-enabled-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/automated-security-fixes func (s *RepositoriesService) GetAutomatedSecurityFixes(ctx context.Context, owner, repository string) (*AutomatedSecurityFixes, *Response, error) { u := fmt.Sprintf("repos/%v/%v/automated-security-fixes", owner, repository) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } p := new(AutomatedSecurityFixes) resp, err := s.client.Do(ctx, req, p) if err != nil { return nil, resp, err } return p, resp, nil } // EnableAutomatedSecurityFixes enables the automated security fixes for a repository. // // GitHub API docs: https://docs.github.com/rest/repos/repos#enable-automated-security-fixes // //meta:operation PUT /repos/{owner}/{repo}/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 } 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/rest/repos/repos#disable-automated-security-fixes // //meta:operation DELETE /repos/{owner}/{repo}/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 } return s.client.Do(ctx, req, nil) } // ListContributors lists contributors for a repository. // // GitHub API docs: https://docs.github.com/rest/repos/repos#list-repository-contributors // //meta:operation GET /repos/{owner}/{repo}/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/rest/repos/repos#list-repository-languages // //meta:operation GET /repos/{owner}/{repo}/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/rest/repos/repos#list-repository-teams // //meta:operation GET /repos/{owner}/{repo}/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/rest/repos/repos#list-repository-tags // //meta:operation GET /repos/{owner}/{repo}/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"` BlockCreations *BlockCreations `json:"block_creations,omitempty"` LockBranch *LockBranch `json:"lock_branch,omitempty"` AllowForkSyncing *AllowForkSyncing `json:"allow_fork_syncing,omitempty"` RequiredSignatures *SignaturesProtectedBranch `json:"required_signatures,omitempty"` URL *string `json:"url,omitempty"` } // BlockCreations represents whether users can push changes that create branches. If this is true, this // setting blocks pushes that create new branches, unless the push is initiated by a user, team, or app // which has the ability to push. type BlockCreations struct { Enabled *bool `json:"enabled,omitempty"` } // LockBranch represents if the branch is marked as read-only. If this is true, users will not be able to push to the branch. type LockBranch struct { Enabled *bool `json:"enabled,omitempty"` } // AllowForkSyncing represents whether users can pull changes from upstream when the branch is locked. type AllowForkSyncing struct { Enabled *bool `json:"enabled,omitempty"` } // BranchProtectionRule represents the rule applied to a repositories branch. type BranchProtectionRule struct { ID *int64 `json:"id,omitempty"` RepositoryID *int64 `json:"repository_id,omitempty"` Name *string `json:"name,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` PullRequestReviewsEnforcementLevel *string `json:"pull_request_reviews_enforcement_level,omitempty"` RequiredApprovingReviewCount *int `json:"required_approving_review_count,omitempty"` DismissStaleReviewsOnPush *bool `json:"dismiss_stale_reviews_on_push,omitempty"` AuthorizedDismissalActorsOnly *bool `json:"authorized_dismissal_actors_only,omitempty"` IgnoreApprovalsFromContributors *bool `json:"ignore_approvals_from_contributors,omitempty"` RequireCodeOwnerReview *bool `json:"require_code_owner_review,omitempty"` RequiredStatusChecks []string `json:"required_status_checks,omitempty"` RequiredStatusChecksEnforcementLevel *string `json:"required_status_checks_enforcement_level,omitempty"` StrictRequiredStatusChecksPolicy *bool `json:"strict_required_status_checks_policy,omitempty"` SignatureRequirementEnforcementLevel *string `json:"signature_requirement_enforcement_level,omitempty"` LinearHistoryRequirementEnforcementLevel *string `json:"linear_history_requirement_enforcement_level,omitempty"` AdminEnforced *bool `json:"admin_enforced,omitempty"` AllowForcePushesEnforcementLevel *string `json:"allow_force_pushes_enforcement_level,omitempty"` AllowDeletionsEnforcementLevel *string `json:"allow_deletions_enforcement_level,omitempty"` MergeQueueEnforcementLevel *string `json:"merge_queue_enforcement_level,omitempty"` RequiredDeploymentsEnforcementLevel *string `json:"required_deployments_enforcement_level,omitempty"` RequiredConversationResolutionLevel *string `json:"required_conversation_resolution_level,omitempty"` AuthorizedActorsOnly *bool `json:"authorized_actors_only,omitempty"` AuthorizedActorNames []string `json:"authorized_actor_names,omitempty"` } // ProtectionChanges represents the changes to the rule if the BranchProtection was edited. type ProtectionChanges struct { AdminEnforced *AdminEnforcedChanges `json:"admin_enforced,omitempty"` AllowDeletionsEnforcementLevel *AllowDeletionsEnforcementLevelChanges `json:"allow_deletions_enforcement_level,omitempty"` AuthorizedActorNames *AuthorizedActorNames `json:"authorized_actor_names,omitempty"` AuthorizedActorsOnly *AuthorizedActorsOnly `json:"authorized_actors_only,omitempty"` AuthorizedDismissalActorsOnly *AuthorizedDismissalActorsOnlyChanges `json:"authorized_dismissal_actors_only,omitempty"` CreateProtected *CreateProtectedChanges `json:"create_protected,omitempty"` DismissStaleReviewsOnPush *DismissStaleReviewsOnPushChanges `json:"dismiss_stale_reviews_on_push,omitempty"` LinearHistoryRequirementEnforcementLevel *LinearHistoryRequirementEnforcementLevelChanges `json:"linear_history_requirement_enforcement_level,omitempty"` PullRequestReviewsEnforcementLevel *PullRequestReviewsEnforcementLevelChanges `json:"pull_request_reviews_enforcement_level,omitempty"` RequireCodeOwnerReview *RequireCodeOwnerReviewChanges `json:"require_code_owner_review,omitempty"` RequiredConversationResolutionLevel *RequiredConversationResolutionLevelChanges `json:"required_conversation_resolution_level,omitempty"` RequiredDeploymentsEnforcementLevel *RequiredDeploymentsEnforcementLevelChanges `json:"required_deployments_enforcement_level,omitempty"` RequiredStatusChecks *RequiredStatusChecksChanges `json:"required_status_checks,omitempty"` RequiredStatusChecksEnforcementLevel *RequiredStatusChecksEnforcementLevelChanges `json:"required_status_checks_enforcement_level,omitempty"` SignatureRequirementEnforcementLevel *SignatureRequirementEnforcementLevelChanges `json:"signature_requirement_enforcement_level,omitempty"` } // AdminEnforcedChanges represents the changes made to the AdminEnforced policy. type AdminEnforcedChanges struct { From *bool `json:"from,omitempty"` } // AllowDeletionsEnforcementLevelChanges represents the changes made to the AllowDeletionsEnforcementLevel policy. type AllowDeletionsEnforcementLevelChanges struct { From *string `json:"from,omitempty"` } // AuthorizedActorNames represents who are authorized to edit the branch protection rules. type AuthorizedActorNames struct { From []string `json:"from,omitempty"` } // AuthorizedActorsOnly represents if the branch rule can be edited by authorized actors only. type AuthorizedActorsOnly struct { From *bool `json:"from,omitempty"` } // AuthorizedDismissalActorsOnlyChanges represents the changes made to the AuthorizedDismissalActorsOnly policy. type AuthorizedDismissalActorsOnlyChanges struct { From *bool `json:"from,omitempty"` } // CreateProtectedChanges represents the changes made to the CreateProtected policy. type CreateProtectedChanges struct { From *bool `json:"from,omitempty"` } // DismissStaleReviewsOnPushChanges represents the changes made to the DismissStaleReviewsOnPushChanges policy. type DismissStaleReviewsOnPushChanges struct { From *bool `json:"from,omitempty"` } // LinearHistoryRequirementEnforcementLevelChanges represents the changes made to the LinearHistoryRequirementEnforcementLevel policy. type LinearHistoryRequirementEnforcementLevelChanges struct { From *string `json:"from,omitempty"` } // PullRequestReviewsEnforcementLevelChanges represents the changes made to the PullRequestReviewsEnforcementLevel policy. type PullRequestReviewsEnforcementLevelChanges struct { From *string `json:"from,omitempty"` } // RequireCodeOwnerReviewChanges represents the changes made to the RequireCodeOwnerReview policy. type RequireCodeOwnerReviewChanges struct { From *bool `json:"from,omitempty"` } // RequiredConversationResolutionLevelChanges represents the changes made to the RequiredConversationResolutionLevel policy. type RequiredConversationResolutionLevelChanges struct { From *string `json:"from,omitempty"` } // RequiredDeploymentsEnforcementLevelChanges represents the changes made to the RequiredDeploymentsEnforcementLevel policy. type RequiredDeploymentsEnforcementLevelChanges struct { From *string `json:"from,omitempty"` } // RequiredStatusChecksChanges represents the changes made to the RequiredStatusChecks policy. type RequiredStatusChecksChanges struct { From []string `json:"from,omitempty"` } // RequiredStatusChecksEnforcementLevelChanges represents the changes made to the RequiredStatusChecksEnforcementLevel policy. type RequiredStatusChecksEnforcementLevelChanges struct { From *string `json:"from,omitempty"` } // SignatureRequirementEnforcementLevelChanges represents the changes made to the SignatureRequirementEnforcementLevel policy. type SignatureRequirementEnforcementLevelChanges struct { From *string `json:"from,omitempty"` } // 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"` // BlockCreations, if set to true, will cause the restrictions setting to also block pushes // which create new branches, unless initiated by a user, team, app with the ability to push. BlockCreations *bool `json:"block_creations,omitempty"` // LockBranch, if set to true, will prevent users from pushing to the branch. LockBranch *bool `json:"lock_branch,omitempty"` // AllowForkSyncing, if set to true, will allow users to pull changes from upstream // when the branch is locked. AllowForkSyncing *bool `json:"allow_fork_syncing,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. An empty slice is valid. (Deprecated. Note: only one of // Contexts/Checks can be populated, but at least one must be populated). Contexts *[]string `json:"contexts,omitempty"` // The list of status checks to require in order to merge into this // branch. An empty slice is valid. Checks *[]*RequiredStatusCheck `json:"checks,omitempty"` ContextsURL *string `json:"contexts_url,omitempty"` URL *string `json:"url,omitempty"` } // RequiredStatusChecksRequest represents a request to edit a protected branch's status checks. type RequiredStatusChecksRequest struct { Strict *bool `json:"strict,omitempty"` // Deprecated. Note: if both Contexts and Checks are populated, // the GitHub API will only use Checks. Contexts []string `json:"contexts,omitempty"` Checks []*RequiredStatusCheck `json:"checks,omitempty"` } // RequiredStatusCheck represents a status check of a protected branch. type RequiredStatusCheck struct { // The name of the required check. Context string `json:"context"` // The ID of the GitHub App that must provide this check. // Omit this field to automatically select the GitHub App // that has recently provided this check, // or any app if it was not set by a GitHub App. // Pass -1 to explicitly allow any app to set the status. AppID *int64 `json:"app_id,omitempty"` } // PullRequestReviewsEnforcement represents the pull request reviews enforcement of a protected branch. type PullRequestReviewsEnforcement struct { // Allow specific users, teams, or apps to bypass pull request requirements. BypassPullRequestAllowances *BypassPullRequestAllowances `json:"bypass_pull_request_allowances,omitempty"` // Specifies which users, teams and apps 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"` // RequireLastPushApproval specifies whether the last pusher to a pull request branch can approve it. RequireLastPushApproval bool `json:"require_last_push_approval"` } // 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 { // Allow specific users, teams, or apps to bypass pull request requirements. BypassPullRequestAllowancesRequest *BypassPullRequestAllowancesRequest `json:"bypass_pull_request_allowances,omitempty"` // Specifies which users, teams and apps should be allowed to dismiss pull request reviews. // User, team and app 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"` // RequireLastPushApproval specifies whether the last pusher to a pull request branch can approve it. RequireLastPushApproval *bool `json:"require_last_push_approval,omitempty"` } // 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 { // Allow specific users, teams, or apps to bypass pull request requirements. BypassPullRequestAllowancesRequest *BypassPullRequestAllowancesRequest `json:"bypass_pull_request_allowances,omitempty"` // Specifies which users, teams and apps 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 merging pull requests is blocked until code owners have reviewed. 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 or 0 to not require reviewers. RequiredApprovingReviewCount int `json:"required_approving_review_count"` // RequireLastPushApproval specifies whether the last pusher to a pull request branch can approve it. RequireLastPushApproval *bool `json:"require_last_push_approval,omitempty"` } // 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 requires all comments on the pull request to be resolved before it can be // merged to a protected branch when enabled. 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"` } // BypassPullRequestAllowances represents the people, teams, or apps who are allowed to bypass required pull requests. type BypassPullRequestAllowances struct { // The list of users allowed to bypass pull request requirements. Users []*User `json:"users"` // The list of teams allowed to bypass pull request requirements. Teams []*Team `json:"teams"` // The list of apps allowed to bypass pull request requirements. Apps []*App `json:"apps"` } // BypassPullRequestAllowancesRequest represents the people, teams, or apps who are // allowed to bypass required pull requests. // It is separate from BypassPullRequestAllowances above because the request structure is // different from the response structure. type BypassPullRequestAllowancesRequest struct { // The list of user logins allowed to bypass pull request requirements. Users []string `json:"users"` // The list of team slugs allowed to bypass pull request requirements. Teams []string `json:"teams"` // The list of app slugs allowed to bypass pull request requirements. Apps []string `json:"apps"` } // 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"` // The list of apps which can dismiss pull request reviews. Apps []*App `json:"apps"` } // DismissalRestrictionsRequest represents the request to create/edit the // restriction to allows only specific users, teams or apps 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"` // The list of app slugs which can dismiss pull request reviews. (Required; use nil to disable dismissal_restrictions or &[]string{} otherwise.) Apps *[]string `json:"apps,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"` } // AutomatedSecurityFixes represents their status. type AutomatedSecurityFixes struct { Enabled *bool `json:"enabled"` Paused *bool `json:"paused"` } // ListBranches lists branches for the specified repository. // // GitHub API docs: https://docs.github.com/rest/branches/branches#list-branches // //meta:operation GET /repos/{owner}/{repo}/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. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branches#get-a-branch // //meta:operation GET /repos/{owner}/{repo}/branches/{branch} func (s *RepositoriesService) GetBranch(ctx context.Context, owner, repo, branch string, maxRedirects int) (*Branch, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v", owner, repo, url.PathEscape(branch)) resp, err := s.client.roundTripWithOptionalFollowRedirect(ctx, u, maxRedirects) 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 } // renameBranchRequest represents a request to rename a branch. type renameBranchRequest struct { NewName string `json:"new_name"` } // RenameBranch renames a branch in a repository. // // To rename a non-default branch: Users must have push access. GitHub Apps must have the `contents:write` repository permission. // To rename the default branch: Users must have admin or owner permissions. GitHub Apps must have the `administration:write` repository permission. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branches#rename-a-branch // //meta:operation POST /repos/{owner}/{repo}/branches/{branch}/rename func (s *RepositoriesService) RenameBranch(ctx context.Context, owner, repo, branch, newName string) (*Branch, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/rename", owner, repo, url.PathEscape(branch)) r := &renameBranchRequest{NewName: newName} req, err := s.client.NewRequest("POST", u, r) if err != nil { return nil, nil, err } b := new(Branch) resp, err := s.client.Do(ctx, req, b) if err != nil { return nil, resp, err } return b, resp, nil } // GetBranchProtection gets the protection of a given branch. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#get-branch-protection // //meta:operation GET /repos/{owner}/{repo}/branches/{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, url.PathEscape(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 { if isBranchNotProtected(err) { err = ErrBranchNotProtected } return nil, resp, err } return p, resp, nil } // GetRequiredStatusChecks gets the required status checks for a given protected branch. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#get-status-checks-protection // //meta:operation GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks 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, url.PathEscape(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 { if isBranchNotProtected(err) { err = ErrBranchNotProtected } return nil, resp, err } return p, resp, nil } // ListRequiredStatusChecksContexts lists the required status checks contexts for a given protected branch. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#get-all-status-check-contexts // //meta:operation GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/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, url.PathEscape(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 { if isBranchNotProtected(err) { err = ErrBranchNotProtected } return nil, resp, err } return contexts, resp, nil } // UpdateBranchProtection updates the protection of a given branch. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#update-branch-protection // //meta:operation PUT /repos/{owner}/{repo}/branches/{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, url.PathEscape(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. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#delete-branch-protection // //meta:operation DELETE /repos/{owner}/{repo}/branches/{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, url.PathEscape(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. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#get-commit-signature-protection // //meta:operation GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures 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, url.PathEscape(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. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#create-commit-signature-protection // //meta:operation POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures 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, url.PathEscape(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, nil } // OptionalSignaturesOnProtectedBranch removes required signed commits on a given branch. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#delete-commit-signature-protection // //meta:operation DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures 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, url.PathEscape(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. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#update-status-check-protection // //meta:operation PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks 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, url.PathEscape(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. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#remove-status-check-protection // //meta:operation DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks 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, url.PathEscape(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/rest/licenses/licenses#get-the-license-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/license 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. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#get-pull-request-review-protection // //meta:operation GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews 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, url.PathEscape(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. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#update-pull-request-review-protection // //meta:operation PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews 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, url.PathEscape(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, nil } // DisableDismissalRestrictions disables dismissal restrictions of a protected branch. // It requires admin access and branch protection to be enabled. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#update-pull-request-review-protection // //meta:operation PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews 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, url.PathEscape(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, nil } // RemovePullRequestReviewEnforcement removes pull request enforcement of a protected branch. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#delete-pull-request-review-protection // //meta:operation DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews 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, url.PathEscape(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. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#get-admin-branch-protection // //meta:operation GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins 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, url.PathEscape(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. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#set-admin-branch-protection // //meta:operation POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins 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, url.PathEscape(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, nil } // RemoveAdminEnforcement removes admin enforcement from a protected branch. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#delete-admin-branch-protection // //meta:operation DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins 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, url.PathEscape(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/rest/repos/repos#get-all-repository-topics // //meta:operation GET /repos/{owner}/{repo}/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 all repository topics. // // GitHub API docs: https://docs.github.com/rest/repos/repos#replace-all-repository-topics // //meta:operation PUT /repos/{owner}/{repo}/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. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // Deprecated: Please use ListAppRestrictions instead. // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#get-apps-with-access-to-the-protected-branch // //meta:operation GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps 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, url.PathEscape(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 } // ListAppRestrictions 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. // // Note: This is a wrapper around ListApps so a naming convention with ListUserRestrictions and ListTeamRestrictions is preserved. // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#get-apps-with-access-to-the-protected-branch // //meta:operation GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps func (s *RepositoriesService) ListAppRestrictions(ctx context.Context, owner, repo, branch string) ([]*App, *Response, error) { return s.ListApps(ctx, owner, repo, branch) } // 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. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#set-app-access-restrictions // //meta:operation PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps func (s *RepositoriesService) ReplaceAppRestrictions(ctx context.Context, owner, repo, branch string, apps []string) ([]*App, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, url.PathEscape(branch)) req, err := s.client.NewRequest("PUT", u, apps) if err != nil { return nil, nil, err } var newApps []*App resp, err := s.client.Do(ctx, req, &newApps) if err != nil { return nil, resp, err } return newApps, 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. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#add-app-access-restrictions // //meta:operation POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps func (s *RepositoriesService) AddAppRestrictions(ctx context.Context, owner, repo, branch string, apps []string) ([]*App, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, url.PathEscape(branch)) req, err := s.client.NewRequest("POST", u, apps) if err != nil { return nil, nil, err } var newApps []*App resp, err := s.client.Do(ctx, req, &newApps) if err != nil { return nil, resp, err } return newApps, resp, nil } // RemoveAppRestrictions removes the restrictions of an app from pushing 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. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#remove-app-access-restrictions // //meta:operation DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps func (s *RepositoriesService) RemoveAppRestrictions(ctx context.Context, owner, repo, branch string, apps []string) ([]*App, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/apps", owner, repo, url.PathEscape(branch)) req, err := s.client.NewRequest("DELETE", u, apps) if err != nil { return nil, nil, err } var newApps []*App resp, err := s.client.Do(ctx, req, &newApps) if err != nil { return nil, resp, err } return newApps, resp, nil } // ListTeamRestrictions lists the GitHub teams that have push access to a given protected branch. // It requires the GitHub teams to have `write` access to the `content` permission. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#get-teams-with-access-to-the-protected-branch // //meta:operation GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams func (s *RepositoriesService) ListTeamRestrictions(ctx context.Context, owner, repo, branch string) ([]*Team, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/teams", owner, repo, url.PathEscape(branch)) 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 } // ReplaceTeamRestrictions replaces the team that have push access to a given protected branch. // This removes all teams that previously had push access and grants push access to the new list of teams. // It requires the GitHub teams to have `write` access to the `content` permission. // // Note: The list of users, apps, and teams in total is limited to 100 items. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#set-team-access-restrictions // //meta:operation PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams func (s *RepositoriesService) ReplaceTeamRestrictions(ctx context.Context, owner, repo, branch string, teams []string) ([]*Team, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/teams", owner, repo, url.PathEscape(branch)) req, err := s.client.NewRequest("PUT", u, teams) if err != nil { return nil, nil, err } var newTeams []*Team resp, err := s.client.Do(ctx, req, &newTeams) if err != nil { return nil, resp, err } return newTeams, resp, nil } // AddTeamRestrictions grants the specified teams push access to a given protected branch. // It requires the GitHub teams to have `write` access to the `content` permission. // // Note: The list of users, apps, and teams in total is limited to 100 items. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#add-team-access-restrictions // //meta:operation POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams func (s *RepositoriesService) AddTeamRestrictions(ctx context.Context, owner, repo, branch string, teams []string) ([]*Team, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/teams", owner, repo, url.PathEscape(branch)) req, err := s.client.NewRequest("POST", u, teams) if err != nil { return nil, nil, err } var newTeams []*Team resp, err := s.client.Do(ctx, req, &newTeams) if err != nil { return nil, resp, err } return newTeams, resp, nil } // RemoveTeamRestrictions removes the restrictions of a team from pushing to this branch. // It requires the GitHub teams to have `write` access to the `content` permission. // // Note: The list of users, apps, and teams in total is limited to 100 items. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#remove-team-access-restrictions // //meta:operation DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams func (s *RepositoriesService) RemoveTeamRestrictions(ctx context.Context, owner, repo, branch string, teams []string) ([]*Team, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/teams", owner, repo, url.PathEscape(branch)) req, err := s.client.NewRequest("DELETE", u, teams) if err != nil { return nil, nil, err } var newTeams []*Team resp, err := s.client.Do(ctx, req, &newTeams) if err != nil { return nil, resp, err } return newTeams, resp, nil } // ListUserRestrictions lists the GitHub users that have push access to a given protected branch. // It requires the GitHub users to have `write` access to the `content` permission. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#get-users-with-access-to-the-protected-branch // //meta:operation GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users func (s *RepositoriesService) ListUserRestrictions(ctx context.Context, owner, repo, branch string) ([]*User, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/users", owner, repo, url.PathEscape(branch)) 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 } // ReplaceUserRestrictions replaces the user that have push access to a given protected branch. // It removes all users that previously had push access and grants push access to the new list of users. // It requires the GitHub users to have `write` access to the `content` permission. // // Note: The list of users, apps, and teams in total is limited to 100 items. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#set-user-access-restrictions // //meta:operation PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users func (s *RepositoriesService) ReplaceUserRestrictions(ctx context.Context, owner, repo, branch string, users []string) ([]*User, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/users", owner, repo, url.PathEscape(branch)) req, err := s.client.NewRequest("PUT", u, users) if err != nil { return nil, nil, err } var newUsers []*User resp, err := s.client.Do(ctx, req, &newUsers) if err != nil { return nil, resp, err } return newUsers, resp, nil } // AddUserRestrictions grants the specified users push access to a given protected branch. // It requires the GitHub users to have `write` access to the `content` permission. // // Note: The list of users, apps, and teams in total is limited to 100 items. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#add-user-access-restrictions // //meta:operation POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users func (s *RepositoriesService) AddUserRestrictions(ctx context.Context, owner, repo, branch string, users []string) ([]*User, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/users", owner, repo, url.PathEscape(branch)) req, err := s.client.NewRequest("POST", u, users) if err != nil { return nil, nil, err } var newUsers []*User resp, err := s.client.Do(ctx, req, &newUsers) if err != nil { return nil, resp, err } return newUsers, resp, nil } // RemoveUserRestrictions removes the restrictions of a user from pushing to this branch. // It requires the GitHub users to have `write` access to the `content` permission. // // Note: The list of users, apps, and teams in total is limited to 100 items. // // Note: the branch name is URL path escaped for you. See: https://pkg.go.dev/net/url#PathEscape . // // GitHub API docs: https://docs.github.com/rest/branches/branch-protection#remove-user-access-restrictions // //meta:operation DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users func (s *RepositoriesService) RemoveUserRestrictions(ctx context.Context, owner, repo, branch string, users []string) ([]*User, *Response, error) { u := fmt.Sprintf("repos/%v/%v/branches/%v/protection/restrictions/users", owner, repo, url.PathEscape(branch)) req, err := s.client.NewRequest("DELETE", u, users) if err != nil { return nil, nil, err } var newUsers []*User resp, err := s.client.Do(ctx, req, &newUsers) if err != nil { return nil, resp, err } return newUsers, resp, nil } // TransferRequest represents a request to transfer a repository. type TransferRequest struct { NewOwner string `json:"new_owner"` NewName *string `json:"new_name,omitempty"` 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/rest/repos/repos#transfer-a-repository // //meta:operation POST /repos/{owner}/{repo}/transfer 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/rest/repos/repos#create-a-repository-dispatch-event // //meta:operation POST /repos/{owner}/{repo}/dispatches 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 } // isBranchNotProtected determines whether a branch is not protected // based on the error message returned by GitHub API. func isBranchNotProtected(err error) bool { errorResponse, ok := err.(*ErrorResponse) return ok && errorResponse.Message == githubBranchNotProtected } // EnablePrivateReporting enables private reporting of vulnerabilities for a // repository. // // GitHub API docs: https://docs.github.com/rest/repos/repos#enable-private-vulnerability-reporting-for-a-repository // //meta:operation PUT /repos/{owner}/{repo}/private-vulnerability-reporting func (s *RepositoriesService) EnablePrivateReporting(ctx context.Context, owner, repo string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/private-vulnerability-reporting", owner, repo) 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 } // DisablePrivateReporting disables private reporting of vulnerabilities for a // repository. // // GitHub API docs: https://docs.github.com/rest/repos/repos#disable-private-vulnerability-reporting-for-a-repository // //meta:operation DELETE /repos/{owner}/{repo}/private-vulnerability-reporting func (s *RepositoriesService) DisablePrivateReporting(ctx context.Context, owner, repo string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/private-vulnerability-reporting", owner, repo) 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-60.0.0/github/repos_actions_access.go000066400000000000000000000044341457013574700215060ustar00rootroot00000000000000// Copyright 2022 The go-github 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" ) // RepositoryActionsAccessLevel represents the repository actions access level. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#set-the-level-of-access-for-workflows-outside-of-the-repository type RepositoryActionsAccessLevel struct { // AccessLevel specifies the level of access that workflows outside of the repository have // to actions and reusable workflows within the repository. // Possible values are: "none", "organization" "enterprise". AccessLevel *string `json:"access_level,omitempty"` } // GetActionsAccessLevel gets the level of access that workflows outside of the repository have // to actions and reusable workflows in the repository. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#get-the-level-of-access-for-workflows-outside-of-the-repository // //meta:operation GET /repos/{owner}/{repo}/actions/permissions/access func (s *RepositoriesService) GetActionsAccessLevel(ctx context.Context, owner, repo string) (*RepositoryActionsAccessLevel, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/permissions/access", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } raal := new(RepositoryActionsAccessLevel) resp, err := s.client.Do(ctx, req, raal) if err != nil { return nil, resp, err } return raal, resp, nil } // EditActionsAccessLevel sets the level of access that workflows outside of the repository have // to actions and reusable workflows in the repository. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#set-the-level-of-access-for-workflows-outside-of-the-repository // //meta:operation PUT /repos/{owner}/{repo}/actions/permissions/access func (s *RepositoriesService) EditActionsAccessLevel(ctx context.Context, owner, repo string, repositoryActionsAccessLevel RepositoryActionsAccessLevel) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/permissions/access", owner, repo) req, err := s.client.NewRequest("PUT", u, repositoryActionsAccessLevel) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/repos_actions_access_test.go000066400000000000000000000053711457013574700225460ustar00rootroot00000000000000// Copyright 2022 The go-github 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_GetActionsAccessLevel(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/permissions/access", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprintf(w, `{"access_level": "none"}`) }) ctx := context.Background() org, _, err := client.Repositories.GetActionsAccessLevel(ctx, "o", "r") if err != nil { t.Errorf("Repositories.GetActionsAccessLevel returned error: %v", err) } want := &RepositoryActionsAccessLevel{AccessLevel: String("none")} if !cmp.Equal(org, want) { t.Errorf("Repositories.GetActionsAccessLevel returned %+v, want %+v", org, want) } const methodName = "GetActionsAccessLevel" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetActionsAccessLevel(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetActionsAccessLevel(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_EditActionsAccessLevel(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &RepositoryActionsAccessLevel{AccessLevel: String("organization")} mux.HandleFunc("/repos/o/r/actions/permissions/access", func(w http.ResponseWriter, r *http.Request) { v := new(RepositoryActionsAccessLevel) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "PUT") if !cmp.Equal(v, input) { t.Errorf("Request body = %+v, want %+v", v, input) } }) ctx := context.Background() _, err := client.Repositories.EditActionsAccessLevel(ctx, "o", "r", *input) if err != nil { t.Errorf("Repositories.EditActionsAccessLevel returned error: %v", err) } const methodName = "EditActionsAccessLevel" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.EditActionsAccessLevel(ctx, "\n", "\n", *input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { resp, err := client.Repositories.EditActionsAccessLevel(ctx, "o", "r", *input) return resp, err }) } func TestRepositoryActionsAccessLevel_Marshal(t *testing.T) { testJSONMarshal(t, &ActionsPermissions{}, "{}") u := &RepositoryActionsAccessLevel{ AccessLevel: String("enterprise"), } want := `{ "access_level": "enterprise" }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/repos_actions_allowed.go000066400000000000000000000033461457013574700216750ustar00rootroot00000000000000// Copyright 2022 The go-github 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" ) // GetActionsAllowed gets the allowed actions and reusable workflows for a repository. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#get-allowed-actions-and-reusable-workflows-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/actions/permissions/selected-actions func (s *RepositoriesService) GetActionsAllowed(ctx context.Context, org, repo string) (*ActionsAllowed, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/permissions/selected-actions", org, repo) 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 allowed actions and reusable workflows for a repository. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#set-allowed-actions-and-reusable-workflows-for-a-repository // //meta:operation PUT /repos/{owner}/{repo}/actions/permissions/selected-actions func (s *RepositoriesService) EditActionsAllowed(ctx context.Context, org, repo string, actionsAllowed ActionsAllowed) (*ActionsAllowed, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/permissions/selected-actions", org, repo) 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) if err != nil { return nil, resp, err } return p, resp, nil } go-github-60.0.0/github/repos_actions_allowed_test.go000066400000000000000000000060301457013574700227250ustar00rootroot00000000000000// Copyright 2022 The go-github 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 TestRepositoryService_GetActionsAllowed(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/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.Repositories.GetActionsAllowed(ctx, "o", "r") if err != nil { t.Errorf("Repositories.GetActionsAllowed returned error: %v", err) } want := &ActionsAllowed{GithubOwnedAllowed: Bool(true), VerifiedAllowed: Bool(false), PatternsAllowed: []string{"a/b"}} if !cmp.Equal(org, want) { t.Errorf("Repositories.GetActionsAllowed returned %+v, want %+v", org, want) } const methodName = "GetActionsAllowed" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetActionsAllowed(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetActionsAllowed(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_EditActionsAllowed(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ActionsAllowed{GithubOwnedAllowed: Bool(true), VerifiedAllowed: Bool(false), PatternsAllowed: []string{"a/b"}} mux.HandleFunc("/repos/o/r/actions/permissions/selected-actions", func(w http.ResponseWriter, r *http.Request) { v := new(ActionsAllowed) assertNilError(t, 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.Repositories.EditActionsAllowed(ctx, "o", "r", *input) if err != nil { t.Errorf("Repositories.EditActionsAllowed returned error: %v", err) } want := &ActionsAllowed{GithubOwnedAllowed: Bool(true), VerifiedAllowed: Bool(false), PatternsAllowed: []string{"a/b"}} if !cmp.Equal(org, want) { t.Errorf("Repositories.EditActionsAllowed returned %+v, want %+v", org, want) } const methodName = "EditActionsAllowed" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.EditActionsAllowed(ctx, "\n", "\n", *input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.EditActionsAllowed(ctx, "o", "r", *input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/repos_actions_permissions.go000066400000000000000000000105171457013574700226170ustar00rootroot00000000000000// Copyright 2022 The go-github 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" ) // ActionsPermissionsRepository represents a policy for repositories and allowed actions in a repository. // // GitHub API docs: https://docs.github.com/rest/actions/permissions type ActionsPermissionsRepository struct { Enabled *bool `json:"enabled,omitempty"` AllowedActions *string `json:"allowed_actions,omitempty"` SelectedActionsURL *string `json:"selected_actions_url,omitempty"` } func (a ActionsPermissionsRepository) String() string { return Stringify(a) } // DefaultWorkflowPermissionRepository represents the default permissions for GitHub Actions workflows for a repository. // // GitHub API docs: https://docs.github.com/rest/actions/permissions type DefaultWorkflowPermissionRepository struct { DefaultWorkflowPermissions *string `json:"default_workflow_permissions,omitempty"` CanApprovePullRequestReviews *bool `json:"can_approve_pull_request_reviews,omitempty"` } // GetActionsPermissions gets the GitHub Actions permissions policy for repositories and allowed actions in a repository. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#get-github-actions-permissions-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/actions/permissions func (s *RepositoriesService) GetActionsPermissions(ctx context.Context, owner, repo string) (*ActionsPermissionsRepository, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/permissions", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } permissions := new(ActionsPermissionsRepository) 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 a repository. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#set-github-actions-permissions-for-a-repository // //meta:operation PUT /repos/{owner}/{repo}/actions/permissions func (s *RepositoriesService) EditActionsPermissions(ctx context.Context, owner, repo string, actionsPermissionsRepository ActionsPermissionsRepository) (*ActionsPermissionsRepository, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/permissions", owner, repo) req, err := s.client.NewRequest("PUT", u, actionsPermissionsRepository) if err != nil { return nil, nil, err } permissions := new(ActionsPermissionsRepository) resp, err := s.client.Do(ctx, req, permissions) if err != nil { return nil, resp, err } return permissions, resp, nil } // GetDefaultWorkflowPermissions gets the GitHub Actions default workflow permissions in a repository. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#get-default-workflow-permissions-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/actions/permissions/workflow func (s *RepositoriesService) GetDefaultWorkflowPermissions(ctx context.Context, owner, repo string) (*DefaultWorkflowPermissionRepository, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/permissions/workflow", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } permissions := new(DefaultWorkflowPermissionRepository) resp, err := s.client.Do(ctx, req, permissions) if err != nil { return nil, resp, err } return permissions, resp, nil } // EditDefaultWorkflowPermissions sets the GitHub Actions default workflow permissions in a repository. // // GitHub API docs: https://docs.github.com/rest/actions/permissions#set-default-workflow-permissions-for-a-repository // //meta:operation PUT /repos/{owner}/{repo}/actions/permissions/workflow func (s *RepositoriesService) EditDefaultWorkflowPermissions(ctx context.Context, owner, repo string, permissions DefaultWorkflowPermissionRepository) (*DefaultWorkflowPermissionRepository, *Response, error) { u := fmt.Sprintf("repos/%v/%v/actions/permissions/workflow", owner, repo) req, err := s.client.NewRequest("PUT", u, permissions) if err != nil { return nil, nil, err } p := new(DefaultWorkflowPermissionRepository) resp, err := s.client.Do(ctx, req, p) if err != nil { return nil, resp, err } return p, resp, nil } go-github-60.0.0/github/repos_actions_permissions_test.go000066400000000000000000000143741457013574700236630ustar00rootroot00000000000000// Copyright 2022 The go-github 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_GetActionsPermissions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/permissions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"enabled": true, "allowed_actions": "all"}`) }) ctx := context.Background() org, _, err := client.Repositories.GetActionsPermissions(ctx, "o", "r") if err != nil { t.Errorf("Repositories.GetActionsPermissions returned error: %v", err) } want := &ActionsPermissionsRepository{Enabled: Bool(true), AllowedActions: String("all")} if !cmp.Equal(org, want) { t.Errorf("Repositories.GetActionsPermissions returned %+v, want %+v", org, want) } const methodName = "GetActionsPermissions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetActionsPermissions(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetActionsPermissions(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_EditActionsPermissions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ActionsPermissionsRepository{Enabled: Bool(true), AllowedActions: String("selected")} mux.HandleFunc("/repos/o/r/actions/permissions", func(w http.ResponseWriter, r *http.Request) { v := new(ActionsPermissionsRepository) assertNilError(t, 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": true, "allowed_actions": "selected"}`) }) ctx := context.Background() org, _, err := client.Repositories.EditActionsPermissions(ctx, "o", "r", *input) if err != nil { t.Errorf("Repositories.EditActionsPermissions returned error: %v", err) } want := &ActionsPermissionsRepository{Enabled: Bool(true), AllowedActions: String("selected")} if !cmp.Equal(org, want) { t.Errorf("Repositories.EditActionsPermissions returned %+v, want %+v", org, want) } const methodName = "EditActionsPermissions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.EditActionsPermissions(ctx, "\n", "\n", *input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.EditActionsPermissions(ctx, "o", "r", *input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestActionsPermissionsRepository_Marshal(t *testing.T) { testJSONMarshal(t, &ActionsPermissions{}, "{}") u := &ActionsPermissionsRepository{ Enabled: Bool(true), AllowedActions: String("all"), SelectedActionsURL: String("someURL"), } want := `{ "enabled": true, "allowed_actions": "all", "selected_actions_url": "someURL" }` testJSONMarshal(t, u, want) } func TestRepositoriesService_GetDefaultWorkflowPermissions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/actions/permissions/workflow", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "default_workflow_permissions": "read", "can_approve_pull_request_reviews": true }`) }) ctx := context.Background() org, _, err := client.Repositories.GetDefaultWorkflowPermissions(ctx, "o", "r") if err != nil { t.Errorf("Repositories.GetDefaultWorkflowPermissions returned error: %v", err) } want := &DefaultWorkflowPermissionRepository{DefaultWorkflowPermissions: String("read"), CanApprovePullRequestReviews: Bool(true)} if !cmp.Equal(org, want) { t.Errorf("Repositories.GetDefaultWorkflowPermissions returned %+v, want %+v", org, want) } const methodName = "GetDefaultWorkflowPermissions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetDefaultWorkflowPermissions(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetDefaultWorkflowPermissions(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_EditDefaultWorkflowPermissions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &DefaultWorkflowPermissionRepository{DefaultWorkflowPermissions: String("read"), CanApprovePullRequestReviews: Bool(true)} mux.HandleFunc("/repos/o/r/actions/permissions/workflow", func(w http.ResponseWriter, r *http.Request) { v := new(DefaultWorkflowPermissionRepository) assertNilError(t, 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, `{ "default_workflow_permissions": "read", "can_approve_pull_request_reviews": true }`) }) ctx := context.Background() org, _, err := client.Repositories.EditDefaultWorkflowPermissions(ctx, "o", "r", *input) if err != nil { t.Errorf("Repositories.EditDefaultWorkflowPermissions returned error: %v", err) } want := &DefaultWorkflowPermissionRepository{DefaultWorkflowPermissions: String("read"), CanApprovePullRequestReviews: Bool(true)} if !cmp.Equal(org, want) { t.Errorf("Repositories.EditDefaultWorkflowPermissions returned %+v, want %+v", org, want) } const methodName = "EditDefaultWorkflowPermissions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.EditDefaultWorkflowPermissions(ctx, "\n", "\n", *input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.EditDefaultWorkflowPermissions(ctx, "o", "r", *input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/repos_autolinks.go000066400000000000000000000074261457013574700205420ustar00rootroot00000000000000// 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" ) // AutolinkOptions specifies parameters for RepositoriesService.AddAutolink method. type AutolinkOptions struct { KeyPrefix *string `json:"key_prefix,omitempty"` URLTemplate *string `json:"url_template,omitempty"` IsAlphanumeric *bool `json:"is_alphanumeric,omitempty"` } // Autolink represents autolinks to external resources like JIRA issues and Zendesk tickets. type Autolink struct { ID *int64 `json:"id,omitempty"` KeyPrefix *string `json:"key_prefix,omitempty"` URLTemplate *string `json:"url_template,omitempty"` IsAlphanumeric *bool `json:"is_alphanumeric,omitempty"` } // ListAutolinks returns a list of autolinks configured for the given repository. // Information about autolinks are only available to repository administrators. // // GitHub API docs: https://docs.github.com/rest/repos/autolinks#list-all-autolinks-of-a-repository // //meta:operation GET /repos/{owner}/{repo}/autolinks func (s *RepositoriesService) ListAutolinks(ctx context.Context, owner, repo string, opts *ListOptions) ([]*Autolink, *Response, error) { u := fmt.Sprintf("repos/%v/%v/autolinks", 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 autolinks []*Autolink resp, err := s.client.Do(ctx, req, &autolinks) if err != nil { return nil, resp, err } return autolinks, resp, nil } // AddAutolink creates an autolink reference for a repository. // Users with admin access to the repository can create an autolink. // // GitHub API docs: https://docs.github.com/rest/repos/autolinks#create-an-autolink-reference-for-a-repository // //meta:operation POST /repos/{owner}/{repo}/autolinks func (s *RepositoriesService) AddAutolink(ctx context.Context, owner, repo string, opts *AutolinkOptions) (*Autolink, *Response, error) { u := fmt.Sprintf("repos/%v/%v/autolinks", owner, repo) req, err := s.client.NewRequest("POST", u, opts) if err != nil { return nil, nil, err } al := new(Autolink) resp, err := s.client.Do(ctx, req, al) if err != nil { return nil, resp, err } return al, resp, nil } // GetAutolink returns a single autolink reference by ID that was configured for the given repository. // Information about autolinks are only available to repository administrators. // // GitHub API docs: https://docs.github.com/rest/repos/autolinks#get-an-autolink-reference-of-a-repository // //meta:operation GET /repos/{owner}/{repo}/autolinks/{autolink_id} func (s *RepositoriesService) GetAutolink(ctx context.Context, owner, repo string, id int64) (*Autolink, *Response, error) { u := fmt.Sprintf("repos/%v/%v/autolinks/%v", owner, repo, id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var autolink *Autolink resp, err := s.client.Do(ctx, req, &autolink) if err != nil { return nil, resp, err } return autolink, resp, nil } // DeleteAutolink deletes a single autolink reference by ID that was configured for the given repository. // Information about autolinks are only available to repository administrators. // // GitHub API docs: https://docs.github.com/rest/repos/autolinks#delete-an-autolink-reference-from-a-repository // //meta:operation DELETE /repos/{owner}/{repo}/autolinks/{autolink_id} func (s *RepositoriesService) DeleteAutolink(ctx context.Context, owner, repo string, id int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/autolinks/%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-60.0.0/github/repos_autolinks_test.go000066400000000000000000000134041457013574700215720ustar00rootroot00000000000000// 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 TestRepositoriesService_ListAutolinks(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/autolinks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "2"}) fmt.Fprintf(w, `[{"id":1, "key_prefix": "TICKET-", "url_template": "https://example.com/TICKET?query="}, {"id":2, "key_prefix": "STORY-", "url_template": "https://example.com/STORY?query="}]`) }) opt := &ListOptions{ Page: 2, } ctx := context.Background() autolinks, _, err := client.Repositories.ListAutolinks(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.ListAutolinks returned error: %v", err) } want := []*Autolink{ {ID: Int64(1), KeyPrefix: String("TICKET-"), URLTemplate: String("https://example.com/TICKET?query=")}, {ID: Int64(2), KeyPrefix: String("STORY-"), URLTemplate: String("https://example.com/STORY?query=")}, } if !cmp.Equal(autolinks, want) { t.Errorf("Repositories.ListAutolinks returned %+v, want %+v", autolinks, want) } const methodName = "ListAutolinks" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListAutolinks(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListAutolinks(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_AddAutolink(t *testing.T) { client, mux, _, teardown := setup() defer teardown() opt := &AutolinkOptions{ KeyPrefix: String("TICKET-"), URLTemplate: String("https://example.com/TICKET?query="), IsAlphanumeric: Bool(true), } mux.HandleFunc("/repos/o/r/autolinks", func(w http.ResponseWriter, r *http.Request) { v := new(AutolinkOptions) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "POST") if !cmp.Equal(v, opt) { t.Errorf("Request body = %+v, want %+v", v, opt) } w.WriteHeader(http.StatusOK) assertWrite(t, w, []byte(` { "key_prefix": "TICKET-", "url_template": "https://example.com/TICKET?query=", "is_alphanumeric": true } `)) }) ctx := context.Background() autolink, _, err := client.Repositories.AddAutolink(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.AddAutolink returned error: %v", err) } want := &Autolink{ KeyPrefix: String("TICKET-"), URLTemplate: String("https://example.com/TICKET?query="), IsAlphanumeric: Bool(true), } if !cmp.Equal(autolink, want) { t.Errorf("AddAutolink returned %+v, want %+v", autolink, want) } const methodName = "AddAutolink" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.AddAutolink(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.AddAutolink(ctx, "o", "r", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetAutolink(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/autolinks/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprintf(w, `{"id":1, "key_prefix": "TICKET-", "url_template": "https://example.com/TICKET?query="}`) }) ctx := context.Background() autolink, _, err := client.Repositories.GetAutolink(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.GetAutolink returned error: %v", err) } want := &Autolink{ID: Int64(1), KeyPrefix: String("TICKET-"), URLTemplate: String("https://example.com/TICKET?query=")} if !cmp.Equal(autolink, want) { t.Errorf("Repositories.GetAutolink returned %+v, want %+v", autolink, want) } const methodName = "GetAutolink" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetAutolink(ctx, "o", "r", 2) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_DeleteAutolink(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/autolinks/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Repositories.DeleteAutolink(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.DeleteAutolink returned error: %v", err) } const methodName = "DeleteAutolink" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DeleteAutolink(ctx, "o", "r", 2) }) } func TestAutolinkOptions_Marshal(t *testing.T) { testJSONMarshal(t, &AutolinkOptions{}, "{}") r := &AutolinkOptions{ KeyPrefix: String("kp"), URLTemplate: String("URLT"), IsAlphanumeric: Bool(true), } want := `{ "key_prefix": "kp", "url_template": "URLT", "is_alphanumeric": true }` testJSONMarshal(t, r, want) } func TestAutolink_Marshal(t *testing.T) { testJSONMarshal(t, &Autolink{}, "{}") r := &Autolink{ ID: Int64(1), KeyPrefix: String("kp"), URLTemplate: String("URLT"), IsAlphanumeric: Bool(true), } want := `{ "id": 1, "key_prefix": "kp", "url_template": "URLT", "is_alphanumeric": true }` testJSONMarshal(t, r, want) } go-github-60.0.0/github/repos_codeowners.go000066400000000000000000000036011457013574700206700ustar00rootroot00000000000000// Copyright 2022 The go-github 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" ) // GetCodeownersErrorsOptions specifies the optional parameters to the // RepositoriesService.GetCodeownersErrors method. type GetCodeownersErrorsOptions struct { // A branch, tag or commit name used to determine which version of the CODEOWNERS file to use. // Default: the repository's default branch (e.g. main). Ref string `url:"ref,omitempty"` } // CodeownersErrors represents a list of syntax errors detected in the CODEOWNERS file. type CodeownersErrors struct { Errors []*CodeownersError `json:"errors"` } // CodeownersError represents a syntax error detected in the CODEOWNERS file. type CodeownersError struct { Line int `json:"line"` Column int `json:"column"` Kind string `json:"kind"` Source string `json:"source"` Suggestion *string `json:"suggestion,omitempty"` Message string `json:"message"` Path string `json:"path"` } // GetCodeownersErrors lists any syntax errors that are detected in the CODEOWNERS file. // // GitHub API docs: https://docs.github.com/rest/repos/repos#list-codeowners-errors // //meta:operation GET /repos/{owner}/{repo}/codeowners/errors func (s *RepositoriesService) GetCodeownersErrors(ctx context.Context, owner, repo string, opts *GetCodeownersErrorsOptions) (*CodeownersErrors, *Response, error) { u := fmt.Sprintf("repos/%v/%v/codeowners/errors", 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 } codeownersErrors := &CodeownersErrors{} resp, err := s.client.Do(ctx, req, codeownersErrors) if err != nil { return nil, resp, err } return codeownersErrors, resp, nil } go-github-60.0.0/github/repos_codeowners_test.go000066400000000000000000000113641457013574700217340ustar00rootroot00000000000000// Copyright 2022 The go-github 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_GetCodeownersErrors_noRef(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/codeowners/errors", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeV3) fmt.Fprint(w, `{ "errors": [ { "line": 1, "column": 1, "kind": "Invalid pattern", "source": "***/*.rb @monalisa", "suggestion": "Did you mean **/*.rb?", "message": "Invalid pattern on line 3: Did you mean **/*.rb?\n\n ***/*.rb @monalisa\n ^", "path": ".github/CODEOWNERS" } ] } `) }) ctx := context.Background() codeownersErrors, _, err := client.Repositories.GetCodeownersErrors(ctx, "o", "r", nil) if err != nil { t.Errorf("Repositories.GetCodeownersErrors returned error: %v", err) } want := &CodeownersErrors{ Errors: []*CodeownersError{ { Line: 1, Column: 1, Kind: "Invalid pattern", Source: "***/*.rb @monalisa", Suggestion: String("Did you mean **/*.rb?"), Message: "Invalid pattern on line 3: Did you mean **/*.rb?\n\n ***/*.rb @monalisa\n ^", Path: ".github/CODEOWNERS", }, }, } if !cmp.Equal(codeownersErrors, want) { t.Errorf("Repositories.GetCodeownersErrors returned %+v, want %+v", codeownersErrors, want) } const methodName = "GetCodeownersErrors" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetCodeownersErrors(ctx, "\n", "\n", nil) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetCodeownersErrors(ctx, "o", "r", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetCodeownersErrors_specificRef(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/codeowners/errors", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeV3) testFormValues(t, r, values{"ref": "mybranch"}) fmt.Fprint(w, `{ "errors": [ { "line": 1, "column": 1, "kind": "Invalid pattern", "source": "***/*.rb @monalisa", "suggestion": "Did you mean **/*.rb?", "message": "Invalid pattern on line 3: Did you mean **/*.rb?\n\n ***/*.rb @monalisa\n ^", "path": ".github/CODEOWNERS" } ] } `) }) opts := &GetCodeownersErrorsOptions{Ref: "mybranch"} ctx := context.Background() codeownersErrors, _, err := client.Repositories.GetCodeownersErrors(ctx, "o", "r", opts) if err != nil { t.Errorf("Repositories.GetCodeownersErrors returned error: %v", err) } want := &CodeownersErrors{ Errors: []*CodeownersError{ { Line: 1, Column: 1, Kind: "Invalid pattern", Source: "***/*.rb @monalisa", Suggestion: String("Did you mean **/*.rb?"), Message: "Invalid pattern on line 3: Did you mean **/*.rb?\n\n ***/*.rb @monalisa\n ^", Path: ".github/CODEOWNERS", }, }, } if !cmp.Equal(codeownersErrors, want) { t.Errorf("Repositories.GetCodeownersErrors returned %+v, want %+v", codeownersErrors, want) } const methodName = "GetCodeownersErrors" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetCodeownersErrors(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetCodeownersErrors(ctx, "o", "r", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestCodeownersErrors_Marshal(t *testing.T) { testJSONMarshal(t, &CodeownersErrors{}, "{}") u := &CodeownersErrors{ Errors: []*CodeownersError{ { Line: 1, Column: 1, Kind: "Invalid pattern", Source: "***/*.rb @monalisa", Suggestion: String("Did you mean **/*.rb?"), Message: "Invalid pattern on line 3: Did you mean **/*.rb?\n\n ***/*.rb @monalisa\n ^", Path: ".github/CODEOWNERS", }, }, } want := `{ "errors": [ { "line": 1, "column": 1, "kind": "Invalid pattern", "source": "***/*.rb @monalisa", "suggestion": "Did you mean **/*.rb?", "message": "Invalid pattern on line 3: Did you mean **/*.rb?\n\n ***/*.rb @monalisa\n ^", "path": ".github/CODEOWNERS" } ] } ` testJSONMarshal(t, u, want) } go-github-60.0.0/github/repos_collaborators.go000066400000000000000000000152211457013574700213670ustar00rootroot00000000000000// 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"` // Permission specifies how collaborators should be filtered by the permissions they have on the repository. // Possible values are: // "pull", "triage", "push", "maintain", "admin" // // If not specified, all collaborators will be returned. Permission string `url:"permission,omitempty"` ListOptions } // CollaboratorInvitation represents an invitation created when adding a collaborator. // GitHub API docs: https://docs.github.com/rest/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/rest/collaborators/collaborators#list-repository-collaborators // //meta:operation GET /repos/{owner}/{repo}/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/rest/collaborators/collaborators#check-if-a-user-is-a-repository-collaborator // //meta:operation GET /repos/{owner}/{repo}/collaborators/{username} 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/rest/collaborators/collaborators#get-repository-permissions-for-a-user // //meta:operation GET /repos/{owner}/{repo}/collaborators/{username}/permission 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/rest/collaborators/collaborators#add-a-repository-collaborator // //meta:operation PUT /repos/{owner}/{repo}/collaborators/{username} 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/rest/collaborators/collaborators#remove-a-repository-collaborator // //meta:operation DELETE /repos/{owner}/{repo}/collaborators/{username} 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-60.0.0/github/repos_collaborators_test.go000066400000000000000000000362311457013574700224320ustar00rootroot00000000000000// 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_withPermission(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{"permission": "pull", "page": "2"}) fmt.Fprintf(w, `[{"id":1}, {"id":2}]`) }) opt := &ListCollaboratorsOptions{ ListOptions: ListOptions{Page: 2}, Permission: "pull", } 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) assertNilError(t, 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) assertWrite(t, w, []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-60.0.0/github/repos_comments.go000066400000000000000000000126451457013574700203550ustar00rootroot00000000000000// 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" ) // 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 *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `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/rest/commits/comments#list-commit-comments-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/comments 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/rest/commits/comments#list-commit-comments // //meta:operation GET /repos/{owner}/{repo}/commits/{commit_sha}/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/rest/commits/comments#create-a-commit-comment // //meta:operation POST /repos/{owner}/{repo}/commits/{commit_sha}/comments 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/rest/commits/comments#get-a-commit-comment // //meta:operation GET /repos/{owner}/{repo}/comments/{comment_id} 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/rest/commits/comments#update-a-commit-comment // //meta:operation PATCH /repos/{owner}/{repo}/comments/{comment_id} 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/rest/commits/comments#delete-a-commit-comment // //meta:operation DELETE /repos/{owner}/{repo}/comments/{comment_id} 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-60.0.0/github/repos_comments_test.go000066400000000000000000000252611457013574700214120ustar00rootroot00000000000000// 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) assertNilError(t, 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) assertNilError(t, 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: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{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-60.0.0/github/repos_commits.go000066400000000000000000000241761457013574700202050ustar00rootroot00000000000000// 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/rest/commits/commits#list-commits // //meta:operation GET /repos/{owner}/{repo}/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/rest/commits/commits#get-a-commit // //meta:operation GET /repos/{owner}/{repo}/commits/{ref} 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/rest/commits/commits#get-a-commit // //meta:operation GET /repos/{owner}/{repo}/commits/{ref} 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/rest/commits/commits#get-a-commit // //meta:operation GET /repos/{owner}/{repo}/commits/{ref} 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/rest/commits/commits#compare-two-commits // //meta:operation GET /repos/{owner}/{repo}/compare/{basehead} 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/rest/commits/commits#compare-two-commits // //meta:operation GET /repos/{owner}/{repo}/compare/{basehead} 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/rest/commits/commits#list-branches-for-head-commit // //meta:operation GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head 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-60.0.0/github/repos_commits_test.go000066400000000000000000000607711457013574700212450ustar00rootroot00000000000000// 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" ) 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.Fprint(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.Fprint(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.Fprint(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: &Timestamp{referenceTime}, Name: String("n"), Email: String("e"), Login: String("u"), }, Committer: &CommitAuthor{ Date: &Timestamp{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), }, 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-60.0.0/github/repos_community_health.go000066400000000000000000000043461457013574700221000ustar00rootroot00000000000000// 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" ) // Metric represents the different fields for one file in community health files. type Metric struct { Name *string `json:"name"` Key *string `json:"key"` SPDXID *string `json:"spdx_id"` URL *string `json:"url"` HTMLURL *string `json:"html_url"` NodeID *string `json:"node_id"` } // CommunityHealthFiles represents the different files in the community health metrics response. type CommunityHealthFiles struct { CodeOfConduct *Metric `json:"code_of_conduct"` CodeOfConductFile *Metric `json:"code_of_conduct_file"` 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"` Description *string `json:"description"` Documentation *string `json:"documentation"` Files *CommunityHealthFiles `json:"files"` UpdatedAt *Timestamp `json:"updated_at"` ContentReportsEnabled *bool `json:"content_reports_enabled"` } // GetCommunityHealthMetrics retrieves all the community health metrics for a repository. // // GitHub API docs: https://docs.github.com/rest/metrics/community#get-community-profile-metrics // //meta:operation GET /repos/{owner}/{repo}/community/profile 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 } metrics := &CommunityHealthMetrics{} resp, err := s.client.Do(ctx, req, metrics) if err != nil { return nil, resp, err } return metrics, resp, nil } go-github-60.0.0/github/repos_community_health_test.go000066400000000000000000000237251457013574700231410ustar00rootroot00000000000000// 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") fmt.Fprintf(w, `{ "health_percentage": 100, "description": "My first repository on GitHub!", "documentation": null, "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" }, "code_of_conduct_file": { "url": "https://api.github.com/repos/octocat/Hello-World/contents/CODE_OF_CONDUCT.md", "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" }, "issue_template": { "url": "https://api.github.com/repos/octocat/Hello-World/contents/ISSUE_TEMPLATE", "html_url": "https://github.com/octocat/Hello-World/blob/master/ISSUE_TEMPLATE" }, "pull_request_template": { "url": "https://api.github.com/repos/octocat/Hello-World/contents/PULL_REQUEST_TEMPLATE", "html_url": "https://github.com/octocat/Hello-World/blob/master/PULL_REQUEST_TEMPLATE" }, "license": { "name": "MIT License", "key": "mit", "spdx_id": "MIT", "url": "https://api.github.com/licenses/mit", "html_url": "https://github.com/octocat/Hello-World/blob/master/LICENSE", "node_id": "MDc6TGljZW5zZW1pdA==" }, "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", "content_reports_enabled": true }`) }) 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), Description: String("My first repository on GitHub!"), UpdatedAt: &Timestamp{updatedAt}, ContentReportsEnabled: Bool(true), 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"), }, CodeOfConductFile: &Metric{ URL: String("https://api.github.com/repos/octocat/Hello-World/contents/CODE_OF_CONDUCT.md"), 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"), }, IssueTemplate: &Metric{ URL: String("https://api.github.com/repos/octocat/Hello-World/contents/ISSUE_TEMPLATE"), HTMLURL: String("https://github.com/octocat/Hello-World/blob/master/ISSUE_TEMPLATE"), }, PullRequestTemplate: &Metric{ URL: String("https://api.github.com/repos/octocat/Hello-World/contents/PULL_REQUEST_TEMPLATE"), HTMLURL: String("https://github.com/octocat/Hello-World/blob/master/PULL_REQUEST_TEMPLATE"), }, License: &Metric{ Name: String("MIT License"), Key: String("mit"), SPDXID: String("MIT"), URL: String("https://api.github.com/licenses/mit"), HTMLURL: String("https://github.com/octocat/Hello-World/blob/master/LICENSE"), NodeID: String("MDc6TGljZW5zZW1pdA=="), }, 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"), SPDXID: String("spdx_id"), URL: String("url"), HTMLURL: String("hurl"), NodeID: String("node_id"), } want := `{ "name": "name", "key": "key", "spdx_id": "spdx_id", "url": "url", "html_url": "hurl", "node_id": "node_id" }` 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"), }, CodeOfConductFile: &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"), SPDXID: String("spdx_id"), URL: String("url"), HTMLURL: String("hurl"), NodeID: String("node_id"), }, 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" }, "code_of_conduct_file": { "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", "spdx_id": "spdx_id", "url": "url", "html_url": "hurl", "node_id": "node_id" }, "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), Description: String("desc"), Documentation: String("docs"), Files: &CommunityHealthFiles{ CodeOfConduct: &Metric{ Name: String("name"), Key: String("key"), URL: String("url"), HTMLURL: String("hurl"), }, CodeOfConductFile: &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"), SPDXID: String("spdx_id"), URL: String("url"), HTMLURL: String("hurl"), NodeID: String("node_id"), }, Readme: &Metric{ Name: String("name"), Key: String("key"), URL: String("url"), HTMLURL: String("hurl"), }, }, UpdatedAt: &Timestamp{referenceTime}, ContentReportsEnabled: Bool(true), } want := `{ "health_percentage": 1, "description": "desc", "documentation": "docs", "files": { "code_of_conduct": { "name": "name", "key": "key", "url": "url", "html_url": "hurl" }, "code_of_conduct_file": { "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", "spdx_id": "spdx_id", "url": "url", "html_url": "hurl", "node_id": "node_id" }, "readme": { "name": "name", "key": "key", "url": "url", "html_url": "hurl" } }, "updated_at": ` + referenceTimeStr + `, "content_reports_enabled": true }` testJSONMarshal(t, r, want) } go-github-60.0.0/github/repos_contents.go000066400000000000000000000313361457013574700203630ustar00rootroot00000000000000// 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/rest/repos/contents/ package github import ( "context" "encoding/base64" "encoding/json" "errors" "fmt" "io" "net/http" "net/url" "path" "strings" ) var ErrPathForbidden = errors.New("path must not contain '..' due to auth vulnerability issue") // 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"` SubmoduleGitURL *string `json:"submodule_git_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"` // 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 case "none": return "", errors.New("unsupported content encoding: none, this may occur when file size > 1 MB, if that is the case consider using DownloadContents") default: return "", fmt.Errorf("unsupported content encoding: %v", encoding) } } // GetReadme gets the Readme file for the repository. // // GitHub API docs: https://docs.github.com/rest/repos/contents#get-a-repository-readme // //meta:operation GET /repos/{owner}/{repo}/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. // // GitHub API docs: https://docs.github.com/rest/repos/contents#get-repository-content // //meta:operation GET /repos/{owner}/{repo}/contents/{path} 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. // // GitHub API docs: https://docs.github.com/rest/repos/contents#get-repository-content // //meta:operation GET /repos/{owner}/{repo}/contents/{path} 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. // // Due to an auth vulnerability issue in the GitHub v3 API, ".." is not allowed // to appear anywhere in the "path" or this method will return an error. // // GitHub API docs: https://docs.github.com/rest/repos/contents#get-repository-content // //meta:operation GET /repos/{owner}/{repo}/contents/{path} func (s *RepositoriesService) GetContents(ctx context.Context, owner, repo, path string, opts *RepositoryContentGetOptions) (fileContent *RepositoryContent, directoryContent []*RepositoryContent, resp *Response, err error) { if strings.Contains(path, "..") { return nil, nil, nil, ErrPathForbidden } 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/rest/repos/contents#create-or-update-file-contents // //meta:operation PUT /repos/{owner}/{repo}/contents/{path} 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/rest/repos/contents#create-or-update-file-contents // //meta:operation PUT /repos/{owner}/{repo}/contents/{path} 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/rest/repos/contents#delete-a-file // //meta:operation DELETE /repos/{owner}/{repo}/contents/{path} 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/rest/repos/contents#download-a-repository-archive-tar // GitHub API docs: https://docs.github.com/rest/repos/contents#download-a-repository-archive-zip // //meta:operation GET /repos/{owner}/{repo}/tarball/{ref} //meta:operation GET /repos/{owner}/{repo}/zipball/{ref} func (s *RepositoriesService) GetArchiveLink(ctx context.Context, owner, repo string, archiveformat ArchiveFormat, opts *RepositoryContentGetOptions, maxRedirects int) (*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.client.roundTripWithOptionalFollowRedirect(ctx, u, maxRedirects) if err != nil { return nil, nil, err } defer resp.Body.Close() 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")) if err != nil { return nil, newResponse(resp), err } return parsedURL, newResponse(resp), nil } go-github-60.0.0/github/repos_contents_test.go000066400000000000000000000725731457013574700214320ustar00rootroot00000000000000// 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" "net/http" "net/url" "testing" "github.com/google/go-cmp/cmp" ) 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, }, { encoding: String("none"), content: nil, 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 := io.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 := io.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 := io.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 := io.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_PathWithParent(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.Fatal("Repositories.GetContents expected error but got none") } } 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/yo", 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{Ref: "yo"}, 1) 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{}, 1) 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{}, 1) 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{}, 0) 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{}, 1) 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"), SubmoduleGitURL: String("smgurl"), } 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", "submodule_git_url": "smgurl" }` 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"), SubmoduleGitURL: String("smgurl"), }, Commit: Commit{ SHA: String("s"), Author: &CommitAuthor{ Date: &Timestamp{referenceTime}, Name: String("n"), Email: String("e"), Login: String("u"), }, Committer: &CommitAuthor{ Date: &Timestamp{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), }, } 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", "submodule_git_url": "smgurl" }, "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: &Timestamp{referenceTime}, Name: String("name"), Email: String("email"), Login: String("login"), }, Committer: &CommitAuthor{ Date: &Timestamp{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-60.0.0/github/repos_deployment_branch_policies.go000066400000000000000000000122071457013574700241060ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // DeploymentBranchPolicy represents a single deployment branch policy for an environment. type DeploymentBranchPolicy struct { Name *string `json:"name,omitempty"` ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Type *string `json:"type,omitempty"` } // DeploymentBranchPolicyResponse represents the slightly different format of response that comes back when you list deployment branch policies. type DeploymentBranchPolicyResponse struct { TotalCount *int `json:"total_count,omitempty"` BranchPolicies []*DeploymentBranchPolicy `json:"branch_policies,omitempty"` } // DeploymentBranchPolicyRequest represents a deployment branch policy request. type DeploymentBranchPolicyRequest struct { Name *string `json:"name,omitempty"` Type *string `json:"type,omitempty"` } // ListDeploymentBranchPolicies lists the deployment branch policies for an environment. // // GitHub API docs: https://docs.github.com/rest/deployments/branch-policies#list-deployment-branch-policies // //meta:operation GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies func (s *RepositoriesService) ListDeploymentBranchPolicies(ctx context.Context, owner, repo, environment string) (*DeploymentBranchPolicyResponse, *Response, error) { u := fmt.Sprintf("repos/%v/%v/environments/%v/deployment-branch-policies", owner, repo, environment) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var list *DeploymentBranchPolicyResponse resp, err := s.client.Do(ctx, req, &list) if err != nil { return nil, resp, err } return list, resp, nil } // GetDeploymentBranchPolicy gets a deployment branch policy for an environment. // // GitHub API docs: https://docs.github.com/rest/deployments/branch-policies#get-a-deployment-branch-policy // //meta:operation GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id} func (s *RepositoriesService) GetDeploymentBranchPolicy(ctx context.Context, owner, repo, environment string, branchPolicyID int64) (*DeploymentBranchPolicy, *Response, error) { u := fmt.Sprintf("repos/%v/%v/environments/%v/deployment-branch-policies/%v", owner, repo, environment, branchPolicyID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var policy *DeploymentBranchPolicy resp, err := s.client.Do(ctx, req, &policy) if err != nil { return nil, resp, err } return policy, resp, nil } // CreateDeploymentBranchPolicy creates a deployment branch policy for an environment. // // GitHub API docs: https://docs.github.com/rest/deployments/branch-policies#create-a-deployment-branch-policy // //meta:operation POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies func (s *RepositoriesService) CreateDeploymentBranchPolicy(ctx context.Context, owner, repo, environment string, request *DeploymentBranchPolicyRequest) (*DeploymentBranchPolicy, *Response, error) { u := fmt.Sprintf("repos/%v/%v/environments/%v/deployment-branch-policies", owner, repo, environment) req, err := s.client.NewRequest("POST", u, request) if err != nil { return nil, nil, err } var policy *DeploymentBranchPolicy resp, err := s.client.Do(ctx, req, &policy) if err != nil { return nil, resp, err } return policy, resp, nil } // UpdateDeploymentBranchPolicy updates a deployment branch policy for an environment. // // GitHub API docs: https://docs.github.com/rest/deployments/branch-policies#update-a-deployment-branch-policy // //meta:operation PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id} func (s *RepositoriesService) UpdateDeploymentBranchPolicy(ctx context.Context, owner, repo, environment string, branchPolicyID int64, request *DeploymentBranchPolicyRequest) (*DeploymentBranchPolicy, *Response, error) { u := fmt.Sprintf("repos/%v/%v/environments/%v/deployment-branch-policies/%v", owner, repo, environment, branchPolicyID) req, err := s.client.NewRequest("PUT", u, request) if err != nil { return nil, nil, err } var policy *DeploymentBranchPolicy resp, err := s.client.Do(ctx, req, &policy) if err != nil { return nil, resp, err } return policy, resp, nil } // DeleteDeploymentBranchPolicy deletes a deployment branch policy for an environment. // // GitHub API docs: https://docs.github.com/rest/deployments/branch-policies#delete-a-deployment-branch-policy // //meta:operation DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id} func (s *RepositoriesService) DeleteDeploymentBranchPolicy(ctx context.Context, owner, repo, environment string, branchPolicyID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/environments/%v/deployment-branch-policies/%v", owner, repo, environment, branchPolicyID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/repos_deployment_branch_policies_test.go000066400000000000000000000126301457013574700251450ustar00rootroot00000000000000// Copyright 2023 The go-github 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" "reflect" "testing" ) func TestRepositoriesService_ListDeploymentBranchPolicies(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/environments/e/deployment-branch-policies", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, `{"total_count":2, "branch_policies":[{"id":1}, {"id": 2}]}`) }) ctx := context.Background() got, _, err := client.Repositories.ListDeploymentBranchPolicies(ctx, "o", "r", "e") if err != nil { t.Errorf("Repositories.ListDeploymentBranchPolicies returned error: %v", err) } want := &DeploymentBranchPolicyResponse{ BranchPolicies: []*DeploymentBranchPolicy{ {ID: Int64(1)}, {ID: Int64(2)}, }, TotalCount: Int(2), } if !reflect.DeepEqual(got, want) { t.Errorf("Repositories.ListDeploymentBranchPolicies = %+v, want %+v", got, want) } const methodName = "ListDeploymentBranchPolicies" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListDeploymentBranchPolicies(ctx, "o", "r", "e") if got != nil { t.Errorf("got non-nil Repositories.ListDeploymentBranchPolicies response: %+v", got) } return resp, err }) } func TestRepositoriesService_GetDeploymentBranchPolicy(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/environments/e/deployment-branch-policies/1", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() got, _, err := client.Repositories.GetDeploymentBranchPolicy(ctx, "o", "r", "e", 1) if err != nil { t.Errorf("Repositories.GetDeploymentBranchPolicy returned error: %v", err) } want := &DeploymentBranchPolicy{ID: Int64(1)} if !reflect.DeepEqual(got, want) { t.Errorf("Repositories.GetDeploymentBranchPolicy = %+v, want %+v", got, want) } const methodName = "GetDeploymentBranchPolicy" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetDeploymentBranchPolicy(ctx, "o", "r", "e", 1) if got != nil { t.Errorf("got non-nil Repositories.GetDeploymentBranchPolicy response: %+v", got) } return resp, err }) } func TestRepositoriesService_CreateDeploymentBranchPolicy(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/environments/e/deployment-branch-policies", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"id":1, "type":"branch"}`) }) ctx := context.Background() got, _, err := client.Repositories.CreateDeploymentBranchPolicy(ctx, "o", "r", "e", &DeploymentBranchPolicyRequest{Name: String("n"), Type: String("branch")}) if err != nil { t.Errorf("Repositories.CreateDeploymentBranchPolicy returned error: %v", err) } want := &DeploymentBranchPolicy{ID: Int64(1), Type: String("branch")} if !reflect.DeepEqual(got, want) { t.Errorf("Repositories.CreateDeploymentBranchPolicy = %+v, want %+v", got, want) } const methodName = "CreateDeploymentBranchPolicy" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateDeploymentBranchPolicy(ctx, "o", "r", "e", &DeploymentBranchPolicyRequest{Name: String("n")}) if got != nil { t.Errorf("got non-nil Repositories.CreateDeploymentBranchPolicy response: %+v", got) } return resp, err }) } func TestRepositoriesService_UpdateDeploymentBranchPolicy(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/environments/e/deployment-branch-policies/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() got, _, err := client.Repositories.UpdateDeploymentBranchPolicy(ctx, "o", "r", "e", 1, &DeploymentBranchPolicyRequest{Name: String("n")}) if err != nil { t.Errorf("Repositories.UpdateDeploymentBranchPolicy returned error: %v", err) } want := &DeploymentBranchPolicy{ID: Int64(1)} if !reflect.DeepEqual(got, want) { t.Errorf("Repositories.UpdateDeploymentBranchPolicy = %+v, want %+v", got, want) } const methodName = "UpdateDeploymentBranchPolicy" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.UpdateDeploymentBranchPolicy(ctx, "o", "r", "e", 1, &DeploymentBranchPolicyRequest{Name: String("n")}) if got != nil { t.Errorf("got non-nil Repositories.UpdateDeploymentBranchPolicy response: %+v", got) } return resp, err }) } func TestRepositoriesService_DeleteDeploymentBranchPolicy(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/environments/e/deployment-branch-policies/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Repositories.DeleteDeploymentBranchPolicy(ctx, "o", "r", "e", 1) if err != nil { t.Errorf("Repositories.DeleteDeploymentBranchPolicy returned error: %v", err) } const methodName = "DeleteDeploymentBranchPolicy" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DeleteDeploymentBranchPolicy(ctx, "o", "r", "e", 1) }) } go-github-60.0.0/github/repos_deployment_protection_rules.go000066400000000000000000000145641457013574700243720ustar00rootroot00000000000000// Copyright 2024 The go-github 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" ) // CustomDeploymentProtectionRuleApp represents a single deployment protection rule app for an environment. type CustomDeploymentProtectionRuleApp struct { ID *int64 `json:"id,omitempty"` Slug *string `json:"slug,omitempty"` IntegrationURL *string `json:"integration_url,omitempty"` NodeID *string `json:"node_id,omitempty"` } // CustomDeploymentProtectionRule represents a single deployment protection rule for an environment. type CustomDeploymentProtectionRule struct { ID *int64 `json:"id,omitempty"` NodeID *string `json:"node_id,omitempty"` Enabled *bool `json:"enabled,omitempty"` App *CustomDeploymentProtectionRuleApp `json:"app,omitempty"` } // ListDeploymentProtectionRuleResponse represents the response that comes back when you list deployment protection rules. type ListDeploymentProtectionRuleResponse struct { TotalCount *int `json:"total_count,omitempty"` ProtectionRules []*CustomDeploymentProtectionRule `json:"custom_deployment_protection_rules,omitempty"` } // ListCustomDeploymentRuleIntegrationsResponse represents the slightly different response that comes back when you list custom deployment rule integrations. type ListCustomDeploymentRuleIntegrationsResponse struct { TotalCount *int `json:"total_count,omitempty"` AvailableIntegrations []*CustomDeploymentProtectionRuleApp `json:"available_custom_deployment_protection_rule_integrations,omitempty"` } // CustomDeploymentProtectionRuleRequest represents a deployment protection rule request. type CustomDeploymentProtectionRuleRequest struct { IntegrationID *int64 `json:"integration_id,omitempty"` } // GetAllDeploymentProtectionRules gets all the deployment protection rules for an environment. // // GitHub API docs: https://docs.github.com/rest/deployments/protection-rules#get-all-deployment-protection-rules-for-an-environment // //meta:operation GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules func (s *RepositoriesService) GetAllDeploymentProtectionRules(ctx context.Context, owner, repo, environment string) (*ListDeploymentProtectionRuleResponse, *Response, error) { u := fmt.Sprintf("repos/%v/%v/environments/%v/deployment_protection_rules", owner, repo, environment) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var list *ListDeploymentProtectionRuleResponse resp, err := s.client.Do(ctx, req, &list) if err != nil { return nil, resp, err } return list, resp, nil } // CreateCustomDeploymentProtectionRule creates a custom deployment protection rule on an environment. // // GitHub API docs: https://docs.github.com/rest/deployments/protection-rules#create-a-custom-deployment-protection-rule-on-an-environment // //meta:operation POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules func (s *RepositoriesService) CreateCustomDeploymentProtectionRule(ctx context.Context, owner, repo, environment string, request *CustomDeploymentProtectionRuleRequest) (*CustomDeploymentProtectionRule, *Response, error) { u := fmt.Sprintf("repos/%v/%v/environments/%v/deployment_protection_rules", owner, repo, environment) req, err := s.client.NewRequest("POST", u, request) if err != nil { return nil, nil, err } protectionRule := new(CustomDeploymentProtectionRule) resp, err := s.client.Do(ctx, req, protectionRule) if err != nil { return nil, resp, err } return protectionRule, resp, nil } // ListCustomDeploymentRuleIntegrations lists the custom deployment rule integrations for an environment. // // GitHub API docs: https://docs.github.com/rest/deployments/protection-rules#list-custom-deployment-rule-integrations-available-for-an-environment // //meta:operation GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps func (s *RepositoriesService) ListCustomDeploymentRuleIntegrations(ctx context.Context, owner, repo, environment string) (*ListCustomDeploymentRuleIntegrationsResponse, *Response, error) { u := fmt.Sprintf("repos/%v/%v/environments/%v/deployment_protection_rules/apps", owner, repo, environment) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var list *ListCustomDeploymentRuleIntegrationsResponse resp, err := s.client.Do(ctx, req, &list) if err != nil { return nil, resp, err } return list, resp, nil } // GetCustomDeploymentProtectionRule gets a custom deployment protection rule for an environment. // // GitHub API docs: https://docs.github.com/rest/deployments/protection-rules#get-a-custom-deployment-protection-rule // //meta:operation GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id} func (s *RepositoriesService) GetCustomDeploymentProtectionRule(ctx context.Context, owner, repo, environment string, protectionRuleID int64) (*CustomDeploymentProtectionRule, *Response, error) { u := fmt.Sprintf("repos/%v/%v/environments/%v/deployment_protection_rules/%v", owner, repo, environment, protectionRuleID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var protectionRule *CustomDeploymentProtectionRule resp, err := s.client.Do(ctx, req, &protectionRule) if err != nil { return nil, resp, err } return protectionRule, resp, nil } // DisableCustomDeploymentProtectionRule disables a custom deployment protection rule for an environment. // // GitHub API docs: https://docs.github.com/rest/deployments/protection-rules#disable-a-custom-protection-rule-for-an-environment // //meta:operation DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id} func (s *RepositoriesService) DisableCustomDeploymentProtectionRule(ctx context.Context, owner, repo, environment string, protectionRuleID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/environments/%v/deployment_protection_rules/%v", owner, repo, environment, protectionRuleID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/repos_deployment_protection_rules_test.go000066400000000000000000000217541457013574700254300ustar00rootroot00000000000000// Copyright 2024 The go-github 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_GetAllDeploymentProtectionRules(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/environments/e/deployment_protection_rules", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"total_count":2, "custom_deployment_protection_rules":[{ "id": 3, "node_id": "IEH37kRlcGxveW1lbnRTdGF0ddiv", "enabled": true, "app": { "id": 1, "node_id": "GHT58kRlcGxveW1lbnRTdTY!bbcy", "slug": "a-custom-app", "integration_url": "https://api.github.com/apps/a-custom-app"}}, { "id": 4, "node_id": "MDE2OkRlcGxveW1lbnRTdHJ41128", "enabled": true, "app": { "id": 1, "node_id": "UHVE67RlcGxveW1lbnRTdTY!jfeuy", "slug": "another-custom-app", "integration_url": "https://api.github.com/apps/another-custom-app"}}]}`) }) ctx := context.Background() got, _, err := client.Repositories.GetAllDeploymentProtectionRules(ctx, "o", "r", "e") if err != nil { t.Errorf("Repositories.GetAllDeploymentProtectionRules returned error: %v", err) } want := &ListDeploymentProtectionRuleResponse{ ProtectionRules: []*CustomDeploymentProtectionRule{ {ID: Int64(3), NodeID: String("IEH37kRlcGxveW1lbnRTdGF0ddiv"), Enabled: Bool(true), App: &CustomDeploymentProtectionRuleApp{ID: Int64(1), NodeID: String("GHT58kRlcGxveW1lbnRTdTY!bbcy"), Slug: String("a-custom-app"), IntegrationURL: String("https://api.github.com/apps/a-custom-app")}}, {ID: Int64(4), NodeID: String("MDE2OkRlcGxveW1lbnRTdHJ41128"), Enabled: Bool(true), App: &CustomDeploymentProtectionRuleApp{ID: Int64(1), NodeID: String("UHVE67RlcGxveW1lbnRTdTY!jfeuy"), Slug: String("another-custom-app"), IntegrationURL: String("https://api.github.com/apps/another-custom-app")}}, }, TotalCount: Int(2), } if !reflect.DeepEqual(got, want) { t.Errorf("Repositories.GetAllDeploymentProtectionRules = %+v, want %+v", got, want) } const methodName = "GetAllDeploymentProtectionRules" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetAllDeploymentProtectionRules(ctx, "o", "r", "e") if got != nil { t.Errorf("got non-nil Repositories.GetAllDeploymentProtectionRules response: %+v", got) } return resp, err }) } func TestRepositoriesService_CreateCustomDeploymentProtectionRule(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &CustomDeploymentProtectionRuleRequest{ IntegrationID: Int64(5), } mux.HandleFunc("/repos/o/r/environments/e/deployment_protection_rules", func(w http.ResponseWriter, r *http.Request) { v := new(CustomDeploymentProtectionRuleRequest) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "POST") want := input if !reflect.DeepEqual(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"id":3, "node_id": "IEH37kRlcGxveW1lbnRTdGF0ddiv", "enabled": true, "app": {"id": 1, "node_id": "GHT58kRlcGxveW1lbnRTdTY!bbcy", "slug": "a-custom-app", "integration_url": "https://api.github.com/apps/a-custom-app"}}`) }) ctx := context.Background() got, _, err := client.Repositories.CreateCustomDeploymentProtectionRule(ctx, "o", "r", "e", input) if err != nil { t.Errorf("Repositories.CreateCustomDeploymentProtectionRule returned error: %v", err) } want := &CustomDeploymentProtectionRule{ ID: Int64(3), NodeID: String("IEH37kRlcGxveW1lbnRTdGF0ddiv"), Enabled: Bool(true), App: &CustomDeploymentProtectionRuleApp{ ID: Int64(1), NodeID: String("GHT58kRlcGxveW1lbnRTdTY!bbcy"), Slug: String("a-custom-app"), IntegrationURL: String("https://api.github.com/apps/a-custom-app"), }, } if !reflect.DeepEqual(got, want) { t.Errorf("Repositories.CreateCustomDeploymentProtectionRule = %+v, want %+v", got, want) } const methodName = "CreateCustomDeploymentProtectionRule" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateCustomDeploymentProtectionRule(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateCustomDeploymentProtectionRule(ctx, "o", "r", "e", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListCustomDeploymentRuleIntegrations(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/environments/e/deployment_protection_rules/apps", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"total_count": 2, "available_custom_deployment_protection_rule_integrations": [{"id": 1, "node_id": "GHT58kRlcGxveW1lbnRTdTY!bbcy", "slug": "a-custom-app", "integration_url": "https://api.github.com/apps/a-custom-app"}, {"id": 2, "node_id": "UHVE67RlcGxveW1lbnRTdTY!jfeuy", "slug": "another-custom-app", "integration_url": "https://api.github.com/apps/another-custom-app"}]}`) }) ctx := context.Background() got, _, err := client.Repositories.ListCustomDeploymentRuleIntegrations(ctx, "o", "r", "e") if err != nil { t.Errorf("Repositories.ListCustomDeploymentRuleIntegrations returned error: %v", err) } want := &ListCustomDeploymentRuleIntegrationsResponse{ TotalCount: Int(2), AvailableIntegrations: []*CustomDeploymentProtectionRuleApp{ {ID: Int64(1), NodeID: String("GHT58kRlcGxveW1lbnRTdTY!bbcy"), Slug: String("a-custom-app"), IntegrationURL: String("https://api.github.com/apps/a-custom-app")}, {ID: Int64(2), NodeID: String("UHVE67RlcGxveW1lbnRTdTY!jfeuy"), Slug: String("another-custom-app"), IntegrationURL: String("https://api.github.com/apps/another-custom-app")}, }, } if !reflect.DeepEqual(got, want) { t.Errorf("Repositories.ListCustomDeploymentRuleIntegrations = %+v, want %+v", got, want) } const methodName = "ListCustomDeploymentRuleIntegrations" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListCustomDeploymentRuleIntegrations(ctx, "o", "r", "e") if got != nil { t.Errorf("got non-nil Repositories.ListCustomDeploymentRuleIntegrations response: %+v", got) } return resp, err }) } func TestRepositoriesService_GetCustomDeploymentProtectionRule(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/environments/e/deployment_protection_rules/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"id":1, "node_id": "IEH37kRlcGxveW1lbnRTdGF0ddiv", "enabled": true, "app": {"id": 1, "node_id": "GHT58kRlcGxveW1lbnRTdTY!bbcy", "slug": "a-custom-app", "integration_url": "https://api.github.com/apps/a-custom-app"}}`) }) ctx := context.Background() got, _, err := client.Repositories.GetCustomDeploymentProtectionRule(ctx, "o", "r", "e", 1) if err != nil { t.Errorf("Repositories.GetCustomDeploymentProtectionRule returned error: %v", err) } want := &CustomDeploymentProtectionRule{ ID: Int64(1), NodeID: String("IEH37kRlcGxveW1lbnRTdGF0ddiv"), Enabled: Bool(true), App: &CustomDeploymentProtectionRuleApp{ ID: Int64(1), NodeID: String("GHT58kRlcGxveW1lbnRTdTY!bbcy"), Slug: String("a-custom-app"), IntegrationURL: String("https://api.github.com/apps/a-custom-app"), }, } if !reflect.DeepEqual(got, want) { t.Errorf("Repositories.GetCustomDeploymentProtectionRule = %+v, want %+v", got, want) } const methodName = "GetCustomDeploymentProtectionRule" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetCustomDeploymentProtectionRule(ctx, "o", "r", "e", 1) if got != nil { t.Errorf("got non-nil Repositories.GetCustomDeploymentProtectionRule response: %+v", got) } return resp, err }) } func TestRepositoriesService_DisableCustomDeploymentProtectionRule(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/environments/e/deployment_protection_rules/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() resp, err := client.Repositories.DisableCustomDeploymentProtectionRule(ctx, "o", "r", "e", 1) if err != nil { t.Errorf("Repositories.DisableCustomDeploymentProtectionRule returned error: %v", err) } if !cmp.Equal(resp.StatusCode, 204) { t.Errorf("Repositories.DisableCustomDeploymentProtectionRule returned status code %+v, want %+v", resp.StatusCode, "204") } const methodName = "DisableCustomDeploymentProtectionRule" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.DisableCustomDeploymentProtectionRule(ctx, "\n", "\n", "\n", 1) return err }) } go-github-60.0.0/github/repos_deployments.go000066400000000000000000000227251457013574700210730ustar00rootroot00000000000000// 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/rest/deployments/deployments#list-deployments // //meta:operation GET /repos/{owner}/{repo}/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/rest/deployments/deployments#get-a-deployment // //meta:operation GET /repos/{owner}/{repo}/deployments/{deployment_id} 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/rest/deployments/deployments#create-a-deployment // //meta:operation POST /repos/{owner}/{repo}/deployments 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/rest/deployments/deployments#delete-a-deployment // //meta:operation DELETE /repos/{owner}/{repo}/deployments/{deployment_id} 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/rest/deployments/statuses#list-deployment-statuses // //meta:operation GET /repos/{owner}/{repo}/deployments/{deployment_id}/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/rest/deployments/statuses#get-a-deployment-status // //meta:operation GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id} 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/rest/deployments/statuses#create-a-deployment-status // //meta:operation POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses 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-60.0.0/github/repos_deployments_test.go000066400000000000000000000354361457013574700221350ustar00rootroot00000000000000// 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) assertNilError(t, 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) assertNilError(t, 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-60.0.0/github/repos_environments.go000066400000000000000000000224671457013574700212620ustar00rootroot00000000000000// 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" ) // 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"` CanAdminsBypass *bool `json:"can_admins_bypass,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"` PreventSelfReview *bool `json:"prevent_self_review,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"` } // EnvironmentListOptions specifies the optional parameters to the // RepositoriesService.ListEnvironments method. type EnvironmentListOptions struct { ListOptions } // 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/rest/deployments/environments#list-environments // //meta:operation GET /repos/{owner}/{repo}/environments func (s *RepositoriesService) ListEnvironments(ctx context.Context, owner, repo string, opts *EnvironmentListOptions) (*EnvResponse, *Response, error) { u := fmt.Sprintf("repos/%s/%s/environments", 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 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/rest/deployments/environments#get-an-environment // //meta:operation GET /repos/{owner}/{repo}/environments/{environment_name} 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. // As the default value for CanAdminsBypass is true, a nil value here marshals to true. func (c *CreateUpdateEnvironment) MarshalJSON() ([]byte, error) { type Alias CreateUpdateEnvironment if c.WaitTimer == nil { c.WaitTimer = Int(0) } if c.CanAdminsBypass == nil { c.CanAdminsBypass = Bool(true) } 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"` CanAdminsBypass *bool `json:"can_admins_bypass"` DeploymentBranchPolicy *BranchPolicy `json:"deployment_branch_policy"` PreventSelfReview *bool `json:"prevent_self_review,omitempty"` } // createUpdateEnvironmentNoEnterprise represents the fields accepted for Pro/Teams private repos. // Ref: https://docs.github.com/actions/deployment/targeting-different-environments/using-environments-for-deployment // See https://github.com/google/go-github/issues/2602 for more information. type createUpdateEnvironmentNoEnterprise struct { DeploymentBranchPolicy *BranchPolicy `json:"deployment_branch_policy"` } // CreateUpdateEnvironment create or update a new environment for a repository. // // GitHub API docs: https://docs.github.com/rest/deployments/environments#create-or-update-an-environment // //meta:operation PUT /repos/{owner}/{repo}/environments/{environment_name} 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 { // The API returns 422 when the pricing plan doesn't support all the fields sent. // This path will be executed for Pro/Teams private repos. // For public repos, regardless of the pricing plan, all fields supported. // For Free plan private repos the returned error code is 404. // We are checking that the user didn't try to send a value for unsupported fields, // and return an error if they did. if resp != nil && resp.StatusCode == http.StatusUnprocessableEntity && environment != nil && len(environment.Reviewers) == 0 && environment.GetWaitTimer() == 0 { return s.createNewEnvNoEnterprise(ctx, u, environment) } return nil, resp, err } return e, resp, nil } // createNewEnvNoEnterprise is an internal function for cases where the original call returned 422. // Currently only the `deployment_branch_policy` parameter is supported for Pro/Team private repos. func (s *RepositoriesService) createNewEnvNoEnterprise(ctx context.Context, u string, environment *CreateUpdateEnvironment) (*Environment, *Response, error) { req, err := s.client.NewRequest("PUT", u, &createUpdateEnvironmentNoEnterprise{ DeploymentBranchPolicy: environment.DeploymentBranchPolicy, }) 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/rest/deployments/environments#delete-an-environment // //meta:operation DELETE /repos/{owner}/{repo}/environments/{environment_name} 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-60.0.0/github/repos_environments_test.go000066400000000000000000000365351457013574700223220ustar00rootroot00000000000000// 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,"can_admins_bypass":true,"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}]}`) }) opt := &EnvironmentListOptions{ ListOptions: ListOptions{ Page: 2, PerPage: 2, }, } ctx := context.Background() environments, _, err := client.Repositories.ListEnvironments(ctx, "o", "r", opt) 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", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListEnvironments(ctx, "o", "r", opt) 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}, "can_admins_bypass": 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)}, CanAdminsBypass: 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) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "PUT") want := &CreateUpdateEnvironment{WaitTimer: Int(30), CanAdminsBypass: Bool(true)} 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_CreateEnvironment_noEnterprise(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &CreateUpdateEnvironment{} callCount := 0 mux.HandleFunc("/repos/o/r/environments/e", func(w http.ResponseWriter, r *http.Request) { v := new(CreateUpdateEnvironment) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "PUT") if callCount == 0 { w.WriteHeader(http.StatusUnprocessableEntity) callCount++ } else { want := &CreateUpdateEnvironment{} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"id": 1, "name": "staging", "protection_rules": []}`) } }) 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{}} if !cmp.Equal(release, want) { t.Errorf("Repositories.CreateUpdateEnvironment returned %+v, want %+v", release, want) } } func TestRepositoriesService_createNewEnvNoEnterprise(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &CreateUpdateEnvironment{ DeploymentBranchPolicy: &BranchPolicy{ ProtectedBranches: Bool(true), CustomBranchPolicies: Bool(false), }, } mux.HandleFunc("/repos/o/r/environments/e", func(w http.ResponseWriter, r *http.Request) { v := new(createUpdateEnvironmentNoEnterprise) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "PUT") want := &createUpdateEnvironmentNoEnterprise{ DeploymentBranchPolicy: &BranchPolicy{ ProtectedBranches: Bool(true), CustomBranchPolicies: Bool(false), }, } 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, "node_id": "id", "type": "branch_policy"}], "deployment_branch_policy": {"protected_branches": true, "custom_branch_policies": false}}`) }) ctx := context.Background() release, _, err := client.Repositories.createNewEnvNoEnterprise(ctx, "repos/o/r/environments/e", input) if err != nil { t.Errorf("Repositories.createNewEnvNoEnterprise returned error: %v", err) } want := &Environment{ ID: Int64(1), Name: String("staging"), ProtectionRules: []*ProtectionRule{ { ID: Int64(1), NodeID: String("id"), Type: String("branch_policy"), }, }, DeploymentBranchPolicy: &BranchPolicy{ ProtectedBranches: Bool(true), CustomBranchPolicies: Bool(false), }, } if !cmp.Equal(release, want) { t.Errorf("Repositories.createNewEnvNoEnterprise returned %+v, want %+v", release, want) } const methodName = "createNewEnvNoEnterprise" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.createNewEnvNoEnterprise(ctx, "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.createNewEnvNoEnterprise(ctx, "repos/o/r/environments/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") }) } func TestRepoEnvironment_Marshal(t *testing.T) { testJSONMarshal(t, &EnvResponse{}, "{}") repoEnv := &EnvResponse{ TotalCount: Int(1), Environments: []*Environment{ { Owner: String("me"), Repo: String("se"), EnvironmentName: String("dev"), WaitTimer: Int(123), Reviewers: []*EnvReviewers{ { Type: String("main"), ID: Int64(1), }, { Type: String("rev"), ID: Int64(2), }, }, DeploymentBranchPolicy: &BranchPolicy{ ProtectedBranches: Bool(false), CustomBranchPolicies: Bool(false), }, ID: Int64(2), NodeID: String("star"), Name: String("eg"), URL: String("https://hey.in"), HTMLURL: String("htmlurl"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, ProtectionRules: []*ProtectionRule{ { ID: Int64(21), NodeID: String("mnb"), Type: String("ewq"), WaitTimer: Int(9090), }, }, }, }, } want := `{ "total_count":1, "environments":[ { "owner":"me", "repo":"se", "environment_name":"dev", "wait_timer":123, "reviewers":[ { "type":"main", "id":1 }, { "type":"rev", "id":2 } ], "deployment_branch_policy":{ "protected_branches":false, "custom_branch_policies":false }, "id":2, "node_id":"star", "name":"eg", "url":"https://hey.in", "html_url":"htmlurl", "created_at":` + referenceTimeStr + `, "updated_at":` + referenceTimeStr + `, "protection_rules":[ { "id":21, "node_id":"mnb", "type":"ewq", "wait_timer":9090 } ] } ] }` testJSONMarshal(t, repoEnv, want) } func TestEnvReviewers_Marshal(t *testing.T) { testJSONMarshal(t, &EnvReviewers{}, "{}") repoEnv := &EnvReviewers{ Type: String("main"), ID: Int64(1), } want := `{ "type":"main", "id":1 }` testJSONMarshal(t, repoEnv, want) } func TestEnvironment_Marshal(t *testing.T) { testJSONMarshal(t, &Environment{}, "{}") repoEnv := &Environment{ Owner: String("o"), Repo: String("r"), EnvironmentName: String("e"), WaitTimer: Int(123), Reviewers: []*EnvReviewers{ { Type: String("main"), ID: Int64(1), }, { Type: String("rev"), ID: Int64(2), }, }, DeploymentBranchPolicy: &BranchPolicy{ ProtectedBranches: Bool(false), CustomBranchPolicies: Bool(false), }, ID: Int64(2), NodeID: String("star"), Name: String("eg"), URL: String("https://hey.in"), HTMLURL: String("htmlurl"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, ProtectionRules: []*ProtectionRule{ { ID: Int64(21), NodeID: String("mnb"), Type: String("ewq"), WaitTimer: Int(9090), }, }, } want := `{ "owner":"o", "repo":"r", "environment_name":"e", "wait_timer":123, "reviewers":[ { "type":"main", "id":1 }, { "type":"rev", "id":2 } ], "deployment_branch_policy":{ "protected_branches":false, "custom_branch_policies":false }, "id":2, "node_id":"star", "name":"eg", "url":"https://hey.in", "html_url":"htmlurl", "created_at":` + referenceTimeStr + `, "updated_at":` + referenceTimeStr + `, "protection_rules":[ { "id":21, "node_id":"mnb", "type":"ewq", "wait_timer":9090 } ] }` testJSONMarshal(t, repoEnv, want) } func TestBranchPolicy_Marshal(t *testing.T) { testJSONMarshal(t, &BranchPolicy{}, "{}") bp := &BranchPolicy{ ProtectedBranches: Bool(false), CustomBranchPolicies: Bool(false), } want := `{ "protected_branches": false, "custom_branch_policies": false }` testJSONMarshal(t, bp, want) } go-github-60.0.0/github/repos_forks.go000066400000000000000000000057101457013574700176470ustar00rootroot00000000000000// 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" ) // 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/rest/repos/forks#list-forks // //meta:operation GET /repos/{owner}/{repo}/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 `json:"organization,omitempty"` Name string `json:"name,omitempty"` DefaultBranchOnly bool `json:"default_branch_only,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/rest/repos/forks#create-a-fork // //meta:operation POST /repos/{owner}/{repo}/forks func (s *RepositoriesService) CreateFork(ctx context.Context, owner, repo string, opts *RepositoryCreateForkOptions) (*Repository, *Response, error) { u := fmt.Sprintf("repos/%v/%v/forks", owner, repo) req, err := s.client.NewRequest("POST", u, opts) 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-60.0.0/github/repos_forks_test.go000066400000000000000000000100641457013574700207040ustar00rootroot00000000000000// 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") testBody(t, r, `{"organization":"o","name":"n","default_branch_only":true}`+"\n") fmt.Fprint(w, `{"id":1}`) }) opt := &RepositoryCreateForkOptions{Organization: "o", Name: "n", DefaultBranchOnly: true} 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") testBody(t, r, `{"organization":"o","name":"n","default_branch_only":true}`+"\n") // This response indicates the fork will happen asynchronously. w.WriteHeader(http.StatusAccepted) fmt.Fprint(w, `{"id":1}`) }) opt := &RepositoryCreateForkOptions{Organization: "o", Name: "n", DefaultBranchOnly: true} 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-60.0.0/github/repos_hooks.go000066400000000000000000000207721457013574700176530ustar00rootroot00000000000000// 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" ) // 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 // // Deprecated: Please use PushEvent instead. type WebHookPayload = PushEvent // WebHookCommit represents the commit variant we receive from GitHub in a // WebHookPayload. // // Deprecated: Please use HeadCommit instead. type WebHookCommit = HeadCommit // WebHookAuthor represents the author or committer of a commit, as specified // in a WebHookCommit. The commit author may not correspond to a GitHub User. // // Deprecated: Please use CommitAuthor instead. // NOTE Breaking API change: the `Username` field is now called `Login`. type WebHookAuthor = CommitAuthor // Hook represents a GitHub (web and service) hook for a repository. type Hook struct { CreatedAt *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `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 *HookConfig `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 *HookConfig `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/rest/repos/webhooks#create-a-repository-webhook // //meta:operation POST /repos/{owner}/{repo}/hooks 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/rest/repos/webhooks#list-repository-webhooks // //meta:operation GET /repos/{owner}/{repo}/hooks 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/rest/repos/webhooks#get-a-repository-webhook // //meta:operation GET /repos/{owner}/{repo}/hooks/{hook_id} 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/rest/repos/webhooks#update-a-repository-webhook // //meta:operation PATCH /repos/{owner}/{repo}/hooks/{hook_id} 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/rest/repos/webhooks#delete-a-repository-webhook // //meta:operation DELETE /repos/{owner}/{repo}/hooks/{hook_id} 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/rest/repos/webhooks#ping-a-repository-webhook // //meta:operation POST /repos/{owner}/{repo}/hooks/{hook_id}/pings 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/rest/repos/webhooks#test-the-push-repository-webhook // //meta:operation POST /repos/{owner}/{repo}/hooks/{hook_id}/tests 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) } // Subscribe lets servers register to receive updates when a topic is updated. // // GitHub API docs: https://docs.github.com/webhooks/about-webhooks-for-repositories#pubsubhubbub // //meta:operation POST /hub func (s *RepositoriesService) Subscribe(ctx context.Context, owner, repo, event, callback string, secret []byte) (*Response, error) { req, err := s.createWebSubRequest("subscribe", owner, repo, event, callback, secret) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // Unsubscribe lets servers unregister to no longer receive updates when a topic is updated. // // GitHub API docs: https://docs.github.com/webhooks/about-webhooks-for-repositories#pubsubhubbub // //meta:operation POST /hub func (s *RepositoriesService) Unsubscribe(ctx context.Context, owner, repo, event, callback string, secret []byte) (*Response, error) { req, err := s.createWebSubRequest("unsubscribe", owner, repo, event, callback, secret) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // createWebSubRequest returns a subscribe/unsubscribe request that implements // the WebSub (formerly PubSubHubbub) protocol. // // See: https://www.w3.org/TR/websub/#subscriber-sends-subscription-request func (s *RepositoriesService) createWebSubRequest(hubMode, owner, repo, event, callback string, secret []byte) (*http.Request, error) { topic := fmt.Sprintf( "https://github.com/%s/%s/events/%s", owner, repo, event, ) form := url.Values{} form.Add("hub.mode", hubMode) form.Add("hub.topic", topic) form.Add("hub.callback", callback) if secret != nil { form.Add("hub.secret", string(secret)) } body := strings.NewReader(form.Encode()) req, err := s.client.NewFormRequest("hub", body) if err != nil { return nil, err } return req, nil } go-github-60.0.0/github/repos_hooks_configuration.go000066400000000000000000000045021457013574700225730ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // HookConfig describes metadata about a webhook configuration. type HookConfig struct { // The media type used to serialize the payloads // Possible values are `json` and `form`, the field is not specified the default is `form` ContentType *string `json:"content_type,omitempty"` // The possible values are 0 and 1. // Setting it to 1 will allow skip certificate verification for the host, // potentially exposing to MitM attacks: https://en.wikipedia.org/wiki/Man-in-the-middle_attack InsecureSSL *string `json:"insecure_ssl,omitempty"` URL *string `json:"url,omitempty"` // Secret is returned obfuscated by GitHub, but it can be set for outgoing requests. Secret *string `json:"secret,omitempty"` } // GetHookConfiguration returns the configuration for the specified repository webhook. // // GitHub API docs: https://docs.github.com/rest/repos/webhooks#get-a-webhook-configuration-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/hooks/{hook_id}/config func (s *RepositoriesService) GetHookConfiguration(ctx context.Context, owner, repo string, id int64) (*HookConfig, *Response, error) { u := fmt.Sprintf("repos/%v/%v/hooks/%v/config", owner, repo, id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } config := new(HookConfig) resp, err := s.client.Do(ctx, req, config) if err != nil { return nil, resp, err } return config, resp, nil } // EditHookConfiguration updates the configuration for the specified repository webhook. // // GitHub API docs: https://docs.github.com/rest/repos/webhooks#update-a-webhook-configuration-for-a-repository // //meta:operation PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config func (s *RepositoriesService) EditHookConfiguration(ctx context.Context, owner, repo string, id int64, config *HookConfig) (*HookConfig, *Response, error) { u := fmt.Sprintf("repos/%v/%v/hooks/%v/config", owner, repo, id) req, err := s.client.NewRequest("PATCH", u, config) if err != nil { return nil, nil, err } c := new(HookConfig) resp, err := s.client.Do(ctx, req, c) if err != nil { return nil, resp, err } return c, resp, nil } go-github-60.0.0/github/repos_hooks_configuration_test.go000066400000000000000000000072021457013574700236320ustar00rootroot00000000000000// Copyright 2023 The go-github 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_GetHookConfiguration(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/hooks/1/config", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"content_type": "json", "insecure_ssl": "0", "secret": "********", "url": "https://example.com/webhook"}`) }) ctx := context.Background() config, _, err := client.Repositories.GetHookConfiguration(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.GetHookConfiguration returned error: %v", err) } want := &HookConfig{ ContentType: String("json"), InsecureSSL: String("0"), Secret: String("********"), URL: String("https://example.com/webhook"), } if !cmp.Equal(config, want) { t.Errorf("Repositories.GetHookConfiguration returned %+v, want %+v", config, want) } const methodName = "GetHookConfiguration" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetHookConfiguration(ctx, "\n", "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetHookConfiguration(ctx, "o", "r", 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetHookConfiguration_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.GetHookConfiguration(ctx, "%", "%", 1) testURLParseError(t, err) } func TestRepositoriesService_EditHookConfiguration(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &HookConfig{} mux.HandleFunc("/repos/o/r/hooks/1/config", func(w http.ResponseWriter, r *http.Request) { v := new(HookConfig) assertNilError(t, 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, `{"content_type": "json", "insecure_ssl": "0", "secret": "********", "url": "https://example.com/webhook"}`) }) ctx := context.Background() config, _, err := client.Repositories.EditHookConfiguration(ctx, "o", "r", 1, input) if err != nil { t.Errorf("Repositories.EditHookConfiguration returned error: %v", err) } want := &HookConfig{ ContentType: String("json"), InsecureSSL: String("0"), Secret: String("********"), URL: String("https://example.com/webhook"), } if !cmp.Equal(config, want) { t.Errorf("Repositories.EditHookConfiguration returned %+v, want %+v", config, want) } const methodName = "EditHookConfiguration" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.EditHookConfiguration(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.EditHookConfiguration(ctx, "o", "r", 1, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_EditHookConfiguration_invalidOrg(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.EditHookConfiguration(ctx, "%", "%", 1, nil) testURLParseError(t, err) } go-github-60.0.0/github/repos_hooks_deliveries.go000066400000000000000000000114071457013574700220610ustar00rootroot00000000000000// 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/rest/webhooks/repo-deliveries#list-deliveries-for-a-repository-webhook // - https://docs.github.com/rest/webhooks/repo-deliveries#get-a-delivery-for-a-repository-webhook type HookDelivery struct { ID *int64 `json:"id,omitempty"` GUID *string `json:"guid,omitempty"` DeliveredAt *Timestamp `json:"delivered_at,omitempty"` Redelivery *bool `json:"redelivery,omitempty"` Duration *float64 `json:"duration,omitempty"` Status *string `json:"status,omitempty"` StatusCode *int `json:"status_code,omitempty"` Event *string `json:"event,omitempty"` Action *string `json:"action,omitempty"` InstallationID *int64 `json:"installation_id,omitempty"` RepositoryID *int64 `json:"repository_id,omitempty"` // 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/rest/repos/webhooks#list-deliveries-for-a-repository-webhook // //meta:operation GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries 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/rest/repos/webhooks#get-a-delivery-for-a-repository-webhook // //meta:operation GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id} 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 } // RedeliverHookDelivery redelivers a delivery for a webhook configured in a repository. // // GitHub API docs: https://docs.github.com/rest/repos/webhooks#redeliver-a-delivery-for-a-repository-webhook // //meta:operation POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts func (s *RepositoriesService) RedeliverHookDelivery(ctx context.Context, owner, repo string, hookID, deliveryID int64) (*HookDelivery, *Response, error) { u := fmt.Sprintf("repos/%v/%v/hooks/%v/deliveries/%v/attempts", owner, repo, hookID, deliveryID) req, err := s.client.NewRequest("POST", 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 := messageToTypeName[d.GetEvent()] if !ok { return nil, fmt.Errorf("unsupported event type %q", d.GetEvent()) } e := &Event{Type: &eType, RawPayload: d.Request.RawPayload} return e.ParsePayload() } go-github-60.0.0/github/repos_hooks_deliveries_test.go000066400000000000000000000255771457013574700231350ustar00rootroot00000000000000// 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) } func TestRepositoriesService_RedeliverHookDelivery(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/hooks/1/deliveries/1/attempts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{"id":1}`) }) ctx := context.Background() hook, _, err := client.Repositories.RedeliverHookDelivery(ctx, "o", "r", 1, 1) if err != nil { t.Errorf("Repositories.RedeliverHookDelivery returned error: %v", err) } want := &HookDelivery{ID: Int64(1)} if !cmp.Equal(hook, want) { t.Errorf("Repositories.RedeliverHookDelivery returned %+v, want %+v", hook, want) } const methodName = "RedeliverHookDelivery" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.RedeliverHookDelivery(ctx, "\n", "\n", -1, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.RedeliverHookDelivery(ctx, "o", "r", 1, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } var hookDeliveryPayloadTypeToStruct = map[string]interface{}{ "check_run": &CheckRunEvent{}, "check_suite": &CheckSuiteEvent{}, "code_scanning_alert": &CodeScanningAlertEvent{}, "commit_comment": &CommitCommentEvent{}, "content_reference": &ContentReferenceEvent{}, "create": &CreateEvent{}, "delete": &DeleteEvent{}, "dependabot_alert": &DependabotAlertEvent{}, "deploy_key": &DeployKeyEvent{}, "deployment": &DeploymentEvent{}, "deployment_status": &DeploymentStatusEvent{}, "discussion_comment": &DiscussionCommentEvent{}, "discussion": &DiscussionEvent{}, "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{}, "projects_v2": &ProjectV2Event{}, "projects_v2_item": &ProjectV2ItemEvent{}, "public": &PublicEvent{}, "pull_request": &PullRequestEvent{}, "pull_request_review": &PullRequestReviewEvent{}, "pull_request_review_comment": &PullRequestReviewCommentEvent{}, "pull_request_review_thread": &PullRequestReviewThreadEvent{}, "pull_request_target": &PullRequestTargetEvent{}, "push": &PushEvent{}, "release": &ReleaseEvent{}, "repository": &RepositoryEvent{}, "repository_dispatch": &RepositoryDispatchEvent{}, "repository_import": &RepositoryImportEvent{}, "repository_vulnerability_alert": &RepositoryVulnerabilityAlertEvent{}, "secret_scanning_alert": &SecretScanningAlertEvent{}, "security_advisory": &SecurityAdvisoryEvent{}, "security_and_analysis": &SecurityAndAnalysisEvent{}, "star": &StarEvent{}, "status": &StatusEvent{}, "team": &TeamEvent{}, "team_add": &TeamAddEvent{}, "user": &UserEvent{}, "watch": &WatchEvent{}, "workflow_dispatch": &WorkflowDispatchEvent{}, "workflow_job": &WorkflowJobEvent{}, "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) } } func TestHookRequest_Marshal(t *testing.T) { testJSONMarshal(t, &HookRequest{}, "{}") header := make(map[string]string) header["key"] = "value" jsonMsg, _ := json.Marshal(&header) r := &HookRequest{ Headers: header, RawPayload: (*json.RawMessage)(&jsonMsg), } want := `{ "headers": { "key": "value" }, "payload": { "key": "value" } }` testJSONMarshal(t, r, want) } func TestHookResponse_Marshal(t *testing.T) { testJSONMarshal(t, &HookResponse{}, "{}") header := make(map[string]string) header["key"] = "value" jsonMsg, _ := json.Marshal(&header) r := &HookResponse{ Headers: header, RawPayload: (*json.RawMessage)(&jsonMsg), } want := `{ "headers": { "key": "value" }, "payload": { "key": "value" } }` testJSONMarshal(t, r, want) } func TestHookDelivery_Marshal(t *testing.T) { testJSONMarshal(t, &HookDelivery{}, "{}") header := make(map[string]string) header["key"] = "value" jsonMsg, _ := json.Marshal(&header) r := &HookDelivery{ ID: Int64(1), GUID: String("guid"), DeliveredAt: &Timestamp{referenceTime}, Redelivery: Bool(true), Duration: Float64(1), Status: String("guid"), StatusCode: Int(1), Event: String("guid"), Action: String("guid"), InstallationID: Int64(1), RepositoryID: Int64(1), Request: &HookRequest{ Headers: header, RawPayload: (*json.RawMessage)(&jsonMsg), }, Response: &HookResponse{ Headers: header, RawPayload: (*json.RawMessage)(&jsonMsg), }, } want := `{ "id": 1, "guid": "guid", "delivered_at": ` + referenceTimeStr + `, "redelivery": true, "duration": 1, "status": "guid", "status_code": 1, "event": "guid", "action": "guid", "installation_id": 1, "repository_id": 1, "request": { "headers": { "key": "value" }, "payload": { "key": "value" } }, "response": { "headers": { "key": "value" }, "payload": { "key": "value" } } }` testJSONMarshal(t, r, want) } go-github-60.0.0/github/repos_hooks_test.go000066400000000000000000000364641457013574700207170ustar00rootroot00000000000000// 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: &Timestamp{referenceTime}} mux.HandleFunc("/repos/o/r/hooks", func(w http.ResponseWriter, r *http.Request) { v := new(createHookRequest) assertNilError(t, 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_ListHooks_403_code_no_rate_limit(t *testing.T) { testErrorResponseForStatusCode(t, http.StatusForbidden) } func TestRepositoriesService_ListHooks_404_code(t *testing.T) { testErrorResponseForStatusCode(t, http.StatusNotFound) } 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) assertNilError(t, 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) } func TestBranchWebHookPayload_Marshal(t *testing.T) { testJSONMarshal(t, &WebHookPayload{}, "{}") v := &WebHookPayload{ Action: String("action"), After: String("after"), Before: String("before"), Commits: []*WebHookCommit{ { Added: []string{"1", "2", "3"}, Author: &WebHookAuthor{ Email: String("abc@gmail.com"), Name: String("abc"), Login: String("abc_12"), }, Committer: &WebHookAuthor{ Email: String("abc@gmail.com"), Name: String("abc"), Login: String("abc_12"), }, ID: String("1"), Message: String("WebHookCommit"), Modified: []string{"abc", "efg", "erd"}, Removed: []string{"cmd", "rti", "duv"}, }, }, Compare: String("compare"), Created: Bool(true), Forced: Bool(false), HeadCommit: &WebHookCommit{ Added: []string{"1", "2", "3"}, Author: &WebHookAuthor{ Email: String("abc@gmail.com"), Name: String("abc"), Login: String("abc_12"), }, Committer: &WebHookAuthor{ Email: String("abc@gmail.com"), Name: String("abc"), Login: String("abc_12"), }, ID: String("1"), Message: String("WebHookCommit"), Modified: []string{"abc", "efg", "erd"}, Removed: []string{"cmd", "rti", "duv"}, }, Installation: &Installation{ ID: Int64(12), }, Organization: &Organization{ ID: Int64(22), }, Pusher: &CommitAuthor{ Login: String("rd@yahoo.com"), }, Repo: &PushEventRepository{ ID: Int64(321), NodeID: String("node_321"), }, Sender: &User{ Login: String("st@gmail.com"), ID: Int64(202), }, } want := `{ "action": "action", "after": "after", "before": "before", "commits": [ { "added": ["1", "2", "3"], "author":{ "email": "abc@gmail.com", "name": "abc", "username": "abc_12" }, "committer": { "email": "abc@gmail.com", "name": "abc", "username": "abc_12" }, "id": "1", "message": "WebHookCommit", "modified": ["abc", "efg", "erd"], "removed": ["cmd", "rti", "duv"] } ], "compare": "compare", "created": true, "forced": false, "head_commit": { "added": ["1", "2", "3"], "author":{ "email": "abc@gmail.com", "name": "abc", "username": "abc_12" }, "committer": { "email": "abc@gmail.com", "name": "abc", "username": "abc_12" }, "id": "1", "message": "WebHookCommit", "modified": ["abc", "efg", "erd"], "removed": ["cmd", "rti", "duv"] }, "installation": { "id": 12 }, "organization": { "id" : 22 }, "pusher":{ "username": "rd@yahoo.com" }, "repository":{ "id": 321, "node_id": "node_321" }, "sender":{ "login": "st@gmail.com", "id": 202 } }` testJSONMarshal(t, v, want) } func TestBranchWebHookAuthor_Marshal(t *testing.T) { testJSONMarshal(t, &WebHookAuthor{}, "{}") v := &WebHookAuthor{ Email: String("abc@gmail.com"), Name: String("abc"), Login: String("abc_12"), } want := `{ "email": "abc@gmail.com", "name": "abc", "username": "abc_12" }` testJSONMarshal(t, v, want) } func TestBranchWebHookCommit_Marshal(t *testing.T) { testJSONMarshal(t, &WebHookCommit{}, "{}") v := &WebHookCommit{ Added: []string{"1", "2", "3"}, Author: &WebHookAuthor{ Email: String("abc@gmail.com"), Name: String("abc"), Login: String("abc_12"), }, Committer: &WebHookAuthor{ Email: String("abc@gmail.com"), Name: String("abc"), Login: String("abc_12"), }, ID: String("1"), Message: String("WebHookCommit"), Modified: []string{"abc", "efg", "erd"}, Removed: []string{"cmd", "rti", "duv"}, } want := `{ "added": ["1", "2", "3"], "author":{ "email": "abc@gmail.com", "name": "abc", "username": "abc_12" }, "committer": { "email": "abc@gmail.com", "name": "abc", "username": "abc_12" }, "id": "1", "message": "WebHookCommit", "modified": ["abc", "efg", "erd"], "removed": ["cmd", "rti", "duv"] }` testJSONMarshal(t, v, want) } func TestBranchCreateHookRequest_Marshal(t *testing.T) { testJSONMarshal(t, &createHookRequest{}, "{}") v := &createHookRequest{ Name: "abc", Events: []string{"1", "2", "3"}, Active: Bool(true), Config: &HookConfig{ContentType: String("json")}, } want := `{ "name": "abc", "active": true, "events": ["1","2","3"], "config":{ "content_type": "json" } }` testJSONMarshal(t, v, want) } func TestBranchHook_Marshal(t *testing.T) { testJSONMarshal(t, &Hook{}, "{}") v := &Hook{ CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, URL: String("url"), ID: Int64(1), Type: String("type"), Name: String("name"), TestURL: String("testurl"), PingURL: String("pingurl"), LastResponse: map[string]interface{}{ "item": "item", }, Config: &HookConfig{ContentType: String("json")}, Events: []string{"1", "2", "3"}, Active: Bool(true), } want := `{ "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "url": "url", "id": 1, "type": "type", "name": "name", "test_url": "testurl", "ping_url": "pingurl", "last_response":{ "item": "item" }, "config":{ "content_type": "json" }, "events": ["1","2","3"], "active": true }` testJSONMarshal(t, v, want) } func TestRepositoriesService_Subscribe(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/hub", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, http.MethodPost) testHeader(t, r, "Content-Type", "application/x-www-form-urlencoded") testFormValues(t, r, values{ "hub.mode": "subscribe", "hub.topic": "https://github.com/o/r/events/push", "hub.callback": "http://postbin.org/123", "hub.secret": "test secret", }) }) ctx := context.Background() _, err := client.Repositories.Subscribe( ctx, "o", "r", "push", "http://postbin.org/123", []byte("test secret"), ) if err != nil { t.Errorf("Repositories.Subscribe returned error: %v", err) } testNewRequestAndDoFailure(t, "Subscribe", client, func() (*Response, error) { return client.Repositories.Subscribe(ctx, "o", "r", "push", "http://postbin.org/123", nil) }) } func TestRepositoriesService_Unsubscribe(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/hub", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, http.MethodPost) testHeader(t, r, "Content-Type", "application/x-www-form-urlencoded") testFormValues(t, r, values{ "hub.mode": "unsubscribe", "hub.topic": "https://github.com/o/r/events/push", "hub.callback": "http://postbin.org/123", "hub.secret": "test secret", }) }) ctx := context.Background() _, err := client.Repositories.Unsubscribe( ctx, "o", "r", "push", "http://postbin.org/123", []byte("test secret"), ) if err != nil { t.Errorf("Repositories.Unsubscribe returned error: %v", err) } testNewRequestAndDoFailure(t, "Unsubscribe", client, func() (*Response, error) { return client.Repositories.Unsubscribe(ctx, "o", "r", "push", "http://postbin.org/123", nil) }) } go-github-60.0.0/github/repos_invitations.go000066400000000000000000000062251457013574700210740ustar00rootroot00000000000000// 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/rest/collaborators/invitations#list-repository-invitations // //meta:operation GET /repos/{owner}/{repo}/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/rest/collaborators/invitations#delete-a-repository-invitation // //meta:operation DELETE /repos/{owner}/{repo}/invitations/{invitation_id} 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/rest/collaborators/invitations#update-a-repository-invitation // //meta:operation PATCH /repos/{owner}/{repo}/invitations/{invitation_id} 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-60.0.0/github/repos_invitations_test.go000066400000000000000000000101451457013574700221270ustar00rootroot00000000000000// 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 }) } func TestRepositoryInvitation_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryInvitation{}, "{}") r := &RepositoryInvitation{ ID: Int64(1), Repo: &Repository{ ID: Int64(1), Name: String("n"), URL: String("u"), }, Invitee: &User{ ID: Int64(1), Name: String("n"), URL: String("u"), }, Inviter: &User{ ID: Int64(1), Name: String("n"), URL: String("u"), }, Permissions: String("p"), CreatedAt: &Timestamp{referenceTime}, URL: String("u"), HTMLURL: String("h"), } want := `{ "id":1, "repository":{ "id":1, "name":"n", "url":"u" }, "invitee":{ "id":1, "name":"n", "url":"u" }, "inviter":{ "id":1, "name":"n", "url":"u" }, "permissions":"p", "created_at":` + referenceTimeStr + `, "url":"u", "html_url":"h" }` testJSONMarshal(t, r, want) } go-github-60.0.0/github/repos_keys.go000066400000000000000000000051011457013574700174700ustar00rootroot00000000000000// 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/rest/deploy-keys/deploy-keys#list-deploy-keys // //meta:operation GET /repos/{owner}/{repo}/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/rest/deploy-keys/deploy-keys#get-a-deploy-key // //meta:operation GET /repos/{owner}/{repo}/keys/{key_id} 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/rest/deploy-keys/deploy-keys#create-a-deploy-key // //meta:operation POST /repos/{owner}/{repo}/keys 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/rest/deploy-keys/deploy-keys#delete-a-deploy-key // //meta:operation DELETE /repos/{owner}/{repo}/keys/{key_id} 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-60.0.0/github/repos_keys_test.go000066400000000000000000000121621457013574700205340ustar00rootroot00000000000000// 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) assertNilError(t, 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-60.0.0/github/repos_lfs.go000066400000000000000000000026011457013574700173030ustar00rootroot00000000000000// Copyright 2022 The go-github 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" ) // EnableLFS turns the LFS (Large File Storage) feature ON for the selected repo. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/repos/lfs#enable-git-lfs-for-a-repository // //meta:operation PUT /repos/{owner}/{repo}/lfs func (s *RepositoriesService) EnableLFS(ctx context.Context, owner, repo string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/lfs", owner, repo) 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 } // DisableLFS turns the LFS (Large File Storage) feature OFF for the selected repo. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/repos/lfs#disable-git-lfs-for-a-repository // //meta:operation DELETE /repos/{owner}/{repo}/lfs func (s *RepositoriesService) DisableLFS(ctx context.Context, owner, repo string) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/lfs", owner, repo) 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-60.0.0/github/repos_lfs_test.go000066400000000000000000000032421457013574700203440ustar00rootroot00000000000000// Copyright 2022 The go-github 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" ) func TestRepositoriesService_EnableLFS(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/lfs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Repositories.EnableLFS(ctx, "o", "r"); err != nil { t.Errorf("Repositories.EnableLFS returned error: %v", err) } const methodName = "EnableLFS" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.EnableLFS(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.EnableLFS(ctx, "o", "r") }) } func TestRepositoriesService_DisableLFS(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/lfs", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() if _, err := client.Repositories.DisableLFS(ctx, "o", "r"); err != nil { t.Errorf("Repositories.DisableLFS returned error: %v", err) } const methodName = "DisableLFS" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.DisableLFS(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DisableLFS(ctx, "o", "r") }) } go-github-60.0.0/github/repos_merging.go000066400000000000000000000046131457013574700201540ustar00rootroot00000000000000// 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"` } // RepoMergeUpstreamRequest represents a request to sync a branch of // a forked repository to keep it up-to-date with the upstream repository. type RepoMergeUpstreamRequest struct { Branch *string `json:"branch,omitempty"` } // RepoMergeUpstreamResult represents the result of syncing a branch of // a forked repository with the upstream repository. type RepoMergeUpstreamResult struct { Message *string `json:"message,omitempty"` MergeType *string `json:"merge_type,omitempty"` BaseBranch *string `json:"base_branch,omitempty"` } // Merge a branch in the specified repository. // // GitHub API docs: https://docs.github.com/rest/branches/branches#merge-a-branch // //meta:operation POST /repos/{owner}/{repo}/merges 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 } // MergeUpstream syncs a branch of a forked repository to keep it up-to-date // with the upstream repository. // // GitHub API docs: https://docs.github.com/rest/branches/branches#sync-a-fork-branch-with-the-upstream-repository // //meta:operation POST /repos/{owner}/{repo}/merge-upstream func (s *RepositoriesService) MergeUpstream(ctx context.Context, owner, repo string, request *RepoMergeUpstreamRequest) (*RepoMergeUpstreamResult, *Response, error) { u := fmt.Sprintf("repos/%v/%v/merge-upstream", owner, repo) req, err := s.client.NewRequest("POST", u, request) if err != nil { return nil, nil, err } result := new(RepoMergeUpstreamResult) resp, err := s.client.Do(ctx, req, result) if err != nil { return nil, resp, err } return result, resp, nil } go-github-60.0.0/github/repos_merging_test.go000066400000000000000000000071511457013574700212130ustar00rootroot00000000000000// 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) assertNilError(t, 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 }) } func TestRepositoryMergeRequest_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryMergeRequest{}, "{}") u := &RepositoryMergeRequest{ Base: String("base"), Head: String("head"), CommitMessage: String("cm"), } want := `{ "base": "base", "head": "head", "commit_message": "cm" }` testJSONMarshal(t, u, want) } func TestRepositoriesService_MergeUpstream(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &RepoMergeUpstreamRequest{ Branch: String("b"), } mux.HandleFunc("/repos/o/r/merge-upstream", func(w http.ResponseWriter, r *http.Request) { v := new(RepoMergeUpstreamRequest) assertNilError(t, 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, `{"merge_type":"m"}`) }) ctx := context.Background() result, _, err := client.Repositories.MergeUpstream(ctx, "o", "r", input) if err != nil { t.Errorf("Repositories.MergeUpstream returned error: %v", err) } want := &RepoMergeUpstreamResult{MergeType: String("m")} if !cmp.Equal(result, want) { t.Errorf("Repositories.MergeUpstream returned %+v, want %+v", result, want) } const methodName = "MergeUpstream" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.MergeUpstream(ctx, "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.MergeUpstream(ctx, "o", "r", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepoMergeUpstreamResult_Marshal(t *testing.T) { testJSONMarshal(t, &RepoMergeUpstreamResult{}, "{}") u := &RepoMergeUpstreamResult{ Message: String("message"), MergeType: String("merge_type"), BaseBranch: String("base_branch"), } want := `{ "message": "message", "merge_type": "merge_type", "base_branch": "base_branch" }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/repos_pages.go000066400000000000000000000276211457013574700176270ustar00rootroot00000000000000// 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"` BuildType *string `json:"build_type,omitempty"` Source *PagesSource `json:"source,omitempty"` Public *bool `json:"public,omitempty"` HTTPSCertificate *PagesHTTPSCertificate `json:"https_certificate,omitempty"` HTTPSEnforced *bool `json:"https_enforced,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"` } // PagesDomain represents a domain associated with a GitHub Pages site. type PagesDomain struct { Host *string `json:"host,omitempty"` URI *string `json:"uri,omitempty"` Nameservers *string `json:"nameservers,omitempty"` DNSResolves *bool `json:"dns_resolves,omitempty"` IsProxied *bool `json:"is_proxied,omitempty"` IsCloudflareIP *bool `json:"is_cloudflare_ip,omitempty"` IsFastlyIP *bool `json:"is_fastly_ip,omitempty"` IsOldIPAddress *bool `json:"is_old_ip_address,omitempty"` IsARecord *bool `json:"is_a_record,omitempty"` HasCNAMERecord *bool `json:"has_cname_record,omitempty"` HasMXRecordsPresent *bool `json:"has_mx_records_present,omitempty"` IsValidDomain *bool `json:"is_valid_domain,omitempty"` IsApexDomain *bool `json:"is_apex_domain,omitempty"` ShouldBeARecord *bool `json:"should_be_a_record,omitempty"` IsCNAMEToGithubUserDomain *bool `json:"is_cname_to_github_user_domain,omitempty"` IsCNAMEToPagesDotGithubDotCom *bool `json:"is_cname_to_pages_dot_github_dot_com,omitempty"` IsCNAMEToFastly *bool `json:"is_cname_to_fastly,omitempty"` IsPointedToGithubPagesIP *bool `json:"is_pointed_to_github_pages_ip,omitempty"` IsNonGithubPagesIPPresent *bool `json:"is_non_github_pages_ip_present,omitempty"` IsPagesDomain *bool `json:"is_pages_domain,omitempty"` IsServedByPages *bool `json:"is_served_by_pages,omitempty"` IsValid *bool `json:"is_valid,omitempty"` Reason *string `json:"reason,omitempty"` RespondsToHTTPS *bool `json:"responds_to_https,omitempty"` EnforcesHTTPS *bool `json:"enforces_https,omitempty"` HTTPSError *string `json:"https_error,omitempty"` IsHTTPSEligible *bool `json:"is_https_eligible,omitempty"` CAAError *string `json:"caa_error,omitempty"` } // PagesHealthCheckResponse represents the response given for the health check of a GitHub Pages site. type PagesHealthCheckResponse struct { Domain *PagesDomain `json:"domain,omitempty"` AltDomain *PagesDomain `json:"alt_domain,omitempty"` } // PagesHTTPSCertificate represents the HTTPS Certificate information for a GitHub Pages site. type PagesHTTPSCertificate struct { State *string `json:"state,omitempty"` Description *string `json:"description,omitempty"` Domains []string `json:"domains,omitempty"` // GitHub's API doesn't return a standard Timestamp, rather it returns a YYYY-MM-DD string. ExpiresAt *string `json:"expires_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 { BuildType *string `json:"build_type,omitempty"` Source *PagesSource `json:"source,omitempty"` } // EnablePages enables GitHub Pages for the named repo. // // GitHub API docs: https://docs.github.com/rest/pages/pages#create-a-github-pages-site // //meta:operation POST /repos/{owner}/{repo}/pages 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{ BuildType: pages.BuildType, 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"` // BuildType is optional and can either be "legacy" or "workflow". // "workflow" - You are using a github workflow to build your pages. // "legacy" - You are deploying from a branch. BuildType *string `json:"build_type,omitempty"` // Source must include the branch name, and may optionally specify the subdirectory "/docs". // Possible values for Source.Branch are usually "gh-pages", "main", and "master", // or any other existing branch name. // Possible values for Source.Path are: "/", and "/docs". Source *PagesSource `json:"source,omitempty"` // Public configures access controls for the site. // If "true", the site will be accessible to anyone on the internet. If "false", // the site will be accessible to anyone with read access to the repository that // published the site. Public *bool `json:"public,omitempty"` // HTTPSEnforced specifies whether HTTPS should be enforced for the repository. HTTPSEnforced *bool `json:"https_enforced,omitempty"` } // UpdatePages updates GitHub Pages for the named repo. // // GitHub API docs: https://docs.github.com/rest/pages/pages#update-information-about-a-github-pages-site // //meta:operation PUT /repos/{owner}/{repo}/pages 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/rest/pages/pages#delete-a-github-pages-site // //meta:operation DELETE /repos/{owner}/{repo}/pages 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/rest/pages/pages#get-a-github-pages-site // //meta:operation GET /repos/{owner}/{repo}/pages 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/rest/pages/pages#list-github-pages-builds // //meta:operation GET /repos/{owner}/{repo}/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/rest/pages/pages#get-latest-pages-build // //meta:operation GET /repos/{owner}/{repo}/pages/builds/latest 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/rest/pages/pages#get-github-pages-build // //meta:operation GET /repos/{owner}/{repo}/pages/builds/{build_id} 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/rest/pages/pages#request-a-github-pages-build // //meta:operation POST /repos/{owner}/{repo}/pages/builds 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 } // GetPageHealthCheck gets a DNS health check for the CNAME record configured for a repository's GitHub Pages. // // GitHub API docs: https://docs.github.com/rest/pages/pages#get-a-dns-health-check-for-github-pages // //meta:operation GET /repos/{owner}/{repo}/pages/health func (s *RepositoriesService) GetPageHealthCheck(ctx context.Context, owner, repo string) (*PagesHealthCheckResponse, *Response, error) { u := fmt.Sprintf("repos/%v/%v/pages/health", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } healthCheckResponse := new(PagesHealthCheckResponse) resp, err := s.client.Do(ctx, req, healthCheckResponse) if err != nil { return nil, resp, err } return healthCheckResponse, resp, nil } go-github-60.0.0/github/repos_pages_test.go000066400000000000000000000515631457013574700206700ustar00rootroot00000000000000// 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" "net/http" "testing" "github.com/google/go-cmp/cmp" ) func TestRepositoriesService_EnablePagesLegacy(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Pages{ BuildType: String("legacy"), 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) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeEnablePagesAPIPreview) want := &createPagesRequest{BuildType: String("legacy"), 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","build_type": "legacy","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"), BuildType: String("legacy"), 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_EnablePagesWorkflow(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Pages{ BuildType: String("workflow"), 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) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "POST") testHeader(t, r, "Accept", mediaTypeEnablePagesAPIPreview) want := &createPagesRequest{BuildType: String("workflow")} 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","build_type": "workflow"}`) }) 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"), BuildType: String("workflow")} 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_UpdatePagesLegacy(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &PagesUpdate{ CNAME: String("www.my-domain.com"), BuildType: String("legacy"), Source: &PagesSource{Branch: String("gh-pages")}, } mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) { v := new(PagesUpdate) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "PUT") want := &PagesUpdate{CNAME: String("www.my-domain.com"), BuildType: String("legacy"), Source: &PagesSource{Branch: 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","build_type":"legacy","source":{"branch":"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_UpdatePagesWorkflow(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &PagesUpdate{ CNAME: String("www.my-domain.com"), BuildType: String("workflow"), } mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) { v := new(PagesUpdate) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "PUT") want := &PagesUpdate{CNAME: String("www.my-domain.com"), BuildType: String("workflow")} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"cname":"www.my-domain.com","build_type":"workflow"}`) }) 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: &PagesSource{Branch: String("gh-pages")}, } mux.HandleFunc("/repos/o/r/pages", func(w http.ResponseWriter, r *http.Request) { got, err := io.ReadAll(r.Body) if err != nil { t.Fatalf("unable to read body: %v", err) } want := []byte(`{"cname":null,"source":{"branch":"gh-pages"}}` + "\n") if !bytes.Equal(got, want) { t.Errorf("Request body = %+v, want %+v", got, want) } fmt.Fprint(w, `{"cname":null,"source":{"branch":"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","public":true, "https_certificate": {"state":"approved","description": "Certificate is approved","domains": ["developer.github.com"],"expires_at": "2021-05-22"},"https_enforced": true}`) }) 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"), Public: Bool(true), HTTPSCertificate: &PagesHTTPSCertificate{State: String("approved"), Description: String("Certificate is approved"), Domains: []string{"developer.github.com"}, ExpiresAt: String("2021-05-22")}, HTTPSEnforced: Bool(true)} 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 }) } func TestRepositoriesService_GetPageHealthCheck(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/pages/health", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"domain":{"host":"example.com","uri":"http://example.com/","nameservers":"default","dns_resolves":true},"alt_domain":{"host":"www.example.com","uri":"http://www.example.com/","nameservers":"default","dns_resolves":true}}`) }) ctx := context.Background() healthCheckResponse, _, err := client.Repositories.GetPageHealthCheck(ctx, "o", "r") if err != nil { t.Errorf("Repositories.GetPageHealthCheck returned error: %v", err) } want := &PagesHealthCheckResponse{ Domain: &PagesDomain{ Host: String("example.com"), URI: String("http://example.com/"), Nameservers: String("default"), DNSResolves: Bool(true), }, AltDomain: &PagesDomain{ Host: String("www.example.com"), URI: String("http://www.example.com/"), Nameservers: String("default"), DNSResolves: Bool(true), }, } if !cmp.Equal(healthCheckResponse, want) { t.Errorf("Repositories.GetPageHealthCheck returned %+v, want %+v", healthCheckResponse, want) } const methodName = "GetPageHealthCheck" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetPageHealthCheck(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetPageHealthCheck(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestPagesSource_Marshal(t *testing.T) { testJSONMarshal(t, &PagesSource{}, "{}") u := &PagesSource{ Branch: String("branch"), Path: String("path"), } want := `{ "branch": "branch", "path": "path" }` testJSONMarshal(t, u, want) } func TestPagesError_Marshal(t *testing.T) { testJSONMarshal(t, &PagesError{}, "{}") u := &PagesError{ Message: String("message"), } want := `{ "message": "message" }` testJSONMarshal(t, u, want) } func TestPagesUpdate_Marshal(t *testing.T) { testJSONMarshal(t, &PagesUpdate{}, "{}") u := &PagesUpdate{ CNAME: String("cname"), Source: &PagesSource{Path: String("src")}, } want := `{ "cname": "cname", "source": { "path": "src" } }` testJSONMarshal(t, u, want) } func TestPages_Marshal(t *testing.T) { testJSONMarshal(t, &Pages{}, "{}") u := &Pages{ URL: String("url"), Status: String("status"), CNAME: String("cname"), Custom404: Bool(false), HTMLURL: String("hurl"), Source: &PagesSource{ Branch: String("branch"), Path: String("path"), }, } want := `{ "url": "url", "status": "status", "cname": "cname", "custom_404": false, "html_url": "hurl", "source": { "branch": "branch", "path": "path" } }` testJSONMarshal(t, u, want) } func TestPagesBuild_Marshal(t *testing.T) { testJSONMarshal(t, &PagesBuild{}, "{}") u := &PagesBuild{ URL: String("url"), Status: String("status"), Error: &PagesError{ Message: String("message"), }, Pusher: &User{ID: Int64(1)}, Commit: String("commit"), Duration: Int(1), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, } want := `{ "url": "url", "status": "status", "error": { "message": "message" }, "pusher": { "id": 1 }, "commit": "commit", "duration": 1, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } func TestPagesHealthCheckResponse_Marshal(t *testing.T) { testJSONMarshal(t, &PagesHealthCheckResponse{}, "{}") u := &PagesHealthCheckResponse{ Domain: &PagesDomain{ Host: String("example.com"), URI: String("http://example.com/"), Nameservers: String("default"), DNSResolves: Bool(true), IsProxied: Bool(false), IsCloudflareIP: Bool(false), IsFastlyIP: Bool(false), IsOldIPAddress: Bool(false), IsARecord: Bool(true), HasCNAMERecord: Bool(false), HasMXRecordsPresent: Bool(false), IsValidDomain: Bool(true), IsApexDomain: Bool(true), ShouldBeARecord: Bool(true), IsCNAMEToGithubUserDomain: Bool(false), IsCNAMEToPagesDotGithubDotCom: Bool(false), IsCNAMEToFastly: Bool(false), IsPointedToGithubPagesIP: Bool(true), IsNonGithubPagesIPPresent: Bool(false), IsPagesDomain: Bool(false), IsServedByPages: Bool(true), IsValid: Bool(true), Reason: String("some reason"), RespondsToHTTPS: Bool(true), EnforcesHTTPS: Bool(true), HTTPSError: String("some error"), IsHTTPSEligible: Bool(true), CAAError: String("some error"), }, AltDomain: &PagesDomain{ Host: String("www.example.com"), URI: String("http://www.example.com/"), Nameservers: String("default"), DNSResolves: Bool(true), }, } want := `{ "domain": { "host": "example.com", "uri": "http://example.com/", "nameservers": "default", "dns_resolves": true, "is_proxied": false, "is_cloudflare_ip": false, "is_fastly_ip": false, "is_old_ip_address": false, "is_a_record": true, "has_cname_record": false, "has_mx_records_present": false, "is_valid_domain": true, "is_apex_domain": true, "should_be_a_record": true, "is_cname_to_github_user_domain": false, "is_cname_to_pages_dot_github_dot_com": false, "is_cname_to_fastly": false, "is_pointed_to_github_pages_ip": true, "is_non_github_pages_ip_present": false, "is_pages_domain": false, "is_served_by_pages": true, "is_valid": true, "reason": "some reason", "responds_to_https": true, "enforces_https": true, "https_error": "some error", "is_https_eligible": true, "caa_error": "some error" }, "alt_domain": { "host": "www.example.com", "uri": "http://www.example.com/", "nameservers": "default", "dns_resolves": true } }` testJSONMarshal(t, u, want) } func TestCreatePagesRequest_Marshal(t *testing.T) { testJSONMarshal(t, &createPagesRequest{}, "{}") u := &createPagesRequest{ Source: &PagesSource{ Branch: String("branch"), Path: String("path"), }, } want := `{ "source": { "branch": "branch", "path": "path" } }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/repos_prereceive_hooks.go000066400000000000000000000077651457013574700220730ustar00rootroot00000000000000// 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://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/repo-pre-receive-hooks#list-pre-receive-hooks-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/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://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/repo-pre-receive-hooks#get-a-pre-receive-hook-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/pre-receive-hooks/{pre_receive_hook_id} 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://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/repo-pre-receive-hooks#update-pre-receive-hook-enforcement-for-a-repository // //meta:operation PATCH /repos/{owner}/{repo}/pre-receive-hooks/{pre_receive_hook_id} 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://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/repo-pre-receive-hooks#remove-pre-receive-hook-enforcement-for-a-repository // //meta:operation DELETE /repos/{owner}/{repo}/pre-receive-hooks/{pre_receive_hook_id} 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-60.0.0/github/repos_prereceive_hooks_test.go000066400000000000000000000141161457013574700231160ustar00rootroot00000000000000// 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) assertNilError(t, 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) } func TestPreReceiveHook_Marshal(t *testing.T) { testJSONMarshal(t, &PreReceiveHook{}, "{}") u := &PreReceiveHook{ ID: Int64(1), Name: String("name"), Enforcement: String("e"), ConfigURL: String("curl"), } want := `{ "id": 1, "name": "name", "enforcement": "e", "configuration_url": "curl" }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/repos_projects.go000066400000000000000000000041441457013574700203540ustar00rootroot00000000000000// 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/rest/projects/projects#list-repository-projects // //meta:operation GET /repos/{owner}/{repo}/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/rest/projects/projects#create-a-repository-project // //meta:operation POST /repos/{owner}/{repo}/projects 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-60.0.0/github/repos_projects_test.go000066400000000000000000000054701457013574700214160ustar00rootroot00000000000000// 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{} assertNilError(t, 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-60.0.0/github/repos_properties.go000066400000000000000000000017341457013574700207210ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // GetAllCustomPropertyValues gets all custom property values that are set for a repository. // // GitHub API docs: https://docs.github.com/rest/repos/custom-properties#get-all-custom-property-values-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/properties/values func (s *RepositoriesService) GetAllCustomPropertyValues(ctx context.Context, org, repo string) ([]*CustomPropertyValue, *Response, error) { u := fmt.Sprintf("repos/%v/%v/properties/values", org, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var customPropertyValues []*CustomPropertyValue resp, err := s.client.Do(ctx, req, &customPropertyValues) if err != nil { return nil, resp, err } return customPropertyValues, resp, nil } go-github-60.0.0/github/repos_properties_test.go000066400000000000000000000031261457013574700217550ustar00rootroot00000000000000// Copyright 2023 The go-github 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_GetAllCustomPropertyValues(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/properties/values", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[ { "property_name": "environment", "value": "production" }, { "property_name": "service", "value": "web" } ]`) }) ctx := context.Background() customPropertyValues, _, err := client.Repositories.GetAllCustomPropertyValues(ctx, "o", "r") if err != nil { t.Errorf("Repositories.GetAllCustomPropertyValues returned error: %v", err) } want := []*CustomPropertyValue{ { PropertyName: "environment", Value: String("production"), }, { PropertyName: "service", Value: String("web"), }, } if !cmp.Equal(customPropertyValues, want) { t.Errorf("Repositories.GetAllCustomPropertyValues returned %+v, want %+v", customPropertyValues, want) } const methodName = "GetAllCustomPropertyValues" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetAllCustomPropertyValues(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/repos_releases.go000066400000000000000000000404011457013574700203220ustar00rootroot00000000000000// 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"` // MakeLatest can be one of: "true", "false", or "legacy". MakeLatest *string `json:"make_latest,omitempty"` DiscussionCategoryName *string `json:"discussion_category_name,omitempty"` // The following fields are not used in EditRelease: GenerateReleaseNotes *bool `json:"generate_release_notes,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) } // RepositoryReleaseNotes represents a GitHub-generated release notes. type RepositoryReleaseNotes struct { Name string `json:"name"` Body string `json:"body"` } // GenerateNotesOptions represents the options to generate release notes. type GenerateNotesOptions struct { TagName string `json:"tag_name"` PreviousTagName *string `json:"previous_tag_name,omitempty"` TargetCommitish *string `json:"target_commitish,omitempty"` } // 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/rest/releases/releases#list-releases // //meta:operation GET /repos/{owner}/{repo}/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/rest/releases/releases#get-a-release // //meta:operation GET /repos/{owner}/{repo}/releases/{release_id} 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/rest/releases/releases#get-the-latest-release // //meta:operation GET /repos/{owner}/{repo}/releases/latest 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/rest/releases/releases#get-a-release-by-tag-name // //meta:operation GET /repos/{owner}/{repo}/releases/tags/{tag} 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) } // GenerateReleaseNotes generates the release notes for the given tag. // // GitHub API docs: https://docs.github.com/rest/releases/releases#generate-release-notes-content-for-a-release // //meta:operation POST /repos/{owner}/{repo}/releases/generate-notes func (s *RepositoriesService) GenerateReleaseNotes(ctx context.Context, owner, repo string, opts *GenerateNotesOptions) (*RepositoryReleaseNotes, *Response, error) { u := fmt.Sprintf("repos/%s/%s/releases/generate-notes", owner, repo) req, err := s.client.NewRequest("POST", u, opts) if err != nil { return nil, nil, err } r := new(RepositoryReleaseNotes) resp, err := s.client.Do(ctx, req, r) if err != nil { return nil, resp, err } return r, resp, nil } 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"` MakeLatest *string `json:"make_latest,omitempty"` GenerateReleaseNotes *bool `json:"generate_release_notes,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/rest/releases/releases#create-a-release // //meta:operation POST /repos/{owner}/{repo}/releases 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, MakeLatest: release.MakeLatest, DiscussionCategoryName: release.DiscussionCategoryName, GenerateReleaseNotes: release.GenerateReleaseNotes, } 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/rest/releases/releases#update-a-release // //meta:operation PATCH /repos/{owner}/{repo}/releases/{release_id} 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, MakeLatest: release.MakeLatest, 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/rest/releases/releases#delete-a-release // //meta:operation DELETE /repos/{owner}/{repo}/releases/{release_id} 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/rest/releases/assets#list-release-assets // //meta:operation GET /repos/{owner}/{repo}/releases/{release_id}/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/rest/releases/assets#get-a-release-asset // //meta:operation GET /repos/{owner}/{repo}/releases/assets/{asset_id} 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/rest/releases/assets#get-a-release-asset // //meta:operation GET /repos/{owner}/{repo}/releases/assets/{asset_id} 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/rest/releases/assets#update-a-release-asset // //meta:operation PATCH /repos/{owner}/{repo}/releases/assets/{asset_id} 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/rest/releases/assets#delete-a-release-asset // //meta:operation DELETE /repos/{owner}/{repo}/releases/assets/{asset_id} 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/rest/releases/assets#upload-a-release-asset // //meta:operation POST /repos/{owner}/{repo}/releases/{release_id}/assets 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-60.0.0/github/repos_releases_test.go000066400000000000000000000641641457013574700213750ustar00rootroot00000000000000// 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" "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_GenerateReleaseNotes(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/releases/generate-notes", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testBody(t, r, `{"tag_name":"v1.0.0"}`+"\n") fmt.Fprint(w, `{"name":"v1.0.0","body":"**Full Changelog**: https://github.com/o/r/compare/v0.9.0...v1.0.0"}`) }) opt := &GenerateNotesOptions{ TagName: "v1.0.0", } ctx := context.Background() releases, _, err := client.Repositories.GenerateReleaseNotes(ctx, "o", "r", opt) if err != nil { t.Errorf("Repositories.GenerateReleaseNotes returned error: %v", err) } want := &RepositoryReleaseNotes{ Name: "v1.0.0", Body: "**Full Changelog**: https://github.com/o/r/compare/v0.9.0...v1.0.0", } if !cmp.Equal(releases, want) { t.Errorf("Repositories.GenerateReleaseNotes returned %+v, want %+v", releases, want) } const methodName = "GenerateReleaseNotes" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GenerateReleaseNotes(ctx, "\n", "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GenerateReleaseNotes(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"), GenerateReleaseNotes: Bool(true), // 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) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "POST") want := &repositoryReleaseRequest{ Name: String("v1.0"), DiscussionCategoryName: String("General"), GenerateReleaseNotes: Bool(true), } 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: GenerateReleaseNotes: Bool(true), 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) assertNilError(t, 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 := io.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) if err != nil { t.Errorf("Repositories.DownloadReleaseAsset returned error: %v", err) } content, err := io.ReadAll(reader) if err != nil { t.Errorf("Reading 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_FollowRedirectToError(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.WriteHeader(http.StatusNotFound) }) ctx := context.Background() resp, loc, err := client.Repositories.DownloadReleaseAsset(ctx, "o", "r", 1, http.DefaultClient) 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_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) assertNilError(t, 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 }) } } func TestRepositoryReleaseRequest_Marshal(t *testing.T) { testJSONMarshal(t, &repositoryReleaseRequest{}, "{}") u := &repositoryReleaseRequest{ TagName: String("tn"), TargetCommitish: String("tc"), Name: String("name"), Body: String("body"), Draft: Bool(false), Prerelease: Bool(false), MakeLatest: String("legacy"), DiscussionCategoryName: String("dcn"), } want := `{ "tag_name": "tn", "target_commitish": "tc", "name": "name", "body": "body", "draft": false, "prerelease": false, "make_latest": "legacy", "discussion_category_name": "dcn" }` testJSONMarshal(t, u, want) } func TestReleaseAsset_Marshal(t *testing.T) { testJSONMarshal(t, &ReleaseAsset{}, "{}") u := &ReleaseAsset{ ID: Int64(1), URL: String("url"), Name: String("name"), Label: String("label"), State: String("state"), ContentType: String("ct"), Size: Int(1), DownloadCount: Int(1), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, BrowserDownloadURL: String("bdu"), Uploader: &User{ID: Int64(1)}, NodeID: String("nid"), } want := `{ "id": 1, "url": "url", "name": "name", "label": "label", "state": "state", "content_type": "ct", "size": 1, "download_count": 1, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "browser_download_url": "bdu", "uploader": { "id": 1 }, "node_id": "nid" }` testJSONMarshal(t, u, want) } func TestRepositoryRelease_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryRelease{}, "{}") u := &RepositoryRelease{ TagName: String("tn"), TargetCommitish: String("tc"), Name: String("name"), Body: String("body"), Draft: Bool(false), Prerelease: Bool(false), MakeLatest: String("legacy"), DiscussionCategoryName: String("dcn"), ID: Int64(1), CreatedAt: &Timestamp{referenceTime}, PublishedAt: &Timestamp{referenceTime}, URL: String("url"), HTMLURL: String("hurl"), AssetsURL: String("aurl"), Assets: []*ReleaseAsset{{ID: Int64(1)}}, UploadURL: String("uurl"), ZipballURL: String("zurl"), TarballURL: String("turl"), Author: &User{ID: Int64(1)}, NodeID: String("nid"), } want := `{ "tag_name": "tn", "target_commitish": "tc", "name": "name", "body": "body", "draft": false, "prerelease": false, "make_latest": "legacy", "discussion_category_name": "dcn", "id": 1, "created_at": ` + referenceTimeStr + `, "published_at": ` + referenceTimeStr + `, "url": "url", "html_url": "hurl", "assets_url": "aurl", "assets": [ { "id": 1 } ], "upload_url": "uurl", "zipball_url": "zurl", "tarball_url": "turl", "author": { "id": 1 }, "node_id": "nid" }` testJSONMarshal(t, u, want) } func TestGenerateNotesOptions_Marshal(t *testing.T) { testJSONMarshal(t, &GenerateNotesOptions{}, "{}") u := &GenerateNotesOptions{ TagName: "tag_name", PreviousTagName: String("previous_tag_name"), TargetCommitish: String("target_commitish"), } want := `{ "tag_name": "tag_name", "previous_tag_name": "previous_tag_name", "target_commitish": "target_commitish" }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/repos_rules.go000066400000000000000000000415351457013574700176620ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) // BypassActor represents the bypass actors from a ruleset. type BypassActor struct { ActorID *int64 `json:"actor_id,omitempty"` // Possible values for ActorType are: RepositoryRole, Team, Integration, OrganizationAdmin ActorType *string `json:"actor_type,omitempty"` // Possible values for BypassMode are: always, pull_request BypassMode *string `json:"bypass_mode,omitempty"` } // RulesetLink represents a single link object from GitHub ruleset request _links. type RulesetLink struct { HRef *string `json:"href,omitempty"` } // RulesetLinks represents the "_links" object in a Ruleset. type RulesetLinks struct { Self *RulesetLink `json:"self,omitempty"` } // RulesetRefConditionParameters represents the conditions object for ref_names. type RulesetRefConditionParameters struct { Include []string `json:"include"` Exclude []string `json:"exclude"` } // RulesetRepositoryNamesConditionParameters represents the conditions object for repository_names. type RulesetRepositoryNamesConditionParameters struct { Include []string `json:"include"` Exclude []string `json:"exclude"` Protected *bool `json:"protected,omitempty"` } // RulesetRepositoryIDsConditionParameters represents the conditions object for repository_ids. type RulesetRepositoryIDsConditionParameters struct { RepositoryIDs []int64 `json:"repository_ids,omitempty"` } // RulesetConditions represents the conditions object in a ruleset. // Set either RepositoryName or RepositoryID, not both. type RulesetConditions struct { RefName *RulesetRefConditionParameters `json:"ref_name,omitempty"` RepositoryName *RulesetRepositoryNamesConditionParameters `json:"repository_name,omitempty"` RepositoryID *RulesetRepositoryIDsConditionParameters `json:"repository_id,omitempty"` } // RulePatternParameters represents the rule pattern parameters. type RulePatternParameters struct { Name *string `json:"name,omitempty"` // If Negate is true, the rule will fail if the pattern matches. Negate *bool `json:"negate,omitempty"` // Possible values for Operator are: starts_with, ends_with, contains, regex Operator string `json:"operator"` Pattern string `json:"pattern"` } // UpdateAllowsFetchAndMergeRuleParameters represents the update rule parameters. type UpdateAllowsFetchAndMergeRuleParameters struct { UpdateAllowsFetchAndMerge bool `json:"update_allows_fetch_and_merge"` } // RequiredDeploymentEnvironmentsRuleParameters represents the required_deployments rule parameters. type RequiredDeploymentEnvironmentsRuleParameters struct { RequiredDeploymentEnvironments []string `json:"required_deployment_environments"` } // PullRequestRuleParameters represents the pull_request rule parameters. type PullRequestRuleParameters struct { DismissStaleReviewsOnPush bool `json:"dismiss_stale_reviews_on_push"` RequireCodeOwnerReview bool `json:"require_code_owner_review"` RequireLastPushApproval bool `json:"require_last_push_approval"` RequiredApprovingReviewCount int `json:"required_approving_review_count"` RequiredReviewThreadResolution bool `json:"required_review_thread_resolution"` } // RuleRequiredStatusChecks represents the RequiredStatusChecks for the RequiredStatusChecksRuleParameters object. type RuleRequiredStatusChecks struct { Context string `json:"context"` IntegrationID *int64 `json:"integration_id,omitempty"` } // RequiredStatusChecksRuleParameters represents the required_status_checks rule parameters. type RequiredStatusChecksRuleParameters struct { RequiredStatusChecks []RuleRequiredStatusChecks `json:"required_status_checks"` StrictRequiredStatusChecksPolicy bool `json:"strict_required_status_checks_policy"` } // RuleRequiredWorkflow represents the Workflow for the RequireWorkflowsRuleParameters object. type RuleRequiredWorkflow struct { Path string `json:"path"` Ref *string `json:"ref,omitempty"` RepositoryID *int64 `json:"repository_id,omitempty"` Sha *string `json:"sha,omitempty"` } // RequiredWorkflowsRuleParameters represents the workflows rule parameters. type RequiredWorkflowsRuleParameters struct { RequiredWorkflows []*RuleRequiredWorkflow `json:"workflows"` } // RepositoryRule represents a GitHub Rule. type RepositoryRule struct { Type string `json:"type"` Parameters *json.RawMessage `json:"parameters,omitempty"` } // UnmarshalJSON implements the json.Unmarshaler interface. // This helps us handle the fact that RepositoryRule parameter field can be of numerous types. func (r *RepositoryRule) UnmarshalJSON(data []byte) error { type rule RepositoryRule var RepositoryRule rule if err := json.Unmarshal(data, &RepositoryRule); err != nil { return err } r.Type = RepositoryRule.Type switch RepositoryRule.Type { case "creation", "deletion", "required_linear_history", "required_signatures", "non_fast_forward": r.Parameters = nil case "update": if RepositoryRule.Parameters == nil { r.Parameters = nil return nil } params := UpdateAllowsFetchAndMergeRuleParameters{} if err := json.Unmarshal(*RepositoryRule.Parameters, ¶ms); err != nil { return err } bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) r.Parameters = &rawParams case "required_deployments": params := RequiredDeploymentEnvironmentsRuleParameters{} if err := json.Unmarshal(*RepositoryRule.Parameters, ¶ms); err != nil { return err } bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) r.Parameters = &rawParams case "commit_message_pattern", "commit_author_email_pattern", "committer_email_pattern", "branch_name_pattern", "tag_name_pattern": params := RulePatternParameters{} if err := json.Unmarshal(*RepositoryRule.Parameters, ¶ms); err != nil { return err } bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) r.Parameters = &rawParams case "pull_request": params := PullRequestRuleParameters{} if err := json.Unmarshal(*RepositoryRule.Parameters, ¶ms); err != nil { return err } bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) r.Parameters = &rawParams case "required_status_checks": params := RequiredStatusChecksRuleParameters{} if err := json.Unmarshal(*RepositoryRule.Parameters, ¶ms); err != nil { return err } bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) r.Parameters = &rawParams case "workflows": params := RequiredWorkflowsRuleParameters{} if err := json.Unmarshal(*RepositoryRule.Parameters, ¶ms); err != nil { return err } bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) r.Parameters = &rawParams default: r.Type = "" r.Parameters = nil return fmt.Errorf("RepositoryRule.Type %T is not yet implemented, unable to unmarshal", RepositoryRule.Type) } return nil } // NewCreationRule creates a rule to only allow users with bypass permission to create matching refs. func NewCreationRule() (rule *RepositoryRule) { return &RepositoryRule{ Type: "creation", } } // NewUpdateRule creates a rule to only allow users with bypass permission to update matching refs. func NewUpdateRule(params *UpdateAllowsFetchAndMergeRuleParameters) (rule *RepositoryRule) { if params != nil { bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) return &RepositoryRule{ Type: "update", Parameters: &rawParams, } } return &RepositoryRule{ Type: "update", } } // NewDeletionRule creates a rule to only allow users with bypass permissions to delete matching refs. func NewDeletionRule() (rule *RepositoryRule) { return &RepositoryRule{ Type: "deletion", } } // NewRequiredLinearHistoryRule creates a rule to prevent merge commits from being pushed to matching branches. func NewRequiredLinearHistoryRule() (rule *RepositoryRule) { return &RepositoryRule{ Type: "required_linear_history", } } // NewRequiredDeploymentsRule creates a rule to require environments to be successfully deployed before they can be merged into the matching branches. func NewRequiredDeploymentsRule(params *RequiredDeploymentEnvironmentsRuleParameters) (rule *RepositoryRule) { bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) return &RepositoryRule{ Type: "required_deployments", Parameters: &rawParams, } } // NewRequiredSignaturesRule creates a rule a to require commits pushed to matching branches to have verified signatures. func NewRequiredSignaturesRule() (rule *RepositoryRule) { return &RepositoryRule{ Type: "required_signatures", } } // NewPullRequestRule creates a rule to require all commits be made to a non-target branch and submitted via a pull request before they can be merged. func NewPullRequestRule(params *PullRequestRuleParameters) (rule *RepositoryRule) { bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) return &RepositoryRule{ Type: "pull_request", Parameters: &rawParams, } } // NewRequiredStatusChecksRule creates a rule to require which status checks must pass before branches can be merged into a branch rule. func NewRequiredStatusChecksRule(params *RequiredStatusChecksRuleParameters) (rule *RepositoryRule) { bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) return &RepositoryRule{ Type: "required_status_checks", Parameters: &rawParams, } } // NewNonFastForwardRule creates a rule as part to prevent users with push access from force pushing to matching branches. func NewNonFastForwardRule() (rule *RepositoryRule) { return &RepositoryRule{ Type: "non_fast_forward", } } // NewCommitMessagePatternRule creates a rule to restrict commit message patterns being pushed to matching branches. func NewCommitMessagePatternRule(params *RulePatternParameters) (rule *RepositoryRule) { bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) return &RepositoryRule{ Type: "commit_message_pattern", Parameters: &rawParams, } } // NewCommitAuthorEmailPatternRule creates a rule to restrict commits with author email patterns being merged into matching branches. func NewCommitAuthorEmailPatternRule(params *RulePatternParameters) (rule *RepositoryRule) { bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) return &RepositoryRule{ Type: "commit_author_email_pattern", Parameters: &rawParams, } } // NewCommitterEmailPatternRule creates a rule to restrict commits with committer email patterns being merged into matching branches. func NewCommitterEmailPatternRule(params *RulePatternParameters) (rule *RepositoryRule) { bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) return &RepositoryRule{ Type: "committer_email_pattern", Parameters: &rawParams, } } // NewBranchNamePatternRule creates a rule to restrict branch patterns from being merged into matching branches. func NewBranchNamePatternRule(params *RulePatternParameters) (rule *RepositoryRule) { bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) return &RepositoryRule{ Type: "branch_name_pattern", Parameters: &rawParams, } } // NewTagNamePatternRule creates a rule to restrict tag patterns contained in non-target branches from being merged into matching branches. func NewTagNamePatternRule(params *RulePatternParameters) (rule *RepositoryRule) { bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) return &RepositoryRule{ Type: "tag_name_pattern", Parameters: &rawParams, } } // NewRequiredWorkflowsRule creates a rule to require which status checks must pass before branches can be merged into a branch rule. func NewRequiredWorkflowsRule(params *RequiredWorkflowsRuleParameters) (rule *RepositoryRule) { bytes, _ := json.Marshal(params) rawParams := json.RawMessage(bytes) return &RepositoryRule{ Type: "workflows", Parameters: &rawParams, } } // Ruleset represents a GitHub ruleset object. type Ruleset struct { ID *int64 `json:"id,omitempty"` Name string `json:"name"` // Possible values for Target are branch, tag Target *string `json:"target,omitempty"` // Possible values for SourceType are: Repository, Organization SourceType *string `json:"source_type,omitempty"` Source string `json:"source"` // Possible values for Enforcement are: disabled, active, evaluate Enforcement string `json:"enforcement"` BypassActors []*BypassActor `json:"bypass_actors,omitempty"` NodeID *string `json:"node_id,omitempty"` Links *RulesetLinks `json:"_links,omitempty"` Conditions *RulesetConditions `json:"conditions,omitempty"` Rules []*RepositoryRule `json:"rules,omitempty"` } // GetRulesForBranch gets all the rules that apply to the specified branch. // // GitHub API docs: https://docs.github.com/rest/repos/rules#get-rules-for-a-branch // //meta:operation GET /repos/{owner}/{repo}/rules/branches/{branch} func (s *RepositoriesService) GetRulesForBranch(ctx context.Context, owner, repo, branch string) ([]*RepositoryRule, *Response, error) { u := fmt.Sprintf("repos/%v/%v/rules/branches/%v", owner, repo, branch) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var rules []*RepositoryRule resp, err := s.client.Do(ctx, req, &rules) if err != nil { return nil, resp, err } return rules, resp, nil } // GetAllRulesets gets all the rules that apply to the specified repository. // If includesParents is true, rulesets configured at the organization level that apply to the repository will be returned. // // GitHub API docs: https://docs.github.com/rest/repos/rules#get-all-repository-rulesets // //meta:operation GET /repos/{owner}/{repo}/rulesets func (s *RepositoriesService) GetAllRulesets(ctx context.Context, owner, repo string, includesParents bool) ([]*Ruleset, *Response, error) { u := fmt.Sprintf("repos/%v/%v/rulesets?includes_parents=%v", owner, repo, includesParents) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var ruleset []*Ruleset resp, err := s.client.Do(ctx, req, &ruleset) if err != nil { return nil, resp, err } return ruleset, resp, nil } // CreateRuleset creates a ruleset for the specified repository. // // GitHub API docs: https://docs.github.com/rest/repos/rules#create-a-repository-ruleset // //meta:operation POST /repos/{owner}/{repo}/rulesets func (s *RepositoriesService) CreateRuleset(ctx context.Context, owner, repo string, rs *Ruleset) (*Ruleset, *Response, error) { u := fmt.Sprintf("repos/%v/%v/rulesets", owner, repo) req, err := s.client.NewRequest("POST", u, rs) if err != nil { return nil, nil, err } var ruleset *Ruleset resp, err := s.client.Do(ctx, req, &ruleset) if err != nil { return nil, resp, err } return ruleset, resp, nil } // GetRuleset gets a ruleset for the specified repository. // If includesParents is true, rulesets configured at the organization level that apply to the repository will be returned. // // GitHub API docs: https://docs.github.com/rest/repos/rules#get-a-repository-ruleset // //meta:operation GET /repos/{owner}/{repo}/rulesets/{ruleset_id} func (s *RepositoriesService) GetRuleset(ctx context.Context, owner, repo string, rulesetID int64, includesParents bool) (*Ruleset, *Response, error) { u := fmt.Sprintf("repos/%v/%v/rulesets/%v?includes_parents=%v", owner, repo, rulesetID, includesParents) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var ruleset *Ruleset resp, err := s.client.Do(ctx, req, &ruleset) if err != nil { return nil, resp, err } return ruleset, resp, nil } // UpdateRuleset updates a ruleset for the specified repository. // // GitHub API docs: https://docs.github.com/rest/repos/rules#update-a-repository-ruleset // //meta:operation PUT /repos/{owner}/{repo}/rulesets/{ruleset_id} func (s *RepositoriesService) UpdateRuleset(ctx context.Context, owner, repo string, rulesetID int64, rs *Ruleset) (*Ruleset, *Response, error) { u := fmt.Sprintf("repos/%v/%v/rulesets/%v", owner, repo, rulesetID) req, err := s.client.NewRequest("PUT", u, rs) if err != nil { return nil, nil, err } var ruleset *Ruleset resp, err := s.client.Do(ctx, req, &ruleset) if err != nil { return nil, resp, err } return ruleset, resp, nil } // DeleteRuleset deletes a ruleset for the specified repository. // // GitHub API docs: https://docs.github.com/rest/repos/rules#delete-a-repository-ruleset // //meta:operation DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id} func (s *RepositoriesService) DeleteRuleset(ctx context.Context, owner, repo string, rulesetID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/rulesets/%v", owner, repo, rulesetID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/repos_rules_test.go000066400000000000000000000365361457013574700207260ustar00rootroot00000000000000// Copyright 2023 The go-github 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 TestRepositoryRule_UnmarshalJSON(t *testing.T) { tests := map[string]struct { data string want *RepositoryRule wantErr bool }{ "Invalid JSON": { data: `{`, want: &RepositoryRule{ Type: "", Parameters: nil, }, wantErr: true, }, "Valid creation": { data: `{"type":"creation"}`, want: NewCreationRule(), }, "Valid deletion": { data: `{"type":"deletion"}`, want: &RepositoryRule{ Type: "deletion", Parameters: nil, }, }, "Valid required_linear_history": { data: `{"type":"required_linear_history"}`, want: &RepositoryRule{ Type: "required_linear_history", Parameters: nil, }, }, "Valid required_signatures": { data: `{"type":"required_signatures"}`, want: &RepositoryRule{ Type: "required_signatures", Parameters: nil, }, }, "Valid non_fast_forward": { data: `{"type":"non_fast_forward"}`, want: &RepositoryRule{ Type: "non_fast_forward", Parameters: nil, }, }, "Valid update params": { data: `{"type":"update","parameters":{"update_allows_fetch_and_merge":true}}`, want: NewUpdateRule(&UpdateAllowsFetchAndMergeRuleParameters{UpdateAllowsFetchAndMerge: true}), }, "Invalid update params": { data: `{"type":"update","parameters":{"update_allows_fetch_and_merge":"true"}}`, want: &RepositoryRule{ Type: "update", Parameters: nil, }, wantErr: true, }, "Valid required_deployments params": { data: `{"type":"required_deployments","parameters":{"required_deployment_environments":["test"]}}`, want: NewRequiredDeploymentsRule(&RequiredDeploymentEnvironmentsRuleParameters{ RequiredDeploymentEnvironments: []string{"test"}, }), }, "Invalid required_deployments params": { data: `{"type":"required_deployments","parameters":{"required_deployment_environments":true}}`, want: &RepositoryRule{ Type: "required_deployments", Parameters: nil, }, wantErr: true, }, "Valid commit_message_pattern params": { data: `{"type":"commit_message_pattern","parameters":{"operator":"starts_with","pattern":"github"}}`, want: NewCommitMessagePatternRule(&RulePatternParameters{ Operator: "starts_with", Pattern: "github", }), }, "Invalid commit_message_pattern params": { data: `{"type":"commit_message_pattern","parameters":{"operator":"starts_with","pattern":1}}`, want: &RepositoryRule{ Type: "commit_message_pattern", Parameters: nil, }, wantErr: true, }, "Valid commit_author_email_pattern params": { data: `{"type":"commit_author_email_pattern","parameters":{"operator":"starts_with","pattern":"github"}}`, want: NewCommitAuthorEmailPatternRule(&RulePatternParameters{ Operator: "starts_with", Pattern: "github", }), }, "Invalid commit_author_email_pattern params": { data: `{"type":"commit_author_email_pattern","parameters":{"operator":"starts_with","pattern":1}}`, want: &RepositoryRule{ Type: "commit_author_email_pattern", Parameters: nil, }, wantErr: true, }, "Valid committer_email_pattern params": { data: `{"type":"committer_email_pattern","parameters":{"operator":"starts_with","pattern":"github"}}`, want: NewCommitterEmailPatternRule(&RulePatternParameters{ Operator: "starts_with", Pattern: "github", }), }, "Invalid committer_email_pattern params": { data: `{"type":"committer_email_pattern","parameters":{"operator":"starts_with","pattern":1}}`, want: &RepositoryRule{ Type: "committer_email_pattern", Parameters: nil, }, wantErr: true, }, "Valid branch_name_pattern params": { data: `{"type":"branch_name_pattern","parameters":{"operator":"starts_with","pattern":"github"}}`, want: NewBranchNamePatternRule(&RulePatternParameters{ Operator: "starts_with", Pattern: "github", }), }, "Invalid branch_name_pattern params": { data: `{"type":"branch_name_pattern","parameters":{"operator":"starts_with","pattern":1}}`, want: &RepositoryRule{ Type: "branch_name_pattern", Parameters: nil, }, wantErr: true, }, "Valid tag_name_pattern params": { data: `{"type":"tag_name_pattern","parameters":{"operator":"starts_with","pattern":"github"}}`, want: NewTagNamePatternRule(&RulePatternParameters{ Operator: "starts_with", Pattern: "github", }), }, "Invalid tag_name_pattern params": { data: `{"type":"tag_name_pattern","parameters":{"operator":"starts_with","pattern":1}}`, want: &RepositoryRule{ Type: "tag_name_pattern", Parameters: nil, }, wantErr: true, }, "Valid pull_request params": { data: `{ "type":"pull_request", "parameters":{ "dismiss_stale_reviews_on_push": true, "require_code_owner_review": true, "require_last_push_approval": true, "required_approving_review_count": 1, "required_review_thread_resolution":true } }`, want: NewPullRequestRule(&PullRequestRuleParameters{ DismissStaleReviewsOnPush: true, RequireCodeOwnerReview: true, RequireLastPushApproval: true, RequiredApprovingReviewCount: 1, RequiredReviewThreadResolution: true, }), }, "Invalid pull_request params": { data: `{"type":"pull_request","parameters": {"dismiss_stale_reviews_on_push":"true"}}`, want: &RepositoryRule{ Type: "pull_request", Parameters: nil, }, wantErr: true, }, "Valid required_status_checks params": { data: `{"type":"required_status_checks","parameters":{"required_status_checks":[{"context":"test","integration_id":1}],"strict_required_status_checks_policy":true}}`, want: NewRequiredStatusChecksRule(&RequiredStatusChecksRuleParameters{ RequiredStatusChecks: []RuleRequiredStatusChecks{ { Context: "test", IntegrationID: Int64(1), }, }, StrictRequiredStatusChecksPolicy: true, }), }, "Invalid required_status_checks params": { data: `{"type":"required_status_checks", "parameters": { "required_status_checks": [ { "context": 1 } ] }}`, want: &RepositoryRule{ Type: "required_status_checks", Parameters: nil, }, wantErr: true, }, "Required workflows params": { data: `{"type":"workflows","parameters":{"workflows":[{"path": ".github/workflows/test.yml", "repository_id": 1}]}}`, want: NewRequiredWorkflowsRule(&RequiredWorkflowsRuleParameters{ RequiredWorkflows: []*RuleRequiredWorkflow{ { Path: ".github/workflows/test.yml", RepositoryID: Int64(1), }, }, }), }, "Invalid type": { data: `{"type":"unknown"}`, want: &RepositoryRule{ Type: "", Parameters: nil, }, wantErr: true, }, } for name, tc := range tests { rule := &RepositoryRule{} t.Run(name, func(t *testing.T) { err := rule.UnmarshalJSON([]byte(tc.data)) if err == nil && tc.wantErr { t.Errorf("RepositoryRule.UnmarshalJSON returned nil instead of an error") } if err != nil && !tc.wantErr { t.Errorf("RepositoryRule.UnmarshalJSON returned an unexpected error: %+v", err) } if !cmp.Equal(tc.want, rule) { t.Errorf("RepositoryRule.UnmarshalJSON expected rule %+v, got %+v", tc.want, rule) } }) } } func TestRepositoriesService_GetRulesForBranch(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/repo/rules/branches/branch", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[ { "type": "creation" }, { "type": "update", "parameters": { "update_allows_fetch_and_merge": true } } ]`) }) ctx := context.Background() rules, _, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch") if err != nil { t.Errorf("Repositories.GetRulesForBranch returned error: %v", err) } creationRule := NewCreationRule() updateRule := NewUpdateRule(&UpdateAllowsFetchAndMergeRuleParameters{ UpdateAllowsFetchAndMerge: true, }) want := []*RepositoryRule{ creationRule, updateRule, } if !cmp.Equal(rules, want) { t.Errorf("Repositories.GetRulesForBranch returned %+v, want %+v", rules, want) } const methodName = "GetRulesForBranch" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetRulesForBranchEmptyUpdateRule(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/repo/rules/branches/branch", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[ { "type": "update" } ]`) }) ctx := context.Background() rules, _, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch") if err != nil { t.Errorf("Repositories.GetRulesForBranch returned error: %v", err) } updateRule := NewUpdateRule(nil) want := []*RepositoryRule{ updateRule, } if !cmp.Equal(rules, want) { t.Errorf("Repositories.GetRulesForBranch returned %+v, want %+v", Stringify(rules), Stringify(want)) } const methodName = "GetRulesForBranch" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetRulesForBranch(ctx, "o", "repo", "branch") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetAllRulesets(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/repo/rulesets", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[ { "id": 42, "name": "ruleset", "source_type": "Repository", "source": "o/repo", "enforcement": "enabled" }, { "id": 314, "name": "Another ruleset", "source_type": "Repository", "source": "o/repo", "enforcement": "enabled" } ]`) }) ctx := context.Background() ruleSet, _, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", false) if err != nil { t.Errorf("Repositories.GetAllRulesets returned error: %v", err) } want := []*Ruleset{ { ID: Int64(42), Name: "ruleset", SourceType: String("Repository"), Source: "o/repo", Enforcement: "enabled", }, { ID: Int64(314), Name: "Another ruleset", SourceType: String("Repository"), Source: "o/repo", Enforcement: "enabled", }, } if !cmp.Equal(ruleSet, want) { t.Errorf("Repositories.GetAllRulesets returned %+v, want %+v", ruleSet, want) } const methodName = "GetAllRulesets" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetAllRulesets(ctx, "o", "repo", false) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_CreateRuleset(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/repo/rulesets", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{ "id": 42, "name": "ruleset", "source_type": "Repository", "source": "o/repo", "enforcement": "enabled" }`) }) ctx := context.Background() ruleSet, _, err := client.Repositories.CreateRuleset(ctx, "o", "repo", &Ruleset{ Name: "ruleset", Enforcement: "enabled", }) if err != nil { t.Errorf("Repositories.CreateRuleset returned error: %v", err) } want := &Ruleset{ ID: Int64(42), Name: "ruleset", SourceType: String("Repository"), Source: "o/repo", Enforcement: "enabled", } if !cmp.Equal(ruleSet, want) { t.Errorf("Repositories.CreateRuleset returned %+v, want %+v", ruleSet, want) } const methodName = "CreateRuleset" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateRuleset(ctx, "o", "repo", &Ruleset{}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_GetRuleset(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "id": 42, "name": "ruleset", "source_type": "Organization", "source": "o", "enforcement": "enabled" }`) }) ctx := context.Background() ruleSet, _, err := client.Repositories.GetRuleset(ctx, "o", "repo", 42, true) if err != nil { t.Errorf("Repositories.GetRuleset returned error: %v", err) } want := &Ruleset{ ID: Int64(42), Name: "ruleset", SourceType: String("Organization"), Source: "o", Enforcement: "enabled", } if !cmp.Equal(ruleSet, want) { t.Errorf("Repositories.GetRuleset returned %+v, want %+v", ruleSet, want) } const methodName = "GetRuleset" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetRuleset(ctx, "o", "repo", 42, true) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_UpdateRuleset(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") fmt.Fprint(w, `{ "id": 42, "name": "ruleset", "source_type": "Repository", "source": "o/repo", "enforcement": "enabled" }`) }) ctx := context.Background() ruleSet, _, err := client.Repositories.UpdateRuleset(ctx, "o", "repo", 42, &Ruleset{ Name: "ruleset", Enforcement: "enabled", }) if err != nil { t.Errorf("Repositories.UpdateRuleset returned error: %v", err) } want := &Ruleset{ ID: Int64(42), Name: "ruleset", SourceType: String("Repository"), Source: "o/repo", Enforcement: "enabled", } if !cmp.Equal(ruleSet, want) { t.Errorf("Repositories.UpdateRuleset returned %+v, want %+v", ruleSet, want) } const methodName = "UpdateRuleset" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.UpdateRuleset(ctx, "o", "repo", 42, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_DeleteRuleset(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/repo/rulesets/42", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Repositories.DeleteRuleset(ctx, "o", "repo", 42) if err != nil { t.Errorf("Repositories.DeleteRuleset returned error: %v", err) } const methodName = "DeleteRuleset" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DeleteRuleset(ctx, "o", "repo", 42) }) } go-github-60.0.0/github/repos_stats.go000066400000000000000000000204201457013574700176540ustar00rootroot00000000000000// 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/rest/metrics/statistics#get-all-contributor-commit-activity // //meta:operation GET /repos/{owner}/{repo}/stats/contributors 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/rest/metrics/statistics#get-the-last-year-of-commit-activity // //meta:operation GET /repos/{owner}/{repo}/stats/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/rest/metrics/statistics#get-the-weekly-commit-activity // //meta:operation GET /repos/{owner}/{repo}/stats/code_frequency 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) if err != nil { return nil, resp, err } // 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, nil } // 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/rest/metrics/statistics#get-the-weekly-commit-count // //meta:operation GET /repos/{owner}/{repo}/stats/participation 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/rest/metrics/statistics#get-the-hourly-commit-count-for-each-day // //meta:operation GET /repos/{owner}/{repo}/stats/punch_card 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) if err != nil { return nil, resp, err } // 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, nil } go-github-60.0.0/github/repos_stats_test.go000066400000000000000000000241601457013574700207200ustar00rootroot00000000000000// 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 }) } func TestRepositoryParticipation_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryParticipation{}, "{}") u := &RepositoryParticipation{ All: []int{1}, Owner: []int{1}, } want := `{ "all": [1], "owner": [1] }` testJSONMarshal(t, u, want) } func TestWeeklyCommitActivity_Marshal(t *testing.T) { testJSONMarshal(t, &WeeklyCommitActivity{}, "{}") u := &WeeklyCommitActivity{ Days: []int{1}, Total: Int(1), Week: &Timestamp{referenceTime}, } want := `{ "days": [ 1 ], "total": 1, "week": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } func TestWeeklyStats_Marshal(t *testing.T) { testJSONMarshal(t, &WeeklyStats{}, "{}") u := &WeeklyStats{ Week: &Timestamp{referenceTime}, Additions: Int(1), Deletions: Int(1), Commits: Int(1), } want := `{ "w": ` + referenceTimeStr + `, "a": 1, "d": 1, "c": 1 }` testJSONMarshal(t, u, want) } func TestContributorStats_Marshal(t *testing.T) { testJSONMarshal(t, &ContributorStats{}, "{}") u := &ContributorStats{ Author: &Contributor{ID: Int64(1)}, Total: Int(1), Weeks: []*WeeklyStats{ { Week: &Timestamp{referenceTime}, Additions: Int(1), Deletions: Int(1), Commits: Int(1), }, }, } want := `{ "author": { "id": 1 }, "total": 1, "weeks": [ { "w": ` + referenceTimeStr + `, "a": 1, "d": 1, "c": 1 } ] }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/repos_statuses.go000066400000000000000000000106361457013574700204010ustar00rootroot00000000000000// 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" ) // 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 *Timestamp `json:"created_at,omitempty"` UpdatedAt *Timestamp `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/rest/commits/statuses#list-commit-statuses-for-a-reference // //meta:operation GET /repos/{owner}/{repo}/commits/{ref}/statuses 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/rest/commits/statuses#create-a-commit-status // //meta:operation POST /repos/{owner}/{repo}/statuses/{sha} 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/rest/commits/statuses#get-the-combined-status-for-a-specific-reference // //meta:operation GET /repos/{owner}/{repo}/commits/{ref}/status 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-60.0.0/github/repos_statuses_test.go000066400000000000000000000146541457013574700214440ustar00rootroot00000000000000// 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) assertNilError(t, 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 }) } func TestRepoStatus_Marshal(t *testing.T) { testJSONMarshal(t, &RepoStatus{}, "{}") u := &RepoStatus{ ID: Int64(1), NodeID: String("nid"), URL: String("url"), State: String("state"), TargetURL: String("turl"), Description: String("desc"), Context: String("ctx"), AvatarURL: String("aurl"), Creator: &User{ID: Int64(1)}, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, } want := `{ "id": 1, "node_id": "nid", "url": "url", "state": "state", "target_url": "turl", "description": "desc", "context": "ctx", "avatar_url": "aurl", "creator": { "id": 1 }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } func TestCombinedStatus_Marshal(t *testing.T) { testJSONMarshal(t, &CombinedStatus{}, "{}") u := &CombinedStatus{ State: String("state"), Name: String("name"), SHA: String("sha"), TotalCount: Int(1), Statuses: []*RepoStatus{ { ID: Int64(1), NodeID: String("nid"), URL: String("url"), State: String("state"), TargetURL: String("turl"), Description: String("desc"), Context: String("ctx"), AvatarURL: String("aurl"), Creator: &User{ID: Int64(1)}, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, }, }, CommitURL: String("curl"), RepositoryURL: String("rurl"), } want := `{ "state": "state", "name": "name", "sha": "sha", "total_count": 1, "statuses": [ { "id": 1, "node_id": "nid", "url": "url", "state": "state", "target_url": "turl", "description": "desc", "context": "ctx", "avatar_url": "aurl", "creator": { "id": 1 }, "created_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + ` } ], "commit_url": "curl", "repository_url": "rurl" }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/repos_tags.go000066400000000000000000000051401457013574700174560ustar00rootroot00000000000000// Copyright 2022 The go-github 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" ) // TagProtection represents a repository tag protection. type TagProtection struct { ID *int64 `json:"id"` Pattern *string `json:"pattern"` } // tagProtectionRequest represents a request to create tag protection. type tagProtectionRequest struct { // An optional glob pattern to match against when enforcing tag protection. Pattern string `json:"pattern"` } // ListTagProtection lists tag protection of the specified repository. // // GitHub API docs: https://docs.github.com/rest/repos/tags#list-tag-protection-states-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/tags/protection func (s *RepositoriesService) ListTagProtection(ctx context.Context, owner, repo string) ([]*TagProtection, *Response, error) { u := fmt.Sprintf("repos/%v/%v/tags/protection", owner, repo) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var tagProtections []*TagProtection resp, err := s.client.Do(ctx, req, &tagProtections) if err != nil { return nil, resp, err } return tagProtections, resp, nil } // CreateTagProtection creates the tag protection of the specified repository. // // GitHub API docs: https://docs.github.com/rest/repos/tags#create-a-tag-protection-state-for-a-repository // //meta:operation POST /repos/{owner}/{repo}/tags/protection func (s *RepositoriesService) CreateTagProtection(ctx context.Context, owner, repo, pattern string) (*TagProtection, *Response, error) { u := fmt.Sprintf("repos/%v/%v/tags/protection", owner, repo) r := &tagProtectionRequest{Pattern: pattern} req, err := s.client.NewRequest("POST", u, r) if err != nil { return nil, nil, err } tagProtection := new(TagProtection) resp, err := s.client.Do(ctx, req, tagProtection) if err != nil { return nil, resp, err } return tagProtection, resp, nil } // DeleteTagProtection deletes a tag protection from the specified repository. // // GitHub API docs: https://docs.github.com/rest/repos/tags#delete-a-tag-protection-state-for-a-repository // //meta:operation DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id} func (s *RepositoriesService) DeleteTagProtection(ctx context.Context, owner, repo string, tagProtectionID int64) (*Response, error) { u := fmt.Sprintf("repos/%v/%v/tags/protection/%v", owner, repo, tagProtectionID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/repos_tags_test.go000066400000000000000000000101721457013574700205160ustar00rootroot00000000000000// Copyright 2022 The go-github 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_ListTagProtection(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/tags/protection", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":1, "pattern":"tag1"},{"id":2, "pattern":"tag2"}]`) }) ctx := context.Background() tagProtections, _, err := client.Repositories.ListTagProtection(ctx, "o", "r") if err != nil { t.Errorf("Repositories.ListTagProtection returned error: %v", err) } want := []*TagProtection{{ID: Int64(1), Pattern: String("tag1")}, {ID: Int64(2), Pattern: String("tag2")}} if !cmp.Equal(tagProtections, want) { t.Errorf("Repositories.ListTagProtection returned %+v, want %+v", tagProtections, want) } const methodName = "ListTagProtection" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListTagProtection(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListTagProtection(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListTagProtection_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.ListTagProtection(ctx, "%", "r") testURLParseError(t, err) } func TestRepositoriesService_CreateTagProtection(t *testing.T) { client, mux, _, teardown := setup() defer teardown() pattern := "tag*" mux.HandleFunc("/repos/o/r/tags/protection", func(w http.ResponseWriter, r *http.Request) { v := new(tagProtectionRequest) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "POST") want := &tagProtectionRequest{Pattern: "tag*"} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"id":1,"pattern":"tag*"}`) }) ctx := context.Background() got, _, err := client.Repositories.CreateTagProtection(ctx, "o", "r", pattern) if err != nil { t.Errorf("Repositories.CreateTagProtection returned error: %v", err) } want := &TagProtection{ID: Int64(1), Pattern: String("tag*")} if !cmp.Equal(got, want) { t.Errorf("Repositories.CreateTagProtection returned %+v, want %+v", got, want) } const methodName = "CreateTagProtection" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.CreateTagProtection(ctx, "\n", "\n", pattern) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.CreateTagProtection(ctx, "o", "r", pattern) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_DeleteTagProtection(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/tags/protection/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Repositories.DeleteTagProtection(ctx, "o", "r", 1) if err != nil { t.Errorf("Repositories.DeleteTagProtection returned error: %v", err) } const methodName = "DeleteTagProtection" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.DeleteTagProtection(ctx, "\n", "\n", 1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DeleteTagProtection(ctx, "o", "r", 1) }) } func TestTagProtection_Marshal(t *testing.T) { testJSONMarshal(t, &TagProtection{}, "{}") u := &TagProtection{ ID: Int64(1), Pattern: String("pattern"), } want := `{ "id": 1, "pattern": "pattern" }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/repos_test.go000066400000000000000000004016021457013574700175020ustar00rootroot00000000000000// 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_ListByAuthenticatedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/repos", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":1},{"id":2}]`) }) ctx := context.Background() got, _, err := client.Repositories.ListByAuthenticatedUser(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.ListByAuthenticatedUser returned %+v, want %+v", got, want) } const methodName = "ListByAuthenticatedUser" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListByAuthenticatedUser(ctx, nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListByUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/repos", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "sort": "created", "direction": "asc", "page": "2", }) fmt.Fprint(w, `[{"id":1}]`) }) opt := &RepositoryListByUserOptions{ Sort: "created", Direction: "asc", ListOptions: ListOptions{Page: 2}, } ctx := context.Background() repos, _, err := client.Repositories.ListByUser(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.ListByUser returned %+v, want %+v", repos, want) } const methodName = "ListByUser" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListByUser(ctx, "\n", &RepositoryListByUserOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListByUser(ctx, "u", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestRepositoriesService_ListByUser_type(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/repos", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{ "type": "owner", }) fmt.Fprint(w, `[{"id":1}]`) }) opt := &RepositoryListByUserOptions{ Type: "owner", } ctx := context.Background() repos, _, err := client.Repositories.ListByUser(ctx, "u", opt) if err != nil { t.Errorf("Repositories.ListByUser returned error: %v", err) } want := []*Repository{{ID: Int64(1)}} if !cmp.Equal(repos, want) { t.Errorf("Repositories.ListByUser returned %+v, want %+v", repos, want) } } func TestRepositoriesService_ListByUser_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Repositories.ListByUser(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) assertNilError(t, 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) assertNilError(t, 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) assertNilError(t, 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"},"security_and_analysis":{"advanced_security":{"status":"enabled"},"secret_scanning":{"status":"enabled"},"secret_scanning_push_protection":{"status":"enabled"},"dependabot_security_updates":{"status": "enabled"}, "secret_scanning_validity_checks":{"status":"enabled"}}}`) }) 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")}, SecurityAndAnalysis: &SecurityAndAnalysis{AdvancedSecurity: &AdvancedSecurity{Status: String("enabled")}, SecretScanning: &SecretScanning{String("enabled")}, SecretScanningPushProtection: &SecretScanningPushProtection{String("enabled")}, DependabotSecurityUpdates: &DependabotSecurityUpdates{String("enabled")}, SecretScanningValidityChecks: &SecretScanningValidityChecks{String("enabled")}}} 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", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testHeader(t, r, "Accept", mediaTypeCodesOfConductPreview) fmt.Fprint(w, `{ "code_of_conduct": { "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) assertNilError(t, 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") 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_GetAutomatedSecurityFixes(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, "GET") fmt.Fprint(w, `{"enabled": true, "paused": false}`) }) ctx := context.Background() fixes, _, err := client.Repositories.GetAutomatedSecurityFixes(ctx, "o", "r") if err != nil { t.Errorf("Repositories.GetAutomatedSecurityFixes returned errpr: #{err}") } want := &AutomatedSecurityFixes{ Enabled: Bool(true), Paused: Bool(false), } if !cmp.Equal(fixes, want) { t.Errorf("Repositories.GetAutomatedSecurityFixes returned #{fixes}, want #{want}") } const methodName = "GetAutomatedSecurityFixes" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.GetAutomatedSecurityFixes(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.GetAutomatedSecurityFixes(ctx, "o", "r") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, 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") 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() tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%"}, } for _, test := range tests { mux.HandleFunc(test.urlPath, 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", test.branch, 0) 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", 0) return err }) } } func TestRepositoriesService_GetBranch_BadJSONResponse(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{"name":"n", "commit":{"sha":...truncated`) }) ctx := context.Background() if _, _, err := client.Repositories.GetBranch(ctx, "o", "r", test.branch, 0); err == nil { t.Error("Repositories.GetBranch returned no error; wanted JSON error") } }) } } 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", 1) 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) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat-branch-50%"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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", test.branch, 1) 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, "\n", "\n", "\n", 1) return err }) }) } } func TestRepositoriesService_RenameBranch(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/rename"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/rename"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() renameBranchReq := "nn" mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { v := new(renameBranchRequest) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) testMethod(t, r, "POST") want := &renameBranchRequest{NewName: renameBranchReq} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{"protected":true,"name":"nn"}`) }) ctx := context.Background() got, _, err := client.Repositories.RenameBranch(ctx, "o", "r", test.branch, renameBranchReq) if err != nil { t.Errorf("Repositories.RenameBranch returned error: %v", err) } want := &Branch{Name: String("nn"), Protected: Bool(true)} if !cmp.Equal(got, want) { t.Errorf("Repositories.RenameBranch returned %+v, want %+v", got, want) } const methodName = "RenameBranch" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.RenameBranch(ctx, "\n", "\n", "\n", renameBranchReq) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.RenameBranch(ctx, "o", "r", test.branch, renameBranchReq) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_GetBranchProtection(t *testing.T) { tests := []struct { branch string urlPath string enforceAdminsURLPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection", enforceAdminsURLPath: "/repos/o/r/branches/b/protection/enforce_admins"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection", enforceAdminsURLPath: "/repos/o/r/branches/feat/branch-50%/protection/enforce_admins"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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"], "checks": [ { "context": "continuous-integration", "app_id": null } ] }, "required_pull_request_reviews":{ "dismissal_restrictions":{ "users":[{ "id":3, "login":"u" }], "teams":[{ "id":4, "slug":"t" }], "apps":[{ "id":5, "slug":"a" }] }, "dismiss_stale_reviews":true, "require_code_owner_reviews":true, "require_last_push_approval":false, "required_approving_review_count":1 }, "enforce_admins":{ "url":"%s", "enabled":true }, "restrictions":{ "users":[{"id":1,"login":"u"}], "teams":[{"id":2,"slug":"t"}], "apps":[{"id":3,"slug":"a"}] }, "required_conversation_resolution": { "enabled": true }, "block_creations": { "enabled": false }, "lock_branch": { "enabled": false }, "allow_fork_syncing": { "enabled": false } }`, test.enforceAdminsURLPath) }) ctx := context.Background() protection, _, err := client.Repositories.GetBranchProtection(ctx, "o", "r", test.branch) if err != nil { t.Errorf("Repositories.GetBranchProtection returned error: %v", err) } want := &Protection{ RequiredStatusChecks: &RequiredStatusChecks{ Strict: true, Contexts: &[]string{"continuous-integration"}, Checks: &[]*RequiredStatusCheck{ { Context: "continuous-integration", }, }, }, RequiredPullRequestReviews: &PullRequestReviewsEnforcement{ DismissStaleReviews: true, DismissalRestrictions: &DismissalRestrictions{ Users: []*User{ {Login: String("u"), ID: Int64(3)}, }, Teams: []*Team{ {Slug: String("t"), ID: Int64(4)}, }, Apps: []*App{ {Slug: String("a"), ID: Int64(5)}, }, }, RequireCodeOwnerReviews: true, RequiredApprovingReviewCount: 1, RequireLastPushApproval: false, }, EnforceAdmins: &AdminEnforcement{ URL: String(test.enforceAdminsURLPath), Enabled: 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)}, }, }, RequiredConversationResolution: &RequiredConversationResolution{ Enabled: true, }, BlockCreations: &BlockCreations{ Enabled: Bool(false), }, LockBranch: &LockBranch{ Enabled: Bool(false), }, AllowForkSyncing: &AllowForkSyncing{ Enabled: Bool(false), }, } 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", test.branch) 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() tests := []struct { branch string urlPath string enforceAdminsURLPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection", enforceAdminsURLPath: "/repos/o/r/branches/b/protection/enforce_admins"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection", enforceAdminsURLPath: "/repos/o/r/branches/feat/branch-50%/protection/enforce_admins"}, } for _, test := range tests { mux.HandleFunc(test.urlPath, 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"], "checks": [ { "context": "continuous-integration", "app_id": null } ] }, "required_pull_request_reviews":{ "dismiss_stale_reviews":true, "require_code_owner_reviews":true, "required_approving_review_count":1 }, "enforce_admins":{ "url":"%s", "enabled":true }, "restrictions":{ "users":[{"id":1,"login":"u"}], "teams":[{"id":2,"slug":"t"}] } }`, test.enforceAdminsURLPath) }) ctx := context.Background() protection, _, err := client.Repositories.GetBranchProtection(ctx, "o", "r", test.branch) if err != nil { t.Errorf("Repositories.GetBranchProtection returned error: %v", err) } want := &Protection{ RequiredStatusChecks: &RequiredStatusChecks{ Strict: true, Contexts: &[]string{"continuous-integration"}, Checks: &[]*RequiredStatusCheck{ { Context: "continuous-integration", }, }, }, RequiredPullRequestReviews: &PullRequestReviewsEnforcement{ DismissStaleReviews: true, DismissalRestrictions: nil, RequireCodeOwnerReviews: true, RequiredApprovingReviewCount: 1, }, EnforceAdmins: &AdminEnforcement{ URL: String(test.enforceAdminsURLPath), 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_GetBranchProtection_branchNotProtected(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, `{ "message": %q, "documentation_url": "https://docs.github.com/rest/repos#get-branch-protection" }`, githubBranchNotProtected) }) ctx := context.Background() protection, _, err := client.Repositories.GetBranchProtection(ctx, "o", "r", test.branch) if protection != nil { t.Errorf("Repositories.GetBranchProtection returned non-nil protection data") } if err != ErrBranchNotProtected { t.Errorf("Repositories.GetBranchProtection returned an invalid error: %v", err) } }) } } func TestRepositoriesService_UpdateBranchProtection_Contexts(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection"}, } for _, test := range tests { t.Run(test.branch, func(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"}, Apps: &[]string{"aa"}, }, BypassPullRequestAllowancesRequest: &BypassPullRequestAllowancesRequest{ Users: []string{"uuu"}, Teams: []string{"ttt"}, Apps: []string{"aaa"}, }, }, Restrictions: &BranchRestrictionsRequest{ Users: []string{"u"}, Teams: []string{"t"}, Apps: []string{"a"}, }, BlockCreations: Bool(true), LockBranch: Bool(true), AllowForkSyncing: Bool(true), } mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { v := new(ProtectionRequest) assertNilError(t, 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"], "checks": [ { "context": "continuous-integration", "app_id": null } ] }, "required_pull_request_reviews":{ "dismissal_restrictions":{ "users":[{ "id":3, "login":"uu" }], "teams":[{ "id":4, "slug":"tt" }], "apps":[{ "id":5, "slug":"aa" }] }, "dismiss_stale_reviews":true, "require_code_owner_reviews":true, "bypass_pull_request_allowances": { "users":[{"id":10,"login":"uuu"}], "teams":[{"id":20,"slug":"ttt"}], "apps":[{"id":30,"slug":"aaa"}] } }, "restrictions":{ "users":[{"id":1,"login":"u"}], "teams":[{"id":2,"slug":"t"}], "apps":[{"id":3,"slug":"a"}] }, "block_creations": { "enabled": true }, "lock_branch": { "enabled": true }, "allow_fork_syncing": { "enabled": true } }`) }) ctx := context.Background() protection, _, err := client.Repositories.UpdateBranchProtection(ctx, "o", "r", test.branch, input) if err != nil { t.Errorf("Repositories.UpdateBranchProtection returned error: %v", err) } want := &Protection{ RequiredStatusChecks: &RequiredStatusChecks{ Strict: true, Contexts: &[]string{"continuous-integration"}, Checks: &[]*RequiredStatusCheck{ { Context: "continuous-integration", }, }, }, RequiredPullRequestReviews: &PullRequestReviewsEnforcement{ DismissStaleReviews: true, DismissalRestrictions: &DismissalRestrictions{ Users: []*User{ {Login: String("uu"), ID: Int64(3)}, }, Teams: []*Team{ {Slug: String("tt"), ID: Int64(4)}, }, Apps: []*App{ {Slug: String("aa"), ID: Int64(5)}, }, }, RequireCodeOwnerReviews: true, BypassPullRequestAllowances: &BypassPullRequestAllowances{ Users: []*User{ {Login: String("uuu"), ID: Int64(10)}, }, Teams: []*Team{ {Slug: String("ttt"), ID: Int64(20)}, }, Apps: []*App{ {Slug: String("aaa"), ID: Int64(30)}, }, }, }, 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)}, }, }, BlockCreations: &BlockCreations{ Enabled: Bool(true), }, LockBranch: &LockBranch{ Enabled: Bool(true), }, AllowForkSyncing: &AllowForkSyncing{ Enabled: Bool(true), }, } 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", test.branch, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_UpdateBranchProtection_EmptyContexts(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ProtectionRequest{ RequiredStatusChecks: &RequiredStatusChecks{ Strict: true, Contexts: &[]string{}, }, RequiredPullRequestReviews: &PullRequestReviewsEnforcementRequest{ DismissStaleReviews: true, DismissalRestrictionsRequest: &DismissalRestrictionsRequest{ Users: &[]string{"uu"}, Teams: &[]string{"tt"}, Apps: &[]string{"aa"}, }, BypassPullRequestAllowancesRequest: &BypassPullRequestAllowancesRequest{ Users: []string{"uuu"}, Teams: []string{"ttt"}, Apps: []string{"aaa"}, }, }, Restrictions: &BranchRestrictionsRequest{ Users: []string{"u"}, Teams: []string{"t"}, Apps: []string{"a"}, }, BlockCreations: Bool(true), LockBranch: Bool(true), AllowForkSyncing: Bool(true), } mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { v := new(ProtectionRequest) assertNilError(t, 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":[], "checks": null }, "required_pull_request_reviews":{ "dismissal_restrictions":{ "users":[{ "id":3, "login":"uu" }], "teams":[{ "id":4, "slug":"tt" }], "apps":[{ "id":5, "slug":"aa" }] }, "dismiss_stale_reviews":true, "require_code_owner_reviews":true, "bypass_pull_request_allowances": { "users":[{"id":10,"login":"uuu"}], "teams":[{"id":20,"slug":"ttt"}], "apps":[{"id":30,"slug":"aaa"}] } }, "restrictions":{ "users":[{"id":1,"login":"u"}], "teams":[{"id":2,"slug":"t"}], "apps":[{"id":3,"slug":"a"}] }, "block_creations": { "enabled": true }, "lock_branch": { "enabled": true }, "allow_fork_syncing": { "enabled": true } }`) }) ctx := context.Background() protection, _, err := client.Repositories.UpdateBranchProtection(ctx, "o", "r", test.branch, input) if err != nil { t.Errorf("Repositories.UpdateBranchProtection returned error: %v", err) } want := &Protection{ RequiredStatusChecks: &RequiredStatusChecks{ Strict: true, Contexts: &[]string{}, }, RequiredPullRequestReviews: &PullRequestReviewsEnforcement{ DismissStaleReviews: true, DismissalRestrictions: &DismissalRestrictions{ Users: []*User{ {Login: String("uu"), ID: Int64(3)}, }, Teams: []*Team{ {Slug: String("tt"), ID: Int64(4)}, }, Apps: []*App{ {Slug: String("aa"), ID: Int64(5)}, }, }, RequireCodeOwnerReviews: true, BypassPullRequestAllowances: &BypassPullRequestAllowances{ Users: []*User{ {Login: String("uuu"), ID: Int64(10)}, }, Teams: []*Team{ {Slug: String("ttt"), ID: Int64(20)}, }, Apps: []*App{ {Slug: String("aaa"), ID: Int64(30)}, }, }, }, 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)}, }, }, BlockCreations: &BlockCreations{ Enabled: Bool(true), }, LockBranch: &LockBranch{ Enabled: Bool(true), }, AllowForkSyncing: &AllowForkSyncing{ Enabled: Bool(true), }, } 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", test.branch, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_UpdateBranchProtection_Checks(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ProtectionRequest{ RequiredStatusChecks: &RequiredStatusChecks{ Strict: true, Checks: &[]*RequiredStatusCheck{ { Context: "continuous-integration", }, }, }, RequiredPullRequestReviews: &PullRequestReviewsEnforcementRequest{ DismissStaleReviews: true, DismissalRestrictionsRequest: &DismissalRestrictionsRequest{ Users: &[]string{"uu"}, Teams: &[]string{"tt"}, Apps: &[]string{"aa"}, }, BypassPullRequestAllowancesRequest: &BypassPullRequestAllowancesRequest{ Users: []string{"uuu"}, Teams: []string{"ttt"}, Apps: []string{"aaa"}, }, }, Restrictions: &BranchRestrictionsRequest{ Users: []string{"u"}, Teams: []string{"t"}, Apps: []string{"a"}, }, } mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { v := new(ProtectionRequest) assertNilError(t, 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"], "checks": [ { "context": "continuous-integration", "app_id": null } ] }, "required_pull_request_reviews":{ "dismissal_restrictions":{ "users":[{ "id":3, "login":"uu" }], "teams":[{ "id":4, "slug":"tt" }], "apps":[{ "id":5, "slug":"aa" }] }, "dismiss_stale_reviews":true, "require_code_owner_reviews":true, "bypass_pull_request_allowances": { "users":[{"id":10,"login":"uuu"}], "teams":[{"id":20,"slug":"ttt"}], "apps":[{"id":30,"slug":"aaa"}] } }, "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", test.branch, input) if err != nil { t.Errorf("Repositories.UpdateBranchProtection returned error: %v", err) } want := &Protection{ RequiredStatusChecks: &RequiredStatusChecks{ Strict: true, Contexts: &[]string{"continuous-integration"}, Checks: &[]*RequiredStatusCheck{ { Context: "continuous-integration", }, }, }, RequiredPullRequestReviews: &PullRequestReviewsEnforcement{ DismissStaleReviews: true, DismissalRestrictions: &DismissalRestrictions{ Users: []*User{ {Login: String("uu"), ID: Int64(3)}, }, Teams: []*Team{ {Slug: String("tt"), ID: Int64(4)}, }, Apps: []*App{ {Slug: String("aa"), ID: Int64(5)}, }, }, RequireCodeOwnerReviews: true, BypassPullRequestAllowances: &BypassPullRequestAllowances{ Users: []*User{ {Login: String("uuu"), ID: Int64(10)}, }, Teams: []*Team{ {Slug: String("ttt"), ID: Int64(20)}, }, Apps: []*App{ {Slug: String("aaa"), ID: Int64(30)}, }, }, }, 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) } }) } } func TestRepositoriesService_UpdateBranchProtection_EmptyChecks(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ProtectionRequest{ RequiredStatusChecks: &RequiredStatusChecks{ Strict: true, Checks: &[]*RequiredStatusCheck{}, }, RequiredPullRequestReviews: &PullRequestReviewsEnforcementRequest{ DismissStaleReviews: true, DismissalRestrictionsRequest: &DismissalRestrictionsRequest{ Users: &[]string{"uu"}, Teams: &[]string{"tt"}, Apps: &[]string{"aa"}, }, BypassPullRequestAllowancesRequest: &BypassPullRequestAllowancesRequest{ Users: []string{"uuu"}, Teams: []string{"ttt"}, Apps: []string{"aaa"}, }, }, Restrictions: &BranchRestrictionsRequest{ Users: []string{"u"}, Teams: []string{"t"}, Apps: []string{"a"}, }, } mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { v := new(ProtectionRequest) assertNilError(t, 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":null, "checks": [] }, "required_pull_request_reviews":{ "dismissal_restrictions":{ "users":[{ "id":3, "login":"uu" }], "teams":[{ "id":4, "slug":"tt" }], "apps":[{ "id":5, "slug":"aa" }] }, "dismiss_stale_reviews":true, "require_code_owner_reviews":true, "bypass_pull_request_allowances": { "users":[{"id":10,"login":"uuu"}], "teams":[{"id":20,"slug":"ttt"}], "apps":[{"id":30,"slug":"aaa"}] } }, "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", test.branch, input) if err != nil { t.Errorf("Repositories.UpdateBranchProtection returned error: %v", err) } want := &Protection{ RequiredStatusChecks: &RequiredStatusChecks{ Strict: true, Checks: &[]*RequiredStatusCheck{}, }, RequiredPullRequestReviews: &PullRequestReviewsEnforcement{ DismissStaleReviews: true, DismissalRestrictions: &DismissalRestrictions{ Users: []*User{ {Login: String("uu"), ID: Int64(3)}, }, Teams: []*Team{ {Slug: String("tt"), ID: Int64(4)}, }, Apps: []*App{ {Slug: String("aa"), ID: Int64(5)}, }, }, RequireCodeOwnerReviews: true, BypassPullRequestAllowances: &BypassPullRequestAllowances{ Users: []*User{ {Login: String("uuu"), ID: Int64(10)}, }, Teams: []*Team{ {Slug: String("ttt"), ID: Int64(20)}, }, Apps: []*App{ {Slug: String("aaa"), ID: Int64(30)}, }, }, }, 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) } }) } } func TestRepositoriesService_UpdateBranchProtection_StrictNoChecks(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ProtectionRequest{ RequiredStatusChecks: &RequiredStatusChecks{ Strict: true, }, RequiredPullRequestReviews: &PullRequestReviewsEnforcementRequest{ DismissStaleReviews: true, DismissalRestrictionsRequest: &DismissalRestrictionsRequest{ Users: &[]string{"uu"}, Teams: &[]string{"tt"}, Apps: &[]string{"aa"}, }, BypassPullRequestAllowancesRequest: &BypassPullRequestAllowancesRequest{ Users: []string{"uuu"}, Teams: []string{"ttt"}, Apps: []string{"aaa"}, }, }, Restrictions: &BranchRestrictionsRequest{ Users: []string{"u"}, Teams: []string{"t"}, Apps: []string{"a"}, }, } mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { v := new(ProtectionRequest) assertNilError(t, 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":[] }, "required_pull_request_reviews":{ "dismissal_restrictions":{ "users":[{ "id":3, "login":"uu" }], "teams":[{ "id":4, "slug":"tt" }], "apps":[{ "id":5, "slug":"aa" }] }, "dismiss_stale_reviews":true, "require_code_owner_reviews":true, "require_last_push_approval":false, "bypass_pull_request_allowances": { "users":[{"id":10,"login":"uuu"}], "teams":[{"id":20,"slug":"ttt"}], "apps":[{"id":30,"slug":"aaa"}] } }, "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", test.branch, input) if err != nil { t.Errorf("Repositories.UpdateBranchProtection returned error: %v", err) } want := &Protection{ RequiredStatusChecks: &RequiredStatusChecks{ Strict: true, Contexts: &[]string{}, }, RequiredPullRequestReviews: &PullRequestReviewsEnforcement{ DismissStaleReviews: true, DismissalRestrictions: &DismissalRestrictions{ Users: []*User{ {Login: String("uu"), ID: Int64(3)}, }, Teams: []*Team{ {Slug: String("tt"), ID: Int64(4)}, }, Apps: []*App{ {Slug: String("aa"), ID: Int64(5)}, }, }, RequireCodeOwnerReviews: true, BypassPullRequestAllowances: &BypassPullRequestAllowances{ Users: []*User{ {Login: String("uuu"), ID: Int64(10)}, }, Teams: []*Team{ {Slug: String("ttt"), ID: Int64(20)}, }, Apps: []*App{ {Slug: String("aaa"), ID: Int64(30)}, }, }, }, 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) } }) } } func TestRepositoriesService_UpdateBranchProtection_RequireLastPushApproval(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &ProtectionRequest{ RequiredPullRequestReviews: &PullRequestReviewsEnforcementRequest{ RequireLastPushApproval: Bool(true), }, } mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { v := new(ProtectionRequest) assertNilError(t, 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.Fprintf(w, `{ "required_pull_request_reviews":{ "require_last_push_approval":true } }`) }) ctx := context.Background() protection, _, err := client.Repositories.UpdateBranchProtection(ctx, "o", "r", test.branch, input) if err != nil { t.Errorf("Repositories.UpdateBranchProtection returned error: %v", err) } want := &Protection{ RequiredPullRequestReviews: &PullRequestReviewsEnforcement{ RequireLastPushApproval: true, }, } if !cmp.Equal(protection, want) { t.Errorf("Repositories.UpdateBranchProtection returned %+v, want %+v", protection, want) } }) } } func TestRepositoriesService_RemoveBranchProtection(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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", test.branch) 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", test.branch) }) }) } } 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) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/required_status_checks"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/required_status_checks"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "strict": true, "contexts": ["x","y","z"], "checks": [ { "context": "x", "app_id": null }, { "context": "y", "app_id": null }, { "context": "z", "app_id": null } ] }`) }) ctx := context.Background() checks, _, err := client.Repositories.GetRequiredStatusChecks(ctx, "o", "r", test.branch) if err != nil { t.Errorf("Repositories.GetRequiredStatusChecks returned error: %v", err) } want := &RequiredStatusChecks{ Strict: true, Contexts: &[]string{"x", "y", "z"}, Checks: &[]*RequiredStatusCheck{ { Context: "x", }, { Context: "y", }, { Context: "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", test.branch) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_GetRequiredStatusChecks_branchNotProtected(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/required_status_checks"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/required_status_checks"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, `{ "message": %q, "documentation_url": "https://docs.github.com/rest/repos#get-branch-protection" }`, githubBranchNotProtected) }) ctx := context.Background() checks, _, err := client.Repositories.GetRequiredStatusChecks(ctx, "o", "r", test.branch) if checks != nil { t.Errorf("Repositories.GetRequiredStatusChecks returned non-nil status-checks data") } if err != ErrBranchNotProtected { t.Errorf("Repositories.GetRequiredStatusChecks returned an invalid error: %v", err) } }) } } func TestRepositoriesService_UpdateRequiredStatusChecks_Contexts(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/required_status_checks"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/required_status_checks"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &RequiredStatusChecksRequest{ Strict: Bool(true), Contexts: []string{"continuous-integration"}, } mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { v := new(RequiredStatusChecksRequest) assertNilError(t, 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"], "checks": [ { "context": "continuous-integration", "app_id": null } ] }`) }) ctx := context.Background() statusChecks, _, err := client.Repositories.UpdateRequiredStatusChecks(ctx, "o", "r", test.branch, input) if err != nil { t.Errorf("Repositories.UpdateRequiredStatusChecks returned error: %v", err) } want := &RequiredStatusChecks{ Strict: true, Contexts: &[]string{"continuous-integration"}, Checks: &[]*RequiredStatusCheck{ { Context: "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", test.branch, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_UpdateRequiredStatusChecks_Checks(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/required_status_checks"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/required_status_checks"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() appID := int64(123) noAppID := int64(-1) input := &RequiredStatusChecksRequest{ Strict: Bool(true), Checks: []*RequiredStatusCheck{ { Context: "continuous-integration", }, { Context: "continuous-integration2", AppID: &appID, }, { Context: "continuous-integration3", AppID: &noAppID, }, }, } mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { v := new(RequiredStatusChecksRequest) assertNilError(t, 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"], "checks": [ { "context": "continuous-integration", "app_id": null }, { "context": "continuous-integration2", "app_id": 123 }, { "context": "continuous-integration3", "app_id": null } ] }`) }) ctx := context.Background() statusChecks, _, err := client.Repositories.UpdateRequiredStatusChecks(ctx, "o", "r", test.branch, input) if err != nil { t.Errorf("Repositories.UpdateRequiredStatusChecks returned error: %v", err) } want := &RequiredStatusChecks{ Strict: true, Contexts: &[]string{"continuous-integration"}, Checks: &[]*RequiredStatusCheck{ { Context: "continuous-integration", }, { Context: "continuous-integration2", AppID: &appID, }, { Context: "continuous-integration3", }, }, } if !cmp.Equal(statusChecks, want) { t.Errorf("Repositories.UpdateRequiredStatusChecks returned %+v, want %+v", statusChecks, want) } }) } } func TestRepositoriesService_RemoveRequiredStatusChecks(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/required_status_checks"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/required_status_checks"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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", test.branch) 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", test.branch) }) }) } } func TestRepositoriesService_ListRequiredStatusChecksContexts(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/required_status_checks/contexts"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/required_status_checks/contexts"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `["x", "y", "z"]`) }) ctx := context.Background() contexts, _, err := client.Repositories.ListRequiredStatusChecksContexts(ctx, "o", "r", test.branch) 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", test.branch) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_ListRequiredStatusChecksContexts_branchNotProtected(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/required_status_checks/contexts"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/required_status_checks/contexts"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusBadRequest) fmt.Fprintf(w, `{ "message": %q, "documentation_url": "https://docs.github.com/rest/repos#get-branch-protection" }`, githubBranchNotProtected) }) ctx := context.Background() contexts, _, err := client.Repositories.ListRequiredStatusChecksContexts(ctx, "o", "r", test.branch) if contexts != nil { t.Errorf("Repositories.ListRequiredStatusChecksContexts returned non-nil contexts data") } if err != ErrBranchNotProtected { t.Errorf("Repositories.ListRequiredStatusChecksContexts returned an invalid error: %v", err) } }) } } func TestRepositoriesService_GetPullRequestReviewEnforcement(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/required_pull_request_reviews"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/required_pull_request_reviews"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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"}], "apps":[{"id":3,"slug":"a"}] }, "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", test.branch) 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)}, }, Apps: []*App{ {Slug: String("a"), ID: Int64(3)}, }, }, 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", test.branch) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_UpdatePullRequestReviewEnforcement(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/required_pull_request_reviews"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/required_pull_request_reviews"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &PullRequestReviewsEnforcementUpdate{ DismissalRestrictionsRequest: &DismissalRestrictionsRequest{ Users: &[]string{"u"}, Teams: &[]string{"t"}, Apps: &[]string{"a"}, }, } mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { v := new(PullRequestReviewsEnforcementUpdate) assertNilError(t, 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"}], "apps":[{"id":3,"slug":"a"}] }, "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", test.branch, 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)}, }, Apps: []*App{ {Slug: String("a"), ID: Int64(3)}, }, }, 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", test.branch, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_DisableDismissalRestrictions(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/required_pull_request_reviews"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/required_pull_request_reviews"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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", test.branch) 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", test.branch) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_RemovePullRequestReviewEnforcement(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/required_pull_request_reviews"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/required_pull_request_reviews"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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", test.branch) 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", test.branch) }) }) } } func TestRepositoriesService_GetAdminEnforcement(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/enforce_admins"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/enforce_admins"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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", test.branch) 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", test.branch) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_AddAdminEnforcement(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/enforce_admins"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/enforce_admins"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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", test.branch) 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", test.branch) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_RemoveAdminEnforcement(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/enforce_admins"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/enforce_admins"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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", test.branch) 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", test.branch) }) }) } } func TestRepositoriesService_GetSignaturesProtectedBranch(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/required_signatures"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/required_signatures"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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", test.branch) 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", test.branch) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_RequireSignaturesOnProtectedBranch(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/required_signatures"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/required_signatures"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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", test.branch) 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", test.branch) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_OptionalSignaturesOnProtectedBranch(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/required_signatures"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/required_signatures"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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", test.branch) 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", test.branch) }) }) } } 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{}, Apps: &[]string{}, }, RequireLastPushApproval: Bool(true), } got, err = json.Marshal(req) if err != nil { t.Errorf("PullRequestReviewsEnforcementRequest.MarshalJSON returned error: %v", err) } want = `{"dismissal_restrictions":{"users":[],"teams":[],"apps":[]},"dismiss_stale_reviews":false,"require_code_owner_reviews":false,"required_approving_review_count":0,"require_last_push_approval":true}` 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_ListAppRestrictions(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/restrictions/apps"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/restrictions/apps"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") }) ctx := context.Background() _, _, err := client.Repositories.ListAppRestrictions(ctx, "o", "r", test.branch) if err != nil { t.Errorf("Repositories.ListAppRestrictions returned error: %v", err) } const methodName = "ListAppRestrictions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListAppRestrictions(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListAppRestrictions(ctx, "o", "r", test.branch) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_ReplaceAppRestrictions(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/restrictions/apps"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/restrictions/apps"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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", test.branch, 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", test.branch, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_AddAppRestrictions(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/restrictions/apps"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/restrictions/apps"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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", test.branch, 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", test.branch, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_RemoveAppRestrictions(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/restrictions/apps"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/restrictions/apps"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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", test.branch, 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", test.branch, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_ListTeamRestrictions(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/restrictions/teams"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/restrictions/teams"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") }) ctx := context.Background() _, _, err := client.Repositories.ListTeamRestrictions(ctx, "o", "r", test.branch) if err != nil { t.Errorf("Repositories.ListTeamRestrictions returned error: %v", err) } const methodName = "ListTeamRestrictions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListTeamRestrictions(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListTeamRestrictions(ctx, "o", "r", test.branch) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_ReplaceTeamRestrictions(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/restrictions/teams"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/restrictions/teams"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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.ReplaceTeamRestrictions(ctx, "o", "r", test.branch, input) if err != nil { t.Errorf("Repositories.ReplaceTeamRestrictions returned error: %v", err) } want := []*Team{ {Name: String("octocat")}, } if !cmp.Equal(got, want) { t.Errorf("Repositories.ReplaceTeamRestrictions returned %+v, want %+v", got, want) } const methodName = "ReplaceTeamRestrictions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ReplaceTeamRestrictions(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ReplaceTeamRestrictions(ctx, "o", "r", test.branch, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_AddTeamRestrictions(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/restrictions/teams"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/restrictions/teams"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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.AddTeamRestrictions(ctx, "o", "r", test.branch, input) if err != nil { t.Errorf("Repositories.AddTeamRestrictions returned error: %v", err) } want := []*Team{ {Name: String("octocat")}, } if !cmp.Equal(got, want) { t.Errorf("Repositories.AddTeamRestrictions returned %+v, want %+v", got, want) } const methodName = "AddTeamRestrictions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.AddTeamRestrictions(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.AddTeamRestrictions(ctx, "o", "r", test.branch, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_RemoveTeamRestrictions(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/restrictions/teams"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/restrictions/teams"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") fmt.Fprint(w, `[]`) }) input := []string{"octocat"} ctx := context.Background() got, _, err := client.Repositories.RemoveTeamRestrictions(ctx, "o", "r", test.branch, input) if err != nil { t.Errorf("Repositories.RemoveTeamRestrictions returned error: %v", err) } want := []*Team{} if !cmp.Equal(got, want) { t.Errorf("Repositories.RemoveTeamRestrictions returned %+v, want %+v", got, want) } const methodName = "RemoveTeamRestrictions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.RemoveTeamRestrictions(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.RemoveTeamRestrictions(ctx, "o", "r", test.branch, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_ListUserRestrictions(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/restrictions/users"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/restrictions/users"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") }) ctx := context.Background() _, _, err := client.Repositories.ListUserRestrictions(ctx, "o", "r", test.branch) if err != nil { t.Errorf("Repositories.ListUserRestrictions returned error: %v", err) } const methodName = "ListUserRestrictions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ListUserRestrictions(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ListUserRestrictions(ctx, "o", "r", test.branch) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_ReplaceUserRestrictions(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/restrictions/users"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/restrictions/users"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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.ReplaceUserRestrictions(ctx, "o", "r", test.branch, input) if err != nil { t.Errorf("Repositories.ReplaceUserRestrictions returned error: %v", err) } want := []*User{ {Name: String("octocat")}, } if !cmp.Equal(got, want) { t.Errorf("Repositories.ReplaceUserRestrictions returned %+v, want %+v", got, want) } const methodName = "ReplaceUserRestrictions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.ReplaceUserRestrictions(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.ReplaceUserRestrictions(ctx, "o", "r", test.branch, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_AddUserRestrictions(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/restrictions/users"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/restrictions/users"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, 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.AddUserRestrictions(ctx, "o", "r", test.branch, input) if err != nil { t.Errorf("Repositories.AddUserRestrictions returned error: %v", err) } want := []*User{ {Name: String("octocat")}, } if !cmp.Equal(got, want) { t.Errorf("Repositories.AddUserRestrictions returned %+v, want %+v", got, want) } const methodName = "AddUserRestrictions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.AddUserRestrictions(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.AddUserRestrictions(ctx, "o", "r", test.branch, input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) }) } } func TestRepositoriesService_RemoveUserRestrictions(t *testing.T) { tests := []struct { branch string urlPath string }{ {branch: "b", urlPath: "/repos/o/r/branches/b/protection/restrictions/users"}, {branch: "feat/branch-50%", urlPath: "/repos/o/r/branches/feat/branch-50%/protection/restrictions/users"}, } for _, test := range tests { t.Run(test.branch, func(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc(test.urlPath, func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") fmt.Fprint(w, `[]`) }) input := []string{"octocat"} ctx := context.Background() got, _, err := client.Repositories.RemoveUserRestrictions(ctx, "o", "r", test.branch, input) if err != nil { t.Errorf("Repositories.RemoveUserRestrictions returned error: %v", err) } want := []*User{} if !cmp.Equal(got, want) { t.Errorf("Repositories.RemoveUserRestrictions returned %+v, want %+v", got, want) } const methodName = "RemoveUserRestrictions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Repositories.RemoveUserRestrictions(ctx, "\n", "\n", "\n", input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Repositories.RemoveUserRestrictions(ctx, "o", "r", test.branch, 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", NewName: String("b"), TeamID: []int64{123}} mux.HandleFunc("/repos/o/r/transfer", func(w http.ResponseWriter, r *http.Request) { var v TransferRequest assertNilError(t, 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 assertNilError(t, 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 }) } func TestAdvancedSecurity_Marshal(t *testing.T) { testJSONMarshal(t, &AdvancedSecurity{}, "{}") u := &AdvancedSecurity{ Status: String("status"), } want := `{ "status": "status" }` testJSONMarshal(t, u, want) } func TestAuthorizedActorsOnly_Marshal(t *testing.T) { testJSONMarshal(t, &AuthorizedActorsOnly{}, "{}") u := &AuthorizedActorsOnly{ From: Bool(true), } want := `{ "from" : true }` testJSONMarshal(t, u, want) } func TestDispatchRequestOptions_Marshal(t *testing.T) { testJSONMarshal(t, &DispatchRequestOptions{}, "{}") cp := json.RawMessage(`{"testKey":"testValue"}`) u := &DispatchRequestOptions{ EventType: "test_event_type", ClientPayload: &cp, } want := `{ "event_type": "test_event_type", "client_payload": { "testKey": "testValue" } }` testJSONMarshal(t, u, want) } func TestTransferRequest_Marshal(t *testing.T) { testJSONMarshal(t, &TransferRequest{}, "{}") u := &TransferRequest{ NewOwner: "testOwner", NewName: String("testName"), TeamID: []int64{1, 2}, } want := `{ "new_owner": "testOwner", "new_name": "testName", "team_ids": [1,2] }` testJSONMarshal(t, u, want) } func TestSignaturesProtectedBranch_Marshal(t *testing.T) { testJSONMarshal(t, &SignaturesProtectedBranch{}, "{}") u := &SignaturesProtectedBranch{ URL: String("https://www.testURL.in"), Enabled: Bool(false), } want := `{ "url": "https://www.testURL.in", "enabled": false }` testJSONMarshal(t, u, want) u2 := &SignaturesProtectedBranch{ URL: String("testURL"), Enabled: Bool(true), } want2 := `{ "url": "testURL", "enabled": true }` testJSONMarshal(t, u2, want2) } func TestDismissalRestrictionsRequest_Marshal(t *testing.T) { testJSONMarshal(t, &DismissalRestrictionsRequest{}, "{}") u := &DismissalRestrictionsRequest{ Users: &[]string{"user1", "user2"}, Teams: &[]string{"team1", "team2"}, Apps: &[]string{"app1", "app2"}, } want := `{ "users": ["user1","user2"], "teams": ["team1","team2"], "apps": ["app1","app2"] }` testJSONMarshal(t, u, want) } func TestAdminEnforcement_Marshal(t *testing.T) { testJSONMarshal(t, &AdminEnforcement{}, "{}") u := &AdminEnforcement{ URL: String("https://www.test-url.in"), Enabled: false, } want := `{ "url": "https://www.test-url.in", "enabled": false }` testJSONMarshal(t, u, want) } func TestPullRequestReviewsEnforcementUpdate_Marshal(t *testing.T) { testJSONMarshal(t, &PullRequestReviewsEnforcementUpdate{}, "{}") u := &PullRequestReviewsEnforcementUpdate{ BypassPullRequestAllowancesRequest: &BypassPullRequestAllowancesRequest{ Users: []string{"user1", "user2"}, Teams: []string{"team1", "team2"}, Apps: []string{"app1", "app2"}, }, DismissStaleReviews: Bool(false), RequireCodeOwnerReviews: Bool(true), RequiredApprovingReviewCount: 2, } want := `{ "bypass_pull_request_allowances": { "users": ["user1","user2"], "teams": ["team1","team2"], "apps": ["app1","app2"] }, "dismiss_stale_reviews": false, "require_code_owner_reviews": true, "required_approving_review_count": 2 }` testJSONMarshal(t, u, want) } func TestRequiredStatusCheck_Marshal(t *testing.T) { testJSONMarshal(t, &RequiredStatusCheck{}, "{}") u := &RequiredStatusCheck{ Context: "ctx", AppID: Int64(1), } want := `{ "context": "ctx", "app_id": 1 }` testJSONMarshal(t, u, want) } func TestRepositoryTag_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoryTag{}, "{}") u := &RepositoryTag{ Name: String("v0.1"), Commit: &Commit{ SHA: String("sha"), URL: String("url"), }, ZipballURL: String("zball"), TarballURL: String("tball"), } want := `{ "name": "v0.1", "commit": { "sha": "sha", "url": "url" }, "zipball_url": "zball", "tarball_url": "tball" }` testJSONMarshal(t, u, want) } func TestRepositoriesService_EnablePrivateReporting(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/owner/repo/private-vulnerability-reporting", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Repositories.EnablePrivateReporting(ctx, "owner", "repo") if err != nil { t.Errorf("Repositories.EnablePrivateReporting returned error: %v", err) } const methodName = "EnablePrivateReporting" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.EnablePrivateReporting(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.EnablePrivateReporting(ctx, "owner", "repo") }) } func TestRepositoriesService_DisablePrivateReporting(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/owner/repo/private-vulnerability-reporting", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Repositories.DisablePrivateReporting(ctx, "owner", "repo") if err != nil { t.Errorf("Repositories.DisablePrivateReporting returned error: %v", err) } const methodName = "DisablePrivateReporting" testBadOptions(t, methodName, func() (err error) { _, err = client.Repositories.DisablePrivateReporting(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Repositories.DisablePrivateReporting(ctx, "owner", "repo") }) } go-github-60.0.0/github/repos_traffic.go000066400000000000000000000112401457013574700201340ustar00rootroot00000000000000// 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/rest/metrics/traffic#get-top-referral-sources // //meta:operation GET /repos/{owner}/{repo}/traffic/popular/referrers 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/rest/metrics/traffic#get-top-referral-paths // //meta:operation GET /repos/{owner}/{repo}/traffic/popular/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/rest/metrics/traffic#get-page-views // //meta:operation GET /repos/{owner}/{repo}/traffic/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/rest/metrics/traffic#get-repository-clones // //meta:operation GET /repos/{owner}/{repo}/traffic/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-60.0.0/github/repos_traffic_test.go000066400000000000000000000172561457013574700212100ustar00rootroot00000000000000// 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 }) } func TestTrafficReferrer_Marshal(t *testing.T) { testJSONMarshal(t, &TrafficReferrer{}, "{}") u := &TrafficReferrer{ Referrer: String("referrer"), Count: Int(0), Uniques: Int(0), } want := `{ "referrer" : "referrer", "count" : 0, "uniques" : 0 }` testJSONMarshal(t, u, want) } func TestTrafficViews_Marshal(t *testing.T) { testJSONMarshal(t, &TrafficViews{}, "{}") u := &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(0), Uniques: Int(0), } want := `{ "views": [{ "timestamp": "2016-05-31T16:00:00.000Z", "count": 7, "uniques": 6 }], "count" : 0, "uniques" : 0 }` testJSONMarshal(t, u, want) } func TestTrafficClones_Marshal(t *testing.T) { testJSONMarshal(t, &TrafficClones{}, "{}") u := &TrafficClones{ Clones: []*TrafficData{{ Timestamp: &Timestamp{time.Date(2021, time.October, 29, 16, 0, 0, 0, time.UTC)}, Count: Int(1), Uniques: Int(1), }}, Count: Int(0), Uniques: Int(0), } want := `{ "clones": [{ "timestamp": "2021-10-29T16:00:00.000Z", "count": 1, "uniques": 1 }], "count" : 0, "uniques" : 0 }` testJSONMarshal(t, u, want) } func TestTrafficPath_Marshal(t *testing.T) { testJSONMarshal(t, &TrafficPath{}, "{}") u := &TrafficPath{ Path: String("test/path"), Title: String("test"), Count: Int(2), Uniques: Int(3), } want := `{ "path" : "test/path", "title": "test", "count": 2, "uniques": 3 }` testJSONMarshal(t, u, want) } func TestTrafficData_Marshal(t *testing.T) { testJSONMarshal(t, &TrafficData{}, "{}") u := &TrafficData{ Timestamp: &Timestamp{time.Date(2016, time.May, 31, 16, 0, 0, 0, time.UTC)}, Count: Int(7), Uniques: Int(6), } want := `{ "timestamp": "2016-05-31T16:00:00.000Z", "count": 7, "uniques": 6 }` testJSONMarshal(t, u, want) } func TestTrafficBreakdownOptions_Marshal(t *testing.T) { testJSONMarshal(t, &TrafficBreakdownOptions{}, "{}") u := &TrafficBreakdownOptions{ Per: "day", } want := `{ "per": "day" }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/scim.go000066400000000000000000000212331457013574700162440ustar00rootroot00000000000000// 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" ) // SCIMService provides access to SCIM related functions in the // GitHub API. // // GitHub API docs: https://docs.github.com/rest/scim type SCIMService service // SCIMUserAttributes represents supported SCIM User attributes. // // GitHub API docs: https://docs.github.com/rest/scim#supported-scim-user-attributes type SCIMUserAttributes struct { UserName string `json:"userName"` // Configured by the admin. Could be an email, login, or username. (Required.) Name SCIMUserName `json:"name"` // (Required.) DisplayName *string `json:"displayName,omitempty"` // The name of the user, suitable for display to end-users. (Optional.) Emails []*SCIMUserEmail `json:"emails"` // User emails. (Required.) Schemas []string `json:"schemas,omitempty"` // (Optional.) ExternalID *string `json:"externalId,omitempty"` // (Optional.) Groups []string `json:"groups,omitempty"` // (Optional.) Active *bool `json:"active,omitempty"` // (Optional.) // Only populated as a result of calling ListSCIMProvisionedIdentitiesOptions or GetSCIMProvisioningInfoForUser: ID *string `json:"id,omitempty"` Meta *SCIMMeta `json:"meta,omitempty"` } // SCIMUserName represents SCIM user information. type SCIMUserName struct { GivenName string `json:"givenName"` // The first name of the user. (Required.) FamilyName string `json:"familyName"` // The family name of the user. (Required.) Formatted *string `json:"formatted,omitempty"` // (Optional.) } // SCIMUserEmail represents SCIM user email. type SCIMUserEmail struct { Value string `json:"value"` // (Required.) Primary *bool `json:"primary,omitempty"` // (Optional.) Type *string `json:"type,omitempty"` // (Optional.) } // SCIMMeta represents metadata about the SCIM resource. type SCIMMeta struct { ResourceType *string `json:"resourceType,omitempty"` Created *Timestamp `json:"created,omitempty"` LastModified *Timestamp `json:"lastModified,omitempty"` Location *string `json:"location,omitempty"` } // SCIMProvisionedIdentities represents the result of calling ListSCIMProvisionedIdentities. type SCIMProvisionedIdentities struct { Schemas []string `json:"schemas,omitempty"` TotalResults *int `json:"totalResults,omitempty"` ItemsPerPage *int `json:"itemsPerPage,omitempty"` StartIndex *int `json:"startIndex,omitempty"` Resources []*SCIMUserAttributes `json:"Resources,omitempty"` } // ListSCIMProvisionedIdentitiesOptions represents options for ListSCIMProvisionedIdentities. // // GitHub API docs: https://docs.github.com/rest/scim#list-scim-provisioned-identities--parameters type ListSCIMProvisionedIdentitiesOptions struct { StartIndex *int `url:"startIndex,omitempty"` // Used for pagination: the index of the first result to return. (Optional.) Count *int `url:"count,omitempty"` // Used for pagination: the number of results to return. (Optional.) // Filter results using the equals query parameter operator (eq). // You can filter results that are equal to id, userName, emails, and external_id. // For example, to search for an identity with the userName Octocat, you would use this query: ?filter=userName%20eq%20\"Octocat\". // To filter results for the identity with the email octocat@github.com, you would use this query: ?filter=emails%20eq%20\"octocat@github.com\". // (Optional.) Filter *string `url:"filter,omitempty"` } // ListSCIMProvisionedIdentities lists SCIM provisioned identities. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/scim/scim#list-scim-provisioned-identities // //meta:operation GET /scim/v2/organizations/{org}/Users func (s *SCIMService) ListSCIMProvisionedIdentities(ctx context.Context, org string, opts *ListSCIMProvisionedIdentitiesOptions) (*SCIMProvisionedIdentities, *Response, error) { u := fmt.Sprintf("scim/v2/organizations/%v/Users", 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 } identities := new(SCIMProvisionedIdentities) resp, err := s.client.Do(ctx, req, identities) if err != nil { return nil, resp, err } return identities, resp, nil } // ProvisionAndInviteSCIMUser provisions organization membership for a user, and sends an activation email to the email address. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/scim/scim#provision-and-invite-a-scim-user // //meta:operation POST /scim/v2/organizations/{org}/Users func (s *SCIMService) ProvisionAndInviteSCIMUser(ctx context.Context, org string, opts *SCIMUserAttributes) (*Response, error) { u := fmt.Sprintf("scim/v2/organizations/%v/Users", org) u, err := addOptions(u, opts) if err != nil { return nil, err } req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // GetSCIMProvisioningInfoForUser returns SCIM provisioning information for a user. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/scim/scim#get-scim-provisioning-information-for-a-user // //meta:operation GET /scim/v2/organizations/{org}/Users/{scim_user_id} func (s *SCIMService) GetSCIMProvisioningInfoForUser(ctx context.Context, org, scimUserID string) (*SCIMUserAttributes, *Response, error) { u := fmt.Sprintf("scim/v2/organizations/%v/Users/%v", org, scimUserID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } user := new(SCIMUserAttributes) resp, err := s.client.Do(ctx, req, &user) if err != nil { return nil, resp, err } return user, resp, nil } // UpdateProvisionedOrgMembership updates a provisioned organization membership. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/scim/scim#update-a-provisioned-organization-membership // //meta:operation PUT /scim/v2/organizations/{org}/Users/{scim_user_id} func (s *SCIMService) UpdateProvisionedOrgMembership(ctx context.Context, org, scimUserID string, opts *SCIMUserAttributes) (*Response, error) { u := fmt.Sprintf("scim/v2/organizations/%v/Users/%v", org, scimUserID) u, err := addOptions(u, opts) if err != nil { return nil, err } req, err := s.client.NewRequest("PUT", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // UpdateAttributeForSCIMUserOptions represents options for UpdateAttributeForSCIMUser. // // GitHub API docs: https://docs.github.com/rest/scim#update-an-attribute-for-a-scim-user--parameters type UpdateAttributeForSCIMUserOptions struct { Schemas []string `json:"schemas,omitempty"` // (Optional.) Operations UpdateAttributeForSCIMUserOperations `json:"operations"` // Set of operations to be performed. (Required.) } // UpdateAttributeForSCIMUserOperations represents operations for UpdateAttributeForSCIMUser. type UpdateAttributeForSCIMUserOperations struct { Op string `json:"op"` // (Required.) Path *string `json:"path,omitempty"` // (Optional.) Value json.RawMessage `json:"value,omitempty"` // (Optional.) } // UpdateAttributeForSCIMUser updates an attribute for an SCIM user. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/scim/scim#update-an-attribute-for-a-scim-user // //meta:operation PATCH /scim/v2/organizations/{org}/Users/{scim_user_id} func (s *SCIMService) UpdateAttributeForSCIMUser(ctx context.Context, org, scimUserID string, opts *UpdateAttributeForSCIMUserOptions) (*Response, error) { u := fmt.Sprintf("scim/v2/organizations/%v/Users/%v", org, scimUserID) u, err := addOptions(u, opts) if err != nil { return nil, err } req, err := s.client.NewRequest("PATCH", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // DeleteSCIMUserFromOrg deletes SCIM user from an organization. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/scim/scim#delete-a-scim-user-from-an-organization // //meta:operation DELETE /scim/v2/organizations/{org}/Users/{scim_user_id} func (s *SCIMService) DeleteSCIMUserFromOrg(ctx context.Context, org, scimUserID string) (*Response, error) { u := fmt.Sprintf("scim/v2/organizations/%v/Users/%v", org, scimUserID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/scim_test.go000066400000000000000000000336001457013574700173040ustar00rootroot00000000000000// 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 TestSCIMService_ListSCIMProvisionedIdentities(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/scim/v2/organizations/o/Users", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte(`{ "schemas": [ "urn:ietf:params:scim:api:messages:2.0:ListResponse" ], "totalResults": 1, "itemsPerPage": 1, "startIndex": 1, "Resources": [ { "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "id": "5fc0c238-1112-11e8-8e45-920c87bdbd75", "externalId": "00u1dhhb1fkIGP7RL1d8", "userName": "octocat@github.com", "displayName": "Mona Octocat", "name": { "givenName": "Mona", "familyName": "Octocat", "formatted": "Mona Octocat" }, "emails": [ { "value": "octocat@github.com", "primary": true } ], "active": true, "meta": { "resourceType": "User", "created": "2018-02-13T15:05:24.000-00:00", "lastModified": "2018-02-13T15:05:24.000-00:00", "location": "https://api.github.com/scim/v2/organizations/octo-org/Users/5fc0c238-1112-11e8-8e45-920c87bdbd75" } } ] }`)) }) ctx := context.Background() opts := &ListSCIMProvisionedIdentitiesOptions{} identities, _, err := client.SCIM.ListSCIMProvisionedIdentities(ctx, "o", opts) if err != nil { t.Errorf("SCIM.ListSCIMProvisionedIdentities returned error: %v", err) } date := Timestamp{time.Date(2018, time.February, 13, 15, 5, 24, 0, time.UTC)} want := SCIMProvisionedIdentities{ Schemas: []string{"urn:ietf:params:scim:api:messages:2.0:ListResponse"}, TotalResults: Int(1), ItemsPerPage: Int(1), StartIndex: Int(1), Resources: []*SCIMUserAttributes{ { ID: String("5fc0c238-1112-11e8-8e45-920c87bdbd75"), Meta: &SCIMMeta{ ResourceType: String("User"), Created: &date, LastModified: &date, Location: String("https://api.github.com/scim/v2/organizations/octo-org/Users/5fc0c238-1112-11e8-8e45-920c87bdbd75"), }, UserName: "octocat@github.com", Name: SCIMUserName{ GivenName: "Mona", FamilyName: "Octocat", Formatted: String("Mona Octocat"), }, DisplayName: String("Mona Octocat"), Emails: []*SCIMUserEmail{ { Value: "octocat@github.com", Primary: Bool(true), }, }, Schemas: []string{"urn:ietf:params:scim:schemas:core:2.0:User"}, ExternalID: String("00u1dhhb1fkIGP7RL1d8"), Groups: nil, Active: Bool(true), }, }, } if !cmp.Equal(identities, &want) { diff := cmp.Diff(identities, want) t.Errorf("SCIM.ListSCIMProvisionedIdentities returned %+v, want %+v: diff %+v", identities, want, diff) } const methodName = "ListSCIMProvisionedIdentities" testBadOptions(t, methodName, func() (err error) { _, _, err = client.SCIM.ListSCIMProvisionedIdentities(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { _, r, err := client.SCIM.ListSCIMProvisionedIdentities(ctx, "o", opts) return r, err }) } func TestSCIMService_ProvisionAndInviteSCIMUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/scim/v2/organizations/o/Users", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") w.WriteHeader(http.StatusOK) }) ctx := context.Background() opts := &SCIMUserAttributes{ UserName: "userName", Name: SCIMUserName{ GivenName: "givenName", FamilyName: "familyName", }, Emails: []*SCIMUserEmail{ { Value: "octocat@github.com", }, }, } _, err := client.SCIM.ProvisionAndInviteSCIMUser(ctx, "o", opts) if err != nil { t.Errorf("SCIM.ListSCIMProvisionedIdentities returned error: %v", err) } const methodName = "ProvisionAndInviteSCIMUser" testBadOptions(t, methodName, func() (err error) { _, err = client.SCIM.ProvisionAndInviteSCIMUser(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.SCIM.ProvisionAndInviteSCIMUser(ctx, "o", opts) }) } func TestSCIMService_GetSCIMProvisioningInfoForUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/scim/v2/organizations/o/Users/123", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte(`{ "schemas": [ "urn:ietf:params:scim:schemas:core:2.0:User" ], "id": "edefdfedf-050c-11e7-8d32", "externalId": "a7d0f98382", "userName": "mona.octocat@okta.example.com", "displayName": "Mona Octocat", "name": { "givenName": "Mona", "familyName": "Octocat", "formatted": "Mona Octocat" }, "emails": [ { "value": "mona.octocat@okta.example.com", "primary": true }, { "value": "mona@octocat.github.com" } ], "active": true, "meta": { "resourceType": "User", "created": "2017-03-09T16:11:13-00:00", "lastModified": "2017-03-09T16:11:13-00:00", "location": "https://api.github.com/scim/v2/organizations/octo-org/Users/edefdfedf-050c-11e7-8d32" } }`)) }) ctx := context.Background() user, _, err := client.SCIM.GetSCIMProvisioningInfoForUser(ctx, "o", "123") if err != nil { t.Errorf("SCIM.GetSCIMProvisioningInfoForUser returned error: %v", err) } date := Timestamp{time.Date(2017, time.March, 9, 16, 11, 13, 0, time.UTC)} want := SCIMUserAttributes{ ID: String("edefdfedf-050c-11e7-8d32"), Meta: &SCIMMeta{ ResourceType: String("User"), Created: &date, LastModified: &date, Location: String("https://api.github.com/scim/v2/organizations/octo-org/Users/edefdfedf-050c-11e7-8d32"), }, UserName: "mona.octocat@okta.example.com", Name: SCIMUserName{ GivenName: "Mona", FamilyName: "Octocat", Formatted: String("Mona Octocat"), }, DisplayName: String("Mona Octocat"), Emails: []*SCIMUserEmail{ { Value: "mona.octocat@okta.example.com", Primary: Bool(true), }, { Value: "mona@octocat.github.com", }, }, Schemas: []string{"urn:ietf:params:scim:schemas:core:2.0:User"}, ExternalID: String("a7d0f98382"), Groups: nil, Active: Bool(true), } if !cmp.Equal(user, &want) { diff := cmp.Diff(user, want) t.Errorf("SCIM.ListSCIMProvisionedIdentities returned %+v, want %+v: diff %+v", user, want, diff) } const methodName = "GetSCIMProvisioningInfoForUser" testBadOptions(t, methodName, func() error { _, _, err := client.SCIM.GetSCIMProvisioningInfoForUser(ctx, "\n", "123") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { _, r, err := client.SCIM.GetSCIMProvisioningInfoForUser(ctx, "o", "123") return r, err }) } func TestSCIMService_UpdateProvisionedOrgMembership(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/scim/v2/organizations/o/Users/123", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PUT") w.WriteHeader(http.StatusOK) }) ctx := context.Background() opts := &SCIMUserAttributes{ UserName: "userName", Name: SCIMUserName{ GivenName: "givenName", FamilyName: "familyName", }, Emails: []*SCIMUserEmail{ { Value: "octocat@github.com", }, }, } _, err := client.SCIM.UpdateProvisionedOrgMembership(ctx, "o", "123", opts) if err != nil { t.Errorf("SCIM.UpdateProvisionedOrgMembership returned error: %v", err) } const methodName = "UpdateProvisionedOrgMembership" testBadOptions(t, methodName, func() error { _, err := client.SCIM.UpdateProvisionedOrgMembership(ctx, "\n", "123", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.SCIM.UpdateProvisionedOrgMembership(ctx, "o", "123", opts) }) } func TestSCIMService_UpdateAttributeForSCIMUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/scim/v2/organizations/o/Users/123", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() opts := &UpdateAttributeForSCIMUserOptions{} _, err := client.SCIM.UpdateAttributeForSCIMUser(ctx, "o", "123", opts) if err != nil { t.Errorf("SCIM.UpdateAttributeForSCIMUser returned error: %v", err) } const methodName = "UpdateAttributeForSCIMUser" testBadOptions(t, methodName, func() error { _, err := client.SCIM.UpdateAttributeForSCIMUser(ctx, "\n", "123", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.SCIM.UpdateAttributeForSCIMUser(ctx, "o", "123", opts) }) } func TestSCIMService_DeleteSCIMUserFromOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/scim/v2/organizations/o/Users/123", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.SCIM.DeleteSCIMUserFromOrg(ctx, "o", "123") if err != nil { t.Errorf("SCIM.DeleteSCIMUserFromOrg returned error: %v", err) } const methodName = "DeleteSCIMUserFromOrg" testBadOptions(t, methodName, func() error { _, err := client.SCIM.DeleteSCIMUserFromOrg(ctx, "\n", "") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.SCIM.DeleteSCIMUserFromOrg(ctx, "o", "123") }) } func TestSCIMUserAttributes_Marshal(t *testing.T) { testJSONMarshal(t, &SCIMUserAttributes{}, `{ "userName":"","name":{"givenName":"","familyName":""},"emails":null }`) u := &SCIMUserAttributes{ UserName: "userName1", Name: SCIMUserName{ GivenName: "Name1", FamilyName: "Fname", Formatted: String("formatted name"), }, DisplayName: String("Name"), Emails: []*SCIMUserEmail{ { Value: "value", Primary: Bool(false), Type: String("type"), }, }, Schemas: []string{"schema1"}, ExternalID: String("id"), Groups: []string{"group1"}, Active: Bool(true), } want := `{ "userName": "userName1", "name": { "givenName": "Name1", "familyName": "Fname", "formatted": "formatted name" }, "displayName": "Name", "emails": [{ "value": "value", "primary": false, "type": "type" }], "schemas": ["schema1"], "externalId": "id", "groups": ["group1"], "active": true }` testJSONMarshal(t, u, want) } func TestUpdateAttributeForSCIMUserOperations_Marshal(t *testing.T) { testJSONMarshal(t, &UpdateAttributeForSCIMUserOperations{}, `{}`) u := &UpdateAttributeForSCIMUserOperations{ Op: "TestOp", Path: String("path"), } want := `{ "op": "TestOp", "path": "path" }` testJSONMarshal(t, u, want) } func TestUpdateAttributeForSCIMUserOptions_Marshal(t *testing.T) { testJSONMarshal(t, &UpdateAttributeForSCIMUserOptions{}, `{}`) u := &UpdateAttributeForSCIMUserOptions{ Schemas: []string{"test", "schema"}, Operations: UpdateAttributeForSCIMUserOperations{ Op: "TestOp", Path: String("path"), }, } want := `{ "schemas": ["test", "schema"], "operations": { "op": "TestOp", "path": "path" } }` testJSONMarshal(t, u, want) } func TestListSCIMProvisionedIdentitiesOptions_addOptions(t *testing.T) { testJSONMarshal(t, &ListSCIMProvisionedIdentitiesOptions{}, `{ "StartIndex": null, "Count": null, "Filter": null }`) url := "some/path" testAddURLOptions(t, url, &ListSCIMProvisionedIdentitiesOptions{}, url) testAddURLOptions( t, url, &ListSCIMProvisionedIdentitiesOptions{ StartIndex: Int(1), Count: Int(10), }, fmt.Sprintf("%s?count=10&startIndex=1", url), ) testAddURLOptions( t, url, &ListSCIMProvisionedIdentitiesOptions{ StartIndex: Int(1), Count: Int(10), Filter: String("test"), }, fmt.Sprintf("%s?count=10&filter=test&startIndex=1", url), ) } func TestSCIMUserName_Marshal(t *testing.T) { testJSONMarshal(t, &SCIMUserName{}, `{ "givenName":"","familyName":"" }`) u := &SCIMUserName{ GivenName: "Name1", FamilyName: "Fname", Formatted: String("formatted name"), } want := `{ "givenName": "Name1", "familyName": "Fname", "formatted": "formatted name" }` testJSONMarshal(t, u, want) } func TestSCIMMeta_Marshal(t *testing.T) { testJSONMarshal(t, &SCIMMeta{}, `{}`) u := &SCIMMeta{ ResourceType: String("test"), Location: String("test"), } want := `{ "resourceType": "test", "location": "test" }` testJSONMarshal(t, u, want) } func TestSCIMProvisionedIdentities_Marshal(t *testing.T) { testJSONMarshal(t, &SCIMProvisionedIdentities{}, `{}`) u := &SCIMProvisionedIdentities{ Schemas: []string{"test", "schema"}, TotalResults: Int(1), ItemsPerPage: Int(2), StartIndex: Int(1), Resources: []*SCIMUserAttributes{ { UserName: "SCIM", Name: SCIMUserName{ GivenName: "scim", FamilyName: "test", Formatted: String("SCIM"), }, DisplayName: String("Test SCIM"), Emails: []*SCIMUserEmail{ { Value: "test", Primary: Bool(true), Type: String("test"), }, }, Schemas: []string{"schema1"}, ExternalID: String("id"), Groups: []string{"group1"}, Active: Bool(true), }, }, } want := `{ "schemas": ["test", "schema"], "totalResults": 1, "itemsPerPage": 2, "startIndex": 1, "Resources": [{ "userName": "SCIM", "name": { "givenName": "scim", "familyName": "test", "formatted": "SCIM" }, "displayName": "Test SCIM", "emails": [{ "value": "test", "primary": true, "type": "test" }], "schemas": ["schema1"], "externalId": "id", "groups": ["group1"], "active": true }] }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/search.go000066400000000000000000000310571457013574700165630ustar00rootroot00000000000000// 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" "strings" 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/rest/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/rest/search/search#search-repositories // //meta:operation GET /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) if err != nil { return nil, resp, err } return result, resp, nil } // 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/articles/searching-topics for more // information about search qualifiers. // // GitHub API docs: https://docs.github.com/rest/search/search#search-topics // //meta:operation GET /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) if err != nil { return nil, resp, err } return result, resp, nil } // 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/rest/search/search#search-commits // //meta:operation GET /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) if err != nil { return nil, resp, err } return result, resp, nil } // 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/rest/search/search#search-issues-and-pull-requests // //meta:operation GET /search/issues 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) if err != nil { return nil, resp, err } return result, resp, nil } // 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/rest/search/search#search-users // //meta:operation GET /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) if err != nil { return nil, resp, err } return result, resp, nil } // 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/rest/search/search#search-code // //meta:operation GET /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) if err != nil { return nil, resp, err } return result, resp, nil } // 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/rest/search/search#search-labels // //meta:operation GET /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) if err != nil { return nil, resp, err } return result, resp, nil } // 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 } var acceptHeaders []string switch { case searchType == "commits": // Accept header for search commits preview endpoint // TODO: remove custom Accept header when this API fully launches. acceptHeaders = append(acceptHeaders, mediaTypeCommitSearchPreview) case searchType == "topics": // Accept header for search repositories based on topics preview endpoint // TODO: remove custom Accept header when this API fully launches. acceptHeaders = append(acceptHeaders, mediaTypeTopicsPreview) case searchType == "repositories": // Accept header for search repositories based on topics preview endpoint // TODO: remove custom Accept header when this API fully launches. acceptHeaders = append(acceptHeaders, mediaTypeTopicsPreview) case searchType == "issues": // Accept header for search issues based on reactions preview endpoint // TODO: remove custom Accept header when this API fully launches. acceptHeaders = append(acceptHeaders, mediaTypeReactionsPreview) } // https://docs.github.com/rest/search#search-repositories // Accept header defaults to "application/vnd.github.v3+json" // We change it here to fetch back text-match metadata if opts != nil && opts.TextMatch { acceptHeaders = append(acceptHeaders, "application/vnd.github.v3.text-match+json") } req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) return s.client.Do(ctx, req, result) } go-github-60.0.0/github/search_test.go000066400000000000000000000602741457013574700176250ustar00rootroot00000000000000// 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" "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_RepositoriesTextMatch(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/search/repositories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") textMatchResponse := ` { "total_count": 1, "incomplete_results": false, "items": [ { "name":"gopher1" } ] } ` list := strings.Split(r.Header.Get("Accept"), ",") aMap := make(map[string]struct{}) for _, s := range list { aMap[strings.TrimSpace(s)] = struct{}{} } if _, ok := aMap["application/vnd.github.v3.text-match+json"]; ok { 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.Repositories(ctx, "blah", opts) if err != nil { t.Errorf("Search.Code returned error: %v", err) } wantedRepoResult := &Repository{ 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 := &RepositoriesSearchResult{ Total: Int(1), IncompleteResults: Bool(false), Repositories: []*Repository{wantedRepoResult}, } if !cmp.Equal(result, want) { t.Errorf("Search.Repo returned %+v, want %+v", result, want) } } 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 }) } func TestMatch_Marshal(t *testing.T) { testJSONMarshal(t, &Match{}, "{}") u := &Match{ Text: String("txt"), Indices: []int{1}, } want := `{ "text": "txt", "indices": [1] }` testJSONMarshal(t, u, want) } func TestTextMatch_Marshal(t *testing.T) { testJSONMarshal(t, &TextMatch{}, "{}") u := &TextMatch{ ObjectURL: String("ourl"), ObjectType: String("otype"), Property: String("prop"), Fragment: String("fragment"), Matches: []*Match{ { Text: String("txt"), Indices: []int{1}, }, }, } want := `{ "object_url": "ourl", "object_type": "otype", "property": "prop", "fragment": "fragment", "matches": [{ "text": "txt", "indices": [1] }] }` testJSONMarshal(t, u, want) } func TestTopicResult_Marshal(t *testing.T) { testJSONMarshal(t, &TopicResult{}, "{}") u := &TopicResult{ Name: String("name"), DisplayName: String("displayName"), ShortDescription: String("shortDescription"), Description: String("description"), CreatedBy: String("createdBy"), UpdatedAt: String("2021-10-26"), Featured: Bool(false), Curated: Bool(true), Score: Float64(99.9), } want := `{ "name": "name", "display_name": "displayName", "short_description": "shortDescription", "description": "description", "created_by": "createdBy", "updated_at": "2021-10-26", "featured": false, "curated": true, "score": 99.9 }` testJSONMarshal(t, u, want) } func TestRepositoriesSearchResult_Marshal(t *testing.T) { testJSONMarshal(t, &RepositoriesSearchResult{}, "{}") u := &RepositoriesSearchResult{ Total: Int(0), IncompleteResults: Bool(true), Repositories: []*Repository{{ID: Int64(1)}}, } want := `{ "total_count" : 0, "incomplete_results" : true, "items" : [{"id":1}] }` testJSONMarshal(t, u, want) } func TestCommitsSearchResult_Marshal(t *testing.T) { testJSONMarshal(t, &CommitsSearchResult{}, "{}") c := &CommitsSearchResult{ Total: Int(0), IncompleteResults: Bool(true), Commits: []*CommitResult{{ SHA: String("s"), }}, } want := `{ "total_count" : 0, "incomplete_results" : true, "items" : [{"sha" : "s"}] }` testJSONMarshal(t, c, want) } func TestTopicsSearchResult_Marshal(t *testing.T) { testJSONMarshal(t, &TopicsSearchResult{}, "{}") u := &TopicsSearchResult{ Total: Int(2), IncompleteResults: Bool(false), Topics: []*TopicResult{ { Name: String("t1"), DisplayName: String("tt"), ShortDescription: String("t desc"), Description: String("desc"), CreatedBy: String("mi"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: String("2006-01-02T15:04:05Z"), Featured: Bool(true), Curated: Bool(true), Score: Float64(123), }, }, } want := `{ "total_count" : 2, "incomplete_results" : false, "items" : [ { "name" : "t1", "display_name":"tt", "short_description":"t desc", "description":"desc", "created_by":"mi", "created_at":` + referenceTimeStr + `, "updated_at":"2006-01-02T15:04:05Z", "featured":true, "curated":true, "score":123 } ] }` testJSONMarshal(t, u, want) } func TestLabelResult_Marshal(t *testing.T) { testJSONMarshal(t, &LabelResult{}, "{}") u := &LabelResult{ ID: Int64(11), URL: String("url"), Name: String("label"), Color: String("green"), Default: Bool(true), Description: String("desc"), Score: Float64(123), } want := `{ "id":11, "url":"url", "name":"label", "color":"green", "default":true, "description":"desc", "score":123 }` testJSONMarshal(t, u, want) } func TestSearchOptions_Marshal(t *testing.T) { testJSONMarshal(t, &SearchOptions{}, "{}") u := &SearchOptions{ Sort: "author-date", Order: "asc", TextMatch: false, ListOptions: ListOptions{ Page: int(1), PerPage: int(10), }, } want := `{ "sort": "author-date", "order": "asc", "page": 1, "perPage": 10 }` testJSONMarshal(t, u, want) } func TestIssuesSearchResult_Marshal(t *testing.T) { testJSONMarshal(t, &IssuesSearchResult{}, "{}") u := &IssuesSearchResult{ Total: Int(48), IncompleteResults: Bool(false), Issues: []*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: &Timestamp{referenceTime}, CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{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 := `{ "total_count": 48, "incomplete_results": false, "items": [ { "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) } func TestLabelsSearchResult_Marshal(t *testing.T) { testJSONMarshal(t, &LabelsSearchResult{}, "{}") u := &LabelsSearchResult{ Total: Int(5), IncompleteResults: Bool(false), Labels: []*LabelResult{ { ID: Int64(1), URL: String("https://www.test-url.com"), Name: String("test name"), Color: String("green"), Default: Bool(true), Description: String("testDescription"), Score: Float64(1), }, }, } want := `{ "total_count": 5, "incomplete_results": false, "items": [ { "id": 1, "url": "https://www.test-url.com", "name": "test name", "color": "green", "default": true, "description": "testDescription", "score": 1 } ] }` testJSONMarshal(t, u, want) } func TestCommitResult_Marshal(t *testing.T) { testJSONMarshal(t, &CommitResult{}, "{}") c := &CommitResult{ SHA: String("test"), HTMLURL: String("hurl"), CommentsURL: String("curl"), URL: String("url"), Repository: &Repository{ID: Int64(1)}, Score: Float64(123), Commit: &Commit{SHA: String("test")}, Author: &User{ID: Int64(1)}, Committer: &User{ID: Int64(1)}, Parents: []*Commit{}, } want := `{ "sha": "test", "commit": { "sha": "test" }, "author": { "id": 1 }, "committer": { "id": 1 }, "html_url": "hurl", "url": "url", "comments_url": "curl", "repository": { "id": 1 }, "score": 123 }` testJSONMarshal(t, c, want) } func TestUsersSearchResult_Marshal(t *testing.T) { testJSONMarshal(t, &UsersSearchResult{}, "{}") u := &UsersSearchResult{ Total: Int(2), IncompleteResults: Bool(false), Users: []*User{{ Login: String("loginTest"), ID: Int64(1), NodeID: String("NodeTest"), AvatarURL: String("AvatarURLTest"), HTMLURL: String("Hurl"), GravatarID: String("gravatarIDTest"), Name: String("nameTest"), }}, } want := `{ "total_count": 2, "incomplete_results": false, "items": [ { "login": "loginTest", "id": 1, "node_id": "NodeTest", "avatar_url": "AvatarURLTest", "html_url": "Hurl", "gravatar_id": "gravatarIDTest", "name": "nameTest" } ] }` testJSONMarshal(t, u, want) } func TestCodeSearchResult_Marshal(t *testing.T) { testJSONMarshal(t, &CodeSearchResult{}, "{}") u := &CodeSearchResult{ Total: Int(4), IncompleteResults: Bool(false), CodeResults: []*CodeResult{{Name: String("n")}}, } want := `{ "total_count" : 4, "incomplete_results" : false, "items" : [{"name": "n"}] }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/secret_scanning.go000066400000000000000000000247441457013574700204700ustar00rootroot00000000000000// Copyright 2022 The go-github 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" ) // SecretScanningService handles communication with the secret scanning related // methods of the GitHub API. type SecretScanningService service // SecretScanningAlert represents a GitHub secret scanning alert. type SecretScanningAlert struct { Number *int `json:"number,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` URL *string `json:"url,omitempty"` HTMLURL *string `json:"html_url,omitempty"` LocationsURL *string `json:"locations_url,omitempty"` State *string `json:"state,omitempty"` Resolution *string `json:"resolution,omitempty"` ResolvedAt *Timestamp `json:"resolved_at,omitempty"` ResolvedBy *User `json:"resolved_by,omitempty"` SecretType *string `json:"secret_type,omitempty"` SecretTypeDisplayName *string `json:"secret_type_display_name,omitempty"` Secret *string `json:"secret,omitempty"` Repository *Repository `json:"repository,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` PushProtectionBypassed *bool `json:"push_protection_bypassed,omitempty"` PushProtectionBypassedBy *User `json:"push_protection_bypassed_by,omitempty"` PushProtectionBypassedAt *Timestamp `json:"push_protection_bypassed_at,omitempty"` ResolutionComment *string `json:"resolution_comment,omitempty"` } // SecretScanningAlertLocation represents the location for a secret scanning alert. type SecretScanningAlertLocation struct { Type *string `json:"type,omitempty"` Details *SecretScanningAlertLocationDetails `json:"details,omitempty"` } // SecretScanningAlertLocationDetails represents the location details for a secret scanning alert. type SecretScanningAlertLocationDetails 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"` BlobSHA *string `json:"blob_sha,omitempty"` BlobURL *string `json:"blob_url,omitempty"` CommitSHA *string `json:"commit_sha,omitempty"` CommitURL *string `json:"commit_url,omitempty"` } // SecretScanningAlertListOptions specifies optional parameters to the SecretScanningService.ListAlertsForEnterprise method. type SecretScanningAlertListOptions struct { // State of the secret scanning alerts to list. Set to open or resolved to only list secret scanning alerts in a specific state. State string `url:"state,omitempty"` // A comma-separated list of secret types to return. By default all secret types are returned. SecretType string `url:"secret_type,omitempty"` // A comma-separated list of resolutions. Only secret scanning alerts with one of these resolutions are listed. // Valid resolutions are false_positive, wont_fix, revoked, pattern_edited, pattern_deleted or used_in_tests. Resolution string `url:"resolution,omitempty"` ListCursorOptions // List options can vary on the Enterprise type. // On Enterprise Cloud, Secret Scan alerts support requesting by page number // along with providing a cursor for an "after" param. // See: https://docs.github.com/enterprise-cloud@latest/rest/secret-scanning#list-secret-scanning-alerts-for-an-organization // Whereas on Enterprise Server, pagination is by index. // See: https://docs.github.com/enterprise-server@3.6/rest/secret-scanning#list-secret-scanning-alerts-for-an-organization ListOptions } // SecretScanningAlertUpdateOptions specifies optional parameters to the SecretScanningService.UpdateAlert method. type SecretScanningAlertUpdateOptions struct { // State is required and sets the state of the secret scanning alert. // Can be either "open" or "resolved". // You must provide resolution when you set the state to "resolved". State string `json:"state"` // Required when the state is "resolved" and represents the reason for resolving the alert. // Can be one of: "false_positive", "wont_fix", "revoked", or "used_in_tests". Resolution *string `json:"resolution,omitempty"` } // ListAlertsForEnterprise lists secret scanning alerts for eligible repositories in an enterprise, from newest to oldest. // // To use this endpoint, you must be a member of the enterprise, and you must use an access token with the repo scope or // security_events scope. Alerts are only returned for organizations in the enterprise for which you are an organization owner or a security manager. // // GitHub API docs: https://docs.github.com/rest/secret-scanning/secret-scanning#list-secret-scanning-alerts-for-an-enterprise // //meta:operation GET /enterprises/{enterprise}/secret-scanning/alerts func (s *SecretScanningService) ListAlertsForEnterprise(ctx context.Context, enterprise string, opts *SecretScanningAlertListOptions) ([]*SecretScanningAlert, *Response, error) { u := fmt.Sprintf("enterprises/%v/secret-scanning/alerts", 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 alerts []*SecretScanningAlert resp, err := s.client.Do(ctx, req, &alerts) if err != nil { return nil, resp, err } return alerts, resp, nil } // ListAlertsForOrg lists secret scanning alerts for eligible repositories in an organization, from newest to oldest. // // To use this endpoint, you must be an administrator for the repository or organization, and you must use an access token with // the repo scope or security_events scope. // // GitHub API docs: https://docs.github.com/rest/secret-scanning/secret-scanning#list-secret-scanning-alerts-for-an-organization // //meta:operation GET /orgs/{org}/secret-scanning/alerts func (s *SecretScanningService) ListAlertsForOrg(ctx context.Context, org string, opts *SecretScanningAlertListOptions) ([]*SecretScanningAlert, *Response, error) { u := fmt.Sprintf("orgs/%v/secret-scanning/alerts", 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 alerts []*SecretScanningAlert resp, err := s.client.Do(ctx, req, &alerts) if err != nil { return nil, resp, err } return alerts, resp, nil } // ListAlertsForRepo lists secret scanning alerts for a private repository, from newest to oldest. // // To use this endpoint, you must be an administrator for the repository or organization, and you must use an access token with // the repo scope or security_events scope. // // GitHub API docs: https://docs.github.com/rest/secret-scanning/secret-scanning#list-secret-scanning-alerts-for-a-repository // //meta:operation GET /repos/{owner}/{repo}/secret-scanning/alerts func (s *SecretScanningService) ListAlertsForRepo(ctx context.Context, owner, repo string, opts *SecretScanningAlertListOptions) ([]*SecretScanningAlert, *Response, error) { u := fmt.Sprintf("repos/%v/%v/secret-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 []*SecretScanningAlert resp, err := s.client.Do(ctx, req, &alerts) if err != nil { return nil, resp, err } return alerts, resp, nil } // GetAlert gets a single secret scanning alert detected in a private repository. // // To use this endpoint, you must be an administrator for the repository or organization, and you must use an access token with // the repo scope or security_events scope. // // GitHub API docs: https://docs.github.com/rest/secret-scanning/secret-scanning#get-a-secret-scanning-alert // //meta:operation GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number} func (s *SecretScanningService) GetAlert(ctx context.Context, owner, repo string, number int64) (*SecretScanningAlert, *Response, error) { u := fmt.Sprintf("repos/%v/%v/secret-scanning/alerts/%v", owner, repo, number) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var alert *SecretScanningAlert resp, err := s.client.Do(ctx, req, &alert) if err != nil { return nil, resp, err } return alert, resp, nil } // UpdateAlert updates the status of a secret scanning alert in a private repository. // // To use this endpoint, you must be an administrator for the repository or organization, and you must use an access token with // the repo scope or security_events scope. // // GitHub API docs: https://docs.github.com/rest/secret-scanning/secret-scanning#update-a-secret-scanning-alert // //meta:operation PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number} func (s *SecretScanningService) UpdateAlert(ctx context.Context, owner, repo string, number int64, opts *SecretScanningAlertUpdateOptions) (*SecretScanningAlert, *Response, error) { u := fmt.Sprintf("repos/%v/%v/secret-scanning/alerts/%v", owner, repo, number) req, err := s.client.NewRequest("PATCH", u, opts) if err != nil { return nil, nil, err } var alert *SecretScanningAlert resp, err := s.client.Do(ctx, req, &alert) if err != nil { return nil, resp, err } return alert, resp, nil } // ListLocationsForAlert lists all locations for a given secret scanning alert for a private repository. // // To use this endpoint, you must be an administrator for the repository or organization, and you must use an access token with // the repo scope or security_events scope. // // GitHub API docs: https://docs.github.com/rest/secret-scanning/secret-scanning#list-locations-for-a-secret-scanning-alert // //meta:operation GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations func (s *SecretScanningService) ListLocationsForAlert(ctx context.Context, owner, repo string, number int64, opts *ListOptions) ([]*SecretScanningAlertLocation, *Response, error) { u := fmt.Sprintf("repos/%v/%v/secret-scanning/alerts/%v/locations", 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 locations []*SecretScanningAlertLocation resp, err := s.client.Do(ctx, req, &locations) if err != nil { return nil, resp, err } return locations, resp, nil } go-github-60.0.0/github/secret_scanning_test.go000066400000000000000000000474601457013574700215270ustar00rootroot00000000000000// Copyright 2022 The go-github 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 TestSecretScanningService_ListAlertsForEnterprise(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/enterprises/e/secret-scanning/alerts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"state": "open", "secret_type": "mailchimp_api_key"}) fmt.Fprint(w, `[{ "number": 1, "created_at": "1996-06-20T00:00:00Z", "url": "https://api.github.com/repos/o/r/secret-scanning/alerts/1", "html_url": "https://github.com/o/r/security/secret-scanning/1", "locations_url": "https://api.github.com/repos/o/r/secret-scanning/alerts/1/locations", "state": "open", "resolution": null, "resolved_at": null, "resolved_by": null, "secret_type": "mailchimp_api_key", "secret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-us2", "repository": { "id": 1, "name": "n", "url": "url" } }]`) }) ctx := context.Background() opts := &SecretScanningAlertListOptions{State: "open", SecretType: "mailchimp_api_key"} alerts, _, err := client.SecretScanning.ListAlertsForEnterprise(ctx, "e", opts) if err != nil { t.Errorf("SecretScanning.ListAlertsForEnterprise returned error: %v", err) } date := Timestamp{time.Date(1996, time.June, 20, 00, 00, 00, 0, time.UTC)} want := []*SecretScanningAlert{ { Number: Int(1), CreatedAt: &date, URL: String("https://api.github.com/repos/o/r/secret-scanning/alerts/1"), HTMLURL: String("https://github.com/o/r/security/secret-scanning/1"), LocationsURL: String("https://api.github.com/repos/o/r/secret-scanning/alerts/1/locations"), State: String("open"), Resolution: nil, ResolvedAt: nil, ResolvedBy: nil, SecretType: String("mailchimp_api_key"), Secret: String("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-us2"), Repository: &Repository{ ID: Int64(1), URL: String("url"), Name: String("n"), }, }, } if !cmp.Equal(alerts, want) { t.Errorf("SecretScanning.ListAlertsForEnterprise returned %+v, want %+v", alerts, want) } const methodName = "ListAlertsForEnterprise" testBadOptions(t, methodName, func() (err error) { _, _, err = client.SecretScanning.ListAlertsForEnterprise(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { _, resp, err := client.SecretScanning.ListAlertsForEnterprise(ctx, "e", opts) return resp, err }) } func TestSecretScanningService_ListAlertsForOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/secret-scanning/alerts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"state": "open", "secret_type": "mailchimp_api_key"}) fmt.Fprint(w, `[{ "number": 1, "created_at": "1996-06-20T00:00:00Z", "url": "https://api.github.com/repos/o/r/secret-scanning/alerts/1", "html_url": "https://github.com/o/r/security/secret-scanning/1", "locations_url": "https://api.github.com/repos/o/r/secret-scanning/alerts/1/locations", "state": "open", "resolution": null, "resolved_at": null, "resolved_by": null, "secret_type": "mailchimp_api_key", "secret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-us2" }]`) }) ctx := context.Background() opts := &SecretScanningAlertListOptions{State: "open", SecretType: "mailchimp_api_key"} alerts, _, err := client.SecretScanning.ListAlertsForOrg(ctx, "o", opts) if err != nil { t.Errorf("SecretScanning.ListAlertsForOrg returned error: %v", err) } date := Timestamp{time.Date(1996, time.June, 20, 00, 00, 00, 0, time.UTC)} want := []*SecretScanningAlert{ { Number: Int(1), CreatedAt: &date, URL: String("https://api.github.com/repos/o/r/secret-scanning/alerts/1"), HTMLURL: String("https://github.com/o/r/security/secret-scanning/1"), LocationsURL: String("https://api.github.com/repos/o/r/secret-scanning/alerts/1/locations"), State: String("open"), Resolution: nil, ResolvedAt: nil, ResolvedBy: nil, SecretType: String("mailchimp_api_key"), Secret: String("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-us2"), }, } if !cmp.Equal(alerts, want) { t.Errorf("SecretScanning.ListAlertsForOrg returned %+v, want %+v", alerts, want) } const methodName = "ListAlertsForOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.SecretScanning.ListAlertsForOrg(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { _, resp, err := client.SecretScanning.ListAlertsForOrg(ctx, "o", opts) return resp, err }) } func TestSecretScanningService_ListAlertsForOrgListOptions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/secret-scanning/alerts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"state": "open", "secret_type": "mailchimp_api_key", "per_page": "1", "page": "1"}) fmt.Fprint(w, `[{ "number": 1, "created_at": "1996-06-20T00:00:00Z", "url": "https://api.github.com/repos/o/r/secret-scanning/alerts/1", "html_url": "https://github.com/o/r/security/secret-scanning/1", "locations_url": "https://api.github.com/repos/o/r/secret-scanning/alerts/1/locations", "state": "open", "resolution": null, "resolved_at": null, "resolved_by": null, "secret_type": "mailchimp_api_key", "secret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-us2" }]`) }) ctx := context.Background() // Testing pagination by index opts := &SecretScanningAlertListOptions{State: "open", SecretType: "mailchimp_api_key", ListOptions: ListOptions{Page: 1, PerPage: 1}} alerts, _, err := client.SecretScanning.ListAlertsForOrg(ctx, "o", opts) if err != nil { t.Errorf("SecretScanning.ListAlertsForOrg returned error: %v", err) } date := Timestamp{time.Date(1996, time.June, 20, 00, 00, 00, 0, time.UTC)} want := []*SecretScanningAlert{ { Number: Int(1), CreatedAt: &date, URL: String("https://api.github.com/repos/o/r/secret-scanning/alerts/1"), HTMLURL: String("https://github.com/o/r/security/secret-scanning/1"), LocationsURL: String("https://api.github.com/repos/o/r/secret-scanning/alerts/1/locations"), State: String("open"), Resolution: nil, ResolvedAt: nil, ResolvedBy: nil, SecretType: String("mailchimp_api_key"), Secret: String("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-us2"), }, } if !cmp.Equal(alerts, want) { t.Errorf("SecretScanning.ListAlertsForOrg returned %+v, want %+v", alerts, want) } const methodName = "ListAlertsForOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.SecretScanning.ListAlertsForOrg(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { _, resp, err := client.SecretScanning.ListAlertsForOrg(ctx, "o", opts) return resp, err }) } func TestSecretScanningService_ListAlertsForRepo(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/secret-scanning/alerts", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"state": "open", "secret_type": "mailchimp_api_key"}) fmt.Fprint(w, `[{ "number": 1, "created_at": "1996-06-20T00:00:00Z", "url": "https://api.github.com/repos/o/r/secret-scanning/alerts/1", "html_url": "https://github.com/o/r/security/secret-scanning/1", "locations_url": "https://api.github.com/repos/o/r/secret-scanning/alerts/1/locations", "state": "open", "resolution": null, "resolved_at": null, "resolved_by": null, "secret_type": "mailchimp_api_key", "secret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-us2" }]`) }) ctx := context.Background() opts := &SecretScanningAlertListOptions{State: "open", SecretType: "mailchimp_api_key"} alerts, _, err := client.SecretScanning.ListAlertsForRepo(ctx, "o", "r", opts) if err != nil { t.Errorf("SecretScanning.ListAlertsForRepo returned error: %v", err) } date := Timestamp{time.Date(1996, time.June, 20, 00, 00, 00, 0, time.UTC)} want := []*SecretScanningAlert{ { Number: Int(1), CreatedAt: &date, URL: String("https://api.github.com/repos/o/r/secret-scanning/alerts/1"), HTMLURL: String("https://github.com/o/r/security/secret-scanning/1"), LocationsURL: String("https://api.github.com/repos/o/r/secret-scanning/alerts/1/locations"), State: String("open"), Resolution: nil, ResolvedAt: nil, ResolvedBy: nil, SecretType: String("mailchimp_api_key"), Secret: String("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-us2"), }, } if !cmp.Equal(alerts, want) { t.Errorf("SecretScanning.ListAlertsForRepo returned %+v, want %+v", alerts, want) } const methodName = "ListAlertsForRepo" testBadOptions(t, methodName, func() (err error) { _, _, err = client.SecretScanning.ListAlertsForRepo(ctx, "\n", "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { _, resp, err := client.SecretScanning.ListAlertsForRepo(ctx, "o", "r", opts) return resp, err }) } func TestSecretScanningService_GetAlert(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/secret-scanning/alerts/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "number": 1, "created_at": "1996-06-20T00:00:00Z", "url": "https://api.github.com/repos/o/r/secret-scanning/alerts/1", "html_url": "https://github.com/o/r/security/secret-scanning/1", "locations_url": "https://api.github.com/repos/o/r/secret-scanning/alerts/1/locations", "state": "open", "resolution": null, "resolved_at": null, "resolved_by": null, "secret_type": "mailchimp_api_key", "secret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-us2" }`) }) ctx := context.Background() alert, _, err := client.SecretScanning.GetAlert(ctx, "o", "r", 1) if err != nil { t.Errorf("SecretScanning.GetAlert returned error: %v", err) } date := Timestamp{time.Date(1996, time.June, 20, 00, 00, 00, 0, time.UTC)} want := &SecretScanningAlert{ Number: Int(1), CreatedAt: &date, URL: String("https://api.github.com/repos/o/r/secret-scanning/alerts/1"), HTMLURL: String("https://github.com/o/r/security/secret-scanning/1"), LocationsURL: String("https://api.github.com/repos/o/r/secret-scanning/alerts/1/locations"), State: String("open"), Resolution: nil, ResolvedAt: nil, ResolvedBy: nil, SecretType: String("mailchimp_api_key"), Secret: String("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-us2"), } if !cmp.Equal(alert, want) { t.Errorf("SecretScanning.GetAlert returned %+v, want %+v", alert, want) } const methodName = "GetAlert" testBadOptions(t, methodName, func() (err error) { _, _, err = client.SecretScanning.GetAlert(ctx, "\n", "\n", 0) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { _, resp, err := client.SecretScanning.GetAlert(ctx, "o", "r", 1) return resp, err }) } func TestSecretScanningService_UpdateAlert(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/secret-scanning/alerts/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") v := new(SecretScanningAlertUpdateOptions) assertNilError(t, json.NewDecoder(r.Body).Decode(v)) want := &SecretScanningAlertUpdateOptions{State: "resolved", Resolution: String("used_in_tests")} if !cmp.Equal(v, want) { t.Errorf("Request body = %+v, want %+v", v, want) } fmt.Fprint(w, `{ "number": 1, "created_at": "1996-06-20T00:00:00Z", "url": "https://api.github.com/repos/o/r/secret-scanning/alerts/1", "html_url": "https://github.com/o/r/security/secret-scanning/1", "locations_url": "https://api.github.com/repos/o/r/secret-scanning/alerts/1/locations", "state": "resolved", "resolution": "used_in_tests", "resolved_at": "1996-06-20T00:00:00Z", "resolved_by": null, "secret_type": "mailchimp_api_key", "secret": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-us2" }`) }) ctx := context.Background() opts := &SecretScanningAlertUpdateOptions{State: "resolved", Resolution: String("used_in_tests")} alert, _, err := client.SecretScanning.UpdateAlert(ctx, "o", "r", 1, opts) if err != nil { t.Errorf("SecretScanning.UpdateAlert returned error: %v", err) } date := Timestamp{time.Date(1996, time.June, 20, 00, 00, 00, 0, time.UTC)} want := &SecretScanningAlert{ Number: Int(1), CreatedAt: &date, URL: String("https://api.github.com/repos/o/r/secret-scanning/alerts/1"), HTMLURL: String("https://github.com/o/r/security/secret-scanning/1"), LocationsURL: String("https://api.github.com/repos/o/r/secret-scanning/alerts/1/locations"), State: String("resolved"), Resolution: String("used_in_tests"), ResolvedAt: &date, ResolvedBy: nil, SecretType: String("mailchimp_api_key"), Secret: String("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-us2"), } if !cmp.Equal(alert, want) { t.Errorf("SecretScanning.UpdateAlert returned %+v, want %+v", alert, want) } const methodName = "UpdateAlert" testBadOptions(t, methodName, func() (err error) { _, _, err = client.SecretScanning.UpdateAlert(ctx, "\n", "\n", 1, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { _, resp, err := client.SecretScanning.UpdateAlert(ctx, "o", "r", 1, opts) return resp, err }) } func TestSecretScanningService_ListLocationsForAlert(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/secret-scanning/alerts/1/locations", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"page": "1", "per_page": "100"}) fmt.Fprint(w, `[{ "type": "commit", "details": { "path": "/example/secrets.txt", "start_line": 1, "end_line": 1, "start_column": 1, "end_column": 64, "blob_sha": "af5626b4a114abcb82d63db7c8082c3c4756e51b", "blob_url": "https://api.github.com/repos/o/r/git/blobs/af5626b4a114abcb82d63db7c8082c3c4756e51b", "commit_sha": "f14d7debf9775f957cf4f1e8176da0786431f72b", "commit_url": "https://api.github.com/repos/o/r/git/commits/f14d7debf9775f957cf4f1e8176da0786431f72b" } }]`) }) ctx := context.Background() opts := &ListOptions{Page: 1, PerPage: 100} locations, _, err := client.SecretScanning.ListLocationsForAlert(ctx, "o", "r", 1, opts) if err != nil { t.Errorf("SecretScanning.ListLocationsForAlert returned error: %v", err) } want := []*SecretScanningAlertLocation{ { Type: String("commit"), Details: &SecretScanningAlertLocationDetails{ Path: String("/example/secrets.txt"), Startline: Int(1), EndLine: Int(1), StartColumn: Int(1), EndColumn: Int(64), BlobSHA: String("af5626b4a114abcb82d63db7c8082c3c4756e51b"), BlobURL: String("https://api.github.com/repos/o/r/git/blobs/af5626b4a114abcb82d63db7c8082c3c4756e51b"), CommitSHA: String("f14d7debf9775f957cf4f1e8176da0786431f72b"), CommitURL: String("https://api.github.com/repos/o/r/git/commits/f14d7debf9775f957cf4f1e8176da0786431f72b"), }, }, } if !cmp.Equal(locations, want) { t.Errorf("SecretScanning.ListLocationsForAlert returned %+v, want %+v", locations, want) } const methodName = "ListLocationsForAlert" testBadOptions(t, methodName, func() (err error) { _, _, err = client.SecretScanning.ListLocationsForAlert(ctx, "\n", "\n", 1, opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { _, resp, err := client.SecretScanning.ListLocationsForAlert(ctx, "o", "r", 1, opts) return resp, err }) } func TestSecretScanningAlert_Marshal(t *testing.T) { testJSONMarshal(t, &SecretScanningAlert{}, `{}`) u := &SecretScanningAlert{ Number: Int(1), CreatedAt: &Timestamp{referenceTime}, URL: String("https://api.github.com/teams/2/discussions/3/comments"), HTMLURL: String("https://api.github.com/teams/2/discussions/3/comments"), LocationsURL: String("https://api.github.com/teams/2/discussions/3/comments"), State: String("test_state"), Resolution: String("test_resolution"), ResolvedAt: &Timestamp{referenceTime}, ResolvedBy: &User{ Login: String("test"), ID: Int64(10), NodeID: String("A123"), AvatarURL: String("https://api.github.com/teams/2/discussions/3/comments"), }, SecretType: String("test"), Secret: String("test"), } want := `{ "number": 1, "created_at": ` + referenceTimeStr + `, "url": "https://api.github.com/teams/2/discussions/3/comments", "html_url": "https://api.github.com/teams/2/discussions/3/comments", "locations_url": "https://api.github.com/teams/2/discussions/3/comments", "state": "test_state", "resolution": "test_resolution", "resolved_at": ` + referenceTimeStr + `, "resolved_by": { "login": "test", "id": 10, "node_id": "A123", "avatar_url": "https://api.github.com/teams/2/discussions/3/comments" }, "secret_type": "test", "secret": "test" }` testJSONMarshal(t, u, want) } func TestSecretScanningAlertLocation_Marshal(t *testing.T) { testJSONMarshal(t, &SecretScanningAlertLocation{}, `{}`) u := &SecretScanningAlertLocation{ Type: String("test"), Details: &SecretScanningAlertLocationDetails{ Path: String("test_path"), Startline: Int(10), EndLine: Int(20), StartColumn: Int(30), EndColumn: Int(40), BlobSHA: String("test_sha"), BlobURL: String("https://api.github.com/repos/o/r/git/commits/f14d7debf9775f957cf4f1e8176da0786431f72b"), CommitSHA: String("test_sha"), CommitURL: String("https://api.github.com/repos/o/r/git/commits/f14d7debf9775f957cf4f1e8176da0786431f72b"), }, } want := `{ "type": "test", "details": { "path": "test_path", "start_line": 10, "end_line": 20, "start_column": 30, "end_column": 40, "blob_sha": "test_sha", "blob_url": "https://api.github.com/repos/o/r/git/commits/f14d7debf9775f957cf4f1e8176da0786431f72b", "commit_sha": "test_sha", "commit_url": "https://api.github.com/repos/o/r/git/commits/f14d7debf9775f957cf4f1e8176da0786431f72b" } }` testJSONMarshal(t, u, want) } func TestSecretScanningAlertLocationDetails_Marshal(t *testing.T) { testJSONMarshal(t, &SecretScanningAlertLocationDetails{}, `{}`) u := &SecretScanningAlertLocationDetails{ Path: String("test_path"), Startline: Int(10), EndLine: Int(20), StartColumn: Int(30), EndColumn: Int(40), BlobSHA: String("test_sha"), BlobURL: String("https://api.github.com/repos/o/r/git/commits/f14d7debf9775f957cf4f1e8176da0786431f72b"), CommitSHA: String("test_sha"), CommitURL: String("https://api.github.com/repos/o/r/git/commits/f14d7debf9775f957cf4f1e8176da0786431f72b"), } want := `{ "path": "test_path", "start_line": 10, "end_line": 20, "start_column": 30, "end_column": 40, "blob_sha": "test_sha", "blob_url": "https://api.github.com/repos/o/r/git/commits/f14d7debf9775f957cf4f1e8176da0786431f72b", "commit_sha": "test_sha", "commit_url": "https://api.github.com/repos/o/r/git/commits/f14d7debf9775f957cf4f1e8176da0786431f72b" }` testJSONMarshal(t, u, want) } func TestSecretScanningAlertUpdateOptions_Marshal(t *testing.T) { testJSONMarshal(t, &SecretScanningAlertUpdateOptions{}, `{}`) u := &SecretScanningAlertUpdateOptions{ State: "open", Resolution: String("false_positive"), } want := `{ "state": "open", "resolution": "false_positive" }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/security_advisories.go000066400000000000000000000247551457013574700214240ustar00rootroot00000000000000// Copyright 2023 The go-github 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" ) type SecurityAdvisoriesService service // SecurityAdvisorySubmission represents the Security Advisory Submission. type SecurityAdvisorySubmission struct { // Accepted represents whether a private vulnerability report was accepted by the repository's administrators. Accepted *bool `json:"accepted,omitempty"` } // RepoAdvisoryCredit represents the credit object for a repository Security Advisory. type RepoAdvisoryCredit struct { Login *string `json:"login,omitempty"` Type *string `json:"type,omitempty"` } // RepoAdvisoryCreditDetailed represents a credit given to a user for a repository Security Advisory. type RepoAdvisoryCreditDetailed struct { User *User `json:"user,omitempty"` Type *string `json:"type,omitempty"` State *string `json:"state,omitempty"` } // ListRepositorySecurityAdvisoriesOptions specifies the optional parameters to list the repository security advisories. type ListRepositorySecurityAdvisoriesOptions struct { ListCursorOptions // Direction in which to sort advisories. Possible values are: asc, desc. // Default is "asc". Direction string `url:"direction,omitempty"` // Sort specifies how to sort advisories. Possible values are: created, updated, // and published. Default value is "created". Sort string `url:"sort,omitempty"` // State filters advisories based on their state. Possible values are: triage, draft, published, closed. State string `url:"state,omitempty"` } // ListGlobalSecurityAdvisoriesOptions specifies the optional parameters to list the global security advisories. type ListGlobalSecurityAdvisoriesOptions struct { ListCursorOptions // If specified, only advisories with this GHSA (GitHub Security Advisory) identifier will be returned. GHSAID *string `url:"ghsa_id,omitempty"` // If specified, only advisories of this type will be returned. // By default, a request with no other parameters defined will only return reviewed advisories that are not malware. // Default: reviewed // Can be one of: reviewed, malware, unreviewed Type *string `url:"type,omitempty"` // If specified, only advisories with this CVE (Common Vulnerabilities and Exposures) identifier will be returned. CVEID *string `url:"cve_id,omitempty"` // If specified, only advisories for these ecosystems will be returned. // Can be one of: actions, composer, erlang, go, maven, npm, nuget, other, pip, pub, rubygems, rust Ecosystem *string `url:"ecosystem,omitempty"` // If specified, only advisories with these severities will be returned. // Can be one of: unknown, low, medium, high, critical Severity *string `url:"severity,omitempty"` // If specified, only advisories with these Common Weakness Enumerations (CWEs) will be returned. // Example: cwes=79,284,22 or cwes[]=79&cwes[]=284&cwes[]=22 CWEs []string `url:"cwes,omitempty"` // Whether to only return advisories that have been withdrawn. IsWithdrawn *bool `url:"is_withdrawn,omitempty"` // If specified, only return advisories that affect any of package or package@version. // A maximum of 1000 packages can be specified. If the query parameter causes // the URL to exceed the maximum URL length supported by your client, you must specify fewer packages. // Example: affects=package1,package2@1.0.0,package3@^2.0.0 or affects[]=package1&affects[]=package2@1.0.0 Affects *string `url:"affects,omitempty"` // If specified, only return advisories that were published on a date or date range. Published *string `url:"published,omitempty"` // If specified, only return advisories that were updated on a date or date range. Updated *string `url:"updated,omitempty"` // If specified, only show advisories that were updated or published on a date or date range. Modified *string `url:"modified,omitempty"` } // GlobalSecurityAdvisory represents the global security advisory object response. type GlobalSecurityAdvisory struct { SecurityAdvisory ID *int64 `json:"id,omitempty"` RepositoryAdvisoryURL *string `json:"repository_advisory_url,omitempty"` Type *string `json:"type,omitempty"` SourceCodeLocation *string `json:"source_code_location,omitempty"` References []string `json:"references,omitempty"` Vulnerabilities []*GlobalSecurityVulnerability `json:"vulnerabilities,omitempty"` GithubReviewedAt *Timestamp `json:"github_reviewed_at,omitempty"` NVDPublishedAt *Timestamp `json:"nvd_published_at,omitempty"` Credits []*Credit `json:"credits,omitempty"` } // GlobalSecurityVulnerability represents a vulnerability for a global security advisory. type GlobalSecurityVulnerability struct { Package *VulnerabilityPackage `json:"package,omitempty"` FirstPatchedVersion *string `json:"first_patched_version,omitempty"` VulnerableVersionRange *string `json:"vulnerable_version_range,omitempty"` VulnerableFunctions []string `json:"vulnerable_functions,omitempty"` } // Credit represents the credit object for a global security advisory. type Credit struct { User *User `json:"user,omitempty"` Type *string `json:"type,omitempty"` } // RequestCVE requests a Common Vulnerabilities and Exposures (CVE) for a repository security advisory. // The ghsaID is the GitHub Security Advisory identifier of the advisory. // // GitHub API docs: https://docs.github.com/rest/security-advisories/repository-advisories#request-a-cve-for-a-repository-security-advisory // //meta:operation POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve func (s *SecurityAdvisoriesService) RequestCVE(ctx context.Context, owner, repo, ghsaID string) (*Response, error) { url := fmt.Sprintf("repos/%v/%v/security-advisories/%v/cve", owner, repo, ghsaID) req, err := s.client.NewRequest("POST", url, nil) if err != nil { return nil, err } resp, err := s.client.Do(ctx, req, nil) if err != nil { if _, ok := err.(*AcceptedError); ok { return resp, nil } return resp, err } return resp, nil } // CreateTemporaryPrivateFork creates a temporary private fork to collaborate on fixing a security vulnerability in your repository. // The ghsaID is the GitHub Security Advisory identifier of the advisory. // // GitHub API docs: https://docs.github.com/rest/security-advisories/repository-advisories#create-a-temporary-private-fork // //meta:operation POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks func (s *SecurityAdvisoriesService) CreateTemporaryPrivateFork(ctx context.Context, owner, repo, ghsaID string) (*Repository, *Response, error) { url := fmt.Sprintf("repos/%v/%v/security-advisories/%v/forks", owner, repo, ghsaID) req, err := s.client.NewRequest("POST", url, nil) if err != nil { return nil, nil, err } fork := new(Repository) resp, err := s.client.Do(ctx, req, fork) if err != nil { 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 } // ListRepositorySecurityAdvisoriesForOrg lists the repository security advisories for an organization. // // GitHub API docs: https://docs.github.com/rest/security-advisories/repository-advisories#list-repository-security-advisories-for-an-organization // //meta:operation GET /orgs/{org}/security-advisories func (s *SecurityAdvisoriesService) ListRepositorySecurityAdvisoriesForOrg(ctx context.Context, org string, opt *ListRepositorySecurityAdvisoriesOptions) ([]*SecurityAdvisory, *Response, error) { url := fmt.Sprintf("orgs/%v/security-advisories", org) url, err := addOptions(url, opt) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } var advisories []*SecurityAdvisory resp, err := s.client.Do(ctx, req, &advisories) if err != nil { return nil, resp, err } return advisories, resp, nil } // ListRepositorySecurityAdvisories lists the security advisories in a repository. // // GitHub API docs: https://docs.github.com/rest/security-advisories/repository-advisories#list-repository-security-advisories // //meta:operation GET /repos/{owner}/{repo}/security-advisories func (s *SecurityAdvisoriesService) ListRepositorySecurityAdvisories(ctx context.Context, owner, repo string, opt *ListRepositorySecurityAdvisoriesOptions) ([]*SecurityAdvisory, *Response, error) { url := fmt.Sprintf("repos/%v/%v/security-advisories", owner, repo) url, err := addOptions(url, opt) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } var advisories []*SecurityAdvisory resp, err := s.client.Do(ctx, req, &advisories) if err != nil { return nil, resp, err } return advisories, resp, nil } // ListGlobalSecurityAdvisories lists all global security advisories. // // GitHub API docs: https://docs.github.com/rest/security-advisories/global-advisories#list-global-security-advisories // //meta:operation GET /advisories func (s *SecurityAdvisoriesService) ListGlobalSecurityAdvisories(ctx context.Context, opts *ListGlobalSecurityAdvisoriesOptions) ([]*GlobalSecurityAdvisory, *Response, error) { url := "advisories" url, err := addOptions(url, opts) if err != nil { return nil, nil, err } req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } var advisories []*GlobalSecurityAdvisory resp, err := s.client.Do(ctx, req, &advisories) if err != nil { return nil, resp, err } return advisories, resp, nil } // GetGlobalSecurityAdvisories gets a global security advisory using its GitHub Security Advisory (GHSA) identifier. // // GitHub API docs: https://docs.github.com/rest/security-advisories/global-advisories#get-a-global-security-advisory // //meta:operation GET /advisories/{ghsa_id} func (s *SecurityAdvisoriesService) GetGlobalSecurityAdvisories(ctx context.Context, ghsaID string) (*GlobalSecurityAdvisory, *Response, error) { url := fmt.Sprintf("advisories/%s", ghsaID) req, err := s.client.NewRequest("GET", url, nil) if err != nil { return nil, nil, err } var advisory *GlobalSecurityAdvisory resp, err := s.client.Do(ctx, req, &advisory) if err != nil { return nil, resp, err } return advisory, resp, nil } go-github-60.0.0/github/security_advisories_test.go000066400000000000000000001762161457013574700224630ustar00rootroot00000000000000// Copyright 2023 The go-github 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 TestSecurityAdvisoriesService_RequestCVE(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/security-advisories/ghsa_id_ok/cve", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") w.WriteHeader(http.StatusOK) }) mux.HandleFunc("/repos/o/r/security-advisories/ghsa_id_accepted/cve", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") w.WriteHeader(http.StatusAccepted) }) ctx := context.Background() _, err := client.SecurityAdvisories.RequestCVE(ctx, "o", "r", "ghsa_id_ok") if err != nil { t.Errorf("SecurityAdvisoriesService.RequestCVE returned error: %v", err) } _, err = client.SecurityAdvisories.RequestCVE(ctx, "o", "r", "ghsa_id_accepted") if err != nil { t.Errorf("SecurityAdvisoriesService.RequestCVE returned error: %v", err) } const methodName = "RequestCVE" testBadOptions(t, methodName, func() (err error) { _, err = client.SecurityAdvisories.RequestCVE(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { resp, err := client.SecurityAdvisories.RequestCVE(ctx, "o", "r", "ghsa_id") if err == nil { t.Errorf("testNewRequestAndDoFailure %v should have return err", methodName) } return resp, err }) } func TestSecurityAdvisoriesService_CreateTemporaryPrivateFork(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/security-advisories/ghsa_id/forks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") fmt.Fprint(w, `{ "id": 1, "node_id": "R_kgDPP3c6pQ", "owner": { "login": "owner", "id": 2, "node_id": "MDQ6VXFGcjYyMjcyMTQw", "avatar_url": "https://avatars.githubusercontent.com/u/111111?v=4", "html_url": "https://github.com/xxxxx", "gravatar_id": "", "type": "User", "site_admin": false, "url": "https://api.github.com/users/owner", "events_url": "https://api.github.com/users/owner/events{/privacy}", "following_url": "https://api.github.com/users/owner/following{/other_user}", "followers_url": "https://api.github.com/users/owner/followers", "gists_url": "https://api.github.com/users/owner/gists{/gist_id}", "organizations_url": "https://api.github.com/users/owner/orgs", "received_events_url": "https://api.github.com/users/owner/received_events", "repos_url": "https://api.github.com/users/owner/repos", "starred_url": "https://api.github.com/users/owner/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/owner/subscriptions" }, "name": "repo-ghsa-xxxx-xxxx-xxxx", "full_name": "owner/repo-ghsa-xxxx-xxxx-xxxx", "default_branch": "master", "created_at": "2023-12-08T17:22:41Z", "pushed_at": "2023-12-03T11:27:08Z", "updated_at": "2023-12-08T17:22:42Z", "html_url": "https://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx", "clone_url": "https://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx.git", "git_url": "git://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx.git", "ssh_url": "git@github.com:owner/repo-ghsa-xxxx-xxxx-xxxx.git", "svn_url": "https://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx", "fork": false, "forks_count": 0, "network_count": 0, "open_issues_count": 0, "open_issues": 0, "stargazers_count": 0, "subscribers_count": 0, "watchers_count": 0, "watchers": 0, "size": 0, "permissions": { "admin": true, "maintain": true, "pull": true, "push": true, "triage": true }, "allow_forking": true, "web_commit_signoff_required": false, "archived": false, "disabled": false, "private": true, "has_issues": false, "has_wiki": false, "has_pages": false, "has_projects": false, "has_downloads": false, "has_discussions": false, "is_template": false, "url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx", "archive_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/{archive_format}{/ref}", "assignees_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/assignees{/user}", "blobs_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/blobs{/sha}", "branches_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/branches{/branch}", "collaborators_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/collaborators{/collaborator}", "comments_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/comments{/number}", "commits_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/commits{/sha}", "compare_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/compare/{base}...{head}", "contents_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/contents/{+path}", "contributors_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/contributors", "deployments_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/deployments", "downloads_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/downloads", "events_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/events", "forks_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/forks", "git_commits_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/commits{/sha}", "git_refs_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/refs{/sha}", "git_tags_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/tags{/sha}", "hooks_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/hooks", "issue_comment_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/issues/comments{/number}", "issue_events_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/issues/events{/number}", "issues_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/issues{/number}", "keys_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/keys{/key_id}", "labels_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/labels{/name}", "languages_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/languages", "merges_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/merges", "milestones_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/milestones{/number}", "notifications_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/notifications{?since,all,participating}", "pulls_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/pulls{/number}", "releases_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/releases{/id}", "stargazers_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/stargazers", "statuses_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/statuses/{sha}", "subscribers_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/subscribers", "subscription_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/subscription", "tags_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/tags", "teams_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/teams", "visibility": "private" }`) }) ctx := context.Background() fork, _, err := client.SecurityAdvisories.CreateTemporaryPrivateFork(ctx, "o", "r", "ghsa_id") if err != nil { t.Errorf("SecurityAdvisoriesService.CreateTemporaryPrivateFork returned error: %v", err) } want := &Repository{ ID: Int64(1), NodeID: String("R_kgDPP3c6pQ"), Owner: &User{ Login: String("owner"), ID: Int64(2), NodeID: String("MDQ6VXFGcjYyMjcyMTQw"), AvatarURL: String("https://avatars.githubusercontent.com/u/111111?v=4"), HTMLURL: String("https://github.com/xxxxx"), GravatarID: String(""), Type: String("User"), SiteAdmin: Bool(false), URL: String("https://api.github.com/users/owner"), EventsURL: String("https://api.github.com/users/owner/events{/privacy}"), FollowingURL: String("https://api.github.com/users/owner/following{/other_user}"), FollowersURL: String("https://api.github.com/users/owner/followers"), GistsURL: String("https://api.github.com/users/owner/gists{/gist_id}"), OrganizationsURL: String("https://api.github.com/users/owner/orgs"), ReceivedEventsURL: String("https://api.github.com/users/owner/received_events"), ReposURL: String("https://api.github.com/users/owner/repos"), StarredURL: String("https://api.github.com/users/owner/starred{/owner}{/repo}"), SubscriptionsURL: String("https://api.github.com/users/owner/subscriptions"), }, Name: String("repo-ghsa-xxxx-xxxx-xxxx"), FullName: String("owner/repo-ghsa-xxxx-xxxx-xxxx"), DefaultBranch: String("master"), CreatedAt: &Timestamp{time.Date(2023, time.December, 8, 17, 22, 41, 0, time.UTC)}, PushedAt: &Timestamp{time.Date(2023, time.December, 3, 11, 27, 8, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2023, time.December, 8, 17, 22, 42, 0, time.UTC)}, HTMLURL: String("https://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx"), CloneURL: String("https://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx.git"), GitURL: String("git://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx.git"), SSHURL: String("git@github.com:owner/repo-ghsa-xxxx-xxxx-xxxx.git"), SVNURL: String("https://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx"), 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), Permissions: map[string]bool{ "admin": true, "maintain": true, "pull": true, "push": true, "triage": true, }, AllowForking: Bool(true), WebCommitSignoffRequired: Bool(false), Archived: Bool(false), Disabled: Bool(false), Private: Bool(true), HasIssues: Bool(false), HasWiki: Bool(false), HasPages: Bool(false), HasProjects: Bool(false), HasDownloads: Bool(false), HasDiscussions: Bool(false), IsTemplate: Bool(false), URL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx"), ArchiveURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/{archive_format}{/ref}"), AssigneesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/assignees{/user}"), BlobsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/blobs{/sha}"), BranchesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/branches{/branch}"), CollaboratorsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/collaborators{/collaborator}"), CommentsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/comments{/number}"), CommitsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/commits{/sha}"), CompareURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/compare/{base}...{head}"), ContentsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/contents/{+path}"), ContributorsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/contributors"), DeploymentsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/deployments"), DownloadsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/downloads"), EventsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/events"), ForksURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/forks"), GitCommitsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/commits{/sha}"), GitRefsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/refs{/sha}"), GitTagsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/tags{/sha}"), HooksURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/hooks"), IssueCommentURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/issues/comments{/number}"), IssueEventsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/issues/events{/number}"), IssuesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/issues{/number}"), KeysURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/keys{/key_id}"), LabelsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/labels{/name}"), LanguagesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/languages"), MergesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/merges"), MilestonesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/milestones{/number}"), NotificationsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/notifications{?since,all,participating}"), PullsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/pulls{/number}"), ReleasesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/releases{/id}"), StargazersURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/stargazers"), StatusesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/statuses/{sha}"), SubscribersURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/subscribers"), SubscriptionURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/subscription"), TagsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/tags"), TeamsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/teams"), Visibility: String("private"), } if !cmp.Equal(fork, want) { t.Errorf("SecurityAdvisoriesService.CreateTemporaryPrivateFork returned %+v, want %+v", fork, want) } const methodName = "CreateTemporaryPrivateFork" testBadOptions(t, methodName, func() (err error) { _, _, err = client.SecurityAdvisories.CreateTemporaryPrivateFork(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.SecurityAdvisories.CreateTemporaryPrivateFork(ctx, "o", "r", "ghsa_id") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestSecurityAdvisoriesService_CreateTemporaryPrivateFork_deferred(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/security-advisories/ghsa_id/forks", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") w.WriteHeader(http.StatusAccepted) fmt.Fprint(w, `{ "id": 1, "node_id": "R_kgDPP3c6pQ", "owner": { "login": "owner", "id": 2, "node_id": "MDQ6VXFGcjYyMjcyMTQw", "avatar_url": "https://avatars.githubusercontent.com/u/111111?v=4", "html_url": "https://github.com/xxxxx", "gravatar_id": "", "type": "User", "site_admin": false, "url": "https://api.github.com/users/owner", "events_url": "https://api.github.com/users/owner/events{/privacy}", "following_url": "https://api.github.com/users/owner/following{/other_user}", "followers_url": "https://api.github.com/users/owner/followers", "gists_url": "https://api.github.com/users/owner/gists{/gist_id}", "organizations_url": "https://api.github.com/users/owner/orgs", "received_events_url": "https://api.github.com/users/owner/received_events", "repos_url": "https://api.github.com/users/owner/repos", "starred_url": "https://api.github.com/users/owner/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/owner/subscriptions" }, "name": "repo-ghsa-xxxx-xxxx-xxxx", "full_name": "owner/repo-ghsa-xxxx-xxxx-xxxx", "default_branch": "master", "created_at": "2023-12-08T17:22:41Z", "pushed_at": "2023-12-03T11:27:08Z", "updated_at": "2023-12-08T17:22:42Z", "html_url": "https://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx", "clone_url": "https://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx.git", "git_url": "git://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx.git", "ssh_url": "git@github.com:owner/repo-ghsa-xxxx-xxxx-xxxx.git", "svn_url": "https://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx", "fork": false, "forks_count": 0, "network_count": 0, "open_issues_count": 0, "open_issues": 0, "stargazers_count": 0, "subscribers_count": 0, "watchers_count": 0, "watchers": 0, "size": 0, "permissions": { "admin": true, "maintain": true, "pull": true, "push": true, "triage": true }, "allow_forking": true, "web_commit_signoff_required": false, "archived": false, "disabled": false, "private": true, "has_issues": false, "has_wiki": false, "has_pages": false, "has_projects": false, "has_downloads": false, "has_discussions": false, "is_template": false, "url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx", "archive_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/{archive_format}{/ref}", "assignees_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/assignees{/user}", "blobs_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/blobs{/sha}", "branches_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/branches{/branch}", "collaborators_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/collaborators{/collaborator}", "comments_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/comments{/number}", "commits_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/commits{/sha}", "compare_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/compare/{base}...{head}", "contents_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/contents/{+path}", "contributors_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/contributors", "deployments_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/deployments", "downloads_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/downloads", "events_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/events", "forks_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/forks", "git_commits_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/commits{/sha}", "git_refs_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/refs{/sha}", "git_tags_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/tags{/sha}", "hooks_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/hooks", "issue_comment_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/issues/comments{/number}", "issue_events_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/issues/events{/number}", "issues_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/issues{/number}", "keys_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/keys{/key_id}", "labels_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/labels{/name}", "languages_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/languages", "merges_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/merges", "milestones_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/milestones{/number}", "notifications_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/notifications{?since,all,participating}", "pulls_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/pulls{/number}", "releases_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/releases{/id}", "stargazers_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/stargazers", "statuses_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/statuses/{sha}", "subscribers_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/subscribers", "subscription_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/subscription", "tags_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/tags", "teams_url": "https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/teams", "visibility": "private" }`) }) ctx := context.Background() fork, _, err := client.SecurityAdvisories.CreateTemporaryPrivateFork(ctx, "o", "r", "ghsa_id") if _, ok := err.(*AcceptedError); !ok { t.Errorf("SecurityAdvisoriesService.CreateTemporaryPrivateFork returned error: %v (want AcceptedError)", err) } want := &Repository{ ID: Int64(1), NodeID: String("R_kgDPP3c6pQ"), Owner: &User{ Login: String("owner"), ID: Int64(2), NodeID: String("MDQ6VXFGcjYyMjcyMTQw"), AvatarURL: String("https://avatars.githubusercontent.com/u/111111?v=4"), HTMLURL: String("https://github.com/xxxxx"), GravatarID: String(""), Type: String("User"), SiteAdmin: Bool(false), URL: String("https://api.github.com/users/owner"), EventsURL: String("https://api.github.com/users/owner/events{/privacy}"), FollowingURL: String("https://api.github.com/users/owner/following{/other_user}"), FollowersURL: String("https://api.github.com/users/owner/followers"), GistsURL: String("https://api.github.com/users/owner/gists{/gist_id}"), OrganizationsURL: String("https://api.github.com/users/owner/orgs"), ReceivedEventsURL: String("https://api.github.com/users/owner/received_events"), ReposURL: String("https://api.github.com/users/owner/repos"), StarredURL: String("https://api.github.com/users/owner/starred{/owner}{/repo}"), SubscriptionsURL: String("https://api.github.com/users/owner/subscriptions"), }, Name: String("repo-ghsa-xxxx-xxxx-xxxx"), FullName: String("owner/repo-ghsa-xxxx-xxxx-xxxx"), DefaultBranch: String("master"), CreatedAt: &Timestamp{time.Date(2023, time.December, 8, 17, 22, 41, 0, time.UTC)}, PushedAt: &Timestamp{time.Date(2023, time.December, 3, 11, 27, 8, 0, time.UTC)}, UpdatedAt: &Timestamp{time.Date(2023, time.December, 8, 17, 22, 42, 0, time.UTC)}, HTMLURL: String("https://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx"), CloneURL: String("https://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx.git"), GitURL: String("git://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx.git"), SSHURL: String("git@github.com:owner/repo-ghsa-xxxx-xxxx-xxxx.git"), SVNURL: String("https://github.com/owner/repo-ghsa-xxxx-xxxx-xxxx"), 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), Permissions: map[string]bool{ "admin": true, "maintain": true, "pull": true, "push": true, "triage": true, }, AllowForking: Bool(true), WebCommitSignoffRequired: Bool(false), Archived: Bool(false), Disabled: Bool(false), Private: Bool(true), HasIssues: Bool(false), HasWiki: Bool(false), HasPages: Bool(false), HasProjects: Bool(false), HasDownloads: Bool(false), HasDiscussions: Bool(false), IsTemplate: Bool(false), URL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx"), ArchiveURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/{archive_format}{/ref}"), AssigneesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/assignees{/user}"), BlobsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/blobs{/sha}"), BranchesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/branches{/branch}"), CollaboratorsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/collaborators{/collaborator}"), CommentsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/comments{/number}"), CommitsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/commits{/sha}"), CompareURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/compare/{base}...{head}"), ContentsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/contents/{+path}"), ContributorsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/contributors"), DeploymentsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/deployments"), DownloadsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/downloads"), EventsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/events"), ForksURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/forks"), GitCommitsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/commits{/sha}"), GitRefsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/refs{/sha}"), GitTagsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/git/tags{/sha}"), HooksURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/hooks"), IssueCommentURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/issues/comments{/number}"), IssueEventsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/issues/events{/number}"), IssuesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/issues{/number}"), KeysURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/keys{/key_id}"), LabelsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/labels{/name}"), LanguagesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/languages"), MergesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/merges"), MilestonesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/milestones{/number}"), NotificationsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/notifications{?since,all,participating}"), PullsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/pulls{/number}"), ReleasesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/releases{/id}"), StargazersURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/stargazers"), StatusesURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/statuses/{sha}"), SubscribersURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/subscribers"), SubscriptionURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/subscription"), TagsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/tags"), TeamsURL: String("https://api.github.com/repos/owner/repo-ghsa-xxxx-xxxx-xxxx/teams"), Visibility: String("private"), } if !cmp.Equal(fork, want) { t.Errorf("SecurityAdvisoriesService.CreateTemporaryPrivateFork returned %+v, want %+v", fork, want) } } func TestSecurityAdvisoriesService_CreateTemporaryPrivateFork_invalidOwner(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.SecurityAdvisories.CreateTemporaryPrivateFork(ctx, "%", "r", "ghsa_id") testURLParseError(t, err) } func TestSecurityAdvisoriesService_ListRepositorySecurityAdvisoriesForOrg_BadRequest(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/security-advisories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Error(w, "Bad Request", 400) }) ctx := context.Background() advisories, resp, err := client.SecurityAdvisories.ListRepositorySecurityAdvisoriesForOrg(ctx, "o", nil) if err == nil { t.Errorf("Expected HTTP 400 response") } if got, want := resp.Response.StatusCode, http.StatusBadRequest; got != want { t.Errorf("ListRepositorySecurityAdvisoriesForOrg return status %d, want %d", got, want) } if advisories != nil { t.Errorf("ListRepositorySecurityAdvisoriesForOrg return %+v, want nil", advisories) } } func TestSecurityAdvisoriesService_ListRepositorySecurityAdvisoriesForOrg_NotFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/security-advisories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") query := r.URL.Query() if query.Get("state") != "draft" { t.Errorf("ListRepositorySecurityAdvisoriesForOrg returned %+v, want %+v", query.Get("state"), "draft") } http.NotFound(w, r) }) ctx := context.Background() advisories, resp, err := client.SecurityAdvisories.ListRepositorySecurityAdvisoriesForOrg(ctx, "o", &ListRepositorySecurityAdvisoriesOptions{ State: "draft", }) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("ListRepositorySecurityAdvisoriesForOrg return status %d, want %d", got, want) } if advisories != nil { t.Errorf("ListRepositorySecurityAdvisoriesForOrg return %+v, want nil", advisories) } } func TestSecurityAdvisoriesService_ListRepositorySecurityAdvisoriesForOrg_UnmarshalError(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/security-advisories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusOK) assertWrite(t, w, []byte(`[{"ghsa_id": 12334354}]`)) }) ctx := context.Background() advisories, resp, err := client.SecurityAdvisories.ListRepositorySecurityAdvisoriesForOrg(ctx, "o", nil) if err == nil { t.Errorf("Expected unmarshal error") } else if !strings.Contains(err.Error(), "json: cannot unmarshal number into Go struct field SecurityAdvisory.ghsa_id of type string") { t.Errorf("ListRepositorySecurityAdvisoriesForOrg returned unexpected error: %v", err) } if got, want := resp.Response.StatusCode, http.StatusOK; got != want { t.Errorf("ListRepositorySecurityAdvisoriesForOrg return status %d, want %d", got, want) } if advisories != nil { t.Errorf("ListRepositorySecurityAdvisoriesForOrg return %+v, want nil", advisories) } } func TestSecurityAdvisoriesService_ListRepositorySecurityAdvisoriesForOrg(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/security-advisories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusOK) assertWrite(t, w, []byte(`[ { "ghsa_id": "GHSA-abcd-1234-efgh", "cve_id": "CVE-2050-00000" } ]`)) }) ctx := context.Background() advisories, resp, err := client.SecurityAdvisories.ListRepositorySecurityAdvisoriesForOrg(ctx, "o", nil) if err != nil { t.Errorf("ListRepositorySecurityAdvisoriesForOrg returned error: %v, want nil", err) } if got, want := resp.Response.StatusCode, http.StatusOK; got != want { t.Errorf("ListRepositorySecurityAdvisoriesForOrg return status %d, want %d", got, want) } want := []*SecurityAdvisory{ { GHSAID: String("GHSA-abcd-1234-efgh"), CVEID: String("CVE-2050-00000"), }, } if !cmp.Equal(advisories, want) { t.Errorf("ListRepositorySecurityAdvisoriesForOrg returned %+v, want %+v", advisories, want) } methodName := "ListRepositorySecurityAdvisoriesForOrg" testBadOptions(t, methodName, func() (err error) { _, _, err = client.SecurityAdvisories.ListRepositorySecurityAdvisoriesForOrg(ctx, "\n", &ListRepositorySecurityAdvisoriesOptions{ Sort: "\n", }) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.SecurityAdvisories.ListRepositorySecurityAdvisoriesForOrg(ctx, "o", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestSecurityAdvisoriesService_ListRepositorySecurityAdvisories_BadRequest(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/security-advisories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") http.Error(w, "Bad Request", 400) }) ctx := context.Background() advisories, resp, err := client.SecurityAdvisories.ListRepositorySecurityAdvisories(ctx, "o", "r", nil) if err == nil { t.Errorf("Expected HTTP 400 response") } if got, want := resp.Response.StatusCode, http.StatusBadRequest; got != want { t.Errorf("ListRepositorySecurityAdvisories return status %d, want %d", got, want) } if advisories != nil { t.Errorf("ListRepositorySecurityAdvisories return %+v, want nil", advisories) } } func TestSecurityAdvisoriesService_ListRepositorySecurityAdvisories_NotFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/security-advisories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") query := r.URL.Query() if query.Get("state") != "draft" { t.Errorf("ListRepositorySecurityAdvisories returned %+v, want %+v", query.Get("state"), "draft") } http.NotFound(w, r) }) ctx := context.Background() advisories, resp, err := client.SecurityAdvisories.ListRepositorySecurityAdvisories(ctx, "o", "r", &ListRepositorySecurityAdvisoriesOptions{ State: "draft", }) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("ListRepositorySecurityAdvisories return status %d, want %d", got, want) } if advisories != nil { t.Errorf("ListRepositorySecurityAdvisories return %+v, want nil", advisories) } } func TestSecurityAdvisoriesService_ListRepositorySecurityAdvisories_UnmarshalError(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/security-advisories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusOK) assertWrite(t, w, []byte(`[{"ghsa_id": 12334354}]`)) }) ctx := context.Background() advisories, resp, err := client.SecurityAdvisories.ListRepositorySecurityAdvisories(ctx, "o", "r", nil) if err == nil { t.Errorf("Expected unmarshal error") } else if !strings.Contains(err.Error(), "json: cannot unmarshal number into Go struct field SecurityAdvisory.ghsa_id of type string") { t.Errorf("ListRepositorySecurityAdvisories returned unexpected error: %v", err) } if got, want := resp.Response.StatusCode, http.StatusOK; got != want { t.Errorf("ListRepositorySecurityAdvisories return status %d, want %d", got, want) } if advisories != nil { t.Errorf("ListRepositorySecurityAdvisories return %+v, want nil", advisories) } } func TestSecurityAdvisoriesService_ListRepositorySecurityAdvisories(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/repos/o/r/security-advisories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusOK) assertWrite(t, w, []byte(`[ { "ghsa_id": "GHSA-abcd-1234-efgh", "cve_id": "CVE-2050-00000" } ]`)) }) ctx := context.Background() advisories, resp, err := client.SecurityAdvisories.ListRepositorySecurityAdvisories(ctx, "o", "r", nil) if err != nil { t.Errorf("ListRepositorySecurityAdvisories returned error: %v, want nil", err) } if got, want := resp.Response.StatusCode, http.StatusOK; got != want { t.Errorf("ListRepositorySecurityAdvisories return status %d, want %d", got, want) } want := []*SecurityAdvisory{ { GHSAID: String("GHSA-abcd-1234-efgh"), CVEID: String("CVE-2050-00000"), }, } if !cmp.Equal(advisories, want) { t.Errorf("ListRepositorySecurityAdvisories returned %+v, want %+v", advisories, want) } methodName := "ListRepositorySecurityAdvisories" testBadOptions(t, methodName, func() (err error) { _, _, err = client.SecurityAdvisories.ListRepositorySecurityAdvisories(ctx, "\n", "\n", &ListRepositorySecurityAdvisoriesOptions{ Sort: "\n", }) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.SecurityAdvisories.ListRepositorySecurityAdvisories(ctx, "o", "r", nil) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestListGlobalSecurityAdvisories(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/advisories", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"cve_id": "CVE-xoxo-1234"}) fmt.Fprint(w, `[{ "id": 1, "ghsa_id": "GHSA-xoxo-1234-xoxo", "cve_id": "CVE-xoxo-1234", "url": "https://api.github.com/advisories/GHSA-xoxo-1234-xoxo", "html_url": "https://github.com/advisories/GHSA-xoxo-1234-xoxo", "repository_advisory_url": "https://api.github.com/repos/project/a-package/security-advisories/GHSA-xoxo-1234-xoxo", "summary": "Heartbleed security advisory", "description": "This bug allows an attacker to read portions of the affected server’s memory, potentially disclosing sensitive information.", "type": "reviewed", "severity": "high", "source_code_location": "https://github.com/project/a-package", "identifiers": [ { "type": "GHSA", "value": "GHSA-xoxo-1234-xoxo" }, { "type": "CVE", "value": "CVE-xoxo-1234" } ], "references": ["https://nvd.nist.gov/vuln/detail/CVE-xoxo-1234"], "published_at": "1996-06-20T00:00:00Z", "updated_at": "1996-06-20T00:00:00Z", "github_reviewed_at": "1996-06-20T00:00:00Z", "nvd_published_at": "1996-06-20T00:00:00Z", "withdrawn_at": null, "vulnerabilities": [ { "package": { "ecosystem": "npm", "name": "a-package" }, "first_patched_version": "1.0.3", "vulnerable_version_range": "<=1.0.2", "vulnerable_functions": ["a_function"] } ], "cvss": { "vector_string": "CVSS:3.1/AV:N/AC:H/PR:H/UI:R/S:C/C:H/I:H/A:H", "score": 7.6 }, "cwes": [ { "cwe_id": "CWE-400", "name": "Uncontrolled Resource Consumption" } ], "credits": [ { "user": { "login": "user", "id": 1, "node_id": "12=", "avatar_url": "a", "gravatar_id": "", "url": "a", "html_url": "b", "followers_url": "b", "following_url": "c", "gists_url": "d", "starred_url": "e", "subscriptions_url": "f", "organizations_url": "g", "repos_url": "h", "events_url": "i", "received_events_url": "j", "type": "User", "site_admin": false }, "type": "analyst" } ] } ]`) }) ctx := context.Background() opts := &ListGlobalSecurityAdvisoriesOptions{CVEID: String("CVE-xoxo-1234")} advisories, _, err := client.SecurityAdvisories.ListGlobalSecurityAdvisories(ctx, opts) if err != nil { t.Errorf("SecurityAdvisories.ListGlobalSecurityAdvisories returned error: %v", err) } date := Timestamp{time.Date(1996, time.June, 20, 00, 00, 00, 0, time.UTC)} want := []*GlobalSecurityAdvisory{ { ID: Int64(1), SecurityAdvisory: SecurityAdvisory{ GHSAID: String("GHSA-xoxo-1234-xoxo"), CVEID: String("CVE-xoxo-1234"), URL: String("https://api.github.com/advisories/GHSA-xoxo-1234-xoxo"), HTMLURL: String("https://github.com/advisories/GHSA-xoxo-1234-xoxo"), Severity: String("high"), Summary: String("Heartbleed security advisory"), Description: String("This bug allows an attacker to read portions of the affected server’s memory, potentially disclosing sensitive information."), Identifiers: []*AdvisoryIdentifier{ { Type: String("GHSA"), Value: String("GHSA-xoxo-1234-xoxo"), }, { Type: String("CVE"), Value: String("CVE-xoxo-1234"), }, }, PublishedAt: &date, UpdatedAt: &date, WithdrawnAt: nil, CVSS: &AdvisoryCVSS{ VectorString: String("CVSS:3.1/AV:N/AC:H/PR:H/UI:R/S:C/C:H/I:H/A:H"), Score: Float64(7.6), }, CWEs: []*AdvisoryCWEs{ { CWEID: String("CWE-400"), Name: String("Uncontrolled Resource Consumption"), }, }, }, References: []string{"https://nvd.nist.gov/vuln/detail/CVE-xoxo-1234"}, Vulnerabilities: []*GlobalSecurityVulnerability{ { Package: &VulnerabilityPackage{ Ecosystem: String("npm"), Name: String("a-package"), }, FirstPatchedVersion: String("1.0.3"), VulnerableVersionRange: String("<=1.0.2"), VulnerableFunctions: []string{"a_function"}, }, }, RepositoryAdvisoryURL: String("https://api.github.com/repos/project/a-package/security-advisories/GHSA-xoxo-1234-xoxo"), Type: String("reviewed"), SourceCodeLocation: String("https://github.com/project/a-package"), GithubReviewedAt: &date, NVDPublishedAt: &date, Credits: []*Credit{ { User: &User{ Login: String("user"), ID: Int64(1), NodeID: String("12="), AvatarURL: String("a"), GravatarID: String(""), URL: String("a"), HTMLURL: String("b"), FollowersURL: String("b"), FollowingURL: String("c"), GistsURL: String("d"), StarredURL: String("e"), SubscriptionsURL: String("f"), OrganizationsURL: String("g"), ReposURL: String("h"), EventsURL: String("i"), ReceivedEventsURL: String("j"), Type: String("User"), SiteAdmin: Bool(false), }, Type: String("analyst"), }, }, }, } if !cmp.Equal(advisories, want) { t.Errorf("SecurityAdvisories.ListGlobalSecurityAdvisories %+v, want %+v", advisories, want) } const methodName = "ListGlobalSecurityAdvisories" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { _, resp, err := client.SecurityAdvisories.ListGlobalSecurityAdvisories(ctx, nil) return resp, err }) } func TestGetGlobalSecurityAdvisories(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/advisories/GHSA-xoxo-1234-xoxo", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "id": 1, "ghsa_id": "GHSA-xoxo-1234-xoxo", "cve_id": "CVE-xoxo-1234", "url": "https://api.github.com/advisories/GHSA-xoxo-1234-xoxo", "html_url": "https://github.com/advisories/GHSA-xoxo-1234-xoxo", "repository_advisory_url": "https://api.github.com/repos/project/a-package/security-advisories/GHSA-xoxo-1234-xoxo", "summary": "Heartbleed security advisory", "description": "This bug allows an attacker to read portions of the affected server’s memory, potentially disclosing sensitive information.", "type": "reviewed", "severity": "high", "source_code_location": "https://github.com/project/a-package", "identifiers": [ { "type": "GHSA", "value": "GHSA-xoxo-1234-xoxo" }, { "type": "CVE", "value": "CVE-xoxo-1234" } ], "references": ["https://nvd.nist.gov/vuln/detail/CVE-xoxo-1234"], "published_at": "1996-06-20T00:00:00Z", "updated_at": "1996-06-20T00:00:00Z", "github_reviewed_at": "1996-06-20T00:00:00Z", "nvd_published_at": "1996-06-20T00:00:00Z", "withdrawn_at": null, "vulnerabilities": [ { "package": { "ecosystem": "npm", "name": "a-package" }, "first_patched_version": "1.0.3", "vulnerable_version_range": "<=1.0.2", "vulnerable_functions": ["a_function"] } ], "cvss": { "vector_string": "CVSS:3.1/AV:N/AC:H/PR:H/UI:R/S:C/C:H/I:H/A:H", "score": 7.6 }, "cwes": [ { "cwe_id": "CWE-400", "name": "Uncontrolled Resource Consumption" } ], "credits": [ { "user": { "login": "user", "id": 1, "node_id": "12=", "avatar_url": "a", "gravatar_id": "", "url": "a", "html_url": "b", "followers_url": "b", "following_url": "c", "gists_url": "d", "starred_url": "e", "subscriptions_url": "f", "organizations_url": "g", "repos_url": "h", "events_url": "i", "received_events_url": "j", "type": "User", "site_admin": false }, "type": "analyst" } ] }`) }) ctx := context.Background() advisory, _, err := client.SecurityAdvisories.GetGlobalSecurityAdvisories(ctx, "GHSA-xoxo-1234-xoxo") if err != nil { t.Errorf("SecurityAdvisories.GetGlobalSecurityAdvisories returned error: %v", err) } date := Timestamp{time.Date(1996, time.June, 20, 00, 00, 00, 0, time.UTC)} want := &GlobalSecurityAdvisory{ ID: Int64(1), SecurityAdvisory: SecurityAdvisory{ GHSAID: String("GHSA-xoxo-1234-xoxo"), CVEID: String("CVE-xoxo-1234"), URL: String("https://api.github.com/advisories/GHSA-xoxo-1234-xoxo"), HTMLURL: String("https://github.com/advisories/GHSA-xoxo-1234-xoxo"), Severity: String("high"), Summary: String("Heartbleed security advisory"), Description: String("This bug allows an attacker to read portions of the affected server’s memory, potentially disclosing sensitive information."), Identifiers: []*AdvisoryIdentifier{ { Type: String("GHSA"), Value: String("GHSA-xoxo-1234-xoxo"), }, { Type: String("CVE"), Value: String("CVE-xoxo-1234"), }, }, PublishedAt: &date, UpdatedAt: &date, WithdrawnAt: nil, CVSS: &AdvisoryCVSS{ VectorString: String("CVSS:3.1/AV:N/AC:H/PR:H/UI:R/S:C/C:H/I:H/A:H"), Score: Float64(7.6), }, CWEs: []*AdvisoryCWEs{ { CWEID: String("CWE-400"), Name: String("Uncontrolled Resource Consumption"), }, }, }, RepositoryAdvisoryURL: String("https://api.github.com/repos/project/a-package/security-advisories/GHSA-xoxo-1234-xoxo"), Type: String("reviewed"), SourceCodeLocation: String("https://github.com/project/a-package"), References: []string{"https://nvd.nist.gov/vuln/detail/CVE-xoxo-1234"}, GithubReviewedAt: &date, NVDPublishedAt: &date, Vulnerabilities: []*GlobalSecurityVulnerability{ { Package: &VulnerabilityPackage{ Ecosystem: String("npm"), Name: String("a-package"), }, FirstPatchedVersion: String("1.0.3"), VulnerableVersionRange: String("<=1.0.2"), VulnerableFunctions: []string{"a_function"}, }, }, Credits: []*Credit{ { User: &User{ Login: String("user"), ID: Int64(1), NodeID: String("12="), AvatarURL: String("a"), GravatarID: String(""), URL: String("a"), HTMLURL: String("b"), FollowersURL: String("b"), FollowingURL: String("c"), GistsURL: String("d"), StarredURL: String("e"), SubscriptionsURL: String("f"), OrganizationsURL: String("g"), ReposURL: String("h"), EventsURL: String("i"), ReceivedEventsURL: String("j"), Type: String("User"), SiteAdmin: Bool(false), }, Type: String("analyst"), }, }, } if !cmp.Equal(advisory, want) { t.Errorf("SecurityAdvisories.GetGlobalSecurityAdvisories %+v, want %+v", advisory, want) } const methodName = "GetGlobalSecurityAdvisories" testBadOptions(t, methodName, func() (err error) { _, _, err = client.SecurityAdvisories.GetGlobalSecurityAdvisories(ctx, "CVE-\n-1234") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.SecurityAdvisories.GetGlobalSecurityAdvisories(ctx, "e") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestSecurityAdvisorySubmission_Marshal(t *testing.T) { testJSONMarshal(t, &SecurityAdvisorySubmission{}, `{}`) u := &SecurityAdvisorySubmission{ Accepted: Bool(true), } w := `{ "accepted": true }` testJSONMarshal(t, u, w) } func TestRepoAdvisoryCredit_Marshal(t *testing.T) { testJSONMarshal(t, &RepoAdvisoryCredit{}, `{}`) u := &RepoAdvisoryCredit{ Login: String("l"), Type: String("t"), } w := `{ "login": "l", "type": "t" }` testJSONMarshal(t, u, w) } func TestRepoAdvisoryCreditDetailed_Marshal(t *testing.T) { testJSONMarshal(t, &RepoAdvisoryCreditDetailed{}, `{}`) testDate := &Timestamp{time.Date(2019, time.August, 10, 14, 59, 22, 0, time.UTC)} u := &RepoAdvisoryCreditDetailed{ Type: String("t"), State: String("s"), User: &User{ Name: String("u"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(false), Bio: String("bio"), TwitterUsername: String("tu"), PublicRepos: Int(1), PublicGists: Int(1), Followers: Int(2), Following: Int(2), CreatedAt: testDate, UpdatedAt: testDate, SuspendedAt: testDate, Type: String("type"), SiteAdmin: Bool(false), TotalPrivateRepos: Int64(10), OwnedPrivateRepos: Int64(10), PrivateGists: Int(10), DiskUsage: Int(10), Collaborators: Int(10), TwoFactorAuthentication: Bool(true), Plan: &Plan{ Name: String("p"), Space: Int(2), Collaborators: Int(2), PrivateRepos: Int64(2), Seats: Int(2), FilledSeats: Int(1), }, LdapDn: String("l"), URL: String("url"), EventsURL: String("e"), FollowingURL: String("f"), FollowersURL: String("f"), GistsURL: String("g"), OrganizationsURL: String("o"), ReceivedEventsURL: String("r"), ReposURL: String("rep"), StarredURL: String("star"), SubscriptionsURL: String("sub"), TextMatches: []*TextMatch{ { ObjectURL: String("u"), ObjectType: String("t"), Property: String("p"), Fragment: String("f"), Matches: []*Match{ { Text: String("t"), Indices: []int{1, 2}, }, }, }, }, Permissions: map[string]bool{"p1": true}, RoleName: String("r"), }, } w := `{ "type": "t", "state": "s", "user": { "name": "u", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": false, "bio": "bio", "twitter_username": "tu", "public_repos": 1, "public_gists": 1, "followers": 2, "following": 2, "created_at": "2019-08-10T14:59:22Z", "updated_at": "2019-08-10T14:59:22Z", "suspended_at": "2019-08-10T14:59:22Z", "type": "type", "site_admin": false, "total_private_repos": 10, "owned_private_repos": 10, "private_gists": 10, "disk_usage": 10, "collaborators": 10, "two_factor_authentication": true, "plan": { "name": "p", "space": 2, "collaborators": 2, "private_repos": 2, "seats": 2, "filled_seats": 1 }, "ldap_dn": "l", "url": "url", "events_url": "e", "following_url": "f", "followers_url": "f", "gists_url": "g", "organizations_url": "o", "received_events_url": "r", "repos_url": "rep", "starred_url": "star", "subscriptions_url": "sub", "text_matches": [ { "object_url": "u", "object_type": "t", "property": "p", "fragment": "f", "matches": [ { "text": "t", "indices": [1, 2] } ] } ], "permissions": { "p1": true }, "role_name": "r" } }` testJSONMarshal(t, u, w) } func TestCredit_Marshal(t *testing.T) { testJSONMarshal(t, &Credit{}, `{}`) testDate := &Timestamp{time.Date(2019, time.August, 10, 14, 59, 22, 0, time.UTC)} u := &Credit{ Type: String("t"), User: &User{ Name: String("u"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(false), Bio: String("bio"), TwitterUsername: String("tu"), PublicRepos: Int(1), PublicGists: Int(1), Followers: Int(2), Following: Int(2), CreatedAt: testDate, UpdatedAt: testDate, SuspendedAt: testDate, Type: String("type"), SiteAdmin: Bool(false), TotalPrivateRepos: Int64(10), OwnedPrivateRepos: Int64(10), PrivateGists: Int(10), DiskUsage: Int(10), Collaborators: Int(10), TwoFactorAuthentication: Bool(true), Plan: &Plan{ Name: String("p"), Space: Int(2), Collaborators: Int(2), PrivateRepos: Int64(2), Seats: Int(2), FilledSeats: Int(1), }, LdapDn: String("l"), URL: String("url"), EventsURL: String("e"), FollowingURL: String("f"), FollowersURL: String("f"), GistsURL: String("g"), OrganizationsURL: String("o"), ReceivedEventsURL: String("r"), ReposURL: String("rep"), StarredURL: String("star"), SubscriptionsURL: String("sub"), TextMatches: []*TextMatch{ { ObjectURL: String("u"), ObjectType: String("t"), Property: String("p"), Fragment: String("f"), Matches: []*Match{ { Text: String("t"), Indices: []int{1, 2}, }, }, }, }, Permissions: map[string]bool{"p1": true}, RoleName: String("r"), }, } w := `{ "type": "t", "user": { "name": "u", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": false, "bio": "bio", "twitter_username": "tu", "public_repos": 1, "public_gists": 1, "followers": 2, "following": 2, "created_at": "2019-08-10T14:59:22Z", "updated_at": "2019-08-10T14:59:22Z", "suspended_at": "2019-08-10T14:59:22Z", "type": "type", "site_admin": false, "total_private_repos": 10, "owned_private_repos": 10, "private_gists": 10, "disk_usage": 10, "collaborators": 10, "two_factor_authentication": true, "plan": { "name": "p", "space": 2, "collaborators": 2, "private_repos": 2, "seats": 2, "filled_seats": 1 }, "ldap_dn": "l", "url": "url", "events_url": "e", "following_url": "f", "followers_url": "f", "gists_url": "g", "organizations_url": "o", "received_events_url": "r", "repos_url": "rep", "starred_url": "star", "subscriptions_url": "sub", "text_matches": [ { "object_url": "u", "object_type": "t", "property": "p", "fragment": "f", "matches": [ { "text": "t", "indices": [1, 2] } ] } ], "permissions": { "p1": true }, "role_name": "r" } }` testJSONMarshal(t, u, w) } func TestGlobalSecurityAdvisory_Marshal(t *testing.T) { testJSONMarshal(t, &GlobalSecurityAdvisory{}, `{}`) testDate := &Timestamp{time.Date(2019, time.August, 10, 14, 59, 22, 0, time.UTC)} u := &GlobalSecurityAdvisory{ ID: Int64(1), RepositoryAdvisoryURL: String("r"), Type: String("t"), SourceCodeLocation: String("s"), References: []string{"r"}, Vulnerabilities: []*GlobalSecurityVulnerability{ { Package: &VulnerabilityPackage{ Ecosystem: String("npm"), Name: String("a-package"), }, FirstPatchedVersion: String("1.0.3"), VulnerableVersionRange: String("<=1.0.2"), VulnerableFunctions: []string{"a_function"}, }, }, GithubReviewedAt: testDate, NVDPublishedAt: testDate, Credits: []*Credit{ { Type: String("t"), User: &User{ Name: String("u"), Company: String("c"), Blog: String("b"), Location: String("l"), Email: String("e"), Hireable: Bool(false), Bio: String("bio"), TwitterUsername: String("tu"), PublicRepos: Int(1), PublicGists: Int(1), Followers: Int(2), Following: Int(2), CreatedAt: testDate, UpdatedAt: testDate, SuspendedAt: testDate, Type: String("type"), SiteAdmin: Bool(false), TotalPrivateRepos: Int64(10), OwnedPrivateRepos: Int64(10), PrivateGists: Int(10), DiskUsage: Int(10), Collaborators: Int(10), TwoFactorAuthentication: Bool(true), Plan: &Plan{ Name: String("p"), Space: Int(2), Collaborators: Int(2), PrivateRepos: Int64(2), Seats: Int(2), FilledSeats: Int(1), }, LdapDn: String("l"), URL: String("url"), EventsURL: String("e"), FollowingURL: String("f"), FollowersURL: String("f"), GistsURL: String("g"), OrganizationsURL: String("o"), ReceivedEventsURL: String("r"), ReposURL: String("rep"), StarredURL: String("star"), SubscriptionsURL: String("sub"), TextMatches: []*TextMatch{ { ObjectURL: String("u"), ObjectType: String("t"), Property: String("p"), Fragment: String("f"), Matches: []*Match{ { Text: String("t"), Indices: []int{1, 2}, }, }, }, }, Permissions: map[string]bool{"p1": true}, RoleName: String("r"), }, }, }, SecurityAdvisory: SecurityAdvisory{ GHSAID: String("GHSA-xoxo-1234-xoxo"), CVEID: String("CVE-xoxo-1234"), URL: String("https://api.github.com/advisories/GHSA-xoxo-1234-xoxo"), HTMLURL: String("https://github.com/advisories/GHSA-xoxo-1234-xoxo"), Severity: String("high"), Summary: String("Heartbleed security advisory"), Description: String("This bug allows an attacker to read portions of the affected server’s memory, potentially disclosing sensitive information."), Identifiers: []*AdvisoryIdentifier{ { Type: String("GHSA"), Value: String("GHSA-xoxo-1234-xoxo"), }, { Type: String("CVE"), Value: String("CVE-xoxo-1234"), }, }, PublishedAt: testDate, UpdatedAt: testDate, WithdrawnAt: nil, CVSS: &AdvisoryCVSS{ VectorString: String("CVSS:3.1/AV:N/AC:H/PR:H/UI:R/S:C/C:H/I:H/A:H"), Score: Float64(7.6), }, CWEs: []*AdvisoryCWEs{ { CWEID: String("CWE-400"), Name: String("Uncontrolled Resource Consumption"), }, }, }, } w := `{ "cvss": { "score": 7.6, "vector_string": "CVSS:3.1/AV:N/AC:H/PR:H/UI:R/S:C/C:H/I:H/A:H" }, "cwes": [ { "cwe_id": "CWE-400", "name": "Uncontrolled Resource Consumption" } ], "ghsa_id": "GHSA-xoxo-1234-xoxo", "summary": "Heartbleed security advisory", "description": "This bug allows an attacker to read portions of the affected server’s memory, potentially disclosing sensitive information.", "severity": "high", "identifiers": [ { "value": "GHSA-xoxo-1234-xoxo", "type": "GHSA" }, { "value": "CVE-xoxo-1234", "type": "CVE" } ], "published_at": "2019-08-10T14:59:22Z", "updated_at": "2019-08-10T14:59:22Z", "cve_id": "CVE-xoxo-1234", "url": "https://api.github.com/advisories/GHSA-xoxo-1234-xoxo", "html_url": "https://github.com/advisories/GHSA-xoxo-1234-xoxo", "id": 1, "repository_advisory_url": "r", "type": "t", "source_code_location": "s", "references": [ "r" ], "vulnerabilities": [ { "package": { "ecosystem": "npm", "name": "a-package" }, "first_patched_version": "1.0.3", "vulnerable_version_range": "\u003c=1.0.2", "vulnerable_functions": [ "a_function" ] } ], "github_reviewed_at": "2019-08-10T14:59:22Z", "nvd_published_at": "2019-08-10T14:59:22Z", "credits": [ { "user": { "name": "u", "company": "c", "blog": "b", "location": "l", "email": "e", "hireable": false, "bio": "bio", "twitter_username": "tu", "public_repos": 1, "public_gists": 1, "followers": 2, "following": 2, "created_at": "2019-08-10T14:59:22Z", "updated_at": "2019-08-10T14:59:22Z", "suspended_at": "2019-08-10T14:59:22Z", "type": "type", "site_admin": false, "total_private_repos": 10, "owned_private_repos": 10, "private_gists": 10, "disk_usage": 10, "collaborators": 10, "two_factor_authentication": true, "plan": { "name": "p", "space": 2, "collaborators": 2, "private_repos": 2, "filled_seats": 1, "seats": 2 }, "ldap_dn": "l", "url": "url", "events_url": "e", "following_url": "f", "followers_url": "f", "gists_url": "g", "organizations_url": "o", "received_events_url": "r", "repos_url": "rep", "starred_url": "star", "subscriptions_url": "sub", "text_matches": [ { "object_url": "u", "object_type": "t", "property": "p", "fragment": "f", "matches": [ { "text": "t", "indices": [ 1, 2 ] } ] } ], "permissions": { "p1": true }, "role_name": "r" }, "type": "t" } ] }` testJSONMarshal(t, u, w) } go-github-60.0.0/github/strings.go000066400000000000000000000035641457013574700170110ustar00rootroot00000000000000// 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" "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 *bytes.Buffer, 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-60.0.0/github/strings_test.go000066400000000000000000000112331457013574700200400ustar00rootroot00000000000000// 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 // exhaustive 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.CommitAuthor{Name:"n"}`}, {WebHookCommit{ID: String("1")}, `github.HeadCommit{ID:"1"}`}, {WebHookPayload{Ref: String("r")}, `github.PushEvent{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-60.0.0/github/teams.go000066400000000000000000001107731457013574700164320ustar00rootroot00000000000000// 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" ) // TeamsService provides access to the team-related functions // in the GitHub API. // // GitHub API docs: https://docs.github.com/rest/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"` HTMLURL *string `json:"html_url,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 *Timestamp `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/rest/teams/teams#list-teams // //meta:operation GET /orgs/{org}/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/rest/teams/teams#get-a-team-by-name // //meta:operation GET /orgs/{org}/teams/{team_slug} 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/rest/teams/teams#get-a-team-by-name // //meta:operation GET /orgs/{org}/teams/{team_slug} 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/rest/teams/teams#create-a-team // //meta:operation POST /orgs/{org}/teams 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/rest/teams/teams#update-a-team // //meta:operation PATCH /orgs/{org}/teams/{team_slug} 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/rest/teams/teams#update-a-team // //meta:operation PATCH /orgs/{org}/teams/{team_slug} 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/rest/teams/teams#delete-a-team // //meta:operation DELETE /orgs/{org}/teams/{team_slug} 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/rest/teams/teams#delete-a-team // //meta:operation DELETE /orgs/{org}/teams/{team_slug} 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/rest/teams/teams#list-child-teams // //meta:operation GET /orgs/{org}/teams/{team_slug}/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/rest/teams/teams#list-child-teams // //meta:operation GET /orgs/{org}/teams/{team_slug}/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/rest/teams/teams#list-team-repositories // //meta:operation GET /orgs/{org}/teams/{team_slug}/repos 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/rest/teams/teams#list-team-repositories // //meta:operation GET /orgs/{org}/teams/{team_slug}/repos 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/rest/teams/teams#check-team-permissions-for-a-repository // //meta:operation GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo} 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/rest/teams/teams#check-team-permissions-for-a-repository // //meta:operation GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo} 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.AddTeamRepoByID and TeamsService.AddTeamRepoBySlug methods. 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/rest/teams/teams#add-or-update-team-repository-permissions // //meta:operation PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo} 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/rest/teams/teams#add-or-update-team-repository-permissions // //meta:operation PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo} 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/rest/teams/teams#remove-a-repository-from-a-team // //meta:operation DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo} 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/rest/teams/teams#remove-a-repository-from-a-team // //meta:operation DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo} 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/rest/teams/teams#list-teams-for-the-authenticated-user // //meta:operation GET /user/teams 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/rest/teams/teams#list-team-projects // //meta:operation GET /orgs/{org}/teams/{team_slug}/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/rest/teams/teams#list-team-projects // //meta:operation GET /orgs/{org}/teams/{team_slug}/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/rest/teams/teams#check-team-permissions-for-a-project // //meta:operation GET /orgs/{org}/teams/{team_slug}/projects/{project_id} 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/rest/teams/teams#check-team-permissions-for-a-project // //meta:operation GET /orgs/{org}/teams/{team_slug}/projects/{project_id} 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/rest/teams/teams#add-or-update-team-project-permissions // //meta:operation PUT /orgs/{org}/teams/{team_slug}/projects/{project_id} 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/rest/teams/teams#add-or-update-team-project-permissions // //meta:operation PUT /orgs/{org}/teams/{team_slug}/projects/{project_id} 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/rest/teams/teams#remove-a-project-from-a-team // //meta:operation DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id} 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/rest/teams/teams#remove-a-project-from-a-team // //meta:operation DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id} 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/enterprise-cloud@latest/rest/teams/team-sync#list-idp-groups-for-an-organization // //meta:operation GET /orgs/{org}/team-sync/groups 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/enterprise-cloud@latest/rest/teams/team-sync#list-idp-groups-for-a-team // //meta:operation GET /orgs/{org}/teams/{team_slug}/team-sync/group-mappings 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, nil } // ListIDPGroupsForTeamBySlug lists IDP groups connected to a team on GitHub // given organization name and team slug. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/teams/team-sync#list-idp-groups-for-a-team // //meta:operation GET /orgs/{org}/teams/{team_slug}/team-sync/group-mappings 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, nil } // 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/enterprise-cloud@latest/rest/teams/team-sync#create-or-update-idp-group-connections // //meta:operation PATCH /orgs/{org}/teams/{team_slug}/team-sync/group-mappings 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/enterprise-cloud@latest/rest/teams/team-sync#create-or-update-idp-group-connections // //meta:operation PATCH /orgs/{org}/teams/{team_slug}/team-sync/group-mappings 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 } // ExternalGroupMember represents a member of an external group. type ExternalGroupMember struct { MemberID *int64 `json:"member_id,omitempty"` MemberLogin *string `json:"member_login,omitempty"` MemberName *string `json:"member_name,omitempty"` MemberEmail *string `json:"member_email,omitempty"` } // ExternalGroupTeam represents a team connected to an external group. type ExternalGroupTeam struct { TeamID *int64 `json:"team_id,omitempty"` TeamName *string `json:"team_name,omitempty"` } // ExternalGroup represents an external group. type ExternalGroup struct { GroupID *int64 `json:"group_id,omitempty"` GroupName *string `json:"group_name,omitempty"` UpdatedAt *Timestamp `json:"updated_at,omitempty"` Teams []*ExternalGroupTeam `json:"teams,omitempty"` Members []*ExternalGroupMember `json:"members,omitempty"` } // ExternalGroupList represents a list of external groups. type ExternalGroupList struct { Groups []*ExternalGroup `json:"groups"` } // GetExternalGroup fetches an external group. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/teams/external-groups#get-an-external-group // //meta:operation GET /orgs/{org}/external-group/{group_id} func (s *TeamsService) GetExternalGroup(ctx context.Context, org string, groupID int64) (*ExternalGroup, *Response, error) { u := fmt.Sprintf("orgs/%v/external-group/%v", org, groupID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } externalGroup := new(ExternalGroup) resp, err := s.client.Do(ctx, req, externalGroup) if err != nil { return nil, resp, err } return externalGroup, resp, nil } // ListExternalGroupsOptions specifies the optional parameters to the // TeamsService.ListExternalGroups method. type ListExternalGroupsOptions struct { DisplayName *string `url:"display_name,omitempty"` ListOptions } // ListExternalGroups lists external groups in an organization on GitHub. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/teams/external-groups#list-external-groups-in-an-organization // //meta:operation GET /orgs/{org}/external-groups func (s *TeamsService) ListExternalGroups(ctx context.Context, org string, opts *ListExternalGroupsOptions) (*ExternalGroupList, *Response, error) { u := fmt.Sprintf("orgs/%v/external-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 } externalGroups := new(ExternalGroupList) resp, err := s.client.Do(ctx, req, externalGroups) if err != nil { return nil, resp, err } return externalGroups, resp, nil } // ListExternalGroupsForTeamBySlug lists external groups connected to a team on GitHub. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/teams/external-groups#list-a-connection-between-an-external-group-and-a-team // //meta:operation GET /orgs/{org}/teams/{team_slug}/external-groups func (s *TeamsService) ListExternalGroupsForTeamBySlug(ctx context.Context, org, slug string) (*ExternalGroupList, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/external-groups", org, slug) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } externalGroups := new(ExternalGroupList) resp, err := s.client.Do(ctx, req, externalGroups) if err != nil { return nil, resp, err } return externalGroups, resp, nil } // UpdateConnectedExternalGroup updates the connection between an external group and a team. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/teams/external-groups#update-the-connection-between-an-external-group-and-a-team // //meta:operation PATCH /orgs/{org}/teams/{team_slug}/external-groups func (s *TeamsService) UpdateConnectedExternalGroup(ctx context.Context, org, slug string, eg *ExternalGroup) (*ExternalGroup, *Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/external-groups", org, slug) req, err := s.client.NewRequest("PATCH", u, eg) if err != nil { return nil, nil, err } externalGroup := new(ExternalGroup) resp, err := s.client.Do(ctx, req, externalGroup) if err != nil { return nil, resp, err } return externalGroup, resp, nil } // RemoveConnectedExternalGroup removes the connection between an external group and a team. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/teams/external-groups#remove-the-connection-between-an-external-group-and-a-team // //meta:operation DELETE /orgs/{org}/teams/{team_slug}/external-groups func (s *TeamsService) RemoveConnectedExternalGroup(ctx context.Context, org, slug string) (*Response, error) { u := fmt.Sprintf("orgs/%v/teams/%v/external-groups", org, slug) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/teams_discussion_comments.go000066400000000000000000000241041457013574700225720ustar00rootroot00000000000000// 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/rest/teams/discussion-comments#list-discussion-comments // //meta:operation GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/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/rest/teams/discussion-comments#list-discussion-comments // //meta:operation GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/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/rest/teams/discussion-comments#get-a-discussion-comment // //meta:operation GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number} 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/rest/teams/discussion-comments#get-a-discussion-comment // //meta:operation GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number} 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/rest/teams/discussion-comments#create-a-discussion-comment // //meta:operation POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments 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/rest/teams/discussion-comments#create-a-discussion-comment // //meta:operation POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments 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/rest/teams/discussion-comments#update-a-discussion-comment // //meta:operation PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number} 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/rest/teams/discussion-comments#update-a-discussion-comment // //meta:operation PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number} 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/rest/teams/discussion-comments#delete-a-discussion-comment // //meta:operation DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number} 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/rest/teams/discussion-comments#delete-a-discussion-comment // //meta:operation DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number} 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-60.0.0/github/teams_discussion_comments_test.go000066400000000000000000000361661457013574700236440ustar00rootroot00000000000000// 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) assertNilError(t, 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) assertNilError(t, 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 }) } func TestDiscussionComment_Marshal(t *testing.T) { testJSONMarshal(t, &DiscussionComment{}, "{}") u := &DiscussionComment{ Author: &User{}, Body: String("body"), BodyHTML: String("body html"), BodyVersion: String("body version"), CreatedAt: &Timestamp{referenceTime}, LastEditedAt: &Timestamp{referenceTime}, DiscussionURL: String("url"), HTMLURL: String("html url"), NodeID: String("node"), Number: Int(1), UpdatedAt: &Timestamp{referenceTime}, URL: String("url"), Reactions: &Reactions{ TotalCount: Int(10), PlusOne: Int(1), MinusOne: Int(1), Laugh: Int(1), Confused: Int(1), Heart: Int(2), Hooray: Int(5), Rocket: Int(3), Eyes: Int(9), URL: String("url"), }, } want := `{ "author":{}, "body":"body", "body_html":"body html", "body_version":"body version", "created_at":` + referenceTimeStr + `, "last_edited_at":` + referenceTimeStr + `, "discussion_url":"url", "html_url":"html url", "node_id":"node", "number":1, "updated_at":` + referenceTimeStr + `, "url":"url", "reactions":{ "total_count": 10, "+1": 1, "-1": 1, "laugh": 1, "confused": 1, "heart": 2, "hooray": 5, "rocket": 3, "eyes": 9, "url":"url" } }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/teams_discussions.go000066400000000000000000000232761457013574700210610ustar00rootroot00000000000000// 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/rest/teams/discussions#list-discussions // //meta:operation GET /orgs/{org}/teams/{team_slug}/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/rest/teams/discussions#list-discussions // //meta:operation GET /orgs/{org}/teams/{team_slug}/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/rest/teams/discussions#get-a-discussion // //meta:operation GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number} 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/rest/teams/discussions#get-a-discussion // //meta:operation GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number} 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/rest/teams/discussions#create-a-discussion // //meta:operation POST /orgs/{org}/teams/{team_slug}/discussions 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/rest/teams/discussions#create-a-discussion // //meta:operation POST /orgs/{org}/teams/{team_slug}/discussions 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/rest/teams/discussions#update-a-discussion // //meta:operation PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number} 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/rest/teams/discussions#update-a-discussion // //meta:operation PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number} 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/rest/teams/discussions#delete-a-discussion // //meta:operation DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number} 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/rest/teams/discussions#delete-a-discussion // //meta:operation DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number} 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-60.0.0/github/teams_discussions_test.go000066400000000000000000000521551457013574700221160ustar00rootroot00000000000000// 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) assertNilError(t, 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) assertNilError(t, 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) assertNilError(t, 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) assertNilError(t, 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) }) } func TestTeamDiscussion_Marshal(t *testing.T) { testJSONMarshal(t, &TeamDiscussion{}, "{}") u := &TeamDiscussion{ Author: &User{ Login: String("author"), ID: Int64(0), URL: String("https://api.github.com/users/author"), AvatarURL: String("https://avatars1.githubusercontent.com/u/0?v=4"), GravatarID: String(""), CreatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, }, 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{referenceTime}, LastEditedAt: &Timestamp{referenceTime}, HTMLURL: String("https://api.github.com/teams/2/discussions/3/comments"), NodeID: String("A123"), Number: Int(10), Pinned: Bool(true), Private: Bool(false), TeamURL: String("https://api.github.com/teams/2/discussions/3/comments"), Title: String("Test"), UpdatedAt: &Timestamp{referenceTime}, URL: String("https://api.github.com/teams/2/discussions/3/comments"), Reactions: &Reactions{ TotalCount: Int(1), PlusOne: Int(2), MinusOne: Int(-3), Laugh: Int(4), Confused: Int(5), Heart: Int(6), Hooray: Int(7), Rocket: Int(8), Eyes: Int(9), URL: String("https://api.github.com/teams/2/discussions/3/comments"), }, } want := `{ "author": { "login": "author", "id": 0, "avatar_url": "https://avatars1.githubusercontent.com/u/0?v=4", "gravatar_id": "", "url": "https://api.github.com/users/author", "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + ` }, "body": "test", "body_html": "

test

", "body_version": "version", "comments_count": 1, "comments_url": "https://api.github.com/teams/2/discussions/3/comments", "created_at": ` + referenceTimeStr + `, "last_edited_at": ` + referenceTimeStr + `, "html_url": "https://api.github.com/teams/2/discussions/3/comments", "node_id": "A123", "number": 10, "pinned": true, "private": false, "team_url": "https://api.github.com/teams/2/discussions/3/comments", "title": "Test", "updated_at": ` + referenceTimeStr + `, "url": "https://api.github.com/teams/2/discussions/3/comments", "reactions": { "total_count": 1, "+1": 2, "-1": -3, "laugh": 4, "confused": 5, "heart": 6, "hooray": 7, "rocket": 8, "eyes": 9, "url": "https://api.github.com/teams/2/discussions/3/comments" } }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/teams_members.go000066400000000000000000000206371457013574700201430ustar00rootroot00000000000000// 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/rest/teams/members#list-team-members // //meta:operation GET /orgs/{org}/teams/{team_slug}/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/rest/teams/members#list-team-members // //meta:operation GET /orgs/{org}/teams/{team_slug}/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/rest/teams/members#list-team-members // //meta:operation GET /orgs/{org}/teams/{team_slug}/members 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/rest/teams/members#get-team-membership-for-a-user // //meta:operation GET /orgs/{org}/teams/{team_slug}/memberships/{username} 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/rest/teams/members#add-or-update-team-membership-for-a-user // //meta:operation PUT /orgs/{org}/teams/{team_slug}/memberships/{username} 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/rest/teams/members#add-or-update-team-membership-for-a-user // //meta:operation PUT /orgs/{org}/teams/{team_slug}/memberships/{username} 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/rest/teams/members#remove-team-membership-for-a-user // //meta:operation DELETE /orgs/{org}/teams/{team_slug}/memberships/{username} 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/rest/teams/members#remove-team-membership-for-a-user // //meta:operation DELETE /orgs/{org}/teams/{team_slug}/memberships/{username} 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/rest/teams/members#list-pending-team-invitations // //meta:operation GET /orgs/{org}/teams/{team_slug}/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/rest/teams/members#list-pending-team-invitations // //meta:operation GET /orgs/{org}/teams/{team_slug}/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-60.0.0/github/teams_members_test.go000066400000000000000000000632771457013574700212110ustar00rootroot00000000000000// 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) assertNilError(t, 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) assertNilError(t, 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) assertNilError(t, 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) assertNilError(t, 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) } func TestTeamAddTeamMembershipOptions_Marshal(t *testing.T) { testJSONMarshal(t, &TeamAddTeamMembershipOptions{}, "{}") u := &TeamAddTeamMembershipOptions{ Role: "role", } want := `{ "role": "role" }` testJSONMarshal(t, u, want) } func TestTeamListTeamMembersOptions_Marshal(t *testing.T) { testJSONMarshal(t, &TeamListTeamMembersOptions{}, "{}") u := &TeamListTeamMembersOptions{ Role: "role", ListOptions: ListOptions{ Page: 1, PerPage: 2, }, } want := `{ "role": "role", "Page": 1, "PerPage": 2 }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/teams_test.go000066400000000000000000002015411457013574700174630ustar00rootroot00000000000000// 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" "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) assertNilError(t, 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) assertNilError(t, 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 := io.ReadAll(r.Body) if err != nil { t.Errorf("Unable to read body: %v", err) } body = string(buf) assertNilError(t, 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) assertNilError(t, 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 := io.ReadAll(r.Body) if err != nil { t.Errorf("Unable to read body: %v", err) } body = string(buf) assertNilError(t, 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) assertNilError(t, 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) assertNilError(t, 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("Expected 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("Expected 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{} assertNilError(t, 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{} assertNilError(t, 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 TestNewTeam_Marshal(t *testing.T) { testJSONMarshal(t, &NewTeam{}, "{}") u := &NewTeam{ Name: "n", Description: String("d"), Maintainers: []string{"m1", "m2"}, RepoNames: []string{"repo1", "repo2"}, ParentTeamID: Int64(1), Permission: String("perm"), Privacy: String("p"), LDAPDN: String("l"), } want := `{ "name": "n", "description": "d", "maintainers": ["m1", "m2"], "repo_names": ["repo1", "repo2"], "parent_team_id": 1, "permission": "perm", "privacy": "p", "ldap_dn": "l" }` testJSONMarshal(t, u, 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) } func TestInvitation_Marshal(t *testing.T) { testJSONMarshal(t, &Invitation{}, "{}") u := &Invitation{ ID: Int64(1), NodeID: String("test node"), Login: String("login123"), Email: String("go@github.com"), Role: String("developer"), CreatedAt: &Timestamp{referenceTime}, TeamCount: Int(99), InvitationTeamURL: String("url"), } want := `{ "id": 1, "node_id": "test node", "login":"login123", "email":"go@github.com", "role":"developer", "created_at":` + referenceTimeStr + `, "team_count":99, "invitation_team_url":"url" }` testJSONMarshal(t, u, want) } func TestIDPGroup_Marshal(t *testing.T) { testJSONMarshal(t, &IDPGroup{}, "{}") u := &IDPGroup{ GroupID: String("abc1"), GroupName: String("test group"), GroupDescription: String("test group descripation"), } want := `{ "group_id": "abc1", "group_name": "test group", "group_description":"test group descripation" }` testJSONMarshal(t, u, want) } func TestTeamsService_GetExternalGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/external-group/123", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "group_id": 123, "group_name": "Octocat admins", "updated_at": "2006-01-02T15:04:05Z", "teams": [ { "team_id": 1, "team_name": "team-test" }, { "team_id": 2, "team_name": "team-test2" } ], "members": [ { "member_id": 1, "member_login": "mona-lisa_eocsaxrs", "member_name": "Mona Lisa", "member_email": "mona_lisa@github.com" }, { "member_id": 2, "member_login": "octo-lisa_eocsaxrs", "member_name": "Octo Lisa", "member_email": "octo_lisa@github.com" } ] }`) }) ctx := context.Background() externalGroup, _, err := client.Teams.GetExternalGroup(ctx, "o", 123) if err != nil { t.Errorf("Teams.GetExternalGroup returned error: %v", err) } want := &ExternalGroup{ GroupID: Int64(123), GroupName: String("Octocat admins"), UpdatedAt: &Timestamp{Time: referenceTime}, Teams: []*ExternalGroupTeam{ { TeamID: Int64(1), TeamName: String("team-test"), }, { TeamID: Int64(2), TeamName: String("team-test2"), }, }, Members: []*ExternalGroupMember{ { MemberID: Int64(1), MemberLogin: String("mona-lisa_eocsaxrs"), MemberName: String("Mona Lisa"), MemberEmail: String("mona_lisa@github.com"), }, { MemberID: Int64(2), MemberLogin: String("octo-lisa_eocsaxrs"), MemberName: String("Octo Lisa"), MemberEmail: String("octo_lisa@github.com"), }, }, } if !cmp.Equal(externalGroup, want) { t.Errorf("Teams.GetExternalGroup returned %+v, want %+v", externalGroup, want) } const methodName = "GetExternalGroup" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.GetExternalGroup(ctx, "\n", -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.GetExternalGroup(ctx, "o", 123) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_GetExternalGroup_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/external-group/123", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() eg, resp, err := client.Teams.GetExternalGroup(ctx, "o", 123) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.GetExternalGroup returned status %d, want %d", got, want) } if eg != nil { t.Errorf("Teams.GetExternalGroup returned %+v, want nil", eg) } } func TestTeamsService_ListExternalGroups(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/external-groups", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "groups": [ { "group_id": 123, "group_name": "Octocat admins", "updated_at": "2006-01-02T15:04:05Z" } ] }`) }) ctx := context.Background() opts := &ListExternalGroupsOptions{ DisplayName: String("Octocat"), } list, _, err := client.Teams.ListExternalGroups(ctx, "o", opts) if err != nil { t.Errorf("Teams.ListExternalGroups returned error: %v", err) } want := &ExternalGroupList{ Groups: []*ExternalGroup{ { GroupID: Int64(123), GroupName: String("Octocat admins"), UpdatedAt: &Timestamp{Time: referenceTime}, }, }, } if !cmp.Equal(list, want) { t.Errorf("Teams.ListExternalGroups returned %+v, want %+v", list, want) } const methodName = "ListExternalGroups" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListExternalGroups(ctx, "\n", opts) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListExternalGroups(ctx, "o", opts) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_ListExternalGroups_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/external-groups", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() eg, resp, err := client.Teams.ListExternalGroups(ctx, "o", nil) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.ListExternalGroups returned status %d, want %d", got, want) } if eg != nil { t.Errorf("Teams.ListExternalGroups returned %+v, want nil", eg) } } func TestTeamsService_ListExternalGroupsForTeamBySlug(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "groups": [ { "group_id": 123, "group_name": "Octocat admins", "updated_at": "2006-01-02T15:04:05Z" } ] }`) }) ctx := context.Background() list, _, err := client.Teams.ListExternalGroupsForTeamBySlug(ctx, "o", "t") if err != nil { t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned error: %v", err) } want := &ExternalGroupList{ Groups: []*ExternalGroup{ { GroupID: Int64(123), GroupName: String("Octocat admins"), UpdatedAt: &Timestamp{Time: referenceTime}, }, }, } if !cmp.Equal(list, want) { t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned %+v, want %+v", list, want) } const methodName = "ListExternalGroupsForTeamBySlug" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.ListExternalGroupsForTeamBySlug(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.ListExternalGroupsForTeamBySlug(ctx, "o", "t") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_ListExternalGroupsForTeamBySlug_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() eg, resp, err := client.Teams.ListExternalGroupsForTeamBySlug(ctx, "o", "t") if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned status %d, want %d", got, want) } if eg != nil { t.Errorf("Teams.ListExternalGroupsForTeamBySlug returned %+v, want nil", eg) } } func TestTeamsService_UpdateConnectedExternalGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") fmt.Fprint(w, `{ "group_id": 123, "group_name": "Octocat admins", "updated_at": "2006-01-02T15:04:05Z", "teams": [ { "team_id": 1, "team_name": "team-test" }, { "team_id": 2, "team_name": "team-test2" } ], "members": [ { "member_id": 1, "member_login": "mona-lisa_eocsaxrs", "member_name": "Mona Lisa", "member_email": "mona_lisa@github.com" }, { "member_id": 2, "member_login": "octo-lisa_eocsaxrs", "member_name": "Octo Lisa", "member_email": "octo_lisa@github.com" } ] }`) }) ctx := context.Background() body := &ExternalGroup{ GroupID: Int64(123), } externalGroup, _, err := client.Teams.UpdateConnectedExternalGroup(ctx, "o", "t", body) if err != nil { t.Errorf("Teams.UpdateConnectedExternalGroup returned error: %v", err) } want := &ExternalGroup{ GroupID: Int64(123), GroupName: String("Octocat admins"), UpdatedAt: &Timestamp{Time: referenceTime}, Teams: []*ExternalGroupTeam{ { TeamID: Int64(1), TeamName: String("team-test"), }, { TeamID: Int64(2), TeamName: String("team-test2"), }, }, Members: []*ExternalGroupMember{ { MemberID: Int64(1), MemberLogin: String("mona-lisa_eocsaxrs"), MemberName: String("Mona Lisa"), MemberEmail: String("mona_lisa@github.com"), }, { MemberID: Int64(2), MemberLogin: String("octo-lisa_eocsaxrs"), MemberName: String("Octo Lisa"), MemberEmail: String("octo_lisa@github.com"), }, }, } if !cmp.Equal(externalGroup, want) { t.Errorf("Teams.GetExternalGroup returned %+v, want %+v", externalGroup, want) } const methodName = "UpdateConnectedExternalGroup" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Teams.UpdateConnectedExternalGroup(ctx, "\n", "\n", body) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Teams.UpdateConnectedExternalGroup(ctx, "o", "t", body) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestTeamsService_UpdateConnectedExternalGroup_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() body := &ExternalGroup{ GroupID: Int64(123), } eg, resp, err := client.Teams.UpdateConnectedExternalGroup(ctx, "o", "t", body) if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.UpdateConnectedExternalGroup returned status %d, want %d", got, want) } if eg != nil { t.Errorf("Teams.UpdateConnectedExternalGroup returned %+v, want nil", eg) } } func TestTeamsService_RemoveConnectedExternalGroup(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNoContent) }) ctx := context.Background() _, err := client.Teams.RemoveConnectedExternalGroup(ctx, "o", "t") if err != nil { t.Errorf("Teams.RemoveConnectedExternalGroup returned error: %v", err) } const methodName = "RemoveConnectedExternalGroup" testBadOptions(t, methodName, func() (err error) { _, err = client.Teams.RemoveConnectedExternalGroup(ctx, "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Teams.RemoveConnectedExternalGroup(ctx, "o", "t") }) } func TestTeamsService_RemoveConnectedExternalGroup_notFound(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/orgs/o/teams/t/external-groups", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") w.WriteHeader(http.StatusNotFound) }) ctx := context.Background() resp, err := client.Teams.RemoveConnectedExternalGroup(ctx, "o", "t") if err == nil { t.Errorf("Expected HTTP 404 response") } if got, want := resp.Response.StatusCode, http.StatusNotFound; got != want { t.Errorf("Teams.GetExternalGroup returned status %d, want %d", got, want) } } func TestIDPGroupList_Marshal(t *testing.T) { testJSONMarshal(t, &IDPGroupList{}, "{}") u := &IDPGroupList{ Groups: []*IDPGroup{ { GroupID: String("abc1"), GroupName: String("test group"), GroupDescription: String("test group descripation"), }, { GroupID: String("abc2"), GroupName: String("test group2"), GroupDescription: String("test group descripation2"), }, }, } want := `{ "groups": [ { "group_id": "abc1", "group_name": "test group", "group_description": "test group descripation" }, { "group_id": "abc2", "group_name": "test group2", "group_description": "test group descripation2" } ] }` testJSONMarshal(t, u, want) } func TestExternalGroupMember_Marshal(t *testing.T) { testJSONMarshal(t, &ExternalGroupMember{}, "{}") u := &ExternalGroupMember{ MemberID: Int64(1), MemberLogin: String("test member"), MemberName: String("test member name"), MemberEmail: String("test member email"), } want := `{ "member_id": 1, "member_login": "test member", "member_name":"test member name", "member_email":"test member email" }` testJSONMarshal(t, u, want) } func TestExternalGroup_Marshal(t *testing.T) { testJSONMarshal(t, &ExternalGroup{}, "{}") u := &ExternalGroup{ GroupID: Int64(123), GroupName: String("group1"), UpdatedAt: &Timestamp{referenceTime}, Teams: []*ExternalGroupTeam{ { TeamID: Int64(1), TeamName: String("team-test"), }, { TeamID: Int64(2), TeamName: String("team-test2"), }, }, Members: []*ExternalGroupMember{ { MemberID: Int64(1), MemberLogin: String("test"), MemberName: String("test"), MemberEmail: String("test@github.com"), }, }, } want := `{ "group_id": 123, "group_name": "group1", "updated_at": ` + referenceTimeStr + `, "teams": [ { "team_id": 1, "team_name": "team-test" }, { "team_id": 2, "team_name": "team-test2" } ], "members": [ { "member_id": 1, "member_login": "test", "member_name": "test", "member_email": "test@github.com" } ] }` testJSONMarshal(t, u, want) } func TestExternalGroupTeam_Marshal(t *testing.T) { testJSONMarshal(t, &ExternalGroupTeam{}, "{}") u := &ExternalGroupTeam{ TeamID: Int64(123), TeamName: String("test"), } want := `{ "team_id": 123, "team_name": "test" }` testJSONMarshal(t, u, want) } func TestListExternalGroupsOptions_Marshal(t *testing.T) { testJSONMarshal(t, &ListExternalGroupsOptions{}, "{}") u := &ListExternalGroupsOptions{ DisplayName: String("test"), ListOptions: ListOptions{ Page: 1, PerPage: 2, }, } want := `{ "DisplayName": "test", "page": 1, "PerPage": 2 }` testJSONMarshal(t, u, want) } func TestTeamAddTeamRepoOptions_Marshal(t *testing.T) { testJSONMarshal(t, &TeamAddTeamRepoOptions{}, "{}") u := &TeamAddTeamRepoOptions{ Permission: "a", } want := `{ "permission": "a" }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/timestamp.go000066400000000000000000000024201457013574700173110ustar00rootroot00000000000000// 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() } // GetTime returns std time.Time. func (t *Timestamp) GetTime() *time.Time { if t == nil { return nil } return &t.Time } // 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-60.0.0/github/timestamp_test.go000066400000000000000000000150121457013574700203510ustar00rootroot00000000000000// 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 TestTimestamp_GetTime(t *testing.T) { var t1 *Timestamp if t1.GetTime() != nil { t.Errorf("nil timestamp should return nil, got: %v", t1.GetTime()) } t1 = &Timestamp{referenceTime} if !t1.GetTime().Equal(referenceTime) { t.Errorf("want reference time, got: %s", t1.GetTime().String()) } } 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-60.0.0/github/users.go000066400000000000000000000232331457013574700164540ustar00rootroot00000000000000// 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/rest/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 *int64 `json:"total_private_repos,omitempty"` OwnedPrivateRepos *int64 `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/rest/search/#text-match-metadata TextMatches []*TextMatch `json:"text_matches,omitempty"` // Permissions and RoleName identify the permissions and role that a user has on a given // repository. These are only populated when calling Repositories.ListCollaborators. Permissions map[string]bool `json:"permissions,omitempty"` RoleName *string `json:"role_name,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/rest/users/users#get-a-user // GitHub API docs: https://docs.github.com/rest/users/users#get-the-authenticated-user // //meta:operation GET /user //meta:operation GET /users/{username} 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 "GET /user/{user_id}". // //meta:operation GET /user/{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/rest/users/users#update-the-authenticated-user // //meta:operation PATCH /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/rest/users/users#get-contextual-information-for-a-user // //meta:operation GET /users/{username}/hovercard 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/rest/users/users#list-users // //meta:operation GET /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/rest/collaborators/invitations#list-repository-invitations-for-the-authenticated-user // //meta:operation GET /user/repository_invitations 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/rest/collaborators/invitations#accept-a-repository-invitation // //meta:operation PATCH /user/repository_invitations/{invitation_id} 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/rest/collaborators/invitations#decline-a-repository-invitation // //meta:operation DELETE /user/repository_invitations/{invitation_id} 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-60.0.0/github/users_administration.go000066400000000000000000000046201457013574700215600ustar00rootroot00000000000000// 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://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#promote-a-user-to-be-a-site-administrator // //meta:operation PUT /users/{username}/site_admin 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://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#demote-a-site-administrator // //meta:operation DELETE /users/{username}/site_admin 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://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#suspend-a-user // //meta:operation PUT /users/{username}/suspended 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://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#unsuspend-a-user // //meta:operation DELETE /users/{username}/suspended 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-60.0.0/github/users_administration_test.go000066400000000000000000000076011457013574700226210ustar00rootroot00000000000000// 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) assertNilError(t, 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") }) } func TestUserSuspendOptions_Marshal(t *testing.T) { testJSONMarshal(t, &UserSuspendOptions{}, "{}") u := &UserSuspendOptions{ Reason: String("reason"), } want := `{ "reason": "reason" }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/users_blocking.go000066400000000000000000000055111457013574700203230ustar00rootroot00000000000000// 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/rest/users/blocking#list-users-blocked-by-the-authenticated-user // //meta:operation GET /user/blocks 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/rest/users/blocking#check-if-a-user-is-blocked-by-the-authenticated-user // //meta:operation GET /user/blocks/{username} 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/rest/users/blocking#block-a-user // //meta:operation PUT /user/blocks/{username} 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/rest/users/blocking#unblock-a-user // //meta:operation DELETE /user/blocks/{username} 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-60.0.0/github/users_blocking_test.go000066400000000000000000000073071457013574700213670ustar00rootroot00000000000000// 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-60.0.0/github/users_emails.go000066400000000000000000000055541457013574700200140ustar00rootroot00000000000000// 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/rest/users/emails#list-email-addresses-for-the-authenticated-user // //meta:operation GET /user/emails 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/rest/users/emails#add-an-email-address-for-the-authenticated-user // //meta:operation POST /user/emails 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/rest/users/emails#delete-an-email-address-for-the-authenticated-user // //meta:operation DELETE /user/emails 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) } // SetEmailVisibility sets the visibility for the primary email address of the authenticated user. // `visibility` can be "private" or "public". // // GitHub API docs: https://docs.github.com/rest/users/emails#set-primary-email-visibility-for-the-authenticated-user // //meta:operation PATCH /user/email/visibility func (s *UsersService) SetEmailVisibility(ctx context.Context, visibility string) ([]*UserEmail, *Response, error) { u := "user/email/visibility" updateVisiblilityReq := &UserEmail{ Visibility: &visibility, } req, err := s.client.NewRequest("PATCH", u, updateVisiblilityReq) 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 } go-github-60.0.0/github/users_emails_test.go000066400000000000000000000114531457013574700210460ustar00rootroot00000000000000// 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 assertNilError(t, 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 assertNilError(t, 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) }) } func TestUserEmail_Marshal(t *testing.T) { testJSONMarshal(t, &UserEmail{}, "{}") u := &UserEmail{ Email: String("qwe@qwe.qwe"), Primary: Bool(false), Verified: Bool(true), Visibility: String("yes"), } want := `{ "email": "qwe@qwe.qwe", "primary": false, "verified": true, "visibility": "yes" }` testJSONMarshal(t, u, want) } func TestUsersService_SetEmailVisibility(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &UserEmail{Visibility: String("private")} mux.HandleFunc("/user/email/visibility", func(w http.ResponseWriter, r *http.Request) { v := new(UserEmail) assertNilError(t, 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, `[{ "email": "user@example.com", "verified": false, "primary": true, "visibility": "private" }]`) }) ctx := context.Background() emails, _, err := client.Users.SetEmailVisibility(ctx, "private") if err != nil { t.Errorf("Users.SetEmailVisibility returned error: %v", err) } want := []*UserEmail{{Email: String("user@example.com"), Verified: Bool(false), Primary: Bool(true), Visibility: String("private")}} if !cmp.Equal(emails, want) { t.Errorf("Users.SetEmailVisibility returned %+v, want %+v", emails, want) } const methodName = "SetEmailVisibility" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.SetEmailVisibility(ctx, "private") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } go-github-60.0.0/github/users_followers.go000066400000000000000000000077051457013574700205560ustar00rootroot00000000000000// 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/rest/users/followers#list-followers-of-a-user // GitHub API docs: https://docs.github.com/rest/users/followers#list-followers-of-the-authenticated-user // //meta:operation GET /user/followers //meta:operation GET /users/{username}/followers 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/rest/users/followers#list-the-people-a-user-follows // GitHub API docs: https://docs.github.com/rest/users/followers#list-the-people-the-authenticated-user-follows // //meta:operation GET /user/following //meta:operation GET /users/{username}/following 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/rest/users/followers#check-if-a-person-is-followed-by-the-authenticated-user // GitHub API docs: https://docs.github.com/rest/users/followers#check-if-a-user-follows-another-user // //meta:operation GET /user/following/{username} //meta:operation GET /users/{username}/following/{target_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/rest/users/followers#follow-a-user // //meta:operation PUT /user/following/{username} 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/rest/users/followers#unfollow-a-user // //meta:operation DELETE /user/following/{username} 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-60.0.0/github/users_followers_test.go000066400000000000000000000247211457013574700216120ustar00rootroot00000000000000// 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-60.0.0/github/users_gpg_keys.go000066400000000000000000000105661457013574700203510ustar00rootroot00000000000000// 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" ) // 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"` RawKey *string `json:"raw_key,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 *Timestamp `json:"created_at,omitempty"` ExpiresAt *Timestamp `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/rest/users/gpg-keys#list-gpg-keys-for-a-user // GitHub API docs: https://docs.github.com/rest/users/gpg-keys#list-gpg-keys-for-the-authenticated-user // //meta:operation GET /user/gpg_keys //meta:operation GET /users/{username}/gpg_keys 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/rest/users/gpg-keys#get-a-gpg-key-for-the-authenticated-user // //meta:operation GET /user/gpg_keys/{gpg_key_id} 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/rest/users/gpg-keys#create-a-gpg-key-for-the-authenticated-user // //meta:operation POST /user/gpg_keys 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/rest/users/gpg-keys#delete-a-gpg-key-for-the-authenticated-user // //meta:operation DELETE /user/gpg_keys/{gpg_key_id} 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-60.0.0/github/users_gpg_keys_test.go000066400000000000000000000144511457013574700214050ustar00rootroot00000000000000// 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"` } assertNilError(t, 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) }) } func TestGPGEmail_Marshal(t *testing.T) { testJSONMarshal(t, &GPGEmail{}, "{}") u := &GPGEmail{ Email: String("email@abc.com"), Verified: Bool(false), } want := `{ "email" : "email@abc.com", "verified" : false }` testJSONMarshal(t, u, want) } func TestGPGKey_Marshal(t *testing.T) { testJSONMarshal(t, &GPGKey{}, "{}") ti := &Timestamp{} g := &GPGKey{ ID: Int64(1), PrimaryKeyID: Int64(1), KeyID: String("someKeyID"), RawKey: String("someRawKeyID"), PublicKey: String("somePublicKey"), Emails: []*GPGEmail{ { Email: String("someEmail"), Verified: Bool(true), }, }, Subkeys: []*GPGKey{ {}, }, CanSign: Bool(true), CanEncryptComms: Bool(true), CanEncryptStorage: Bool(true), CanCertify: Bool(true), CreatedAt: ti, ExpiresAt: ti, } want := `{ "id":1, "primary_key_id":1, "key_id":"someKeyID", "raw_key":"someRawKeyID", "public_key":"somePublicKey", "emails":[ { "email":"someEmail", "verified":true } ], "subkeys":[ {} ], "can_sign":true, "can_encrypt_comms":true, "can_encrypt_storage":true, "can_certify":true, "created_at":"0001-01-01T00:00:00Z", "expires_at":"0001-01-01T00:00:00Z" }` testJSONMarshal(t, g, want) } go-github-60.0.0/github/users_keys.go000066400000000000000000000062651457013574700175150ustar00rootroot00000000000000// 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"` AddedBy *string `json:"added_by,omitempty"` LastUsed *Timestamp `json:"last_used,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/rest/users/keys#list-public-keys-for-a-user // GitHub API docs: https://docs.github.com/rest/users/keys#list-public-ssh-keys-for-the-authenticated-user // //meta:operation GET /user/keys //meta:operation GET /users/{username}/keys 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/rest/users/keys#get-a-public-ssh-key-for-the-authenticated-user // //meta:operation GET /user/keys/{key_id} 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/rest/users/keys#create-a-public-ssh-key-for-the-authenticated-user // //meta:operation POST /user/keys 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/rest/users/keys#delete-a-public-ssh-key-for-the-authenticated-user // //meta:operation DELETE /user/keys/{key_id} 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-60.0.0/github/users_keys_test.go000066400000000000000000000120111457013574700205360ustar00rootroot00000000000000// 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) assertNilError(t, 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.CreateKey returned error: %v", err) } want := &Key{ID: Int64(1)} if !cmp.Equal(key, want) { t.Errorf("Users.CreateKey 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) }) } func TestKey_Marshal(t *testing.T) { testJSONMarshal(t, &Key{}, "{}") u := &Key{ ID: Int64(1), Key: String("abc"), URL: String("url"), Title: String("title"), ReadOnly: Bool(true), Verified: Bool(true), CreatedAt: &Timestamp{referenceTime}, } want := `{ "id": 1, "key": "abc", "url": "url", "title": "title", "read_only": true, "verified": true, "created_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/users_packages.go000066400000000000000000000213121457013574700203060ustar00rootroot00000000000000// 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" ) // ListPackages lists the packages for a user. Passing the empty string for "user" will // list packages for the authenticated user. // // GitHub API docs: https://docs.github.com/rest/packages/packages#list-packages-for-a-user // GitHub API docs: https://docs.github.com/rest/packages/packages#list-packages-for-the-authenticated-users-namespace // //meta:operation GET /user/packages //meta:operation GET /users/{username}/packages func (s *UsersService) ListPackages(ctx context.Context, user string, opts *PackageListOptions) ([]*Package, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/packages", user) } else { u = "user/packages" } 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 packages []*Package resp, err := s.client.Do(ctx, req, &packages) if err != nil { return nil, resp, err } return packages, resp, nil } // GetPackage gets a package by name for a user. Passing the empty string for "user" will // get the package for the authenticated user. // // GitHub API docs: https://docs.github.com/rest/packages/packages#get-a-package-for-a-user // GitHub API docs: https://docs.github.com/rest/packages/packages#get-a-package-for-the-authenticated-user // //meta:operation GET /user/packages/{package_type}/{package_name} //meta:operation GET /users/{username}/packages/{package_type}/{package_name} func (s *UsersService) GetPackage(ctx context.Context, user, packageType, packageName string) (*Package, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/packages/%v/%v", user, packageType, packageName) } else { u = fmt.Sprintf("user/packages/%v/%v", packageType, packageName) } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var pack *Package resp, err := s.client.Do(ctx, req, &pack) if err != nil { return nil, resp, err } return pack, resp, nil } // DeletePackage deletes a package from a user. Passing the empty string for "user" will // delete the package for the authenticated user. // // GitHub API docs: https://docs.github.com/rest/packages/packages#delete-a-package-for-a-user // GitHub API docs: https://docs.github.com/rest/packages/packages#delete-a-package-for-the-authenticated-user // //meta:operation DELETE /user/packages/{package_type}/{package_name} //meta:operation DELETE /users/{username}/packages/{package_type}/{package_name} func (s *UsersService) DeletePackage(ctx context.Context, user, packageType, packageName string) (*Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/packages/%v/%v", user, packageType, packageName) } else { u = fmt.Sprintf("user/packages/%v/%v", packageType, packageName) } req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // RestorePackage restores a package to a user. Passing the empty string for "user" will // restore the package for the authenticated user. // // GitHub API docs: https://docs.github.com/rest/packages/packages#restore-a-package-for-a-user // GitHub API docs: https://docs.github.com/rest/packages/packages#restore-a-package-for-the-authenticated-user // //meta:operation POST /user/packages/{package_type}/{package_name}/restore //meta:operation POST /users/{username}/packages/{package_type}/{package_name}/restore func (s *UsersService) RestorePackage(ctx context.Context, user, packageType, packageName string) (*Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/packages/%v/%v/restore", user, packageType, packageName) } else { u = fmt.Sprintf("user/packages/%v/%v/restore", packageType, packageName) } req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // PackageGetAllVersions gets all versions of a package for a user. Passing the empty string for "user" will // get versions for the authenticated user. // // GitHub API docs: https://docs.github.com/rest/packages/packages#list-package-versions-for-a-package-owned-by-a-user // GitHub API docs: https://docs.github.com/rest/packages/packages#list-package-versions-for-a-package-owned-by-the-authenticated-user // //meta:operation GET /user/packages/{package_type}/{package_name}/versions //meta:operation GET /users/{username}/packages/{package_type}/{package_name}/versions func (s *UsersService) PackageGetAllVersions(ctx context.Context, user, packageType, packageName string, opts *PackageListOptions) ([]*PackageVersion, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/packages/%v/%v/versions", user, packageType, packageName) } else { u = fmt.Sprintf("user/packages/%v/%v/versions", packageType, packageName) } 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 versions []*PackageVersion resp, err := s.client.Do(ctx, req, &versions) if err != nil { return nil, resp, err } return versions, resp, nil } // PackageGetVersion gets a specific version of a package for a user. Passing the empty string for "user" will // get the version for the authenticated user. // // GitHub API docs: https://docs.github.com/rest/packages/packages#get-a-package-version-for-a-user // GitHub API docs: https://docs.github.com/rest/packages/packages#get-a-package-version-for-the-authenticated-user // //meta:operation GET /user/packages/{package_type}/{package_name}/versions/{package_version_id} //meta:operation GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id} func (s *UsersService) PackageGetVersion(ctx context.Context, user, packageType, packageName string, packageVersionID int64) (*PackageVersion, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/packages/%v/%v/versions/%v", user, packageType, packageName, packageVersionID) } else { u = fmt.Sprintf("user/packages/%v/%v/versions/%v", packageType, packageName, packageVersionID) } req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } var version *PackageVersion resp, err := s.client.Do(ctx, req, &version) if err != nil { return nil, resp, err } return version, resp, nil } // PackageDeleteVersion deletes a package version for a user. Passing the empty string for "user" will // delete the version for the authenticated user. // // GitHub API docs: https://docs.github.com/rest/packages/packages#delete-a-package-version-for-the-authenticated-user // GitHub API docs: https://docs.github.com/rest/packages/packages#delete-package-version-for-a-user // //meta:operation DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id} //meta:operation DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id} func (s *UsersService) PackageDeleteVersion(ctx context.Context, user, packageType, packageName string, packageVersionID int64) (*Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/packages/%v/%v/versions/%v", user, packageType, packageName, packageVersionID) } else { u = fmt.Sprintf("user/packages/%v/%v/versions/%v", packageType, packageName, packageVersionID) } req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } // PackageRestoreVersion restores a package version to a user. Passing the empty string for "user" will // restore the version for the authenticated user. // // GitHub API docs: https://docs.github.com/rest/packages/packages#restore-a-package-version-for-the-authenticated-user // GitHub API docs: https://docs.github.com/rest/packages/packages#restore-package-version-for-a-user // //meta:operation POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore //meta:operation POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore func (s *UsersService) PackageRestoreVersion(ctx context.Context, user, packageType, packageName string, packageVersionID int64) (*Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/packages/%v/%v/versions/%v/restore", user, packageType, packageName, packageVersionID) } else { u = fmt.Sprintf("user/packages/%v/%v/versions/%v/restore", packageType, packageName, packageVersionID) } req, err := s.client.NewRequest("POST", u, nil) if err != nil { return nil, err } return s.client.Do(ctx, req, nil) } go-github-60.0.0/github/users_packages_test.go000066400000000000000000000601071457013574700213520ustar00rootroot00000000000000// 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 TestUsersService_Authenticated_ListPackages(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/packages", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"package_type": "container", "visibility": "private"}) fmt.Fprint(w, `[{ "id": 197, "name": "hello_docker", "package_type": "container", "version_count": 1, "visibility": "private", "url": "https://api.github.com/orgs/github/packages/container/hello_docker", "created_at": `+referenceTimeStr+`, "updated_at": `+referenceTimeStr+`, "html_url": "https://github.com/orgs/github/packages/container/package/hello_docker" }]`) }) ctx := context.Background() packages, _, err := client.Users.ListPackages(ctx, "", &PackageListOptions{PackageType: String("container"), Visibility: String("private")}) if err != nil { t.Errorf("Users.Authenticated_ListPackages returned error: %v", err) } want := []*Package{{ ID: Int64(197), Name: String("hello_docker"), PackageType: String("container"), VersionCount: Int64(1), Visibility: String("private"), URL: String("https://api.github.com/orgs/github/packages/container/hello_docker"), HTMLURL: String("https://github.com/orgs/github/packages/container/package/hello_docker"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, }} if !cmp.Equal(packages, want) { t.Errorf("Users.Authenticated_ListPackages returned %+v, want %+v", packages, want) } const methodName = "ListPackages" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.ListPackages(ctx, "\n", &PackageListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.ListPackages(ctx, "", &PackageListOptions{}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_specifiedUser_ListPackages(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/packages", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") testFormValues(t, r, values{"package_type": "container", "visibility": "public"}) fmt.Fprint(w, `[{ "id": 197, "name": "hello_docker", "package_type": "container", "version_count": 1, "visibility": "public", "url": "https://api.github.com/orgs/github/packages/container/hello_docker", "created_at": `+referenceTimeStr+`, "updated_at": `+referenceTimeStr+`, "html_url": "https://github.com/orgs/github/packages/container/package/hello_docker" }]`) }) ctx := context.Background() packages, _, err := client.Users.ListPackages(ctx, "u", &PackageListOptions{PackageType: String("container"), Visibility: String("public")}) if err != nil { t.Errorf("Users.specifiedUser_ListPackages returned error: %v", err) } want := []*Package{{ ID: Int64(197), Name: String("hello_docker"), PackageType: String("container"), VersionCount: Int64(1), Visibility: String("public"), URL: String("https://api.github.com/orgs/github/packages/container/hello_docker"), HTMLURL: String("https://github.com/orgs/github/packages/container/package/hello_docker"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, }} if !cmp.Equal(packages, want) { t.Errorf("Users.specifiedUser_ListPackages returned %+v, want %+v", packages, want) } const methodName = "ListPackages" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.ListPackages(ctx, "\n", &PackageListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.ListPackages(ctx, "", &PackageListOptions{}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_specifiedUser_GetPackage(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/packages/container/hello_docker", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "id": 197, "name": "hello_docker", "package_type": "container", "version_count": 1, "visibility": "private", "url": "https://api.github.com/orgs/github/packages/container/hello_docker", "created_at": `+referenceTimeStr+`, "updated_at": `+referenceTimeStr+`, "html_url": "https://github.com/orgs/github/packages/container/package/hello_docker" }`) }) ctx := context.Background() packages, _, err := client.Users.GetPackage(ctx, "u", "container", "hello_docker") if err != nil { t.Errorf("Users.GetPackage returned error: %v", err) } want := &Package{ ID: Int64(197), Name: String("hello_docker"), PackageType: String("container"), VersionCount: Int64(1), Visibility: String("private"), URL: String("https://api.github.com/orgs/github/packages/container/hello_docker"), HTMLURL: String("https://github.com/orgs/github/packages/container/package/hello_docker"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, } if !cmp.Equal(packages, want) { t.Errorf("Users.specifiedUser_GetPackage returned %+v, want %+v", packages, want) } const methodName = "GetPackage" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.GetPackage(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.GetPackage(ctx, "", "", "") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_Authenticated_GetPackage(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/packages/container/hello_docker", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `{ "id": 197, "name": "hello_docker", "package_type": "container", "version_count": 1, "visibility": "private", "url": "https://api.github.com/orgs/github/packages/container/hello_docker", "created_at": `+referenceTimeStr+`, "updated_at": `+referenceTimeStr+`, "html_url": "https://github.com/orgs/github/packages/container/package/hello_docker" }`) }) ctx := context.Background() packages, _, err := client.Users.GetPackage(ctx, "", "container", "hello_docker") if err != nil { t.Errorf("Users.Authenticated_GetPackage returned error: %v", err) } want := &Package{ ID: Int64(197), Name: String("hello_docker"), PackageType: String("container"), VersionCount: Int64(1), Visibility: String("private"), URL: String("https://api.github.com/orgs/github/packages/container/hello_docker"), HTMLURL: String("https://github.com/orgs/github/packages/container/package/hello_docker"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, } if !cmp.Equal(packages, want) { t.Errorf("Users.Authenticated_GetPackage returned %+v, want %+v", packages, want) } const methodName = "GetPackage" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.GetPackage(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.GetPackage(ctx, "", "", "") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_Authenticated_DeletePackage(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/packages/container/hello_docker", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Users.DeletePackage(ctx, "", "container", "hello_docker") if err != nil { t.Errorf("Users.Authenticated_DeletePackage returned error: %v", err) } const methodName = "DeletePackage" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.DeletePackage(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.DeletePackage(ctx, "", "", "") }) } func TestUsersService_specifiedUser_DeletePackage(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/packages/container/hello_docker", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Users.DeletePackage(ctx, "u", "container", "hello_docker") if err != nil { t.Errorf("Users.specifiedUser_DeletePackage returned error: %v", err) } const methodName = "DeletePackage" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.DeletePackage(ctx, "\n", "\n", "\n") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.DeletePackage(ctx, "", "", "") }) } func TestUsersService_Authenticated_RestorePackage(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/packages/container/hello_docker/restore", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") }) ctx := context.Background() _, err := client.Users.RestorePackage(ctx, "", "container", "hello_docker") if err != nil { t.Errorf("Users.Authenticated_RestorePackage returned error: %v", err) } const methodName = "RestorePackage" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.RestorePackage(ctx, "\n", "", "") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.RestorePackage(ctx, "", "container", "hello_docker") }) } func TestUsersService_specifiedUser_RestorePackage(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/packages/container/hello_docker/restore", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") }) ctx := context.Background() _, err := client.Users.RestorePackage(ctx, "u", "container", "hello_docker") if err != nil { t.Errorf("Users.specifiedUser_RestorePackage returned error: %v", err) } const methodName = "RestorePackage" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.RestorePackage(ctx, "\n", "", "") return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.RestorePackage(ctx, "", "container", "hello_docker") }) } func TestUsersService_Authenticated_ListPackagesVersions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/packages/container/hello_docker/versions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[ { "id": 45763, "name": "sha256:08a44bab0bddaddd8837a8b381aebc2e4b933768b981685a9e088360af0d3dd9", "url": "https://api.github.com/users/octocat/packages/container/hello_docker/versions/45763", "package_html_url": "https://github.com/users/octocat/packages/container/package/hello_docker", "created_at": `+referenceTimeStr+`, "updated_at": `+referenceTimeStr+`, "html_url": "https://github.com/users/octocat/packages/container/hello_docker/45763", "metadata": { "package_type": "container", "container": { "tags": [ "latest" ] } } }]`) }) ctx := context.Background() opts := &PackageListOptions{ String("internal"), String("container"), String("deleted"), ListOptions{Page: 1, PerPage: 2}, } packages, _, err := client.Users.PackageGetAllVersions(ctx, "", "container", "hello_docker", opts) if err != nil { t.Errorf("Users.Authenticated_PackageGetAllVersions returned error: %v", err) } want := []*PackageVersion{{ ID: Int64(45763), Name: String("sha256:08a44bab0bddaddd8837a8b381aebc2e4b933768b981685a9e088360af0d3dd9"), URL: String("https://api.github.com/users/octocat/packages/container/hello_docker/versions/45763"), PackageHTMLURL: String("https://github.com/users/octocat/packages/container/package/hello_docker"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HTMLURL: String("https://github.com/users/octocat/packages/container/hello_docker/45763"), Metadata: &PackageMetadata{ PackageType: String("container"), Container: &PackageContainerMetadata{ Tags: []string{"latest"}, }, }, }} if !cmp.Equal(packages, want) { t.Errorf("Users.PackageGetAllVersions returned %+v, want %+v", packages, want) } const methodName = "PackageGetAllVersions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.PackageGetAllVersions(ctx, "\n", "", "", &PackageListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.PackageGetAllVersions(ctx, "", "", "", &PackageListOptions{}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_specifiedUser_ListPackagesVersions(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/packages/container/hello_docker/versions", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[ { "id": 45763, "name": "sha256:08a44bab0bddaddd8837a8b381aebc2e4b933768b981685a9e088360af0d3dd9", "url": "https://api.github.com/users/octocat/packages/container/hello_docker/versions/45763", "package_html_url": "https://github.com/users/octocat/packages/container/package/hello_docker", "created_at": `+referenceTimeStr+`, "updated_at": `+referenceTimeStr+`, "html_url": "https://github.com/users/octocat/packages/container/hello_docker/45763", "metadata": { "package_type": "container", "container": { "tags": [ "latest" ] } } }]`) }) ctx := context.Background() opts := &PackageListOptions{ String("internal"), String("container"), String("deleted"), ListOptions{Page: 1, PerPage: 2}, } packages, _, err := client.Users.PackageGetAllVersions(ctx, "u", "container", "hello_docker", opts) if err != nil { t.Errorf("Users.specifiedUser_PackageGetAllVersions returned error: %v", err) } want := []*PackageVersion{{ ID: Int64(45763), Name: String("sha256:08a44bab0bddaddd8837a8b381aebc2e4b933768b981685a9e088360af0d3dd9"), URL: String("https://api.github.com/users/octocat/packages/container/hello_docker/versions/45763"), PackageHTMLURL: String("https://github.com/users/octocat/packages/container/package/hello_docker"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HTMLURL: String("https://github.com/users/octocat/packages/container/hello_docker/45763"), Metadata: &PackageMetadata{ PackageType: String("container"), Container: &PackageContainerMetadata{ Tags: []string{"latest"}, }, }, }} if !cmp.Equal(packages, want) { t.Errorf("Users.specifiedUser_PackageGetAllVersions returned %+v, want %+v", packages, want) } const methodName = "PackageGetAllVersions" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.PackageGetAllVersions(ctx, "\n", "", "", &PackageListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.PackageGetAllVersions(ctx, "", "", "", &PackageListOptions{}) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_Authenticated_PackageGetVersion(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/packages/container/hello_docker/versions/45763", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, ` { "id": 45763, "name": "sha256:08a44bab0bddaddd8837a8b381aebc2e4b933768b981685a9e088360af0d3dd9", "url": "https://api.github.com/users/octocat/packages/container/hello_docker/versions/45763", "package_html_url": "https://github.com/users/octocat/packages/container/package/hello_docker", "created_at": `+referenceTimeStr+`, "updated_at": `+referenceTimeStr+`, "html_url": "https://github.com/users/octocat/packages/container/hello_docker/45763", "metadata": { "package_type": "container", "container": { "tags": [ "latest" ] } } }`) }) ctx := context.Background() packages, _, err := client.Users.PackageGetVersion(ctx, "", "container", "hello_docker", 45763) if err != nil { t.Errorf("Users.PackageGetVersion returned error: %v", err) } want := &PackageVersion{ ID: Int64(45763), Name: String("sha256:08a44bab0bddaddd8837a8b381aebc2e4b933768b981685a9e088360af0d3dd9"), URL: String("https://api.github.com/users/octocat/packages/container/hello_docker/versions/45763"), PackageHTMLURL: String("https://github.com/users/octocat/packages/container/package/hello_docker"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HTMLURL: String("https://github.com/users/octocat/packages/container/hello_docker/45763"), Metadata: &PackageMetadata{ PackageType: String("container"), Container: &PackageContainerMetadata{ Tags: []string{"latest"}, }, }, } if !cmp.Equal(packages, want) { t.Errorf("Users.Authenticated_PackageGetVersion returned %+v, want %+v", packages, want) } const methodName = "PackageGetVersion" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.PackageGetVersion(ctx, "\n", "", "", 0) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.PackageGetVersion(ctx, "", "", "", 45763) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_specifiedUser_PackageGetVersion(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/packages/container/hello_docker/versions/45763", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, ` { "id": 45763, "name": "sha256:08a44bab0bddaddd8837a8b381aebc2e4b933768b981685a9e088360af0d3dd9", "url": "https://api.github.com/users/octocat/packages/container/hello_docker/versions/45763", "package_html_url": "https://github.com/users/octocat/packages/container/package/hello_docker", "created_at": `+referenceTimeStr+`, "updated_at": `+referenceTimeStr+`, "html_url": "https://github.com/users/octocat/packages/container/hello_docker/45763", "metadata": { "package_type": "container", "container": { "tags": [ "latest" ] } } }`) }) ctx := context.Background() packages, _, err := client.Users.PackageGetVersion(ctx, "u", "container", "hello_docker", 45763) if err != nil { t.Errorf("Users.specifiedUser_PackageGetVersion returned error: %v", err) } want := &PackageVersion{ ID: Int64(45763), Name: String("sha256:08a44bab0bddaddd8837a8b381aebc2e4b933768b981685a9e088360af0d3dd9"), URL: String("https://api.github.com/users/octocat/packages/container/hello_docker/versions/45763"), PackageHTMLURL: String("https://github.com/users/octocat/packages/container/package/hello_docker"), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, HTMLURL: String("https://github.com/users/octocat/packages/container/hello_docker/45763"), Metadata: &PackageMetadata{ PackageType: String("container"), Container: &PackageContainerMetadata{ Tags: []string{"latest"}, }, }, } if !cmp.Equal(packages, want) { t.Errorf("Users.specifiedUser_PackageGetVersion returned %+v, want %+v", packages, want) } const methodName = "PackageGetVersion" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.PackageGetVersion(ctx, "\n", "", "", 0) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.PackageGetVersion(ctx, "", "", "", 45763) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_Authenticated_PackageDeleteVersion(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/packages/container/hello_docker/versions/45763", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Users.PackageDeleteVersion(ctx, "", "container", "hello_docker", 45763) if err != nil { t.Errorf("Users.Authenticated_PackageDeleteVersion returned error: %v", err) } const methodName = "PackageDeleteVersion" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.PackageDeleteVersion(ctx, "\n", "", "", 0) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.PackageDeleteVersion(ctx, "", "", "", 45763) }) } func TestUsersService_specifiedUser_PackageDeleteVersion(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/packages/container/hello_docker/versions/45763", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Users.PackageDeleteVersion(ctx, "u", "container", "hello_docker", 45763) if err != nil { t.Errorf("Users.specifiedUser_PackageDeleteVersion returned error: %v", err) } const methodName = "PackageDeleteVersion" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.PackageDeleteVersion(ctx, "\n", "", "", 0) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.PackageDeleteVersion(ctx, "", "", "", 45763) }) } func TestUsersService_Authenticated_PackageRestoreVersion(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/packages/container/hello_docker/versions/45763/restore", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") }) ctx := context.Background() _, err := client.Users.PackageRestoreVersion(ctx, "", "container", "hello_docker", 45763) if err != nil { t.Errorf("Users.Authenticated_PackageRestoreVersion returned error: %v", err) } const methodName = "PackageRestoreVersion" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.PackageRestoreVersion(ctx, "\n", "", "", 0) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.PackageRestoreVersion(ctx, "", "", "", 45763) }) } func TestUsersService_specifiedUser_PackageRestoreVersion(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/packages/container/hello_docker/versions/45763/restore", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") }) ctx := context.Background() _, err := client.Users.PackageRestoreVersion(ctx, "u", "container", "hello_docker", 45763) if err != nil { t.Errorf("Users.specifiedUser_PackageRestoreVersion returned error: %v", err) } const methodName = "PackageRestoreVersion" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.PackageRestoreVersion(ctx, "\n", "", "", 0) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.PackageRestoreVersion(ctx, "", "", "", 45763) }) } go-github-60.0.0/github/users_projects.go000066400000000000000000000037341457013574700203710ustar00rootroot00000000000000// 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/rest/projects/projects#list-user-projects // //meta:operation GET /users/{username}/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/rest/projects/projects#create-a-user-project // //meta:operation POST /user/projects 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-60.0.0/github/users_projects_test.go000066400000000000000000000056271457013574700214330ustar00rootroot00000000000000// 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{} assertNilError(t, 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 }) } func TestCreateUserProjectOptions_Marshal(t *testing.T) { testJSONMarshal(t, &CreateUserProjectOptions{}, `{}`) c := CreateUserProjectOptions{ Name: "SomeProject", Body: String("SomeProjectBody"), } want := `{ "name": "SomeProject", "body": "SomeProjectBody" }` testJSONMarshal(t, c, want) } go-github-60.0.0/github/users_ssh_signing_keys.go000066400000000000000000000066001457013574700221010ustar00rootroot00000000000000// Copyright 2022 The go-github 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" ) // SSHSigningKey represents a public SSH key used to sign git commits. type SSHSigningKey struct { ID *int64 `json:"id,omitempty"` Key *string `json:"key,omitempty"` Title *string `json:"title,omitempty"` CreatedAt *Timestamp `json:"created_at,omitempty"` } func (k SSHSigningKey) String() string { return Stringify(k) } // ListSSHSigningKeys lists the SSH signing keys for a user. Passing an empty // username string will fetch SSH signing keys for the authenticated user. // // GitHub API docs: https://docs.github.com/rest/users/ssh-signing-keys#list-ssh-signing-keys-for-a-user // GitHub API docs: https://docs.github.com/rest/users/ssh-signing-keys#list-ssh-signing-keys-for-the-authenticated-user // //meta:operation GET /user/ssh_signing_keys //meta:operation GET /users/{username}/ssh_signing_keys func (s *UsersService) ListSSHSigningKeys(ctx context.Context, user string, opts *ListOptions) ([]*SSHSigningKey, *Response, error) { var u string if user != "" { u = fmt.Sprintf("users/%v/ssh_signing_keys", user) } else { u = "user/ssh_signing_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 []*SSHSigningKey resp, err := s.client.Do(ctx, req, &keys) if err != nil { return nil, resp, err } return keys, resp, nil } // GetSSHSigningKey fetches a single SSH signing key for the authenticated user. // // GitHub API docs: https://docs.github.com/rest/users/ssh-signing-keys#get-an-ssh-signing-key-for-the-authenticated-user // //meta:operation GET /user/ssh_signing_keys/{ssh_signing_key_id} func (s *UsersService) GetSSHSigningKey(ctx context.Context, id int64) (*SSHSigningKey, *Response, error) { u := fmt.Sprintf("user/ssh_signing_keys/%v", id) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } key := new(SSHSigningKey) resp, err := s.client.Do(ctx, req, key) if err != nil { return nil, resp, err } return key, resp, nil } // CreateSSHSigningKey adds a SSH signing key for the authenticated user. // // GitHub API docs: https://docs.github.com/rest/users/ssh-signing-keys#create-a-ssh-signing-key-for-the-authenticated-user // //meta:operation POST /user/ssh_signing_keys func (s *UsersService) CreateSSHSigningKey(ctx context.Context, key *Key) (*SSHSigningKey, *Response, error) { u := "user/ssh_signing_keys" req, err := s.client.NewRequest("POST", u, key) if err != nil { return nil, nil, err } k := new(SSHSigningKey) resp, err := s.client.Do(ctx, req, k) if err != nil { return nil, resp, err } return k, resp, nil } // DeleteSSHSigningKey deletes a SSH signing key for the authenticated user. // // GitHub API docs: https://docs.github.com/rest/users/ssh-signing-keys#delete-an-ssh-signing-key-for-the-authenticated-user // //meta:operation DELETE /user/ssh_signing_keys/{ssh_signing_key_id} func (s *UsersService) DeleteSSHSigningKey(ctx context.Context, id int64) (*Response, error) { u := fmt.Sprintf("user/ssh_signing_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-60.0.0/github/users_ssh_signing_keys_test.go000066400000000000000000000124461457013574700231450ustar00rootroot00000000000000// Copyright 2022 The go-github 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_ListSSHSigningKeys_authenticatedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/ssh_signing_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.ListSSHSigningKeys(ctx, "", opt) if err != nil { t.Errorf("Users.ListSSHSigningKeys returned error: %v", err) } want := []*SSHSigningKey{{ID: Int64(1)}} if !cmp.Equal(keys, want) { t.Errorf("Users.ListSSHSigningKeys returned %+v, want %+v", keys, want) } const methodName = "ListSSHSigningKeys" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.ListSSHSigningKeys(ctx, "\n", opt) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.ListSSHSigningKeys(ctx, "", opt) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_ListSSHSigningKeys_specifiedUser(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/users/u/ssh_signing_keys", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") fmt.Fprint(w, `[{"id":1}]`) }) ctx := context.Background() keys, _, err := client.Users.ListSSHSigningKeys(ctx, "u", nil) if err != nil { t.Errorf("Users.ListSSHSigningKeys returned error: %v", err) } want := []*SSHSigningKey{{ID: Int64(1)}} if !cmp.Equal(keys, want) { t.Errorf("Users.ListSSHSigningKeys returned %+v, want %+v", keys, want) } } func TestUsersService_ListSSHSigningKeys_invalidUser(t *testing.T) { client, _, _, teardown := setup() defer teardown() ctx := context.Background() _, _, err := client.Users.ListSSHSigningKeys(ctx, "%", nil) testURLParseError(t, err) } func TestUsersService_GetSSHSigningKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/ssh_signing_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.GetSSHSigningKey(ctx, 1) if err != nil { t.Errorf("Users.GetSSHSigningKey returned error: %v", err) } want := &SSHSigningKey{ID: Int64(1)} if !cmp.Equal(key, want) { t.Errorf("Users.GetSSHSigningKey returned %+v, want %+v", key, want) } const methodName = "GetSSHSigningKey" testBadOptions(t, methodName, func() (err error) { _, _, err = client.Users.GetSSHSigningKey(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { got, resp, err := client.Users.GetSSHSigningKey(ctx, 1) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } return resp, err }) } func TestUsersService_CreateSSHSigningKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() input := &Key{Key: String("k"), Title: String("t")} mux.HandleFunc("/user/ssh_signing_keys", func(w http.ResponseWriter, r *http.Request) { v := new(Key) assertNilError(t, 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.CreateSSHSigningKey(ctx, input) if err != nil { t.Errorf("Users.CreateSSHSigningKey returned error: %v", err) } want := &SSHSigningKey{ID: Int64(1)} if !cmp.Equal(key, want) { t.Errorf("Users.CreateSSHSigningKey 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_DeleteSSHSigningKey(t *testing.T) { client, mux, _, teardown := setup() defer teardown() mux.HandleFunc("/user/ssh_signing_keys/1", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "DELETE") }) ctx := context.Background() _, err := client.Users.DeleteSSHSigningKey(ctx, 1) if err != nil { t.Errorf("Users.DeleteSSHSigningKey returned error: %v", err) } const methodName = "DeleteSSHSigningKey" testBadOptions(t, methodName, func() (err error) { _, err = client.Users.DeleteSSHSigningKey(ctx, -1) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { return client.Users.DeleteSSHSigningKey(ctx, 1) }) } func TestSSHSigningKey_Marshal(t *testing.T) { testJSONMarshal(t, &SSHSigningKey{}, "{}") u := &Key{ ID: Int64(1), Key: String("abc"), Title: String("title"), CreatedAt: &Timestamp{referenceTime}, } want := `{ "id": 1, "key": "abc", "title": "title", "created_at": ` + referenceTimeStr + ` }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/users_test.go000066400000000000000000000330161457013574700175130ustar00rootroot00000000000000// 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) u2 := &User{ Login: String("testLogin"), ID: Int64(1), NodeID: String("testNode123"), AvatarURL: String("https://www.my-avatar.com"), HTMLURL: String("https://www.test-url.com"), GravatarID: String("testGravatar123"), Name: String("myName"), Company: String("testCompany"), Blog: String("test Blog"), Location: String("test location"), Email: String("test@test.com"), Hireable: Bool(true), Bio: String("my good bio"), TwitterUsername: String("https://www.twitter.com/test"), PublicRepos: Int(1), PublicGists: Int(2), Followers: Int(100), Following: Int(29), CreatedAt: &Timestamp{referenceTime}, UpdatedAt: &Timestamp{referenceTime}, SuspendedAt: &Timestamp{referenceTime}, Type: String("test type"), SiteAdmin: Bool(false), TotalPrivateRepos: Int64(2), OwnedPrivateRepos: Int64(1), PrivateGists: Int(1), DiskUsage: Int(1), Collaborators: Int(1), TwoFactorAuthentication: Bool(false), Plan: &Plan{ Name: String("silver"), Space: Int(1024), Collaborators: Int(10), PrivateRepos: Int64(4), FilledSeats: Int(24), Seats: Int(1), }, LdapDn: String("test ldap"), } want2 := `{ "login": "testLogin", "id": 1, "node_id":"testNode123", "avatar_url": "https://www.my-avatar.com", "html_url":"https://www.test-url.com", "gravatar_id": "testGravatar123", "name": "myName", "company": "testCompany", "blog": "test Blog", "location": "test location", "email": "test@test.com", "hireable": true, "bio": "my good bio", "twitter_username": "https://www.twitter.com/test", "public_repos": 1, "public_gists":2, "followers": 100, "following": 29, "created_at": ` + referenceTimeStr + `, "suspended_at": ` + referenceTimeStr + `, "updated_at": ` + referenceTimeStr + `, "type": "test type", "site_admin": false, "total_private_repos": 2, "owned_private_repos": 1, "private_gists": 1, "disk_usage": 1, "collaborators": 1, "two_factor_authentication": false, "plan": { "name": "silver", "space": 1024, "collaborators": 10, "private_repos": 4, "filled_seats": 24, "seats": 1 }, "ldap_dn": "test ldap" }` testJSONMarshal(t, u2, want2) } 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) assertNilError(t, 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) }) } func TestUserContext_Marshal(t *testing.T) { testJSONMarshal(t, &UserContext{}, "{}") u := &UserContext{ Message: String("message"), Octicon: String("message"), } want := `{ "message" : "message", "octicon" : "message" }` testJSONMarshal(t, u, want) } func TestHovercard_Marshal(t *testing.T) { testJSONMarshal(t, &Hovercard{}, "{}") h := &Hovercard{ Contexts: []*UserContext{ { Message: String("someMessage"), Octicon: String("someOcticon"), }, }, } want := `{ "contexts" : [ { "message" : "someMessage", "octicon" : "someOcticon" } ] }` testJSONMarshal(t, h, want) } func TestUserListOptions_Marshal(t *testing.T) { testJSONMarshal(t, &UserListOptions{}, "{}") u := &UserListOptions{ Since: int64(1900), ListOptions: ListOptions{ Page: int(1), PerPage: int(10), }, } want := `{ "since" : 1900, "page": 1, "perPage": 10 }` testJSONMarshal(t, u, want) } func TestHovercardOptions_Marshal(t *testing.T) { testJSONMarshal(t, &HovercardOptions{}, "{}") u := &HovercardOptions{ SubjectType: "subjectType", SubjectID: "subjectID", } want := `{ "SubjectType" : "subjectType", "SubjectID" : "subjectID" }` testJSONMarshal(t, u, want) } go-github-60.0.0/github/with_appengine.go000066400000000000000000000007441457013574700203160ustar00rootroot00000000000000// 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-60.0.0/github/without_appengine.go000066400000000000000000000006701457013574700210440ustar00rootroot00000000000000// 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-60.0.0/go.mod000066400000000000000000000002071457013574700146040ustar00rootroot00000000000000module github.com/google/go-github/v60 require ( github.com/google/go-cmp v0.6.0 github.com/google/go-querystring v1.1.0 ) go 1.21 go-github-60.0.0/go.sum000066400000000000000000000010441457013574700146310ustar00rootroot00000000000000github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= go-github-60.0.0/openapi_operations.yaml000066400000000000000000012607631457013574700203000ustar00rootroot00000000000000operations: - name: POST /hub documentation_url: https://docs.github.com/webhooks/about-webhooks-for-repositories#pubsubhubbub - name: GET /organizations/{organization_id} - name: GET /orgs/{org}/actions/required_workflows documentation_url: https://docs.github.com/actions/using-workflows/required-workflows - name: POST /orgs/{org}/actions/required_workflows documentation_url: https://docs.github.com/actions/using-workflows/required-workflows - name: DELETE /orgs/{org}/actions/required_workflows/{workflow_id} documentation_url: https://docs.github.com/actions/using-workflows/required-workflows - name: GET /orgs/{org}/actions/required_workflows/{workflow_id} documentation_url: https://docs.github.com/actions/using-workflows/required-workflows - name: PATCH /orgs/{org}/actions/required_workflows/{workflow_id} documentation_url: https://docs.github.com/actions/using-workflows/required-workflows - name: GET /orgs/{org}/actions/required_workflows/{workflow_id}/repositories documentation_url: https://docs.github.com/actions/using-workflows/required-workflows - name: PUT /orgs/{org}/actions/required_workflows/{workflow_id}/repositories documentation_url: https://docs.github.com/actions/using-workflows/required-workflows - name: DELETE /orgs/{org}/actions/required_workflows/{workflow_id}/repositories/{repository_id} documentation_url: https://docs.github.com/actions/using-workflows/required-workflows - name: PUT /orgs/{org}/actions/required_workflows/{workflow_id}/repositories/{repository_id} documentation_url: https://docs.github.com/actions/using-workflows/required-workflows - name: GET /repos/{owner}/{repo}/actions/required_workflows documentation_url: https://docs.github.com/actions/using-workflows/required-workflows - name: GET /repos/{owner}/{repo}/import/issues documentation_url: https://gist.github.com/jonmagic/5282384165e0f86ef105#check-status-of-multiple-issues - name: POST /repos/{owner}/{repo}/import/issues documentation_url: https://gist.github.com/jonmagic/5282384165e0f86ef105#start-an-issue-import - name: GET /repos/{owner}/{repo}/import/issues/{issue_number} documentation_url: https://gist.github.com/jonmagic/5282384165e0f86ef105#import-status-request - name: GET /repositories/{repository_id} - name: GET /repositories/{repository_id}/installation - name: GET /user/{user_id} operation_overrides: - name: GET /meta documentation_url: https://docs.github.com/rest/meta/meta#get-github-meta-information - name: DELETE /repos/{owner}/{repo}/pages documentation_url: https://docs.github.com/rest/pages/pages#delete-a-github-pages-site - name: GET /repos/{owner}/{repo}/pages documentation_url: https://docs.github.com/rest/pages/pages#get-a-github-pages-site - name: POST /repos/{owner}/{repo}/pages documentation_url: https://docs.github.com/rest/pages/pages#create-a-github-pages-site - name: PUT /repos/{owner}/{repo}/pages documentation_url: https://docs.github.com/rest/pages/pages#update-information-about-a-github-pages-site - name: GET /repos/{owner}/{repo}/pages/builds documentation_url: https://docs.github.com/rest/pages/pages#list-github-pages-builds - name: POST /repos/{owner}/{repo}/pages/builds documentation_url: https://docs.github.com/rest/pages/pages#request-a-github-pages-build - name: GET /repos/{owner}/{repo}/pages/builds/{build_id} documentation_url: https://docs.github.com/rest/pages/pages#get-github-pages-build openapi_commit: 6922a6cfe785e1069e93d6e501805cf6e1891076 openapi_operations: - name: GET / documentation_url: https://docs.github.com/rest/meta/meta#github-api-root openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /admin/hooks documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/global-webhooks#list-global-webhooks openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /admin/hooks documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/global-webhooks#create-a-global-webhook openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /admin/hooks/{hook_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/global-webhooks#delete-a-global-webhook openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /admin/hooks/{hook_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/global-webhooks#get-a-global-webhook openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /admin/hooks/{hook_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/global-webhooks#update-a-global-webhook openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /admin/hooks/{hook_id}/pings documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/global-webhooks#ping-a-global-webhook openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /admin/keys documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#list-public-keys openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /admin/keys/{key_ids} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#delete-a-public-key openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /admin/ldap/teams/{team_id}/mapping documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/ldap#update-ldap-mapping-for-a-team openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /admin/ldap/teams/{team_id}/sync documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/ldap#sync-ldap-mapping-for-a-team openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /admin/ldap/users/{username}/mapping documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/ldap#update-ldap-mapping-for-a-user openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /admin/ldap/users/{username}/sync documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/ldap#sync-ldap-mapping-for-a-user openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /admin/organizations documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/orgs#create-an-organization openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /admin/organizations/{org} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/orgs#update-an-organization-name openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /admin/pre-receive-environments documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/pre-receive-environments#list-pre-receive-environments openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /admin/pre-receive-environments documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/pre-receive-environments#create-a-pre-receive-environment openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /admin/pre-receive-environments/{pre_receive_environment_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/pre-receive-environments#delete-a-pre-receive-environment openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /admin/pre-receive-environments/{pre_receive_environment_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/pre-receive-environments#get-a-pre-receive-environment openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /admin/pre-receive-environments/{pre_receive_environment_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/pre-receive-environments#update-a-pre-receive-environment openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /admin/pre-receive-environments/{pre_receive_environment_id}/downloads documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/pre-receive-environments#start-a-pre-receive-environment-download openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /admin/pre-receive-environments/{pre_receive_environment_id}/downloads/latest documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/pre-receive-environments#get-the-download-status-for-a-pre-receive-environment openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /admin/pre-receive-hooks documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/pre-receive-hooks#list-pre-receive-hooks openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /admin/pre-receive-hooks documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/pre-receive-hooks#create-a-pre-receive-hook openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /admin/pre-receive-hooks/{pre_receive_hook_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/pre-receive-hooks#delete-a-pre-receive-hook openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /admin/pre-receive-hooks/{pre_receive_hook_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/pre-receive-hooks#get-a-pre-receive-hook openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /admin/pre-receive-hooks/{pre_receive_hook_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/pre-receive-hooks#update-a-pre-receive-hook openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /admin/tokens documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#list-personal-access-tokens openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /admin/tokens/{token_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#delete-a-personal-access-token openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /admin/users documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#create-a-user openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /admin/users/{username} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#delete-a-user openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /admin/users/{username} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#update-the-username-for-a-user openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /admin/users/{username}/authorizations documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#delete-an-impersonation-oauth-token openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /admin/users/{username}/authorizations documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#create-an-impersonation-oauth-token openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /advisories documentation_url: https://docs.github.com/rest/security-advisories/global-advisories#list-global-security-advisories openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /advisories/{ghsa_id} documentation_url: https://docs.github.com/rest/security-advisories/global-advisories#get-a-global-security-advisory openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /app documentation_url: https://docs.github.com/rest/apps/apps#get-the-authenticated-app openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /app-manifests/{code}/conversions documentation_url: https://docs.github.com/rest/apps/apps#create-a-github-app-from-a-manifest openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /app/hook/config documentation_url: https://docs.github.com/rest/apps/webhooks#get-a-webhook-configuration-for-an-app openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /app/hook/config documentation_url: https://docs.github.com/rest/apps/webhooks#update-a-webhook-configuration-for-an-app openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /app/hook/deliveries documentation_url: https://docs.github.com/rest/apps/webhooks#list-deliveries-for-an-app-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /app/hook/deliveries/{delivery_id} documentation_url: https://docs.github.com/rest/apps/webhooks#get-a-delivery-for-an-app-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /app/hook/deliveries/{delivery_id}/attempts documentation_url: https://docs.github.com/rest/apps/webhooks#redeliver-a-delivery-for-an-app-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /app/installation-requests documentation_url: https://docs.github.com/rest/apps/apps#list-installation-requests-for-the-authenticated-app openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /app/installations documentation_url: https://docs.github.com/rest/apps/apps#list-installations-for-the-authenticated-app openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /app/installations/{installation_id} documentation_url: https://docs.github.com/rest/apps/apps#delete-an-installation-for-the-authenticated-app openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /app/installations/{installation_id} documentation_url: https://docs.github.com/rest/apps/apps#get-an-installation-for-the-authenticated-app openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /app/installations/{installation_id}/access_tokens documentation_url: https://docs.github.com/rest/apps/apps#create-an-installation-access-token-for-an-app openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /app/installations/{installation_id}/suspended documentation_url: https://docs.github.com/rest/apps/apps#unsuspend-an-app-installation openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /app/installations/{installation_id}/suspended documentation_url: https://docs.github.com/rest/apps/apps#suspend-an-app-installation openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /applications/grants documentation_url: https://docs.github.com/enterprise-server@3.11/rest/oauth-authorizations/oauth-authorizations#list-your-grants openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /applications/grants/{grant_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/oauth-authorizations/oauth-authorizations#delete-a-grant openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /applications/grants/{grant_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/oauth-authorizations/oauth-authorizations#get-a-single-grant openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /applications/{client_id}/grant documentation_url: https://docs.github.com/rest/apps/oauth-applications#delete-an-app-authorization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /applications/{client_id}/grants/{access_token} documentation_url: https://docs.github.com/enterprise-server@3.3/rest/reference/apps#revoke-a-grant-for-an-application openapi_files: - descriptions/ghes-3.3/ghes-3.3.json - name: DELETE /applications/{client_id}/token documentation_url: https://docs.github.com/rest/apps/oauth-applications#delete-an-app-token openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /applications/{client_id}/token documentation_url: https://docs.github.com/rest/apps/oauth-applications#reset-a-token openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /applications/{client_id}/token documentation_url: https://docs.github.com/rest/apps/oauth-applications#check-a-token openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /applications/{client_id}/token/scoped documentation_url: https://docs.github.com/rest/apps/apps#create-a-scoped-access-token openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /applications/{client_id}/tokens/{access_token} documentation_url: https://docs.github.com/enterprise-server@3.3/rest/reference/apps#revoke-an-authorization-for-an-application openapi_files: - descriptions/ghes-3.3/ghes-3.3.json - name: GET /applications/{client_id}/tokens/{access_token} documentation_url: https://docs.github.com/enterprise-server@3.3/rest/reference/apps#check-an-authorization openapi_files: - descriptions/ghes-3.3/ghes-3.3.json - name: POST /applications/{client_id}/tokens/{access_token} documentation_url: https://docs.github.com/enterprise-server@3.3/rest/reference/apps#reset-an-authorization openapi_files: - descriptions/ghes-3.3/ghes-3.3.json - name: GET /apps/{app_slug} documentation_url: https://docs.github.com/rest/apps/apps#get-an-app openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /assignments/{assignment_id} documentation_url: https://docs.github.com/rest/classroom/classroom#get-an-assignment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /assignments/{assignment_id}/accepted_assignments documentation_url: https://docs.github.com/rest/classroom/classroom#list-accepted-assignments-for-an-assignment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /assignments/{assignment_id}/grades documentation_url: https://docs.github.com/rest/classroom/classroom#get-assignment-grades openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /authorizations documentation_url: https://docs.github.com/enterprise-server@3.11/rest/oauth-authorizations/oauth-authorizations#list-your-authorizations openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /authorizations documentation_url: https://docs.github.com/enterprise-server@3.11/rest/oauth-authorizations/oauth-authorizations#create-a-new-authorization openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /authorizations/clients/{client_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/oauth-authorizations/oauth-authorizations#get-or-create-an-authorization-for-a-specific-app openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /authorizations/clients/{client_id}/{fingerprint} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/oauth-authorizations/oauth-authorizations#get-or-create-an-authorization-for-a-specific-app-and-fingerprint openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /authorizations/{authorization_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/oauth-authorizations/oauth-authorizations#delete-an-authorization openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /authorizations/{authorization_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/oauth-authorizations/oauth-authorizations#get-a-single-authorization openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /authorizations/{authorization_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/oauth-authorizations/oauth-authorizations#update-an-existing-authorization openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /classrooms documentation_url: https://docs.github.com/rest/classroom/classroom#list-classrooms openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /classrooms/{classroom_id} documentation_url: https://docs.github.com/rest/classroom/classroom#get-a-classroom openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /classrooms/{classroom_id}/assignments documentation_url: https://docs.github.com/rest/classroom/classroom#list-assignments-for-a-classroom openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /codes_of_conduct documentation_url: https://docs.github.com/rest/codes-of-conduct/codes-of-conduct#get-all-codes-of-conduct openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /codes_of_conduct/{key} documentation_url: https://docs.github.com/rest/codes-of-conduct/codes-of-conduct#get-a-code-of-conduct openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /emojis documentation_url: https://docs.github.com/rest/emojis/emojis#get-emojis openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprise-installation/{enterprise_or_org}/server-statistics documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/admin-stats#get-github-enterprise-server-statistics openapi_files: - descriptions/ghec/ghec.json - name: DELETE /enterprise/announcement documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/announcement#remove-the-global-announcement-banner openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprise/announcement documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/announcement#get-the-global-announcement-banner openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /enterprise/announcement documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/announcement#set-the-global-announcement-banner openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprise/settings/license documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/license#get-license-information openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprise/stats/all documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/admin-stats#get-all-statistics openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprise/stats/comments documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/admin-stats#get-comment-statistics openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprise/stats/gists documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/admin-stats#get-gist-statistics openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprise/stats/hooks documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/admin-stats#get-hooks-statistics openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprise/stats/issues documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/admin-stats#get-issue-statistics openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprise/stats/milestones documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/admin-stats#get-milestone-statistics openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprise/stats/orgs documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/admin-stats#get-organization-statistics openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprise/stats/pages documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/admin-stats#get-pages-statistics openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprise/stats/pulls documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/admin-stats#get-pull-request-statistics openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprise/stats/repos documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/admin-stats#get-repository-statistics openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprise/stats/security-products documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/admin-stats#get-security-products-statistics openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprise/stats/users documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/admin-stats#get-users-statistics openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/actions/cache/usage documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/cache#get-github-actions-cache-usage-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/actions/cache/usage-policy documentation_url: https://docs.github.com/enterprise-server@3.11/rest/actions/cache#get-github-actions-cache-usage-policy-for-an-enterprise openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /enterprises/{enterprise}/actions/cache/usage-policy documentation_url: https://docs.github.com/enterprise-server@3.11/rest/actions/cache#set-github-actions-cache-usage-policy-for-an-enterprise openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /enterprises/{enterprise}/actions/oidc/customization/issuer documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/oidc#set-the-github-actions-oidc-custom-issuer-policy-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - name: GET /enterprises/{enterprise}/actions/permissions documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/permissions#get-github-actions-permissions-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /enterprises/{enterprise}/actions/permissions documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/permissions#set-github-actions-permissions-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/actions/permissions/organizations documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/permissions#list-selected-organizations-enabled-for-github-actions-in-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /enterprises/{enterprise}/actions/permissions/organizations documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/permissions#set-selected-organizations-enabled-for-github-actions-in-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /enterprises/{enterprise}/actions/permissions/organizations/{org_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/permissions#disable-a-selected-organization-for-github-actions-in-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /enterprises/{enterprise}/actions/permissions/organizations/{org_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/permissions#enable-a-selected-organization-for-github-actions-in-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/actions/permissions/selected-actions documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/permissions#get-allowed-actions-and-reusable-workflows-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /enterprises/{enterprise}/actions/permissions/selected-actions documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/permissions#set-allowed-actions-and-reusable-workflows-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/actions/permissions/workflow documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/permissions#get-default-workflow-permissions-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /enterprises/{enterprise}/actions/permissions/workflow documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/permissions#set-default-workflow-permissions-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/actions/runner-groups documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#list-self-hosted-runner-groups-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /enterprises/{enterprise}/actions/runner-groups documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#create-a-self-hosted-runner-group-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /enterprises/{enterprise}/actions/runner-groups/{runner_group_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#delete-a-self-hosted-runner-group-from-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#get-a-self-hosted-runner-group-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /enterprises/{enterprise}/actions/runner-groups/{runner_group_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#update-a-self-hosted-runner-group-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#list-organization-access-to-a-self-hosted-runner-group-in-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#set-organization-access-for-a-self-hosted-runner-group-in-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations/{org_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#remove-organization-access-to-a-self-hosted-runner-group-in-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations/{org_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#add-organization-access-to-a-self-hosted-runner-group-in-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#list-self-hosted-runners-in-a-group-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#set-self-hosted-runners-in-a-group-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners/{runner_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#remove-a-self-hosted-runner-from-a-group-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners/{runner_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#add-a-self-hosted-runner-to-a-group-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/actions/runners documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runners#list-self-hosted-runners-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/actions/runners/downloads documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runners#list-runner-applications-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /enterprises/{enterprise}/actions/runners/generate-jitconfig documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runners#create-configuration-for-a-just-in-time-runner-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /enterprises/{enterprise}/actions/runners/registration-token documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runners#create-a-registration-token-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /enterprises/{enterprise}/actions/runners/remove-token documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runners#create-a-remove-token-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /enterprises/{enterprise}/actions/runners/{runner_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runners#delete-a-self-hosted-runner-from-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/actions/runners/{runner_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runners#get-a-self-hosted-runner-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runners#remove-all-custom-labels-from-a-self-hosted-runner-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/actions/runners/{runner_id}/labels documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runners#list-labels-for-a-self-hosted-runner-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /enterprises/{enterprise}/actions/runners/{runner_id}/labels documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runners#add-custom-labels-to-a-self-hosted-runner-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /enterprises/{enterprise}/actions/runners/{runner_id}/labels documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runners#set-custom-labels-for-a-self-hosted-runner-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels/{name} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runners#remove-a-custom-label-from-a-self-hosted-runner-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /enterprises/{enterprise}/announcement documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/announcement-banners/enterprises#remove-announcement-banner-from-enterprise openapi_files: - descriptions/ghec/ghec.json - name: GET /enterprises/{enterprise}/announcement documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/announcement-banners/enterprises#get-announcement-banner-for-enterprise openapi_files: - descriptions/ghec/ghec.json - name: PATCH /enterprises/{enterprise}/announcement documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/announcement-banners/enterprises#set-announcement-banner-for-enterprise openapi_files: - descriptions/ghec/ghec.json - name: GET /enterprises/{enterprise}/audit-log documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/audit-log#get-the-audit-log-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/code-scanning/alerts documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/code-scanning/code-scanning#list-code-scanning-alerts-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/code_security_and_analysis documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/code-security-and-analysis#get-code-security-and-analysis-features-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /enterprises/{enterprise}/code_security_and_analysis documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/code-security-and-analysis#update-code-security-and-analysis-features-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/consumed-licenses documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/license#list-enterprise-consumed-licenses openapi_files: - descriptions/ghec/ghec.json - name: GET /enterprises/{enterprise}/dependabot/alerts documentation_url: https://docs.github.com/rest/dependabot/alerts#list-dependabot-alerts-for-an-enterprise openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/license-sync-status documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/license#get-a-license-sync-status openapi_files: - descriptions/ghec/ghec.json - name: GET /enterprises/{enterprise}/secret-scanning/alerts documentation_url: https://docs.github.com/rest/secret-scanning/secret-scanning#list-secret-scanning-alerts-for-an-enterprise openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/settings/billing/actions documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/billing#get-github-actions-billing-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - name: GET /enterprises/{enterprise}/settings/billing/advanced-security documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/billing#get-github-advanced-security-active-committers-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /enterprises/{enterprise}/settings/billing/packages documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/billing#get-github-packages-billing-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - name: GET /enterprises/{enterprise}/settings/billing/shared-storage documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/billing#get-shared-storage-billing-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - name: POST /enterprises/{enterprise}/{security_product}/{enablement} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/code-security-and-analysis#enable-or-disable-a-security-feature openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /events documentation_url: https://docs.github.com/rest/activity/events#list-public-events openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /feeds documentation_url: https://docs.github.com/rest/activity/feeds#get-feeds openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /gists documentation_url: https://docs.github.com/rest/gists/gists#list-gists-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /gists documentation_url: https://docs.github.com/rest/gists/gists#create-a-gist openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /gists/public documentation_url: https://docs.github.com/rest/gists/gists#list-public-gists openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /gists/starred documentation_url: https://docs.github.com/rest/gists/gists#list-starred-gists openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /gists/{gist_id} documentation_url: https://docs.github.com/rest/gists/gists#delete-a-gist openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /gists/{gist_id} documentation_url: https://docs.github.com/rest/gists/gists#get-a-gist openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /gists/{gist_id} documentation_url: https://docs.github.com/rest/gists/gists#update-a-gist openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /gists/{gist_id}/comments documentation_url: https://docs.github.com/rest/gists/comments#list-gist-comments openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /gists/{gist_id}/comments documentation_url: https://docs.github.com/rest/gists/comments#create-a-gist-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /gists/{gist_id}/comments/{comment_id} documentation_url: https://docs.github.com/rest/gists/comments#delete-a-gist-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /gists/{gist_id}/comments/{comment_id} documentation_url: https://docs.github.com/rest/gists/comments#get-a-gist-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /gists/{gist_id}/comments/{comment_id} documentation_url: https://docs.github.com/rest/gists/comments#update-a-gist-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /gists/{gist_id}/commits documentation_url: https://docs.github.com/rest/gists/gists#list-gist-commits openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /gists/{gist_id}/forks documentation_url: https://docs.github.com/rest/gists/gists#list-gist-forks openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /gists/{gist_id}/forks documentation_url: https://docs.github.com/rest/gists/gists#fork-a-gist openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /gists/{gist_id}/star documentation_url: https://docs.github.com/rest/gists/gists#unstar-a-gist openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /gists/{gist_id}/star documentation_url: https://docs.github.com/rest/gists/gists#check-if-a-gist-is-starred openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /gists/{gist_id}/star documentation_url: https://docs.github.com/rest/gists/gists#star-a-gist openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /gists/{gist_id}/{sha} documentation_url: https://docs.github.com/rest/gists/gists#get-a-gist-revision openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /gitignore/templates documentation_url: https://docs.github.com/rest/gitignore/gitignore#get-all-gitignore-templates openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /gitignore/templates/{name} documentation_url: https://docs.github.com/rest/gitignore/gitignore#get-a-gitignore-template openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /installation/repositories documentation_url: https://docs.github.com/rest/apps/installations#list-repositories-accessible-to-the-app-installation openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /installation/token documentation_url: https://docs.github.com/rest/apps/installations#revoke-an-installation-access-token openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /issues documentation_url: https://docs.github.com/rest/issues/issues#list-issues-assigned-to-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /licenses documentation_url: https://docs.github.com/rest/licenses/licenses#get-all-commonly-used-licenses openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /licenses/{license} documentation_url: https://docs.github.com/rest/licenses/licenses#get-a-license openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /manage/v1/config/nodes documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/manage-ghes#get-ghes-node-metadata-for-all-nodes openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /manage/v1/maintenance documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/manage-ghes#get-the-status-of-maintenance-mode openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /manage/v1/maintenance documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/manage-ghes#set-the-status-of-maintenance-mode openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /manage/v1/replication/status documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/manage-ghes#get-the-status-of-services-running-on-all-replica-nodes openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /manage/v1/version documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/manage-ghes#get-all-ghes-release-versions-for-all-nodes openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /markdown documentation_url: https://docs.github.com/rest/markdown/markdown#render-a-markdown-document openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /markdown/raw documentation_url: https://docs.github.com/rest/markdown/markdown#render-a-markdown-document-in-raw-mode openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /marketplace_listing/accounts/{account_id} documentation_url: https://docs.github.com/rest/apps/marketplace#get-a-subscription-plan-for-an-account openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /marketplace_listing/plans documentation_url: https://docs.github.com/rest/apps/marketplace#list-plans openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /marketplace_listing/plans/{plan_id}/accounts documentation_url: https://docs.github.com/rest/apps/marketplace#list-accounts-for-a-plan openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /marketplace_listing/stubbed/accounts/{account_id} documentation_url: https://docs.github.com/rest/apps/marketplace#get-a-subscription-plan-for-an-account-stubbed openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /marketplace_listing/stubbed/plans documentation_url: https://docs.github.com/rest/apps/marketplace#list-plans-stubbed openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /marketplace_listing/stubbed/plans/{plan_id}/accounts documentation_url: https://docs.github.com/rest/apps/marketplace#list-accounts-for-a-plan-stubbed openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /meta documentation_url: https://docs.github.com/rest/meta/meta#get-apiname-meta-information openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /networks/{owner}/{repo}/events documentation_url: https://docs.github.com/rest/activity/events#list-public-events-for-a-network-of-repositories openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /notifications documentation_url: https://docs.github.com/rest/activity/notifications#list-notifications-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /notifications documentation_url: https://docs.github.com/rest/activity/notifications#mark-notifications-as-read openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /notifications/threads/{thread_id} documentation_url: https://docs.github.com/rest/activity/notifications#get-a-thread openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /notifications/threads/{thread_id} documentation_url: https://docs.github.com/rest/activity/notifications#mark-a-thread-as-read openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /notifications/threads/{thread_id}/subscription documentation_url: https://docs.github.com/rest/activity/notifications#delete-a-thread-subscription openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /notifications/threads/{thread_id}/subscription documentation_url: https://docs.github.com/rest/activity/notifications#get-a-thread-subscription-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /notifications/threads/{thread_id}/subscription documentation_url: https://docs.github.com/rest/activity/notifications#set-a-thread-subscription openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /octocat documentation_url: https://docs.github.com/rest/meta/meta#get-octocat openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /organizations documentation_url: https://docs.github.com/rest/orgs/orgs#list-organizations openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /organizations/{organization_id}/custom_roles documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/orgs/custom-roles#deprecated---list-custom-repository-roles-in-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org} documentation_url: https://docs.github.com/rest/orgs/orgs#delete-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org} documentation_url: https://docs.github.com/rest/orgs/orgs#get-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /orgs/{org} documentation_url: https://docs.github.com/rest/orgs/orgs#update-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/cache/usage documentation_url: https://docs.github.com/rest/actions/cache#get-github-actions-cache-usage-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/cache/usage-by-repository documentation_url: https://docs.github.com/rest/actions/cache#list-repositories-with-github-actions-cache-usage-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/oidc/customization/sub documentation_url: https://docs.github.com/rest/actions/oidc#get-the-customization-template-for-an-oidc-subject-claim-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/oidc/customization/sub documentation_url: https://docs.github.com/rest/actions/oidc#set-the-customization-template-for-an-oidc-subject-claim-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/permissions documentation_url: https://docs.github.com/rest/actions/permissions#get-github-actions-permissions-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/permissions documentation_url: https://docs.github.com/rest/actions/permissions#set-github-actions-permissions-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/permissions/repositories documentation_url: https://docs.github.com/rest/actions/permissions#list-selected-repositories-enabled-for-github-actions-in-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/permissions/repositories documentation_url: https://docs.github.com/rest/actions/permissions#set-selected-repositories-enabled-for-github-actions-in-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/actions/permissions/repositories/{repository_id} documentation_url: https://docs.github.com/rest/actions/permissions#disable-a-selected-repository-for-github-actions-in-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/permissions/repositories/{repository_id} documentation_url: https://docs.github.com/rest/actions/permissions#enable-a-selected-repository-for-github-actions-in-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/permissions/selected-actions documentation_url: https://docs.github.com/rest/actions/permissions#get-allowed-actions-and-reusable-workflows-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/permissions/selected-actions documentation_url: https://docs.github.com/rest/actions/permissions#set-allowed-actions-and-reusable-workflows-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/permissions/workflow documentation_url: https://docs.github.com/rest/actions/permissions#get-default-workflow-permissions-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/permissions/workflow documentation_url: https://docs.github.com/rest/actions/permissions#set-default-workflow-permissions-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/runner-groups documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#list-self-hosted-runner-groups-for-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/actions/runner-groups documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#create-a-self-hosted-runner-group-for-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/actions/runner-groups/{runner_group_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#delete-a-self-hosted-runner-group-from-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/runner-groups/{runner_group_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#get-a-self-hosted-runner-group-for-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /orgs/{org}/actions/runner-groups/{runner_group_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#update-a-self-hosted-runner-group-for-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#list-repository-access-to-a-self-hosted-runner-group-in-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#set-repository-access-for-a-self-hosted-runner-group-in-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#remove-repository-access-to-a-self-hosted-runner-group-in-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#add-repository-access-to-a-self-hosted-runner-group-in-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#list-self-hosted-runners-in-a-group-for-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/runners documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#set-self-hosted-runners-in-a-group-for-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/actions/runner-groups/{runner_group_id}/runners/{runner_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#remove-a-self-hosted-runner-from-a-group-for-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/runners/{runner_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/actions/self-hosted-runner-groups#add-a-self-hosted-runner-to-a-group-for-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/runners documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#list-self-hosted-runners-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/runners/downloads documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#list-runner-applications-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/actions/runners/generate-jitconfig documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#create-configuration-for-a-just-in-time-runner-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/actions/runners/registration-token documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#create-a-registration-token-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/actions/runners/remove-token documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#create-a-remove-token-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/actions/runners/{runner_id} documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#delete-a-self-hosted-runner-from-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/runners/{runner_id} documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#get-a-self-hosted-runner-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/actions/runners/{runner_id}/labels documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#remove-all-custom-labels-from-a-self-hosted-runner-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/runners/{runner_id}/labels documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#list-labels-for-a-self-hosted-runner-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/actions/runners/{runner_id}/labels documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#add-custom-labels-to-a-self-hosted-runner-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/runners/{runner_id}/labels documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#set-custom-labels-for-a-self-hosted-runner-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name} documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#remove-a-custom-label-from-a-self-hosted-runner-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/secrets documentation_url: https://docs.github.com/rest/actions/secrets#list-organization-secrets openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/secrets/public-key documentation_url: https://docs.github.com/rest/actions/secrets#get-an-organization-public-key openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/actions/secrets/{secret_name} documentation_url: https://docs.github.com/rest/actions/secrets#delete-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/secrets/{secret_name} documentation_url: https://docs.github.com/rest/actions/secrets#get-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/secrets/{secret_name} documentation_url: https://docs.github.com/rest/actions/secrets#create-or-update-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/secrets/{secret_name}/repositories documentation_url: https://docs.github.com/rest/actions/secrets#list-selected-repositories-for-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/secrets/{secret_name}/repositories documentation_url: https://docs.github.com/rest/actions/secrets#set-selected-repositories-for-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id} documentation_url: https://docs.github.com/rest/actions/secrets#remove-selected-repository-from-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id} documentation_url: https://docs.github.com/rest/actions/secrets#add-selected-repository-to-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/variables documentation_url: https://docs.github.com/rest/actions/variables#list-organization-variables openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/actions/variables documentation_url: https://docs.github.com/rest/actions/variables#create-an-organization-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/actions/variables/{name} documentation_url: https://docs.github.com/rest/actions/variables#delete-an-organization-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/variables/{name} documentation_url: https://docs.github.com/rest/actions/variables#get-an-organization-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /orgs/{org}/actions/variables/{name} documentation_url: https://docs.github.com/rest/actions/variables#update-an-organization-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/actions/variables/{name}/repositories documentation_url: https://docs.github.com/rest/actions/variables#list-selected-repositories-for-an-organization-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/variables/{name}/repositories documentation_url: https://docs.github.com/rest/actions/variables#set-selected-repositories-for-an-organization-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/actions/variables/{name}/repositories/{repository_id} documentation_url: https://docs.github.com/rest/actions/variables#remove-selected-repository-from-an-organization-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id} documentation_url: https://docs.github.com/rest/actions/variables#add-selected-repository-to-an-organization-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/announcement documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/announcement-banners/organizations#remove-announcement-banner-from-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/announcement documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/announcement-banners/organizations#get-announcement-banner-for-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /orgs/{org}/announcement documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/announcement-banners/organizations#set-announcement-banner-for-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/audit-log documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/orgs/orgs#get-the-audit-log-for-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/blocks documentation_url: https://docs.github.com/rest/orgs/blocking#list-users-blocked-by-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/blocks/{username} documentation_url: https://docs.github.com/rest/orgs/blocking#unblock-a-user-from-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/blocks/{username} documentation_url: https://docs.github.com/rest/orgs/blocking#check-if-a-user-is-blocked-by-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /orgs/{org}/blocks/{username} documentation_url: https://docs.github.com/rest/orgs/blocking#block-a-user-from-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/code-scanning/alerts documentation_url: https://docs.github.com/rest/code-scanning/code-scanning#list-code-scanning-alerts-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/codespaces documentation_url: https://docs.github.com/rest/codespaces/organizations#list-codespaces-for-the-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /orgs/{org}/codespaces/access documentation_url: https://docs.github.com/rest/codespaces/organizations#manage-access-control-for-organization-codespaces openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/codespaces/access/selected_users documentation_url: https://docs.github.com/rest/codespaces/organizations#remove-users-from-codespaces-access-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /orgs/{org}/codespaces/access/selected_users documentation_url: https://docs.github.com/rest/codespaces/organizations#add-users-to-codespaces-access-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/codespaces/secrets documentation_url: https://docs.github.com/rest/codespaces/organization-secrets#list-organization-secrets openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/codespaces/secrets/public-key documentation_url: https://docs.github.com/rest/codespaces/organization-secrets#get-an-organization-public-key openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/codespaces/secrets/{secret_name} documentation_url: https://docs.github.com/rest/codespaces/organization-secrets#delete-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/codespaces/secrets/{secret_name} documentation_url: https://docs.github.com/rest/codespaces/organization-secrets#get-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /orgs/{org}/codespaces/secrets/{secret_name} documentation_url: https://docs.github.com/rest/codespaces/organization-secrets#create-or-update-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/codespaces/secrets/{secret_name}/repositories documentation_url: https://docs.github.com/rest/codespaces/organization-secrets#list-selected-repositories-for-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories documentation_url: https://docs.github.com/rest/codespaces/organization-secrets#set-selected-repositories-for-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id} documentation_url: https://docs.github.com/rest/codespaces/organization-secrets#remove-selected-repository-from-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /orgs/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id} documentation_url: https://docs.github.com/rest/codespaces/organization-secrets#add-selected-repository-to-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/copilot/billing documentation_url: https://docs.github.com/rest/copilot/copilot-business#get-copilot-business-seat-information-and-settings-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/copilot/billing/seats documentation_url: https://docs.github.com/rest/copilot/copilot-business#list-all-copilot-business-seat-assignments-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/copilot/billing/selected_teams documentation_url: https://docs.github.com/rest/copilot/copilot-business#remove-teams-from-the-copilot-business-subscription-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /orgs/{org}/copilot/billing/selected_teams documentation_url: https://docs.github.com/rest/copilot/copilot-business#add-teams-to-the-copilot-business-subscription-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/copilot/billing/selected_users documentation_url: https://docs.github.com/rest/copilot/copilot-business#remove-users-from-the-copilot-business-subscription-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /orgs/{org}/copilot/billing/selected_users documentation_url: https://docs.github.com/rest/copilot/copilot-business#add-users-to-the-copilot-business-subscription-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/credential-authorizations documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/orgs/orgs#list-saml-sso-authorizations-for-an-organization openapi_files: - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/credential-authorizations/{credential_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/orgs/orgs#remove-a-saml-sso-authorization-for-an-organization openapi_files: - descriptions/ghec/ghec.json - name: GET /orgs/{org}/custom-repository-roles documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/orgs/custom-roles#list-custom-repository-roles-in-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/custom-repository-roles documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/orgs/custom-roles#create-a-custom-repository-role openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/custom-repository-roles/{role_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/orgs/custom-roles#delete-a-custom-repository-role openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/custom-repository-roles/{role_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/orgs/custom-roles#get-a-custom-repository-role openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /orgs/{org}/custom-repository-roles/{role_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/orgs/custom-roles#update-a-custom-repository-role openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/custom_roles documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/orgs/custom-roles#deprecated---create-a-custom-role openapi_files: - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/custom_roles/{role_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/orgs/custom-roles#deprecated---delete-a-custom-role openapi_files: - descriptions/ghec/ghec.json - name: GET /orgs/{org}/custom_roles/{role_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/orgs/custom-roles#deprecated---get-a-custom-role openapi_files: - descriptions/ghec/ghec.json - name: PATCH /orgs/{org}/custom_roles/{role_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/orgs/custom-roles#deprecated---update-a-custom-role openapi_files: - descriptions/ghec/ghec.json - name: GET /orgs/{org}/dependabot/alerts documentation_url: https://docs.github.com/rest/dependabot/alerts#list-dependabot-alerts-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/dependabot/secrets documentation_url: https://docs.github.com/rest/dependabot/secrets#list-organization-secrets openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/dependabot/secrets/public-key documentation_url: https://docs.github.com/rest/dependabot/secrets#get-an-organization-public-key openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/dependabot/secrets/{secret_name} documentation_url: https://docs.github.com/rest/dependabot/secrets#delete-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/dependabot/secrets/{secret_name} documentation_url: https://docs.github.com/rest/dependabot/secrets#get-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/dependabot/secrets/{secret_name} documentation_url: https://docs.github.com/rest/dependabot/secrets#create-or-update-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories documentation_url: https://docs.github.com/rest/dependabot/secrets#list-selected-repositories-for-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories documentation_url: https://docs.github.com/rest/dependabot/secrets#set-selected-repositories-for-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id} documentation_url: https://docs.github.com/rest/dependabot/secrets#remove-selected-repository-from-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id} documentation_url: https://docs.github.com/rest/dependabot/secrets#add-selected-repository-to-an-organization-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/docker/conflicts documentation_url: https://docs.github.com/rest/packages/packages#get-list-of-conflicting-packages-during-docker-migration-for-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/events documentation_url: https://docs.github.com/rest/activity/events#list-public-organization-events openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/external-group/{group_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/teams/external-groups#get-an-external-group openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/external-groups documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/teams/external-groups#list-external-groups-in-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/failed_invitations documentation_url: https://docs.github.com/rest/orgs/members#list-failed-organization-invitations openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/fine_grained_permissions documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/orgs/custom-roles#deprecated---list-fine-grained-permissions-for-an-organization openapi_files: - descriptions/ghec/ghec.json - name: GET /orgs/{org}/hooks documentation_url: https://docs.github.com/rest/orgs/webhooks#list-organization-webhooks openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/hooks documentation_url: https://docs.github.com/rest/orgs/webhooks#create-an-organization-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/hooks/{hook_id} documentation_url: https://docs.github.com/rest/orgs/webhooks#delete-an-organization-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/hooks/{hook_id} documentation_url: https://docs.github.com/rest/orgs/webhooks#get-an-organization-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /orgs/{org}/hooks/{hook_id} documentation_url: https://docs.github.com/rest/orgs/webhooks#update-an-organization-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/hooks/{hook_id}/config documentation_url: https://docs.github.com/rest/orgs/webhooks#get-a-webhook-configuration-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /orgs/{org}/hooks/{hook_id}/config documentation_url: https://docs.github.com/rest/orgs/webhooks#update-a-webhook-configuration-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/hooks/{hook_id}/deliveries documentation_url: https://docs.github.com/rest/orgs/webhooks#list-deliveries-for-an-organization-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id} documentation_url: https://docs.github.com/rest/orgs/webhooks#get-a-webhook-delivery-for-an-organization-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts documentation_url: https://docs.github.com/rest/orgs/webhooks#redeliver-a-delivery-for-an-organization-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/hooks/{hook_id}/pings documentation_url: https://docs.github.com/rest/orgs/webhooks#ping-an-organization-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/installation documentation_url: https://docs.github.com/rest/apps/apps#get-an-organization-installation-for-the-authenticated-app openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/installations documentation_url: https://docs.github.com/rest/orgs/orgs#list-app-installations-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/interaction-limits documentation_url: https://docs.github.com/rest/interactions/orgs#remove-interaction-restrictions-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/interaction-limits documentation_url: https://docs.github.com/rest/interactions/orgs#get-interaction-restrictions-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /orgs/{org}/interaction-limits documentation_url: https://docs.github.com/rest/interactions/orgs#set-interaction-restrictions-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/invitations documentation_url: https://docs.github.com/rest/orgs/members#list-pending-organization-invitations openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /orgs/{org}/invitations documentation_url: https://docs.github.com/rest/orgs/members#create-an-organization-invitation openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/invitations/{invitation_id} documentation_url: https://docs.github.com/rest/orgs/members#cancel-an-organization-invitation openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/invitations/{invitation_id}/teams documentation_url: https://docs.github.com/rest/orgs/members#list-organization-invitation-teams openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/issues documentation_url: https://docs.github.com/rest/issues/issues#list-organization-issues-assigned-to-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/members documentation_url: https://docs.github.com/rest/orgs/members#list-organization-members openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/members/{username} documentation_url: https://docs.github.com/rest/orgs/members#remove-an-organization-member openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/members/{username} documentation_url: https://docs.github.com/rest/orgs/members#check-organization-membership-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/members/{username}/codespaces documentation_url: https://docs.github.com/rest/codespaces/organizations#list-codespaces-for-a-user-in-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name} documentation_url: https://docs.github.com/rest/codespaces/organizations#delete-a-codespace-from-the-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop documentation_url: https://docs.github.com/rest/codespaces/organizations#stop-a-codespace-for-an-organization-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/members/{username}/copilot documentation_url: https://docs.github.com/rest/copilot/copilot-business#get-copilot-business-seat-assignment-details-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/memberships/{username} documentation_url: https://docs.github.com/rest/orgs/members#remove-organization-membership-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/memberships/{username} documentation_url: https://docs.github.com/rest/orgs/members#get-organization-membership-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/memberships/{username} documentation_url: https://docs.github.com/rest/orgs/members#set-organization-membership-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/migrations documentation_url: https://docs.github.com/rest/migrations/orgs#list-organization-migrations openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/migrations documentation_url: https://docs.github.com/rest/migrations/orgs#start-an-organization-migration openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/migrations/{migration_id} documentation_url: https://docs.github.com/rest/migrations/orgs#get-an-organization-migration-status openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/migrations/{migration_id}/archive documentation_url: https://docs.github.com/rest/migrations/orgs#delete-an-organization-migration-archive openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/migrations/{migration_id}/archive documentation_url: https://docs.github.com/rest/migrations/orgs#download-an-organization-migration-archive openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock documentation_url: https://docs.github.com/rest/migrations/orgs#unlock-an-organization-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/migrations/{migration_id}/repositories documentation_url: https://docs.github.com/rest/migrations/orgs#list-repositories-in-an-organization-migration openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/organization-fine-grained-permissions documentation_url: https://docs.github.com/rest/orgs/organization-roles#list-organization-fine-grained-permissions-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/organization-roles documentation_url: https://docs.github.com/rest/orgs/organization-roles#get-all-organization-roles-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /orgs/{org}/organization-roles documentation_url: https://docs.github.com/rest/orgs/organization-roles#create-a-custom-organization-role openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/organization-roles/teams/{team_slug} documentation_url: https://docs.github.com/rest/orgs/organization-roles#remove-all-organization-roles-for-a-team openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/organization-roles/teams/{team_slug}/{role_id} documentation_url: https://docs.github.com/rest/orgs/organization-roles#remove-an-organization-role-from-a-team openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /orgs/{org}/organization-roles/teams/{team_slug}/{role_id} documentation_url: https://docs.github.com/rest/orgs/organization-roles#assign-an-organization-role-to-a-team openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/organization-roles/users/{username} documentation_url: https://docs.github.com/rest/orgs/organization-roles#remove-all-organization-roles-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/organization-roles/users/{username}/{role_id} documentation_url: https://docs.github.com/rest/orgs/organization-roles#remove-an-organization-role-from-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /orgs/{org}/organization-roles/users/{username}/{role_id} documentation_url: https://docs.github.com/rest/orgs/organization-roles#assign-an-organization-role-to-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/organization-roles/{role_id} documentation_url: https://docs.github.com/rest/orgs/organization-roles#delete-a-custom-organization-role openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/organization-roles/{role_id} documentation_url: https://docs.github.com/rest/orgs/organization-roles#get-an-organization-role openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PATCH /orgs/{org}/organization-roles/{role_id} documentation_url: https://docs.github.com/rest/orgs/organization-roles#update-a-custom-organization-role openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/organization-roles/{role_id}/teams documentation_url: https://docs.github.com/rest/orgs/organization-roles#list-teams-that-are-assigned-to-an-organization-role openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/organization-roles/{role_id}/users documentation_url: https://docs.github.com/rest/orgs/organization-roles#list-users-that-are-assigned-to-an-organization-role openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/outside_collaborators documentation_url: https://docs.github.com/rest/orgs/outside-collaborators#list-outside-collaborators-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/outside_collaborators/{username} documentation_url: https://docs.github.com/rest/orgs/outside-collaborators#remove-outside-collaborator-from-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/outside_collaborators/{username} documentation_url: https://docs.github.com/rest/orgs/outside-collaborators#convert-an-organization-member-to-outside-collaborator openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/packages documentation_url: https://docs.github.com/rest/packages/packages#list-packages-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/packages/{package_type}/{package_name} documentation_url: https://docs.github.com/rest/packages/packages#delete-a-package-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/packages/{package_type}/{package_name} documentation_url: https://docs.github.com/rest/packages/packages#get-a-package-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/packages/{package_type}/{package_name}/restore documentation_url: https://docs.github.com/rest/packages/packages#restore-a-package-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/packages/{package_type}/{package_name}/versions documentation_url: https://docs.github.com/rest/packages/packages#list-package-versions-for-a-package-owned-by-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id} documentation_url: https://docs.github.com/rest/packages/packages#delete-package-version-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id} documentation_url: https://docs.github.com/rest/packages/packages#get-a-package-version-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore documentation_url: https://docs.github.com/rest/packages/packages#restore-package-version-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/personal-access-token-requests documentation_url: https://docs.github.com/rest/orgs/personal-access-tokens#list-requests-to-access-organization-resources-with-fine-grained-personal-access-tokens openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/personal-access-token-requests documentation_url: https://docs.github.com/rest/orgs/personal-access-tokens#review-requests-to-access-organization-resources-with-fine-grained-personal-access-tokens openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/personal-access-token-requests/{pat_request_id} documentation_url: https://docs.github.com/rest/orgs/personal-access-tokens#review-a-request-to-access-organization-resources-with-a-fine-grained-personal-access-token openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/personal-access-token-requests/{pat_request_id}/repositories documentation_url: https://docs.github.com/rest/orgs/personal-access-tokens#list-repositories-requested-to-be-accessed-by-a-fine-grained-personal-access-token openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/personal-access-tokens documentation_url: https://docs.github.com/rest/orgs/personal-access-tokens#list-fine-grained-personal-access-tokens-with-access-to-organization-resources openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/personal-access-tokens documentation_url: https://docs.github.com/rest/orgs/personal-access-tokens#update-the-access-to-organization-resources-via-fine-grained-personal-access-tokens openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/personal-access-tokens/{pat_id} documentation_url: https://docs.github.com/rest/orgs/personal-access-tokens#update-the-access-a-fine-grained-personal-access-token-has-to-organization-resources openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/personal-access-tokens/{pat_id}/repositories documentation_url: https://docs.github.com/rest/orgs/personal-access-tokens#list-repositories-a-fine-grained-personal-access-token-has-access-to openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/pre-receive-hooks documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/org-pre-receive-hooks#list-pre-receive-hooks-for-an-organization openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/pre-receive-hooks/{pre_receive_hook_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/org-pre-receive-hooks#remove-pre-receive-hook-enforcement-for-an-organization openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/pre-receive-hooks/{pre_receive_hook_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/org-pre-receive-hooks#get-a-pre-receive-hook-for-an-organization openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /orgs/{org}/pre-receive-hooks/{pre_receive_hook_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/org-pre-receive-hooks#update-pre-receive-hook-enforcement-for-an-organization openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/projects documentation_url: https://docs.github.com/rest/projects/projects#list-organization-projects openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/projects documentation_url: https://docs.github.com/rest/projects/projects#create-an-organization-project openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/properties/schema documentation_url: https://docs.github.com/rest/orgs/custom-properties#get-all-custom-properties-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PATCH /orgs/{org}/properties/schema documentation_url: https://docs.github.com/rest/orgs/custom-properties#create-or-update-custom-properties-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/properties/schema/{custom_property_name} documentation_url: https://docs.github.com/rest/orgs/custom-properties#remove-a-custom-property-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/properties/schema/{custom_property_name} documentation_url: https://docs.github.com/rest/orgs/custom-properties#get-a-custom-property-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /orgs/{org}/properties/schema/{custom_property_name} documentation_url: https://docs.github.com/rest/orgs/custom-properties#create-or-update-a-custom-property-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/properties/values documentation_url: https://docs.github.com/rest/orgs/custom-properties#list-custom-property-values-for-organization-repositories openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PATCH /orgs/{org}/properties/values documentation_url: https://docs.github.com/rest/orgs/custom-properties#create-or-update-custom-property-values-for-organization-repositories openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/public_members documentation_url: https://docs.github.com/rest/orgs/members#list-public-organization-members openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/public_members/{username} documentation_url: https://docs.github.com/rest/orgs/members#remove-public-organization-membership-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/public_members/{username} documentation_url: https://docs.github.com/rest/orgs/members#check-public-organization-membership-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/public_members/{username} documentation_url: https://docs.github.com/rest/orgs/members#set-public-organization-membership-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/repos documentation_url: https://docs.github.com/rest/repos/repos#list-organization-repositories openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/repos documentation_url: https://docs.github.com/rest/repos/repos#create-an-organization-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/repository-fine-grained-permissions documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/orgs/custom-roles#list-repository-fine-grained-permissions-for-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/rulesets documentation_url: https://docs.github.com/rest/orgs/rules#get-all-organization-repository-rulesets openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/rulesets documentation_url: https://docs.github.com/rest/orgs/rules#create-an-organization-repository-ruleset openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/rulesets/rule-suites documentation_url: https://docs.github.com/rest/orgs/rule-suites#list-organization-rule-suites openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/rulesets/rule-suites/{rule_suite_id} documentation_url: https://docs.github.com/rest/orgs/rule-suites#get-an-organization-rule-suite openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /orgs/{org}/rulesets/{ruleset_id} documentation_url: https://docs.github.com/rest/orgs/rules#delete-an-organization-repository-ruleset openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/rulesets/{ruleset_id} documentation_url: https://docs.github.com/rest/orgs/rules#get-an-organization-repository-ruleset openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/rulesets/{ruleset_id} documentation_url: https://docs.github.com/rest/orgs/rules#update-an-organization-repository-ruleset openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/secret-scanning/alerts documentation_url: https://docs.github.com/rest/secret-scanning/secret-scanning#list-secret-scanning-alerts-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/security-advisories documentation_url: https://docs.github.com/rest/security-advisories/repository-advisories#list-repository-security-advisories-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/security-managers documentation_url: https://docs.github.com/rest/orgs/security-managers#list-security-manager-teams openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/security-managers/teams/{team_slug} documentation_url: https://docs.github.com/rest/orgs/security-managers#remove-a-security-manager-team openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/security-managers/teams/{team_slug} documentation_url: https://docs.github.com/rest/orgs/security-managers#add-a-security-manager-team openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/settings/billing/actions documentation_url: https://docs.github.com/rest/billing/billing#get-github-actions-billing-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/settings/billing/advanced-security documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/billing/billing#get-github-advanced-security-active-committers-for-an-organization openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/settings/billing/packages documentation_url: https://docs.github.com/rest/billing/billing#get-github-packages-billing-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/settings/billing/shared-storage documentation_url: https://docs.github.com/rest/billing/billing#get-shared-storage-billing-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/team-sync/groups documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/teams/team-sync#list-idp-groups-for-an-organization openapi_files: - descriptions/ghec/ghec.json - name: GET /orgs/{org}/teams documentation_url: https://docs.github.com/rest/teams/teams#list-teams openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/teams documentation_url: https://docs.github.com/rest/teams/teams#create-a-team openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/teams/{team_slug} documentation_url: https://docs.github.com/rest/teams/teams#delete-a-team openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/teams/{team_slug} documentation_url: https://docs.github.com/rest/teams/teams#get-a-team-by-name openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /orgs/{org}/teams/{team_slug} documentation_url: https://docs.github.com/rest/teams/teams#update-a-team openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/teams/{team_slug}/discussions documentation_url: https://docs.github.com/rest/teams/discussions#list-discussions openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/teams/{team_slug}/discussions documentation_url: https://docs.github.com/rest/teams/discussions#create-a-discussion openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number} documentation_url: https://docs.github.com/rest/teams/discussions#delete-a-discussion openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number} documentation_url: https://docs.github.com/rest/teams/discussions#get-a-discussion openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number} documentation_url: https://docs.github.com/rest/teams/discussions#update-a-discussion openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments documentation_url: https://docs.github.com/rest/teams/discussion-comments#list-discussion-comments openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments documentation_url: https://docs.github.com/rest/teams/discussion-comments#create-a-discussion-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number} documentation_url: https://docs.github.com/rest/teams/discussion-comments#delete-a-discussion-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number} documentation_url: https://docs.github.com/rest/teams/discussion-comments#get-a-discussion-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number} documentation_url: https://docs.github.com/rest/teams/discussion-comments#update-a-discussion-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#list-reactions-for-a-team-discussion-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#create-reaction-for-a-team-discussion-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id} documentation_url: https://docs.github.com/rest/reactions/reactions#delete-team-discussion-comment-reaction openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#list-reactions-for-a-team-discussion openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#create-reaction-for-a-team-discussion openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id} documentation_url: https://docs.github.com/rest/reactions/reactions#delete-team-discussion-reaction openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/teams/{team_slug}/external-groups documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/teams/external-groups#remove-the-connection-between-an-external-group-and-a-team openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/teams/{team_slug}/external-groups documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/teams/external-groups#list-a-connection-between-an-external-group-and-a-team openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /orgs/{org}/teams/{team_slug}/external-groups documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/teams/external-groups#update-the-connection-between-an-external-group-and-a-team openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/teams/{team_slug}/invitations documentation_url: https://docs.github.com/rest/teams/members#list-pending-team-invitations openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /orgs/{org}/teams/{team_slug}/members documentation_url: https://docs.github.com/rest/teams/members#list-team-members openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/teams/{team_slug}/memberships/{username} documentation_url: https://docs.github.com/rest/teams/members#remove-team-membership-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/teams/{team_slug}/memberships/{username} documentation_url: https://docs.github.com/rest/teams/members#get-team-membership-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/teams/{team_slug}/memberships/{username} documentation_url: https://docs.github.com/rest/teams/members#add-or-update-team-membership-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/teams/{team_slug}/projects documentation_url: https://docs.github.com/rest/teams/teams#list-team-projects openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id} documentation_url: https://docs.github.com/rest/teams/teams#remove-a-project-from-a-team openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/teams/{team_slug}/projects/{project_id} documentation_url: https://docs.github.com/rest/teams/teams#check-team-permissions-for-a-project openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/teams/{team_slug}/projects/{project_id} documentation_url: https://docs.github.com/rest/teams/teams#add-or-update-team-project-permissions openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/teams/{team_slug}/repos documentation_url: https://docs.github.com/rest/teams/teams#list-team-repositories openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo} documentation_url: https://docs.github.com/rest/teams/teams#remove-a-repository-from-a-team openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo} documentation_url: https://docs.github.com/rest/teams/teams#check-team-permissions-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo} documentation_url: https://docs.github.com/rest/teams/teams#add-or-update-team-repository-permissions openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /orgs/{org}/teams/{team_slug}/team-sync/group-mappings documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/teams/team-sync#list-idp-groups-for-a-team openapi_files: - descriptions/ghec/ghec.json - name: PATCH /orgs/{org}/teams/{team_slug}/team-sync/group-mappings documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/teams/team-sync#create-or-update-idp-group-connections openapi_files: - descriptions/ghec/ghec.json - name: GET /orgs/{org}/teams/{team_slug}/teams documentation_url: https://docs.github.com/rest/teams/teams#list-child-teams openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /orgs/{org}/{security_product}/{enablement} documentation_url: https://docs.github.com/rest/orgs/orgs#enable-or-disable-a-security-feature-for-an-organization openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /projects/columns/cards/{card_id} documentation_url: https://docs.github.com/rest/projects/cards#delete-a-project-card openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /projects/columns/cards/{card_id} documentation_url: https://docs.github.com/rest/projects/cards#get-a-project-card openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /projects/columns/cards/{card_id} documentation_url: https://docs.github.com/rest/projects/cards#update-an-existing-project-card openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /projects/columns/cards/{card_id}/moves documentation_url: https://docs.github.com/rest/projects/cards#move-a-project-card openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /projects/columns/{column_id} documentation_url: https://docs.github.com/rest/projects/columns#delete-a-project-column openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /projects/columns/{column_id} documentation_url: https://docs.github.com/rest/projects/columns#get-a-project-column openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /projects/columns/{column_id} documentation_url: https://docs.github.com/rest/projects/columns#update-an-existing-project-column openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /projects/columns/{column_id}/cards documentation_url: https://docs.github.com/rest/projects/cards#list-project-cards openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /projects/columns/{column_id}/cards documentation_url: https://docs.github.com/rest/projects/cards#create-a-project-card openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /projects/columns/{column_id}/moves documentation_url: https://docs.github.com/rest/projects/columns#move-a-project-column openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /projects/{project_id} documentation_url: https://docs.github.com/rest/projects/projects#delete-a-project openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /projects/{project_id} documentation_url: https://docs.github.com/rest/projects/projects#get-a-project openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /projects/{project_id} documentation_url: https://docs.github.com/rest/projects/projects#update-a-project openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /projects/{project_id}/collaborators documentation_url: https://docs.github.com/rest/projects/collaborators#list-project-collaborators openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /projects/{project_id}/collaborators/{username} documentation_url: https://docs.github.com/rest/projects/collaborators#remove-user-as-a-collaborator openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /projects/{project_id}/collaborators/{username} documentation_url: https://docs.github.com/rest/projects/collaborators#add-project-collaborator openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /projects/{project_id}/collaborators/{username}/permission documentation_url: https://docs.github.com/rest/projects/collaborators#get-project-permission-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /projects/{project_id}/columns documentation_url: https://docs.github.com/rest/projects/columns#list-project-columns openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /projects/{project_id}/columns documentation_url: https://docs.github.com/rest/projects/columns#create-a-project-column openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /rate_limit documentation_url: https://docs.github.com/rest/rate-limit/rate-limit#get-rate-limit-status-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /reactions/{reaction_id} documentation_url: https://docs.github.com/enterprise-server@3.4/rest/reference/reactions/#delete-a-reaction-legacy openapi_files: - descriptions/ghes-3.4/ghes-3.4.json - name: DELETE /repos/{owner}/{repo} documentation_url: https://docs.github.com/rest/repos/repos#delete-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo} documentation_url: https://docs.github.com/rest/repos/repos#get-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo} documentation_url: https://docs.github.com/rest/repos/repos#update-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/artifacts documentation_url: https://docs.github.com/rest/actions/artifacts#list-artifacts-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id} documentation_url: https://docs.github.com/rest/actions/artifacts#delete-an-artifact openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id} documentation_url: https://docs.github.com/rest/actions/artifacts#get-an-artifact openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format} documentation_url: https://docs.github.com/rest/actions/artifacts#download-an-artifact openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/cache/usage documentation_url: https://docs.github.com/rest/actions/cache#get-github-actions-cache-usage-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/cache/usage-policy documentation_url: https://docs.github.com/enterprise-server@3.11/rest/actions/cache#get-github-actions-cache-usage-policy-for-a-repository openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/actions/cache/usage-policy documentation_url: https://docs.github.com/enterprise-server@3.11/rest/actions/cache#set-github-actions-cache-usage-policy-for-a-repository openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/actions/caches documentation_url: https://docs.github.com/rest/actions/cache#delete-github-actions-caches-for-a-repository-using-a-cache-key openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/caches documentation_url: https://docs.github.com/rest/actions/cache#list-github-actions-caches-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/actions/caches/{cache_id} documentation_url: https://docs.github.com/rest/actions/cache#delete-a-github-actions-cache-for-a-repository-using-a-cache-id openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/jobs/{job_id} documentation_url: https://docs.github.com/rest/actions/workflow-jobs#get-a-job-for-a-workflow-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs documentation_url: https://docs.github.com/rest/actions/workflow-jobs#download-job-logs-for-a-workflow-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun documentation_url: https://docs.github.com/rest/actions/workflow-runs#re-run-a-job-from-a-workflow-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/oidc/customization/sub documentation_url: https://docs.github.com/rest/actions/oidc#get-the-customization-template-for-an-oidc-subject-claim-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/actions/oidc/customization/sub documentation_url: https://docs.github.com/rest/actions/oidc#set-the-customization-template-for-an-oidc-subject-claim-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/organization-secrets documentation_url: https://docs.github.com/rest/actions/secrets#list-repository-organization-secrets openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/organization-variables documentation_url: https://docs.github.com/rest/actions/variables#list-repository-organization-variables openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/permissions documentation_url: https://docs.github.com/rest/actions/permissions#get-github-actions-permissions-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/actions/permissions documentation_url: https://docs.github.com/rest/actions/permissions#set-github-actions-permissions-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/permissions/access documentation_url: https://docs.github.com/rest/actions/permissions#get-the-level-of-access-for-workflows-outside-of-the-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/actions/permissions/access documentation_url: https://docs.github.com/rest/actions/permissions#set-the-level-of-access-for-workflows-outside-of-the-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/permissions/selected-actions documentation_url: https://docs.github.com/rest/actions/permissions#get-allowed-actions-and-reusable-workflows-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/actions/permissions/selected-actions documentation_url: https://docs.github.com/rest/actions/permissions#set-allowed-actions-and-reusable-workflows-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/permissions/workflow documentation_url: https://docs.github.com/rest/actions/permissions#get-default-workflow-permissions-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/actions/permissions/workflow documentation_url: https://docs.github.com/rest/actions/permissions#set-default-workflow-permissions-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/runners documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#list-self-hosted-runners-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/runners/downloads documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#list-runner-applications-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#create-configuration-for-a-just-in-time-runner-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/actions/runners/registration-token documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#create-a-registration-token-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/actions/runners/remove-token documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#create-a-remove-token-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/actions/runners/{runner_id} documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#delete-a-self-hosted-runner-from-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/runners/{runner_id} documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#get-a-self-hosted-runner-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#remove-all-custom-labels-from-a-self-hosted-runner-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#list-labels-for-a-self-hosted-runner-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#add-custom-labels-to-a-self-hosted-runner-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#set-custom-labels-for-a-self-hosted-runner-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name} documentation_url: https://docs.github.com/rest/actions/self-hosted-runners#remove-a-custom-label-from-a-self-hosted-runner-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/runs documentation_url: https://docs.github.com/rest/actions/workflow-runs#list-workflow-runs-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/actions/runs/{run_id} documentation_url: https://docs.github.com/rest/actions/workflow-runs#delete-a-workflow-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/runs/{run_id} documentation_url: https://docs.github.com/rest/actions/workflow-runs#get-a-workflow-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals documentation_url: https://docs.github.com/rest/actions/workflow-runs#get-the-review-history-for-a-workflow-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve documentation_url: https://docs.github.com/rest/actions/workflow-runs#approve-a-workflow-run-for-a-fork-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts documentation_url: https://docs.github.com/rest/actions/artifacts#list-workflow-run-artifacts openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number} documentation_url: https://docs.github.com/rest/actions/workflow-runs#get-a-workflow-run-attempt openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs documentation_url: https://docs.github.com/rest/actions/workflow-jobs#list-jobs-for-a-workflow-run-attempt openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs documentation_url: https://docs.github.com/rest/actions/workflow-runs#download-workflow-run-attempt-logs openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel documentation_url: https://docs.github.com/rest/actions/workflow-runs#cancel-a-workflow-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/actions/runs/{run_id}/deployment_protection_rule documentation_url: https://docs.github.com/rest/actions/workflow-runs#review-custom-deployment-protection-rules-for-a-workflow-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/actions/runs/{run_id}/force-cancel documentation_url: https://docs.github.com/rest/actions/workflow-runs#force-cancel-a-workflow-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs documentation_url: https://docs.github.com/rest/actions/workflow-jobs#list-jobs-for-a-workflow-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs documentation_url: https://docs.github.com/rest/actions/workflow-runs#delete-workflow-run-logs openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs documentation_url: https://docs.github.com/rest/actions/workflow-runs#download-workflow-run-logs openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments documentation_url: https://docs.github.com/rest/actions/workflow-runs#get-pending-deployments-for-a-workflow-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments documentation_url: https://docs.github.com/rest/actions/workflow-runs#review-pending-deployments-for-a-workflow-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun documentation_url: https://docs.github.com/rest/actions/workflow-runs#re-run-a-workflow openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs documentation_url: https://docs.github.com/rest/actions/workflow-runs#re-run-failed-jobs-from-a-workflow-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing documentation_url: https://docs.github.com/rest/actions/workflow-runs#get-workflow-run-usage openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/actions/secrets documentation_url: https://docs.github.com/rest/actions/secrets#list-repository-secrets openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/secrets/public-key documentation_url: https://docs.github.com/rest/actions/secrets#get-a-repository-public-key openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name} documentation_url: https://docs.github.com/rest/actions/secrets#delete-a-repository-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/secrets/{secret_name} documentation_url: https://docs.github.com/rest/actions/secrets#get-a-repository-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/actions/secrets/{secret_name} documentation_url: https://docs.github.com/rest/actions/secrets#create-or-update-a-repository-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/variables documentation_url: https://docs.github.com/rest/actions/variables#list-repository-variables openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/actions/variables documentation_url: https://docs.github.com/rest/actions/variables#create-a-repository-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/actions/variables/{name} documentation_url: https://docs.github.com/rest/actions/variables#delete-a-repository-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/variables/{name} documentation_url: https://docs.github.com/rest/actions/variables#get-a-repository-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/actions/variables/{name} documentation_url: https://docs.github.com/rest/actions/variables#update-a-repository-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/workflows documentation_url: https://docs.github.com/rest/actions/workflows#list-repository-workflows openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/workflows/{workflow_id} documentation_url: https://docs.github.com/rest/actions/workflows#get-a-workflow openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable documentation_url: https://docs.github.com/rest/actions/workflows#disable-a-workflow openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches documentation_url: https://docs.github.com/rest/actions/workflows#create-a-workflow-dispatch-event openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable documentation_url: https://docs.github.com/rest/actions/workflows#enable-a-workflow openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs documentation_url: https://docs.github.com/rest/actions/workflow-runs#list-workflow-runs-for-a-workflow openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing documentation_url: https://docs.github.com/rest/actions/workflows#get-workflow-usage openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/activity documentation_url: https://docs.github.com/rest/repos/repos#list-repository-activities openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/assignees documentation_url: https://docs.github.com/rest/issues/assignees#list-assignees openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/assignees/{assignee} documentation_url: https://docs.github.com/rest/issues/assignees#check-if-a-user-can-be-assigned openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/autolinks documentation_url: https://docs.github.com/rest/repos/autolinks#list-all-autolinks-of-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/autolinks documentation_url: https://docs.github.com/rest/repos/autolinks#create-an-autolink-reference-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/autolinks/{autolink_id} documentation_url: https://docs.github.com/rest/repos/autolinks#delete-an-autolink-reference-from-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/autolinks/{autolink_id} documentation_url: https://docs.github.com/rest/repos/autolinks#get-an-autolink-reference-of-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/automated-security-fixes documentation_url: https://docs.github.com/rest/repos/repos#disable-automated-security-fixes openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/automated-security-fixes documentation_url: https://docs.github.com/rest/repos/repos#check-if-automated-security-fixes-are-enabled-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/automated-security-fixes documentation_url: https://docs.github.com/rest/repos/repos#enable-automated-security-fixes openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/branches documentation_url: https://docs.github.com/rest/branches/branches#list-branches openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/branches/{branch} documentation_url: https://docs.github.com/rest/branches/branches#get-a-branch openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/branches/{branch}/protection documentation_url: https://docs.github.com/rest/branches/branch-protection#delete-branch-protection openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/branches/{branch}/protection documentation_url: https://docs.github.com/rest/branches/branch-protection#get-branch-protection openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/branches/{branch}/protection documentation_url: https://docs.github.com/rest/branches/branch-protection#update-branch-protection openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins documentation_url: https://docs.github.com/rest/branches/branch-protection#delete-admin-branch-protection openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins documentation_url: https://docs.github.com/rest/branches/branch-protection#get-admin-branch-protection openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins documentation_url: https://docs.github.com/rest/branches/branch-protection#set-admin-branch-protection openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews documentation_url: https://docs.github.com/rest/branches/branch-protection#delete-pull-request-review-protection openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews documentation_url: https://docs.github.com/rest/branches/branch-protection#get-pull-request-review-protection openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews documentation_url: https://docs.github.com/rest/branches/branch-protection#update-pull-request-review-protection openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures documentation_url: https://docs.github.com/rest/branches/branch-protection#delete-commit-signature-protection openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures documentation_url: https://docs.github.com/rest/branches/branch-protection#get-commit-signature-protection openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures documentation_url: https://docs.github.com/rest/branches/branch-protection#create-commit-signature-protection openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks documentation_url: https://docs.github.com/rest/branches/branch-protection#remove-status-check-protection openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks documentation_url: https://docs.github.com/rest/branches/branch-protection#get-status-checks-protection openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks documentation_url: https://docs.github.com/rest/branches/branch-protection#update-status-check-protection openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts documentation_url: https://docs.github.com/rest/branches/branch-protection#remove-status-check-contexts openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts documentation_url: https://docs.github.com/rest/branches/branch-protection#get-all-status-check-contexts openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts documentation_url: https://docs.github.com/rest/branches/branch-protection#add-status-check-contexts openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts documentation_url: https://docs.github.com/rest/branches/branch-protection#set-status-check-contexts openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions documentation_url: https://docs.github.com/rest/branches/branch-protection#delete-access-restrictions openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions documentation_url: https://docs.github.com/rest/branches/branch-protection#get-access-restrictions openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps documentation_url: https://docs.github.com/rest/branches/branch-protection#remove-app-access-restrictions openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps documentation_url: https://docs.github.com/rest/branches/branch-protection#get-apps-with-access-to-the-protected-branch openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps documentation_url: https://docs.github.com/rest/branches/branch-protection#add-app-access-restrictions openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps documentation_url: https://docs.github.com/rest/branches/branch-protection#set-app-access-restrictions openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams documentation_url: https://docs.github.com/rest/branches/branch-protection#remove-team-access-restrictions openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams documentation_url: https://docs.github.com/rest/branches/branch-protection#get-teams-with-access-to-the-protected-branch openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams documentation_url: https://docs.github.com/rest/branches/branch-protection#add-team-access-restrictions openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams documentation_url: https://docs.github.com/rest/branches/branch-protection#set-team-access-restrictions openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users documentation_url: https://docs.github.com/rest/branches/branch-protection#remove-user-access-restrictions openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users documentation_url: https://docs.github.com/rest/branches/branch-protection#get-users-with-access-to-the-protected-branch openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users documentation_url: https://docs.github.com/rest/branches/branch-protection#add-user-access-restrictions openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users documentation_url: https://docs.github.com/rest/branches/branch-protection#set-user-access-restrictions openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/branches/{branch}/rename documentation_url: https://docs.github.com/rest/branches/branches#rename-a-branch openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/check-runs documentation_url: https://docs.github.com/rest/checks/runs#create-a-check-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/check-runs/{check_run_id} documentation_url: https://docs.github.com/rest/checks/runs#get-a-check-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/check-runs/{check_run_id} documentation_url: https://docs.github.com/rest/checks/runs#update-a-check-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations documentation_url: https://docs.github.com/rest/checks/runs#list-check-run-annotations openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest documentation_url: https://docs.github.com/rest/checks/runs#rerequest-a-check-run openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/check-suites documentation_url: https://docs.github.com/rest/checks/suites#create-a-check-suite openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/check-suites/preferences documentation_url: https://docs.github.com/rest/checks/suites#update-repository-preferences-for-check-suites openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/check-suites/{check_suite_id} documentation_url: https://docs.github.com/rest/checks/suites#get-a-check-suite openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs documentation_url: https://docs.github.com/rest/checks/runs#list-check-runs-in-a-check-suite openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest documentation_url: https://docs.github.com/rest/checks/suites#rerequest-a-check-suite openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/code-scanning/alerts documentation_url: https://docs.github.com/rest/code-scanning/code-scanning#list-code-scanning-alerts-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number} documentation_url: https://docs.github.com/rest/code-scanning/code-scanning#get-a-code-scanning-alert openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number} documentation_url: https://docs.github.com/rest/code-scanning/code-scanning#update-a-code-scanning-alert openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances documentation_url: https://docs.github.com/rest/code-scanning/code-scanning#list-instances-of-a-code-scanning-alert openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/code-scanning/analyses documentation_url: https://docs.github.com/rest/code-scanning/code-scanning#list-code-scanning-analyses-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id} documentation_url: https://docs.github.com/rest/code-scanning/code-scanning#delete-a-code-scanning-analysis-from-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id} documentation_url: https://docs.github.com/rest/code-scanning/code-scanning#get-a-code-scanning-analysis-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/code-scanning/codeql/databases documentation_url: https://docs.github.com/rest/code-scanning/code-scanning#list-codeql-databases-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language} documentation_url: https://docs.github.com/rest/code-scanning/code-scanning#get-a-codeql-database-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/code-scanning/default-setup documentation_url: https://docs.github.com/rest/code-scanning/code-scanning#get-a-code-scanning-default-setup-configuration openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/code-scanning/default-setup documentation_url: https://docs.github.com/rest/code-scanning/code-scanning#update-a-code-scanning-default-setup-configuration openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/code-scanning/sarifs documentation_url: https://docs.github.com/rest/code-scanning/code-scanning#upload-an-analysis-as-sarif-data openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id} documentation_url: https://docs.github.com/rest/code-scanning/code-scanning#get-information-about-a-sarif-upload openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/codeowners/errors documentation_url: https://docs.github.com/rest/repos/repos#list-codeowners-errors openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/codespaces documentation_url: https://docs.github.com/rest/codespaces/codespaces#list-codespaces-in-a-repository-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /repos/{owner}/{repo}/codespaces documentation_url: https://docs.github.com/rest/codespaces/codespaces#create-a-codespace-in-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/codespaces/devcontainers documentation_url: https://docs.github.com/rest/codespaces/codespaces#list-devcontainer-configurations-in-a-repository-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/codespaces/machines documentation_url: https://docs.github.com/rest/codespaces/machines#list-available-machine-types-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/codespaces/new documentation_url: https://docs.github.com/rest/codespaces/codespaces#get-default-attributes-for-a-codespace openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/codespaces/permissions_check documentation_url: https://docs.github.com/rest/codespaces/codespaces#check-if-permissions-defined-by-a-devcontainer-have-been-accepted-by-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/codespaces/secrets documentation_url: https://docs.github.com/rest/codespaces/repository-secrets#list-repository-secrets openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/codespaces/secrets/public-key documentation_url: https://docs.github.com/rest/codespaces/repository-secrets#get-a-repository-public-key openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name} documentation_url: https://docs.github.com/rest/codespaces/repository-secrets#delete-a-repository-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name} documentation_url: https://docs.github.com/rest/codespaces/repository-secrets#get-a-repository-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name} documentation_url: https://docs.github.com/rest/codespaces/repository-secrets#create-or-update-a-repository-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/collaborators documentation_url: https://docs.github.com/rest/collaborators/collaborators#list-repository-collaborators openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/collaborators/{username} documentation_url: https://docs.github.com/rest/collaborators/collaborators#remove-a-repository-collaborator openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/collaborators/{username} documentation_url: https://docs.github.com/rest/collaborators/collaborators#check-if-a-user-is-a-repository-collaborator openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/collaborators/{username} documentation_url: https://docs.github.com/rest/collaborators/collaborators#add-a-repository-collaborator openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/collaborators/{username}/permission documentation_url: https://docs.github.com/rest/collaborators/collaborators#get-repository-permissions-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/comments documentation_url: https://docs.github.com/rest/commits/comments#list-commit-comments-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/comments/{comment_id} documentation_url: https://docs.github.com/rest/commits/comments#delete-a-commit-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/comments/{comment_id} documentation_url: https://docs.github.com/rest/commits/comments#get-a-commit-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/comments/{comment_id} documentation_url: https://docs.github.com/rest/commits/comments#update-a-commit-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/comments/{comment_id}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#list-reactions-for-a-commit-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/comments/{comment_id}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#create-reaction-for-a-commit-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id} documentation_url: https://docs.github.com/rest/reactions/reactions#delete-a-commit-comment-reaction openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/commits documentation_url: https://docs.github.com/rest/commits/commits#list-commits openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head documentation_url: https://docs.github.com/rest/commits/commits#list-branches-for-head-commit openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/commits/{commit_sha}/comments documentation_url: https://docs.github.com/rest/commits/comments#list-commit-comments openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/commits/{commit_sha}/comments documentation_url: https://docs.github.com/rest/commits/comments#create-a-commit-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls documentation_url: https://docs.github.com/rest/commits/commits#list-pull-requests-associated-with-a-commit openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/commits/{ref} documentation_url: https://docs.github.com/rest/commits/commits#get-a-commit openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/commits/{ref}/check-runs documentation_url: https://docs.github.com/rest/checks/runs#list-check-runs-for-a-git-reference openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/commits/{ref}/check-suites documentation_url: https://docs.github.com/rest/checks/suites#list-check-suites-for-a-git-reference openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/commits/{ref}/status documentation_url: https://docs.github.com/rest/commits/statuses#get-the-combined-status-for-a-specific-reference openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/commits/{ref}/statuses documentation_url: https://docs.github.com/rest/commits/statuses#list-commit-statuses-for-a-reference openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/community/profile documentation_url: https://docs.github.com/rest/metrics/community#get-community-profile-metrics openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/compare/{basehead} documentation_url: https://docs.github.com/rest/commits/commits#compare-two-commits openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/content_references/{content_reference_id}/attachments documentation_url: https://docs.github.com/enterprise-server@3.3/rest/reference/apps#create-a-content-attachment openapi_files: - descriptions/ghes-3.3/ghes-3.3.json - name: DELETE /repos/{owner}/{repo}/contents/{path} documentation_url: https://docs.github.com/rest/repos/contents#delete-a-file openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/contents/{path} documentation_url: https://docs.github.com/rest/repos/contents#get-repository-content openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/contents/{path} documentation_url: https://docs.github.com/rest/repos/contents#create-or-update-file-contents openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/contributors documentation_url: https://docs.github.com/rest/repos/repos#list-repository-contributors openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/dependabot/alerts documentation_url: https://docs.github.com/rest/dependabot/alerts#list-dependabot-alerts-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number} documentation_url: https://docs.github.com/rest/dependabot/alerts#get-a-dependabot-alert openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number} documentation_url: https://docs.github.com/rest/dependabot/alerts#update-a-dependabot-alert openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/dependabot/secrets documentation_url: https://docs.github.com/rest/dependabot/secrets#list-repository-secrets openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/dependabot/secrets/public-key documentation_url: https://docs.github.com/rest/dependabot/secrets#get-a-repository-public-key openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name} documentation_url: https://docs.github.com/rest/dependabot/secrets#delete-a-repository-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name} documentation_url: https://docs.github.com/rest/dependabot/secrets#get-a-repository-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name} documentation_url: https://docs.github.com/rest/dependabot/secrets#create-or-update-a-repository-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead} documentation_url: https://docs.github.com/rest/dependency-graph/dependency-review#get-a-diff-of-the-dependencies-between-commits openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/dependency-graph/sbom documentation_url: https://docs.github.com/rest/dependency-graph/sboms#export-a-software-bill-of-materials-sbom-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/dependency-graph/snapshots documentation_url: https://docs.github.com/rest/dependency-graph/dependency-submission#create-a-snapshot-of-dependencies-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/deployments documentation_url: https://docs.github.com/rest/deployments/deployments#list-deployments openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/deployments documentation_url: https://docs.github.com/rest/deployments/deployments#create-a-deployment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/deployments/{deployment_id} documentation_url: https://docs.github.com/rest/deployments/deployments#delete-a-deployment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/deployments/{deployment_id} documentation_url: https://docs.github.com/rest/deployments/deployments#get-a-deployment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses documentation_url: https://docs.github.com/rest/deployments/statuses#list-deployment-statuses openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses documentation_url: https://docs.github.com/rest/deployments/statuses#create-a-deployment-status openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id} documentation_url: https://docs.github.com/rest/deployments/statuses#get-a-deployment-status openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/dispatches documentation_url: https://docs.github.com/rest/repos/repos#create-a-repository-dispatch-event openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/environments documentation_url: https://docs.github.com/rest/deployments/environments#list-environments openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/environments/{environment_name} documentation_url: https://docs.github.com/rest/deployments/environments#delete-an-environment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/environments/{environment_name} documentation_url: https://docs.github.com/rest/deployments/environments#get-an-environment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/environments/{environment_name} documentation_url: https://docs.github.com/rest/deployments/environments#create-or-update-an-environment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies documentation_url: https://docs.github.com/rest/deployments/branch-policies#list-deployment-branch-policies openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies documentation_url: https://docs.github.com/rest/deployments/branch-policies#create-a-deployment-branch-policy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id} documentation_url: https://docs.github.com/rest/deployments/branch-policies#delete-a-deployment-branch-policy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id} documentation_url: https://docs.github.com/rest/deployments/branch-policies#get-a-deployment-branch-policy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id} documentation_url: https://docs.github.com/rest/deployments/branch-policies#update-a-deployment-branch-policy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules documentation_url: https://docs.github.com/rest/deployments/protection-rules#get-all-deployment-protection-rules-for-an-environment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules documentation_url: https://docs.github.com/rest/deployments/protection-rules#create-a-custom-deployment-protection-rule-on-an-environment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/apps documentation_url: https://docs.github.com/rest/deployments/protection-rules#list-custom-deployment-rule-integrations-available-for-an-environment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id} documentation_url: https://docs.github.com/rest/deployments/protection-rules#disable-a-custom-protection-rule-for-an-environment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/environments/{environment_name}/deployment_protection_rules/{protection_rule_id} documentation_url: https://docs.github.com/rest/deployments/protection-rules#get-a-custom-deployment-protection-rule openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/events documentation_url: https://docs.github.com/rest/activity/events#list-repository-events openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/forks documentation_url: https://docs.github.com/rest/repos/forks#list-forks openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/forks documentation_url: https://docs.github.com/rest/repos/forks#create-a-fork openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/git/blobs documentation_url: https://docs.github.com/rest/git/blobs#create-a-blob openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/git/blobs/{file_sha} documentation_url: https://docs.github.com/rest/git/blobs#get-a-blob openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/git/commits documentation_url: https://docs.github.com/rest/git/commits#create-a-commit openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/git/commits/{commit_sha} documentation_url: https://docs.github.com/rest/git/commits#get-a-commit-object openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/git/matching-refs/{ref} documentation_url: https://docs.github.com/rest/git/refs#list-matching-references openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/git/ref/{ref} documentation_url: https://docs.github.com/rest/git/refs#get-a-reference openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/git/refs documentation_url: https://docs.github.com/rest/git/refs#create-a-reference openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/git/refs/{ref} documentation_url: https://docs.github.com/rest/git/refs#delete-a-reference openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/git/refs/{ref} documentation_url: https://docs.github.com/rest/git/refs#update-a-reference openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/git/tags documentation_url: https://docs.github.com/rest/git/tags#create-a-tag-object openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/git/tags/{tag_sha} documentation_url: https://docs.github.com/rest/git/tags#get-a-tag openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/git/trees documentation_url: https://docs.github.com/rest/git/trees#create-a-tree openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/git/trees/{tree_sha} documentation_url: https://docs.github.com/rest/git/trees#get-a-tree openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/hooks documentation_url: https://docs.github.com/rest/repos/webhooks#list-repository-webhooks openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/hooks documentation_url: https://docs.github.com/rest/repos/webhooks#create-a-repository-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/hooks/{hook_id} documentation_url: https://docs.github.com/rest/repos/webhooks#delete-a-repository-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/hooks/{hook_id} documentation_url: https://docs.github.com/rest/repos/webhooks#get-a-repository-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/hooks/{hook_id} documentation_url: https://docs.github.com/rest/repos/webhooks#update-a-repository-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/hooks/{hook_id}/config documentation_url: https://docs.github.com/rest/repos/webhooks#get-a-webhook-configuration-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config documentation_url: https://docs.github.com/rest/repos/webhooks#update-a-webhook-configuration-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries documentation_url: https://docs.github.com/rest/repos/webhooks#list-deliveries-for-a-repository-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id} documentation_url: https://docs.github.com/rest/repos/webhooks#get-a-delivery-for-a-repository-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts documentation_url: https://docs.github.com/rest/repos/webhooks#redeliver-a-delivery-for-a-repository-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/hooks/{hook_id}/pings documentation_url: https://docs.github.com/rest/repos/webhooks#ping-a-repository-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/hooks/{hook_id}/tests documentation_url: https://docs.github.com/rest/repos/webhooks#test-the-push-repository-webhook openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/import documentation_url: https://docs.github.com/rest/migrations/source-imports#cancel-an-import openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/import documentation_url: https://docs.github.com/rest/migrations/source-imports#get-an-import-status openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PATCH /repos/{owner}/{repo}/import documentation_url: https://docs.github.com/rest/migrations/source-imports#update-an-import openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /repos/{owner}/{repo}/import documentation_url: https://docs.github.com/rest/migrations/source-imports#start-an-import openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/import/authors documentation_url: https://docs.github.com/rest/migrations/source-imports#get-commit-authors openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PATCH /repos/{owner}/{repo}/import/authors/{author_id} documentation_url: https://docs.github.com/rest/migrations/source-imports#map-a-commit-author openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/import/large_files documentation_url: https://docs.github.com/rest/migrations/source-imports#get-large-files openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PATCH /repos/{owner}/{repo}/import/lfs documentation_url: https://docs.github.com/rest/migrations/source-imports#update-git-lfs-preference openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/installation documentation_url: https://docs.github.com/rest/apps/apps#get-a-repository-installation-for-the-authenticated-app openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/interaction-limits documentation_url: https://docs.github.com/rest/interactions/repos#remove-interaction-restrictions-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/interaction-limits documentation_url: https://docs.github.com/rest/interactions/repos#get-interaction-restrictions-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /repos/{owner}/{repo}/interaction-limits documentation_url: https://docs.github.com/rest/interactions/repos#set-interaction-restrictions-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/invitations documentation_url: https://docs.github.com/rest/collaborators/invitations#list-repository-invitations openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/invitations/{invitation_id} documentation_url: https://docs.github.com/rest/collaborators/invitations#delete-a-repository-invitation openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/invitations/{invitation_id} documentation_url: https://docs.github.com/rest/collaborators/invitations#update-a-repository-invitation openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/issues documentation_url: https://docs.github.com/rest/issues/issues#list-repository-issues openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/issues documentation_url: https://docs.github.com/rest/issues/issues#create-an-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/issues/comments documentation_url: https://docs.github.com/rest/issues/comments#list-issue-comments-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/issues/comments/{comment_id} documentation_url: https://docs.github.com/rest/issues/comments#delete-an-issue-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/issues/comments/{comment_id} documentation_url: https://docs.github.com/rest/issues/comments#get-an-issue-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/issues/comments/{comment_id} documentation_url: https://docs.github.com/rest/issues/comments#update-an-issue-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#list-reactions-for-an-issue-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#create-reaction-for-an-issue-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id} documentation_url: https://docs.github.com/rest/reactions/reactions#delete-an-issue-comment-reaction openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/issues/events documentation_url: https://docs.github.com/rest/issues/events#list-issue-events-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/issues/events/{event_id} documentation_url: https://docs.github.com/rest/issues/events#get-an-issue-event openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/issues/{issue_number} documentation_url: https://docs.github.com/rest/issues/issues#get-an-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/issues/{issue_number} documentation_url: https://docs.github.com/rest/issues/issues#update-an-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees documentation_url: https://docs.github.com/rest/issues/assignees#remove-assignees-from-an-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/issues/{issue_number}/assignees documentation_url: https://docs.github.com/rest/issues/assignees#add-assignees-to-an-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/issues/{issue_number}/assignees/{assignee} documentation_url: https://docs.github.com/rest/issues/assignees#check-if-a-user-can-be-assigned-to-a-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/issues/{issue_number}/comments documentation_url: https://docs.github.com/rest/issues/comments#list-issue-comments openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/issues/{issue_number}/comments documentation_url: https://docs.github.com/rest/issues/comments#create-an-issue-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/issues/{issue_number}/events documentation_url: https://docs.github.com/rest/issues/events#list-issue-events openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels documentation_url: https://docs.github.com/rest/issues/labels#remove-all-labels-from-an-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/issues/{issue_number}/labels documentation_url: https://docs.github.com/rest/issues/labels#list-labels-for-an-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/issues/{issue_number}/labels documentation_url: https://docs.github.com/rest/issues/labels#add-labels-to-an-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/issues/{issue_number}/labels documentation_url: https://docs.github.com/rest/issues/labels#set-labels-for-an-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name} documentation_url: https://docs.github.com/rest/issues/labels#remove-a-label-from-an-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock documentation_url: https://docs.github.com/rest/issues/issues#unlock-an-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/issues/{issue_number}/lock documentation_url: https://docs.github.com/rest/issues/issues#lock-an-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/issues/{issue_number}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#list-reactions-for-an-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/issues/{issue_number}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#create-reaction-for-an-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id} documentation_url: https://docs.github.com/rest/reactions/reactions#delete-an-issue-reaction openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/issues/{issue_number}/timeline documentation_url: https://docs.github.com/rest/issues/timeline#list-timeline-events-for-an-issue openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/keys documentation_url: https://docs.github.com/rest/deploy-keys/deploy-keys#list-deploy-keys openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/keys documentation_url: https://docs.github.com/rest/deploy-keys/deploy-keys#create-a-deploy-key openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/keys/{key_id} documentation_url: https://docs.github.com/rest/deploy-keys/deploy-keys#delete-a-deploy-key openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/keys/{key_id} documentation_url: https://docs.github.com/rest/deploy-keys/deploy-keys#get-a-deploy-key openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/labels documentation_url: https://docs.github.com/rest/issues/labels#list-labels-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/labels documentation_url: https://docs.github.com/rest/issues/labels#create-a-label openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/labels/{name} documentation_url: https://docs.github.com/rest/issues/labels#delete-a-label openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/labels/{name} documentation_url: https://docs.github.com/rest/issues/labels#get-a-label openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/labels/{name} documentation_url: https://docs.github.com/rest/issues/labels#update-a-label openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/languages documentation_url: https://docs.github.com/rest/repos/repos#list-repository-languages openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/lfs documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/repos/lfs#disable-git-lfs-for-a-repository openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/lfs documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/repos/lfs#enable-git-lfs-for-a-repository openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/license documentation_url: https://docs.github.com/rest/licenses/licenses#get-the-license-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/merge-upstream documentation_url: https://docs.github.com/rest/branches/branches#sync-a-fork-branch-with-the-upstream-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/merges documentation_url: https://docs.github.com/rest/branches/branches#merge-a-branch openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/milestones documentation_url: https://docs.github.com/rest/issues/milestones#list-milestones openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/milestones documentation_url: https://docs.github.com/rest/issues/milestones#create-a-milestone openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/milestones/{milestone_number} documentation_url: https://docs.github.com/rest/issues/milestones#delete-a-milestone openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/milestones/{milestone_number} documentation_url: https://docs.github.com/rest/issues/milestones#get-a-milestone openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/milestones/{milestone_number} documentation_url: https://docs.github.com/rest/issues/milestones#update-a-milestone openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels documentation_url: https://docs.github.com/rest/issues/labels#list-labels-for-issues-in-a-milestone openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/notifications documentation_url: https://docs.github.com/rest/activity/notifications#list-repository-notifications-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/notifications documentation_url: https://docs.github.com/rest/activity/notifications#mark-repository-notifications-as-read openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/pages documentation_url: https://docs.github.com/rest/pages/pages#delete-a-apiname-pages-site openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pages documentation_url: https://docs.github.com/rest/pages/pages#get-a-apiname-pages-site openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/pages documentation_url: https://docs.github.com/rest/pages/pages#create-a-apiname-pages-site openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/pages documentation_url: https://docs.github.com/rest/pages/pages#update-information-about-a-apiname-pages-site openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pages/builds documentation_url: https://docs.github.com/rest/pages/pages#list-apiname-pages-builds openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/pages/builds documentation_url: https://docs.github.com/rest/pages/pages#request-a-apiname-pages-build openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pages/builds/latest documentation_url: https://docs.github.com/rest/pages/pages#get-latest-pages-build openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pages/builds/{build_id} documentation_url: https://docs.github.com/rest/pages/pages#get-apiname-pages-build openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/pages/deployment documentation_url: https://docs.github.com/rest/pages/pages#create-a-github-pages-deployment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pages/health documentation_url: https://docs.github.com/rest/pages/pages#get-a-dns-health-check-for-github-pages openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/pre-receive-hooks documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/repo-pre-receive-hooks#list-pre-receive-hooks-for-a-repository openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/pre-receive-hooks/{pre_receive_hook_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/repo-pre-receive-hooks#remove-pre-receive-hook-enforcement-for-a-repository openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pre-receive-hooks/{pre_receive_hook_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/repo-pre-receive-hooks#get-a-pre-receive-hook-for-a-repository openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/pre-receive-hooks/{pre_receive_hook_id} documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/repo-pre-receive-hooks#update-pre-receive-hook-enforcement-for-a-repository openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/private-vulnerability-reporting documentation_url: https://docs.github.com/rest/repos/repos#disable-private-vulnerability-reporting-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /repos/{owner}/{repo}/private-vulnerability-reporting documentation_url: https://docs.github.com/rest/repos/repos#enable-private-vulnerability-reporting-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/projects documentation_url: https://docs.github.com/rest/projects/projects#list-repository-projects openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/projects documentation_url: https://docs.github.com/rest/projects/projects#create-a-repository-project openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/properties/values documentation_url: https://docs.github.com/rest/repos/custom-properties#get-all-custom-property-values-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/pulls documentation_url: https://docs.github.com/rest/pulls/pulls#list-pull-requests openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/pulls documentation_url: https://docs.github.com/rest/pulls/pulls#create-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pulls/comments documentation_url: https://docs.github.com/rest/pulls/comments#list-review-comments-in-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id} documentation_url: https://docs.github.com/rest/pulls/comments#delete-a-review-comment-for-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pulls/comments/{comment_id} documentation_url: https://docs.github.com/rest/pulls/comments#get-a-review-comment-for-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id} documentation_url: https://docs.github.com/rest/pulls/comments#update-a-review-comment-for-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#list-reactions-for-a-pull-request-review-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#create-reaction-for-a-pull-request-review-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id} documentation_url: https://docs.github.com/rest/reactions/reactions#delete-a-pull-request-comment-reaction openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pulls/{pull_number} documentation_url: https://docs.github.com/rest/pulls/pulls#get-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/pulls/{pull_number} documentation_url: https://docs.github.com/rest/pulls/pulls#update-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces documentation_url: https://docs.github.com/rest/codespaces/codespaces#create-a-codespace-from-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/pulls/{pull_number}/comments documentation_url: https://docs.github.com/rest/pulls/comments#list-review-comments-on-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/pulls/{pull_number}/comments documentation_url: https://docs.github.com/rest/pulls/comments#create-a-review-comment-for-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies documentation_url: https://docs.github.com/rest/pulls/comments#create-a-reply-for-a-review-comment openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pulls/{pull_number}/commits documentation_url: https://docs.github.com/rest/pulls/pulls#list-commits-on-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pulls/{pull_number}/files documentation_url: https://docs.github.com/rest/pulls/pulls#list-pull-requests-files openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pulls/{pull_number}/merge documentation_url: https://docs.github.com/rest/pulls/pulls#check-if-a-pull-request-has-been-merged openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge documentation_url: https://docs.github.com/rest/pulls/pulls#merge-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers documentation_url: https://docs.github.com/rest/pulls/review-requests#remove-requested-reviewers-from-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers documentation_url: https://docs.github.com/rest/pulls/review-requests#get-all-requested-reviewers-for-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers documentation_url: https://docs.github.com/rest/pulls/review-requests#request-reviewers-for-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews documentation_url: https://docs.github.com/rest/pulls/reviews#list-reviews-for-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews documentation_url: https://docs.github.com/rest/pulls/reviews#create-a-review-for-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id} documentation_url: https://docs.github.com/rest/pulls/reviews#delete-a-pending-review-for-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id} documentation_url: https://docs.github.com/rest/pulls/reviews#get-a-review-for-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id} documentation_url: https://docs.github.com/rest/pulls/reviews#update-a-review-for-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments documentation_url: https://docs.github.com/rest/pulls/reviews#list-comments-for-a-pull-request-review openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals documentation_url: https://docs.github.com/rest/pulls/reviews#dismiss-a-review-for-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events documentation_url: https://docs.github.com/rest/pulls/reviews#submit-a-review-for-a-pull-request openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch documentation_url: https://docs.github.com/rest/pulls/pulls#update-a-pull-request-branch openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/readme documentation_url: https://docs.github.com/rest/repos/contents#get-a-repository-readme openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/readme/{dir} documentation_url: https://docs.github.com/rest/repos/contents#get-a-repository-readme-for-a-directory openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/releases documentation_url: https://docs.github.com/rest/releases/releases#list-releases openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/releases documentation_url: https://docs.github.com/rest/releases/releases#create-a-release openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/releases/assets/{asset_id} documentation_url: https://docs.github.com/rest/releases/assets#delete-a-release-asset openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/releases/assets/{asset_id} documentation_url: https://docs.github.com/rest/releases/assets#get-a-release-asset openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/releases/assets/{asset_id} documentation_url: https://docs.github.com/rest/releases/assets#update-a-release-asset openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/releases/generate-notes documentation_url: https://docs.github.com/rest/releases/releases#generate-release-notes-content-for-a-release openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/releases/latest documentation_url: https://docs.github.com/rest/releases/releases#get-the-latest-release openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/releases/tags/{tag} documentation_url: https://docs.github.com/rest/releases/releases#get-a-release-by-tag-name openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/releases/{release_id} documentation_url: https://docs.github.com/rest/releases/releases#delete-a-release openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/releases/{release_id} documentation_url: https://docs.github.com/rest/releases/releases#get-a-release openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/releases/{release_id} documentation_url: https://docs.github.com/rest/releases/releases#update-a-release openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/releases/{release_id}/assets documentation_url: https://docs.github.com/rest/releases/assets#list-release-assets openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/releases/{release_id}/assets documentation_url: https://docs.github.com/rest/releases/assets#upload-a-release-asset openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/releases/{release_id}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#list-reactions-for-a-release openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/releases/{release_id}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#create-reaction-for-a-release openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id} documentation_url: https://docs.github.com/rest/reactions/reactions#delete-a-release-reaction openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/replicas/caches documentation_url: https://docs.github.com/enterprise-server@3.11/rest/repos/repos#list-repository-cache-replication-status openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/rules/branches/{branch} documentation_url: https://docs.github.com/rest/repos/rules#get-rules-for-a-branch openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/rulesets documentation_url: https://docs.github.com/rest/repos/rules#get-all-repository-rulesets openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/rulesets documentation_url: https://docs.github.com/rest/repos/rules#create-a-repository-ruleset openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/rulesets/rule-suites documentation_url: https://docs.github.com/rest/repos/rule-suites#list-repository-rule-suites openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/rulesets/rule-suites/{rule_suite_id} documentation_url: https://docs.github.com/rest/repos/rule-suites#get-a-repository-rule-suite openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /repos/{owner}/{repo}/rulesets/{ruleset_id} documentation_url: https://docs.github.com/rest/repos/rules#delete-a-repository-ruleset openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/rulesets/{ruleset_id} documentation_url: https://docs.github.com/rest/repos/rules#get-a-repository-ruleset openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/rulesets/{ruleset_id} documentation_url: https://docs.github.com/rest/repos/rules#update-a-repository-ruleset openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/secret-scanning/alerts documentation_url: https://docs.github.com/rest/secret-scanning/secret-scanning#list-secret-scanning-alerts-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number} documentation_url: https://docs.github.com/rest/secret-scanning/secret-scanning#get-a-secret-scanning-alert openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number} documentation_url: https://docs.github.com/rest/secret-scanning/secret-scanning#update-a-secret-scanning-alert openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations documentation_url: https://docs.github.com/rest/secret-scanning/secret-scanning#list-locations-for-a-secret-scanning-alert openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/security-advisories documentation_url: https://docs.github.com/rest/security-advisories/repository-advisories#list-repository-security-advisories openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /repos/{owner}/{repo}/security-advisories documentation_url: https://docs.github.com/rest/security-advisories/repository-advisories#create-a-repository-security-advisory openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /repos/{owner}/{repo}/security-advisories/reports documentation_url: https://docs.github.com/rest/security-advisories/repository-advisories#privately-report-a-security-vulnerability openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/security-advisories/{ghsa_id} documentation_url: https://docs.github.com/rest/security-advisories/repository-advisories#get-a-repository-security-advisory openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PATCH /repos/{owner}/{repo}/security-advisories/{ghsa_id} documentation_url: https://docs.github.com/rest/security-advisories/repository-advisories#update-a-repository-security-advisory openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/cve documentation_url: https://docs.github.com/rest/security-advisories/repository-advisories#request-a-cve-for-a-repository-security-advisory openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /repos/{owner}/{repo}/security-advisories/{ghsa_id}/forks documentation_url: https://docs.github.com/rest/security-advisories/repository-advisories#create-a-temporary-private-fork openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/stargazers documentation_url: https://docs.github.com/rest/activity/starring#list-stargazers openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/stats/code_frequency documentation_url: https://docs.github.com/rest/metrics/statistics#get-the-weekly-commit-activity openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/stats/commit_activity documentation_url: https://docs.github.com/rest/metrics/statistics#get-the-last-year-of-commit-activity openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/stats/contributors documentation_url: https://docs.github.com/rest/metrics/statistics#get-all-contributor-commit-activity openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/stats/participation documentation_url: https://docs.github.com/rest/metrics/statistics#get-the-weekly-commit-count openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/stats/punch_card documentation_url: https://docs.github.com/rest/metrics/statistics#get-the-hourly-commit-count-for-each-day openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/statuses/{sha} documentation_url: https://docs.github.com/rest/commits/statuses#create-a-commit-status openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/subscribers documentation_url: https://docs.github.com/rest/activity/watching#list-watchers openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/subscription documentation_url: https://docs.github.com/rest/activity/watching#delete-a-repository-subscription openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/subscription documentation_url: https://docs.github.com/rest/activity/watching#get-a-repository-subscription openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/subscription documentation_url: https://docs.github.com/rest/activity/watching#set-a-repository-subscription openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/tags documentation_url: https://docs.github.com/rest/repos/repos#list-repository-tags openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/tags/protection documentation_url: https://docs.github.com/rest/repos/tags#list-tag-protection-states-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{owner}/{repo}/tags/protection documentation_url: https://docs.github.com/rest/repos/tags#create-a-tag-protection-state-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id} documentation_url: https://docs.github.com/rest/repos/tags#delete-a-tag-protection-state-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/tarball/{ref} documentation_url: https://docs.github.com/rest/repos/contents#download-a-repository-archive-tar openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/teams documentation_url: https://docs.github.com/rest/repos/repos#list-repository-teams openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/topics documentation_url: https://docs.github.com/rest/repos/repos#get-all-repository-topics openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/topics documentation_url: https://docs.github.com/rest/repos/repos#replace-all-repository-topics openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/traffic/clones documentation_url: https://docs.github.com/rest/metrics/traffic#get-repository-clones openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/traffic/popular/paths documentation_url: https://docs.github.com/rest/metrics/traffic#get-top-referral-paths openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/traffic/popular/referrers documentation_url: https://docs.github.com/rest/metrics/traffic#get-top-referral-sources openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /repos/{owner}/{repo}/traffic/views documentation_url: https://docs.github.com/rest/metrics/traffic#get-page-views openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /repos/{owner}/{repo}/transfer documentation_url: https://docs.github.com/rest/repos/repos#transfer-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repos/{owner}/{repo}/vulnerability-alerts documentation_url: https://docs.github.com/rest/repos/repos#disable-vulnerability-alerts openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/vulnerability-alerts documentation_url: https://docs.github.com/rest/repos/repos#check-if-vulnerability-alerts-are-enabled-for-a-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repos/{owner}/{repo}/vulnerability-alerts documentation_url: https://docs.github.com/rest/repos/repos#enable-vulnerability-alerts openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repos/{owner}/{repo}/zipball/{ref} documentation_url: https://docs.github.com/rest/repos/contents#download-a-repository-archive-zip openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repos/{template_owner}/{template_repo}/generate documentation_url: https://docs.github.com/rest/repos/repos#create-a-repository-using-a-template openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repositories documentation_url: https://docs.github.com/rest/repos/repos#list-public-repositories openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repositories/{repository_id}/environments/{environment_name}/secrets documentation_url: https://docs.github.com/rest/actions/secrets#list-environment-secrets openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key documentation_url: https://docs.github.com/rest/actions/secrets#get-an-environment-public-key openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name} documentation_url: https://docs.github.com/rest/actions/secrets#delete-an-environment-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name} documentation_url: https://docs.github.com/rest/actions/secrets#get-an-environment-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name} documentation_url: https://docs.github.com/rest/actions/secrets#create-or-update-an-environment-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repositories/{repository_id}/environments/{environment_name}/variables documentation_url: https://docs.github.com/rest/actions/variables#list-environment-variables openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /repositories/{repository_id}/environments/{environment_name}/variables documentation_url: https://docs.github.com/rest/actions/variables#create-an-environment-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /repositories/{repository_id}/environments/{environment_name}/variables/{name} documentation_url: https://docs.github.com/rest/actions/variables#delete-an-environment-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /repositories/{repository_id}/environments/{environment_name}/variables/{name} documentation_url: https://docs.github.com/rest/actions/variables#get-an-environment-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /repositories/{repository_id}/environments/{environment_name}/variables/{name} documentation_url: https://docs.github.com/rest/actions/variables#update-an-environment-variable openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /scim/v2/Groups documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/scim#list-provisioned-scim-groups-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /scim/v2/Groups documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/scim#provision-a-scim-enterprise-group openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /scim/v2/Groups/{scim_group_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/scim#delete-a-scim-group-from-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /scim/v2/Groups/{scim_group_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/scim#get-scim-provisioning-information-for-an-enterprise-group openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /scim/v2/Groups/{scim_group_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/scim#update-an-attribute-for-a-scim-enterprise-group openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /scim/v2/Groups/{scim_group_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/scim#set-scim-information-for-a-provisioned-enterprise-group openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /scim/v2/Users documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/scim#list-scim-provisioned-identities-for-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /scim/v2/Users documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/scim#provision-a-scim-enterprise-user openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /scim/v2/Users/{scim_user_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/scim#delete-a-scim-user-from-an-enterprise openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /scim/v2/Users/{scim_user_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/scim#get-scim-provisioning-information-for-an-enterprise-user openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /scim/v2/Users/{scim_user_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/scim#update-an-attribute-for-a-scim-enterprise-user openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /scim/v2/Users/{scim_user_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/enterprise-admin/scim#set-scim-information-for-a-provisioned-enterprise-user openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /scim/v2/organizations/{org}/Users documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/scim/scim#list-scim-provisioned-identities openapi_files: - descriptions/ghec/ghec.json - name: POST /scim/v2/organizations/{org}/Users documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/scim/scim#provision-and-invite-a-scim-user openapi_files: - descriptions/ghec/ghec.json - name: DELETE /scim/v2/organizations/{org}/Users/{scim_user_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/scim/scim#delete-a-scim-user-from-an-organization openapi_files: - descriptions/ghec/ghec.json - name: GET /scim/v2/organizations/{org}/Users/{scim_user_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/scim/scim#get-scim-provisioning-information-for-a-user openapi_files: - descriptions/ghec/ghec.json - name: PATCH /scim/v2/organizations/{org}/Users/{scim_user_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/scim/scim#update-an-attribute-for-a-scim-user openapi_files: - descriptions/ghec/ghec.json - name: PUT /scim/v2/organizations/{org}/Users/{scim_user_id} documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/scim/scim#update-a-provisioned-organization-membership openapi_files: - descriptions/ghec/ghec.json - name: GET /search/code documentation_url: https://docs.github.com/rest/search/search#search-code openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /search/commits documentation_url: https://docs.github.com/rest/search/search#search-commits openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /search/issues documentation_url: https://docs.github.com/rest/search/search#search-issues-and-pull-requests openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /search/labels documentation_url: https://docs.github.com/rest/search/search#search-labels openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /search/repositories documentation_url: https://docs.github.com/rest/search/search#search-repositories openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /search/topics documentation_url: https://docs.github.com/rest/search/search#search-topics openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /search/users documentation_url: https://docs.github.com/rest/search/search#search-users openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /setup/api/configcheck documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/management-console#get-the-configuration-status openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /setup/api/configure documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/management-console#start-a-configuration-process openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /setup/api/maintenance documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/management-console#get-the-maintenance-status openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /setup/api/maintenance documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/management-console#enable-or-disable-maintenance-mode openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /setup/api/settings documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/management-console#get-settings openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /setup/api/settings documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/management-console#set-settings openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /setup/api/settings/authorized-keys documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/management-console#remove-an-authorized-ssh-key openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /setup/api/settings/authorized-keys documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/management-console#get-all-authorized-ssh-keys openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /setup/api/settings/authorized-keys documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/management-console#add-an-authorized-ssh-key openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /setup/api/start documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/management-console#create-a-github-license openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: POST /setup/api/upgrade documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/management-console#upgrade-a-license openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /teams/{team_id} documentation_url: https://docs.github.com/rest/teams/teams#delete-a-team-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /teams/{team_id} documentation_url: https://docs.github.com/rest/teams/teams#get-a-team-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /teams/{team_id} documentation_url: https://docs.github.com/rest/teams/teams#update-a-team-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /teams/{team_id}/discussions documentation_url: https://docs.github.com/rest/teams/discussions#list-discussions-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /teams/{team_id}/discussions documentation_url: https://docs.github.com/rest/teams/discussions#create-a-discussion-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /teams/{team_id}/discussions/{discussion_number} documentation_url: https://docs.github.com/rest/teams/discussions#delete-a-discussion-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /teams/{team_id}/discussions/{discussion_number} documentation_url: https://docs.github.com/rest/teams/discussions#get-a-discussion-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /teams/{team_id}/discussions/{discussion_number} documentation_url: https://docs.github.com/rest/teams/discussions#update-a-discussion-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /teams/{team_id}/discussions/{discussion_number}/comments documentation_url: https://docs.github.com/rest/teams/discussion-comments#list-discussion-comments-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /teams/{team_id}/discussions/{discussion_number}/comments documentation_url: https://docs.github.com/rest/teams/discussion-comments#create-a-discussion-comment-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number} documentation_url: https://docs.github.com/rest/teams/discussion-comments#delete-a-discussion-comment-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number} documentation_url: https://docs.github.com/rest/teams/discussion-comments#get-a-discussion-comment-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number} documentation_url: https://docs.github.com/rest/teams/discussion-comments#update-a-discussion-comment-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#list-reactions-for-a-team-discussion-comment-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#create-reaction-for-a-team-discussion-comment-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /teams/{team_id}/discussions/{discussion_number}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#list-reactions-for-a-team-discussion-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /teams/{team_id}/discussions/{discussion_number}/reactions documentation_url: https://docs.github.com/rest/reactions/reactions#create-reaction-for-a-team-discussion-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /teams/{team_id}/invitations documentation_url: https://docs.github.com/rest/teams/members#list-pending-team-invitations-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /teams/{team_id}/members documentation_url: https://docs.github.com/rest/teams/members#list-team-members-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /teams/{team_id}/members/{username} documentation_url: https://docs.github.com/rest/teams/members#remove-team-member-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /teams/{team_id}/members/{username} documentation_url: https://docs.github.com/rest/teams/members#get-team-member-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /teams/{team_id}/members/{username} documentation_url: https://docs.github.com/rest/teams/members#add-team-member-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /teams/{team_id}/memberships/{username} documentation_url: https://docs.github.com/rest/teams/members#remove-team-membership-for-a-user-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /teams/{team_id}/memberships/{username} documentation_url: https://docs.github.com/rest/teams/members#get-team-membership-for-a-user-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /teams/{team_id}/memberships/{username} documentation_url: https://docs.github.com/rest/teams/members#add-or-update-team-membership-for-a-user-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /teams/{team_id}/projects documentation_url: https://docs.github.com/rest/teams/teams#list-team-projects-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /teams/{team_id}/projects/{project_id} documentation_url: https://docs.github.com/rest/teams/teams#remove-a-project-from-a-team-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /teams/{team_id}/projects/{project_id} documentation_url: https://docs.github.com/rest/teams/teams#check-team-permissions-for-a-project-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /teams/{team_id}/projects/{project_id} documentation_url: https://docs.github.com/rest/teams/teams#add-or-update-team-project-permissions-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /teams/{team_id}/repos documentation_url: https://docs.github.com/rest/teams/teams#list-team-repositories-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /teams/{team_id}/repos/{owner}/{repo} documentation_url: https://docs.github.com/rest/teams/teams#remove-a-repository-from-a-team-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /teams/{team_id}/repos/{owner}/{repo} documentation_url: https://docs.github.com/rest/teams/teams#check-team-permissions-for-a-repository-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /teams/{team_id}/repos/{owner}/{repo} documentation_url: https://docs.github.com/rest/teams/teams#add-or-update-team-repository-permissions-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /teams/{team_id}/team-sync/group-mappings documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/teams/team-sync#list-idp-groups-for-a-team-legacy openapi_files: - descriptions/ghec/ghec.json - name: PATCH /teams/{team_id}/team-sync/group-mappings documentation_url: https://docs.github.com/enterprise-cloud@latest//rest/teams/team-sync#create-or-update-idp-group-connections-legacy openapi_files: - descriptions/ghec/ghec.json - name: GET /teams/{team_id}/teams documentation_url: https://docs.github.com/rest/teams/teams#list-child-teams-legacy openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user documentation_url: https://docs.github.com/rest/users/users#get-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /user documentation_url: https://docs.github.com/rest/users/users#update-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/blocks documentation_url: https://docs.github.com/rest/users/blocking#list-users-blocked-by-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /user/blocks/{username} documentation_url: https://docs.github.com/rest/users/blocking#unblock-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/blocks/{username} documentation_url: https://docs.github.com/rest/users/blocking#check-if-a-user-is-blocked-by-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /user/blocks/{username} documentation_url: https://docs.github.com/rest/users/blocking#block-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/codespaces documentation_url: https://docs.github.com/rest/codespaces/codespaces#list-codespaces-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /user/codespaces documentation_url: https://docs.github.com/rest/codespaces/codespaces#create-a-codespace-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/codespaces/secrets documentation_url: https://docs.github.com/rest/codespaces/secrets#list-secrets-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/codespaces/secrets/public-key documentation_url: https://docs.github.com/rest/codespaces/secrets#get-public-key-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /user/codespaces/secrets/{secret_name} documentation_url: https://docs.github.com/rest/codespaces/secrets#delete-a-secret-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/codespaces/secrets/{secret_name} documentation_url: https://docs.github.com/rest/codespaces/secrets#get-a-secret-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /user/codespaces/secrets/{secret_name} documentation_url: https://docs.github.com/rest/codespaces/secrets#create-or-update-a-secret-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/codespaces/secrets/{secret_name}/repositories documentation_url: https://docs.github.com/rest/codespaces/secrets#list-selected-repositories-for-a-user-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /user/codespaces/secrets/{secret_name}/repositories documentation_url: https://docs.github.com/rest/codespaces/secrets#set-selected-repositories-for-a-user-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id} documentation_url: https://docs.github.com/rest/codespaces/secrets#remove-a-selected-repository-from-a-user-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id} documentation_url: https://docs.github.com/rest/codespaces/secrets#add-a-selected-repository-to-a-user-secret openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /user/codespaces/{codespace_name} documentation_url: https://docs.github.com/rest/codespaces/codespaces#delete-a-codespace-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/codespaces/{codespace_name} documentation_url: https://docs.github.com/rest/codespaces/codespaces#get-a-codespace-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PATCH /user/codespaces/{codespace_name} documentation_url: https://docs.github.com/rest/codespaces/codespaces#update-a-codespace-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /user/codespaces/{codespace_name}/exports documentation_url: https://docs.github.com/rest/codespaces/codespaces#export-a-codespace-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/codespaces/{codespace_name}/exports/{export_id} documentation_url: https://docs.github.com/rest/codespaces/codespaces#get-details-about-a-codespace-export openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/codespaces/{codespace_name}/machines documentation_url: https://docs.github.com/rest/codespaces/machines#list-machine-types-for-a-codespace openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /user/codespaces/{codespace_name}/publish documentation_url: https://docs.github.com/rest/codespaces/codespaces#create-a-repository-from-an-unpublished-codespace openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /user/codespaces/{codespace_name}/start documentation_url: https://docs.github.com/rest/codespaces/codespaces#start-a-codespace-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: POST /user/codespaces/{codespace_name}/stop documentation_url: https://docs.github.com/rest/codespaces/codespaces#stop-a-codespace-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/docker/conflicts documentation_url: https://docs.github.com/rest/packages/packages#get-list-of-conflicting-packages-during-docker-migration-for-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /user/email/visibility documentation_url: https://docs.github.com/rest/users/emails#set-primary-email-visibility-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /user/emails documentation_url: https://docs.github.com/rest/users/emails#delete-an-email-address-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/emails documentation_url: https://docs.github.com/rest/users/emails#list-email-addresses-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /user/emails documentation_url: https://docs.github.com/rest/users/emails#add-an-email-address-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/followers documentation_url: https://docs.github.com/rest/users/followers#list-followers-of-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/following documentation_url: https://docs.github.com/rest/users/followers#list-the-people-the-authenticated-user-follows openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /user/following/{username} documentation_url: https://docs.github.com/rest/users/followers#unfollow-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/following/{username} documentation_url: https://docs.github.com/rest/users/followers#check-if-a-person-is-followed-by-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /user/following/{username} documentation_url: https://docs.github.com/rest/users/followers#follow-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/gpg_keys documentation_url: https://docs.github.com/rest/users/gpg-keys#list-gpg-keys-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /user/gpg_keys documentation_url: https://docs.github.com/rest/users/gpg-keys#create-a-gpg-key-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /user/gpg_keys/{gpg_key_id} documentation_url: https://docs.github.com/rest/users/gpg-keys#delete-a-gpg-key-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/gpg_keys/{gpg_key_id} documentation_url: https://docs.github.com/rest/users/gpg-keys#get-a-gpg-key-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/installations documentation_url: https://docs.github.com/rest/apps/installations#list-app-installations-accessible-to-the-user-access-token openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/installations/{installation_id}/repositories documentation_url: https://docs.github.com/rest/apps/installations#list-repositories-accessible-to-the-user-access-token openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /user/installations/{installation_id}/repositories/{repository_id} documentation_url: https://docs.github.com/rest/apps/installations#remove-a-repository-from-an-app-installation openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /user/installations/{installation_id}/repositories/{repository_id} documentation_url: https://docs.github.com/rest/apps/installations#add-a-repository-to-an-app-installation openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /user/interaction-limits documentation_url: https://docs.github.com/rest/interactions/user#remove-interaction-restrictions-from-your-public-repositories openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/interaction-limits documentation_url: https://docs.github.com/rest/interactions/user#get-interaction-restrictions-for-your-public-repositories openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: PUT /user/interaction-limits documentation_url: https://docs.github.com/rest/interactions/user#set-interaction-restrictions-for-your-public-repositories openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/issues documentation_url: https://docs.github.com/rest/issues/issues#list-user-account-issues-assigned-to-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/keys documentation_url: https://docs.github.com/rest/users/keys#list-public-ssh-keys-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /user/keys documentation_url: https://docs.github.com/rest/users/keys#create-a-public-ssh-key-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /user/keys/{key_id} documentation_url: https://docs.github.com/rest/users/keys#delete-a-public-ssh-key-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/keys/{key_id} documentation_url: https://docs.github.com/rest/users/keys#get-a-public-ssh-key-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/marketplace_purchases documentation_url: https://docs.github.com/rest/apps/marketplace#list-subscriptions-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/marketplace_purchases/stubbed documentation_url: https://docs.github.com/rest/apps/marketplace#list-subscriptions-for-the-authenticated-user-stubbed openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/memberships/orgs documentation_url: https://docs.github.com/rest/orgs/members#list-organization-memberships-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/memberships/orgs/{org} documentation_url: https://docs.github.com/rest/orgs/members#get-an-organization-membership-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /user/memberships/orgs/{org} documentation_url: https://docs.github.com/rest/orgs/members#update-an-organization-membership-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/migrations documentation_url: https://docs.github.com/rest/migrations/users#list-user-migrations openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /user/migrations documentation_url: https://docs.github.com/rest/migrations/users#start-a-user-migration openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/migrations/{migration_id} documentation_url: https://docs.github.com/rest/migrations/users#get-a-user-migration-status openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /user/migrations/{migration_id}/archive documentation_url: https://docs.github.com/rest/migrations/users#delete-a-user-migration-archive openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/migrations/{migration_id}/archive documentation_url: https://docs.github.com/rest/migrations/users#download-a-user-migration-archive openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock documentation_url: https://docs.github.com/rest/migrations/users#unlock-a-user-repository openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /user/migrations/{migration_id}/repositories documentation_url: https://docs.github.com/rest/migrations/users#list-repositories-for-a-user-migration openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/orgs documentation_url: https://docs.github.com/rest/orgs/orgs#list-organizations-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/packages documentation_url: https://docs.github.com/rest/packages/packages#list-packages-for-the-authenticated-users-namespace openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /user/packages/{package_type}/{package_name} documentation_url: https://docs.github.com/rest/packages/packages#delete-a-package-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/packages/{package_type}/{package_name} documentation_url: https://docs.github.com/rest/packages/packages#get-a-package-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /user/packages/{package_type}/{package_name}/restore documentation_url: https://docs.github.com/rest/packages/packages#restore-a-package-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/packages/{package_type}/{package_name}/versions documentation_url: https://docs.github.com/rest/packages/packages#list-package-versions-for-a-package-owned-by-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id} documentation_url: https://docs.github.com/rest/packages/packages#delete-a-package-version-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/packages/{package_type}/{package_name}/versions/{package_version_id} documentation_url: https://docs.github.com/rest/packages/packages#get-a-package-version-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore documentation_url: https://docs.github.com/rest/packages/packages#restore-a-package-version-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /user/projects documentation_url: https://docs.github.com/rest/projects/projects#create-a-user-project openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/public_emails documentation_url: https://docs.github.com/rest/users/emails#list-public-email-addresses-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/repos documentation_url: https://docs.github.com/rest/repos/repos#list-repositories-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /user/repos documentation_url: https://docs.github.com/rest/repos/repos#create-a-repository-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/repository_invitations documentation_url: https://docs.github.com/rest/collaborators/invitations#list-repository-invitations-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /user/repository_invitations/{invitation_id} documentation_url: https://docs.github.com/rest/collaborators/invitations#decline-a-repository-invitation openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PATCH /user/repository_invitations/{invitation_id} documentation_url: https://docs.github.com/rest/collaborators/invitations#accept-a-repository-invitation openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /user/social_accounts documentation_url: https://docs.github.com/rest/users/social-accounts#delete-social-accounts-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/social_accounts documentation_url: https://docs.github.com/rest/users/social-accounts#list-social-accounts-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /user/social_accounts documentation_url: https://docs.github.com/rest/users/social-accounts#add-social-accounts-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/ssh_signing_keys documentation_url: https://docs.github.com/rest/users/ssh-signing-keys#list-ssh-signing-keys-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /user/ssh_signing_keys documentation_url: https://docs.github.com/rest/users/ssh-signing-keys#create-a-ssh-signing-key-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /user/ssh_signing_keys/{ssh_signing_key_id} documentation_url: https://docs.github.com/rest/users/ssh-signing-keys#delete-an-ssh-signing-key-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/ssh_signing_keys/{ssh_signing_key_id} documentation_url: https://docs.github.com/rest/users/ssh-signing-keys#get-an-ssh-signing-key-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/starred documentation_url: https://docs.github.com/rest/activity/starring#list-repositories-starred-by-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /user/starred/{owner}/{repo} documentation_url: https://docs.github.com/rest/activity/starring#unstar-a-repository-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/starred/{owner}/{repo} documentation_url: https://docs.github.com/rest/activity/starring#check-if-a-repository-is-starred-by-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /user/starred/{owner}/{repo} documentation_url: https://docs.github.com/rest/activity/starring#star-a-repository-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/subscriptions documentation_url: https://docs.github.com/rest/activity/watching#list-repositories-watched-by-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /user/teams documentation_url: https://docs.github.com/rest/teams/teams#list-teams-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users documentation_url: https://docs.github.com/rest/users/users#list-users openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username} documentation_url: https://docs.github.com/rest/users/users#get-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/docker/conflicts documentation_url: https://docs.github.com/rest/packages/packages#get-list-of-conflicting-packages-during-docker-migration-for-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/events documentation_url: https://docs.github.com/rest/activity/events#list-events-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/events/orgs/{org} documentation_url: https://docs.github.com/rest/activity/events#list-organization-events-for-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/events/public documentation_url: https://docs.github.com/rest/activity/events#list-public-events-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/followers documentation_url: https://docs.github.com/rest/users/followers#list-followers-of-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/following documentation_url: https://docs.github.com/rest/users/followers#list-the-people-a-user-follows openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/following/{target_user} documentation_url: https://docs.github.com/rest/users/followers#check-if-a-user-follows-another-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/gists documentation_url: https://docs.github.com/rest/gists/gists#list-gists-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/gpg_keys documentation_url: https://docs.github.com/rest/users/gpg-keys#list-gpg-keys-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/hovercard documentation_url: https://docs.github.com/rest/users/users#get-contextual-information-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/installation documentation_url: https://docs.github.com/rest/apps/apps#get-a-user-installation-for-the-authenticated-app openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/keys documentation_url: https://docs.github.com/rest/users/keys#list-public-keys-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/orgs documentation_url: https://docs.github.com/rest/orgs/orgs#list-organizations-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/packages documentation_url: https://docs.github.com/rest/packages/packages#list-packages-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /users/{username}/packages/{package_type}/{package_name} documentation_url: https://docs.github.com/rest/packages/packages#delete-a-package-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/packages/{package_type}/{package_name} documentation_url: https://docs.github.com/rest/packages/packages#get-a-package-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /users/{username}/packages/{package_type}/{package_name}/restore documentation_url: https://docs.github.com/rest/packages/packages#restore-a-package-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/packages/{package_type}/{package_name}/versions documentation_url: https://docs.github.com/rest/packages/packages#list-package-versions-for-a-package-owned-by-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id} documentation_url: https://docs.github.com/rest/packages/packages#delete-package-version-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id} documentation_url: https://docs.github.com/rest/packages/packages#get-a-package-version-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore documentation_url: https://docs.github.com/rest/packages/packages#restore-package-version-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/projects documentation_url: https://docs.github.com/rest/projects/projects#list-user-projects openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/received_events documentation_url: https://docs.github.com/rest/activity/events#list-events-received-by-the-authenticated-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/received_events/public documentation_url: https://docs.github.com/rest/activity/events#list-public-events-received-by-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/repos documentation_url: https://docs.github.com/rest/repos/repos#list-repositories-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/settings/billing/actions documentation_url: https://docs.github.com/rest/billing/billing#get-github-actions-billing-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /users/{username}/settings/billing/packages documentation_url: https://docs.github.com/rest/billing/billing#get-github-packages-billing-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /users/{username}/settings/billing/shared-storage documentation_url: https://docs.github.com/rest/billing/billing#get-shared-storage-billing-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: DELETE /users/{username}/site_admin documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#demote-a-site-administrator openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /users/{username}/site_admin documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#promote-a-user-to-be-a-site-administrator openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/social_accounts documentation_url: https://docs.github.com/rest/users/social-accounts#list-social-accounts-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/ssh_signing_keys documentation_url: https://docs.github.com/rest/users/ssh-signing-keys#list-ssh-signing-keys-for-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/starred documentation_url: https://docs.github.com/rest/activity/starring#list-repositories-starred-by-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: GET /users/{username}/subscriptions documentation_url: https://docs.github.com/rest/activity/watching#list-repositories-watched-by-a-user openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json - name: DELETE /users/{username}/suspended documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#unsuspend-a-user openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: PUT /users/{username}/suspended documentation_url: https://docs.github.com/enterprise-server@3.11/rest/enterprise-admin/users#suspend-a-user openapi_files: - descriptions/ghes-3.11/ghes-3.11.json - name: GET /versions documentation_url: https://docs.github.com/rest/meta/meta#get-all-api-versions openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - name: GET /zen documentation_url: https://docs.github.com/rest/meta/meta#get-the-zen-of-github openapi_files: - descriptions/api.github.com/api.github.com.json - descriptions/ghec/ghec.json - descriptions/ghes-3.11/ghes-3.11.json go-github-60.0.0/scrape/000077500000000000000000000000001457013574700147545ustar00rootroot00000000000000go-github-60.0.0/scrape/README.md000066400000000000000000000024331457013574700162350ustar00rootroot00000000000000[![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-60.0.0/scrape/apps.go000066400000000000000000000107331457013574700162520ustar00rootroot00000000000000// 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/v59/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-allowlist 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-allowlist 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-60.0.0/scrape/apps_test.go000066400000000000000000000047601457013574700173140ustar00rootroot00000000000000package scrape import ( "net/http" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-github/v59/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(t, 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(t, 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-60.0.0/scrape/example/000077500000000000000000000000001457013574700164075ustar00rootroot00000000000000go-github-60.0.0/scrape/example/scrape/000077500000000000000000000000001457013574700176645ustar00rootroot00000000000000go-github-60.0.0/scrape/example/scrape/main.go000066400000000000000000000030071457013574700211370ustar00rootroot00000000000000// 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-60.0.0/scrape/forms.go000066400000000000000000000065051457013574700164370ustar00rootroot00000000000000// 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-60.0.0/scrape/forms_test.go000066400000000000000000000063451457013574700175000ustar00rootroot00000000000000package 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) { err := r.ParseForm() if err != nil { t.Errorf("error parsing form: %v", err) } 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") } _, err := fetchAndSubmitForm(client.Client, client.baseURL.String()+"/", setValues) if err != nil { t.Errorf("fetchAndSubmitForm returned err: %v", err) } if !submitted { t.Error("form was never submitted") } } go-github-60.0.0/scrape/go.mod000066400000000000000000000003501457013574700160600ustar00rootroot00000000000000module github.com/google/go-github/scrape go 1.13 require ( github.com/PuerkitoBio/goquery v1.9.0 github.com/google/go-cmp v0.6.0 github.com/google/go-github/v59 v59.0.0 github.com/xlzd/gotp v0.1.0 golang.org/x/net v0.21.0 ) go-github-60.0.0/scrape/go.sum000066400000000000000000000121231457013574700161060ustar00rootroot00000000000000github.com/PuerkitoBio/goquery v1.9.0 h1:zgjKkdpRY9T97Q5DCtcXwfqkcylSFIVCocZmn2huTp8= github.com/PuerkitoBio/goquery v1.9.0/go.mod h1:cW1n6TmIMDoORQU5IU/P1T3tGFunOeXEpGP2WHRwkbY= github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss= github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-github/v59 v59.0.0 h1:7h6bgpF5as0YQLLkEiVqpgtJqjimMYhBkD4jT5aN3VA= github.com/google/go-github/v59 v59.0.0/go.mod h1:rJU4R0rQHFVFDOkqGWxfLNo6vEk4dv40oDjhV/gH6wM= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/xlzd/gotp v0.1.0 h1:37blvlKCh38s+fkem+fFh7sMnceltoIEBYTVXyoa5Po= github.com/xlzd/gotp v0.1.0/go.mod h1:ndLJ3JKzi3xLmUProq4LLxCuECL93dG9WASNLpHz8qg= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= go-github-60.0.0/scrape/payment.go000066400000000000000000000024521457013574700167630ustar00rootroot00000000000000// 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-60.0.0/scrape/scrape.go000066400000000000000000000111031457013574700165540ustar00rootroot00000000000000// 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) } defer resp.Body.Close() if resp.StatusCode == http.StatusNotFound { return nil, fmt.Errorf("received %v response fetching URL %q", resp.StatusCode, u) } 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-60.0.0/scrape/scrape_test.go000066400000000000000000000016301457013574700176170ustar00rootroot00000000000000package scrape import ( "io" "net/http" "net/http/httptest" "net/url" "os" "testing" ) // 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(t *testing.T, w io.Writer, filename string) { t.Helper() f, err := os.Open("testdata/" + filename) if err != nil { t.Errorf("unable to open test file: %v", err) } _, err = io.Copy(w, f) if err != nil { t.Errorf("failure copying test file: %v", err) } err = f.Close() if err != nil { t.Errorf("failure closing test file: %v", err) } } go-github-60.0.0/scrape/testdata/000077500000000000000000000000001457013574700165655ustar00rootroot00000000000000go-github-60.0.0/scrape/testdata/access-restrictions-disabled.html000066400000000000000000000043721457013574700252150ustar00rootroot00000000000000

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-60.0.0/scrape/testdata/access-restrictions-enabled.html000066400000000000000000000170231457013574700250350ustar00rootroot00000000000000

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-60.0.0/script/000077500000000000000000000000001457013574700150035ustar00rootroot00000000000000go-github-60.0.0/script/fmt.sh000077500000000000000000000003731457013574700161330ustar00rootroot00000000000000#!/bin/sh #/ script/fmt.sh runs go fmt on all go files in the project. set -e CDPATH="" cd -- "$(dirname -- "$0")/.." MOD_DIRS="$(git ls-files '*go.mod' | xargs dirname | sort)" for dir in $MOD_DIRS; do ( cd "$dir" go fmt ./... ) done go-github-60.0.0/script/generate.sh000077500000000000000000000023061457013574700171350ustar00rootroot00000000000000#!/bin/sh #/ script/generate.sh runs go generate on all modules in this repo. #/ `script/generate.sh --check` checks that the generated files are up to date. set -e CDPATH="" cd -- "$(dirname -- "$0")/.." if [ "$1" = "--check" ]; then GENTEMP="$(mktemp -d)" git worktree add -q --detach "$GENTEMP" trap 'git worktree remove -f "$GENTEMP"; rm -rf "$GENTEMP"' EXIT for f in $(git ls-files -com --exclude-standard); do target="$GENTEMP/$f" mkdir -p "$(dirname -- "$target")" cp "$f" "$target" done if [ -f "$(pwd)"/bin ]; then ln -s "$(pwd)"/bin "$GENTEMP"/bin fi ( cd "$GENTEMP" git add . git -c user.name='bot' -c user.email='bot@localhost' commit -m "generate" -q --allow-empty script/generate.sh [ -z "$(git status --porcelain)" ] || { msg="Generated files are out of date. Please run script/generate.sh and commit the results" if [ -n "$GITHUB_ACTIONS" ]; then echo "::error ::$msg" else echo "$msg" 1>&2 fi git diff exit 1 } ) exit 0 fi MOD_DIRS="$(git ls-files '*go.mod' | xargs dirname | sort)" for dir in $MOD_DIRS; do ( cd "$dir" go generate ./... go mod tidy -compat '1.21' ) done go-github-60.0.0/script/lint.sh000077500000000000000000000027441457013574700163170ustar00rootroot00000000000000#!/bin/sh #/ [ CHECK_GITHUB_OPENAPI=1 ] script/lint.sh runs linters and validates generated files. #/ When CHECK_GITHUB is set, it validates that openapi_operations.yaml is consistent with the #/ descriptions from github.com/github/rest-api-description. set -e GOLANGCI_LINT_VERSION="1.54.2" CDPATH="" cd -- "$(dirname -- "$0")/.." BIN="$(pwd -P)"/bin mkdir -p "$BIN" EXIT_CODE=0 fail() { echo "$@" EXIT_CODE=1 } # install golangci-lint bin/golangci-lint doesn't exist with the correct version if ! "$BIN"/golangci-lint --version 2> /dev/null | grep -q "$GOLANGCI_LINT_VERSION"; then GOBIN="$BIN" go install "github.com/golangci/golangci-lint/cmd/golangci-lint@v$GOLANGCI_LINT_VERSION" fi MOD_DIRS="$(git ls-files '*go.mod' | xargs dirname | sort)" for dir in $MOD_DIRS; do [ "$dir" = "example/newreposecretwithlibsodium" ] && continue echo linting "$dir" ( cd "$dir" # github actions output when running in an action if [ -n "$GITHUB_ACTIONS" ]; then "$BIN"/golangci-lint run --path-prefix "$dir" --out-format github-actions else "$BIN"/golangci-lint run --path-prefix "$dir" fi ) || fail "failed linting $dir" done if [ -n "$CHECK_GITHUB_OPENAPI" ]; then echo validating openapi_operations.yaml script/metadata.sh update-openapi --validate || fail "failed validating openapi_operations.yaml" fi echo validating generated files script/generate.sh --check || fail "failed validating generated files" [ -z "$FAILED" ] || exit 1 exit "$EXIT_CODE" go-github-60.0.0/script/metadata.sh000077500000000000000000000004011457013574700171150ustar00rootroot00000000000000#!/bin/sh #/ script/metadata.sh runs ./tools/metadata in the repository root with the given arguments set -e CDPATH="" cd -- "$(dirname -- "$0")/.." REPO_DIR="$(pwd)" ( cd tools/metadata go build -o "$REPO_DIR"/bin/metadata ) exec bin/metadata "$@" go-github-60.0.0/script/test.sh000077500000000000000000000013671457013574700163300ustar00rootroot00000000000000#!/bin/sh #/ script/test.sh runs tests on each go module in go-github. Arguments are passed to each go test invocation. #/ "-race -covermode atomic ./..." is used when no arguments are given. #/ #/ When UPDATE_GOLDEN is set, all directories named "golden" are removed before running tests. set -e CDPATH="" cd -- "$(dirname -- "$0")/.." if [ "$#" = "0" ]; then set -- -race -covermode atomic ./... fi if [ -n "$UPDATE_GOLDEN" ]; then find . -name golden -type d -exec rm -rf {} + fi MOD_DIRS="$(git ls-files '*go.mod' | xargs dirname | sort)" for dir in $MOD_DIRS; do [ "$dir" = "example/newreposecretwithlibsodium" ] && continue echo "testing $dir" ( cd "$dir" go test "$@" ) || FAILED=1 done if [ -n "$FAILED" ]; then exit 1 fi go-github-60.0.0/test/000077500000000000000000000000001457013574700144565ustar00rootroot00000000000000go-github-60.0.0/test/README.md000066400000000000000000000056071457013574700157450ustar00rootroot00000000000000go-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 Some tests create repositories. By default, the new repositories will be owned by the user identified by the OAuth token. Set the `GITHUB_OWNER=''` environment variable to specify a different owner, such as an organization. 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-60.0.0/test/fields/000077500000000000000000000000001457013574700157245ustar00rootroot00000000000000go-github-60.0.0/test/fields/fields.go000066400000000000000000000065241457013574700175300ustar00rootroot00000000000000// 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/v60/github" ) var ( client *github.Client 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 { client = github.NewClient(nil).WithAuthToken(token) } 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-60.0.0/test/integration/000077500000000000000000000000001457013574700170015ustar00rootroot00000000000000go-github-60.0.0/test/integration/activity_test.go000066400000000000000000000100531457013574700222220ustar00rootroot00000000000000// 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/v60/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-60.0.0/test/integration/audit_log_test.go000066400000000000000000000015371457013574700223440ustar00rootroot00000000000000// 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()) } } go-github-60.0.0/test/integration/authorizations_test.go000066400000000000000000000115201457013574700234510ustar00rootroot00000000000000// 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" "os" "strings" "testing" "time" "github.com/google/go-github/v60/github" ) const msgEnvMissing = "Skipping test because the required environment variable (%v) is not present." 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) } // 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) } } // 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-60.0.0/test/integration/doc.go000066400000000000000000000006601457013574700200770ustar00rootroot00000000000000// 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-60.0.0/test/integration/github_test.go000066400000000000000000000035351457013574700216570ustar00rootroot00000000000000// 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/v60/github" ) 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 { client = github.NewClient(nil).WithAuthToken(token) auth = true } } 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) { // determine the owner to use if one wasn't specified if owner == "" { owner = os.Getenv("GITHUB_OWNER") if owner == "" { me, _, err := client.Users.Get(context.Background(), "") if err != nil { return nil, err } owner = *me.Login } } // 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(), owner, &github.Repository{ Name: github.String(repoName), AutoInit: github.Bool(autoinit), }, ) if err != nil { return nil, err } return repo, nil } go-github-60.0.0/test/integration/issues_test.go000066400000000000000000000021711457013574700217030ustar00rootroot00000000000000// 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-60.0.0/test/integration/misc_test.go000066400000000000000000000027731457013574700213330ustar00rootroot00000000000000// 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.Emojis.List(context.Background()) if err != nil { t.Fatalf("List returned error: %v", err) } if len(emoji) == 0 { t.Errorf("List returned no emojis") } if _, ok := emoji["+1"]; !ok { t.Errorf("List missing '+1' emoji") } } func TestAPIMeta(t *testing.T) { meta, _, err := client.Meta.Get(context.Background()) if err != nil { t.Fatalf("Get returned error: %v", err) } if len(meta.Hooks) == 0 { t.Errorf("Get returned no hook addresses") } if len(meta.Git) == 0 { t.Errorf("Get returned no git addresses") } if !*meta.VerifiablePasswordAuthentication { t.Errorf("APIMeta VerifiablePasswordAuthentication is false") } } func TestRateLimits(t *testing.T) { limits, _, err := client.RateLimit.Get(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.") } } go-github-60.0.0/test/integration/pulls_test.go000066400000000000000000000014431457013574700215300ustar00rootroot00000000000000// 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-60.0.0/test/integration/repos_test.go000066400000000000000000000166571457013574700215360ustar00rootroot00000000000000// 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" "net/http" "testing" "github.com/google/go-cmp/cmp" "github.com/google/go-github/v60/github" ) func TestRepositories_CRUD(t *testing.T) { if !checkAuth("TestRepositories_CRUD") { return } // create a random repository repo, err := createRandomTestRepository("", true) 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, 0) 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 } // create a random repository repo, err := createRandomTestRepository("", true) if err != nil { t.Fatalf("createRandomTestRepository returned error: %v", err) } branch, _, err := client.Repositories.GetBranch(context.Background(), *repo.Owner.Login, *repo.Name, "master", 0) 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, BlockCreations: github.Bool(false), LockBranch: github.Bool(false), AllowForkSyncing: github.Bool(false), } 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, BlockCreations: &github.BlockCreations{ Enabled: github.Bool(false), }, LockBranch: &github.LockBranch{ Enabled: github.Bool(false), }, AllowForkSyncing: &github.AllowForkSyncing{ Enabled: github.Bool(false), }, } 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_ListByAuthenticatedUser(t *testing.T) { if !checkAuth("TestRepositories_ListByAuthenticatedUser") { return } _, _, err := client.Repositories.ListByAuthenticatedUser(context.Background(), nil) if err != nil { t.Fatalf("Repositories.ListByAuthenticatedUser() returned error: %v", err) } } func TestRepositories_ListByUser(t *testing.T) { _, _, err := client.Repositories.ListByUser(context.Background(), "google", nil) if err != nil { t.Fatalf("Repositories.ListByUser('google') returned error: %v", err) } opt := github.RepositoryListByUserOptions{Sort: "created"} repos, _, err := client.Repositories.ListByUser(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.ListByUser('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(io.Discard, rc) if err != nil { t.Fatalf("Repositories.DownloadReleaseAsset(andersjanmyr, goose, 484892, true) returned error: %v", err) } } func TestRepositories_Autolinks(t *testing.T) { if !checkAuth("TestRepositories_Autolinks") { return } // create a random repository repo, err := createRandomTestRepository("", true) if err != nil { t.Fatalf("createRandomTestRepository returned error: %v", err) } opts := &github.AutolinkOptions{ KeyPrefix: github.String("TICKET-"), URLTemplate: github.String("https://example.com/TICKET?query="), IsAlphanumeric: github.Bool(false), } actionlink, _, err := client.Repositories.AddAutolink(context.Background(), *repo.Owner.Login, *repo.Name, opts) if err != nil { t.Fatalf("Repositories.AddAutolink() returned error: %v", err) } if !cmp.Equal(actionlink.KeyPrefix, opts.KeyPrefix) || !cmp.Equal(actionlink.URLTemplate, opts.URLTemplate) || !cmp.Equal(actionlink.IsAlphanumeric, opts.IsAlphanumeric) { t.Errorf("Repositories.AddAutolink() returned %+v, want %+v", actionlink, opts) } _, err = client.Repositories.Delete(context.Background(), *repo.Owner.Login, *repo.Name) if err != nil { t.Fatalf("Repositories.Delete() returned error: %v", err) } } go-github-60.0.0/test/integration/users_test.go000066400000000000000000000145621457013574700215400ustar00rootroot00000000000000// 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/v60/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-60.0.0/tools/000077500000000000000000000000001457013574700146375ustar00rootroot00000000000000go-github-60.0.0/tools/go.mod000066400000000000000000000014251457013574700157470ustar00rootroot00000000000000module tools go 1.21 toolchain go1.22.0 require ( github.com/alecthomas/kong v0.8.1 github.com/getkin/kin-openapi v0.123.0 github.com/google/go-cmp v0.6.0 github.com/google/go-github/v60 v60.0.0 golang.org/x/sync v0.6.0 gopkg.in/yaml.v3 v3.0.1 ) require ( github.com/go-openapi/jsonpointer v0.20.2 // indirect github.com/go-openapi/swag v0.22.8 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/invopop/yaml v0.2.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect ) // Use version at HEAD, not the latest published. replace github.com/google/go-github/v60 => ../ go-github-60.0.0/tools/go.sum000066400000000000000000000112301457013574700157670ustar00rootroot00000000000000github.com/alecthomas/assert/v2 v2.1.0 h1:tbredtNcQnoSd3QBhQWI7QZ3XHOVkw1Moklp2ojoH/0= github.com/alecthomas/assert/v2 v2.1.0/go.mod h1:b/+1DI2Q6NckYi+3mXyH3wFb8qG37K/DuK80n7WefXA= github.com/alecthomas/kong v0.8.1 h1:acZdn3m4lLRobeh3Zi2S2EpnXTd1mOL6U7xVml+vfkY= github.com/alecthomas/kong v0.8.1/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U= github.com/alecthomas/repr v0.1.0 h1:ENn2e1+J3k09gyj2shc0dHr/yjaWSHRlrJ4DPMevDqE= github.com/alecthomas/repr v0.1.0/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/getkin/kin-openapi v0.123.0 h1:zIik0mRwFNLyvtXK274Q6ut+dPh6nlxBp0x7mNrPhs8= github.com/getkin/kin-openapi v0.123.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q= github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs= github.com/go-openapi/swag v0.22.8 h1:/9RjDSQ0vbFR+NyjGMkFTsA1IA0fmhKSThmfGZjicbw= github.com/go-openapi/swag v0.22.8/go.mod h1:6QT22icPLEqAM/z/TChgb4WAveCHF92+2gF0CNjHpPI= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/invopop/yaml v0.2.0 h1:7zky/qH+O0DwAyoobXUqvVBwgBFRxKoQ/3FjcVpjTMY= github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= github.com/ugorji/go/codec v1.2.7/go.mod h1:WGN1fab3R1fzQlVQTkfxVtIBhWDRqOviHU95kRgeqEY= golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= go-github-60.0.0/tools/metadata/000077500000000000000000000000001457013574700164175ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/main.go000066400000000000000000000126001457013574700176710ustar00rootroot00000000000000// Copyright 2023 The go-github AUTHORS. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // metadata is a command-line tool used to check and update this repo. // See CONTRIBUTING.md for details. package main import ( "context" "encoding/json" "fmt" "os" "path/filepath" "github.com/alecthomas/kong" "github.com/google/go-github/v60/github" ) var helpVars = kong.Vars{ "update_openapi_help": ` Update openapi_operations.yaml from OpenAPI descriptions in github.com/github/rest-api-description at the given git ref. `, "update_go_help": ` Update go source code to be consistent with openapi_operations.yaml. - Adds and updates "// GitHub API docs:" comments for service methods. - Updates "//meta:operation" comments to use canonical operation names. - Updates formatting of "//meta:operation" comments to make sure there isn't a space between the "//" and the "meta". - Formats modified files with the equivalent of "go fmt". `, "format_help": `Format whitespace in openapi_operations.yaml and sort its operations.`, "unused_help": `List operations in openapi_operations.yaml that aren't used by any service methods.`, "working_dir_help": `Working directory. Should be the root of the go-github repository.`, "openapi_ref_help": `Git ref to pull OpenAPI descriptions from.`, "openapi_validate_help": ` Instead of updating, make sure that the operations in openapi_operations.yaml's "openapi_operations" field are consistent with the sha listed in "openapi_commit". This is run in CI as a convenience so that reviewers can trust changes to openapi_operations.yaml. `, "output_json_help": `Output JSON.`, } type rootCmd struct { UpdateOpenAPI updateOpenAPICmd `kong:"cmd,name=update-openapi,help=${update_openapi_help}"` UpdateGo updateGoCmd `kong:"cmd,help=${update_go_help}"` Format formatCmd `kong:"cmd,help=${format_help}"` Unused unusedCmd `kong:"cmd,help=${unused_help}"` WorkingDir string `kong:"short=C,default=.,help=${working_dir_help}"` // for testing GithubURL string `kong:"hidden,default='https://api.github.com'"` } func (c *rootCmd) opsFile() (string, *operationsFile, error) { filename := filepath.Join(c.WorkingDir, "openapi_operations.yaml") opsFile, err := loadOperationsFile(filename) if err != nil { return "", nil, err } return filename, opsFile, nil } func githubClient(apiURL string) (*github.Client, error) { token := os.Getenv("GITHUB_TOKEN") if token == "" { return nil, fmt.Errorf("GITHUB_TOKEN environment variable must be set to a GitHub personal access token with the public_repo scope") } return github.NewClient(nil).WithAuthToken(token).WithEnterpriseURLs(apiURL, "") } type updateOpenAPICmd struct { Ref string `kong:"default=main,help=${openapi_ref_help}"` ValidateGithub bool `kong:"name=validate,help=${openapi_validate_help}"` } func (c *updateOpenAPICmd) Run(root *rootCmd) error { ctx := context.Background() if c.ValidateGithub && c.Ref != "main" { return fmt.Errorf("--validate and --ref are mutually exclusive") } filename, opsFile, err := root.opsFile() if err != nil { return err } origOps := make([]*operation, len(opsFile.OpenapiOps)) copy(origOps, opsFile.OpenapiOps) for i := range origOps { origOps[i] = origOps[i].clone() } client, err := githubClient(root.GithubURL) if err != nil { return err } ref := c.Ref if c.ValidateGithub { ref = opsFile.GitCommit if ref == "" { return fmt.Errorf("openapi_operations.yaml does not have an openapi_commit field") } } err = opsFile.updateFromGithub(ctx, client, ref) if err != nil { return err } if !c.ValidateGithub { return opsFile.saveFile(filename) } if !operationsEqual(origOps, opsFile.OpenapiOps) { return fmt.Errorf("openapi_operations.yaml does not match the OpenAPI descriptions in github.com/github/rest-api-description") } return nil } type formatCmd struct{} func (c *formatCmd) Run(root *rootCmd) error { filename, opsFile, err := root.opsFile() if err != nil { return err } return opsFile.saveFile(filename) } type updateGoCmd struct{} func (c *updateGoCmd) Run(root *rootCmd) error { _, opsFile, err := root.opsFile() if err != nil { return err } err = updateDocs(opsFile, filepath.Join(root.WorkingDir, "github")) return err } type unusedCmd struct { JSON bool `kong:"help=${output_json_help}"` } func (c *unusedCmd) Run(root *rootCmd, k *kong.Context) error { _, opsFile, err := root.opsFile() if err != nil { return err } unused, err := unusedOps(opsFile, filepath.Join(root.WorkingDir, "github")) if err != nil { return err } if c.JSON { enc := json.NewEncoder(k.Stdout) enc.SetIndent("", " ") return enc.Encode(unused) } fmt.Fprintf(k.Stdout, "Found %d unused operations\n", len(unused)) if len(unused) == 0 { return nil } fmt.Fprintln(k.Stdout, "") for _, op := range unused { fmt.Fprintln(k.Stdout, op.Name) if op.DocumentationURL != "" { fmt.Fprintf(k.Stdout, "doc: %s\n", op.DocumentationURL) } fmt.Fprintln(k.Stdout, "") } return nil } func main() { err := run(os.Args[1:], nil) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } } func run(args []string, opts []kong.Option) error { var cmd rootCmd parser, err := kong.New(&cmd, append(opts, helpVars)...) if err != nil { return err } k, err := parser.Parse(args) if err != nil { return err } return k.Run() } go-github-60.0.0/tools/metadata/main_test.go000066400000000000000000000245151457013574700207400ustar00rootroot00000000000000// Copyright 2023 The go-github 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 ( "bytes" "encoding/json" "fmt" "io" "io/fs" "net/http" "net/http/httptest" "net/url" "os" "path" "path/filepath" "strings" "testing" "github.com/alecthomas/kong" "github.com/getkin/kin-openapi/openapi3" "github.com/google/go-cmp/cmp" "github.com/google/go-github/v60/github" ) func TestUpdateGo(t *testing.T) { t.Run("valid", func(t *testing.T) { res := runTest(t, "testdata/update-go/valid", "update-go") res.assertOutput("", "") res.assertNoErr() res.checkGolden() }) t.Run("invalid", func(t *testing.T) { res := runTest(t, "testdata/update-go/invalid", "update-go") res.assertOutput("", "") res.assertErr(` no operations defined for AService.NoOperation no operations defined for AService.NoComment ambiguous operation "GET /ambiguous/{}" could match any of: [GET /ambiguous/{id} GET /ambiguous/{name}] could not find operation "GET /missing/{id}" in openapi_operations.yaml duplicate operation: GET /a/{a_id} `) res.checkGolden() }) } func TestUnused(t *testing.T) { res := runTest(t, "testdata/unused", "unused") res.assertOutput(` Found 3 unused operations GET /a/{a_id} doc: https://docs.github.com/rest/a/a#overridden-get-a POST /a/{a_id} doc: https://docs.github.com/rest/a/a#update-a GET /undocumented/{undocumented_id} `, "") } func TestUpdateOpenAPI(t *testing.T) { testServer := newTestServer(t, "main", map[string]interface{}{ "api.github.com/api.github.com.json": openapi3.T{ Paths: openapi3.NewPaths( openapi3.WithPath("/a/{a_id}", &openapi3.PathItem{ Get: &openapi3.Operation{ ExternalDocs: &openapi3.ExternalDocs{ URL: "https://docs.github.com/rest/reference/a", }, }, })), }, "ghec/ghec.json": openapi3.T{ Paths: openapi3.NewPaths( openapi3.WithPath("/a/b/{a_id}", &openapi3.PathItem{ Get: &openapi3.Operation{ ExternalDocs: &openapi3.ExternalDocs{ URL: "https://docs.github.com/rest/reference/a", }, }, })), }, "ghes-3.9/ghes-3.9.json": openapi3.T{ Paths: openapi3.NewPaths( openapi3.WithPath("/a/b/{a_id}", &openapi3.PathItem{ Get: &openapi3.Operation{ ExternalDocs: &openapi3.ExternalDocs{ URL: "https://docs.github.com/rest/reference/a", }, }, })), }, "ghes-3.10/ghes-3.10.json": openapi3.T{ Paths: openapi3.NewPaths( openapi3.WithPath("/a/b/{a_id}", &openapi3.PathItem{ Get: &openapi3.Operation{ ExternalDocs: &openapi3.ExternalDocs{ URL: "https://docs.github.com/rest/reference/a", }, }, })), }, "ghes-2.22/ghes-2.22.json": openapi3.T{ Paths: openapi3.NewPaths( openapi3.WithPath("/a/b/{a_id}", &openapi3.PathItem{ Get: &openapi3.Operation{ ExternalDocs: &openapi3.ExternalDocs{ URL: "https://docs.github.com/rest/reference/a", }, }, })), }, }) res := runTest(t, "testdata/update-openapi", "update-openapi", "--github-url", testServer.URL) res.assertOutput("", "") res.assertNoErr() res.checkGolden() } func TestFormat(t *testing.T) { res := runTest(t, "testdata/format", "format") res.assertOutput("", "") res.assertNoErr() res.checkGolden() } func updateGoldenDir(t *testing.T, origDir, resultDir, goldenDir string) { t.Helper() if os.Getenv("UPDATE_GOLDEN") == "" { return } assertNilError(t, os.RemoveAll(goldenDir)) assertNilError(t, filepath.WalkDir(resultDir, func(path string, d fs.DirEntry, err error) error { if err != nil || d.IsDir() { return err } relName := mustRel(t, resultDir, path) origName := filepath.Join(origDir, relName) _, err = os.Stat(origName) if err != nil { if os.IsNotExist(err) { err = os.MkdirAll(filepath.Dir(filepath.Join(goldenDir, relName)), d.Type()) if err != nil { return err } return copyFile(path, filepath.Join(goldenDir, relName)) } return err } resContent, err := os.ReadFile(path) if err != nil { return err } origContent, err := os.ReadFile(origName) if err != nil { return err } if bytes.Equal(resContent, origContent) { return nil } return copyFile(path, filepath.Join(goldenDir, relName)) })) } func checkGoldenDir(t *testing.T, origDir, resultDir, goldenDir string) { t.Helper() golden := true t.Cleanup(func() { t.Helper() if !golden { t.Log("To regenerate golden files run `UPDATE_GOLDEN=1 script/test.sh`") } }) updateGoldenDir(t, origDir, resultDir, goldenDir) checked := map[string]bool{} _, err := os.Stat(goldenDir) if err == nil { assertNilError(t, filepath.Walk(goldenDir, func(wantPath string, info fs.FileInfo, err error) error { relPath := mustRel(t, goldenDir, wantPath) if err != nil || info.IsDir() { return err } if !assertEqualFiles(t, wantPath, filepath.Join(resultDir, relPath)) { golden = false } checked[relPath] = true return nil })) } assertNilError(t, filepath.Walk(origDir, func(wantPath string, info fs.FileInfo, err error) error { relPath := mustRel(t, origDir, wantPath) if err != nil || info.IsDir() || checked[relPath] { return err } if !assertEqualFiles(t, wantPath, filepath.Join(resultDir, relPath)) { golden = false } checked[relPath] = true return nil })) assertNilError(t, filepath.Walk(resultDir, func(resultPath string, info fs.FileInfo, err error) error { relPath := mustRel(t, resultDir, resultPath) if err != nil || info.IsDir() || checked[relPath] { return err } golden = false return fmt.Errorf("found unexpected file:\n%s", relPath) })) } func mustRel(t *testing.T, base, target string) string { t.Helper() rel, err := filepath.Rel(base, target) assertNilError(t, err) return rel } func copyDir(t *testing.T, dst, src string) error { fmt.Println("dst", dst) dst, err := filepath.Abs(dst) if err != nil { return err } return filepath.Walk(src, func(srcPath string, info fs.FileInfo, err error) error { if err != nil || info.IsDir() { return err } dstPath := filepath.Join(dst, mustRel(t, src, srcPath)) err = copyFile(srcPath, dstPath) return err }) } func copyFile(src, dst string) (errOut error) { srcDirStat, err := os.Stat(filepath.Dir(src)) if err != nil { return err } err = os.MkdirAll(filepath.Dir(dst), srcDirStat.Mode()) if err != nil { return err } dstFile, err := os.Create(dst) if err != nil { return err } defer func() { e := dstFile.Close() if errOut == nil { errOut = e } }() srcFile, err := os.Open(src) if err != nil { return err } defer func() { e := srcFile.Close() if errOut == nil { errOut = e } }() _, err = io.Copy(dstFile, srcFile) return err } type testRun struct { t *testing.T workDir string srcDir string stdOut bytes.Buffer stdErr bytes.Buffer err error } func (r testRun) checkGolden() { r.t.Helper() checkGoldenDir(r.t, r.srcDir, r.workDir, filepath.Join("testdata", "golden", r.t.Name())) } func (r testRun) assertOutput(stdout, stderr string) { r.t.Helper() assertEqualStrings(r.t, strings.TrimSpace(stdout), strings.TrimSpace(r.stdOut.String())) assertEqualStrings(r.t, strings.TrimSpace(stderr), strings.TrimSpace(r.stdErr.String())) } func (r testRun) assertNoErr() { r.t.Helper() assertNilError(r.t, r.err) } func (r testRun) assertErr(want string) { r.t.Helper() if r.err == nil { r.t.Error("expected error") return } if strings.TrimSpace(r.err.Error()) != strings.TrimSpace(want) { r.t.Errorf("unexpected error:\nwant:\n%s\ngot:\n%s", want, r.err.Error()) } } func runTest(t *testing.T, srcDir string, args ...string) testRun { t.Helper() srcDir = filepath.FromSlash(srcDir) res := testRun{ t: t, workDir: t.TempDir(), srcDir: srcDir, } err := copyDir(t, res.workDir, srcDir) if err != nil { t.Error(err) return res } res.err = run( append(args, "-C", res.workDir), []kong.Option{kong.Writers(&res.stdOut, &res.stdErr)}, ) return res } func newTestServer(t *testing.T, ref string, files map[string]interface{}) *httptest.Server { t.Helper() jsonHandler := func(wantQuery url.Values, val interface{}) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { gotQuery := r.URL.Query() queryDiff := cmp.Diff(wantQuery, gotQuery) if queryDiff != "" { t.Errorf("query mismatch for %s (-want +got):\n%s", r.URL.Path, queryDiff) } w.WriteHeader(200) err := json.NewEncoder(w).Encode(val) if err != nil { panic(err) } } } repoPath := "/api/v3/repos/github/rest-api-description" emptyQuery := url.Values{} refQuery := url.Values{"ref": []string{ref}} mux := http.NewServeMux() server := httptest.NewServer(mux) mux.HandleFunc( path.Join(repoPath, "commits", ref), jsonHandler(emptyQuery, &github.RepositoryCommit{SHA: github.String("s")}), ) var descriptionsContent []*github.RepositoryContent for name, content := range files { descriptionsContent = append(descriptionsContent, &github.RepositoryContent{ Name: github.String(path.Base(path.Dir(name))), }) mux.HandleFunc( path.Join(repoPath, "contents/descriptions", path.Dir(name)), jsonHandler(refQuery, []*github.RepositoryContent{ { Name: github.String(path.Base(name)), DownloadURL: github.String(server.URL + "/dl/" + name), }, }), ) mux.HandleFunc( path.Join("/dl", name), jsonHandler(emptyQuery, content), ) } mux.HandleFunc( path.Join(repoPath, "contents/descriptions"), jsonHandler(refQuery, descriptionsContent), ) t.Cleanup(server.Close) t.Setenv("GITHUB_TOKEN", "fake token") return server } func assertEqualStrings(t *testing.T, want, got string) { t.Helper() diff := cmp.Diff(want, got) if diff != "" { t.Error(diff) } } func assertEqualFiles(t *testing.T, want, got string) bool { t.Helper() wantBytes, err := os.ReadFile(want) if !assertNilError(t, err) { return false } wantBytes = bytes.ReplaceAll(wantBytes, []byte("\r\n"), []byte("\n")) gotBytes, err := os.ReadFile(got) if !assertNilError(t, err) { return false } gotBytes = bytes.ReplaceAll(gotBytes, []byte("\r\n"), []byte("\n")) if !bytes.Equal(wantBytes, gotBytes) { diff := cmp.Diff(string(wantBytes), string(gotBytes)) t.Errorf("files %q and %q differ: %s", want, got, diff) return false } return true } func assertNilError(t *testing.T, err error) bool { t.Helper() if err != nil { t.Error(err) return false } return true } go-github-60.0.0/tools/metadata/metadata.go000066400000000000000000000316161457013574700205350ustar00rootroot00000000000000// Copyright 2023 The go-github 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 ( "bytes" "context" "errors" "fmt" "go/ast" "go/format" "go/parser" "go/printer" "go/token" "net/url" "os" "path" "path/filepath" "regexp" "sort" "strings" "sync" "github.com/google/go-github/v60/github" "gopkg.in/yaml.v3" ) type operation struct { Name string `yaml:"name,omitempty" json:"name,omitempty"` DocumentationURL string `yaml:"documentation_url,omitempty" json:"documentation_url,omitempty"` OpenAPIFiles []string `yaml:"openapi_files,omitempty" json:"openapi_files,omitempty"` } func (o *operation) equal(other *operation) bool { if o.Name != other.Name || o.DocumentationURL != other.DocumentationURL { return false } if len(o.OpenAPIFiles) != len(other.OpenAPIFiles) { return false } for i := range o.OpenAPIFiles { if o.OpenAPIFiles[i] != other.OpenAPIFiles[i] { return false } } return true } func (o *operation) clone() *operation { return &operation{ Name: o.Name, DocumentationURL: o.DocumentationURL, OpenAPIFiles: append([]string{}, o.OpenAPIFiles...), } } func operationsEqual(a, b []*operation) bool { if len(a) != len(b) { return false } for i := range a { if !a[i].equal(b[i]) { return false } } return true } func sortOperations(ops []*operation) { sort.Slice(ops, func(i, j int) bool { leftVerb, leftURL := parseOpName(ops[i].Name) rightVerb, rightURL := parseOpName(ops[j].Name) if leftURL != rightURL { return leftURL < rightURL } return leftVerb < rightVerb }) } // normalizeOpPath returns an endpoint with all templated path parameters replaced with *. func normalizeOpPath(opPath string) string { if !strings.ContainsAny(opPath, "{%") { return opPath } segments := strings.Split(opPath, "/") for i, segment := range segments { if len(segment) == 0 { continue } if segment[0] == '{' || segment[0] == '%' { segments[i] = "*" } } return strings.Join(segments, "/") } func normalizedOpName(name string) string { verb, u := parseOpName(name) return strings.TrimSpace(verb + " " + normalizeOpPath(u)) } // matches something like "GET /some/path" var opNameRe = regexp.MustCompile(`(?i)(\S+)(?:\s+(\S.*))?`) func parseOpName(id string) (verb, url string) { match := opNameRe.FindStringSubmatch(id) if match == nil { return "", "" } u := strings.TrimSpace(match[2]) if !strings.HasPrefix(u, "/") { u = "/" + u } return strings.ToUpper(match[1]), u } type operationsFile struct { ManualOps []*operation `yaml:"operations,omitempty"` OverrideOps []*operation `yaml:"operation_overrides,omitempty"` GitCommit string `yaml:"openapi_commit,omitempty"` OpenapiOps []*operation `yaml:"openapi_operations,omitempty"` mu sync.Mutex resolvedOps map[string]*operation } func (m *operationsFile) resolve() { m.mu.Lock() defer m.mu.Unlock() if m.resolvedOps != nil { return } m.resolvedOps = map[string]*operation{} for _, op := range m.OpenapiOps { m.resolvedOps[op.Name] = op.clone() } for _, op := range m.ManualOps { m.resolvedOps[op.Name] = op.clone() } for _, override := range m.OverrideOps { _, ok := m.resolvedOps[override.Name] if !ok { continue } override = override.clone() if override.DocumentationURL != "" { m.resolvedOps[override.Name].DocumentationURL = override.DocumentationURL } if len(override.OpenAPIFiles) > 0 { m.resolvedOps[override.Name].OpenAPIFiles = override.OpenAPIFiles } } } func (m *operationsFile) saveFile(filename string) (errOut error) { sortOperations(m.ManualOps) sortOperations(m.OverrideOps) sortOperations(m.OpenapiOps) f, err := os.Create(filename) if err != nil { return err } defer func() { e := f.Close() if errOut == nil { errOut = e } }() enc := yaml.NewEncoder(f) enc.SetIndent(2) defer func() { e := enc.Close() if errOut == nil { errOut = e } }() return enc.Encode(m) } func (m *operationsFile) updateFromGithub(ctx context.Context, client *github.Client, ref string) error { commit, resp, err := client.Repositories.GetCommit(ctx, descriptionsOwnerName, descriptionsRepoName, ref, nil) if err != nil { return err } if resp.StatusCode != 200 { return fmt.Errorf("unexpected status code: %s", resp.Status) } ops, err := getOpsFromGithub(ctx, client, ref) if err != nil { return err } if !operationsEqual(m.OpenapiOps, ops) { m.OpenapiOps = ops m.GitCommit = commit.GetSHA() } return nil } func loadOperationsFile(filename string) (*operationsFile, error) { b, err := os.ReadFile(filename) if err != nil { return nil, err } var opsFile operationsFile err = yaml.Unmarshal(b, &opsFile) if err != nil { return nil, err } return &opsFile, nil } func addOperation(ops []*operation, filename, opName, docURL string) []*operation { for _, op := range ops { if opName != op.Name { continue } if len(op.OpenAPIFiles) == 0 { op.OpenAPIFiles = append(op.OpenAPIFiles, filename) op.DocumentationURL = docURL return ops } // just append to files, but only add the first ghes file if !strings.Contains(filename, "/ghes") { op.OpenAPIFiles = append(op.OpenAPIFiles, filename) return ops } for _, f := range op.OpenAPIFiles { if strings.Contains(f, "/ghes") { return ops } } op.OpenAPIFiles = append(op.OpenAPIFiles, filename) return ops } return append(ops, &operation{ Name: opName, OpenAPIFiles: []string{filename}, DocumentationURL: docURL, }) } func unusedOps(opsFile *operationsFile, dir string) ([]*operation, error) { var usedOps map[string]bool err := visitServiceMethods(dir, false, func(_ string, fn *ast.FuncDecl, cmap ast.CommentMap) error { ops, err := methodOps(opsFile, cmap, fn) if err != nil { return err } for _, op := range ops { if usedOps == nil { usedOps = map[string]bool{} } usedOps[op.Name] = true } return nil }) if err != nil { return nil, err } var result []*operation opsFile.resolve() for opName, op := range opsFile.resolvedOps { if !usedOps[opName] { result = append(result, op) } } sortOperations(result) return result, nil } func updateDocsVisitor(opsFile *operationsFile) nodeVisitor { return func(serviceMethod string, fn *ast.FuncDecl, cmap ast.CommentMap) error { linksMap := map[string]struct{}{} undocMap := map[string]bool{} ops, err := methodOps(opsFile, cmap, fn) if err != nil { return err } if len(ops) == 0 { return fmt.Errorf("no operations defined for %s", serviceMethod) } for _, op := range ops { if op.DocumentationURL == "" { undocMap[op.Name] = true continue } linksMap[op.DocumentationURL] = struct{}{} } var undocumentedOps []string for op := range undocMap { undocumentedOps = append(undocumentedOps, op) } sort.Strings(undocumentedOps) // Find the group that comes before the function var group *ast.CommentGroup for _, g := range cmap[fn] { if g.End() == fn.Pos()-1 { group = g } } // If there is no group, create one if group == nil { group = &ast.CommentGroup{ List: []*ast.Comment{{Text: "//", Slash: fn.Pos() - 1}}, } cmap[fn] = append(cmap[fn], group) } origList := group.List group.List = nil for _, comment := range origList { if metaOpRe.MatchString(comment.Text) || docLineRE.MatchString(comment.Text) || undocRE.MatchString(comment.Text) { continue } group.List = append(group.List, comment) } // add an empty line before adding doc links group.List = append(group.List, &ast.Comment{Text: "//"}) var docLinks []string for link := range linksMap { docLinks = append(docLinks, link) } sort.Strings(docLinks) for _, dl := range docLinks { group.List = append( group.List, &ast.Comment{ Text: "// GitHub API docs: " + cleanURLPath(dl), }, ) } _, methodName, _ := strings.Cut(serviceMethod, ".") for _, opName := range undocumentedOps { line := fmt.Sprintf("// Note: %s uses the undocumented GitHub API endpoint %q.", methodName, opName) group.List = append(group.List, &ast.Comment{Text: line}) } for _, op := range ops { group.List = append(group.List, &ast.Comment{ Text: fmt.Sprintf("//meta:operation %s", op.Name), }) } group.List[0].Slash = fn.Pos() - 1 for i := 1; i < len(group.List); i++ { group.List[i].Slash = token.NoPos } return nil } } // updateDocs updates the code comments in dir with doc urls from metadata. func updateDocs(opsFile *operationsFile, dir string) error { return visitServiceMethods(dir, true, updateDocsVisitor(opsFile)) } type nodeVisitor func(serviceMethod string, fn *ast.FuncDecl, cmap ast.CommentMap) error // visitServiceMethods runs visit on the ast.Node of every service method in dir. When writeFiles is true it will // save any changes back to the original file. func visitServiceMethods(dir string, writeFiles bool, visit nodeVisitor) error { dirEntries, err := os.ReadDir(dir) if err != nil { return err } for _, dirEntry := range dirEntries { filename := filepath.Join(dir, dirEntry.Name()) if dirEntry.IsDir() || !strings.HasSuffix(filename, ".go") || strings.HasSuffix(filename, "_test.go") { continue } err = errors.Join(err, visitFileMethods(writeFiles, filename, visit)) } return err } func visitFileMethods(updateFile bool, filename string, visit nodeVisitor) error { content, err := os.ReadFile(filename) if err != nil { return err } content = bytes.ReplaceAll(content, []byte("\r\n"), []byte("\n")) fset := token.NewFileSet() fileNode, err := parser.ParseFile(fset, "", content, parser.ParseComments) if err != nil { return err } cmap := ast.NewCommentMap(fset, fileNode, fileNode.Comments) ast.Inspect(fileNode, func(n ast.Node) bool { fn, ok := n.(*ast.FuncDecl) if !ok { return true } serviceMethod := nodeServiceMethod(fn) if serviceMethod == "" { return true } e := visit(serviceMethod, fn, cmap) err = errors.Join(err, e) return true }) if err != nil { return err } if !updateFile { return nil } fileNode.Comments = cmap.Filter(fileNode).Comments() var buf bytes.Buffer err = printer.Fprint(&buf, fset, fileNode) if err != nil { return err } updatedContent, err := format.Source(buf.Bytes()) if err != nil { return err } if bytes.Equal(content, updatedContent) { return nil } return os.WriteFile(filename, updatedContent, 0600) } var ( metaOpRe = regexp.MustCompile(`(?i)\s*//\s*meta:operation\s+(\S.+)`) undocRE = regexp.MustCompile(`(?i)\s*//\s*Note:\s+\S.+ uses the undocumented GitHub API endpoint`) docLineRE = regexp.MustCompile(`(?i)\s*//\s*GitHub\s+API\s+docs:`) ) // methodOps parses a method's comments for //meta:operation lines and returns the corresponding operations. func methodOps(opsFile *operationsFile, cmap ast.CommentMap, fn *ast.FuncDecl) ([]*operation, error) { var ops []*operation var err error seen := map[string]bool{} for _, g := range cmap[fn] { for _, c := range g.List { match := metaOpRe.FindStringSubmatch(c.Text) if match == nil { continue } opName := strings.TrimSpace(match[1]) opsFile.resolve() var found []*operation norm := normalizedOpName(opName) for n := range opsFile.resolvedOps { if normalizedOpName(n) == norm { found = append(found, opsFile.resolvedOps[n]) } } switch len(found) { case 0: err = errors.Join(err, fmt.Errorf("could not find operation %q in openapi_operations.yaml", opName)) case 1: name := found[0].Name if seen[name] { err = errors.Join(err, fmt.Errorf("duplicate operation: %s", name)) } seen[name] = true ops = append(ops, found[0]) default: var foundNames []string for _, op := range found { foundNames = append(foundNames, op.Name) } sort.Strings(foundNames) err = errors.Join(err, fmt.Errorf("ambiguous operation %q could match any of: %v", opName, foundNames)) } } } sortOperations(ops) return ops, err } // cleanURLPath runs path.Clean on the url path. This is to remove the unsightly double slashes from some // of the urls in github's openapi descriptions. func cleanURLPath(docURL string) string { u, err := url.Parse(docURL) if err != nil { return docURL } u.Path = path.Clean(u.Path) return u.String() } // nodeServiceMethod returns the name of the service method represented by fn, or "" if fn is not a service method. // Name is in the form of "Receiver.Function", for example "IssuesService.Create". func nodeServiceMethod(fn *ast.FuncDecl) string { if fn.Recv == nil || len(fn.Recv.List) != 1 { return "" } recv := fn.Recv.List[0] se, ok := recv.Type.(*ast.StarExpr) if !ok { return "" } id, ok := se.X.(*ast.Ident) if !ok { return "" } // We only want exported methods on exported types where the type name ends in "Service". if !id.IsExported() || !fn.Name.IsExported() || !strings.HasSuffix(id.Name, "Service") { return "" } return id.Name + "." + fn.Name.Name } go-github-60.0.0/tools/metadata/metadata_test.go000066400000000000000000000011331457013574700215630ustar00rootroot00000000000000// Copyright 2023 The go-github 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 Test_normalizedOpName(t *testing.T) { for _, td := range []struct { name string want string }{ {name: "", want: ""}, {name: "get /foo/{id}", want: "GET /foo/*"}, {name: "get foo", want: "GET /foo"}, } { t.Run(td.name, func(t *testing.T) { got := normalizedOpName(td.name) if got != td.want { t.Errorf("normalizedOpName() = %v, want %v", got, td.want) } }) } } go-github-60.0.0/tools/metadata/openapi.go000066400000000000000000000111471457013574700204050ustar00rootroot00000000000000// Copyright 2023 The go-github 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 ( "context" "fmt" "io" "regexp" "sort" "strconv" "github.com/getkin/kin-openapi/openapi3" "github.com/google/go-github/v60/github" "golang.org/x/sync/errgroup" ) const ( descriptionsOwnerName = "github" descriptionsRepoName = "rest-api-description" descriptionsPath = "descriptions" ) type openapiFile struct { description *openapi3.T filename string plan string planIdx int releaseMajor int releaseMinor int } func getOpsFromGithub(ctx context.Context, client *github.Client, gitRef string) ([]*operation, error) { descs, err := getDescriptions(ctx, client, gitRef) if err != nil { return nil, err } var ops []*operation for _, desc := range descs { for p, pathItem := range desc.description.Paths.Map() { for method, op := range pathItem.Operations() { docURL := "" if op.ExternalDocs != nil { docURL = op.ExternalDocs.URL } ops = addOperation(ops, desc.filename, method+" "+p, docURL) } } } sortOperations(ops) return ops, nil } func (o *openapiFile) loadDescription(ctx context.Context, client *github.Client, gitRef string) error { contents, resp, err := client.Repositories.DownloadContents( ctx, descriptionsOwnerName, descriptionsRepoName, o.filename, &github.RepositoryContentGetOptions{Ref: gitRef}, ) if err != nil { return err } if resp.StatusCode != 200 { return fmt.Errorf("unexpected status code: %s", resp.Status) } b, err := io.ReadAll(contents) if err != nil { return err } err = contents.Close() if err != nil { return err } o.description, err = openapi3.NewLoader().LoadFromData(b) return err } // less sorts by the following rules: // - planIdx ascending // - releaseMajor descending // - releaseMinor descending func (o *openapiFile) less(other *openapiFile) bool { if o.planIdx != other.planIdx { return o.planIdx < other.planIdx } if o.releaseMajor != other.releaseMajor { return o.releaseMajor > other.releaseMajor } return o.releaseMinor > other.releaseMinor } var dirPatterns = []*regexp.Regexp{ regexp.MustCompile(`^(?Papi\.github\.com)(-(?P\d+)\.(?P\d+))?$`), regexp.MustCompile(`^(?Pghec)(-(?P\d+)\.(?P\d+))?$`), regexp.MustCompile(`^(?Pghes)(-(?P\d+)\.(?P\d+))?$`), } // getDescriptions loads OpenapiFiles for all the OpenAPI 3.0 description files in github/rest-api-description. // This assumes that all directories in "descriptions/" contain OpenAPI 3.0 description files with the same // name as the directory (plus the ".json" extension). For example, "descriptions/api.github.com/api.github.com.json". // Results are sorted by these rules: // - Directories that don't match any of the patterns in dirPatterns are removed. // - Directories are sorted by the pattern that matched in the same order they appear in dirPatterns. // - Directories are then sorted by major and minor version in descending order. func getDescriptions(ctx context.Context, client *github.Client, gitRef string) ([]*openapiFile, error) { _, dir, resp, err := client.Repositories.GetContents( ctx, descriptionsOwnerName, descriptionsRepoName, descriptionsPath, &github.RepositoryContentGetOptions{Ref: gitRef}, ) if err != nil { return nil, err } if resp.StatusCode != 200 { return nil, fmt.Errorf("unexpected status code: %s", resp.Status) } files := make([]*openapiFile, 0, len(dir)) for _, d := range dir { for i, pattern := range dirPatterns { m := pattern.FindStringSubmatch(d.GetName()) if m == nil { continue } file := openapiFile{ filename: fmt.Sprintf("descriptions/%s/%s.json", d.GetName(), d.GetName()), plan: m[pattern.SubexpIndex("plan")], planIdx: i, } rawMajor := m[pattern.SubexpIndex("major")] if rawMajor != "" { file.releaseMajor, err = strconv.Atoi(rawMajor) if err != nil { return nil, err } } rawMinor := m[pattern.SubexpIndex("minor")] if rawMinor != "" { file.releaseMinor, err = strconv.Atoi(rawMinor) if err != nil { return nil, err } } if file.plan == "ghes" && file.releaseMajor < 3 { continue } files = append(files, &file) break } } sort.Slice(files, func(i, j int) bool { return files[i].less(files[j]) }) g, ctx := errgroup.WithContext(ctx) for _, file := range files { f := file g.Go(func() error { return f.loadDescription(ctx, client, gitRef) }) } err = g.Wait() if err != nil { return nil, err } return files, nil } go-github-60.0.0/tools/metadata/testdata/000077500000000000000000000000001457013574700202305ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/format/000077500000000000000000000000001457013574700215205ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/format/openapi_operations.yaml000066400000000000000000000011001457013574700262720ustar00rootroot00000000000000 operations: - name: POST /a/{a_id} documentation_url: https://docs.github.com/rest/a/a#update-a openapi_operations: - name: GET /a/{a_id} documentation_url: https://docs.github.com/rest/a/a#get-a - name: GET /undocumented/{undocumented_id} operation_overrides: - name: GET /a/{a_id_noncanonical2} # this comment will disappear documentation_url: https://docs.github.com/rest/a/a#overridden-get-a - name: GET /fake/{a_id} documentation_url: https://docs.github.com/rest/a/a#overridden-get-a openapi_commit: b8dafbe912a3be421d21346faa2b29bf15e6f84d go-github-60.0.0/tools/metadata/testdata/golden/000077500000000000000000000000001457013574700215005ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/golden/TestFormat/000077500000000000000000000000001457013574700235705ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/golden/TestFormat/openapi_operations.yaml000066400000000000000000000010371457013574700303530ustar00rootroot00000000000000operations: - name: POST /a/{a_id} documentation_url: https://docs.github.com/rest/a/a#update-a operation_overrides: - name: GET /a/{a_id_noncanonical2} documentation_url: https://docs.github.com/rest/a/a#overridden-get-a - name: GET /fake/{a_id} documentation_url: https://docs.github.com/rest/a/a#overridden-get-a openapi_commit: b8dafbe912a3be421d21346faa2b29bf15e6f84d openapi_operations: - name: GET /a/{a_id} documentation_url: https://docs.github.com/rest/a/a#get-a - name: GET /undocumented/{undocumented_id} go-github-60.0.0/tools/metadata/testdata/golden/TestUpdateGo/000077500000000000000000000000001457013574700240505ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/golden/TestUpdateGo/valid/000077500000000000000000000000001457013574700251475ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/golden/TestUpdateGo/valid/github/000077500000000000000000000000001457013574700264315ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/golden/TestUpdateGo/valid/github/a.go000066400000000000000000000016021457013574700271770ustar00rootroot00000000000000package github type AService struct{} // Get gets an A // // GitHub API docs: https://docs.github.com/rest/a/a#overridden-get-a // //meta:operation GET /a/{a_id} func (s *AService) Get() {} // Undocumented uses an undocumented operation // // Note: Undocumented uses the undocumented GitHub API endpoint "GET /undocumented/{undocumented_id}". // //meta:operation GET /undocumented/{undocumented_id} func (s *AService) Undocumented() {} // OutdatedLinks has links that are outdated or wrong // // GitHub API docs: https://docs.github.com/rest/a/a#update-a // //meta:operation POST /a/{a_id} func (s *AService) OutdatedLinks() {} // GitHub API docs: https://docs.github.com/rest/a/a#overridden-get-a // //meta:operation GET /a/{a_id} func (s *AService) Uncommented() {} func (s *AService) unexported() {} func NotAMethod() {} type internalService struct{} func (i *internalService) Get() {} go-github-60.0.0/tools/metadata/testdata/golden/TestUpdateOpenAPI/000077500000000000000000000000001457013574700247365ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/golden/TestUpdateOpenAPI/openapi_operations.yaml000066400000000000000000000007521457013574700315240ustar00rootroot00000000000000operations: - name: GET /a/{a_id} documentation_url: https://docs.github.com/rest/a/a#get-a openapi_commit: s openapi_operations: - name: GET /a/b/{a_id} documentation_url: https://docs.github.com/rest/reference/a openapi_files: - descriptions/ghec/ghec.json - descriptions/ghes-3.10/ghes-3.10.json - name: GET /a/{a_id} documentation_url: https://docs.github.com/rest/reference/a openapi_files: - descriptions/api.github.com/api.github.com.json go-github-60.0.0/tools/metadata/testdata/unused/000077500000000000000000000000001457013574700215335ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/unused/github/000077500000000000000000000000001457013574700230155ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/unused/github/a.go000066400000000000000000000001721457013574700235640ustar00rootroot00000000000000package github type AService struct{} // PostABC // //meta:operation POST /a/b/c/{a_id} func (a *AService) PostABC() {} go-github-60.0.0/tools/metadata/testdata/unused/openapi_operations.yaml000066400000000000000000000011611457013574700263140ustar00rootroot00000000000000openapi_commit: b8dafbe912a3be421d21346faa2b29bf15e6f84d operations: - name: POST /a/{a_id} documentation_url: https://docs.github.com/rest/a/a#update-a openapi_operations: - name: POST /a/b/c/{a_id} documentation_url: https://docs.github.com/rest/a/b/c#update-a - name: GET /a/{a_id} documentation_url: https://docs.github.com/rest/a/a#get-a - name: GET /undocumented/{undocumented_id} operation_overrides: - name: GET /a/{a_id} documentation_url: https://docs.github.com/rest/a/a#overridden-get-a - name: GET /fake/{a_id} documentation_url: https://docs.github.com/rest/a/a#overridden-get-a go-github-60.0.0/tools/metadata/testdata/update-go/000077500000000000000000000000001457013574700221155ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/update-go/invalid/000077500000000000000000000000001457013574700235435ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/update-go/invalid/github/000077500000000000000000000000001457013574700250255ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/update-go/invalid/github/a.go000066400000000000000000000011571457013574700256000ustar00rootroot00000000000000package github type AService struct{} // NoOperation has no operation func (*AService) NoOperation() {} func (*AService) NoComment() {} // Ambiguous has an operation that could resolve to multiple operations // //meta:operation GET /ambiguous/{} func (*AService) Ambiguous() {} // MissingOperation has an operation that is missing from the OpenAPI spec // //meta:operation GET /missing/{id} func (*AService) MissingOperation() {} // DuplicateOperations has duplicate operations // //meta:operation GET /a/{a_id} //meta:operation POST /a/{a_id} //meta:operation GET /a/{a_id} func (*AService) DuplicateOperations() {} go-github-60.0.0/tools/metadata/testdata/update-go/invalid/openapi_operations.yaml000066400000000000000000000012241457013574700303240ustar00rootroot00000000000000operations: - name: POST /a/{a_id} documentation_url: https://docs.github.com/rest/a/a#update-a openapi_operations: - name: GET /ambiguous/{id} documentation_url: https://docs.github.com/rest/ambiguous/ - name: GET /ambiguous/{name} documentation_url: https://docs.github.com/rest/ambiguous/ - name: GET /undocumented/{undocumented_id} - name: GET /a/{a_id} documentation_url: https://docs.github.com/rest/a/a#get-a operation_overrides: - name: GET /a/{a_id} documentation_url: https://docs.github.com/rest/a/a#overridden-get-a - name: GET /fake/{a_id} documentation_url: https://docs.github.com/rest/a/a#overridden-get-a go-github-60.0.0/tools/metadata/testdata/update-go/valid/000077500000000000000000000000001457013574700232145ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/update-go/valid/github/000077500000000000000000000000001457013574700244765ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/update-go/valid/github/a.go000066400000000000000000000014351457013574700252500ustar00rootroot00000000000000package github type AService struct{} // Get gets an A // //meta:operation GET /a/{non-canonical-id} func (s *AService) Get() {} // Undocumented uses an undocumented operation // //meta:operation GET /undocumented/{undocumented_id} func (s *AService) Undocumented() {} // OutdatedLinks has links that are outdated or wrong // // GitHub API docs: https://docs.github.com/rest/a/a#get-a // GitHub API docs: https://example.com // Note: Undocumented uses the undocumented GitHub API endpoint "GET /undocumented/{undocumented_id}". // //meta:operation post a/{a_id} func (s *AService) OutdatedLinks() {} //meta:operation GET /a/{a_id} func (s *AService) Uncommented() {} func (s *AService) unexported() {} func NotAMethod() {} type internalService struct{} func (i *internalService) Get() {} go-github-60.0.0/tools/metadata/testdata/update-go/valid/github/ignoreme.txt000066400000000000000000000000001457013574700270320ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/update-go/valid/openapi_operations.yaml000066400000000000000000000010211457013574700277700ustar00rootroot00000000000000openapi_commit: b8dafbe912a3be421d21346faa2b29bf15e6f84d operations: - name: POST /a/{a_id} documentation_url: https://docs.github.com/rest/a/a#update-a openapi_operations: - name: GET /a/{a_id} documentation_url: https://docs.github.com/rest/a/a#get-a - name: GET /undocumented/{undocumented_id} operation_overrides: - name: GET /a/{a_id} documentation_url: https://docs.github.com/rest/a/a#overridden-get-a - name: GET /fake/{a_id} documentation_url: https://docs.github.com/rest/a/a#overridden-get-a go-github-60.0.0/tools/metadata/testdata/update-openapi/000077500000000000000000000000001457013574700231435ustar00rootroot00000000000000go-github-60.0.0/tools/metadata/testdata/update-openapi/openapi_operations.yaml000066400000000000000000000001641457013574700277260ustar00rootroot00000000000000operations: - name: GET /a/{a_id} documentation_url: https://docs.github.com/rest/a/a#get-a openapi_commit: s