226 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			226 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
package teams
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"net/http"
 | 
						|
	"net/http/httptest"
 | 
						|
	"reflect"
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/sirupsen/logrus"
 | 
						|
)
 | 
						|
 | 
						|
var (
 | 
						|
	logger = logrus.New().WithField("pkg", "teamsapi")
 | 
						|
	token  = "ec45b1cfbe7100c6315d183a3eb6cec0M2U1LWJkMzEtZDgzNzNmZGQyNGM3IiwiYXV0aF90aW1lIjoxNDkzNzMwNzQ1LCJpc3MiOiJodHRwcz"
 | 
						|
)
 | 
						|
 | 
						|
var teamsAPItc = []struct {
 | 
						|
	in     string
 | 
						|
	inCode int
 | 
						|
	out    *Team
 | 
						|
	err    error
 | 
						|
}{
 | 
						|
	{`{
 | 
						|
"dn": "cn=100100,ou=official,ou=foobar,dc=zalando,dc=net",
 | 
						|
"id": "acid",
 | 
						|
"id_name": "ACID",
 | 
						|
"team_id": "111222",
 | 
						|
"type": "official",
 | 
						|
"name": "Acid team name",
 | 
						|
"mail": [
 | 
						|
"email1@example.com",
 | 
						|
"email2@example.com"
 | 
						|
],
 | 
						|
"alias": [
 | 
						|
"acid"
 | 
						|
],
 | 
						|
"member": [
 | 
						|
  "member1",
 | 
						|
  "member2",
 | 
						|
  "member3"
 | 
						|
],
 | 
						|
"infrastructure-accounts": [
 | 
						|
{
 | 
						|
  "id": "1234512345",
 | 
						|
  "name": "acid",
 | 
						|
  "provider": "aws",
 | 
						|
  "type": "aws",
 | 
						|
  "description": "",
 | 
						|
  "owner": "acid",
 | 
						|
  "owner_dn": "cn=100100,ou=official,ou=foobar,dc=zalando,dc=net",
 | 
						|
  "disabled": false
 | 
						|
},
 | 
						|
{
 | 
						|
  "id": "5432154321",
 | 
						|
  "name": "db",
 | 
						|
  "provider": "aws",
 | 
						|
  "type": "aws",
 | 
						|
  "description": "",
 | 
						|
  "owner": "acid",
 | 
						|
  "owner_dn": "cn=100100,ou=official,ou=foobar,dc=zalando,dc=net",
 | 
						|
  "disabled": false
 | 
						|
}
 | 
						|
],
 | 
						|
"cost_center": "00099999",
 | 
						|
"delivery_lead": "member4",
 | 
						|
"parent_team_id": "111221"
 | 
						|
}`,
 | 
						|
		200,
 | 
						|
		&Team{
 | 
						|
			Dn:           "cn=100100,ou=official,ou=foobar,dc=zalando,dc=net",
 | 
						|
			ID:           "acid",
 | 
						|
			TeamName:     "ACID",
 | 
						|
			TeamID:       "111222",
 | 
						|
			Type:         "official",
 | 
						|
			FullName:     "Acid team name",
 | 
						|
			Aliases:      []string{"acid"},
 | 
						|
			Mails:        []string{"email1@example.com", "email2@example.com"},
 | 
						|
			Members:      []string{"member1", "member2", "member3"},
 | 
						|
			CostCenter:   "00099999",
 | 
						|
			DeliveryLead: "member4",
 | 
						|
			ParentTeamID: "111221",
 | 
						|
			InfrastructureAccounts: []infrastructureAccount{
 | 
						|
				{
 | 
						|
					ID:          "1234512345",
 | 
						|
					Name:        "acid",
 | 
						|
					Provider:    "aws",
 | 
						|
					Type:        "aws",
 | 
						|
					Description: "",
 | 
						|
					Owner:       "acid",
 | 
						|
					OwnerDn:     "cn=100100,ou=official,ou=foobar,dc=zalando,dc=net",
 | 
						|
					Disabled:    false},
 | 
						|
				{
 | 
						|
					ID:          "5432154321",
 | 
						|
					Name:        "db",
 | 
						|
					Provider:    "aws",
 | 
						|
					Type:        "aws",
 | 
						|
					Description: "",
 | 
						|
					Owner:       "acid",
 | 
						|
					OwnerDn:     "cn=100100,ou=official,ou=foobar,dc=zalando,dc=net",
 | 
						|
					Disabled:    false},
 | 
						|
			},
 | 
						|
		},
 | 
						|
		nil}, {
 | 
						|
		`{"error": "Access Token not valid"}`,
 | 
						|
		401,
 | 
						|
		nil,
 | 
						|
		fmt.Errorf(`team API query failed with status code 401 and message: '"Access Token not valid"'`),
 | 
						|
	},
 | 
						|
	{
 | 
						|
		`{"status": "I'm a teapot'"}`,
 | 
						|
		418,
 | 
						|
		nil,
 | 
						|
		fmt.Errorf(`team API query failed with status code 418`),
 | 
						|
	},
 | 
						|
	{
 | 
						|
		`{"status": "I'm a teapot`,
 | 
						|
		418,
 | 
						|
		nil,
 | 
						|
		fmt.Errorf(`team API query failed with status code 418 and malformed response: unexpected EOF`),
 | 
						|
	},
 | 
						|
	{
 | 
						|
		`{"status": "I'm a teapot`,
 | 
						|
		200,
 | 
						|
		nil,
 | 
						|
		fmt.Errorf(`could not parse team API response: unexpected EOF`),
 | 
						|
	},
 | 
						|
}
 | 
						|
 | 
						|
var requestsURLtc = []struct {
 | 
						|
	url string
 | 
						|
	err error
 | 
						|
}{
 | 
						|
	{
 | 
						|
		"coffee://localhost/",
 | 
						|
		fmt.Errorf(`Get coffee://localhost/teams/acid: unsupported protocol scheme "coffee"`),
 | 
						|
	},
 | 
						|
	{
 | 
						|
		"http://192.168.0.%31/",
 | 
						|
		fmt.Errorf(`parse http://192.168.0.%%31/teams/acid: invalid URL escape "%%31"`),
 | 
						|
	},
 | 
						|
}
 | 
						|
 | 
						|
func TestInfo(t *testing.T) {
 | 
						|
	for _, tc := range teamsAPItc {
 | 
						|
		func() {
 | 
						|
			ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 | 
						|
				if r.Header.Get("Authorization") != "Bearer "+token {
 | 
						|
					t.Errorf("authorization token is wrong or not provided")
 | 
						|
				}
 | 
						|
				w.WriteHeader(tc.inCode)
 | 
						|
				if _, err := fmt.Fprint(w, tc.in); err != nil {
 | 
						|
					t.Errorf("error writing teams api response %v", err)
 | 
						|
				}
 | 
						|
			}))
 | 
						|
			defer ts.Close()
 | 
						|
			api := NewTeamsAPI(ts.URL, logger)
 | 
						|
 | 
						|
			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
 | 
						|
			}
 | 
						|
 | 
						|
			if !reflect.DeepEqual(actual, tc.out) {
 | 
						|
				t.Errorf("expected %#v, got: %#v", tc.out, actual)
 | 
						|
			}
 | 
						|
		}()
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
type mockHTTPClient struct {
 | 
						|
}
 | 
						|
 | 
						|
type mockBody struct {
 | 
						|
}
 | 
						|
 | 
						|
func (b *mockBody) Read(p []byte) (n int, err error) {
 | 
						|
	return 2, nil
 | 
						|
}
 | 
						|
 | 
						|
func (b *mockBody) Close() error {
 | 
						|
	return fmt.Errorf("close error")
 | 
						|
}
 | 
						|
 | 
						|
func (c *mockHTTPClient) Do(req *http.Request) (*http.Response, error) {
 | 
						|
	resp := http.Response{
 | 
						|
		Status:        "200 OK",
 | 
						|
		StatusCode:    200,
 | 
						|
		ContentLength: 2,
 | 
						|
		Close:         false,
 | 
						|
		Request:       req,
 | 
						|
	}
 | 
						|
	resp.Body = &mockBody{}
 | 
						|
 | 
						|
	return &resp, nil
 | 
						|
}
 | 
						|
 | 
						|
func TestHttpClientClose(t *testing.T) {
 | 
						|
	ts := httptest.NewServer(nil)
 | 
						|
 | 
						|
	api := NewTeamsAPI(ts.URL, logger)
 | 
						|
	api.httpClient = &mockHTTPClient{}
 | 
						|
 | 
						|
	_, 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)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func TestRequest(t *testing.T) {
 | 
						|
	for _, tc := range requestsURLtc {
 | 
						|
		api := NewTeamsAPI(tc.url, logger)
 | 
						|
		resp, err := api.TeamInfo("acid", token)
 | 
						|
		if resp != nil {
 | 
						|
			t.Errorf("response expected to be nil")
 | 
						|
			continue
 | 
						|
		}
 | 
						|
 | 
						|
		if err.Error() != tc.err.Error() {
 | 
						|
			t.Errorf("expected error: %v, got: %v", tc.err, err)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |