diff options
Diffstat (limited to 'internal/db/access_tokens_test.go')
-rw-r--r-- | internal/db/access_tokens_test.go | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/internal/db/access_tokens_test.go b/internal/db/access_tokens_test.go new file mode 100644 index 00000000..f6d62745 --- /dev/null +++ b/internal/db/access_tokens_test.go @@ -0,0 +1,201 @@ +// Copyright 2020 The Gogs Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package db + +import ( + "fmt" + "os" + "path/filepath" + "testing" + "time" + + "github.com/stretchr/testify/assert" + + "gogs.io/gogs/internal/conf" + "gogs.io/gogs/internal/errutil" +) + +func Test_accessTokens(t *testing.T) { + if testing.Short() { + t.Skip() + } + + t.Parallel() + + dbpath := filepath.Join(os.TempDir(), fmt.Sprintf("gogs-%d.db", time.Now().Unix())) + gdb, err := openDB(conf.DatabaseOpts{ + Type: "sqlite3", + Path: dbpath, + }) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { + _ = gdb.Close() + + if t.Failed() { + t.Logf("Database %q left intact for inspection", dbpath) + return + } + + _ = os.Remove(dbpath) + }) + + err = gdb.AutoMigrate(new(AccessToken)).Error + if err != nil { + t.Fatal(err) + } + + now := time.Now().Truncate(time.Second) + clock := func() time.Time { return now } + db := &accessTokens{DB: gdb, clock: clock} + + for _, tc := range []struct { + name string + test func(*testing.T, *accessTokens) + }{ + {"Create", test_accessTokens_Create}, + {"DeleteByID", test_accessTokens_DeleteByID}, + {"GetBySHA", test_accessTokens_GetBySHA}, + {"List", test_accessTokens_List}, + {"Save", test_accessTokens_Save}, + } { + t.Run(tc.name, func(t *testing.T) { + t.Cleanup(func() { + err := deleteTables(gdb, new(AccessToken)) + if err != nil { + t.Fatal(err) + } + }) + tc.test(t, db) + }) + } +} + +func test_accessTokens_Create(t *testing.T, db *accessTokens) { + // Create first access token with name "Test" + token, err := db.Create(1, "Test") + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, int64(1), token.UserID) + assert.Equal(t, "Test", token.Name) + assert.Equal(t, 40, len(token.Sha1), "sha1 length") + assert.Equal(t, db.clock(), token.Created) + + // Try create second access token with same name should fail + _, err = db.Create(token.UserID, token.Name) + expErr := ErrAccessTokenAlreadyExist{args: errutil.Args{"userID": token.UserID, "name": token.Name}} + assert.Equal(t, expErr, err) +} + +func test_accessTokens_DeleteByID(t *testing.T, db *accessTokens) { + // Create an access token with name "Test" + token, err := db.Create(1, "Test") + if err != nil { + t.Fatal(err) + } + + // We should be able to get it back + _, err = db.GetBySHA(token.Sha1) + if err != nil { + t.Fatal(err) + } + + // Delete a token with mismatched user ID is noop + err = db.DeleteByID(2, token.ID) + if err != nil { + t.Fatal(err) + } + _, err = db.GetBySHA(token.Sha1) + if err != nil { + t.Fatal(err) + } + + // Now delete this token with correct user ID + err = db.DeleteByID(token.UserID, token.ID) + if err != nil { + t.Fatal(err) + } + + // We should get token not found error + _, err = db.GetBySHA(token.Sha1) + expErr := ErrAccessTokenNotExist{args: errutil.Args{"sha": token.Sha1}} + assert.Equal(t, expErr, err) +} + +func test_accessTokens_GetBySHA(t *testing.T, db *accessTokens) { + // Create an access token with name "Test" + token, err := db.Create(1, "Test") + if err != nil { + t.Fatal(err) + } + + // We should be able to get it back + _, err = db.GetBySHA(token.Sha1) + if err != nil { + t.Fatal(err) + } + + // Try to get a non-existent token + _, err = db.GetBySHA("bad_sha") + expErr := ErrAccessTokenNotExist{args: errutil.Args{"sha": "bad_sha"}} + assert.Equal(t, expErr, err) +} + +func test_accessTokens_List(t *testing.T, db *accessTokens) { + // Create two access tokens for user 1 + _, err := db.Create(1, "user1_1") + if err != nil { + t.Fatal(err) + } + _, err = db.Create(1, "user1_2") + if err != nil { + t.Fatal(err) + } + + // Create one access token for user 2 + _, err = db.Create(2, "user2_1") + if err != nil { + t.Fatal(err) + } + + // List all access tokens for user 1 + tokens, err := db.List(1) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, 2, len(tokens), "number of tokens") + + assert.Equal(t, int64(1), tokens[0].UserID) + assert.Equal(t, "user1_1", tokens[0].Name) + + assert.Equal(t, int64(1), tokens[1].UserID) + assert.Equal(t, "user1_2", tokens[1].Name) +} + +func test_accessTokens_Save(t *testing.T, db *accessTokens) { + // Create an access token with name "Test" + token, err := db.Create(1, "Test") + if err != nil { + t.Fatal(err) + } + + // Updated field is zero now + assert.True(t, token.Updated.IsZero()) + + err = db.Save(token) + if err != nil { + t.Fatal(err) + } + + // Get back from DB should have Updated set + token, err = db.GetBySHA(token.Sha1) + if err != nil { + t.Fatal(err) + } + assert.Equal(t, db.clock(), token.Updated) +} |