diff --git a/models/fixtures/repo_redirect.yml b/models/fixtures/repo_redirect.yml index 8850c8d780..82d365c600 100644 --- a/models/fixtures/repo_redirect.yml +++ b/models/fixtures/repo_redirect.yml @@ -3,3 +3,9 @@ owner_id: 2 lower_name: oldrepo1 redirect_repo_id: 1 + +- + id: 2 + owner_id: 17 + lower_name: oldrepo24 + redirect_repo_id: 24 diff --git a/services/redirect/repo_test.go b/services/redirect/repo_test.go new file mode 100644 index 0000000000..cad8414035 --- /dev/null +++ b/services/redirect/repo_test.go @@ -0,0 +1,55 @@ +// Copyright 2025 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT +package redirect + +import ( + "testing" + + repo_model "forgejo.org/models/repo" + "forgejo.org/models/unittest" + user_model "forgejo.org/models/user" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestLookupRepoRedirect(t *testing.T) { + require.NoError(t, unittest.PrepareTestDatabase()) + + normalUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 5}) + ownerUser := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 20}) + + testOk := func(t *testing.T, doer *user_model.User, ownerID int64, repoName string, expectedRedirectID int64) { + t.Helper() + + redirectID, err := LookupRepoRedirect(t.Context(), doer, ownerID, repoName) + require.NoError(t, err) + assert.Equal(t, expectedRedirectID, redirectID) + } + + testFail := func(t *testing.T, doer *user_model.User, ownerID int64, repoName string) { + t.Helper() + + redirectID, err := LookupRepoRedirect(t.Context(), doer, ownerID, repoName) + require.ErrorIs(t, err, repo_model.ErrRedirectNotExist{OwnerID: ownerID, RepoName: repoName, MissingPermission: true}) + assert.Zero(t, redirectID) + } + + t.Run("Public repository", func(t *testing.T) { + ownerID := int64(2) + reponame := "oldrepo1" + + testOk(t, nil, ownerID, reponame, 1) + testOk(t, normalUser, ownerID, reponame, 1) + testOk(t, ownerUser, ownerID, reponame, 1) + }) + + t.Run("Private repository", func(t *testing.T) { + ownerID := int64(17) + reponame := "oldrepo24" + + testFail(t, nil, ownerID, reponame) + testFail(t, normalUser, ownerID, reponame) + testOk(t, ownerUser, ownerID, reponame, 24) + }) +}