package jira import ( "bytes" "fmt" "io/ioutil" "net/http" "reflect" "testing" ) func TestAuthenticationService_AcquireSessionCookie_Failure(t *testing.T) { setup() defer teardown() testMux.HandleFunc("/rest/auth/1/session", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testRequestURL(t, r, "/rest/auth/1/session") b, err := ioutil.ReadAll(r.Body) if err != nil { t.Errorf("Error in read body: %s", err) } if bytes.Index(b, []byte(`"username":"foo"`)) < 0 { t.Error("No username found") } if bytes.Index(b, []byte(`"password":"bar"`)) < 0 { t.Error("No password found") } // Emulate error w.WriteHeader(http.StatusInternalServerError) }) res, err := testClient.Authentication.AcquireSessionCookie("foo", "bar") if err == nil { t.Errorf("Expected error, but no error given") } if res == true { t.Error("Expected error, but result was true") } if testClient.Authentication.Authenticated() != false { t.Error("Expected false, but result was true") } } func TestAuthenticationService_AcquireSessionCookie_Success(t *testing.T) { setup() defer teardown() testMux.HandleFunc("/rest/auth/1/session", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "POST") testRequestURL(t, r, "/rest/auth/1/session") b, err := ioutil.ReadAll(r.Body) if err != nil { t.Errorf("Error in read body: %s", err) } if bytes.Index(b, []byte(`"username":"foo"`)) < 0 { t.Error("No username found") } if bytes.Index(b, []byte(`"password":"bar"`)) < 0 { t.Error("No password found") } fmt.Fprint(w, `{"session":{"name":"JSESSIONID","value":"12345678901234567890"},"loginInfo":{"failedLoginCount":10,"loginCount":127,"lastFailedLoginTime":"2016-03-16T04:22:35.386+0000","previousLoginTime":"2016-03-16T04:22:35.386+0000"}}`) }) res, err := testClient.Authentication.AcquireSessionCookie("foo", "bar") if err != nil { t.Errorf("No error expected. Got %s", err) } if res == false { t.Error("Expected result was true. Got false") } if testClient.Authentication.Authenticated() != true { t.Error("Expected true, but result was false") } } func TestAuthenticationService_Authenticated(t *testing.T) { // Skip setup() because we don't want a fully setup client testClient = new(Client) // Test before we've attempted to authenticate if testClient.Authentication.Authenticated() != false { t.Error("Expected false, but result was true") } } func TestAithenticationService_GetUserInfo_AccessForbidden_Fail(t *testing.T) { setup() defer teardown() testMux.HandleFunc("/rest/auth/1/session", func(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { testMethod(t, r, "POST") testRequestURL(t, r, "/rest/auth/1/session") b, err := ioutil.ReadAll(r.Body) if err != nil { t.Errorf("Error in read body: %s", err) } if bytes.Index(b, []byte(`"username":"foo"`)) < 0 { t.Error("No username found") } if bytes.Index(b, []byte(`"password":"bar"`)) < 0 { t.Error("No password found") } fmt.Fprint(w, `{"session":{"name":"JSESSIONID","value":"12345678901234567890"},"loginInfo":{"failedLoginCount":10,"loginCount":127,"lastFailedLoginTime":"2016-03-16T04:22:35.386+0000","previousLoginTime":"2016-03-16T04:22:35.386+0000"}}`) } if r.Method == "GET" { testMethod(t, r, "GET") testRequestURL(t, r, "/rest/auth/1/session") w.WriteHeader(http.StatusForbidden) } }) testClient.Authentication.AcquireSessionCookie("foo", "bar") _, err := testClient.Authentication.GetCurrentUser() if err == nil { t.Errorf("Non nil error expect, recieved nil") } } func TestAuthenticationService_GetUserInfo_NonOkStatusCode_Fail(t *testing.T) { setup() defer teardown() testMux.HandleFunc("/rest/auth/1/session", func(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { testMethod(t, r, "POST") testRequestURL(t, r, "/rest/auth/1/session") b, err := ioutil.ReadAll(r.Body) if err != nil { t.Errorf("Error in read body: %s", err) } if bytes.Index(b, []byte(`"username":"foo"`)) < 0 { t.Error("No username found") } if bytes.Index(b, []byte(`"password":"bar"`)) < 0 { t.Error("No password found") } fmt.Fprint(w, `{"session":{"name":"JSESSIONID","value":"12345678901234567890"},"loginInfo":{"failedLoginCount":10,"loginCount":127,"lastFailedLoginTime":"2016-03-16T04:22:35.386+0000","previousLoginTime":"2016-03-16T04:22:35.386+0000"}}`) } if r.Method == "GET" { testMethod(t, r, "GET") testRequestURL(t, r, "/rest/auth/1/session") //any status but 200 w.WriteHeader(240) } }) testClient.Authentication.AcquireSessionCookie("foo", "bar") _, err := testClient.Authentication.GetCurrentUser() if err == nil { t.Errorf("Non nil error expect, recieved nil") } } func TestAuthenticationService_GetUserInfo_FailWithoutLogin(t *testing.T) { // no setup() required here testClient = new(Client) _, err := testClient.Authentication.GetCurrentUser() if err == nil { t.Errorf("Expected error, but got %s", err) } } func TestAuthenticationService_GetUserInfo_Success(t *testing.T) { setup() defer teardown() testUserInfo := new(Session) testUserInfo.Name = "foo" testUserInfo.Self = "https://tasks.trivago.com/rest/api/latest/user?username=foo" testUserInfo.LoginInfo.FailedLoginCount = 12 testUserInfo.LoginInfo.LastFailedLoginTime = "2016-09-06T16:41:23.949+0200" testUserInfo.LoginInfo.LoginCount = 357 testUserInfo.LoginInfo.PreviousLoginTime = "2016-09-07T11:36:23.476+0200" testMux.HandleFunc("/rest/auth/1/session", func(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { testMethod(t, r, "POST") testRequestURL(t, r, "/rest/auth/1/session") b, err := ioutil.ReadAll(r.Body) if err != nil { t.Errorf("Error in read body: %s", err) } if bytes.Index(b, []byte(`"username":"foo"`)) < 0 { t.Error("No username found") } if bytes.Index(b, []byte(`"password":"bar"`)) < 0 { t.Error("No password found") } fmt.Fprint(w, `{"session":{"name":"JSESSIONID","value":"12345678901234567890"},"loginInfo":{"failedLoginCount":10,"loginCount":127,"lastFailedLoginTime":"2016-03-16T04:22:35.386+0000","previousLoginTime":"2016-03-16T04:22:35.386+0000"}}`) } if r.Method == "GET" { testMethod(t, r, "GET") testRequestURL(t, r, "/rest/auth/1/session") fmt.Fprint(w, `{"self":"https://tasks.trivago.com/rest/api/latest/user?username=foo","name":"foo","loginInfo":{"failedLoginCount":12,"loginCount":357,"lastFailedLoginTime":"2016-09-06T16:41:23.949+0200","previousLoginTime":"2016-09-07T11:36:23.476+0200"}}`) } }) testClient.Authentication.AcquireSessionCookie("foo", "bar") userinfo, err := testClient.Authentication.GetCurrentUser() if err != nil { t.Errorf("Nil error expect, recieved %s", err) } equal := reflect.DeepEqual(*testUserInfo, *userinfo) if !equal { t.Error("The user information doesn't match") } } func TestAuthenticationService_Logout_Success(t *testing.T) { setup() defer teardown() testMux.HandleFunc("/rest/auth/1/session", func(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { testMethod(t, r, "POST") testRequestURL(t, r, "/rest/auth/1/session") b, err := ioutil.ReadAll(r.Body) if err != nil { t.Errorf("Error in read body: %s", err) } if bytes.Index(b, []byte(`"username":"foo"`)) < 0 { t.Error("No username found") } if bytes.Index(b, []byte(`"password":"bar"`)) < 0 { t.Error("No password found") } fmt.Fprint(w, `{"session":{"name":"JSESSIONID","value":"12345678901234567890"},"loginInfo":{"failedLoginCount":10,"loginCount":127,"lastFailedLoginTime":"2016-03-16T04:22:35.386+0000","previousLoginTime":"2016-03-16T04:22:35.386+0000"}}`) } if r.Method == "DELETE" { // return 204 w.WriteHeader(http.StatusNoContent) } }) testClient.Authentication.AcquireSessionCookie("foo", "bar") err := testClient.Authentication.Logout() if err != nil { t.Errorf("Expected nil error, got %s", err) } } func TestAuthenticationService_Logout_FailWithoutLogin(t *testing.T) { setup() defer teardown() testMux.HandleFunc("/rest/auth/1/session", func(w http.ResponseWriter, r *http.Request) { if r.Method == "DELETE" { // 401 w.WriteHeader(http.StatusUnauthorized) } }) err := testClient.Authentication.Logout() if err == nil { t.Error("Expected not nil, got nil") } }