mirror of https://github.com/go-gitea/gitea.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.8 KiB
110 lines
2.8 KiB
// Copyright 2023 The Gitea Authors. All rights reserved. |
|
// SPDX-License-Identifier: MIT |
|
|
|
package v1_20 |
|
|
|
import ( |
|
"sort" |
|
"strings" |
|
"testing" |
|
|
|
"code.gitea.io/gitea/models/migrations/base" |
|
|
|
"github.com/stretchr/testify/assert" |
|
) |
|
|
|
type testCase struct { |
|
Old OldAccessTokenScope |
|
New AccessTokenScope |
|
} |
|
|
|
func createOldTokenScope(scopes ...OldAccessTokenScope) OldAccessTokenScope { |
|
s := make([]string, 0, len(scopes)) |
|
for _, os := range scopes { |
|
s = append(s, string(os)) |
|
} |
|
return OldAccessTokenScope(strings.Join(s, ",")) |
|
} |
|
|
|
func createNewTokenScope(scopes ...AccessTokenScope) AccessTokenScope { |
|
s := make([]string, 0, len(scopes)) |
|
for _, os := range scopes { |
|
s = append(s, string(os)) |
|
} |
|
return AccessTokenScope(strings.Join(s, ",")) |
|
} |
|
|
|
func Test_ConvertScopedAccessTokens(t *testing.T) { |
|
tests := []testCase{ |
|
{ |
|
createOldTokenScope(OldAccessTokenScopeRepo, OldAccessTokenScopeUserFollow), |
|
createNewTokenScope(AccessTokenScopeWriteRepository, AccessTokenScopeWriteUser), |
|
}, |
|
{ |
|
createOldTokenScope(OldAccessTokenScopeUser, OldAccessTokenScopeWritePackage, OldAccessTokenScopeSudo), |
|
createNewTokenScope(AccessTokenScopeWriteAdmin, AccessTokenScopeWritePackage, AccessTokenScopeWriteUser), |
|
}, |
|
{ |
|
createOldTokenScope(), |
|
createNewTokenScope(), |
|
}, |
|
{ |
|
createOldTokenScope(OldAccessTokenScopeReadGPGKey, OldAccessTokenScopeReadOrg, OldAccessTokenScopeAll), |
|
createNewTokenScope(AccessTokenScopeAll), |
|
}, |
|
{ |
|
createOldTokenScope(OldAccessTokenScopeReadGPGKey, "invalid"), |
|
createNewTokenScope("invalid", AccessTokenScopeReadUser), |
|
}, |
|
} |
|
|
|
// add a test for each individual mapping |
|
for oldScope, newScope := range accessTokenScopeMap { |
|
tests = append(tests, testCase{ |
|
oldScope, |
|
createNewTokenScope(newScope...), |
|
}) |
|
} |
|
|
|
x, deferable := base.PrepareTestEnv(t, 0, new(AccessToken)) |
|
defer deferable() |
|
if x == nil || t.Failed() { |
|
t.Skip() |
|
return |
|
} |
|
|
|
// verify that no fixtures were loaded |
|
count, err := x.Count(&AccessToken{}) |
|
assert.NoError(t, err) |
|
assert.Equal(t, int64(0), count) |
|
|
|
for _, tc := range tests { |
|
_, err = x.Insert(&AccessToken{ |
|
Scope: string(tc.Old), |
|
}) |
|
assert.NoError(t, err) |
|
} |
|
|
|
// migrate the scopes |
|
err = ConvertScopedAccessTokens(x) |
|
assert.NoError(t, err) |
|
|
|
// migrate the scopes again (migration should be idempotent) |
|
err = ConvertScopedAccessTokens(x) |
|
assert.NoError(t, err) |
|
|
|
tokens := make([]AccessToken, 0) |
|
err = x.Find(&tokens) |
|
assert.NoError(t, err) |
|
assert.Len(t, tokens, len(tests)) |
|
|
|
// sort the tokens (insertion order by auto-incrementing primary key) |
|
sort.Slice(tokens, func(i, j int) bool { |
|
return tokens[i].ID < tokens[j].ID |
|
}) |
|
|
|
// verify that the converted scopes are equal to the expected test result |
|
for idx, newToken := range tokens { |
|
assert.Equal(t, string(tests[idx].New), newToken.Scope) |
|
} |
|
}
|
|
|