code.gitea.io/gitea@v1.22.3/models/auth/access_token_test.go (about)

     1  // Copyright 2016 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package auth_test
     5  
     6  import (
     7  	"testing"
     8  
     9  	auth_model "code.gitea.io/gitea/models/auth"
    10  	"code.gitea.io/gitea/models/db"
    11  	"code.gitea.io/gitea/models/unittest"
    12  
    13  	"github.com/stretchr/testify/assert"
    14  )
    15  
    16  func TestNewAccessToken(t *testing.T) {
    17  	assert.NoError(t, unittest.PrepareTestDatabase())
    18  	token := &auth_model.AccessToken{
    19  		UID:  3,
    20  		Name: "Token C",
    21  	}
    22  	assert.NoError(t, auth_model.NewAccessToken(db.DefaultContext, token))
    23  	unittest.AssertExistsAndLoadBean(t, token)
    24  
    25  	invalidToken := &auth_model.AccessToken{
    26  		ID:   token.ID, // duplicate
    27  		UID:  2,
    28  		Name: "Token F",
    29  	}
    30  	assert.Error(t, auth_model.NewAccessToken(db.DefaultContext, invalidToken))
    31  }
    32  
    33  func TestAccessTokenByNameExists(t *testing.T) {
    34  	name := "Token Gitea"
    35  
    36  	assert.NoError(t, unittest.PrepareTestDatabase())
    37  	token := &auth_model.AccessToken{
    38  		UID:  3,
    39  		Name: name,
    40  	}
    41  
    42  	// Check to make sure it doesn't exists already
    43  	exist, err := auth_model.AccessTokenByNameExists(db.DefaultContext, token)
    44  	assert.NoError(t, err)
    45  	assert.False(t, exist)
    46  
    47  	// Save it to the database
    48  	assert.NoError(t, auth_model.NewAccessToken(db.DefaultContext, token))
    49  	unittest.AssertExistsAndLoadBean(t, token)
    50  
    51  	// This token must be found by name in the DB now
    52  	exist, err = auth_model.AccessTokenByNameExists(db.DefaultContext, token)
    53  	assert.NoError(t, err)
    54  	assert.True(t, exist)
    55  
    56  	user4Token := &auth_model.AccessToken{
    57  		UID:  4,
    58  		Name: name,
    59  	}
    60  
    61  	// Name matches but different user ID, this shouldn't exists in the
    62  	// database
    63  	exist, err = auth_model.AccessTokenByNameExists(db.DefaultContext, user4Token)
    64  	assert.NoError(t, err)
    65  	assert.False(t, exist)
    66  }
    67  
    68  func TestGetAccessTokenBySHA(t *testing.T) {
    69  	assert.NoError(t, unittest.PrepareTestDatabase())
    70  	token, err := auth_model.GetAccessTokenBySHA(db.DefaultContext, "d2c6c1ba3890b309189a8e618c72a162e4efbf36")
    71  	assert.NoError(t, err)
    72  	assert.Equal(t, int64(1), token.UID)
    73  	assert.Equal(t, "Token A", token.Name)
    74  	assert.Equal(t, "2b3668e11cb82d3af8c6e4524fc7841297668f5008d1626f0ad3417e9fa39af84c268248b78c481daa7e5dc437784003494f", token.TokenHash)
    75  	assert.Equal(t, "e4efbf36", token.TokenLastEight)
    76  
    77  	_, err = auth_model.GetAccessTokenBySHA(db.DefaultContext, "notahash")
    78  	assert.Error(t, err)
    79  	assert.True(t, auth_model.IsErrAccessTokenNotExist(err))
    80  
    81  	_, err = auth_model.GetAccessTokenBySHA(db.DefaultContext, "")
    82  	assert.Error(t, err)
    83  	assert.True(t, auth_model.IsErrAccessTokenEmpty(err))
    84  }
    85  
    86  func TestListAccessTokens(t *testing.T) {
    87  	assert.NoError(t, unittest.PrepareTestDatabase())
    88  	tokens, err := db.Find[auth_model.AccessToken](db.DefaultContext, auth_model.ListAccessTokensOptions{UserID: 1})
    89  	assert.NoError(t, err)
    90  	if assert.Len(t, tokens, 2) {
    91  		assert.Equal(t, int64(1), tokens[0].UID)
    92  		assert.Equal(t, int64(1), tokens[1].UID)
    93  		assert.Contains(t, []string{tokens[0].Name, tokens[1].Name}, "Token A")
    94  		assert.Contains(t, []string{tokens[0].Name, tokens[1].Name}, "Token B")
    95  	}
    96  
    97  	tokens, err = db.Find[auth_model.AccessToken](db.DefaultContext, auth_model.ListAccessTokensOptions{UserID: 2})
    98  	assert.NoError(t, err)
    99  	if assert.Len(t, tokens, 1) {
   100  		assert.Equal(t, int64(2), tokens[0].UID)
   101  		assert.Equal(t, "Token A", tokens[0].Name)
   102  	}
   103  
   104  	tokens, err = db.Find[auth_model.AccessToken](db.DefaultContext, auth_model.ListAccessTokensOptions{UserID: 100})
   105  	assert.NoError(t, err)
   106  	assert.Empty(t, tokens)
   107  }
   108  
   109  func TestUpdateAccessToken(t *testing.T) {
   110  	assert.NoError(t, unittest.PrepareTestDatabase())
   111  	token, err := auth_model.GetAccessTokenBySHA(db.DefaultContext, "4c6f36e6cf498e2a448662f915d932c09c5a146c")
   112  	assert.NoError(t, err)
   113  	token.Name = "Token Z"
   114  
   115  	assert.NoError(t, auth_model.UpdateAccessToken(db.DefaultContext, token))
   116  	unittest.AssertExistsAndLoadBean(t, token)
   117  }
   118  
   119  func TestDeleteAccessTokenByID(t *testing.T) {
   120  	assert.NoError(t, unittest.PrepareTestDatabase())
   121  
   122  	token, err := auth_model.GetAccessTokenBySHA(db.DefaultContext, "4c6f36e6cf498e2a448662f915d932c09c5a146c")
   123  	assert.NoError(t, err)
   124  	assert.Equal(t, int64(1), token.UID)
   125  
   126  	assert.NoError(t, auth_model.DeleteAccessTokenByID(db.DefaultContext, token.ID, 1))
   127  	unittest.AssertNotExistsBean(t, token)
   128  
   129  	err = auth_model.DeleteAccessTokenByID(db.DefaultContext, 100, 100)
   130  	assert.Error(t, err)
   131  	assert.True(t, auth_model.IsErrAccessTokenNotExist(err))
   132  }