Files
gitea/services/repository/delete_test.go
silverwind 66d6f74cb0 test: speed up tests, fix transaction bug (#39030)
Speed up tests: `make test-backend` 103s to 37s, `make test-integration`
908s to 852s.

Most of it is a detached system notice insert blocking on the SQLite
write lock until the busy timeout expired, and `ExternalServiceHTTP`
re-probing on every call with an untimed `http.Get`.

- fixed one correctness bug with nested transactions: files were deleted
while the outer transaction was open, so a later failure could roll the
database back with the files gone
- git push branch counts were far above the hook batch size
- Fix makefile dependencies so running tests and lint work in fresh
worktrees.

---------

Co-authored-by: Giteabot <teabot@gitea.io>
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
2026-08-22 11:04:35 +00:00

94 lines
3.4 KiB
Go

// Copyright 2017 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package repository_test
import (
"context"
"testing"
actions_model "gitea.dev/models/actions"
"gitea.dev/models/db"
git_model "gitea.dev/models/git"
"gitea.dev/models/organization"
repo_model "gitea.dev/models/repo"
"gitea.dev/models/unittest"
user_model "gitea.dev/models/user"
repo_service "gitea.dev/services/repository"
"github.com/stretchr/testify/assert"
)
func TestTeam_HasRepository(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
test := func(teamID, repoID int64, expected bool) {
team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: teamID})
assert.Equal(t, expected, repo_service.HasRepository(t.Context(), team, repoID))
}
test(1, 1, false)
test(1, 3, true)
test(1, 5, true)
test(1, unittest.NonexistentID, false)
test(2, 3, true)
test(2, 5, false)
}
func TestTeam_RemoveRepository(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
testSuccess := func(teamID, repoID int64) {
team := unittest.AssertExistsAndLoadBean(t, &organization.Team{ID: teamID})
assert.NoError(t, repo_service.RemoveRepositoryFromTeam(t.Context(), team, repoID))
unittest.AssertNotExistsBean(t, &organization.TeamRepo{TeamID: teamID, RepoID: repoID})
unittest.CheckConsistencyFor(t, &organization.Team{ID: teamID}, &repo_model.Repository{ID: repoID})
}
testSuccess(2, 3)
testSuccess(2, 5)
testSuccess(1, unittest.NonexistentID)
}
func TestDeleteOwnerRepositoriesDirectly(t *testing.T) {
unittest.PrepareTestEnv(t)
user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
assert.NoError(t, repo_service.DeleteOwnerRepositoriesDirectly(t.Context(), user))
t.Run("RejectedInTransaction", func(t *testing.T) {
unittest.PrepareTestEnv(t)
err := db.WithTx(t.Context(), func(ctx context.Context) error {
return repo_service.DeleteRepositoryDirectly(ctx, 1)
})
assert.ErrorContains(t, err, "must not be called within a transaction")
unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
})
}
func TestDeleteRepositoryDirectlyPurgesRepoScopedRows(t *testing.T) {
unittest.PrepareTestEnv(t)
// One row per table that repository deletion used to leave behind (#38494).
assert.NoError(t, db.Insert(t.Context(),
&actions_model.ActionVariable{RepoID: 1, Name: "to_purge", Data: "value"},
&actions_model.ActionRunAttempt{RepoID: 1, RunID: unittest.NonexistentID, Attempt: 1},
&actions_model.ActionTasksVersion{RepoID: 1, Version: 1},
&git_model.RenamedBranch{RepoID: 1, From: "old-name", To: "new-name"},
&git_model.CommitStatusSummary{RepoID: 1, SHA: "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef", State: "success"},
&repo_model.RepoTransfer{RepoID: 1, DoerID: 2, RecipientID: 3},
))
unittest.AssertExistsAndLoadBean(t, &git_model.CommitStatusIndex{RepoID: 1})
assert.NoError(t, repo_service.DeleteRepositoryDirectly(t.Context(), 1))
unittest.AssertNotExistsBean(t, &actions_model.ActionVariable{RepoID: 1})
unittest.AssertNotExistsBean(t, &actions_model.ActionRunAttempt{RepoID: 1})
unittest.AssertNotExistsBean(t, &actions_model.ActionTasksVersion{RepoID: 1})
unittest.AssertNotExistsBean(t, &git_model.RenamedBranch{RepoID: 1})
unittest.AssertNotExistsBean(t, &git_model.CommitStatusSummary{RepoID: 1})
unittest.AssertNotExistsBean(t, &git_model.CommitStatusIndex{RepoID: 1})
unittest.AssertNotExistsBean(t, &repo_model.RepoTransfer{RepoID: 1})
}