github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/model/token/service_test.go (about) 1 package token 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/cozy/cozy-stack/pkg/cache" 8 "github.com/cozy/cozy-stack/pkg/prefixer" 9 "github.com/stretchr/testify/assert" 10 ) 11 12 func TestServiceImplem(t *testing.T) { 13 assert.Implements(t, (*Service)(nil), new(TokenService)) 14 assert.Implements(t, (*Service)(nil), new(Mock)) 15 } 16 17 func Test_CacheService_success(t *testing.T) { 18 cache := cache.NewInMemory() 19 20 db := prefixer.NewPrefixer(1, "foo", "global") 21 22 svc := NewService(cache) 23 24 token, err := svc.GenerateAndSave(db, MagicLink, "some-url", time.Second) 25 assert.NoError(t, err) 26 assert.Len(t, token, TokenLen) 27 28 err = svc.Validate(db, MagicLink, "some-url", token) 29 assert.NoError(t, err) 30 } 31 32 func Test_CacheService_with_an_invalid_namespace(t *testing.T) { 33 cache := cache.NewInMemory() 34 35 db := prefixer.NewPrefixer(1, "foo", "global") 36 37 svc := NewService(cache) 38 39 token, err := svc.GenerateAndSave(db, "invalid", "foo", time.Millisecond) 40 assert.Empty(t, token) 41 assert.ErrorIs(t, err, ErrInvalidNamespace) 42 } 43 44 func Test_CacheService_expired_token(t *testing.T) { 45 cache := cache.NewInMemory() 46 47 db := prefixer.NewPrefixer(1, "foo", "global") 48 49 svc := NewService(cache) 50 51 token, err := svc.GenerateAndSave(db, EmailUpdate, "foo@bar.baz", time.Millisecond) 52 assert.NoError(t, err) 53 assert.Len(t, token, TokenLen) 54 55 time.Sleep(5 * time.Millisecond) 56 57 err = svc.Validate(db, EmailUpdate, "foo@bar.baz", token) 58 assert.ErrorIs(t, err, ErrInvalidToken) 59 } 60 61 func Test_CacheService_scope_by_resource(t *testing.T) { 62 cache := cache.NewInMemory() 63 64 db := prefixer.NewPrefixer(1, "foo", "global") 65 66 svc := NewService(cache) 67 68 token, err := svc.GenerateAndSave(db, EmailUpdate, "foo@bar.baz", time.Second) 69 assert.NoError(t, err) 70 assert.Len(t, token, TokenLen) 71 72 // Failed because the email is not the same. 73 err = svc.Validate(db, EmailUpdate, "another@email.com", token) 74 assert.ErrorIs(t, err, ErrInvalidToken) 75 76 err = svc.Validate(db, EmailUpdate, "foo@bar.baz", token) 77 assert.NoError(t, err) 78 }