Skip to content

Commit

Permalink
Merge pull request #272 from OpsLevel/db/update-deprecated-team-membe…
Browse files Browse the repository at this point in the history
…rship-fields

replace TeamMembershipUserInput email field with user field, update t…
  • Loading branch information
davidbloss authored Oct 13, 2023
2 parents d0339a8 + 727a603 commit 1139daf
Show file tree
Hide file tree
Showing 10 changed files with 241 additions and 158 deletions.
3 changes: 3 additions & 0 deletions .changes/unreleased/Deprecated-20231013-132710.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
kind: Deprecated
body: BREAKING CHANGE: TeamMembershipUserInput Email field replaced with User field
time: 2023-10-13T13:27:10.249548-05:00
7 changes: 5 additions & 2 deletions clientGQL_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down
16 changes: 11 additions & 5 deletions team.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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)"`
}
Expand All @@ -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)
}
Expand Down
220 changes: 204 additions & 16 deletions team_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -502,19 +683,26 @@ 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))
}

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")
Expand All @@ -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")
Expand Down
13 changes: 0 additions & 13 deletions testdata/fixtures/team/add_member_request.json

This file was deleted.

12 changes: 6 additions & 6 deletions testdata/fixtures/team/add_member_response.json
Original file line number Diff line number Diff line change
@@ -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": []
}
}
}
}
6 changes: 0 additions & 6 deletions testdata/fixtures/team/get_request.json

This file was deleted.

Loading

0 comments on commit 1139daf

Please sign in to comment.