Skip to content

Commit 996ded7

Browse files
committed
WIP: Fixing Add options for TeamProjectAccess
1 parent 01a7984 commit 996ded7

5 files changed

+62
-35
lines changed

CHANGELOG.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
## Bug Fixes
44

55
## Enhancements
6-
* Add Beta `TeamProjectAccesses` interface with `list`, `add`, `read`, `update`, `remove` methods and integration tests @hs26gill [#599](https://github.com/hashicorp/go-tfe/pull/599)
6+
* Add Beta `TeamProjectAccesses` interface with `list`, `add`, `read`, `update`, `remove` methods and integration tests by @hs26gill [#599](https://github.com/hashicorp/go-tfe/pull/599)
77

88
# v1.16.0
99

errors.go

+2
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ var (
154154

155155
ErrInvalidTeamProjectAccessID = errors.New("invalid value for team project access ID")
156156

157+
ErrInvalidTeamProjectAccessType = errors.New("invalid type for team project access")
158+
157159
ErrInvalidTeamID = errors.New("invalid value for team ID")
158160

159161
ErrInvalidUsernames = errors.New("invalid value for usernames")

helper_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -1670,9 +1670,9 @@ func createTeamProjectAccess(t *testing.T, client *Client, tm *Team, p *Project,
16701670

16711671
ctx := context.Background()
16721672
tpa, err := client.TeamProjectAccess.Add(ctx, TeamProjectAccessAddOptions{
1673-
Access: ProjectAccess(TeamProjectAccessAdmin),
1674-
Team: tm,
1675-
Project: p,
1673+
Access: *ProjectAccess(TeamProjectAccessAdmin),
1674+
Team: *tm,
1675+
Project: *p,
16761676
})
16771677
if err != nil {
16781678
t.Fatal(err)

team_project_access.go

+29-14
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ var _ TeamProjectAccesses = (*teamProjectAccesses)(nil)
1212
// TeamProjectAccesses describes all the team project access related methods that the Terraform
1313
// Enterprise API supports
1414
//
15-
// TFE API docs: (TODO: ADD DOCS URL)
15+
// TFE API docs: Documentation will be linked once this feature is available
1616
// **Note: This functionality is still in BETA and subject to change.**
1717
type TeamProjectAccesses interface {
1818
// List all project accesses for a given project.
@@ -74,12 +74,12 @@ type TeamProjectAccessAddOptions struct {
7474
// https://jsonapi.org/format/#crud-creating
7575
Type string `jsonapi:"primary,team-projects"`
7676
// The type of access to grant.
77-
Access *TeamProjectAccessType `jsonapi:"attr,access"`
77+
Access TeamProjectAccessType `jsonapi:"attr,access"`
7878

7979
// The team to add to the project
80-
Team *Team `jsonapi:"relation,team"`
80+
Team Team `jsonapi:"relation,team"`
8181
// The project to which the team is to be added.
82-
Project *Project `jsonapi:"relation,project"`
82+
Project Project `jsonapi:"relation,project"`
8383
}
8484

8585
// TeamProjectAccessUpdateOptions represents the options for updating a team project access
@@ -119,6 +119,10 @@ func (s *teamProjectAccesses) Add(ctx context.Context, options TeamProjectAccess
119119
return nil, err
120120
}
121121

122+
if err := validateTeamProjectAccessType(options.Access); err != nil {
123+
return nil, err
124+
}
125+
122126
req, err := s.client.NewRequest("POST", "team-projects", &options)
123127
if err != nil {
124128
return nil, err
@@ -160,6 +164,9 @@ func (s *teamProjectAccesses) Update(ctx context.Context, teamProjectAccessID st
160164
return nil, ErrInvalidTeamProjectAccessID
161165
}
162166

167+
if err := validateTeamProjectAccessType(*options.Access); err != nil {
168+
return nil, err
169+
}
163170
u := fmt.Sprintf("team-projects/%s", url.QueryEscape(teamProjectAccessID))
164171
req, err := s.client.NewRequest("PATCH", u, &options)
165172
if err != nil {
@@ -194,25 +201,33 @@ func (o *TeamProjectAccessListOptions) valid() error {
194201
if o == nil {
195202
return ErrRequiredTeamProjectAccessListOps
196203
}
197-
if !validString(&o.ProjectID) {
198-
return ErrRequiredProjectID
199-
}
200204
if !validStringID(&o.ProjectID) {
201205
return ErrInvalidProjectID
202206
}
203207

204208
return nil
205209
}
206210

207-
func (o TeamProjectAccessAddOptions) valid() error {
208-
if o.Access == nil {
209-
return ErrRequiredAccess
211+
func (o *TeamProjectAccessAddOptions) valid() error {
212+
if err := validateTeamProjectAccessType(o.Access); err != nil {
213+
return err
214+
}
215+
if o.Team.ID == "" {
216+
return ErrInvalidTeamID
210217
}
211-
if o.Team == nil {
212-
return ErrRequiredTeam
218+
if o.Project.ID == "" {
219+
return ErrInvalidProjectID
213220
}
214-
if o.Project == nil {
215-
return ErrRequiredProject
221+
222+
return nil
223+
}
224+
225+
func validateTeamProjectAccessType(t TeamProjectAccessType) error {
226+
switch t {
227+
case TeamProjectAccessAdmin, TeamProjectAccessRead:
228+
// do nothing
229+
default:
230+
return ErrInvalidTeamProjectAccessType
216231
}
217232
return nil
218233
}

team_project_access_integration_test.go

+27-17
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ func TestTeamProjectAccessesRead(t *testing.T) {
129129
}
130130

131131
func TestTeamProjectAccessesAdd(t *testing.T) {
132-
skipUnlessBeta(t)
132+
//skipUnlessBeta(t)
133133

134134
client := testClient(t)
135135
ctx := context.Background()
@@ -145,9 +145,9 @@ func TestTeamProjectAccessesAdd(t *testing.T) {
145145

146146
t.Run("with valid options", func(t *testing.T) {
147147
options := TeamProjectAccessAddOptions{
148-
Access: ProjectAccess(TeamProjectAccessAdmin),
149-
Team: tmTest,
150-
Project: pTest,
148+
Access: *ProjectAccess(TeamProjectAccessAdmin),
149+
Team: *tmTest,
150+
Project: *pTest,
151151
}
152152

153153
tpa, err := client.TeamProjectAccess.Add(ctx, options)
@@ -169,7 +169,7 @@ func TestTeamProjectAccessesAdd(t *testing.T) {
169169
refreshed,
170170
} {
171171
assert.NotEmpty(t, item.ID)
172-
assert.Equal(t, *options.Access, item.Access)
172+
assert.Equal(t, options.Access, item.Access)
173173
}
174174
})
175175

@@ -178,9 +178,9 @@ func TestTeamProjectAccessesAdd(t *testing.T) {
178178
defer tpaTestCleanup()
179179

180180
options := TeamProjectAccessAddOptions{
181-
Access: ProjectAccess(TeamProjectAccessAdmin),
182-
Team: tmTest,
183-
Project: pTest,
181+
Access: *ProjectAccess(TeamProjectAccessAdmin),
182+
Team: *tmTest,
183+
Project: *pTest,
184184
}
185185

186186
_, err := client.TeamProjectAccess.Add(ctx, options)
@@ -189,29 +189,39 @@ func TestTeamProjectAccessesAdd(t *testing.T) {
189189

190190
t.Run("when options is missing access", func(t *testing.T) {
191191
tpa, err := client.TeamProjectAccess.Add(ctx, TeamProjectAccessAddOptions{
192-
Team: tmTest,
193-
Project: pTest,
192+
Team: *tmTest,
193+
Project: *pTest,
194194
})
195195
assert.Nil(t, tpa)
196-
assert.Equal(t, err, ErrRequiredAccess)
196+
assert.Equal(t, err, ErrInvalidTeamProjectAccessType)
197197
})
198198

199199
t.Run("when options is missing team", func(t *testing.T) {
200200
tpa, err := client.TeamProjectAccess.Add(ctx, TeamProjectAccessAddOptions{
201-
Access: ProjectAccess(TeamProjectAccessAdmin),
202-
Project: pTest,
201+
Access: *ProjectAccess(TeamProjectAccessAdmin),
202+
Project: *pTest,
203203
})
204204
assert.Nil(t, tpa)
205-
assert.Equal(t, err, ErrRequiredTeam)
205+
assert.Equal(t, err, ErrInvalidTeamID)
206206
})
207207

208208
t.Run("when options is missing project", func(t *testing.T) {
209209
tpa, err := client.TeamProjectAccess.Add(ctx, TeamProjectAccessAddOptions{
210-
Access: ProjectAccess(TeamProjectAccessAdmin),
211-
Team: tmTest,
210+
Access: *ProjectAccess(TeamProjectAccessAdmin),
211+
Team: *tmTest,
212+
})
213+
assert.Nil(t, tpa)
214+
assert.Equal(t, err, ErrInvalidProjectID)
215+
})
216+
217+
t.Run("when invalid access is provided in options", func(t *testing.T) {
218+
tpa, err := client.TeamProjectAccess.Add(ctx, TeamProjectAccessAddOptions{
219+
Access: badIdentifier,
220+
Team: *tmTest,
221+
Project: *pTest,
212222
})
213223
assert.Nil(t, tpa)
214-
assert.Equal(t, err, ErrRequiredProject)
224+
assert.Equal(t, err, ErrInvalidTeamProjectAccessType)
215225
})
216226
}
217227

0 commit comments

Comments
 (0)