Skip to content

Commit 8c24c5c

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

6 files changed

+52
-34
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 endpoint `TeamProjectAccesses` to manage Project Access for Teams 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
})

mocks/team_project_access_mocks.go

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

team_project_access.go

+26-14
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ 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.
19-
List(ctx context.Context, options *TeamProjectAccessListOptions) (*TeamProjectAccessList, error)
19+
List(ctx context.Context, options TeamProjectAccessListOptions) (*TeamProjectAccessList, error)
2020

2121
// Add team access for a project.
2222
Add(ctx context.Context, options TeamProjectAccessAddOptions) (*TeamProjectAccess, error)
@@ -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"`
@@ -94,12 +94,12 @@ type TeamProjectAccessUpdateOptions struct {
9494
}
9595

9696
// List all team accesses for a given project.
97-
func (s *teamProjectAccesses) List(ctx context.Context, options *TeamProjectAccessListOptions) (*TeamProjectAccessList, error) {
97+
func (s *teamProjectAccesses) List(ctx context.Context, options TeamProjectAccessListOptions) (*TeamProjectAccessList, error) {
9898
if err := options.valid(); err != nil {
9999
return nil, err
100100
}
101101

102-
req, err := s.client.NewRequest("GET", "team-projects", options)
102+
req, err := s.client.NewRequest("GET", "team-projects", &options)
103103
if err != nil {
104104
return nil, err
105105
}
@@ -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 {
@@ -191,28 +198,33 @@ func (s *teamProjectAccesses) Remove(ctx context.Context, teamProjectAccessID st
191198
}
192199

193200
func (o *TeamProjectAccessListOptions) valid() error {
194-
if o == nil {
195-
return ErrRequiredTeamProjectAccessListOps
196-
}
197-
if !validString(&o.ProjectID) {
198-
return ErrRequiredProjectID
199-
}
200201
if !validStringID(&o.ProjectID) {
201202
return ErrInvalidProjectID
202203
}
203204

204205
return nil
205206
}
206207

207-
func (o TeamProjectAccessAddOptions) valid() error {
208-
if o.Access == nil {
209-
return ErrRequiredAccess
208+
func (o *TeamProjectAccessAddOptions) valid() error {
209+
if err := validateTeamProjectAccessType(o.Access); err != nil {
210+
return err
210211
}
211212
if o.Team == nil {
212213
return ErrRequiredTeam
213214
}
214215
if o.Project == nil {
215216
return ErrRequiredProject
216217
}
218+
219+
return nil
220+
}
221+
222+
func validateTeamProjectAccessType(t TeamProjectAccessType) error {
223+
switch t {
224+
case TeamProjectAccessAdmin, TeamProjectAccessRead:
225+
// do nothing
226+
default:
227+
return ErrInvalidTeamProjectAccessType
228+
}
217229
return nil
218230
}

team_project_access_integration_test.go

+21-17
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func TestTeamProjectAccessesList(t *testing.T) {
3131
defer tpaTest2Cleanup()
3232

3333
t.Run("with valid options", func(t *testing.T) {
34-
tpal, err := client.TeamProjectAccess.List(ctx, &TeamProjectAccessListOptions{
34+
tpal, err := client.TeamProjectAccess.List(ctx, TeamProjectAccessListOptions{
3535
ProjectID: pTest.ID,
3636
})
3737
require.NoError(t, err)
@@ -43,7 +43,7 @@ func TestTeamProjectAccessesList(t *testing.T) {
4343
// Request a page number which is out of range. The result should
4444
// be successful, but return no results if the paging options are
4545
// properly passed along.
46-
tpal, err := client.TeamProjectAccess.List(ctx, &TeamProjectAccessListOptions{
46+
tpal, err := client.TeamProjectAccess.List(ctx, TeamProjectAccessListOptions{
4747
ProjectID: pTest.ID,
4848
ListOptions: ListOptions{
4949
PageNumber: 999,
@@ -56,25 +56,19 @@ func TestTeamProjectAccessesList(t *testing.T) {
5656
assert.Equal(t, 2, tpal.TotalCount)
5757
})
5858

59-
t.Run("without TeamProjectAccessListOptions", func(t *testing.T) {
60-
tpal, err := client.TeamProjectAccess.List(ctx, nil)
61-
assert.Nil(t, tpal)
62-
assert.Equal(t, err, ErrRequiredTeamProjectAccessListOps)
63-
})
64-
6559
t.Run("without projectID options", func(t *testing.T) {
66-
tpal, err := client.TeamProjectAccess.List(ctx, &TeamProjectAccessListOptions{
60+
tpal, err := client.TeamProjectAccess.List(ctx, TeamProjectAccessListOptions{
6761
ListOptions: ListOptions{
6862
PageNumber: 2,
6963
PageSize: 25,
7064
},
7165
})
7266
assert.Nil(t, tpal)
73-
assert.Equal(t, err, ErrRequiredProjectID)
67+
assert.Equal(t, err, ErrInvalidProjectID)
7468
})
7569

7670
t.Run("without a valid projectID", func(t *testing.T) {
77-
tpal, err := client.TeamProjectAccess.List(ctx, &TeamProjectAccessListOptions{
71+
tpal, err := client.TeamProjectAccess.List(ctx, TeamProjectAccessListOptions{
7872
ProjectID: badIdentifier,
7973
})
8074
assert.Nil(t, tpal)
@@ -145,7 +139,7 @@ func TestTeamProjectAccessesAdd(t *testing.T) {
145139

146140
t.Run("with valid options", func(t *testing.T) {
147141
options := TeamProjectAccessAddOptions{
148-
Access: ProjectAccess(TeamProjectAccessAdmin),
142+
Access: *ProjectAccess(TeamProjectAccessAdmin),
149143
Team: tmTest,
150144
Project: pTest,
151145
}
@@ -169,7 +163,7 @@ func TestTeamProjectAccessesAdd(t *testing.T) {
169163
refreshed,
170164
} {
171165
assert.NotEmpty(t, item.ID)
172-
assert.Equal(t, *options.Access, item.Access)
166+
assert.Equal(t, options.Access, item.Access)
173167
}
174168
})
175169

@@ -178,7 +172,7 @@ func TestTeamProjectAccessesAdd(t *testing.T) {
178172
defer tpaTestCleanup()
179173

180174
options := TeamProjectAccessAddOptions{
181-
Access: ProjectAccess(TeamProjectAccessAdmin),
175+
Access: *ProjectAccess(TeamProjectAccessAdmin),
182176
Team: tmTest,
183177
Project: pTest,
184178
}
@@ -193,12 +187,12 @@ func TestTeamProjectAccessesAdd(t *testing.T) {
193187
Project: pTest,
194188
})
195189
assert.Nil(t, tpa)
196-
assert.Equal(t, err, ErrRequiredAccess)
190+
assert.Equal(t, err, ErrInvalidTeamProjectAccessType)
197191
})
198192

199193
t.Run("when options is missing team", func(t *testing.T) {
200194
tpa, err := client.TeamProjectAccess.Add(ctx, TeamProjectAccessAddOptions{
201-
Access: ProjectAccess(TeamProjectAccessAdmin),
195+
Access: *ProjectAccess(TeamProjectAccessAdmin),
202196
Project: pTest,
203197
})
204198
assert.Nil(t, tpa)
@@ -207,12 +201,22 @@ func TestTeamProjectAccessesAdd(t *testing.T) {
207201

208202
t.Run("when options is missing project", func(t *testing.T) {
209203
tpa, err := client.TeamProjectAccess.Add(ctx, TeamProjectAccessAddOptions{
210-
Access: ProjectAccess(TeamProjectAccessAdmin),
204+
Access: *ProjectAccess(TeamProjectAccessAdmin),
211205
Team: tmTest,
212206
})
213207
assert.Nil(t, tpa)
214208
assert.Equal(t, err, ErrRequiredProject)
215209
})
210+
211+
t.Run("when invalid access is provided in options", func(t *testing.T) {
212+
tpa, err := client.TeamProjectAccess.Add(ctx, TeamProjectAccessAddOptions{
213+
Access: badIdentifier,
214+
Team: tmTest,
215+
Project: pTest,
216+
})
217+
assert.Nil(t, tpa)
218+
assert.Equal(t, err, ErrInvalidTeamProjectAccessType)
219+
})
216220
}
217221

218222
func TestTeamProjectAccessesUpdate(t *testing.T) {

0 commit comments

Comments
 (0)