Skip to content

Commit c61a6e5

Browse files
committed
Fix add options and tests for TeamProjectAccess
1 parent 01a7984 commit c61a6e5

5 files changed

+44
-17
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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1670,7 +1670,7 @@ 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),
1673+
Access: *ProjectAccess(TeamProjectAccessAdmin),
16741674
Team: tm,
16751675
Project: p,
16761676
})

team_project_access.go

+23-8
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,7 +74,7 @@ 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
8080
Team *Team `jsonapi:"relation,team"`
@@ -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
210214
}
211215
if o.Team == nil {
212216
return ErrRequiredTeam
213217
}
214218
if o.Project == nil {
215219
return ErrRequiredProject
216220
}
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
231+
}
217232
return nil
218233
}

team_project_access_integration_test.go

+17-7
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func TestTeamProjectAccessesList(t *testing.T) {
7070
},
7171
})
7272
assert.Nil(t, tpal)
73-
assert.Equal(t, err, ErrRequiredProjectID)
73+
assert.Equal(t, err, ErrInvalidProjectID)
7474
})
7575

7676
t.Run("without a valid projectID", func(t *testing.T) {
@@ -145,7 +145,7 @@ func TestTeamProjectAccessesAdd(t *testing.T) {
145145

146146
t.Run("with valid options", func(t *testing.T) {
147147
options := TeamProjectAccessAddOptions{
148-
Access: ProjectAccess(TeamProjectAccessAdmin),
148+
Access: *ProjectAccess(TeamProjectAccessAdmin),
149149
Team: tmTest,
150150
Project: pTest,
151151
}
@@ -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,7 +178,7 @@ func TestTeamProjectAccessesAdd(t *testing.T) {
178178
defer tpaTestCleanup()
179179

180180
options := TeamProjectAccessAddOptions{
181-
Access: ProjectAccess(TeamProjectAccessAdmin),
181+
Access: *ProjectAccess(TeamProjectAccessAdmin),
182182
Team: tmTest,
183183
Project: pTest,
184184
}
@@ -193,12 +193,12 @@ func TestTeamProjectAccessesAdd(t *testing.T) {
193193
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),
201+
Access: *ProjectAccess(TeamProjectAccessAdmin),
202202
Project: pTest,
203203
})
204204
assert.Nil(t, tpa)
@@ -207,12 +207,22 @@ func TestTeamProjectAccessesAdd(t *testing.T) {
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),
210+
Access: *ProjectAccess(TeamProjectAccessAdmin),
211211
Team: tmTest,
212212
})
213213
assert.Nil(t, tpa)
214214
assert.Equal(t, err, ErrRequiredProject)
215215
})
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,
222+
})
223+
assert.Nil(t, tpa)
224+
assert.Equal(t, err, ErrInvalidTeamProjectAccessType)
225+
})
216226
}
217227

218228
func TestTeamProjectAccessesUpdate(t *testing.T) {

0 commit comments

Comments
 (0)