Skip to content

Commit c575248

Browse files
authored
fix: members create cmd should invite multiple members (#103)
* members create cmd should invite multiple members * fix member invite tests * add MemberInput type in members client * fix tests
1 parent f18bbcd commit c575248

6 files changed

Lines changed: 40 additions & 32 deletions

File tree

cmd/members/create.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ import (
1616
func NewCreateCmd(client members.Client) (*cobra.Command, error) {
1717
cmd := &cobra.Command{
1818
Args: validators.Validate(),
19-
Long: "Create a new member and send them an invitation email",
19+
Long: "Create new members and send them an invitation email",
2020
RunE: runCreate(client),
21-
Short: "Create a new member",
21+
Short: "Create new members",
2222
Use: "create",
2323
}
2424

@@ -35,14 +35,9 @@ func NewCreateCmd(client members.Client) (*cobra.Command, error) {
3535
return cmd, nil
3636
}
3737

38-
type inputData struct {
39-
Email string `json:"email"`
40-
Role string `json:"role"`
41-
}
42-
4338
func runCreate(client members.Client) func(*cobra.Command, []string) error {
4439
return func(cmd *cobra.Command, args []string) error {
45-
var data inputData
40+
var data []members.MemberInput
4641
// TODO: why does viper.GetString(cliflags.DataFlag) not work?
4742
err := json.Unmarshal([]byte(cmd.Flags().Lookup(cliflags.DataFlag).Value.String()), &data)
4843
if err != nil {
@@ -53,8 +48,7 @@ func runCreate(client members.Client) func(*cobra.Command, []string) error {
5348
context.Background(),
5449
viper.GetString(cliflags.AccessTokenFlag),
5550
viper.GetString(cliflags.BaseURIFlag),
56-
[]string{data.Email},
57-
data.Role,
51+
data,
5852
)
5953
if err != nil {
6054
return err

cmd/members/create_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ import (
1313

1414
func TestCreate(t *testing.T) {
1515
errorHelp := ". See `ldcli members create --help` for supported flags and usage."
16+
role := "writer"
1617
mockArgs := []interface{}{
1718
"testAccessToken",
1819
"http://test.com",
19-
[]string{"testemail@test.com"},
20-
"writer",
20+
[]members.MemberInput{{Email: "testemail@test.com", Role: role}},
2121
}
2222
t.Run("with valid flags calls members API", func(t *testing.T) {
2323
client := members.MockClient{}
@@ -32,7 +32,7 @@ func TestCreate(t *testing.T) {
3232
"--base-uri",
3333
"http://test.com",
3434
"-d",
35-
`{"email": "testemail@test.com", "role": "writer"}`,
35+
`[{"email": "testemail@test.com", "role": "writer"}]`,
3636
}
3737

3838
output, err := cmd.CallCmd(t, nil, nil, &client, nil, args)
@@ -54,7 +54,7 @@ func TestCreate(t *testing.T) {
5454
"--base-uri",
5555
"http://test.com",
5656
"-d",
57-
`{"email": "testemail@test.com", "role": "writer"}`,
57+
`[{"email": "testemail@test.com", "role": "writer"}]`,
5858
}
5959

6060
_, err := cmd.CallCmd(t, nil, nil, &client, nil, args)

cmd/members/invite.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ func NewInviteCmd(client members.Client) (*cobra.Command, error) {
2121
Use: "invite",
2222
}
2323

24-
cmd.Flags().StringSliceP("emails", "e", []string{}, "A comma separated list of emails")
25-
err := cmd.MarkFlagRequired("emails")
24+
cmd.Flags().StringSliceP(cliflags.EmailsFlag, "e", []string{}, "A comma separated list of emails")
25+
err := cmd.MarkFlagRequired(cliflags.EmailsFlag)
2626
if err != nil {
2727
return nil, err
2828
}
29-
err = viper.BindPFlag("emails", cmd.Flags().Lookup("emails"))
29+
err = viper.BindPFlag(cliflags.EmailsFlag, cmd.Flags().Lookup(cliflags.EmailsFlag))
3030
if err != nil {
3131
return nil, err
3232
}
@@ -47,12 +47,17 @@ func NewInviteCmd(client members.Client) (*cobra.Command, error) {
4747

4848
func runInvite(client members.Client) func(*cobra.Command, []string) error {
4949
return func(cmd *cobra.Command, args []string) error {
50+
emails := viper.GetStringSlice(cliflags.EmailsFlag)
51+
memberInputs := make([]members.MemberInput, 0, len(emails))
52+
for _, e := range emails {
53+
role := viper.GetString(cliflags.RoleFlag)
54+
memberInputs = append(memberInputs, members.MemberInput{Email: e, Role: role})
55+
}
5056
response, err := client.Create(
5157
context.Background(),
5258
viper.GetString(cliflags.AccessTokenFlag),
5359
viper.GetString(cliflags.BaseURIFlag),
54-
viper.GetStringSlice(cliflags.EmailsFlag),
55-
viper.GetString(cliflags.RoleFlag),
60+
memberInputs,
5661
)
5762
if err != nil {
5863
return err

cmd/members/invite_test.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,14 @@ import (
1313

1414
func TestInvite(t *testing.T) {
1515
errorHelp := ". See `ldcli members invite --help` for supported flags and usage."
16+
readerRole := "reader"
1617
mockArgs := []interface{}{
1718
"testAccessToken",
1819
"http://test.com",
19-
[]string{"testemail1@test.com", "testemail2@test.com"},
20-
"reader",
20+
[]members.MemberInput{
21+
{Email: "testemail1@test.com", Role: readerRole},
22+
{Email: "testemail2@test.com", Role: readerRole},
23+
},
2124
}
2225
t.Run("with valid flags calls members API", func(t *testing.T) {
2326
client := members.MockClient{}
@@ -87,11 +90,14 @@ func TestInvite(t *testing.T) {
8790
}
8891

8992
func TestInviteWithOptionalRole(t *testing.T) {
93+
writerRole := "writer"
9094
mockArgs := []interface{}{
9195
"testAccessToken",
9296
"http://test.com",
93-
[]string{"testemail1@test.com", "testemail2@test.com"},
94-
"writer",
97+
[]members.MemberInput{
98+
{Email: "testemail1@test.com", Role: writerRole},
99+
{Email: "testemail2@test.com", Role: writerRole},
100+
},
95101
}
96102
t.Run("with valid optional long form flag calls members API", func(t *testing.T) {
97103
client := members.MockClient{}

internal/members/members.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@ package members
33
import (
44
"context"
55
"encoding/json"
6-
76
ldapi "github.com/launchdarkly/api-client-go/v14"
87

98
"ldcli/internal/client"
109
"ldcli/internal/errors"
1110
)
1211

1312
type Client interface {
14-
Create(ctx context.Context, accessToken string, baseURI string, emails []string, role string) ([]byte, error)
13+
Create(ctx context.Context, accessToken string, baseURI string, memberInputs []MemberInput) ([]byte, error)
1514
}
1615

1716
type MembersClient struct {
@@ -24,11 +23,16 @@ func NewClient(cliVersion string) Client {
2423
}
2524
}
2625

27-
func (c MembersClient) Create(ctx context.Context, accessToken string, baseURI string, emails []string, role string) ([]byte, error) {
26+
type MemberInput struct {
27+
Email string `json:"email"`
28+
Role string `json:"role"`
29+
}
30+
31+
func (c MembersClient) Create(ctx context.Context, accessToken string, baseURI string, memberInputs []MemberInput) ([]byte, error) {
2832
client := client.New(accessToken, baseURI, c.cliVersion)
29-
memberForms := make([]ldapi.NewMemberForm, 0, len(emails))
30-
for _, e := range emails {
31-
memberForms = append(memberForms, ldapi.NewMemberForm{Email: e, Role: &role})
33+
memberForms := make([]ldapi.NewMemberForm, 0, len(memberInputs))
34+
for _, m := range memberInputs {
35+
memberForms = append(memberForms, ldapi.NewMemberForm{Email: m.Email, Role: &m.Role})
3236
}
3337

3438
members, _, err := client.AccountMembersApi.PostMembers(ctx).NewMemberForm(memberForms).Execute()

internal/members/mock.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@ func (c *MockClient) Create(
1616
ctx context.Context,
1717
accessToken string,
1818
baseURI string,
19-
emails []string,
20-
role string,
19+
memberInputs []MemberInput,
2120
) ([]byte, error) {
22-
args := c.Called(accessToken, baseURI, emails, role)
21+
args := c.Called(accessToken, baseURI, memberInputs)
2322

2423
return args.Get(0).([]byte), args.Error(1)
2524
}

0 commit comments

Comments
 (0)