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  }