From 3af8d69559a432953028ca78e7829fc4c956e9a9 Mon Sep 17 00:00:00 2001 From: Greg Date: Wed, 21 Jan 2026 04:43:31 +0300 Subject: [PATCH 1/7] feat: add support for GitHub Budgets API --- github/billing_budgets.go | 114 ++++++++++++++ github/billing_budgets_test.go | 130 ++++++++++++++++ github/enterprise_billing_budgets.go | 110 +++++++++++++ github/enterprise_billing_budgets_test.go | 182 ++++++++++++++++++++++ 4 files changed, 536 insertions(+) create mode 100644 github/billing_budgets.go create mode 100644 github/billing_budgets_test.go create mode 100644 github/enterprise_billing_budgets.go create mode 100644 github/enterprise_billing_budgets_test.go diff --git a/github/billing_budgets.go b/github/billing_budgets.go new file mode 100644 index 00000000000..2e733304201 --- /dev/null +++ b/github/billing_budgets.go @@ -0,0 +1,114 @@ +// Copyright 2025 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "context" + "fmt" +) + +// Budget represents a GitHub budget. +type Budget struct { + ID *string `json:"id,omitempty"` + BudgetName *string `json:"budget_name,omitempty"` + TargetSubAccount *string `json:"target_sub_account,omitempty"` + TargetType *string `json:"target_type,omitempty"` + TargetID *int64 `json:"target_id,omitempty"` + TargetName *string `json:"target_name,omitempty"` + PricingModel *string `json:"pricing_model,omitempty"` + PricingModelID *string `json:"pricing_model_id,omitempty"` + PricingModelDisplayName *string `json:"pricing_model_display_name,omitempty"` + BudgetType *string `json:"budget_type,omitempty"` + LimitAmount *float64 `json:"limit_amount,omitempty"` + CurrentAmount *float64 `json:"current_amount,omitempty"` + Currency *string `json:"currency,omitempty"` + ExcludeCostCenterUsage *bool `json:"exclude_cost_center_usage,omitempty"` + BudgetAlerting *BudgetAlerting `json:"budget_alerting,omitempty"` +} + +// BudgetAlerting represents the alerting configuration for a budget. +type BudgetAlerting struct { + WillAlert *bool `json:"will_alert,omitempty"` + AlertRecipients []string `json:"alert_recipients,omitempty"` +} + +// ListOrganizationBudgets lists all budgets for an organization. +// +// GitHub API docs: https://docs.github.com/rest/billing/budgets#get-all-budgets-for-an-organization +// +// meta:operation GET /organizations/{org}/settings/billing/budgets +func (s *BillingService) ListOrganizationBudgets(ctx context.Context, org string) ([]*Budget, *Response, error) { + u := fmt.Sprintf("organizations/%v/settings/billing/budgets", org) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + var budgets []*Budget + resp, err := s.client.Do(ctx, req, &budgets) + if err != nil { + return nil, resp, err + } + + return budgets, resp, nil +} + +// GetOrganizationBudget gets a specific budget for an organization. +// +// GitHub API docs: https://docs.github.com/rest/billing/budgets#get-a-budget-for-an-organization +// +// meta:operation GET /organizations/{org}/settings/billing/budgets/{budget_id} +func (s *BillingService) GetOrganizationBudget(ctx context.Context, org string, budgetID string) (*Budget, *Response, error) { + u := fmt.Sprintf("organizations/%v/settings/billing/budgets/%v", org, budgetID) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + budget := new(Budget) + resp, err := s.client.Do(ctx, req, budget) + if err != nil { + return nil, resp, err + } + + return budget, resp, nil +} + +// UpdateOrganizationBudget updates a specific budget for an organization. +// +// GitHub API docs: https://docs.github.com/rest/billing/budgets#update-a-budget-for-an-organization +// +// meta:operation PATCH /organizations/{org}/settings/billing/budgets/{budget_id} +func (s *BillingService) UpdateOrganizationBudget(ctx context.Context, org string, budgetID string, budget *Budget) (*Budget, *Response, error) { + u := fmt.Sprintf("organizations/%v/settings/billing/budgets/%v", org, budgetID) + req, err := s.client.NewRequest("PATCH", u, budget) + if err != nil { + return nil, nil, err + } + + updatedBudget := new(Budget) + resp, err := s.client.Do(ctx, req, updatedBudget) + if err != nil { + return nil, resp, err + } + + return updatedBudget, resp, nil +} + +// DeleteOrganizationBudget deletes a specific budget for an organization. +// +// GitHub API docs: https://docs.github.com/rest/billing/budgets#delete-a-budget-for-an-organization +// +// meta:operation DELETE /organizations/{org}/settings/billing/budgets/{budget_id} +func (s *BillingService) DeleteOrganizationBudget(ctx context.Context, org string, budgetID string) (*Response, error) { + u := fmt.Sprintf("organizations/%v/settings/billing/budgets/%v", org, budgetID) + req, err := s.client.NewRequest("DELETE", u, nil) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) +} diff --git a/github/billing_budgets_test.go b/github/billing_budgets_test.go new file mode 100644 index 00000000000..dc2580e7f3d --- /dev/null +++ b/github/billing_budgets_test.go @@ -0,0 +1,130 @@ +// Copyright 2025 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "fmt" + "net/http" + "testing" + + "github.com/google/go-cmp/cmp" +) + +func TestBillingService_ListOrganizationBudgets(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + mux.HandleFunc("/organizations/o/settings/billing/budgets", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `[ + { + "id": "1", + "budget_name": "Budget 1", + "limit_amount": 100.5, + "budget_alerting": { + "will_alert": true, + "alert_recipients": ["user1"] + } + } + ]`) + }) + + ctx := t.Context() + budgets, _, err := client.Billing.ListOrganizationBudgets(ctx, "o") + if err != nil { + t.Errorf("Billing.ListOrganizationBudgets returned error: %v", err) + } + + want := []*Budget{ + { + ID: Ptr("1"), + BudgetName: Ptr("Budget 1"), + LimitAmount: Ptr(100.5), + BudgetAlerting: &BudgetAlerting{ + WillAlert: Ptr(true), + AlertRecipients: []string{"user1"}, + }, + }, + } + if !cmp.Equal(budgets, want) { + t.Errorf("Billing.ListOrganizationBudgets returned %+v, want %+v", budgets, want) + } +} + +func TestBillingService_GetOrganizationBudget(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + mux.HandleFunc("/organizations/o/settings/billing/budgets/1", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `{ + "id": "1", + "budget_name": "Budget 1" + }`) + }) + + ctx := t.Context() + budget, _, err := client.Billing.GetOrganizationBudget(ctx, "o", "1") + if err != nil { + t.Errorf("Billing.GetOrganizationBudget returned error: %v", err) + } + + want := &Budget{ + ID: Ptr("1"), + BudgetName: Ptr("Budget 1"), + } + if !cmp.Equal(budget, want) { + t.Errorf("Billing.GetOrganizationBudget returned %+v, want %+v", budget, want) + } +} + +func TestBillingService_UpdateOrganizationBudget(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + input := &Budget{ + BudgetName: Ptr("Updated Budget"), + } + + mux.HandleFunc("/organizations/o/settings/billing/budgets/1", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "PATCH") + testBody(t, r, `{"budget_name":"Updated Budget"}`+"\n") + fmt.Fprint(w, `{ + "id": "1", + "budget_name": "Updated Budget" + }`) + }) + + ctx := t.Context() + budget, _, err := client.Billing.UpdateOrganizationBudget(ctx, "o", "1", input) + if err != nil { + t.Errorf("Billing.UpdateOrganizationBudget returned error: %v", err) + } + + want := &Budget{ + ID: Ptr("1"), + BudgetName: Ptr("Updated Budget"), + } + if !cmp.Equal(budget, want) { + t.Errorf("Billing.UpdateOrganizationBudget returned %+v, want %+v", budget, want) + } +} + +func TestBillingService_DeleteOrganizationBudget(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + mux.HandleFunc("/organizations/o/settings/billing/budgets/1", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "DELETE") + w.WriteHeader(http.StatusNoContent) + }) + + ctx := t.Context() + _, err := client.Billing.DeleteOrganizationBudget(ctx, "o", "1") + if err != nil { + t.Errorf("Billing.DeleteOrganizationBudget returned error: %v", err) + } +} diff --git a/github/enterprise_billing_budgets.go b/github/enterprise_billing_budgets.go new file mode 100644 index 00000000000..3a0d23fe802 --- /dev/null +++ b/github/enterprise_billing_budgets.go @@ -0,0 +1,110 @@ +// Copyright 2025 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "context" + "fmt" +) + +// ListEnterpriseBudgets lists all budgets for an enterprise. +// +// GitHub API docs: https://docs.github.com/rest/billing/budgets#get-all-budgets-for-an-enterprise +// +// meta:operation GET /enterprises/{enterprise}/settings/billing/budgets +func (s *EnterpriseService) ListEnterpriseBudgets(ctx context.Context, enterprise string) ([]*Budget, *Response, error) { + u := fmt.Sprintf("enterprises/%v/settings/billing/budgets", enterprise) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + var budgets []*Budget + resp, err := s.client.Do(ctx, req, &budgets) + if err != nil { + return nil, resp, err + } + + return budgets, resp, nil +} + +// GetEnterpriseBudget gets a specific budget for an enterprise. +// +// GitHub API docs: https://docs.github.com/rest/billing/budgets#get-a-budget-for-an-enterprise +// +// meta:operation GET /enterprises/{enterprise}/settings/billing/budgets/{budget_id} +func (s *EnterpriseService) GetEnterpriseBudget(ctx context.Context, enterprise string, budgetID string) (*Budget, *Response, error) { + u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + budget := new(Budget) + resp, err := s.client.Do(ctx, req, budget) + if err != nil { + return nil, resp, err + } + + return budget, resp, nil +} + +// CreateEnterpriseBudget creates a specific budget for an enterprise. +// +// GitHub API docs: https://docs.github.com/rest/billing/budgets#create-a-budget +// +// meta:operation POST /enterprises/{enterprise}/settings/billing/budgets +func (s *EnterpriseService) CreateEnterpriseBudget(ctx context.Context, enterprise string, budget *Budget) (*Budget, *Response, error) { + u := fmt.Sprintf("enterprises/%v/settings/billing/budgets", enterprise) + req, err := s.client.NewRequest("POST", u, budget) + if err != nil { + return nil, nil, err + } + + createdBudget := new(Budget) + resp, err := s.client.Do(ctx, req, createdBudget) + if err != nil { + return nil, resp, err + } + + return createdBudget, resp, nil +} + +// UpdateEnterpriseBudget updates a specific budget for an enterprise. +// +// GitHub API docs: https://docs.github.com/rest/billing/budgets#update-a-budget-for-an-enterprise +// +// meta:operation PATCH /enterprises/{enterprise}/settings/billing/budgets/{budget_id} +func (s *EnterpriseService) UpdateEnterpriseBudget(ctx context.Context, enterprise string, budgetID string, budget *Budget) (*Budget, *Response, error) { + u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) + req, err := s.client.NewRequest("PATCH", u, budget) + if err != nil { + return nil, nil, err + } + + updatedBudget := new(Budget) + resp, err := s.client.Do(ctx, req, updatedBudget) + if err != nil { + return nil, resp, err + } + + return updatedBudget, resp, nil +} + +// DeleteEnterpriseBudget deletes a specific budget for an enterprise. +// +// GitHub API docs: https://docs.github.com/rest/billing/budgets#delete-a-budget-for-an-enterprise +// +// meta:operation DELETE /enterprises/{enterprise}/settings/billing/budgets/{budget_id} +func (s *EnterpriseService) DeleteEnterpriseBudget(ctx context.Context, enterprise string, budgetID string) (*Response, error) { + u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) + req, err := s.client.NewRequest("DELETE", u, nil) + if err != nil { + return nil, err + } + + return s.client.Do(ctx, req, nil) +} diff --git a/github/enterprise_billing_budgets_test.go b/github/enterprise_billing_budgets_test.go new file mode 100644 index 00000000000..8267fb3305c --- /dev/null +++ b/github/enterprise_billing_budgets_test.go @@ -0,0 +1,182 @@ +// Copyright 2025 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "fmt" + "net/http" + "testing" + + "github.com/google/go-cmp/cmp" +) + +func TestEnterpriseService_ListEnterpriseBudgets(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + mux.HandleFunc("/enterprises/e/settings/billing/budgets", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `[ + { + "id": "1", + "budget_name": "Budget 1" + } + ]`) + }) + + ctx := t.Context() + budgets, _, err := client.Enterprise.ListEnterpriseBudgets(ctx, "e") + if err != nil { + t.Errorf("Enterprise.ListEnterpriseBudgets returned error: %v", err) + } + + want := []*Budget{ + { + ID: Ptr("1"), + BudgetName: Ptr("Budget 1"), + }, + } + if !cmp.Equal(budgets, want) { + t.Errorf("Enterprise.ListEnterpriseBudgets returned %+v, want %+v", budgets, want) + } +} + +func TestEnterpriseService_GetEnterpriseBudget(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + mux.HandleFunc("/enterprises/e/settings/billing/budgets/1", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `{ + "id": "1", + "budget_name": "Budget 1" + }`) + }) + + ctx := t.Context() + budget, _, err := client.Enterprise.GetEnterpriseBudget(ctx, "e", "1") + if err != nil { + t.Errorf("Enterprise.GetEnterpriseBudget returned error: %v", err) + } + + want := &Budget{ + ID: Ptr("1"), + BudgetName: Ptr("Budget 1"), + } + if !cmp.Equal(budget, want) { + t.Errorf("Enterprise.GetEnterpriseBudget returned %+v, want %+v", budget, want) + } +} + +func TestEnterpriseService_CreateEnterpriseBudget(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + input := &Budget{ + BudgetName: Ptr("New Budget"), + LimitAmount: Ptr(500.0), + } + + mux.HandleFunc("/enterprises/e/settings/billing/budgets", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "POST") + testBody(t, r, `{"budget_name":"New Budget","limit_amount":500}`+"\n") + fmt.Fprint(w, `{ + "id": "1", + "budget_name": "New Budget", + "limit_amount": 500 + }`) + }) + + ctx := t.Context() + budget, _, err := client.Enterprise.CreateEnterpriseBudget(ctx, "e", input) + if err != nil { + t.Errorf("Enterprise.CreateEnterpriseBudget returned error: %v", err) + } + + want := &Budget{ + ID: Ptr("1"), + BudgetName: Ptr("New Budget"), + LimitAmount: Ptr(500.0), + } + if !cmp.Equal(budget, want) { + t.Errorf("Enterprise.CreateEnterpriseBudget returned %+v, want %+v", budget, want) + } +} + +func TestEnterpriseService_UpdateEnterpriseBudget(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + input := &Budget{ + BudgetName: Ptr("Updated Budget"), + } + + mux.HandleFunc("/enterprises/e/settings/billing/budgets/1", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "PATCH") + testBody(t, r, `{"budget_name":"Updated Budget"}`+"\n") + fmt.Fprint(w, `{ + "id": "1", + "budget_name": "Updated Budget" + }`) + }) + + ctx := t.Context() + budget, _, err := client.Enterprise.UpdateEnterpriseBudget(ctx, "e", "1", input) + if err != nil { + t.Errorf("Enterprise.UpdateEnterpriseBudget returned error: %v", err) + } + + want := &Budget{ + ID: Ptr("1"), + BudgetName: Ptr("Updated Budget"), + } + if !cmp.Equal(budget, want) { + t.Errorf("Enterprise.UpdateEnterpriseBudget returned %+v, want %+v", budget, want) + } +} + +func TestEnterpriseService_DeleteEnterpriseBudget(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + mux.HandleFunc("/enterprises/e/settings/billing/budgets/1", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "DELETE") + w.WriteHeader(http.StatusNoContent) + }) + + ctx := t.Context() + _, err := client.Enterprise.DeleteEnterpriseBudget(ctx, "e", "1") + if err != nil { + t.Errorf("Enterprise.DeleteEnterpriseBudget returned error: %v", err) + } +} + +func TestBudget_Marshal(t *testing.T) { + t.Parallel() + testJSONMarshal(t, &Budget{}, "{}") + + b := &Budget{ + ID: Ptr("1"), + BudgetName: Ptr("Budget"), + LimitAmount: Ptr(100.0), + BudgetAlerting: &BudgetAlerting{ + WillAlert: Ptr(true), + AlertRecipients: []string{"u1"}, + }, + } + + want := `{ + "id": "1", + "budget_name": "Budget", + "limit_amount": 100, + "budget_alerting": { + "will_alert": true, + "alert_recipients": ["u1"] + } + }` + + testJSONMarshal(t, b, want) +} From d18bb715d3a0e766ba5e5ee591dbe095bf0c8d99 Mon Sep 17 00:00:00 2001 From: Greg Date: Wed, 21 Jan 2026 05:53:43 +0300 Subject: [PATCH 2/7] chore: address PR #3931 review comments --- github/billing_budgets.go | 36 +++++++++++------------ github/billing_budgets_test.go | 2 +- github/enterprise_billing_budgets.go | 8 ++--- github/enterprise_billing_budgets_test.go | 2 +- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/github/billing_budgets.go b/github/billing_budgets.go index 2e733304201..d2cff012eb3 100644 --- a/github/billing_budgets.go +++ b/github/billing_budgets.go @@ -1,4 +1,4 @@ -// Copyright 2025 The go-github AUTHORS. All rights reserved. +// Copyright 2026 The go-github AUTHORS. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -12,21 +12,21 @@ import ( // Budget represents a GitHub budget. type Budget struct { - ID *string `json:"id,omitempty"` - BudgetName *string `json:"budget_name,omitempty"` - TargetSubAccount *string `json:"target_sub_account,omitempty"` - TargetType *string `json:"target_type,omitempty"` - TargetID *int64 `json:"target_id,omitempty"` - TargetName *string `json:"target_name,omitempty"` - PricingModel *string `json:"pricing_model,omitempty"` - PricingModelID *string `json:"pricing_model_id,omitempty"` + ID *string `json:"id,omitempty"` + BudgetName *string `json:"budget_name,omitempty"` + TargetSubAccount *string `json:"target_sub_account,omitempty"` + TargetType *string `json:"target_type,omitempty"` + TargetID *int64 `json:"target_id,omitempty"` + TargetName *string `json:"target_name,omitempty"` + PricingModel *string `json:"pricing_model,omitempty"` + PricingModelID *string `json:"pricing_model_id,omitempty"` PricingModelDisplayName *string `json:"pricing_model_display_name,omitempty"` - BudgetType *string `json:"budget_type,omitempty"` - LimitAmount *float64 `json:"limit_amount,omitempty"` - CurrentAmount *float64 `json:"current_amount,omitempty"` - Currency *string `json:"currency,omitempty"` - ExcludeCostCenterUsage *bool `json:"exclude_cost_center_usage,omitempty"` - BudgetAlerting *BudgetAlerting `json:"budget_alerting,omitempty"` + BudgetType *string `json:"budget_type,omitempty"` + LimitAmount *float64 `json:"limit_amount,omitempty"` + CurrentAmount *float64 `json:"current_amount,omitempty"` + Currency *string `json:"currency,omitempty"` + ExcludeCostCenterUsage *bool `json:"exclude_cost_center_usage,omitempty"` + BudgetAlerting *BudgetAlerting `json:"budget_alerting,omitempty"` } // BudgetAlerting represents the alerting configuration for a budget. @@ -61,7 +61,7 @@ func (s *BillingService) ListOrganizationBudgets(ctx context.Context, org string // GitHub API docs: https://docs.github.com/rest/billing/budgets#get-a-budget-for-an-organization // // meta:operation GET /organizations/{org}/settings/billing/budgets/{budget_id} -func (s *BillingService) GetOrganizationBudget(ctx context.Context, org string, budgetID string) (*Budget, *Response, error) { +func (s *BillingService) GetOrganizationBudget(ctx context.Context, org, budgetID string) (*Budget, *Response, error) { u := fmt.Sprintf("organizations/%v/settings/billing/budgets/%v", org, budgetID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { @@ -82,7 +82,7 @@ func (s *BillingService) GetOrganizationBudget(ctx context.Context, org string, // GitHub API docs: https://docs.github.com/rest/billing/budgets#update-a-budget-for-an-organization // // meta:operation PATCH /organizations/{org}/settings/billing/budgets/{budget_id} -func (s *BillingService) UpdateOrganizationBudget(ctx context.Context, org string, budgetID string, budget *Budget) (*Budget, *Response, error) { +func (s *BillingService) UpdateOrganizationBudget(ctx context.Context, org, budgetID string, budget *Budget) (*Budget, *Response, error) { u := fmt.Sprintf("organizations/%v/settings/billing/budgets/%v", org, budgetID) req, err := s.client.NewRequest("PATCH", u, budget) if err != nil { @@ -103,7 +103,7 @@ func (s *BillingService) UpdateOrganizationBudget(ctx context.Context, org strin // GitHub API docs: https://docs.github.com/rest/billing/budgets#delete-a-budget-for-an-organization // // meta:operation DELETE /organizations/{org}/settings/billing/budgets/{budget_id} -func (s *BillingService) DeleteOrganizationBudget(ctx context.Context, org string, budgetID string) (*Response, error) { +func (s *BillingService) DeleteOrganizationBudget(ctx context.Context, org, budgetID string) (*Response, error) { u := fmt.Sprintf("organizations/%v/settings/billing/budgets/%v", org, budgetID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { diff --git a/github/billing_budgets_test.go b/github/billing_budgets_test.go index dc2580e7f3d..88e3bffb806 100644 --- a/github/billing_budgets_test.go +++ b/github/billing_budgets_test.go @@ -1,4 +1,4 @@ -// Copyright 2025 The go-github AUTHORS. All rights reserved. +// Copyright 2026 The go-github AUTHORS. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. diff --git a/github/enterprise_billing_budgets.go b/github/enterprise_billing_budgets.go index 3a0d23fe802..1fd7a06f413 100644 --- a/github/enterprise_billing_budgets.go +++ b/github/enterprise_billing_budgets.go @@ -1,4 +1,4 @@ -// Copyright 2025 The go-github AUTHORS. All rights reserved. +// Copyright 2026 The go-github AUTHORS. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. @@ -36,7 +36,7 @@ func (s *EnterpriseService) ListEnterpriseBudgets(ctx context.Context, enterpris // GitHub API docs: https://docs.github.com/rest/billing/budgets#get-a-budget-for-an-enterprise // // meta:operation GET /enterprises/{enterprise}/settings/billing/budgets/{budget_id} -func (s *EnterpriseService) GetEnterpriseBudget(ctx context.Context, enterprise string, budgetID string) (*Budget, *Response, error) { +func (s *EnterpriseService) GetEnterpriseBudget(ctx context.Context, enterprise, budgetID string) (*Budget, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { @@ -78,7 +78,7 @@ func (s *EnterpriseService) CreateEnterpriseBudget(ctx context.Context, enterpri // GitHub API docs: https://docs.github.com/rest/billing/budgets#update-a-budget-for-an-enterprise // // meta:operation PATCH /enterprises/{enterprise}/settings/billing/budgets/{budget_id} -func (s *EnterpriseService) UpdateEnterpriseBudget(ctx context.Context, enterprise string, budgetID string, budget *Budget) (*Budget, *Response, error) { +func (s *EnterpriseService) UpdateEnterpriseBudget(ctx context.Context, enterprise, budgetID string, budget *Budget) (*Budget, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) req, err := s.client.NewRequest("PATCH", u, budget) if err != nil { @@ -99,7 +99,7 @@ func (s *EnterpriseService) UpdateEnterpriseBudget(ctx context.Context, enterpri // GitHub API docs: https://docs.github.com/rest/billing/budgets#delete-a-budget-for-an-enterprise // // meta:operation DELETE /enterprises/{enterprise}/settings/billing/budgets/{budget_id} -func (s *EnterpriseService) DeleteEnterpriseBudget(ctx context.Context, enterprise string, budgetID string) (*Response, error) { +func (s *EnterpriseService) DeleteEnterpriseBudget(ctx context.Context, enterprise, budgetID string) (*Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { diff --git a/github/enterprise_billing_budgets_test.go b/github/enterprise_billing_budgets_test.go index 8267fb3305c..dab30c3c6ca 100644 --- a/github/enterprise_billing_budgets_test.go +++ b/github/enterprise_billing_budgets_test.go @@ -1,4 +1,4 @@ -// Copyright 2025 The go-github AUTHORS. All rights reserved. +// Copyright 2026 The go-github AUTHORS. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. From bf47de793cf9baf487a2f1db2df4c9934b5e299a Mon Sep 17 00:00:00 2001 From: Greg Date: Wed, 21 Jan 2026 06:15:17 +0300 Subject: [PATCH 3/7] test: add error path tests for 100% coverage --- github/billing_budgets_test.go | 28 ++++++++++++++++++ github/enterprise_billing_budgets_test.go | 36 +++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/github/billing_budgets_test.go b/github/billing_budgets_test.go index 88e3bffb806..d00a77b4271 100644 --- a/github/billing_budgets_test.go +++ b/github/billing_budgets_test.go @@ -52,6 +52,14 @@ func TestBillingService_ListOrganizationBudgets(t *testing.T) { if !cmp.Equal(budgets, want) { t.Errorf("Billing.ListOrganizationBudgets returned %+v, want %+v", budgets, want) } + const methodName = "ListOrganizationBudgets" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Billing.ListOrganizationBudgets(ctx, "o") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) } func TestBillingService_GetOrganizationBudget(t *testing.T) { @@ -79,6 +87,14 @@ func TestBillingService_GetOrganizationBudget(t *testing.T) { if !cmp.Equal(budget, want) { t.Errorf("Billing.GetOrganizationBudget returned %+v, want %+v", budget, want) } + const methodName = "GetOrganizationBudget" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Billing.GetOrganizationBudget(ctx, "o", "1") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) } func TestBillingService_UpdateOrganizationBudget(t *testing.T) { @@ -111,6 +127,14 @@ func TestBillingService_UpdateOrganizationBudget(t *testing.T) { if !cmp.Equal(budget, want) { t.Errorf("Billing.UpdateOrganizationBudget returned %+v, want %+v", budget, want) } + const methodName = "UpdateOrganizationBudget" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Billing.UpdateOrganizationBudget(ctx, "o", "1", input) + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) } func TestBillingService_DeleteOrganizationBudget(t *testing.T) { @@ -127,4 +151,8 @@ func TestBillingService_DeleteOrganizationBudget(t *testing.T) { if err != nil { t.Errorf("Billing.DeleteOrganizationBudget returned error: %v", err) } + const methodName = "DeleteOrganizationBudget" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + return client.Billing.DeleteOrganizationBudget(ctx, "o", "1") + }) } diff --git a/github/enterprise_billing_budgets_test.go b/github/enterprise_billing_budgets_test.go index dab30c3c6ca..c52d4a0be28 100644 --- a/github/enterprise_billing_budgets_test.go +++ b/github/enterprise_billing_budgets_test.go @@ -42,6 +42,14 @@ func TestEnterpriseService_ListEnterpriseBudgets(t *testing.T) { if !cmp.Equal(budgets, want) { t.Errorf("Enterprise.ListEnterpriseBudgets returned %+v, want %+v", budgets, want) } + const methodName = "ListEnterpriseBudgets" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Enterprise.ListEnterpriseBudgets(ctx, "e") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) } func TestEnterpriseService_GetEnterpriseBudget(t *testing.T) { @@ -69,6 +77,14 @@ func TestEnterpriseService_GetEnterpriseBudget(t *testing.T) { if !cmp.Equal(budget, want) { t.Errorf("Enterprise.GetEnterpriseBudget returned %+v, want %+v", budget, want) } + const methodName = "GetEnterpriseBudget" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Enterprise.GetEnterpriseBudget(ctx, "e", "1") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) } func TestEnterpriseService_CreateEnterpriseBudget(t *testing.T) { @@ -104,6 +120,14 @@ func TestEnterpriseService_CreateEnterpriseBudget(t *testing.T) { if !cmp.Equal(budget, want) { t.Errorf("Enterprise.CreateEnterpriseBudget returned %+v, want %+v", budget, want) } + const methodName = "CreateEnterpriseBudget" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Enterprise.CreateEnterpriseBudget(ctx, "e", input) + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) } func TestEnterpriseService_UpdateEnterpriseBudget(t *testing.T) { @@ -136,6 +160,14 @@ func TestEnterpriseService_UpdateEnterpriseBudget(t *testing.T) { if !cmp.Equal(budget, want) { t.Errorf("Enterprise.UpdateEnterpriseBudget returned %+v, want %+v", budget, want) } + const methodName = "UpdateEnterpriseBudget" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Enterprise.UpdateEnterpriseBudget(ctx, "e", "1", input) + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) } func TestEnterpriseService_DeleteEnterpriseBudget(t *testing.T) { @@ -152,6 +184,10 @@ func TestEnterpriseService_DeleteEnterpriseBudget(t *testing.T) { if err != nil { t.Errorf("Enterprise.DeleteEnterpriseBudget returned error: %v", err) } + const methodName = "DeleteEnterpriseBudget" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + return client.Enterprise.DeleteEnterpriseBudget(ctx, "e", "1") + }) } func TestBudget_Marshal(t *testing.T) { From 0e911d002957c40a60c200beb1d96c3f82ace396 Mon Sep 17 00:00:00 2001 From: Greg Date: Wed, 21 Jan 2026 06:50:47 +0300 Subject: [PATCH 4/7] chore: update generated files --- github/billing_budgets.go | 10 +- github/enterprise_billing_budgets.go | 20 ++-- github/github-accessors.go | 128 ++++++++++++++++++++ github/github-accessors_test.go | 167 +++++++++++++++++++++++++++ 4 files changed, 310 insertions(+), 15 deletions(-) diff --git a/github/billing_budgets.go b/github/billing_budgets.go index d2cff012eb3..92b68b54253 100644 --- a/github/billing_budgets.go +++ b/github/billing_budgets.go @@ -39,7 +39,7 @@ type BudgetAlerting struct { // // GitHub API docs: https://docs.github.com/rest/billing/budgets#get-all-budgets-for-an-organization // -// meta:operation GET /organizations/{org}/settings/billing/budgets +//meta:operation GET /organizations/{org}/settings/billing/budgets func (s *BillingService) ListOrganizationBudgets(ctx context.Context, org string) ([]*Budget, *Response, error) { u := fmt.Sprintf("organizations/%v/settings/billing/budgets", org) req, err := s.client.NewRequest("GET", u, nil) @@ -58,9 +58,9 @@ func (s *BillingService) ListOrganizationBudgets(ctx context.Context, org string // GetOrganizationBudget gets a specific budget for an organization. // -// GitHub API docs: https://docs.github.com/rest/billing/budgets#get-a-budget-for-an-organization +// GitHub API docs: https://docs.github.com/rest/billing/budgets#get-a-budget-by-id-for-an-organization // -// meta:operation GET /organizations/{org}/settings/billing/budgets/{budget_id} +//meta:operation GET /organizations/{org}/settings/billing/budgets/{budget_id} func (s *BillingService) GetOrganizationBudget(ctx context.Context, org, budgetID string) (*Budget, *Response, error) { u := fmt.Sprintf("organizations/%v/settings/billing/budgets/%v", org, budgetID) req, err := s.client.NewRequest("GET", u, nil) @@ -81,7 +81,7 @@ func (s *BillingService) GetOrganizationBudget(ctx context.Context, org, budgetI // // GitHub API docs: https://docs.github.com/rest/billing/budgets#update-a-budget-for-an-organization // -// meta:operation PATCH /organizations/{org}/settings/billing/budgets/{budget_id} +//meta:operation PATCH /organizations/{org}/settings/billing/budgets/{budget_id} func (s *BillingService) UpdateOrganizationBudget(ctx context.Context, org, budgetID string, budget *Budget) (*Budget, *Response, error) { u := fmt.Sprintf("organizations/%v/settings/billing/budgets/%v", org, budgetID) req, err := s.client.NewRequest("PATCH", u, budget) @@ -102,7 +102,7 @@ func (s *BillingService) UpdateOrganizationBudget(ctx context.Context, org, budg // // GitHub API docs: https://docs.github.com/rest/billing/budgets#delete-a-budget-for-an-organization // -// meta:operation DELETE /organizations/{org}/settings/billing/budgets/{budget_id} +//meta:operation DELETE /organizations/{org}/settings/billing/budgets/{budget_id} func (s *BillingService) DeleteOrganizationBudget(ctx context.Context, org, budgetID string) (*Response, error) { u := fmt.Sprintf("organizations/%v/settings/billing/budgets/%v", org, budgetID) req, err := s.client.NewRequest("DELETE", u, nil) diff --git a/github/enterprise_billing_budgets.go b/github/enterprise_billing_budgets.go index 1fd7a06f413..2663fbc7e23 100644 --- a/github/enterprise_billing_budgets.go +++ b/github/enterprise_billing_budgets.go @@ -12,9 +12,9 @@ import ( // ListEnterpriseBudgets lists all budgets for an enterprise. // -// GitHub API docs: https://docs.github.com/rest/billing/budgets#get-all-budgets-for-an-enterprise +// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#get-all-budgets // -// meta:operation GET /enterprises/{enterprise}/settings/billing/budgets +//meta:operation GET /enterprises/{enterprise}/settings/billing/budgets func (s *EnterpriseService) ListEnterpriseBudgets(ctx context.Context, enterprise string) ([]*Budget, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets", enterprise) req, err := s.client.NewRequest("GET", u, nil) @@ -33,9 +33,9 @@ func (s *EnterpriseService) ListEnterpriseBudgets(ctx context.Context, enterpris // GetEnterpriseBudget gets a specific budget for an enterprise. // -// GitHub API docs: https://docs.github.com/rest/billing/budgets#get-a-budget-for-an-enterprise +// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#get-a-budget-by-id // -// meta:operation GET /enterprises/{enterprise}/settings/billing/budgets/{budget_id} +//meta:operation GET /enterprises/{enterprise}/settings/billing/budgets/{budget_id} func (s *EnterpriseService) GetEnterpriseBudget(ctx context.Context, enterprise, budgetID string) (*Budget, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) req, err := s.client.NewRequest("GET", u, nil) @@ -54,9 +54,9 @@ func (s *EnterpriseService) GetEnterpriseBudget(ctx context.Context, enterprise, // CreateEnterpriseBudget creates a specific budget for an enterprise. // -// GitHub API docs: https://docs.github.com/rest/billing/budgets#create-a-budget +// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#create-a-budget // -// meta:operation POST /enterprises/{enterprise}/settings/billing/budgets +//meta:operation POST /enterprises/{enterprise}/settings/billing/budgets func (s *EnterpriseService) CreateEnterpriseBudget(ctx context.Context, enterprise string, budget *Budget) (*Budget, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets", enterprise) req, err := s.client.NewRequest("POST", u, budget) @@ -75,9 +75,9 @@ func (s *EnterpriseService) CreateEnterpriseBudget(ctx context.Context, enterpri // UpdateEnterpriseBudget updates a specific budget for an enterprise. // -// GitHub API docs: https://docs.github.com/rest/billing/budgets#update-a-budget-for-an-enterprise +// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#update-a-budget // -// meta:operation PATCH /enterprises/{enterprise}/settings/billing/budgets/{budget_id} +//meta:operation PATCH /enterprises/{enterprise}/settings/billing/budgets/{budget_id} func (s *EnterpriseService) UpdateEnterpriseBudget(ctx context.Context, enterprise, budgetID string, budget *Budget) (*Budget, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) req, err := s.client.NewRequest("PATCH", u, budget) @@ -96,9 +96,9 @@ func (s *EnterpriseService) UpdateEnterpriseBudget(ctx context.Context, enterpri // DeleteEnterpriseBudget deletes a specific budget for an enterprise. // -// GitHub API docs: https://docs.github.com/rest/billing/budgets#delete-a-budget-for-an-enterprise +// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#delete-a-budget // -// meta:operation DELETE /enterprises/{enterprise}/settings/billing/budgets/{budget_id} +//meta:operation DELETE /enterprises/{enterprise}/settings/billing/budgets/{budget_id} func (s *EnterpriseService) DeleteEnterpriseBudget(ctx context.Context, enterprise, budgetID string) (*Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) req, err := s.client.NewRequest("DELETE", u, nil) diff --git a/github/github-accessors.go b/github/github-accessors.go index 957e2784249..c34e1e03d96 100644 --- a/github/github-accessors.go +++ b/github/github-accessors.go @@ -2198,6 +2198,134 @@ func (b *BranchProtectionRuleEvent) GetSender() *User { return b.Sender } +// GetBudgetAlerting returns the BudgetAlerting field. +func (b *Budget) GetBudgetAlerting() *BudgetAlerting { + if b == nil { + return nil + } + return b.BudgetAlerting +} + +// GetBudgetName returns the BudgetName field if it's non-nil, zero value otherwise. +func (b *Budget) GetBudgetName() string { + if b == nil || b.BudgetName == nil { + return "" + } + return *b.BudgetName +} + +// GetBudgetType returns the BudgetType field if it's non-nil, zero value otherwise. +func (b *Budget) GetBudgetType() string { + if b == nil || b.BudgetType == nil { + return "" + } + return *b.BudgetType +} + +// GetCurrency returns the Currency field if it's non-nil, zero value otherwise. +func (b *Budget) GetCurrency() string { + if b == nil || b.Currency == nil { + return "" + } + return *b.Currency +} + +// GetCurrentAmount returns the CurrentAmount field. +func (b *Budget) GetCurrentAmount() *float64 { + if b == nil { + return nil + } + return b.CurrentAmount +} + +// GetExcludeCostCenterUsage returns the ExcludeCostCenterUsage field if it's non-nil, zero value otherwise. +func (b *Budget) GetExcludeCostCenterUsage() bool { + if b == nil || b.ExcludeCostCenterUsage == nil { + return false + } + return *b.ExcludeCostCenterUsage +} + +// GetID returns the ID field if it's non-nil, zero value otherwise. +func (b *Budget) GetID() string { + if b == nil || b.ID == nil { + return "" + } + return *b.ID +} + +// GetLimitAmount returns the LimitAmount field. +func (b *Budget) GetLimitAmount() *float64 { + if b == nil { + return nil + } + return b.LimitAmount +} + +// GetPricingModel returns the PricingModel field if it's non-nil, zero value otherwise. +func (b *Budget) GetPricingModel() string { + if b == nil || b.PricingModel == nil { + return "" + } + return *b.PricingModel +} + +// GetPricingModelDisplayName returns the PricingModelDisplayName field if it's non-nil, zero value otherwise. +func (b *Budget) GetPricingModelDisplayName() string { + if b == nil || b.PricingModelDisplayName == nil { + return "" + } + return *b.PricingModelDisplayName +} + +// GetPricingModelID returns the PricingModelID field if it's non-nil, zero value otherwise. +func (b *Budget) GetPricingModelID() string { + if b == nil || b.PricingModelID == nil { + return "" + } + return *b.PricingModelID +} + +// GetTargetID returns the TargetID field if it's non-nil, zero value otherwise. +func (b *Budget) GetTargetID() int64 { + if b == nil || b.TargetID == nil { + return 0 + } + return *b.TargetID +} + +// GetTargetName returns the TargetName field if it's non-nil, zero value otherwise. +func (b *Budget) GetTargetName() string { + if b == nil || b.TargetName == nil { + return "" + } + return *b.TargetName +} + +// GetTargetSubAccount returns the TargetSubAccount field if it's non-nil, zero value otherwise. +func (b *Budget) GetTargetSubAccount() string { + if b == nil || b.TargetSubAccount == nil { + return "" + } + return *b.TargetSubAccount +} + +// GetTargetType returns the TargetType field if it's non-nil, zero value otherwise. +func (b *Budget) GetTargetType() string { + if b == nil || b.TargetType == nil { + return "" + } + return *b.TargetType +} + +// GetWillAlert returns the WillAlert field if it's non-nil, zero value otherwise. +func (b *BudgetAlerting) GetWillAlert() bool { + if b == nil || b.WillAlert == nil { + return false + } + return *b.WillAlert +} + // GetActorID returns the ActorID field if it's non-nil, zero value otherwise. func (b *BypassActor) GetActorID() int64 { if b == nil || b.ActorID == nil { diff --git a/github/github-accessors_test.go b/github/github-accessors_test.go index 8743dd4548c..dc08f3a982e 100644 --- a/github/github-accessors_test.go +++ b/github/github-accessors_test.go @@ -2880,6 +2880,173 @@ func TestBranchProtectionRuleEvent_GetSender(tt *testing.T) { b.GetSender() } +func TestBudget_GetBudgetAlerting(tt *testing.T) { + tt.Parallel() + b := &Budget{} + b.GetBudgetAlerting() + b = nil + b.GetBudgetAlerting() +} + +func TestBudget_GetBudgetName(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &Budget{BudgetName: &zeroValue} + b.GetBudgetName() + b = &Budget{} + b.GetBudgetName() + b = nil + b.GetBudgetName() +} + +func TestBudget_GetBudgetType(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &Budget{BudgetType: &zeroValue} + b.GetBudgetType() + b = &Budget{} + b.GetBudgetType() + b = nil + b.GetBudgetType() +} + +func TestBudget_GetCurrency(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &Budget{Currency: &zeroValue} + b.GetCurrency() + b = &Budget{} + b.GetCurrency() + b = nil + b.GetCurrency() +} + +func TestBudget_GetCurrentAmount(tt *testing.T) { + tt.Parallel() + b := &Budget{} + b.GetCurrentAmount() + b = nil + b.GetCurrentAmount() +} + +func TestBudget_GetExcludeCostCenterUsage(tt *testing.T) { + tt.Parallel() + var zeroValue bool + b := &Budget{ExcludeCostCenterUsage: &zeroValue} + b.GetExcludeCostCenterUsage() + b = &Budget{} + b.GetExcludeCostCenterUsage() + b = nil + b.GetExcludeCostCenterUsage() +} + +func TestBudget_GetID(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &Budget{ID: &zeroValue} + b.GetID() + b = &Budget{} + b.GetID() + b = nil + b.GetID() +} + +func TestBudget_GetLimitAmount(tt *testing.T) { + tt.Parallel() + b := &Budget{} + b.GetLimitAmount() + b = nil + b.GetLimitAmount() +} + +func TestBudget_GetPricingModel(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &Budget{PricingModel: &zeroValue} + b.GetPricingModel() + b = &Budget{} + b.GetPricingModel() + b = nil + b.GetPricingModel() +} + +func TestBudget_GetPricingModelDisplayName(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &Budget{PricingModelDisplayName: &zeroValue} + b.GetPricingModelDisplayName() + b = &Budget{} + b.GetPricingModelDisplayName() + b = nil + b.GetPricingModelDisplayName() +} + +func TestBudget_GetPricingModelID(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &Budget{PricingModelID: &zeroValue} + b.GetPricingModelID() + b = &Budget{} + b.GetPricingModelID() + b = nil + b.GetPricingModelID() +} + +func TestBudget_GetTargetID(tt *testing.T) { + tt.Parallel() + var zeroValue int64 + b := &Budget{TargetID: &zeroValue} + b.GetTargetID() + b = &Budget{} + b.GetTargetID() + b = nil + b.GetTargetID() +} + +func TestBudget_GetTargetName(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &Budget{TargetName: &zeroValue} + b.GetTargetName() + b = &Budget{} + b.GetTargetName() + b = nil + b.GetTargetName() +} + +func TestBudget_GetTargetSubAccount(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &Budget{TargetSubAccount: &zeroValue} + b.GetTargetSubAccount() + b = &Budget{} + b.GetTargetSubAccount() + b = nil + b.GetTargetSubAccount() +} + +func TestBudget_GetTargetType(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &Budget{TargetType: &zeroValue} + b.GetTargetType() + b = &Budget{} + b.GetTargetType() + b = nil + b.GetTargetType() +} + +func TestBudgetAlerting_GetWillAlert(tt *testing.T) { + tt.Parallel() + var zeroValue bool + b := &BudgetAlerting{WillAlert: &zeroValue} + b.GetWillAlert() + b = &BudgetAlerting{} + b.GetWillAlert() + b = nil + b.GetWillAlert() +} + func TestBypassActor_GetActorID(tt *testing.T) { tt.Parallel() var zeroValue int64 From 57e424bb35f3e774f3faff63c64cc934595fe06e Mon Sep 17 00:00:00 2001 From: Greg Date: Wed, 21 Jan 2026 15:44:55 +0300 Subject: [PATCH 5/7] chore: address PR #3931 review comments --- github/enterprise_billing_budgets.go | 10 ++-- github/enterprise_billing_budgets_test.go | 58 +++++++++++------------ 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/github/enterprise_billing_budgets.go b/github/enterprise_billing_budgets.go index 2663fbc7e23..074c08f6420 100644 --- a/github/enterprise_billing_budgets.go +++ b/github/enterprise_billing_budgets.go @@ -15,7 +15,7 @@ import ( // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#get-all-budgets // //meta:operation GET /enterprises/{enterprise}/settings/billing/budgets -func (s *EnterpriseService) ListEnterpriseBudgets(ctx context.Context, enterprise string) ([]*Budget, *Response, error) { +func (s *EnterpriseService) ListBudgets(ctx context.Context, enterprise string) ([]*Budget, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets", enterprise) req, err := s.client.NewRequest("GET", u, nil) if err != nil { @@ -36,7 +36,7 @@ func (s *EnterpriseService) ListEnterpriseBudgets(ctx context.Context, enterpris // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#get-a-budget-by-id // //meta:operation GET /enterprises/{enterprise}/settings/billing/budgets/{budget_id} -func (s *EnterpriseService) GetEnterpriseBudget(ctx context.Context, enterprise, budgetID string) (*Budget, *Response, error) { +func (s *EnterpriseService) GetBudget(ctx context.Context, enterprise, budgetID string) (*Budget, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) req, err := s.client.NewRequest("GET", u, nil) if err != nil { @@ -57,7 +57,7 @@ func (s *EnterpriseService) GetEnterpriseBudget(ctx context.Context, enterprise, // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#create-a-budget // //meta:operation POST /enterprises/{enterprise}/settings/billing/budgets -func (s *EnterpriseService) CreateEnterpriseBudget(ctx context.Context, enterprise string, budget *Budget) (*Budget, *Response, error) { +func (s *EnterpriseService) CreateBudget(ctx context.Context, enterprise string, budget *Budget) (*Budget, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets", enterprise) req, err := s.client.NewRequest("POST", u, budget) if err != nil { @@ -78,7 +78,7 @@ func (s *EnterpriseService) CreateEnterpriseBudget(ctx context.Context, enterpri // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#update-a-budget // //meta:operation PATCH /enterprises/{enterprise}/settings/billing/budgets/{budget_id} -func (s *EnterpriseService) UpdateEnterpriseBudget(ctx context.Context, enterprise, budgetID string, budget *Budget) (*Budget, *Response, error) { +func (s *EnterpriseService) UpdateBudget(ctx context.Context, enterprise, budgetID string, budget *Budget) (*Budget, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) req, err := s.client.NewRequest("PATCH", u, budget) if err != nil { @@ -99,7 +99,7 @@ func (s *EnterpriseService) UpdateEnterpriseBudget(ctx context.Context, enterpri // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#delete-a-budget // //meta:operation DELETE /enterprises/{enterprise}/settings/billing/budgets/{budget_id} -func (s *EnterpriseService) DeleteEnterpriseBudget(ctx context.Context, enterprise, budgetID string) (*Response, error) { +func (s *EnterpriseService) DeleteBudget(ctx context.Context, enterprise, budgetID string) (*Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) req, err := s.client.NewRequest("DELETE", u, nil) if err != nil { diff --git a/github/enterprise_billing_budgets_test.go b/github/enterprise_billing_budgets_test.go index c52d4a0be28..f665503e473 100644 --- a/github/enterprise_billing_budgets_test.go +++ b/github/enterprise_billing_budgets_test.go @@ -13,7 +13,7 @@ import ( "github.com/google/go-cmp/cmp" ) -func TestEnterpriseService_ListEnterpriseBudgets(t *testing.T) { +func TestEnterpriseService_ListBudgets(t *testing.T) { t.Parallel() client, mux, _ := setup(t) @@ -28,9 +28,9 @@ func TestEnterpriseService_ListEnterpriseBudgets(t *testing.T) { }) ctx := t.Context() - budgets, _, err := client.Enterprise.ListEnterpriseBudgets(ctx, "e") + budgets, _, err := client.Enterprise.ListBudgets(ctx, "e") if err != nil { - t.Errorf("Enterprise.ListEnterpriseBudgets returned error: %v", err) + t.Errorf("Enterprise.ListBudgets returned error: %v", err) } want := []*Budget{ @@ -40,11 +40,11 @@ func TestEnterpriseService_ListEnterpriseBudgets(t *testing.T) { }, } if !cmp.Equal(budgets, want) { - t.Errorf("Enterprise.ListEnterpriseBudgets returned %+v, want %+v", budgets, want) + t.Errorf("Enterprise.ListBudgets returned %+v, want %+v", budgets, want) } - const methodName = "ListEnterpriseBudgets" + const methodName = "ListBudgets" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - got, resp, err := client.Enterprise.ListEnterpriseBudgets(ctx, "e") + got, resp, err := client.Enterprise.ListBudgets(ctx, "e") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } @@ -52,7 +52,7 @@ func TestEnterpriseService_ListEnterpriseBudgets(t *testing.T) { }) } -func TestEnterpriseService_GetEnterpriseBudget(t *testing.T) { +func TestEnterpriseService_GetBudget(t *testing.T) { t.Parallel() client, mux, _ := setup(t) @@ -65,9 +65,9 @@ func TestEnterpriseService_GetEnterpriseBudget(t *testing.T) { }) ctx := t.Context() - budget, _, err := client.Enterprise.GetEnterpriseBudget(ctx, "e", "1") + budget, _, err := client.Enterprise.GetBudget(ctx, "e", "1") if err != nil { - t.Errorf("Enterprise.GetEnterpriseBudget returned error: %v", err) + t.Errorf("Enterprise.GetBudget returned error: %v", err) } want := &Budget{ @@ -75,11 +75,11 @@ func TestEnterpriseService_GetEnterpriseBudget(t *testing.T) { BudgetName: Ptr("Budget 1"), } if !cmp.Equal(budget, want) { - t.Errorf("Enterprise.GetEnterpriseBudget returned %+v, want %+v", budget, want) + t.Errorf("Enterprise.GetBudget returned %+v, want %+v", budget, want) } - const methodName = "GetEnterpriseBudget" + const methodName = "GetBudget" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - got, resp, err := client.Enterprise.GetEnterpriseBudget(ctx, "e", "1") + got, resp, err := client.Enterprise.GetBudget(ctx, "e", "1") if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } @@ -87,7 +87,7 @@ func TestEnterpriseService_GetEnterpriseBudget(t *testing.T) { }) } -func TestEnterpriseService_CreateEnterpriseBudget(t *testing.T) { +func TestEnterpriseService_CreateBudget(t *testing.T) { t.Parallel() client, mux, _ := setup(t) @@ -107,9 +107,9 @@ func TestEnterpriseService_CreateEnterpriseBudget(t *testing.T) { }) ctx := t.Context() - budget, _, err := client.Enterprise.CreateEnterpriseBudget(ctx, "e", input) + budget, _, err := client.Enterprise.CreateBudget(ctx, "e", input) if err != nil { - t.Errorf("Enterprise.CreateEnterpriseBudget returned error: %v", err) + t.Errorf("Enterprise.CreateBudget returned error: %v", err) } want := &Budget{ @@ -118,11 +118,11 @@ func TestEnterpriseService_CreateEnterpriseBudget(t *testing.T) { LimitAmount: Ptr(500.0), } if !cmp.Equal(budget, want) { - t.Errorf("Enterprise.CreateEnterpriseBudget returned %+v, want %+v", budget, want) + t.Errorf("Enterprise.CreateBudget returned %+v, want %+v", budget, want) } - const methodName = "CreateEnterpriseBudget" + const methodName = "CreateBudget" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - got, resp, err := client.Enterprise.CreateEnterpriseBudget(ctx, "e", input) + got, resp, err := client.Enterprise.CreateBudget(ctx, "e", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } @@ -130,7 +130,7 @@ func TestEnterpriseService_CreateEnterpriseBudget(t *testing.T) { }) } -func TestEnterpriseService_UpdateEnterpriseBudget(t *testing.T) { +func TestEnterpriseService_UpdateBudget(t *testing.T) { t.Parallel() client, mux, _ := setup(t) @@ -148,9 +148,9 @@ func TestEnterpriseService_UpdateEnterpriseBudget(t *testing.T) { }) ctx := t.Context() - budget, _, err := client.Enterprise.UpdateEnterpriseBudget(ctx, "e", "1", input) + budget, _, err := client.Enterprise.UpdateBudget(ctx, "e", "1", input) if err != nil { - t.Errorf("Enterprise.UpdateEnterpriseBudget returned error: %v", err) + t.Errorf("Enterprise.UpdateBudget returned error: %v", err) } want := &Budget{ @@ -158,11 +158,11 @@ func TestEnterpriseService_UpdateEnterpriseBudget(t *testing.T) { BudgetName: Ptr("Updated Budget"), } if !cmp.Equal(budget, want) { - t.Errorf("Enterprise.UpdateEnterpriseBudget returned %+v, want %+v", budget, want) + t.Errorf("Enterprise.UpdateBudget returned %+v, want %+v", budget, want) } - const methodName = "UpdateEnterpriseBudget" + const methodName = "UpdateBudget" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - got, resp, err := client.Enterprise.UpdateEnterpriseBudget(ctx, "e", "1", input) + got, resp, err := client.Enterprise.UpdateBudget(ctx, "e", "1", input) if got != nil { t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) } @@ -170,7 +170,7 @@ func TestEnterpriseService_UpdateEnterpriseBudget(t *testing.T) { }) } -func TestEnterpriseService_DeleteEnterpriseBudget(t *testing.T) { +func TestEnterpriseService_DeleteBudget(t *testing.T) { t.Parallel() client, mux, _ := setup(t) @@ -180,13 +180,13 @@ func TestEnterpriseService_DeleteEnterpriseBudget(t *testing.T) { }) ctx := t.Context() - _, err := client.Enterprise.DeleteEnterpriseBudget(ctx, "e", "1") + _, err := client.Enterprise.DeleteBudget(ctx, "e", "1") if err != nil { - t.Errorf("Enterprise.DeleteEnterpriseBudget returned error: %v", err) + t.Errorf("Enterprise.DeleteBudget returned error: %v", err) } - const methodName = "DeleteEnterpriseBudget" + const methodName = "DeleteBudget" testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - return client.Enterprise.DeleteEnterpriseBudget(ctx, "e", "1") + return client.Enterprise.DeleteBudget(ctx, "e", "1") }) } From 1966b29b9b9abf8d513108b3d55be33148499244 Mon Sep 17 00:00:00 2001 From: Greg Date: Fri, 23 Jan 2026 10:21:44 +0300 Subject: [PATCH 6/7] update billing return types --- github/billing_budgets.go | 24 +++++++--- github/billing_budgets_test.go | 54 +++++++++++++---------- github/enterprise_billing_budgets.go | 10 ++--- github/enterprise_billing_budgets_test.go | 38 +++++++++------- 4 files changed, 78 insertions(+), 48 deletions(-) diff --git a/github/billing_budgets.go b/github/billing_budgets.go index 92b68b54253..bca17d34489 100644 --- a/github/billing_budgets.go +++ b/github/billing_budgets.go @@ -35,20 +35,33 @@ type BudgetAlerting struct { AlertRecipients []string `json:"alert_recipients,omitempty"` } +// BudgetList represents a list of budgets. +type BudgetList struct { + Budgets []*Budget `json:"budgets"` + HasNextPage *bool `json:"has_next_page,omitempty"` +} + +// BudgetResponse represents the response when updating a budget. +type BudgetResponse struct { + Budget *Budget `json:"budget"` + Message *string `json:"message,omitempty"` +} + // ListOrganizationBudgets lists all budgets for an organization. // // GitHub API docs: https://docs.github.com/rest/billing/budgets#get-all-budgets-for-an-organization // //meta:operation GET /organizations/{org}/settings/billing/budgets -func (s *BillingService) ListOrganizationBudgets(ctx context.Context, org string) ([]*Budget, *Response, error) { +//meta:operation GET /organizations/{org}/settings/billing/budgets +func (s *BillingService) ListOrganizationBudgets(ctx context.Context, org string) (*BudgetList, *Response, error) { u := fmt.Sprintf("organizations/%v/settings/billing/budgets", org) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } - var budgets []*Budget - resp, err := s.client.Do(ctx, req, &budgets) + budgets := new(BudgetList) + resp, err := s.client.Do(ctx, req, budgets) if err != nil { return nil, resp, err } @@ -82,14 +95,15 @@ func (s *BillingService) GetOrganizationBudget(ctx context.Context, org, budgetI // GitHub API docs: https://docs.github.com/rest/billing/budgets#update-a-budget-for-an-organization // //meta:operation PATCH /organizations/{org}/settings/billing/budgets/{budget_id} -func (s *BillingService) UpdateOrganizationBudget(ctx context.Context, org, budgetID string, budget *Budget) (*Budget, *Response, error) { +//meta:operation PATCH /organizations/{org}/settings/billing/budgets/{budget_id} +func (s *BillingService) UpdateOrganizationBudget(ctx context.Context, org, budgetID string, budget *Budget) (*BudgetResponse, *Response, error) { u := fmt.Sprintf("organizations/%v/settings/billing/budgets/%v", org, budgetID) req, err := s.client.NewRequest("PATCH", u, budget) if err != nil { return nil, nil, err } - updatedBudget := new(Budget) + updatedBudget := new(BudgetResponse) resp, err := s.client.Do(ctx, req, updatedBudget) if err != nil { return nil, resp, err diff --git a/github/billing_budgets_test.go b/github/billing_budgets_test.go index d00a77b4271..e29c4970e81 100644 --- a/github/billing_budgets_test.go +++ b/github/billing_budgets_test.go @@ -19,17 +19,19 @@ func TestBillingService_ListOrganizationBudgets(t *testing.T) { mux.HandleFunc("/organizations/o/settings/billing/budgets", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") - fmt.Fprint(w, `[ - { - "id": "1", - "budget_name": "Budget 1", - "limit_amount": 100.5, - "budget_alerting": { - "will_alert": true, - "alert_recipients": ["user1"] + fmt.Fprint(w, `{ + "budgets": [ + { + "id": "1", + "budget_name": "Budget 1", + "limit_amount": 100.5, + "budget_alerting": { + "will_alert": true, + "alert_recipients": ["user1"] + } } - } - ]`) + ] + }`) }) ctx := t.Context() @@ -38,14 +40,16 @@ func TestBillingService_ListOrganizationBudgets(t *testing.T) { t.Errorf("Billing.ListOrganizationBudgets returned error: %v", err) } - want := []*Budget{ - { - ID: Ptr("1"), - BudgetName: Ptr("Budget 1"), - LimitAmount: Ptr(100.5), - BudgetAlerting: &BudgetAlerting{ - WillAlert: Ptr(true), - AlertRecipients: []string{"user1"}, + want := &BudgetList{ + Budgets: []*Budget{ + { + ID: Ptr("1"), + BudgetName: Ptr("Budget 1"), + LimitAmount: Ptr(100.5), + BudgetAlerting: &BudgetAlerting{ + WillAlert: Ptr(true), + AlertRecipients: []string{"user1"}, + }, }, }, } @@ -109,8 +113,10 @@ func TestBillingService_UpdateOrganizationBudget(t *testing.T) { testMethod(t, r, "PATCH") testBody(t, r, `{"budget_name":"Updated Budget"}`+"\n") fmt.Fprint(w, `{ - "id": "1", - "budget_name": "Updated Budget" + "budget": { + "id": "1", + "budget_name": "Updated Budget" + } }`) }) @@ -120,9 +126,11 @@ func TestBillingService_UpdateOrganizationBudget(t *testing.T) { t.Errorf("Billing.UpdateOrganizationBudget returned error: %v", err) } - want := &Budget{ - ID: Ptr("1"), - BudgetName: Ptr("Updated Budget"), + want := &BudgetResponse{ + Budget: &Budget{ + ID: Ptr("1"), + BudgetName: Ptr("Updated Budget"), + }, } if !cmp.Equal(budget, want) { t.Errorf("Billing.UpdateOrganizationBudget returned %+v, want %+v", budget, want) diff --git a/github/enterprise_billing_budgets.go b/github/enterprise_billing_budgets.go index 074c08f6420..b17a72bd80b 100644 --- a/github/enterprise_billing_budgets.go +++ b/github/enterprise_billing_budgets.go @@ -15,15 +15,15 @@ import ( // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#get-all-budgets // //meta:operation GET /enterprises/{enterprise}/settings/billing/budgets -func (s *EnterpriseService) ListBudgets(ctx context.Context, enterprise string) ([]*Budget, *Response, error) { +func (s *EnterpriseService) ListBudgets(ctx context.Context, enterprise string) (*BudgetList, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets", enterprise) req, err := s.client.NewRequest("GET", u, nil) if err != nil { return nil, nil, err } - var budgets []*Budget - resp, err := s.client.Do(ctx, req, &budgets) + budgets := new(BudgetList) + resp, err := s.client.Do(ctx, req, budgets) if err != nil { return nil, resp, err } @@ -78,14 +78,14 @@ func (s *EnterpriseService) CreateBudget(ctx context.Context, enterprise string, // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#update-a-budget // //meta:operation PATCH /enterprises/{enterprise}/settings/billing/budgets/{budget_id} -func (s *EnterpriseService) UpdateBudget(ctx context.Context, enterprise, budgetID string, budget *Budget) (*Budget, *Response, error) { +func (s *EnterpriseService) UpdateBudget(ctx context.Context, enterprise, budgetID string, budget *Budget) (*BudgetResponse, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) req, err := s.client.NewRequest("PATCH", u, budget) if err != nil { return nil, nil, err } - updatedBudget := new(Budget) + updatedBudget := new(BudgetResponse) resp, err := s.client.Do(ctx, req, updatedBudget) if err != nil { return nil, resp, err diff --git a/github/enterprise_billing_budgets_test.go b/github/enterprise_billing_budgets_test.go index f665503e473..2f77b68417d 100644 --- a/github/enterprise_billing_budgets_test.go +++ b/github/enterprise_billing_budgets_test.go @@ -19,12 +19,14 @@ func TestEnterpriseService_ListBudgets(t *testing.T) { mux.HandleFunc("/enterprises/e/settings/billing/budgets", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "GET") - fmt.Fprint(w, `[ - { - "id": "1", - "budget_name": "Budget 1" - } - ]`) + fmt.Fprint(w, `{ + "budgets": [ + { + "id": "1", + "budget_name": "Budget 1" + } + ] + }`) }) ctx := t.Context() @@ -33,10 +35,12 @@ func TestEnterpriseService_ListBudgets(t *testing.T) { t.Errorf("Enterprise.ListBudgets returned error: %v", err) } - want := []*Budget{ - { - ID: Ptr("1"), - BudgetName: Ptr("Budget 1"), + want := &BudgetList{ + Budgets: []*Budget{ + { + ID: Ptr("1"), + BudgetName: Ptr("Budget 1"), + }, }, } if !cmp.Equal(budgets, want) { @@ -142,8 +146,10 @@ func TestEnterpriseService_UpdateBudget(t *testing.T) { testMethod(t, r, "PATCH") testBody(t, r, `{"budget_name":"Updated Budget"}`+"\n") fmt.Fprint(w, `{ - "id": "1", - "budget_name": "Updated Budget" + "budget": { + "id": "1", + "budget_name": "Updated Budget" + } }`) }) @@ -153,9 +159,11 @@ func TestEnterpriseService_UpdateBudget(t *testing.T) { t.Errorf("Enterprise.UpdateBudget returned error: %v", err) } - want := &Budget{ - ID: Ptr("1"), - BudgetName: Ptr("Updated Budget"), + want := &BudgetResponse{ + Budget: &Budget{ + ID: Ptr("1"), + BudgetName: Ptr("Updated Budget"), + }, } if !cmp.Equal(budget, want) { t.Errorf("Enterprise.UpdateBudget returned %+v, want %+v", budget, want) From 9dc830b1573319e8272158d601e319a59e09d7c9 Mon Sep 17 00:00:00 2001 From: Greg Date: Fri, 23 Jan 2026 23:21:04 +0300 Subject: [PATCH 7/7] fix: resolved the lint errors. --- github/billing_budgets.go | 2 -- github/enterprise_billing_budgets.go | 10 +++++----- github/github-accessors.go | 24 ++++++++++++++++++++++ github/github-accessors_test.go | 30 ++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 7 deletions(-) diff --git a/github/billing_budgets.go b/github/billing_budgets.go index bca17d34489..715673e63df 100644 --- a/github/billing_budgets.go +++ b/github/billing_budgets.go @@ -52,7 +52,6 @@ type BudgetResponse struct { // GitHub API docs: https://docs.github.com/rest/billing/budgets#get-all-budgets-for-an-organization // //meta:operation GET /organizations/{org}/settings/billing/budgets -//meta:operation GET /organizations/{org}/settings/billing/budgets func (s *BillingService) ListOrganizationBudgets(ctx context.Context, org string) (*BudgetList, *Response, error) { u := fmt.Sprintf("organizations/%v/settings/billing/budgets", org) req, err := s.client.NewRequest("GET", u, nil) @@ -95,7 +94,6 @@ func (s *BillingService) GetOrganizationBudget(ctx context.Context, org, budgetI // GitHub API docs: https://docs.github.com/rest/billing/budgets#update-a-budget-for-an-organization // //meta:operation PATCH /organizations/{org}/settings/billing/budgets/{budget_id} -//meta:operation PATCH /organizations/{org}/settings/billing/budgets/{budget_id} func (s *BillingService) UpdateOrganizationBudget(ctx context.Context, org, budgetID string, budget *Budget) (*BudgetResponse, *Response, error) { u := fmt.Sprintf("organizations/%v/settings/billing/budgets/%v", org, budgetID) req, err := s.client.NewRequest("PATCH", u, budget) diff --git a/github/enterprise_billing_budgets.go b/github/enterprise_billing_budgets.go index b17a72bd80b..3ed3bb9a1c8 100644 --- a/github/enterprise_billing_budgets.go +++ b/github/enterprise_billing_budgets.go @@ -10,7 +10,7 @@ import ( "fmt" ) -// ListEnterpriseBudgets lists all budgets for an enterprise. +// ListBudgets lists all budgets for an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#get-all-budgets // @@ -31,7 +31,7 @@ func (s *EnterpriseService) ListBudgets(ctx context.Context, enterprise string) return budgets, resp, nil } -// GetEnterpriseBudget gets a specific budget for an enterprise. +// GetBudget gets a specific budget for an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#get-a-budget-by-id // @@ -52,7 +52,7 @@ func (s *EnterpriseService) GetBudget(ctx context.Context, enterprise, budgetID return budget, resp, nil } -// CreateEnterpriseBudget creates a specific budget for an enterprise. +// CreateBudget creates a specific budget for an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#create-a-budget // @@ -73,7 +73,7 @@ func (s *EnterpriseService) CreateBudget(ctx context.Context, enterprise string, return createdBudget, resp, nil } -// UpdateEnterpriseBudget updates a specific budget for an enterprise. +// UpdateBudget updates a specific budget for an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#update-a-budget // @@ -94,7 +94,7 @@ func (s *EnterpriseService) UpdateBudget(ctx context.Context, enterprise, budget return updatedBudget, resp, nil } -// DeleteEnterpriseBudget deletes a specific budget for an enterprise. +// DeleteBudget deletes a specific budget for an enterprise. // // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets#delete-a-budget // diff --git a/github/github-accessors.go b/github/github-accessors.go index c34e1e03d96..328ddd9b60d 100644 --- a/github/github-accessors.go +++ b/github/github-accessors.go @@ -2326,6 +2326,30 @@ func (b *BudgetAlerting) GetWillAlert() bool { return *b.WillAlert } +// GetHasNextPage returns the HasNextPage field if it's non-nil, zero value otherwise. +func (b *BudgetList) GetHasNextPage() bool { + if b == nil || b.HasNextPage == nil { + return false + } + return *b.HasNextPage +} + +// GetBudget returns the Budget field. +func (b *BudgetResponse) GetBudget() *Budget { + if b == nil { + return nil + } + return b.Budget +} + +// GetMessage returns the Message field if it's non-nil, zero value otherwise. +func (b *BudgetResponse) GetMessage() string { + if b == nil || b.Message == nil { + return "" + } + return *b.Message +} + // GetActorID returns the ActorID field if it's non-nil, zero value otherwise. func (b *BypassActor) GetActorID() int64 { if b == nil || b.ActorID == nil { diff --git a/github/github-accessors_test.go b/github/github-accessors_test.go index dc08f3a982e..40deee76ed9 100644 --- a/github/github-accessors_test.go +++ b/github/github-accessors_test.go @@ -3047,6 +3047,36 @@ func TestBudgetAlerting_GetWillAlert(tt *testing.T) { b.GetWillAlert() } +func TestBudgetList_GetHasNextPage(tt *testing.T) { + tt.Parallel() + var zeroValue bool + b := &BudgetList{HasNextPage: &zeroValue} + b.GetHasNextPage() + b = &BudgetList{} + b.GetHasNextPage() + b = nil + b.GetHasNextPage() +} + +func TestBudgetResponse_GetBudget(tt *testing.T) { + tt.Parallel() + b := &BudgetResponse{} + b.GetBudget() + b = nil + b.GetBudget() +} + +func TestBudgetResponse_GetMessage(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &BudgetResponse{Message: &zeroValue} + b.GetMessage() + b = &BudgetResponse{} + b.GetMessage() + b = nil + b.GetMessage() +} + func TestBypassActor_GetActorID(tt *testing.T) { tt.Parallel() var zeroValue int64