From 8afd1751626afe0cc5b2fb417b1f2672cde0612e Mon Sep 17 00:00:00 2001 From: maishivamhoo123 Date: Fri, 6 Mar 2026 20:09:19 +0530 Subject: [PATCH 1/3] feat: add enterprise budget API Signed-off-by: maishivamhoo123 --- github/enterprise_budgets.go | 156 ++++++++++++ github/enterprise_budgets_test.go | 392 ++++++++++++++++++++++++++++++ github/github-accessors.go | 96 ++++++++ github/github-accessors_test.go | 126 ++++++++++ github/github-stringify_test.go | 19 ++ 5 files changed, 789 insertions(+) create mode 100644 github/enterprise_budgets.go create mode 100644 github/enterprise_budgets_test.go diff --git a/github/enterprise_budgets.go b/github/enterprise_budgets.go new file mode 100644 index 00000000000..62cf0850513 --- /dev/null +++ b/github/enterprise_budgets.go @@ -0,0 +1,156 @@ +// 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. + +package github + +import ( + "context" + "fmt" +) + +// BudgetAlerting represents alerting settings for a GitHub enterprise budget. +type BudgetAlerting struct { + WillAlert *bool `json:"will_alert,omitempty"` + AlertRecipients []string `json:"alert_recipients,omitempty"` +} + +// Budget represents a GitHub enterprise budget. +type Budget struct { + ID *string `json:"id,omitempty"` + BudgetType *string `json:"budget_type,omitempty"` + BudgetProductSkus []string `json:"budget_product_skus,omitempty"` + BudgetProductSKU *string `json:"budget_product_sku,omitempty"` + BudgetScope *string `json:"budget_scope,omitempty"` + BudgetEntityName *string `json:"budget_entity_name,omitempty"` + BudgetAmount *int `json:"budget_amount,omitempty"` + PreventFurtherUsage *bool `json:"prevent_further_usage,omitempty"` + BudgetAlerting *BudgetAlerting `json:"budget_alerting,omitempty"` +} + +func (b Budget) String() string { + return Stringify(b) +} + +// EnterpriseBudgets represents a collection of GitHub enterprise budgets. +type EnterpriseBudgets struct { + Budgets []*Budget `json:"budgets,omitempty"` +} + +// BudgetActionResponse represents the response when creating, updating, or deleting a budget. +type BudgetActionResponse struct { + Message *string `json:"message,omitempty"` + BudgetID *string `json:"budget_id,omitempty"` + Budget *Budget `json:"budget,omitempty"` +} + +// ListBudgets gets 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 +func (s *EnterpriseService) ListBudgets(ctx context.Context, enterprise string) (*EnterpriseBudgets, *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 + } + + budgets := new(EnterpriseBudgets) + resp, err := s.client.Do(ctx, req, budgets) + if err != nil { + return nil, resp, err + } + + return budgets, resp, nil +} + +// CreateBudget creates a new budget for an 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) CreateBudget(ctx context.Context, enterprise string, budget *Budget) (*BudgetActionResponse, *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 + } + + actionResponse := new(BudgetActionResponse) + resp, err := s.client.Do(ctx, req, actionResponse) + if err != nil { + return nil, resp, err + } + + return actionResponse, resp, nil +} + +// GetBudget gets a budget by ID 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} +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 { + 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 +} + +// UpdateBudget updates an existing 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} +func (s *EnterpriseService) UpdateBudget(ctx context.Context, enterprise, budgetID string, budget *Budget) (*BudgetActionResponse, *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 + } + + actionResponse := new(BudgetActionResponse) + resp, err := s.client.Do(ctx, req, actionResponse) + if err != nil { + return nil, resp, err + } + + return actionResponse, resp, nil +} + +// DeleteBudget deletes a budget by ID 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} +func (s *EnterpriseService) DeleteBudget(ctx context.Context, enterprise, budgetID string) (*BudgetActionResponse, *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, nil, err + } + + actionResponse := new(BudgetActionResponse) + resp, err := s.client.Do(ctx, req, actionResponse) + if err != nil { + return nil, resp, err + } + + return actionResponse, resp, nil +} diff --git a/github/enterprise_budgets_test.go b/github/enterprise_budgets_test.go new file mode 100644 index 00000000000..a67d3ce4d29 --- /dev/null +++ b/github/enterprise_budgets_test.go @@ -0,0 +1,392 @@ +// 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. + +package github + +import ( + "fmt" + "net/http" + "testing" + + "github.com/google/go-cmp/cmp" +) + +func TestEnterpriseService_ListBudgets(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, `{ + "budgets": [ + { + "id": "2066deda-923f-43f9-88d2-62395a28c0cdd", + "budget_type": "ProductPricing", + "budget_product_skus": ["actions"], + "budget_scope": "enterprise", + "budget_amount": 1000, + "prevent_further_usage": true, + "budget_alerting": { + "will_alert": true, + "alert_recipients": ["enterprise-admin"] + } + } + ] + }`) + }) + + ctx := t.Context() + budgets, _, err := client.Enterprise.ListBudgets(ctx, "e") + if err != nil { + t.Errorf("Enterprise.ListBudgets returned error: %v", err) + } + + want := &EnterpriseBudgets{ + Budgets: []*Budget{ + { + ID: Ptr("2066deda-923f-43f9-88d2-62395a28c0cdd"), + BudgetType: Ptr("ProductPricing"), + BudgetProductSkus: []string{"actions"}, + BudgetScope: Ptr("enterprise"), + BudgetAmount: Ptr(1000), + PreventFurtherUsage: Ptr(true), + BudgetAlerting: &BudgetAlerting{ + WillAlert: Ptr(true), + AlertRecipients: []string{"enterprise-admin"}, + }, + }, + }, + } + if !cmp.Equal(budgets, want) { + t.Errorf("Enterprise.ListBudgets returned %+v, want %+v", budgets, want) + } + + const methodName = "ListBudgets" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Enterprise.ListBudgets(ctx, "e") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestEnterpriseService_ListBudgets_invalidEnterprise(t *testing.T) { + t.Parallel() + client, _, _ := setup(t) + + ctx := t.Context() + _, _, err := client.Enterprise.ListBudgets(ctx, "%") + testURLParseError(t, err) +} + +func TestEnterpriseService_CreateBudget(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, "POST") + testBody(t, r, `{"budget_type":"ProductPricing","budget_product_sku":"actions","budget_scope":"enterprise","budget_amount":200,"prevent_further_usage":true}`+"\n") + fmt.Fprint(w, `{ + "message": "Budget successfully created." + }`) + }) + + ctx := t.Context() + req := &Budget{ + BudgetAmount: Ptr(200), + PreventFurtherUsage: Ptr(true), + BudgetScope: Ptr("enterprise"), + BudgetType: Ptr("ProductPricing"), + BudgetProductSKU: Ptr("actions"), + } + + resp, _, err := client.Enterprise.CreateBudget(ctx, "e", req) + if err != nil { + t.Errorf("Enterprise.CreateBudget returned error: %v", err) + } + + want := &BudgetActionResponse{ + Message: Ptr("Budget successfully created."), + } + if !cmp.Equal(resp, want) { + t.Errorf("Enterprise.CreateBudget returned %+v, want %+v", resp, want) + } + + const methodName = "CreateBudget" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Enterprise.CreateBudget(ctx, "e", req) + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestEnterpriseService_CreateBudget_invalidEnterprise(t *testing.T) { + t.Parallel() + client, _, _ := setup(t) + + ctx := t.Context() + _, _, err := client.Enterprise.CreateBudget(ctx, "%", &Budget{}) + testURLParseError(t, err) +} + +func TestEnterpriseService_GetBudget(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + mux.HandleFunc("/enterprises/e/settings/billing/budgets/2066deda-923f-43f9-88d2-62395a28c0cdd", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + fmt.Fprint(w, `{ + "id": "2066deda-923f-43f9-88d2-62395a28c0cdd", + "budget_type": "ProductPricing", + "budget_product_sku": "actions_linux", + "budget_scope": "repository", + "budget_amount": 0, + "prevent_further_usage": true + }`) + }) + + ctx := t.Context() + budget, _, err := client.Enterprise.GetBudget(ctx, "e", "2066deda-923f-43f9-88d2-62395a28c0cdd") + if err != nil { + t.Errorf("Enterprise.GetBudget returned error: %v", err) + } + + want := &Budget{ + ID: Ptr("2066deda-923f-43f9-88d2-62395a28c0cdd"), + BudgetType: Ptr("ProductPricing"), + BudgetProductSKU: Ptr("actions_linux"), + BudgetScope: Ptr("repository"), + BudgetAmount: Ptr(0), + PreventFurtherUsage: Ptr(true), + } + if !cmp.Equal(budget, want) { + t.Errorf("Enterprise.GetBudget returned %+v, want %+v", budget, want) + } + + const methodName = "GetBudget" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Enterprise.GetBudget(ctx, "e", "2066deda-923f-43f9-88d2-62395a28c0cdd") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestEnterpriseService_GetBudget_invalidEnterprise(t *testing.T) { + t.Parallel() + client, _, _ := setup(t) + + ctx := t.Context() + _, _, err := client.Enterprise.GetBudget(ctx, "%", "b-123") + testURLParseError(t, err) +} + +func TestEnterpriseService_UpdateBudget(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + mux.HandleFunc("/enterprises/e/settings/billing/budgets/b-123", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "PATCH") + testBody(t, r, `{"budget_amount":10,"prevent_further_usage":false}`+"\n") + fmt.Fprint(w, `{ + "message": "Budget successfully updated.", + "budget": { + "id": "b-123", + "budget_amount": 10, + "prevent_further_usage": false + } + }`) + }) + + ctx := t.Context() + req := &Budget{ + BudgetAmount: Ptr(10), + PreventFurtherUsage: Ptr(false), + } + + resp, _, err := client.Enterprise.UpdateBudget(ctx, "e", "b-123", req) + if err != nil { + t.Errorf("Enterprise.UpdateBudget returned error: %v", err) + } + + want := &BudgetActionResponse{ + Message: Ptr("Budget successfully updated."), + Budget: &Budget{ + ID: Ptr("b-123"), + BudgetAmount: Ptr(10), + PreventFurtherUsage: Ptr(false), + }, + } + if !cmp.Equal(resp, want) { + t.Errorf("Enterprise.UpdateBudget returned %+v, want %+v", resp, want) + } + + const methodName = "UpdateBudget" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Enterprise.UpdateBudget(ctx, "e", "b-123", req) + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestEnterpriseService_UpdateBudget_invalidEnterprise(t *testing.T) { + t.Parallel() + client, _, _ := setup(t) + + ctx := t.Context() + _, _, err := client.Enterprise.UpdateBudget(ctx, "%", "b-123", &Budget{}) + testURLParseError(t, err) +} + +func TestEnterpriseService_DeleteBudget(t *testing.T) { + t.Parallel() + client, mux, _ := setup(t) + + mux.HandleFunc("/enterprises/e/settings/billing/budgets/b-123", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "DELETE") + fmt.Fprint(w, `{ + "message": "Budget successfully deleted.", + "budget_id": "b-123" + }`) + }) + + ctx := t.Context() + resp, _, err := client.Enterprise.DeleteBudget(ctx, "e", "b-123") + if err != nil { + t.Errorf("Enterprise.DeleteBudget returned error: %v", err) + } + + want := &BudgetActionResponse{ + Message: Ptr("Budget successfully deleted."), + BudgetID: Ptr("b-123"), + } + if !cmp.Equal(resp, want) { + t.Errorf("Enterprise.DeleteBudget returned %+v, want %+v", resp, want) + } + + const methodName = "DeleteBudget" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Enterprise.DeleteBudget(ctx, "e", "b-123") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) +} + +func TestEnterpriseService_DeleteBudget_invalidEnterprise(t *testing.T) { + t.Parallel() + client, _, _ := setup(t) + + ctx := t.Context() + _, _, err := client.Enterprise.DeleteBudget(ctx, "%", "b-123") + testURLParseError(t, err) +} + +func TestBudget_Marshal(t *testing.T) { + t.Parallel() + testJSONMarshal(t, &Budget{}, "{}") + + u := &Budget{ + ID: Ptr("b-123"), + BudgetType: Ptr("ProductPricing"), + BudgetProductSkus: []string{"actions"}, + BudgetProductSKU: Ptr("actions"), + BudgetScope: Ptr("enterprise"), + BudgetEntityName: Ptr("org-name"), + BudgetAmount: Ptr(100), + PreventFurtherUsage: Ptr(true), + BudgetAlerting: &BudgetAlerting{ + WillAlert: Ptr(true), + AlertRecipients: []string{"mona"}, + }, + } + + want := `{ + "id": "b-123", + "budget_type": "ProductPricing", + "budget_product_skus": ["actions"], + "budget_product_sku": "actions", + "budget_scope": "enterprise", + "budget_entity_name": "org-name", + "budget_amount": 100, + "prevent_further_usage": true, + "budget_alerting": { + "will_alert": true, + "alert_recipients": ["mona"] + } + }` + + testJSONMarshal(t, u, want) +} + +func TestBudgetAlerting_Marshal(t *testing.T) { + t.Parallel() + testJSONMarshal(t, &BudgetAlerting{}, "{}") + + u := &BudgetAlerting{ + WillAlert: Ptr(true), + AlertRecipients: []string{"admin1", "admin2"}, + } + + want := `{ + "will_alert": true, + "alert_recipients": ["admin1", "admin2"] + }` + + testJSONMarshal(t, u, want) +} + +func TestEnterpriseBudgets_Marshal(t *testing.T) { + t.Parallel() + testJSONMarshal(t, &EnterpriseBudgets{}, "{}") + + u := &EnterpriseBudgets{ + Budgets: []*Budget{ + { + ID: Ptr("1"), + }, + }, + } + + want := `{ + "budgets": [ + { + "id": "1" + } + ] + }` + + testJSONMarshal(t, u, want) +} + +func TestBudgetActionResponse_Marshal(t *testing.T) { + t.Parallel() + testJSONMarshal(t, &BudgetActionResponse{}, "{}") + + u := &BudgetActionResponse{ + Message: Ptr("Success"), + BudgetID: Ptr("123"), + Budget: &Budget{ + ID: Ptr("123"), + }, + } + + want := `{ + "message": "Success", + "budget_id": "123", + "budget": { + "id": "123" + } + }` + + testJSONMarshal(t, u, want) +} diff --git a/github/github-accessors.go b/github/github-accessors.go index aa52b9ae260..eec288d0952 100644 --- a/github/github-accessors.go +++ b/github/github-accessors.go @@ -2390,6 +2390,102 @@ 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 +} + +// GetBudgetAmount returns the BudgetAmount field if it's non-nil, zero value otherwise. +func (b *Budget) GetBudgetAmount() int { + if b == nil || b.BudgetAmount == nil { + return 0 + } + return *b.BudgetAmount +} + +// GetBudgetEntityName returns the BudgetEntityName field if it's non-nil, zero value otherwise. +func (b *Budget) GetBudgetEntityName() string { + if b == nil || b.BudgetEntityName == nil { + return "" + } + return *b.BudgetEntityName +} + +// GetBudgetProductSKU returns the BudgetProductSKU field if it's non-nil, zero value otherwise. +func (b *Budget) GetBudgetProductSKU() string { + if b == nil || b.BudgetProductSKU == nil { + return "" + } + return *b.BudgetProductSKU +} + +// GetBudgetScope returns the BudgetScope field if it's non-nil, zero value otherwise. +func (b *Budget) GetBudgetScope() string { + if b == nil || b.BudgetScope == nil { + return "" + } + return *b.BudgetScope +} + +// 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 +} + +// 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 +} + +// GetPreventFurtherUsage returns the PreventFurtherUsage field if it's non-nil, zero value otherwise. +func (b *Budget) GetPreventFurtherUsage() bool { + if b == nil || b.PreventFurtherUsage == nil { + return false + } + return *b.PreventFurtherUsage +} + +// GetBudget returns the Budget field. +func (b *BudgetActionResponse) GetBudget() *Budget { + if b == nil { + return nil + } + return b.Budget +} + +// GetBudgetID returns the BudgetID field if it's non-nil, zero value otherwise. +func (b *BudgetActionResponse) GetBudgetID() string { + if b == nil || b.BudgetID == nil { + return "" + } + return *b.BudgetID +} + +// GetMessage returns the Message field if it's non-nil, zero value otherwise. +func (b *BudgetActionResponse) GetMessage() string { + if b == nil || b.Message == nil { + return "" + } + return *b.Message +} + +// 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 037406b83d6..fa98706dfe8 100644 --- a/github/github-accessors_test.go +++ b/github/github-accessors_test.go @@ -3141,6 +3141,132 @@ 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_GetBudgetAmount(tt *testing.T) { + tt.Parallel() + var zeroValue int + b := &Budget{BudgetAmount: &zeroValue} + b.GetBudgetAmount() + b = &Budget{} + b.GetBudgetAmount() + b = nil + b.GetBudgetAmount() +} + +func TestBudget_GetBudgetEntityName(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &Budget{BudgetEntityName: &zeroValue} + b.GetBudgetEntityName() + b = &Budget{} + b.GetBudgetEntityName() + b = nil + b.GetBudgetEntityName() +} + +func TestBudget_GetBudgetProductSKU(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &Budget{BudgetProductSKU: &zeroValue} + b.GetBudgetProductSKU() + b = &Budget{} + b.GetBudgetProductSKU() + b = nil + b.GetBudgetProductSKU() +} + +func TestBudget_GetBudgetScope(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &Budget{BudgetScope: &zeroValue} + b.GetBudgetScope() + b = &Budget{} + b.GetBudgetScope() + b = nil + b.GetBudgetScope() +} + +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_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_GetPreventFurtherUsage(tt *testing.T) { + tt.Parallel() + var zeroValue bool + b := &Budget{PreventFurtherUsage: &zeroValue} + b.GetPreventFurtherUsage() + b = &Budget{} + b.GetPreventFurtherUsage() + b = nil + b.GetPreventFurtherUsage() +} + +func TestBudgetActionResponse_GetBudget(tt *testing.T) { + tt.Parallel() + b := &BudgetActionResponse{} + b.GetBudget() + b = nil + b.GetBudget() +} + +func TestBudgetActionResponse_GetBudgetID(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &BudgetActionResponse{BudgetID: &zeroValue} + b.GetBudgetID() + b = &BudgetActionResponse{} + b.GetBudgetID() + b = nil + b.GetBudgetID() +} + +func TestBudgetActionResponse_GetMessage(tt *testing.T) { + tt.Parallel() + var zeroValue string + b := &BudgetActionResponse{Message: &zeroValue} + b.GetMessage() + b = &BudgetActionResponse{} + b.GetMessage() + b = nil + b.GetMessage() +} + +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 diff --git a/github/github-stringify_test.go b/github/github-stringify_test.go index edd28ddb50a..59c0bc2faba 100644 --- a/github/github-stringify_test.go +++ b/github/github-stringify_test.go @@ -216,6 +216,25 @@ func TestAuthorizationUpdateRequest_String(t *testing.T) { } } +func TestBudget_String(t *testing.T) { + t.Parallel() + v := Budget{ + ID: Ptr(""), + BudgetType: Ptr(""), + BudgetProductSkus: []string{""}, + BudgetProductSKU: Ptr(""), + BudgetScope: Ptr(""), + BudgetEntityName: Ptr(""), + BudgetAmount: Ptr(0), + PreventFurtherUsage: Ptr(false), + BudgetAlerting: &BudgetAlerting{}, + } + want := `github.Budget{ID:"", BudgetType:"", BudgetProductSkus:[""], BudgetProductSKU:"", BudgetScope:"", BudgetEntityName:"", BudgetAmount:0, PreventFurtherUsage:false, BudgetAlerting:github.BudgetAlerting{}}` + if got := v.String(); got != want { + t.Errorf("Budget.String = %v, want %v", got, want) + } +} + func TestCheckRun_String(t *testing.T) { t.Parallel() v := CheckRun{ From a7d38066bdd0fff4bbf152bca608299c4bde6662 Mon Sep 17 00:00:00 2001 From: maishivamhoo123 Date: Sat, 7 Mar 2026 15:25:29 +0530 Subject: [PATCH 2/3] In AddBudget I passed the Budget by value Signed-off-by: maishivamhoo123 --- github/enterprise_budgets.go | 68 ++++---- github/enterprise_budgets_test.go | 71 ++++++--- github/github-accessors.go | 192 +++++++++++------------ github/github-accessors_test.go | 252 +++++++++++++++--------------- github/github-stringify_test.go | 38 ++--- 5 files changed, 323 insertions(+), 298 deletions(-) diff --git a/github/enterprise_budgets.go b/github/enterprise_budgets.go index 62cf0850513..43a9a53aebd 100644 --- a/github/enterprise_budgets.go +++ b/github/enterprise_budgets.go @@ -10,39 +10,39 @@ import ( "fmt" ) -// BudgetAlerting represents alerting settings for a GitHub enterprise budget. -type BudgetAlerting struct { +// EnterpriseBudgetAlerting represents alerting settings for a GitHub enterprise budget. +type EnterpriseBudgetAlerting struct { WillAlert *bool `json:"will_alert,omitempty"` AlertRecipients []string `json:"alert_recipients,omitempty"` } -// Budget represents a GitHub enterprise budget. -type Budget struct { - ID *string `json:"id,omitempty"` - BudgetType *string `json:"budget_type,omitempty"` - BudgetProductSkus []string `json:"budget_product_skus,omitempty"` - BudgetProductSKU *string `json:"budget_product_sku,omitempty"` - BudgetScope *string `json:"budget_scope,omitempty"` - BudgetEntityName *string `json:"budget_entity_name,omitempty"` - BudgetAmount *int `json:"budget_amount,omitempty"` - PreventFurtherUsage *bool `json:"prevent_further_usage,omitempty"` - BudgetAlerting *BudgetAlerting `json:"budget_alerting,omitempty"` +// EnterpriseBudget represents a GitHub enterprise budget. +type EnterpriseBudget struct { + ID *string `json:"id,omitempty"` + BudgetType *string `json:"budget_type,omitempty"` + BudgetProductSkus []string `json:"budget_product_skus,omitempty"` + BudgetProductSKU *string `json:"budget_product_sku,omitempty"` + BudgetScope *string `json:"budget_scope,omitempty"` + BudgetEntityName *string `json:"budget_entity_name,omitempty"` + BudgetAmount *int `json:"budget_amount,omitempty"` + PreventFurtherUsage *bool `json:"prevent_further_usage,omitempty"` + BudgetAlerting *EnterpriseBudgetAlerting `json:"budget_alerting,omitempty"` } -func (b Budget) String() string { +func (b EnterpriseBudget) String() string { return Stringify(b) } // EnterpriseBudgets represents a collection of GitHub enterprise budgets. type EnterpriseBudgets struct { - Budgets []*Budget `json:"budgets,omitempty"` + Budgets []*EnterpriseBudget `json:"budgets,omitempty"` } -// BudgetActionResponse represents the response when creating, updating, or deleting a budget. -type BudgetActionResponse struct { - Message *string `json:"message,omitempty"` - BudgetID *string `json:"budget_id,omitempty"` - Budget *Budget `json:"budget,omitempty"` +// EnterpriseBudgetActionResponse represents the response when creating, updating, or deleting a budget. +type EnterpriseBudgetActionResponse struct { + Message *string `json:"message,omitempty"` + BudgetID *string `json:"budget_id,omitempty"` + Budget *EnterpriseBudget `json:"budget,omitempty"` } // ListBudgets gets all budgets for an enterprise. @@ -58,8 +58,8 @@ func (s *EnterpriseService) ListBudgets(ctx context.Context, enterprise string) return nil, nil, err } - budgets := new(EnterpriseBudgets) - resp, err := s.client.Do(ctx, req, budgets) + var budgets *EnterpriseBudgets + resp, err := s.client.Do(ctx, req, &budgets) if err != nil { return nil, resp, err } @@ -72,7 +72,7 @@ func (s *EnterpriseService) ListBudgets(ctx context.Context, enterprise string) // 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) CreateBudget(ctx context.Context, enterprise string, budget *Budget) (*BudgetActionResponse, *Response, error) { +func (s *EnterpriseService) CreateBudget(ctx context.Context, enterprise string, budget EnterpriseBudget) (*EnterpriseBudgetActionResponse, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets", enterprise) req, err := s.client.NewRequest("POST", u, budget) @@ -80,8 +80,8 @@ func (s *EnterpriseService) CreateBudget(ctx context.Context, enterprise string, return nil, nil, err } - actionResponse := new(BudgetActionResponse) - resp, err := s.client.Do(ctx, req, actionResponse) + var actionResponse *EnterpriseBudgetActionResponse + resp, err := s.client.Do(ctx, req, &actionResponse) if err != nil { return nil, resp, err } @@ -94,7 +94,7 @@ func (s *EnterpriseService) CreateBudget(ctx context.Context, enterprise string, // 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) GetBudget(ctx context.Context, enterprise, budgetID string) (*Budget, *Response, error) { +func (s *EnterpriseService) GetBudget(ctx context.Context, enterprise, budgetID string) (*EnterpriseBudget, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) req, err := s.client.NewRequest("GET", u, nil) @@ -102,8 +102,8 @@ func (s *EnterpriseService) GetBudget(ctx context.Context, enterprise, budgetID return nil, nil, err } - budget := new(Budget) - resp, err := s.client.Do(ctx, req, budget) + var budget *EnterpriseBudget + resp, err := s.client.Do(ctx, req, &budget) if err != nil { return nil, resp, err } @@ -116,7 +116,7 @@ func (s *EnterpriseService) GetBudget(ctx context.Context, enterprise, budgetID // 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) (*BudgetActionResponse, *Response, error) { +func (s *EnterpriseService) UpdateBudget(ctx context.Context, enterprise, budgetID string, budget *EnterpriseBudget) (*EnterpriseBudgetActionResponse, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) req, err := s.client.NewRequest("PATCH", u, budget) @@ -124,8 +124,8 @@ func (s *EnterpriseService) UpdateBudget(ctx context.Context, enterprise, budget return nil, nil, err } - actionResponse := new(BudgetActionResponse) - resp, err := s.client.Do(ctx, req, actionResponse) + var actionResponse *EnterpriseBudgetActionResponse + resp, err := s.client.Do(ctx, req, &actionResponse) if err != nil { return nil, resp, err } @@ -138,7 +138,7 @@ func (s *EnterpriseService) UpdateBudget(ctx context.Context, enterprise, budget // 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) DeleteBudget(ctx context.Context, enterprise, budgetID string) (*BudgetActionResponse, *Response, error) { +func (s *EnterpriseService) DeleteBudget(ctx context.Context, enterprise, budgetID string) (*EnterpriseBudgetActionResponse, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) req, err := s.client.NewRequest("DELETE", u, nil) @@ -146,8 +146,8 @@ func (s *EnterpriseService) DeleteBudget(ctx context.Context, enterprise, budget return nil, nil, err } - actionResponse := new(BudgetActionResponse) - resp, err := s.client.Do(ctx, req, actionResponse) + var actionResponse *EnterpriseBudgetActionResponse + resp, err := s.client.Do(ctx, req, &actionResponse) if err != nil { return nil, resp, err } diff --git a/github/enterprise_budgets_test.go b/github/enterprise_budgets_test.go index a67d3ce4d29..7376b9cdaf2 100644 --- a/github/enterprise_budgets_test.go +++ b/github/enterprise_budgets_test.go @@ -44,7 +44,7 @@ func TestEnterpriseService_ListBudgets(t *testing.T) { } want := &EnterpriseBudgets{ - Budgets: []*Budget{ + Budgets: []*EnterpriseBudget{ { ID: Ptr("2066deda-923f-43f9-88d2-62395a28c0cdd"), BudgetType: Ptr("ProductPricing"), @@ -52,7 +52,7 @@ func TestEnterpriseService_ListBudgets(t *testing.T) { BudgetScope: Ptr("enterprise"), BudgetAmount: Ptr(1000), PreventFurtherUsage: Ptr(true), - BudgetAlerting: &BudgetAlerting{ + BudgetAlerting: &EnterpriseBudgetAlerting{ WillAlert: Ptr(true), AlertRecipients: []string{"enterprise-admin"}, }, @@ -71,6 +71,11 @@ func TestEnterpriseService_ListBudgets(t *testing.T) { } return resp, err }) + + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Enterprise.ListBudgets(ctx, "\n") + return err + }) } func TestEnterpriseService_ListBudgets_invalidEnterprise(t *testing.T) { @@ -95,7 +100,7 @@ func TestEnterpriseService_CreateBudget(t *testing.T) { }) ctx := t.Context() - req := &Budget{ + req := EnterpriseBudget{ BudgetAmount: Ptr(200), PreventFurtherUsage: Ptr(true), BudgetScope: Ptr("enterprise"), @@ -108,7 +113,7 @@ func TestEnterpriseService_CreateBudget(t *testing.T) { t.Errorf("Enterprise.CreateBudget returned error: %v", err) } - want := &BudgetActionResponse{ + want := &EnterpriseBudgetActionResponse{ Message: Ptr("Budget successfully created."), } if !cmp.Equal(resp, want) { @@ -123,6 +128,11 @@ func TestEnterpriseService_CreateBudget(t *testing.T) { } return resp, err }) + + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Enterprise.CreateBudget(ctx, "\n", req) + return err + }) } func TestEnterpriseService_CreateBudget_invalidEnterprise(t *testing.T) { @@ -130,7 +140,7 @@ func TestEnterpriseService_CreateBudget_invalidEnterprise(t *testing.T) { client, _, _ := setup(t) ctx := t.Context() - _, _, err := client.Enterprise.CreateBudget(ctx, "%", &Budget{}) + _, _, err := client.Enterprise.CreateBudget(ctx, "%", EnterpriseBudget{}) testURLParseError(t, err) } @@ -156,7 +166,7 @@ func TestEnterpriseService_GetBudget(t *testing.T) { t.Errorf("Enterprise.GetBudget returned error: %v", err) } - want := &Budget{ + want := &EnterpriseBudget{ ID: Ptr("2066deda-923f-43f9-88d2-62395a28c0cdd"), BudgetType: Ptr("ProductPricing"), BudgetProductSKU: Ptr("actions_linux"), @@ -176,6 +186,11 @@ func TestEnterpriseService_GetBudget(t *testing.T) { } return resp, err }) + + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Enterprise.GetBudget(ctx, "\n", "\n") + return err + }) } func TestEnterpriseService_GetBudget_invalidEnterprise(t *testing.T) { @@ -205,7 +220,7 @@ func TestEnterpriseService_UpdateBudget(t *testing.T) { }) ctx := t.Context() - req := &Budget{ + req := &EnterpriseBudget{ BudgetAmount: Ptr(10), PreventFurtherUsage: Ptr(false), } @@ -215,9 +230,9 @@ func TestEnterpriseService_UpdateBudget(t *testing.T) { t.Errorf("Enterprise.UpdateBudget returned error: %v", err) } - want := &BudgetActionResponse{ + want := &EnterpriseBudgetActionResponse{ Message: Ptr("Budget successfully updated."), - Budget: &Budget{ + Budget: &EnterpriseBudget{ ID: Ptr("b-123"), BudgetAmount: Ptr(10), PreventFurtherUsage: Ptr(false), @@ -235,6 +250,11 @@ func TestEnterpriseService_UpdateBudget(t *testing.T) { } return resp, err }) + + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Enterprise.UpdateBudget(ctx, "\n", "\n", req) + return err + }) } func TestEnterpriseService_UpdateBudget_invalidEnterprise(t *testing.T) { @@ -242,7 +262,7 @@ func TestEnterpriseService_UpdateBudget_invalidEnterprise(t *testing.T) { client, _, _ := setup(t) ctx := t.Context() - _, _, err := client.Enterprise.UpdateBudget(ctx, "%", "b-123", &Budget{}) + _, _, err := client.Enterprise.UpdateBudget(ctx, "%", "b-123", &EnterpriseBudget{}) testURLParseError(t, err) } @@ -264,7 +284,7 @@ func TestEnterpriseService_DeleteBudget(t *testing.T) { t.Errorf("Enterprise.DeleteBudget returned error: %v", err) } - want := &BudgetActionResponse{ + want := &EnterpriseBudgetActionResponse{ Message: Ptr("Budget successfully deleted."), BudgetID: Ptr("b-123"), } @@ -280,6 +300,11 @@ func TestEnterpriseService_DeleteBudget(t *testing.T) { } return resp, err }) + + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Enterprise.DeleteBudget(ctx, "\n", "\n") + return err + }) } func TestEnterpriseService_DeleteBudget_invalidEnterprise(t *testing.T) { @@ -291,11 +316,11 @@ func TestEnterpriseService_DeleteBudget_invalidEnterprise(t *testing.T) { testURLParseError(t, err) } -func TestBudget_Marshal(t *testing.T) { +func TestEnterpriseBudget_Marshal(t *testing.T) { t.Parallel() - testJSONMarshal(t, &Budget{}, "{}") + testJSONMarshal(t, &EnterpriseBudget{}, "{}") - u := &Budget{ + u := &EnterpriseBudget{ ID: Ptr("b-123"), BudgetType: Ptr("ProductPricing"), BudgetProductSkus: []string{"actions"}, @@ -304,7 +329,7 @@ func TestBudget_Marshal(t *testing.T) { BudgetEntityName: Ptr("org-name"), BudgetAmount: Ptr(100), PreventFurtherUsage: Ptr(true), - BudgetAlerting: &BudgetAlerting{ + BudgetAlerting: &EnterpriseBudgetAlerting{ WillAlert: Ptr(true), AlertRecipients: []string{"mona"}, }, @@ -328,11 +353,11 @@ func TestBudget_Marshal(t *testing.T) { testJSONMarshal(t, u, want) } -func TestBudgetAlerting_Marshal(t *testing.T) { +func TestEnterpriseBudgetAlerting_Marshal(t *testing.T) { t.Parallel() - testJSONMarshal(t, &BudgetAlerting{}, "{}") + testJSONMarshal(t, &EnterpriseBudgetAlerting{}, "{}") - u := &BudgetAlerting{ + u := &EnterpriseBudgetAlerting{ WillAlert: Ptr(true), AlertRecipients: []string{"admin1", "admin2"}, } @@ -350,7 +375,7 @@ func TestEnterpriseBudgets_Marshal(t *testing.T) { testJSONMarshal(t, &EnterpriseBudgets{}, "{}") u := &EnterpriseBudgets{ - Budgets: []*Budget{ + Budgets: []*EnterpriseBudget{ { ID: Ptr("1"), }, @@ -368,14 +393,14 @@ func TestEnterpriseBudgets_Marshal(t *testing.T) { testJSONMarshal(t, u, want) } -func TestBudgetActionResponse_Marshal(t *testing.T) { +func TestEnterpriseBudgetActionResponse_Marshal(t *testing.T) { t.Parallel() - testJSONMarshal(t, &BudgetActionResponse{}, "{}") + testJSONMarshal(t, &EnterpriseBudgetActionResponse{}, "{}") - u := &BudgetActionResponse{ + u := &EnterpriseBudgetActionResponse{ Message: Ptr("Success"), BudgetID: Ptr("123"), - Budget: &Budget{ + Budget: &EnterpriseBudget{ ID: Ptr("123"), }, } diff --git a/github/github-accessors.go b/github/github-accessors.go index eec288d0952..0af5c4077bb 100644 --- a/github/github-accessors.go +++ b/github/github-accessors.go @@ -2390,102 +2390,6 @@ 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 -} - -// GetBudgetAmount returns the BudgetAmount field if it's non-nil, zero value otherwise. -func (b *Budget) GetBudgetAmount() int { - if b == nil || b.BudgetAmount == nil { - return 0 - } - return *b.BudgetAmount -} - -// GetBudgetEntityName returns the BudgetEntityName field if it's non-nil, zero value otherwise. -func (b *Budget) GetBudgetEntityName() string { - if b == nil || b.BudgetEntityName == nil { - return "" - } - return *b.BudgetEntityName -} - -// GetBudgetProductSKU returns the BudgetProductSKU field if it's non-nil, zero value otherwise. -func (b *Budget) GetBudgetProductSKU() string { - if b == nil || b.BudgetProductSKU == nil { - return "" - } - return *b.BudgetProductSKU -} - -// GetBudgetScope returns the BudgetScope field if it's non-nil, zero value otherwise. -func (b *Budget) GetBudgetScope() string { - if b == nil || b.BudgetScope == nil { - return "" - } - return *b.BudgetScope -} - -// 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 -} - -// 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 -} - -// GetPreventFurtherUsage returns the PreventFurtherUsage field if it's non-nil, zero value otherwise. -func (b *Budget) GetPreventFurtherUsage() bool { - if b == nil || b.PreventFurtherUsage == nil { - return false - } - return *b.PreventFurtherUsage -} - -// GetBudget returns the Budget field. -func (b *BudgetActionResponse) GetBudget() *Budget { - if b == nil { - return nil - } - return b.Budget -} - -// GetBudgetID returns the BudgetID field if it's non-nil, zero value otherwise. -func (b *BudgetActionResponse) GetBudgetID() string { - if b == nil || b.BudgetID == nil { - return "" - } - return *b.BudgetID -} - -// GetMessage returns the Message field if it's non-nil, zero value otherwise. -func (b *BudgetActionResponse) GetMessage() string { - if b == nil || b.Message == nil { - return "" - } - return *b.Message -} - -// 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 { @@ -9926,6 +9830,102 @@ func (e *Enterprise) GetWebsiteURL() string { return *e.WebsiteURL } +// GetBudgetAlerting returns the BudgetAlerting field. +func (e *EnterpriseBudget) GetBudgetAlerting() *EnterpriseBudgetAlerting { + if e == nil { + return nil + } + return e.BudgetAlerting +} + +// GetBudgetAmount returns the BudgetAmount field if it's non-nil, zero value otherwise. +func (e *EnterpriseBudget) GetBudgetAmount() int { + if e == nil || e.BudgetAmount == nil { + return 0 + } + return *e.BudgetAmount +} + +// GetBudgetEntityName returns the BudgetEntityName field if it's non-nil, zero value otherwise. +func (e *EnterpriseBudget) GetBudgetEntityName() string { + if e == nil || e.BudgetEntityName == nil { + return "" + } + return *e.BudgetEntityName +} + +// GetBudgetProductSKU returns the BudgetProductSKU field if it's non-nil, zero value otherwise. +func (e *EnterpriseBudget) GetBudgetProductSKU() string { + if e == nil || e.BudgetProductSKU == nil { + return "" + } + return *e.BudgetProductSKU +} + +// GetBudgetScope returns the BudgetScope field if it's non-nil, zero value otherwise. +func (e *EnterpriseBudget) GetBudgetScope() string { + if e == nil || e.BudgetScope == nil { + return "" + } + return *e.BudgetScope +} + +// GetBudgetType returns the BudgetType field if it's non-nil, zero value otherwise. +func (e *EnterpriseBudget) GetBudgetType() string { + if e == nil || e.BudgetType == nil { + return "" + } + return *e.BudgetType +} + +// GetID returns the ID field if it's non-nil, zero value otherwise. +func (e *EnterpriseBudget) GetID() string { + if e == nil || e.ID == nil { + return "" + } + return *e.ID +} + +// GetPreventFurtherUsage returns the PreventFurtherUsage field if it's non-nil, zero value otherwise. +func (e *EnterpriseBudget) GetPreventFurtherUsage() bool { + if e == nil || e.PreventFurtherUsage == nil { + return false + } + return *e.PreventFurtherUsage +} + +// GetBudget returns the Budget field. +func (e *EnterpriseBudgetActionResponse) GetBudget() *EnterpriseBudget { + if e == nil { + return nil + } + return e.Budget +} + +// GetBudgetID returns the BudgetID field if it's non-nil, zero value otherwise. +func (e *EnterpriseBudgetActionResponse) GetBudgetID() string { + if e == nil || e.BudgetID == nil { + return "" + } + return *e.BudgetID +} + +// GetMessage returns the Message field if it's non-nil, zero value otherwise. +func (e *EnterpriseBudgetActionResponse) GetMessage() string { + if e == nil || e.Message == nil { + return "" + } + return *e.Message +} + +// GetWillAlert returns the WillAlert field if it's non-nil, zero value otherwise. +func (e *EnterpriseBudgetAlerting) GetWillAlert() bool { + if e == nil || e.WillAlert == nil { + return false + } + return *e.WillAlert +} + // GetOrganizationID returns the OrganizationID field if it's non-nil, zero value otherwise. func (e *EnterpriseCustomPropertiesValues) GetOrganizationID() int64 { if e == nil || e.OrganizationID == nil { diff --git a/github/github-accessors_test.go b/github/github-accessors_test.go index fa98706dfe8..dcc3320f4ac 100644 --- a/github/github-accessors_test.go +++ b/github/github-accessors_test.go @@ -3141,132 +3141,6 @@ 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_GetBudgetAmount(tt *testing.T) { - tt.Parallel() - var zeroValue int - b := &Budget{BudgetAmount: &zeroValue} - b.GetBudgetAmount() - b = &Budget{} - b.GetBudgetAmount() - b = nil - b.GetBudgetAmount() -} - -func TestBudget_GetBudgetEntityName(tt *testing.T) { - tt.Parallel() - var zeroValue string - b := &Budget{BudgetEntityName: &zeroValue} - b.GetBudgetEntityName() - b = &Budget{} - b.GetBudgetEntityName() - b = nil - b.GetBudgetEntityName() -} - -func TestBudget_GetBudgetProductSKU(tt *testing.T) { - tt.Parallel() - var zeroValue string - b := &Budget{BudgetProductSKU: &zeroValue} - b.GetBudgetProductSKU() - b = &Budget{} - b.GetBudgetProductSKU() - b = nil - b.GetBudgetProductSKU() -} - -func TestBudget_GetBudgetScope(tt *testing.T) { - tt.Parallel() - var zeroValue string - b := &Budget{BudgetScope: &zeroValue} - b.GetBudgetScope() - b = &Budget{} - b.GetBudgetScope() - b = nil - b.GetBudgetScope() -} - -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_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_GetPreventFurtherUsage(tt *testing.T) { - tt.Parallel() - var zeroValue bool - b := &Budget{PreventFurtherUsage: &zeroValue} - b.GetPreventFurtherUsage() - b = &Budget{} - b.GetPreventFurtherUsage() - b = nil - b.GetPreventFurtherUsage() -} - -func TestBudgetActionResponse_GetBudget(tt *testing.T) { - tt.Parallel() - b := &BudgetActionResponse{} - b.GetBudget() - b = nil - b.GetBudget() -} - -func TestBudgetActionResponse_GetBudgetID(tt *testing.T) { - tt.Parallel() - var zeroValue string - b := &BudgetActionResponse{BudgetID: &zeroValue} - b.GetBudgetID() - b = &BudgetActionResponse{} - b.GetBudgetID() - b = nil - b.GetBudgetID() -} - -func TestBudgetActionResponse_GetMessage(tt *testing.T) { - tt.Parallel() - var zeroValue string - b := &BudgetActionResponse{Message: &zeroValue} - b.GetMessage() - b = &BudgetActionResponse{} - b.GetMessage() - b = nil - b.GetMessage() -} - -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 @@ -12885,6 +12759,132 @@ func TestEnterprise_GetWebsiteURL(tt *testing.T) { e.GetWebsiteURL() } +func TestEnterpriseBudget_GetBudgetAlerting(tt *testing.T) { + tt.Parallel() + e := &EnterpriseBudget{} + e.GetBudgetAlerting() + e = nil + e.GetBudgetAlerting() +} + +func TestEnterpriseBudget_GetBudgetAmount(tt *testing.T) { + tt.Parallel() + var zeroValue int + e := &EnterpriseBudget{BudgetAmount: &zeroValue} + e.GetBudgetAmount() + e = &EnterpriseBudget{} + e.GetBudgetAmount() + e = nil + e.GetBudgetAmount() +} + +func TestEnterpriseBudget_GetBudgetEntityName(tt *testing.T) { + tt.Parallel() + var zeroValue string + e := &EnterpriseBudget{BudgetEntityName: &zeroValue} + e.GetBudgetEntityName() + e = &EnterpriseBudget{} + e.GetBudgetEntityName() + e = nil + e.GetBudgetEntityName() +} + +func TestEnterpriseBudget_GetBudgetProductSKU(tt *testing.T) { + tt.Parallel() + var zeroValue string + e := &EnterpriseBudget{BudgetProductSKU: &zeroValue} + e.GetBudgetProductSKU() + e = &EnterpriseBudget{} + e.GetBudgetProductSKU() + e = nil + e.GetBudgetProductSKU() +} + +func TestEnterpriseBudget_GetBudgetScope(tt *testing.T) { + tt.Parallel() + var zeroValue string + e := &EnterpriseBudget{BudgetScope: &zeroValue} + e.GetBudgetScope() + e = &EnterpriseBudget{} + e.GetBudgetScope() + e = nil + e.GetBudgetScope() +} + +func TestEnterpriseBudget_GetBudgetType(tt *testing.T) { + tt.Parallel() + var zeroValue string + e := &EnterpriseBudget{BudgetType: &zeroValue} + e.GetBudgetType() + e = &EnterpriseBudget{} + e.GetBudgetType() + e = nil + e.GetBudgetType() +} + +func TestEnterpriseBudget_GetID(tt *testing.T) { + tt.Parallel() + var zeroValue string + e := &EnterpriseBudget{ID: &zeroValue} + e.GetID() + e = &EnterpriseBudget{} + e.GetID() + e = nil + e.GetID() +} + +func TestEnterpriseBudget_GetPreventFurtherUsage(tt *testing.T) { + tt.Parallel() + var zeroValue bool + e := &EnterpriseBudget{PreventFurtherUsage: &zeroValue} + e.GetPreventFurtherUsage() + e = &EnterpriseBudget{} + e.GetPreventFurtherUsage() + e = nil + e.GetPreventFurtherUsage() +} + +func TestEnterpriseBudgetActionResponse_GetBudget(tt *testing.T) { + tt.Parallel() + e := &EnterpriseBudgetActionResponse{} + e.GetBudget() + e = nil + e.GetBudget() +} + +func TestEnterpriseBudgetActionResponse_GetBudgetID(tt *testing.T) { + tt.Parallel() + var zeroValue string + e := &EnterpriseBudgetActionResponse{BudgetID: &zeroValue} + e.GetBudgetID() + e = &EnterpriseBudgetActionResponse{} + e.GetBudgetID() + e = nil + e.GetBudgetID() +} + +func TestEnterpriseBudgetActionResponse_GetMessage(tt *testing.T) { + tt.Parallel() + var zeroValue string + e := &EnterpriseBudgetActionResponse{Message: &zeroValue} + e.GetMessage() + e = &EnterpriseBudgetActionResponse{} + e.GetMessage() + e = nil + e.GetMessage() +} + +func TestEnterpriseBudgetAlerting_GetWillAlert(tt *testing.T) { + tt.Parallel() + var zeroValue bool + e := &EnterpriseBudgetAlerting{WillAlert: &zeroValue} + e.GetWillAlert() + e = &EnterpriseBudgetAlerting{} + e.GetWillAlert() + e = nil + e.GetWillAlert() +} + func TestEnterpriseCustomPropertiesValues_GetOrganizationID(tt *testing.T) { tt.Parallel() var zeroValue int64 diff --git a/github/github-stringify_test.go b/github/github-stringify_test.go index 59c0bc2faba..4a3077f9b7f 100644 --- a/github/github-stringify_test.go +++ b/github/github-stringify_test.go @@ -216,25 +216,6 @@ func TestAuthorizationUpdateRequest_String(t *testing.T) { } } -func TestBudget_String(t *testing.T) { - t.Parallel() - v := Budget{ - ID: Ptr(""), - BudgetType: Ptr(""), - BudgetProductSkus: []string{""}, - BudgetProductSKU: Ptr(""), - BudgetScope: Ptr(""), - BudgetEntityName: Ptr(""), - BudgetAmount: Ptr(0), - PreventFurtherUsage: Ptr(false), - BudgetAlerting: &BudgetAlerting{}, - } - want := `github.Budget{ID:"", BudgetType:"", BudgetProductSkus:[""], BudgetProductSKU:"", BudgetScope:"", BudgetEntityName:"", BudgetAmount:0, PreventFurtherUsage:false, BudgetAlerting:github.BudgetAlerting{}}` - if got := v.String(); got != want { - t.Errorf("Budget.String = %v, want %v", got, want) - } -} - func TestCheckRun_String(t *testing.T) { t.Parallel() v := CheckRun{ @@ -587,6 +568,25 @@ func TestEnterprise_String(t *testing.T) { } } +func TestEnterpriseBudget_String(t *testing.T) { + t.Parallel() + v := EnterpriseBudget{ + ID: Ptr(""), + BudgetType: Ptr(""), + BudgetProductSkus: []string{""}, + BudgetProductSKU: Ptr(""), + BudgetScope: Ptr(""), + BudgetEntityName: Ptr(""), + BudgetAmount: Ptr(0), + PreventFurtherUsage: Ptr(false), + BudgetAlerting: &EnterpriseBudgetAlerting{}, + } + want := `github.EnterpriseBudget{ID:"", BudgetType:"", BudgetProductSkus:[""], BudgetProductSKU:"", BudgetScope:"", BudgetEntityName:"", BudgetAmount:0, PreventFurtherUsage:false, BudgetAlerting:github.EnterpriseBudgetAlerting{}}` + if got := v.String(); got != want { + t.Errorf("EnterpriseBudget.String = %v, want %v", got, want) + } +} + func TestEvent_String(t *testing.T) { t.Parallel() v := Event{ From 03ae51cbd41000bad2f83571f0dc330d539b9f4a Mon Sep 17 00:00:00 2001 From: maishivamhoo123 Date: Sat, 7 Mar 2026 18:59:50 +0530 Subject: [PATCH 3/3] Passing the Budget as value in UpdateBudget Signed-off-by: maishivamhoo123 --- github/enterprise_budgets.go | 2 +- github/enterprise_budgets_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/github/enterprise_budgets.go b/github/enterprise_budgets.go index 43a9a53aebd..ffd0bb719fa 100644 --- a/github/enterprise_budgets.go +++ b/github/enterprise_budgets.go @@ -116,7 +116,7 @@ func (s *EnterpriseService) GetBudget(ctx context.Context, enterprise, budgetID // 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 *EnterpriseBudget) (*EnterpriseBudgetActionResponse, *Response, error) { +func (s *EnterpriseService) UpdateBudget(ctx context.Context, enterprise, budgetID string, budget EnterpriseBudget) (*EnterpriseBudgetActionResponse, *Response, error) { u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID) req, err := s.client.NewRequest("PATCH", u, budget) diff --git a/github/enterprise_budgets_test.go b/github/enterprise_budgets_test.go index 7376b9cdaf2..66263ba5806 100644 --- a/github/enterprise_budgets_test.go +++ b/github/enterprise_budgets_test.go @@ -220,7 +220,7 @@ func TestEnterpriseService_UpdateBudget(t *testing.T) { }) ctx := t.Context() - req := &EnterpriseBudget{ + req := EnterpriseBudget{ BudgetAmount: Ptr(10), PreventFurtherUsage: Ptr(false), } @@ -262,7 +262,7 @@ func TestEnterpriseService_UpdateBudget_invalidEnterprise(t *testing.T) { client, _, _ := setup(t) ctx := t.Context() - _, _, err := client.Enterprise.UpdateBudget(ctx, "%", "b-123", &EnterpriseBudget{}) + _, _, err := client.Enterprise.UpdateBudget(ctx, "%", "b-123", EnterpriseBudget{}) testURLParseError(t, err) }