add unit test for 404 at team members
This commit is contained in:
		
							parent
							
								
									e912cb654e
								
							
						
					
					
						commit
						4744d601bc
					
				| 
						 | 
				
			
			@ -194,8 +194,8 @@ type mockTeamsAPIClient struct {
 | 
			
		|||
	members []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *mockTeamsAPIClient) TeamInfo(teamID, token string) (tm *teams.Team, err error) {
 | 
			
		||||
	return &teams.Team{Members: m.members}, nil
 | 
			
		||||
func (m *mockTeamsAPIClient) TeamInfo(teamID, token string) (tm *teams.Team, statusCode int, err error) {
 | 
			
		||||
	return &teams.Team{Members: m.members}, statusCode, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *mockTeamsAPIClient) setMembers(members []string) {
 | 
			
		||||
| 
						 | 
				
			
			@ -260,15 +260,15 @@ type mockTeamsAPIClientMultipleTeams struct {
 | 
			
		|||
	teams []mockTeam
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *mockTeamsAPIClientMultipleTeams) TeamInfo(teamID, token string) (tm *teams.Team, err error) {
 | 
			
		||||
func (m *mockTeamsAPIClientMultipleTeams) TeamInfo(teamID, token string) (tm *teams.Team, statusCode int, err error) {
 | 
			
		||||
	for _, team := range m.teams {
 | 
			
		||||
		if team.teamID == teamID {
 | 
			
		||||
			return &teams.Team{Members: team.members}, nil
 | 
			
		||||
			return &teams.Team{Members: team.members}, statusCode, nil
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// should not be reached if a slice with teams is populated correctly
 | 
			
		||||
	return nil, nil
 | 
			
		||||
	return nil, statusCode, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Test adding members of maintenance teams that get superuser rights for all PG databases
 | 
			
		||||
| 
						 | 
				
			
			@ -302,12 +302,6 @@ func TestInitHumanUsersWithSuperuserTeams(t *testing.T) {
 | 
			
		|||
		isPostgresSuperuserTeam: true,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	teamC := mockTeam{
 | 
			
		||||
		teamID:                  "",
 | 
			
		||||
		members:                 []string{""},
 | 
			
		||||
		isPostgresSuperuserTeam: true,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	userB := spec.PgUser{
 | 
			
		||||
		Name:     "postgres_admin",
 | 
			
		||||
		Origin:   spec.RoleOriginTeamsAPI,
 | 
			
		||||
| 
						 | 
				
			
			@ -340,7 +334,7 @@ func TestInitHumanUsersWithSuperuserTeams(t *testing.T) {
 | 
			
		|||
			ownerTeam:      "test",
 | 
			
		||||
			existingRoles:  map[string]spec.PgUser{},
 | 
			
		||||
			superuserTeams: []string{"postgres_superusers", "postgres_admins"},
 | 
			
		||||
			teams:          []mockTeam{teamA, teamB, teamC, teamTest},
 | 
			
		||||
			teams:          []mockTeam{teamA, teamB, teamTest},
 | 
			
		||||
			result: map[string]spec.PgUser{
 | 
			
		||||
				"postgres_superuser": userA,
 | 
			
		||||
				"postgres_admin":     userB,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -272,9 +272,14 @@ func (c *Cluster) getTeamMembers(teamID string) ([]string, error) {
 | 
			
		|||
		return nil, fmt.Errorf("could not get oauth token to authenticate to team service API: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	teamInfo, err := c.teamsAPIClient.TeamInfo(teamID, token)
 | 
			
		||||
	teamInfo, statusCode, err := c.teamsAPIClient.TeamInfo(teamID, token)
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		if statusCode == 404 {
 | 
			
		||||
			c.logger.Warningf("could not get team info for team %q: %v", teamID, err)
 | 
			
		||||
		} else {
 | 
			
		||||
			return nil, fmt.Errorf("could not get team info for team %q: %v", teamID, err)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		for _, member := range teamInfo.Members {
 | 
			
		||||
			if !(util.SliceContains(members, member)) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,7 +45,7 @@ type httpClient interface {
 | 
			
		|||
 | 
			
		||||
// Interface to the TeamsAPIClient
 | 
			
		||||
type Interface interface {
 | 
			
		||||
	TeamInfo(teamID, token string) (tm *Team, err error)
 | 
			
		||||
	TeamInfo(teamID, token string) (tm *Team, statusCode int, err error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// API describes teams API
 | 
			
		||||
| 
						 | 
				
			
			@ -67,7 +67,7 @@ func NewTeamsAPI(url string, log *logrus.Entry) *API {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// TeamInfo returns information about a given team using its ID and a token to authenticate to the API service.
 | 
			
		||||
func (t *API) TeamInfo(teamID, token string) (tm *Team, err error) {
 | 
			
		||||
func (t *API) TeamInfo(teamID, token string) (tm *Team, statusCode int, err error) {
 | 
			
		||||
	var (
 | 
			
		||||
		req  *http.Request
 | 
			
		||||
		resp *http.Response
 | 
			
		||||
| 
						 | 
				
			
			@ -77,37 +77,38 @@ func (t *API) TeamInfo(teamID, token string) (tm *Team, err error) {
 | 
			
		|||
	t.logger.Debugf("request url: %s", url)
 | 
			
		||||
	req, err = http.NewRequest("GET", url, nil)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
		return nil, http.StatusBadRequest, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	req.Header.Add("Authorization", "Bearer "+token)
 | 
			
		||||
	if resp, err = t.httpClient.Do(req); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
		return nil, http.StatusUnauthorized, err
 | 
			
		||||
	}
 | 
			
		||||
	defer func() {
 | 
			
		||||
		if closeErr := resp.Body.Close(); closeErr != nil {
 | 
			
		||||
			err = fmt.Errorf("error when closing response: %v", closeErr)
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
	if resp.StatusCode != 200 {
 | 
			
		||||
	statusCode = resp.StatusCode
 | 
			
		||||
	if statusCode != http.StatusOK {
 | 
			
		||||
		var raw map[string]json.RawMessage
 | 
			
		||||
		d := json.NewDecoder(resp.Body)
 | 
			
		||||
		err = d.Decode(&raw)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, fmt.Errorf("team API query failed with status code %d and malformed response: %v", resp.StatusCode, err)
 | 
			
		||||
			return nil, statusCode, fmt.Errorf("team API query failed with status code %d and malformed response: %v", statusCode, err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if errMessage, ok := raw["error"]; ok {
 | 
			
		||||
			return nil, fmt.Errorf("team API query failed with status code %d and message: '%v'", resp.StatusCode, string(errMessage))
 | 
			
		||||
			return nil, statusCode, fmt.Errorf("team API query failed with status code %d and message: '%v'", statusCode, string(errMessage))
 | 
			
		||||
		}
 | 
			
		||||
		return nil, fmt.Errorf("team API query failed with status code %d", resp.StatusCode)
 | 
			
		||||
		return nil, statusCode, fmt.Errorf("team API query failed with status code %d", statusCode)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tm = &Team{}
 | 
			
		||||
	d := json.NewDecoder(resp.Body)
 | 
			
		||||
	if err = d.Decode(tm); err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("could not parse team API response: %v", err)
 | 
			
		||||
		return nil, statusCode, fmt.Errorf("could not parse team API response: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return tm, nil
 | 
			
		||||
	return tm, statusCode, nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,15 +13,7 @@ import (
 | 
			
		|||
var (
 | 
			
		||||
	logger = logrus.New().WithField("pkg", "teamsapi")
 | 
			
		||||
	token  = "ec45b1cfbe7100c6315d183a3eb6cec0M2U1LWJkMzEtZDgzNzNmZGQyNGM3IiwiYXV0aF90aW1lIjoxNDkzNzMwNzQ1LCJpc3MiOiJodHRwcz"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var teamsAPItc = []struct {
 | 
			
		||||
	in     string
 | 
			
		||||
	inCode int
 | 
			
		||||
	out    *Team
 | 
			
		||||
	err    error
 | 
			
		||||
}{
 | 
			
		||||
	{`{
 | 
			
		||||
	input  = `{
 | 
			
		||||
	"dn": "cn=100100,ou=official,ou=foobar,dc=zalando,dc=net",
 | 
			
		||||
	"id": "acid",
 | 
			
		||||
	"id_name": "acid",
 | 
			
		||||
| 
						 | 
				
			
			@ -65,7 +57,16 @@ var teamsAPItc = []struct {
 | 
			
		|||
	"cost_center": "00099999",
 | 
			
		||||
	"delivery_lead": "member4",
 | 
			
		||||
	"parent_team_id": "111221"
 | 
			
		||||
}`,
 | 
			
		||||
	}`
 | 
			
		||||
)
 | 
			
		||||
var teamsAPItc = []struct {
 | 
			
		||||
	in     string
 | 
			
		||||
	inCode int
 | 
			
		||||
	out    *Team
 | 
			
		||||
	err    error
 | 
			
		||||
}{
 | 
			
		||||
	{
 | 
			
		||||
		input,
 | 
			
		||||
		200,
 | 
			
		||||
		&Team{
 | 
			
		||||
			Dn:           "cn=100100,ou=official,ou=foobar,dc=zalando,dc=net",
 | 
			
		||||
| 
						 | 
				
			
			@ -125,6 +126,12 @@ var teamsAPItc = []struct {
 | 
			
		|||
		nil,
 | 
			
		||||
		fmt.Errorf(`could not parse team API response: unexpected EOF`),
 | 
			
		||||
	},
 | 
			
		||||
	{
 | 
			
		||||
		input,
 | 
			
		||||
		404,
 | 
			
		||||
		nil,
 | 
			
		||||
		fmt.Errorf(`team API query failed with status code 404`),
 | 
			
		||||
	},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var requestsURLtc = []struct {
 | 
			
		||||
| 
						 | 
				
			
			@ -156,7 +163,7 @@ func TestInfo(t *testing.T) {
 | 
			
		|||
			defer ts.Close()
 | 
			
		||||
			api := NewTeamsAPI(ts.URL, logger)
 | 
			
		||||
 | 
			
		||||
			actual, err := api.TeamInfo("acid", token)
 | 
			
		||||
			actual, _, err := api.TeamInfo("acid", token)
 | 
			
		||||
			if err != nil && err.Error() != tc.err.Error() {
 | 
			
		||||
				t.Errorf("expected error: %v, got: %v", tc.err, err)
 | 
			
		||||
				return
 | 
			
		||||
| 
						 | 
				
			
			@ -165,6 +172,16 @@ func TestInfo(t *testing.T) {
 | 
			
		|||
			if !reflect.DeepEqual(actual, tc.out) {
 | 
			
		||||
				t.Errorf("expected %#v, got: %#v", tc.out, actual)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			_, statusCode, err := api.TeamInfo("sqlserver", token)
 | 
			
		||||
			if err != nil && err.Error() != tc.err.Error() {
 | 
			
		||||
				t.Errorf("expected error: %v, got: %v", tc.err, err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if statusCode != tc.inCode {
 | 
			
		||||
				t.Errorf("expected %d, got: %d", tc.inCode, statusCode)
 | 
			
		||||
			}
 | 
			
		||||
		}()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -202,7 +219,7 @@ func TestHttpClientClose(t *testing.T) {
 | 
			
		|||
	api := NewTeamsAPI(ts.URL, logger)
 | 
			
		||||
	api.httpClient = &mockHTTPClient{}
 | 
			
		||||
 | 
			
		||||
	_, err := api.TeamInfo("acid", token)
 | 
			
		||||
	_, _, err := api.TeamInfo("acid", token)
 | 
			
		||||
	expError := fmt.Errorf("error when closing response: close error")
 | 
			
		||||
	if err.Error() != expError.Error() {
 | 
			
		||||
		t.Errorf("expected error: %v, got: %v", expError, err)
 | 
			
		||||
| 
						 | 
				
			
			@ -212,7 +229,7 @@ func TestHttpClientClose(t *testing.T) {
 | 
			
		|||
func TestRequest(t *testing.T) {
 | 
			
		||||
	for _, tc := range requestsURLtc {
 | 
			
		||||
		api := NewTeamsAPI(tc.url, logger)
 | 
			
		||||
		resp, err := api.TeamInfo("acid", token)
 | 
			
		||||
		resp, _, err := api.TeamInfo("acid", token)
 | 
			
		||||
		if resp != nil {
 | 
			
		||||
			t.Errorf("response expected to be nil")
 | 
			
		||||
			continue
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue