Skip to content

Commit

Permalink
Feat: budget resource for project (#706)
Browse files Browse the repository at this point in the history
  • Loading branch information
TomerHeber authored Sep 5, 2023
1 parent 3265e71 commit 0a54bb1
Show file tree
Hide file tree
Showing 4 changed files with 155 additions and 0 deletions.
3 changes: 3 additions & 0 deletions client/api_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,9 @@ type ApiClientInterface interface {
ApprovalPolicyAssign(assignment *ApprovalPolicyAssignment) (*ApprovalPolicyAssignment, error)
ApprovalPolicyUnassign(scope string, scopeId string) error
ApprovalPolicyByScope(scope string, scopeId string) ([]ApprovalPolicyByScope, error)
ProjectBudget(projectId string) (*ProjectBudget, error)
ProjectBudgetUpdate(projectId string, payload *ProjectBudgetUpdatePayload) (*ProjectBudget, error)
ProjectBudgetDelete(projectId string) error
}

func NewApiClient(client http.HttpClientInterface, defaultOrganizationId string) ApiClientInterface {
Expand Down
44 changes: 44 additions & 0 deletions client/api_client_mock.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 40 additions & 0 deletions client/project_budget.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package client

type ProjectBudget struct {
Id string `json:"id" tfschema:"-"`
ProjectId string `json:"projectId"`
Amount int `json:"amount"`
Timeframe string `json:"timeframe"`
Thresholds []int `json:"thresholds"`
}

type ProjectBudgetUpdatePayload struct {
Amount int `json:"amount"`
Timeframe string `json:"timeframe"`
Thresholds []int `json:"thresholds"`
}

func (client *ApiClient) ProjectBudget(projectId string) (*ProjectBudget, error) {
var result ProjectBudget

if err := client.http.Get("/costs/project/"+projectId+"/budget", nil, &result); err != nil {
return nil, err
}

return &result, nil
}

func (client *ApiClient) ProjectBudgetUpdate(projectId string, payload *ProjectBudgetUpdatePayload) (*ProjectBudget, error) {
var result ProjectBudget

err := client.http.Put("/costs/project/"+projectId+"/budget", payload, &result)
if err != nil {
return nil, err
}

return &result, nil
}

func (client *ApiClient) ProjectBudgetDelete(projectId string) error {
return client.http.Delete("/costs/project/"+projectId+"/budget", nil)
}
68 changes: 68 additions & 0 deletions client/project_budget_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package client_test

import (
. "github.com/env0/terraform-provider-env0/client"
"github.com/golang/mock/gomock"
"github.com/jinzhu/copier"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
)

var _ = Describe("Project Budget Client", func() {
mockProjectBudget := ProjectBudget{
Id: "id",
ProjectId: "pid",
Amount: 50,
Timeframe: "WEEKLY",
Thresholds: []int{1, 2},
}

Describe("Get Project Budget", func() {
var returnedProjectBudget *ProjectBudget

BeforeEach(func() {
httpCall = mockHttpClient.EXPECT().
Get("/costs/project/"+mockProjectBudget.ProjectId+"/budget", gomock.Nil(), gomock.Any()).
Do(func(path string, request interface{}, response *ProjectBudget) {
*response = mockProjectBudget
})
httpCall.Times(1)
returnedProjectBudget, _ = apiClient.ProjectBudget(mockProjectBudget.ProjectId)
})

It("Should return project budget", func() {
Expect(*returnedProjectBudget).To(Equal(mockProjectBudget))
})
})

Describe("Delete Project Budget", func() {
BeforeEach(func() {
httpCall = mockHttpClient.EXPECT().Delete("/costs/project/"+mockProjectBudget.ProjectId+"/budget", gomock.Nil())
httpCall.Times(1)
apiClient.ProjectBudgetDelete(mockProjectBudget.ProjectId)
})

It("Should delete project budget", func() {})
})

Describe("Update Project Budget", func() {
var returnedProjectBudget *ProjectBudget

BeforeEach(func() {
var updateProjectBudgetPayload ProjectBudgetUpdatePayload
copier.Copy(&updateProjectBudgetPayload, &mockProjectBudget)

httpCall = mockHttpClient.EXPECT().
Put("/costs/project/"+mockProjectBudget.ProjectId+"/budget", &updateProjectBudgetPayload, gomock.Any()).
Do(func(path string, request interface{}, response *ProjectBudget) {
*response = mockProjectBudget
})
httpCall.Times(1)
returnedProjectBudget, _ = apiClient.ProjectBudgetUpdate(mockProjectBudget.ProjectId, &updateProjectBudgetPayload)
})

It("Should return project budget", func() {
Expect(*returnedProjectBudget).To(Equal(mockProjectBudget))
})
})
})

0 comments on commit 0a54bb1

Please sign in to comment.