@ -1,6 +1,7 @@
package auth
package auth
import (
import (
"context"
"encoding/json"
"encoding/json"
"testing"
"testing"
"time"
"time"
@ -26,19 +27,19 @@ func TestUserAuthToken(t *testing.T) {
}
}
Convey ( "When creating token" , func ( ) {
Convey ( "When creating token" , func ( ) {
userToken , err := userAuthTokenService . CreateToken ( userID , "192.168.10.11:1234" , "some user agent" )
userToken , err := userAuthTokenService . CreateToken ( context . Background ( ) , userID , "192.168.10.11:1234" , "some user agent" )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( userToken , ShouldNotBeNil )
So ( userToken , ShouldNotBeNil )
So ( userToken . AuthTokenSeen , ShouldBeFalse )
So ( userToken . AuthTokenSeen , ShouldBeFalse )
Convey ( "Can count active tokens" , func ( ) {
Convey ( "Can count active tokens" , func ( ) {
count , err := userAuthTokenService . ActiveTokenCount ( )
count , err := userAuthTokenService . ActiveTokenCount ( context . Background ( ) )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( count , ShouldEqual , 1 )
So ( count , ShouldEqual , 1 )
} )
} )
Convey ( "When lookup unhashed token should return user auth token" , func ( ) {
Convey ( "When lookup unhashed token should return user auth token" , func ( ) {
userToken , err := userAuthTokenService . LookupToken ( userToken . UnhashedToken )
userToken , err := userAuthTokenService . LookupToken ( context . Background ( ) , userToken . UnhashedToken )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( userToken , ShouldNotBeNil )
So ( userToken , ShouldNotBeNil )
So ( userToken . UserId , ShouldEqual , userID )
So ( userToken . UserId , ShouldEqual , userID )
@ -51,13 +52,13 @@ func TestUserAuthToken(t *testing.T) {
} )
} )
Convey ( "When lookup hashed token should return user auth token not found error" , func ( ) {
Convey ( "When lookup hashed token should return user auth token not found error" , func ( ) {
userToken , err := userAuthTokenService . LookupToken ( userToken . AuthToken )
userToken , err := userAuthTokenService . LookupToken ( context . Background ( ) , userToken . AuthToken )
So ( err , ShouldEqual , models . ErrUserTokenNotFound )
So ( err , ShouldEqual , models . ErrUserTokenNotFound )
So ( userToken , ShouldBeNil )
So ( userToken , ShouldBeNil )
} )
} )
Convey ( "revoking existing token should delete token" , func ( ) {
Convey ( "revoking existing token should delete token" , func ( ) {
err = userAuthTokenService . RevokeToken ( userToken )
err = userAuthTokenService . RevokeToken ( context . Background ( ) , userToken )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
model , err := ctx . getAuthTokenByID ( userToken . Id )
model , err := ctx . getAuthTokenByID ( userToken . Id )
@ -66,37 +67,37 @@ func TestUserAuthToken(t *testing.T) {
} )
} )
Convey ( "revoking nil token should return error" , func ( ) {
Convey ( "revoking nil token should return error" , func ( ) {
err = userAuthTokenService . RevokeToken ( nil )
err = userAuthTokenService . RevokeToken ( context . Background ( ) , nil )
So ( err , ShouldEqual , models . ErrUserTokenNotFound )
So ( err , ShouldEqual , models . ErrUserTokenNotFound )
} )
} )
Convey ( "revoking non-existing token should return error" , func ( ) {
Convey ( "revoking non-existing token should return error" , func ( ) {
userToken . Id = 1000
userToken . Id = 1000
err = userAuthTokenService . RevokeToken ( userToken )
err = userAuthTokenService . RevokeToken ( context . Background ( ) , userToken )
So ( err , ShouldEqual , models . ErrUserTokenNotFound )
So ( err , ShouldEqual , models . ErrUserTokenNotFound )
} )
} )
Convey ( "When creating an additional token" , func ( ) {
Convey ( "When creating an additional token" , func ( ) {
userToken2 , err := userAuthTokenService . CreateToken ( userID , "192.168.10.11:1234" , "some user agent" )
userToken2 , err := userAuthTokenService . CreateToken ( context . Background ( ) , userID , "192.168.10.11:1234" , "some user agent" )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( userToken2 , ShouldNotBeNil )
So ( userToken2 , ShouldNotBeNil )
Convey ( "Can get first user token" , func ( ) {
Convey ( "Can get first user token" , func ( ) {
token , err := userAuthTokenService . GetUserToken ( userID , userToken . Id )
token , err := userAuthTokenService . GetUserToken ( context . Background ( ) , userID , userToken . Id )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( token , ShouldNotBeNil )
So ( token , ShouldNotBeNil )
So ( token . Id , ShouldEqual , userToken . Id )
So ( token . Id , ShouldEqual , userToken . Id )
} )
} )
Convey ( "Can get second user token" , func ( ) {
Convey ( "Can get second user token" , func ( ) {
token , err := userAuthTokenService . GetUserToken ( userID , userToken2 . Id )
token , err := userAuthTokenService . GetUserToken ( context . Background ( ) , userID , userToken2 . Id )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( token , ShouldNotBeNil )
So ( token , ShouldNotBeNil )
So ( token . Id , ShouldEqual , userToken2 . Id )
So ( token . Id , ShouldEqual , userToken2 . Id )
} )
} )
Convey ( "Can get user tokens" , func ( ) {
Convey ( "Can get user tokens" , func ( ) {
tokens , err := userAuthTokenService . GetUserTokens ( userID )
tokens , err := userAuthTokenService . GetUserTokens ( context . Background ( ) , userID )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( tokens , ShouldHaveLength , 2 )
So ( tokens , ShouldHaveLength , 2 )
So ( tokens [ 0 ] . Id , ShouldEqual , userToken . Id )
So ( tokens [ 0 ] . Id , ShouldEqual , userToken . Id )
@ -104,7 +105,7 @@ func TestUserAuthToken(t *testing.T) {
} )
} )
Convey ( "Can revoke all user tokens" , func ( ) {
Convey ( "Can revoke all user tokens" , func ( ) {
err := userAuthTokenService . RevokeAllUserTokens ( userID )
err := userAuthTokenService . RevokeAllUserTokens ( context . Background ( ) , userID )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
model , err := ctx . getAuthTokenByID ( userToken . Id )
model , err := ctx . getAuthTokenByID ( userToken . Id )
@ -119,24 +120,24 @@ func TestUserAuthToken(t *testing.T) {
} )
} )
Convey ( "expires correctly" , func ( ) {
Convey ( "expires correctly" , func ( ) {
userToken , err := userAuthTokenService . CreateToken ( userID , "192.168.10.11:1234" , "some user agent" )
userToken , err := userAuthTokenService . CreateToken ( context . Background ( ) , userID , "192.168.10.11:1234" , "some user agent" )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
userToken , err = userAuthTokenService . LookupToken ( userToken . UnhashedToken )
userToken , err = userAuthTokenService . LookupToken ( context . Background ( ) , userToken . UnhashedToken )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
getTime = func ( ) time . Time {
getTime = func ( ) time . Time {
return t . Add ( time . Hour )
return t . Add ( time . Hour )
}
}
rotated , err := userAuthTokenService . TryRotateToken ( userToken , "192.168.10.11:1234" , "some user agent" )
rotated , err := userAuthTokenService . TryRotateToken ( context . Background ( ) , userToken , "192.168.10.11:1234" , "some user agent" )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( rotated , ShouldBeTrue )
So ( rotated , ShouldBeTrue )
userToken , err = userAuthTokenService . LookupToken ( userToken . UnhashedToken )
userToken , err = userAuthTokenService . LookupToken ( context . Background ( ) , userToken . UnhashedToken )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
stillGood , err := userAuthTokenService . LookupToken ( userToken . UnhashedToken )
stillGood , err := userAuthTokenService . LookupToken ( context . Background ( ) , userToken . UnhashedToken )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( stillGood , ShouldNotBeNil )
So ( stillGood , ShouldNotBeNil )
@ -148,7 +149,7 @@ func TestUserAuthToken(t *testing.T) {
return time . Unix ( model . RotatedAt , 0 ) . Add ( 24 * 7 * time . Hour ) . Add ( - time . Second )
return time . Unix ( model . RotatedAt , 0 ) . Add ( 24 * 7 * time . Hour ) . Add ( - time . Second )
}
}
stillGood , err = userAuthTokenService . LookupToken ( stillGood . UnhashedToken )
stillGood , err = userAuthTokenService . LookupToken ( context . Background ( ) , stillGood . UnhashedToken )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( stillGood , ShouldNotBeNil )
So ( stillGood , ShouldNotBeNil )
} )
} )
@ -158,12 +159,12 @@ func TestUserAuthToken(t *testing.T) {
return time . Unix ( model . RotatedAt , 0 ) . Add ( 24 * 7 * time . Hour )
return time . Unix ( model . RotatedAt , 0 ) . Add ( 24 * 7 * time . Hour )
}
}
notGood , err := userAuthTokenService . LookupToken ( userToken . UnhashedToken )
notGood , err := userAuthTokenService . LookupToken ( context . Background ( ) , userToken . UnhashedToken )
So ( err , ShouldEqual , models . ErrUserTokenNotFound )
So ( err , ShouldEqual , models . ErrUserTokenNotFound )
So ( notGood , ShouldBeNil )
So ( notGood , ShouldBeNil )
Convey ( "should not find active token when expired" , func ( ) {
Convey ( "should not find active token when expired" , func ( ) {
count , err := userAuthTokenService . ActiveTokenCount ( )
count , err := userAuthTokenService . ActiveTokenCount ( context . Background ( ) )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( count , ShouldEqual , 0 )
So ( count , ShouldEqual , 0 )
} )
} )
@ -178,7 +179,7 @@ func TestUserAuthToken(t *testing.T) {
return time . Unix ( model . CreatedAt , 0 ) . Add ( 24 * 30 * time . Hour ) . Add ( - time . Second )
return time . Unix ( model . CreatedAt , 0 ) . Add ( 24 * 30 * time . Hour ) . Add ( - time . Second )
}
}
stillGood , err = userAuthTokenService . LookupToken ( stillGood . UnhashedToken )
stillGood , err = userAuthTokenService . LookupToken ( context . Background ( ) , stillGood . UnhashedToken )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( stillGood , ShouldNotBeNil )
So ( stillGood , ShouldNotBeNil )
} )
} )
@ -192,20 +193,20 @@ func TestUserAuthToken(t *testing.T) {
return time . Unix ( model . CreatedAt , 0 ) . Add ( 24 * 30 * time . Hour )
return time . Unix ( model . CreatedAt , 0 ) . Add ( 24 * 30 * time . Hour )
}
}
notGood , err := userAuthTokenService . LookupToken ( userToken . UnhashedToken )
notGood , err := userAuthTokenService . LookupToken ( context . Background ( ) , userToken . UnhashedToken )
So ( err , ShouldEqual , models . ErrUserTokenNotFound )
So ( err , ShouldEqual , models . ErrUserTokenNotFound )
So ( notGood , ShouldBeNil )
So ( notGood , ShouldBeNil )
} )
} )
} )
} )
Convey ( "can properly rotate tokens" , func ( ) {
Convey ( "can properly rotate tokens" , func ( ) {
userToken , err := userAuthTokenService . CreateToken ( userID , "192.168.10.11:1234" , "some user agent" )
userToken , err := userAuthTokenService . CreateToken ( context . Background ( ) , userID , "192.168.10.11:1234" , "some user agent" )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
prevToken := userToken . AuthToken
prevToken := userToken . AuthToken
unhashedPrev := userToken . UnhashedToken
unhashedPrev := userToken . UnhashedToken
rotated , err := userAuthTokenService . TryRotateToken ( userToken , "192.168.10.12:1234" , "a new user agent" )
rotated , err := userAuthTokenService . TryRotateToken ( context . Background ( ) , userToken , "192.168.10.12:1234" , "a new user agent" )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( rotated , ShouldBeFalse )
So ( rotated , ShouldBeFalse )
@ -224,7 +225,7 @@ func TestUserAuthToken(t *testing.T) {
return t . Add ( time . Hour )
return t . Add ( time . Hour )
}
}
rotated , err = userAuthTokenService . TryRotateToken ( & tok , "192.168.10.12:1234" , "a new user agent" )
rotated , err = userAuthTokenService . TryRotateToken ( context . Background ( ) , & tok , "192.168.10.12:1234" , "a new user agent" )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( rotated , ShouldBeTrue )
So ( rotated , ShouldBeTrue )
@ -243,13 +244,13 @@ func TestUserAuthToken(t *testing.T) {
// ability to auth using an old token
// ability to auth using an old token
lookedUpUserToken , err := userAuthTokenService . LookupToken ( model . UnhashedToken )
lookedUpUserToken , err := userAuthTokenService . LookupToken ( context . Background ( ) , model . UnhashedToken )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( lookedUpUserToken , ShouldNotBeNil )
So ( lookedUpUserToken , ShouldNotBeNil )
So ( lookedUpUserToken . AuthTokenSeen , ShouldBeTrue )
So ( lookedUpUserToken . AuthTokenSeen , ShouldBeTrue )
So ( lookedUpUserToken . SeenAt , ShouldEqual , getTime ( ) . Unix ( ) )
So ( lookedUpUserToken . SeenAt , ShouldEqual , getTime ( ) . Unix ( ) )
lookedUpUserToken , err = userAuthTokenService . LookupToken ( unhashedPrev )
lookedUpUserToken , err = userAuthTokenService . LookupToken ( context . Background ( ) , unhashedPrev )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( lookedUpUserToken , ShouldNotBeNil )
So ( lookedUpUserToken , ShouldNotBeNil )
So ( lookedUpUserToken . Id , ShouldEqual , model . Id )
So ( lookedUpUserToken . Id , ShouldEqual , model . Id )
@ -259,7 +260,7 @@ func TestUserAuthToken(t *testing.T) {
return t . Add ( time . Hour + ( 2 * time . Minute ) )
return t . Add ( time . Hour + ( 2 * time . Minute ) )
}
}
lookedUpUserToken , err = userAuthTokenService . LookupToken ( unhashedPrev )
lookedUpUserToken , err = userAuthTokenService . LookupToken ( context . Background ( ) , unhashedPrev )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( lookedUpUserToken , ShouldNotBeNil )
So ( lookedUpUserToken , ShouldNotBeNil )
So ( lookedUpUserToken . AuthTokenSeen , ShouldBeTrue )
So ( lookedUpUserToken . AuthTokenSeen , ShouldBeTrue )
@ -269,7 +270,7 @@ func TestUserAuthToken(t *testing.T) {
So ( lookedUpModel , ShouldNotBeNil )
So ( lookedUpModel , ShouldNotBeNil )
So ( lookedUpModel . AuthTokenSeen , ShouldBeFalse )
So ( lookedUpModel . AuthTokenSeen , ShouldBeFalse )
rotated , err = userAuthTokenService . TryRotateToken ( userToken , "192.168.10.12:1234" , "a new user agent" )
rotated , err = userAuthTokenService . TryRotateToken ( context . Background ( ) , userToken , "192.168.10.12:1234" , "a new user agent" )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( rotated , ShouldBeTrue )
So ( rotated , ShouldBeTrue )
@ -280,11 +281,11 @@ func TestUserAuthToken(t *testing.T) {
} )
} )
Convey ( "keeps prev token valid for 1 minute after it is confirmed" , func ( ) {
Convey ( "keeps prev token valid for 1 minute after it is confirmed" , func ( ) {
userToken , err := userAuthTokenService . CreateToken ( userID , "192.168.10.11:1234" , "some user agent" )
userToken , err := userAuthTokenService . CreateToken ( context . Background ( ) , userID , "192.168.10.11:1234" , "some user agent" )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( userToken , ShouldNotBeNil )
So ( userToken , ShouldNotBeNil )
lookedUpUserToken , err := userAuthTokenService . LookupToken ( userToken . UnhashedToken )
lookedUpUserToken , err := userAuthTokenService . LookupToken ( context . Background ( ) , userToken . UnhashedToken )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( lookedUpUserToken , ShouldNotBeNil )
So ( lookedUpUserToken , ShouldNotBeNil )
@ -293,7 +294,7 @@ func TestUserAuthToken(t *testing.T) {
}
}
prevToken := userToken . UnhashedToken
prevToken := userToken . UnhashedToken
rotated , err := userAuthTokenService . TryRotateToken ( userToken , "1.1.1.1" , "firefox" )
rotated , err := userAuthTokenService . TryRotateToken ( context . Background ( ) , userToken , "1.1.1.1" , "firefox" )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( rotated , ShouldBeTrue )
So ( rotated , ShouldBeTrue )
@ -301,25 +302,25 @@ func TestUserAuthToken(t *testing.T) {
return t . Add ( 20 * time . Minute )
return t . Add ( 20 * time . Minute )
}
}
currentUserToken , err := userAuthTokenService . LookupToken ( userToken . UnhashedToken )
currentUserToken , err := userAuthTokenService . LookupToken ( context . Background ( ) , userToken . UnhashedToken )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( currentUserToken , ShouldNotBeNil )
So ( currentUserToken , ShouldNotBeNil )
prevUserToken , err := userAuthTokenService . LookupToken ( prevToken )
prevUserToken , err := userAuthTokenService . LookupToken ( context . Background ( ) , prevToken )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( prevUserToken , ShouldNotBeNil )
So ( prevUserToken , ShouldNotBeNil )
} )
} )
Convey ( "will not mark token unseen when prev and current are the same" , func ( ) {
Convey ( "will not mark token unseen when prev and current are the same" , func ( ) {
userToken , err := userAuthTokenService . CreateToken ( userID , "192.168.10.11:1234" , "some user agent" )
userToken , err := userAuthTokenService . CreateToken ( context . Background ( ) , userID , "192.168.10.11:1234" , "some user agent" )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( userToken , ShouldNotBeNil )
So ( userToken , ShouldNotBeNil )
lookedUpUserToken , err := userAuthTokenService . LookupToken ( userToken . UnhashedToken )
lookedUpUserToken , err := userAuthTokenService . LookupToken ( context . Background ( ) , userToken . UnhashedToken )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( lookedUpUserToken , ShouldNotBeNil )
So ( lookedUpUserToken , ShouldNotBeNil )
lookedUpUserToken , err = userAuthTokenService . LookupToken ( userToken . UnhashedToken )
lookedUpUserToken , err = userAuthTokenService . LookupToken ( context . Background ( ) , userToken . UnhashedToken )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( lookedUpUserToken , ShouldNotBeNil )
So ( lookedUpUserToken , ShouldNotBeNil )
@ -330,7 +331,7 @@ func TestUserAuthToken(t *testing.T) {
} )
} )
Convey ( "Rotate token" , func ( ) {
Convey ( "Rotate token" , func ( ) {
userToken , err := userAuthTokenService . CreateToken ( userID , "192.168.10.11:1234" , "some user agent" )
userToken , err := userAuthTokenService . CreateToken ( context . Background ( ) , userID , "192.168.10.11:1234" , "some user agent" )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( userToken , ShouldNotBeNil )
So ( userToken , ShouldNotBeNil )
@ -345,7 +346,7 @@ func TestUserAuthToken(t *testing.T) {
return t . Add ( 10 * time . Minute )
return t . Add ( 10 * time . Minute )
}
}
rotated , err := userAuthTokenService . TryRotateToken ( userToken , "1.1.1.1" , "firefox" )
rotated , err := userAuthTokenService . TryRotateToken ( context . Background ( ) , userToken , "1.1.1.1" , "firefox" )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( rotated , ShouldBeTrue )
So ( rotated , ShouldBeTrue )
@ -366,7 +367,7 @@ func TestUserAuthToken(t *testing.T) {
return t . Add ( 20 * time . Minute )
return t . Add ( 20 * time . Minute )
}
}
rotated , err = userAuthTokenService . TryRotateToken ( userToken , "1.1.1.1" , "firefox" )
rotated , err = userAuthTokenService . TryRotateToken ( context . Background ( ) , userToken , "1.1.1.1" , "firefox" )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( rotated , ShouldBeTrue )
So ( rotated , ShouldBeTrue )
@ -385,7 +386,7 @@ func TestUserAuthToken(t *testing.T) {
return t . Add ( 2 * time . Minute )
return t . Add ( 2 * time . Minute )
}
}
rotated , err := userAuthTokenService . TryRotateToken ( userToken , "1.1.1.1" , "firefox" )
rotated , err := userAuthTokenService . TryRotateToken ( context . Background ( ) , userToken , "1.1.1.1" , "firefox" )
So ( err , ShouldBeNil )
So ( err , ShouldBeNil )
So ( rotated , ShouldBeTrue )
So ( rotated , ShouldBeTrue )