influxdb/http/session_test.go

105 lines
2.6 KiB
Go

package http
import (
"context"
"net/http"
"net/http/httptest"
"testing"
"time"
platform "github.com/influxdata/influxdb"
"github.com/influxdata/influxdb/mock"
"go.uber.org/zap/zaptest"
)
// NewMockSessionBackend returns a SessionBackend with mock services.
func NewMockSessionBackend(t *testing.T) *SessionBackend {
userSVC := mock.NewUserService()
userSVC.FindUserFn = func(_ context.Context, f platform.UserFilter) (*platform.User, error) {
return &platform.User{ID: 1}, nil
}
return &SessionBackend{
log: zaptest.NewLogger(t),
SessionService: mock.NewSessionService(),
PasswordsService: mock.NewPasswordsService(),
UserService: userSVC,
}
}
func TestSessionHandler_handleSignin(t *testing.T) {
type fields struct {
PasswordsService platform.PasswordsService
SessionService platform.SessionService
}
type args struct {
user string
password string
}
type wants struct {
cookie string
code int
}
tests := []struct {
name string
fields fields
args args
wants wants
}{
{
name: "successful compare password",
fields: fields{
SessionService: &mock.SessionService{
CreateSessionFn: func(context.Context, string) (*platform.Session, error) {
return &platform.Session{
ID: platform.ID(0),
Key: "abc123xyz",
CreatedAt: time.Date(2018, 9, 26, 0, 0, 0, 0, time.UTC),
ExpiresAt: time.Date(2030, 9, 26, 0, 0, 0, 0, time.UTC),
UserID: platform.ID(1),
}, nil
},
},
PasswordsService: &mock.PasswordsService{
ComparePasswordFn: func(context.Context, platform.ID, string) error {
return nil
},
},
},
args: args{
user: "user1",
password: "supersecret",
},
wants: wants{
cookie: "session=abc123xyz",
code: http.StatusNoContent,
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
b := NewMockSessionBackend(t)
b.PasswordsService = tt.fields.PasswordsService
b.SessionService = tt.fields.SessionService
h := NewSessionHandler(zaptest.NewLogger(t), b)
w := httptest.NewRecorder()
r := httptest.NewRequest("POST", "http://localhost:9999/api/v2/signin", nil)
r.SetBasicAuth(tt.args.user, tt.args.password)
h.ServeHTTP(w, r)
if got, want := w.Code, tt.wants.code; got != want {
t.Errorf("bad status code: got %d want %d", got, want)
}
headers := w.Header()
cookie := headers.Get("Set-Cookie")
if got, want := cookie, tt.wants.cookie; got != want {
t.Errorf("expected session cookie to be set: got %q want %q", got, want)
}
})
}
}