From 2d536f419456765ef5bb8760d5ea6f25e6d17eb2 Mon Sep 17 00:00:00 2001 From: David Bloss Date: Fri, 13 Oct 2023 13:23:53 -0500 Subject: [PATCH 1/3] replace TeamMembershipUserInput email field with user field, update tests --- clientGQL_test.go | 7 +- team.go | 16 +- team_test.go | 220 ++++++++++++++++-- .../fixtures/team/add_member_request.json | 13 -- .../fixtures/team/add_member_response.json | 12 +- testdata/fixtures/team/get_request.json | 6 - testdata/fixtures/team/get_response.json | 94 -------- .../fixtures/team/get_with_alias_request.json | 6 - .../fixtures/team/remove_member_request.json | 22 +- 9 files changed, 238 insertions(+), 158 deletions(-) delete mode 100644 testdata/fixtures/team/add_member_request.json delete mode 100644 testdata/fixtures/team/get_request.json delete mode 100644 testdata/fixtures/team/get_response.json delete mode 100644 testdata/fixtures/team/get_with_alias_request.json diff --git a/clientGQL_test.go b/clientGQL_test.go index 4ac13077..148fd5e2 100644 --- a/clientGQL_test.go +++ b/clientGQL_test.go @@ -78,11 +78,14 @@ func NewTestRequest(request string, variables string, response string) TestReque Variables: templater.ParseTemplatedString(variables), Response: templater.ParseTemplatedString(response), } + if !strings.HasPrefix(testRequest.Request, "\"") || !strings.HasSuffix(testRequest.Request, "\"") { + panic(fmt.Errorf("testRequest Request should be wrapped in quotes: '%s'", testRequest.Request)) + } if !IsValidJson(testRequest.Variables) { - panic(fmt.Errorf("testRequest Variables is not valid json: %s", testRequest.Variables)) + panic(fmt.Errorf("testRequest Variables is not valid json: '%s'", testRequest.Variables)) } if !IsValidJson(testRequest.Response) { - panic(fmt.Errorf("testRequest Response is not json: %s", testRequest.Response)) + panic(fmt.Errorf("testRequest Response is not json: '%s'", testRequest.Response)) } return testRequest } diff --git a/team.go b/team.go index b74ae45e..04f1045c 100644 --- a/team.go +++ b/team.go @@ -92,8 +92,14 @@ type TeamDeleteInput struct { Alias string `json:"alias,omitempty"` } +type TeamMembership struct { + Team TeamId `graphql:"team"` + Role string `graphql:"role"` + User UserId `graphql:"user"` +} + type TeamMembershipUserInput struct { - Email string `json:"email"` + User UserIdentifierInput `json:"user"` } type TeamMembershipCreateInput struct { @@ -221,7 +227,7 @@ func (t *Team) GetTags(client *Client, variables *PayloadVariables) (*TagConnect func BuildMembershipInput(members []string) (output []TeamMembershipUserInput) { for _, email := range members { - output = append(output, TeamMembershipUserInput{Email: email}) + output = append(output, TeamMembershipUserInput{User: UserIdentifierInput{Email: email}}) } return } @@ -290,10 +296,10 @@ func (client *Client) CreateTeam(input TeamCreateInput) (*Team, error) { return &m.Payload.Team, FormatErrors(m.Payload.Errors) } -func (client *Client) AddMembers(team *TeamId, emails []string) ([]User, error) { +func (client *Client) AddMembers(team *TeamId, emails []string) ([]TeamMembership, error) { var m struct { Payload struct { - Members []User + Members []TeamMembership `graphql:"memberships"` Errors []OpsLevelErrors } `graphql:"teamMembershipCreate(input: $input)"` } @@ -307,7 +313,7 @@ func (client *Client) AddMembers(team *TeamId, emails []string) ([]User, error) return m.Payload.Members, HandleErrors(err, m.Payload.Errors) } -func (client *Client) AddMember(team *TeamId, email string) ([]User, error) { +func (client *Client) AddMember(team *TeamId, email string) ([]TeamMembership, error) { emails := []string{email} return client.AddMembers(team, emails) } diff --git a/team_test.go b/team_test.go index d2c37ae1..e1919131 100644 --- a/team_test.go +++ b/team_test.go @@ -9,14 +9,100 @@ import ( // TODO: not sure if there is a better way to handle reusing a client // Probably should be a feature of autopilot -var getWithAliasClient *ol.Client - -func getWithAliasTestClient(t *testing.T) *ol.Client { - if getWithAliasClient == nil { - getWithAliasClient = ATestClientAlt(t, "team/get", "team/get_with_alias") - } - return getWithAliasClient -} +var testRequestWithAlias = NewTestRequest( + `"query TeamGet($alias:String!){account{team(alias: $alias){alias,id,aliases,contacts{address,displayName,id,type},group{alias,id},htmlUrl,manager{id,email,htmlUrl,name,role},members{nodes{id,email,htmlUrl,name,role},pageInfo{hasNextPage,hasPreviousPage,startCursor,endCursor},totalCount},name,responsibilities,tags{nodes{id,key,value},pageInfo{hasNextPage,hasPreviousPage,startCursor,endCursor},totalCount}}}}"`, + `{"alias":"example"}`, + `{ "data": { + "account": { + "team": { + "alias": "example", + "id": "Z2lkOi8vb3BzbGV2ZWwvVGVhbS83NzQ", + "aliases": [ + "example" + ], + "contacts": [ + { + "address": "#general", + "displayName": "", + "id": "Z2lkOi8vb3BzbGV2ZWwvQ29udGFjdC8xNTgy", + "type": "slack" + }, + { + "address": "https://example.com", + "displayName": "Homepage", + "id": "Z2lkOi8vb3BzbGV2ZWwvQ29udGFjdC8xNTgz", + "type": "web" + } + ], + "htmlUrl": "https://app.opslevel.com/teams/example", + "manager": { + "email": "john@example.com", + "htmlUrl": "https://app.opslevel.com/users/1098", + "id": "Z2lkOi8vb3BzbGV2ZWwvVXNlci8xMDk3", + "name": "John Example", + "role": "admin" + }, + "members": { + "nodes": [ + { + "email": "kyle@example.com", + "htmlUrl": "https://app.opslevel.com/users/1097", + "id": "Z2lkOiBvb38zbGV2ZWwvVXNlci8xMDk3", + "name": "Kyle Example", + "role": "admin" + }, + { + "email": "john@example.com", + "htmlUrl": "https://app.opslevel.com/users/1098", + "id": "Z2lkOi8vb3BzbGV2ZWwvVXNlci8xMDk3", + "name": "John Example", + "role": "admin" + }, + { + "email": "ken@example.com", + "htmlUrl": "https://app.opslevel.com/users/1099", + "id": "Z2lkOi7vb3BzbBV2ZWwvVXNlci8xMDk3", + "name": "Ken Example", + "role": "user" + } + ], + "pageInfo": { + "hasNextPage": false, + "hasPreviousPage": false, + "startCursor": "MQ", + "endCursor": "MQ" + } + }, + "tags": { + "nodes": [ + { + "id": "Z2lkOi8vb3BzbGV2ZWwvVGFnLzExMDg4NA", + "key": "k8s-app", + "value": "kube-dns" + }, + { + "id": "Z2lkOi8vb3BzbGV2ZWwvVGFnLzExMDg4NQ", + "key": "imported", + "value": "kubectl-opslevel" + }, + { + "id": "Z2lkOi8vb3BzbGV2ZWwvVGFnLzExMDg4Ng", + "key": "hello", + "value": "world" + } + ], + "pageInfo": { + "hasNextPage": false, + "hasPreviousPage": false, + "startCursor": "MQ", + "endCursor": "Mw" + }, + "totalCount": 3 + }, + "name": "Example", + "responsibilities": "Foo & bar" + }}}}`, +) func TestCreateTeam(t *testing.T) { // Arrange @@ -44,7 +130,102 @@ func TestCreateTeam(t *testing.T) { func TestGetTeam(t *testing.T) { // Arrange - client := ATestClient(t, "team/get") + testRequest := NewTestRequest( + `"query TeamGet($id:ID!){account{team(id: $id){alias,id,aliases,contacts{address,displayName,id,type},group{alias,id},htmlUrl,manager{id,email,htmlUrl,name,role},members{nodes{id,email,htmlUrl,name,role},pageInfo{hasNextPage,hasPreviousPage,startCursor,endCursor},totalCount},name,responsibilities,tags{nodes{id,key,value},pageInfo{hasNextPage,hasPreviousPage,startCursor,endCursor},totalCount}}}}"`, + `{ "id":"Z2lkOi8vb3BzbGV2ZWwvVGVhbS83NzQ" }`, + `{ "data": { + "account": { + "team": { + "alias": "example", + "id": "Z2lkOi8vb3BzbGV2ZWwvVGVhbS83NzQ", + "aliases": [ + "example" + ], + "contacts": [ + { + "address": "#general", + "displayName": "", + "id": "Z2lkOi8vb3BzbGV2ZWwvQ29udGFjdC8xNTgy", + "type": "slack" + }, + { + "address": "https://example.com", + "displayName": "Homepage", + "id": "Z2lkOi8vb3BzbGV2ZWwvQ29udGFjdC8xNTgz", + "type": "web" + } + ], + "htmlUrl": "https://app.opslevel.com/teams/example", + "manager": { + "email": "john@example.com", + "htmlUrl": "https://app.opslevel.com/users/1098", + "id": "Z2lkOi8vb3BzbGV2ZWwvVXNlci8xMDk3", + "name": "John Example", + "role": "admin" + }, + "members": { + "nodes": [ + { + "email": "kyle@example.com", + "htmlUrl": "https://app.opslevel.com/users/1097", + "id": "Z2lkOiBvb38zbGV2ZWwvVXNlci8xMDk3", + "name": "Kyle Example", + "role": "admin" + }, + { + "email": "john@example.com", + "htmlUrl": "https://app.opslevel.com/users/1098", + "id": "Z2lkOi8vb3BzbGV2ZWwvVXNlci8xMDk3", + "name": "John Example", + "role": "admin" + }, + { + "email": "ken@example.com", + "htmlUrl": "https://app.opslevel.com/users/1099", + "id": "Z2lkOi7vb3BzbBV2ZWwvVXNlci8xMDk3", + "name": "Ken Example", + "role": "user" + } + ], + "pageInfo": { + "hasNextPage": false, + "hasPreviousPage": false, + "startCursor": "MQ", + "endCursor": "MQ" + } + }, + "tags": { + "nodes": [ + { + "id": "Z2lkOi8vb3BzbGV2ZWwvVGFnLzExMDg4NA", + "key": "k8s-app", + "value": "kube-dns" + }, + { + "id": "Z2lkOi8vb3BzbGV2ZWwvVGFnLzExMDg4NQ", + "key": "imported", + "value": "kubectl-opslevel" + }, + { + "id": "Z2lkOi8vb3BzbGV2ZWwvVGFnLzExMDg4Ng", + "key": "hello", + "value": "world" + } + ], + "pageInfo": { + "hasNextPage": false, + "hasPreviousPage": false, + "startCursor": "MQ", + "endCursor": "Mw" + }, + "totalCount": 3 + }, + "name": "Example", + "responsibilities": "Foo & bar" + }}}}`, + ) + + client := BestTestClient(t, "team/get", testRequest) // Act result, err := client.GetTeam("Z2lkOi8vb3BzbGV2ZWwvVGVhbS83NzQ") // Assert @@ -119,7 +300,7 @@ func TestTeamTags(t *testing.T) { func TestGetTeamWithAlias(t *testing.T) { // Arrange - client := getWithAliasTestClient(t) + client := BestTestClient(t, "team/get_with_alias", testRequestWithAlias) // Act result, err := client.GetTeamWithAlias("example") // Assert @@ -502,11 +683,18 @@ func TestDeleteTeamWithAlias(t *testing.T) { func TestTeamAddMember(t *testing.T) { // Arrange - client1 := getWithAliasTestClient(t) - client2 := ATestClient(t, "team/add_member") + testRequestWithTeamId := NewTestRequest( + `"mutation TeamMembershipCreate($input:TeamMembershipCreateInput!){teamMembershipCreate(input: $input){memberships{team{alias,id},role,user{id,email}},errors{message,path}}}"`, + `{"input": {"teamId": "Z2lkOi8vb3BzbGV2ZWwvVGVhbS83NzQ", "members": [ {"user": {"email": "john@example.com"}} ] }}`, + `{"data": {"teamMembershipCreate": {"memberships": [ {"user": {"id": "Z2lkOi8vb3BzbGV2ZWwvVXNlci8zMDY4", "email": "john@example.com"}, "role": "admin"} ], "errors": [] }}}`, + ) + + clientWithTeamId := BestTestClient(t, "team/add_member", testRequestWithTeamId) + clientWithAlias := BestTestClient(t, "team/get_with_alias_add_member", testRequestWithAlias) + // Act - team, _ := client1.GetTeamWithAlias("example") - result, err := client2.AddMember(&team.TeamId, "john@example.com") + team, _ := clientWithAlias.GetTeamWithAlias("example") + result, err := clientWithTeamId.AddMember(&team.TeamId, "john@example.com") // Assert autopilot.Ok(t, err) autopilot.Equals(t, 1, len(result)) @@ -514,7 +702,7 @@ func TestTeamAddMember(t *testing.T) { func TestTeamRemoveMember(t *testing.T) { // Arrange - client1 := getWithAliasTestClient(t) + client1 := BestTestClient(t, "team/get_with_alias_rm_member", testRequestWithAlias) client2 := ATestClient(t, "team/remove_member") // Act team, _ := client1.GetTeamWithAlias("example") @@ -526,7 +714,7 @@ func TestTeamRemoveMember(t *testing.T) { func TestTeamAddContact(t *testing.T) { // Arrange - client1 := getWithAliasTestClient(t) + client1 := BestTestClient(t, "team/get_with_alias_add_contact", testRequestWithAlias) client2 := ATestClient(t, "team/add_contact") // Act team, _ := client1.GetTeamWithAlias("example") diff --git a/testdata/fixtures/team/add_member_request.json b/testdata/fixtures/team/add_member_request.json deleted file mode 100644 index 8ffca0a5..00000000 --- a/testdata/fixtures/team/add_member_request.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "query":"mutation TeamMembershipCreate($input:TeamMembershipCreateInput!){teamMembershipCreate(input: $input){members{id,email,htmlUrl,name,role},errors{message,path}}}", - "variables":{ - "input":{ - "teamId":"Z2lkOi8vb3BzbGV2ZWwvVGVhbS83NzQ", - "members":[ - { - "email":"john@example.com" - } - ] - } - } -} \ No newline at end of file diff --git a/testdata/fixtures/team/add_member_response.json b/testdata/fixtures/team/add_member_response.json index f29413e7..c2fe398f 100644 --- a/testdata/fixtures/team/add_member_response.json +++ b/testdata/fixtures/team/add_member_response.json @@ -1,16 +1,16 @@ { "data": { "teamMembershipCreate": { - "members": [ + "memberships": [ { - "email": "john@example.com", - "htmlUrl": "https://app.opslevel.com/users/3068", - "id": "Z2lkOi8vb3BzbGV2ZWwvVXNlci8zMDY4", - "name": "John", + "user": { + "id": "Z2lkOi8vb3BzbGV2ZWwvVXNlci8zMDY4", + "email": "john@example.com" + }, "role": "admin" } ], "errors": [] } } -} \ No newline at end of file +} diff --git a/testdata/fixtures/team/get_request.json b/testdata/fixtures/team/get_request.json deleted file mode 100644 index cc821efc..00000000 --- a/testdata/fixtures/team/get_request.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "query":"query TeamGet($id:ID!){account{team(id: $id){alias,id,aliases,contacts{address,displayName,id,type},group{alias,id},htmlUrl,manager{id,email,htmlUrl,name,role},members{nodes{id,email,htmlUrl,name,role},pageInfo{hasNextPage,hasPreviousPage,startCursor,endCursor},totalCount},name,responsibilities,tags{nodes{id,key,value},pageInfo{hasNextPage,hasPreviousPage,startCursor,endCursor},totalCount}}}}", - "variables":{ - "id":"Z2lkOi8vb3BzbGV2ZWwvVGVhbS83NzQ" - } -} \ No newline at end of file diff --git a/testdata/fixtures/team/get_response.json b/testdata/fixtures/team/get_response.json deleted file mode 100644 index a6a3281a..00000000 --- a/testdata/fixtures/team/get_response.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "data": { - "account": { - "team": { - "alias": "example", - "id": "Z2lkOi8vb3BzbGV2ZWwvVGVhbS83NzQ", - "aliases": [ - "example" - ], - "contacts": [ - { - "address": "#general", - "displayName": "", - "id": "Z2lkOi8vb3BzbGV2ZWwvQ29udGFjdC8xNTgy", - "type": "slack" - }, - { - "address": "https://example.com", - "displayName": "Homepage", - "id": "Z2lkOi8vb3BzbGV2ZWwvQ29udGFjdC8xNTgz", - "type": "web" - } - ], - "htmlUrl": "https://app.opslevel.com/teams/example", - "manager": { - "email": "john@example.com", - "htmlUrl": "https://app.opslevel.com/users/1098", - "id": "Z2lkOi8vb3BzbGV2ZWwvVXNlci8xMDk3", - "name": "John Example", - "role": "admin" - }, - "members": { - "nodes": [ - { - "email": "kyle@example.com", - "htmlUrl": "https://app.opslevel.com/users/1097", - "id": "Z2lkOiBvb38zbGV2ZWwvVXNlci8xMDk3", - "name": "Kyle Example", - "role": "admin" - }, - { - "email": "john@example.com", - "htmlUrl": "https://app.opslevel.com/users/1098", - "id": "Z2lkOi8vb3BzbGV2ZWwvVXNlci8xMDk3", - "name": "John Example", - "role": "admin" - }, - { - "email": "ken@example.com", - "htmlUrl": "https://app.opslevel.com/users/1099", - "id": "Z2lkOi7vb3BzbBV2ZWwvVXNlci8xMDk3", - "name": "Ken Example", - "role": "user" - } - ], - "pageInfo": { - "hasNextPage": false, - "hasPreviousPage": false, - "startCursor": "MQ", - "endCursor": "MQ" - } - }, - "tags": { - "nodes": [ - { - "id": "Z2lkOi8vb3BzbGV2ZWwvVGFnLzExMDg4NA", - "key": "k8s-app", - "value": "kube-dns" - }, - { - "id": "Z2lkOi8vb3BzbGV2ZWwvVGFnLzExMDg4NQ", - "key": "imported", - "value": "kubectl-opslevel" - }, - { - "id": "Z2lkOi8vb3BzbGV2ZWwvVGFnLzExMDg4Ng", - "key": "hello", - "value": "world" - } - ], - "pageInfo": { - "hasNextPage": false, - "hasPreviousPage": false, - "startCursor": "MQ", - "endCursor": "Mw" - }, - "totalCount": 3 - }, - "name": "Example", - "responsibilities": "Foo & bar" - } - } - } -} \ No newline at end of file diff --git a/testdata/fixtures/team/get_with_alias_request.json b/testdata/fixtures/team/get_with_alias_request.json deleted file mode 100644 index 5920e981..00000000 --- a/testdata/fixtures/team/get_with_alias_request.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "query":"query TeamGet($alias:String!){account{team(alias: $alias){alias,id,aliases,contacts{address,displayName,id,type},group{alias,id},htmlUrl,manager{id,email,htmlUrl,name,role},members{nodes{id,email,htmlUrl,name,role},pageInfo{hasNextPage,hasPreviousPage,startCursor,endCursor},totalCount},name,responsibilities,tags{nodes{id,key,value},pageInfo{hasNextPage,hasPreviousPage,startCursor,endCursor},totalCount}}}}", - "variables":{ - "alias":"example" - } -} \ No newline at end of file diff --git a/testdata/fixtures/team/remove_member_request.json b/testdata/fixtures/team/remove_member_request.json index 77cc140c..a3ac29ac 100644 --- a/testdata/fixtures/team/remove_member_request.json +++ b/testdata/fixtures/team/remove_member_request.json @@ -1,13 +1,15 @@ { - "query":"mutation TeamMembershipDelete($input:TeamMembershipDeleteInput!){teamMembershipDelete(input: $input){deletedMembers{id,email,htmlUrl,name,role},errors{message,path}}}", - "variables":{ - "input":{ - "teamId":"Z2lkOi8vb3BzbGV2ZWwvVGVhbS83NzQ", - "members":[ - { - "email":"john@example.com" - } - ] + "query": "mutation TeamMembershipDelete($input:TeamMembershipDeleteInput!){teamMembershipDelete(input: $input){deletedMembers{id,email,htmlUrl,name,role},errors{message,path}}}", + "variables": { + "input": { + "teamId": "Z2lkOi8vb3BzbGV2ZWwvVGVhbS83NzQ", + "members": [ + { + "user": { + "email": "john@example.com" + } } + ] } -} \ No newline at end of file + } +} From 539af032c855e9ecb22c4171888363c12bc993f0 Mon Sep 17 00:00:00 2001 From: David Bloss Date: Fri, 13 Oct 2023 13:27:20 -0500 Subject: [PATCH 2/3] add changie log --- .changes/unreleased/Deprecated-20231013-132710.yaml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .changes/unreleased/Deprecated-20231013-132710.yaml diff --git a/.changes/unreleased/Deprecated-20231013-132710.yaml b/.changes/unreleased/Deprecated-20231013-132710.yaml new file mode 100644 index 00000000..57c9ea70 --- /dev/null +++ b/.changes/unreleased/Deprecated-20231013-132710.yaml @@ -0,0 +1,3 @@ +kind: Deprecated +body: TeamMembershipUserInput Email field replaced with User field +time: 2023-10-13T13:27:10.249548-05:00 From 727a603f36f07e9543730006851434ede02b36e1 Mon Sep 17 00:00:00 2001 From: David Bloss Date: Fri, 13 Oct 2023 14:43:34 -0500 Subject: [PATCH 3/3] Update .changes/unreleased/Deprecated-20231013-132710.yaml Co-authored-by: taimoor ahmad <139589712+taimoor-at-opslevel@users.noreply.github.com> --- .changes/unreleased/Deprecated-20231013-132710.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changes/unreleased/Deprecated-20231013-132710.yaml b/.changes/unreleased/Deprecated-20231013-132710.yaml index 57c9ea70..bf056a35 100644 --- a/.changes/unreleased/Deprecated-20231013-132710.yaml +++ b/.changes/unreleased/Deprecated-20231013-132710.yaml @@ -1,3 +1,3 @@ kind: Deprecated -body: TeamMembershipUserInput Email field replaced with User field +body: BREAKING CHANGE: TeamMembershipUserInput Email field replaced with User field time: 2023-10-13T13:27:10.249548-05:00