From fe9c1f4846ebaaae26391c07311c012b754ff29c Mon Sep 17 00:00:00 2001 From: Tanner Neff Date: Thu, 17 Sep 2026 16:03:21 +0000 Subject: [PATCH] feat: Add GetBudgetByID function for enterprise budgets --- github/enterprise_budgets.go | 21 +++++++++++++ github/enterprise_budgets_test.go | 49 +++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) diff --git a/github/enterprise_budgets.go b/github/enterprise_budgets.go index 7b1de622a51..458ee30947d 100644 --- a/github/enterprise_budgets.go +++ b/github/enterprise_budgets.go @@ -226,6 +226,27 @@ func (s *EnterpriseService) GetBudget(ctx context.Context, enterprise, budgetID return budget, resp, nil } +// GetBudgetByID fetches a budget, given a specified budget ID, by ID. +// +// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets?apiVersion=2022-11-28#get-a-budget-by-id +// +//meta:operation GET /enterprises/{enterprise}/settings/billing/budgets/{budget_id} +func (s *EnterpriseService) GetBudgetByID(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(ctx, "GET", u, nil) + if err != nil { + return nil, nil, err + } + + var budget *EnterpriseBudget + resp, err := s.client.Do(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?apiVersion=2022-11-28#update-a-budget diff --git a/github/enterprise_budgets_test.go b/github/enterprise_budgets_test.go index b1d176b8e3e..4133cc31819 100644 --- a/github/enterprise_budgets_test.go +++ b/github/enterprise_budgets_test.go @@ -319,6 +319,55 @@ func TestEnterpriseService_GetBudget_invalidEnterprise(t *testing.T) { testURLParseError(t, err) } +func TestEnterpriseService_GetBudgetByID(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, "GET") + fmt.Fprint(w, `{ + "id": "b-123", + "budget_type": "ProductPricing", + "budget_product_sku": "ai_credits", + "budget_scope": "repository", + "budget_amount": 30, + "prevent_further_usage": true + }`) + }) + + ctx := t.Context() + budget, _, err := client.Enterprise.GetBudgetByID(ctx, "e", "b-123") + if err != nil { + t.Errorf("Enterprise.GetBudgetByID returned error: %v", err) + } + + want := &EnterpriseBudget{ + ID: new("b-123"), + BudgetType: new(BudgetTypeProductPricing), + BudgetProductSKU: new("ai_credits"), + BudgetScope: new(BudgetScopeRepository), + BudgetAmount: new(30), + PreventFurtherUsage: new(true), + } + if !cmp.Equal(budget, want) { + t.Errorf("Enterprise.GetBudgetByID returned %+v, want %+v", budget, want) + } + + const methodName = "GetBudgetByID" + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + got, resp, err := client.Enterprise.GetBudgetByID(ctx, "e", "b-123") + if got != nil { + t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) + } + return resp, err + }) + + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.Enterprise.GetBudgetByID(ctx, "\n", "\n") + return err + }) +} + func TestEnterpriseService_UpdateBudget(t *testing.T) { t.Parallel() client, mux, _ := setup(t)