Repository: google/go-github (go)

Issue:
Add support for DNS health checks on Pages.
Hi :wave:

Currently, the `RepositoriesService` doesn't support [getting DNS health checks for Github pages](https://docs.github.com/en/rest/pages#get-a-dns-health-check-for-github-pages).

@gmlewis, I would like to implement this feature, if you agree.

Pull request:
Add DNS health checks support for GitHub Pages
Fixes #2745

Allows requesting a DNS health check for the CNAME configured for a repository's GitHub Pages.

Patch:
diff --git a/github/github-accessors.go b/github/github-accessors.go
index 92a952ef..1473c56f 100644
--- a/github/github-accessors.go
+++ b/github/github-accessors.go
@@ -12046,6 +12046,230 @@ func (p *PagesBuild) GetURL() string {
 	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 {
@@ -12054,6 +12278,22 @@ func (p *PagesError) GetMessage() string {
 	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 {
@@ -13046,6 +13286,14 @@ func (p *Protection) GetRequiredPullRequestReviews() *PullRequestReviewsEnforcem
 	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 {
@@ -13070,6 +13318,14 @@ func (p *Protection) GetRestrictions() *BranchRestrictions {
 	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 {
@@ -17718,6 +17974,22 @@ func (r *RequiredStatusCheck) GetAppID() int64 {
 	return *r.AppID
 }
 
+// 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 {
diff --git a/github/repos.go b/github/repos.go
index fad152e2..9c9c7506 100644
--- a/github/repos.go
+++ b/github/repos.go
@@ -847,6 +847,8 @@ type Protection struct {
 	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
@@ -1023,7 +1025,9 @@ type RequiredStatusChecks struct {
 	Contexts []string `json:"contexts,omitempty"`
 	// The list of status checks to require in order to merge into this
 	// branch.
-	Checks []*RequiredStatusCheck `json:"checks"`
+	Checks      []*RequiredStatusCheck `json:"checks"`
+	ContextsURL *string                `json:"contexts_url,omitempty"`
+	URL         *string                `json:"url,omitempty"`
 }
 
 // RequiredStatusChecksRequest represents a request to edit a protected branch's status checks.
diff --git a/github/repos_pages.go b/github/repos_pages.go
index 845de8a0..83075dbd 100644
--- a/github/repos_pages.go
+++ b/github/repos_pages.go
@@ -47,6 +47,44 @@ type PagesBuild struct {
 	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"`
@@ -247,3 +285,22 @@ func (s *RepositoriesService) RequestPageBuild(ctx context.Context, owner, repo
 
 	return build, resp, nil
 }
+
+// GetPagesHealthCheck gets a DNS health check for the CNAME record configured for a repository's GitHub Pages.
+//
+// GitHub API docs: https://docs.github.com/en/rest/pages#get-a-dns-health-check-for-github-pages
+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
+}
diff --git a/github/timestamp.go b/github/timestamp.go
index 1061a55e..00c1235e 100644
--- a/github/timestamp.go
+++ b/github/timestamp.go
@@ -22,6 +22,14 @@ 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) {
diff --git a/go.mod b/go.mod
index c4d156bc..16e5bea0 100644
--- a/go.mod
+++ b/go.mod
@@ -4,15 +4,15 @@ require (
 	github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8
 	github.com/google/go-cmp v0.5.9
 	github.com/google/go-querystring v1.1.0
-	golang.org/x/oauth2 v0.6.0
+	golang.org/x/oauth2 v0.7.0
 )
 
 require (
 	github.com/cloudflare/circl v1.1.0 // indirect
 	github.com/golang/protobuf v1.5.2 // indirect
 	golang.org/x/crypto v0.7.0 // indirect
-	golang.org/x/net v0.8.0 // indirect
-	golang.org/x/sys v0.6.0 // indirect
+	golang.org/x/net v0.9.0 // indirect
+	golang.org/x/sys v0.7.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
 	google.golang.org/protobuf v1.28.0 // indirect
 )
diff --git a/go.sum b/go.sum
index 098145c5..f5dd2eff 100644
--- a/go.sum
+++ b/go.sum
@@ -1,3 +1,4 @@
+cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
 github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 h1:wPbRQzjjwFc0ih8puEVAOFGELsn1zoIIYdxvML7mDxA=
 github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8/go.mod h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g=
 github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
@@ -9,31 +10,58 @@ 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.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
 github.com/google/go-cmp v0.5.9/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/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.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
 golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
+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.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
+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.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
-golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw=
-golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
+golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
+golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
+golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g=
+golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4=
+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-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
+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.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 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.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
+golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
 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.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/text v0.9.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=
diff --git a/scrape/go.mod b/scrape/go.mod
index 5c7b9dae..296956c9 100644
--- a/scrape/go.mod
+++ b/scrape/go.mod
@@ -7,5 +7,5 @@ require (
 	github.com/google/go-cmp v0.5.9
 	github.com/google/go-github/v51 v51.0.0
 	github.com/xlzd/gotp v0.1.0
-	golang.org/x/net v0.8.0
+	golang.org/x/net v0.9.0
 )
diff --git a/scrape/go.sum b/scrape/go.sum
index cf80c6f4..e32b45f6 100644
--- a/scrape/go.sum
+++ b/scrape/go.sum
@@ -37,8 +37,9 @@ golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qx
 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.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
-golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
 golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
+golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
+golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
 golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw=
 golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -52,12 +53,14 @@ golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBc
 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.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 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.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
+golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
 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=
@@ -65,6 +68,7 @@ golang.org/x/text v0.3.6/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.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.9.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=


Test patch:
diff --git a/github/github-accessors_test.go b/github/github-accessors_test.go
index fae13c0e..52a0e5b9 100644
--- a/github/github-accessors_test.go
+++ b/github/github-accessors_test.go
@@ -14128,6 +14128,286 @@ func TestPagesBuild_GetURL(tt *testing.T) {
 	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}
@@ -14138,6 +14418,20 @@ func TestPagesError_GetMessage(tt *testing.T) {
 	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}
@@ -15237,6 +15531,13 @@ func TestProtection_GetRequiredPullRequestReviews(tt *testing.T) {
 	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()
@@ -15258,6 +15559,16 @@ func TestProtection_GetRestrictions(tt *testing.T) {
 	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()
@@ -20639,6 +20950,26 @@ func TestRequiredStatusCheck_GetAppID(tt *testing.T) {
 	r.GetAppID()
 }
 
+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}
diff --git a/github/repos_pages_test.go b/github/repos_pages_test.go
index 6245aac2..21ffb181 100644
--- a/github/repos_pages_test.go
+++ b/github/repos_pages_test.go
@@ -449,6 +449,54 @@ func TestRepositoriesService_RequestPageBuild(t *testing.T) {
 	})
 }
 
+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{}, "{}")
 
@@ -559,6 +607,90 @@ func TestPagesBuild_Marshal(t *testing.T) {
 	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{}, "{}")
 
diff --git a/github/timestamp_test.go b/github/timestamp_test.go
index 09724951..69245b60 100644
--- a/github/timestamp_test.go
+++ b/github/timestamp_test.go
@@ -169,6 +169,17 @@ func TestWrappedTimestamp_Unmarshal(t *testing.T) {
 	}
 }
 
+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