Skip to content

Commit 1d13cc3

Browse files
committed
Add tests
1 parent ec58717 commit 1d13cc3

File tree

6 files changed

+194
-13
lines changed

6 files changed

+194
-13
lines changed

services/repository/adopt.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ func AdoptRepository(ctx context.Context, doer, u *user_model.User, opts CreateR
7373
}
7474

7575
// last - clean up if something goes wrong
76+
// WARNING: Don't override all later err with local variables
7677
defer func() {
7778
if err != nil {
7879
if errDel := deleteFailedAdoptRepository(ctx, repo.ID); errDel != nil {
@@ -88,15 +89,16 @@ func AdoptRepository(ctx context.Context, doer, u *user_model.User, opts CreateR
8889
}
8990

9091
// 3 - adopt the repository from disk
91-
if err := adoptRepository(ctx, repo, opts.DefaultBranch); err != nil {
92+
if err = adoptRepository(ctx, repo, opts.DefaultBranch); err != nil {
9293
return nil, fmt.Errorf("adoptRepository: %w", err)
9394
}
9495

95-
if err := repo_module.CheckDaemonExportOK(ctx, repo); err != nil {
96+
if err = repo_module.CheckDaemonExportOK(ctx, repo); err != nil {
9697
return nil, fmt.Errorf("checkDaemonExportOK: %w", err)
9798
}
9899

99-
if stdout, _, err := git.NewCommand("update-server-info").
100+
var stdout string
101+
if stdout, _, err = git.NewCommand("update-server-info").
100102
RunStdString(ctx, &git.RunOpts{Dir: repo.RepoPath()}); err != nil {
101103
log.Error("CreateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err)
102104
return nil, fmt.Errorf("CreateRepository(git update-server-info): %w", err)

services/repository/adopt_test.go

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,19 @@
44
package repository
55

66
import (
7+
"context"
78
"os"
89
"path"
910
"path/filepath"
1011
"testing"
12+
"time"
1113

1214
"code.gitea.io/gitea/models/db"
1315
repo_model "code.gitea.io/gitea/models/repo"
1416
"code.gitea.io/gitea/models/unittest"
1517
user_model "code.gitea.io/gitea/models/user"
1618
"code.gitea.io/gitea/modules/setting"
19+
"code.gitea.io/gitea/modules/util"
1720

1821
"github.com/stretchr/testify/assert"
1922
)
@@ -89,10 +92,31 @@ func TestListUnadoptedRepositories_ListOptions(t *testing.T) {
8992

9093
func TestAdoptRepository(t *testing.T) {
9194
assert.NoError(t, unittest.PrepareTestDatabase())
95+
96+
// a successful adopt
9297
assert.NoError(t, unittest.SyncDirs(filepath.Join(setting.RepoRootPath, "user2", "repo1.git"), filepath.Join(setting.RepoRootPath, "user2", "test-adopt.git")))
9398
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
94-
_, err := AdoptRepository(db.DefaultContext, user2, user2, CreateRepoOptions{Name: "test-adopt"})
99+
adoptedRepo, err := AdoptRepository(db.DefaultContext, user2, user2, CreateRepoOptions{Name: "test-adopt"})
95100
assert.NoError(t, err)
96101
repoTestAdopt := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: "test-adopt"})
97102
assert.Equal(t, "sha1", repoTestAdopt.ObjectFormatName)
103+
104+
// just delete the adopted repo's db records
105+
err = deleteFailedAdoptRepository(db.DefaultContext, adoptedRepo.ID)
106+
assert.NoError(t, err)
107+
108+
unittest.AssertNotExistsBean(t, &repo_model.Repository{OwnerName: "user2", Name: "test-adopt"})
109+
110+
// a failed adopt
111+
ctx, cancel := context.WithTimeout(db.DefaultContext, 1*time.Microsecond)
112+
defer cancel()
113+
adoptedRepo, err = AdoptRepository(ctx, user2, user2, CreateRepoOptions{Name: "test-adopt"})
114+
assert.Error(t, err)
115+
assert.Nil(t, adoptedRepo)
116+
117+
unittest.AssertNotExistsBean(t, &repo_model.Repository{OwnerName: "user2", Name: "test-adopt"})
118+
119+
exist, err := util.IsExist(repo_model.RepoPath("user2", "test-adopt"))
120+
assert.NoError(t, err)
121+
assert.True(t, exist) // the repository should be still in the disk
98122
}

services/repository/create_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Copyright 2025 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package repository
5+
6+
import (
7+
"context"
8+
"testing"
9+
"time"
10+
11+
"code.gitea.io/gitea/models/db"
12+
repo_model "code.gitea.io/gitea/models/repo"
13+
"code.gitea.io/gitea/models/unittest"
14+
user_model "code.gitea.io/gitea/models/user"
15+
"code.gitea.io/gitea/modules/git"
16+
"code.gitea.io/gitea/modules/util"
17+
18+
"github.com/stretchr/testify/assert"
19+
)
20+
21+
func TestCreateRepositoryDirectly(t *testing.T) {
22+
assert.NoError(t, unittest.PrepareTestDatabase())
23+
24+
// a successful generate from template
25+
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
26+
27+
createdRepo, err := CreateRepositoryDirectly(git.DefaultContext, user2, user2, CreateRepoOptions{
28+
Name: "created-repo",
29+
})
30+
assert.NoError(t, err)
31+
assert.NotNil(t, createdRepo)
32+
33+
exist, err := util.IsExist(repo_model.RepoPath(user2.Name, createdRepo.Name))
34+
assert.NoError(t, err)
35+
assert.True(t, exist)
36+
37+
unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: user2.Name, Name: createdRepo.Name})
38+
39+
err = DeleteRepositoryDirectly(db.DefaultContext, user2, createdRepo.ID)
40+
assert.NoError(t, err)
41+
42+
// a failed generate because a timeout
43+
ctx, cancel := context.WithTimeout(db.DefaultContext, 1*time.Millisecond)
44+
defer cancel()
45+
createdRepo2, err := CreateRepositoryDirectly(ctx, user2, user2, CreateRepoOptions{
46+
Name: "created-repo",
47+
})
48+
assert.Nil(t, createdRepo2)
49+
assert.Error(t, err)
50+
51+
// assert the cleanup is successful
52+
unittest.AssertNotExistsBean(t, &repo_model.Repository{OwnerName: user2.Name, Name: createdRepo.Name})
53+
54+
exist, err = util.IsExist(repo_model.RepoPath(user2.Name, createdRepo.Name))
55+
assert.NoError(t, err)
56+
assert.False(t, exist)
57+
}

services/repository/fork.go

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork
120120
}
121121

122122
// last - clean up if something goes wrong
123+
// WARNING: Don't override all later err with local variables
123124
defer func() {
124125
if err != nil {
125126
if errDelete := DeleteRepositoryDirectly(ctx, doer, repo.ID); errDelete != nil {
@@ -133,20 +134,22 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork
133134
if opts.SingleBranch != "" {
134135
cloneCmd.AddArguments("--single-branch", "--branch").AddDynamicArguments(opts.SingleBranch)
135136
}
136-
if stdout, _, err := cloneCmd.AddDynamicArguments(opts.BaseRepo.RepoPath(), repo.RepoPath()).
137+
var stdout []byte
138+
if stdout, _, err = cloneCmd.AddDynamicArguments(opts.BaseRepo.RepoPath(), repo.RepoPath()).
137139
RunStdBytes(ctx, &git.RunOpts{Timeout: 10 * time.Minute}); err != nil {
138140
log.Error("Fork Repository (git clone) Failed for %v (from %v):\nStdout: %s\nError: %v", repo, opts.BaseRepo, stdout, err)
139141
return nil, fmt.Errorf("git clone: %w", err)
140142
}
141143

142144
// 3 - Update the repository
143-
if err := repo_module.CheckDaemonExportOK(ctx, repo); err != nil {
145+
if err = repo_module.CheckDaemonExportOK(ctx, repo); err != nil {
144146
return nil, fmt.Errorf("checkDaemonExportOK: %w", err)
145147
}
146148

147-
if stdout, _, err := git.NewCommand("update-server-info").
149+
var output string
150+
if output, _, err = git.NewCommand("update-server-info").
148151
RunStdString(ctx, &git.RunOpts{Dir: repo.RepoPath()}); err != nil {
149-
log.Error("Fork Repository (git update-server-info) failed for %v:\nStdout: %s\nError: %v", repo, stdout, err)
152+
log.Error("Fork Repository (git update-server-info) failed for %v:\nStdout: %s\nError: %v", repo, output, err)
150153
return nil, fmt.Errorf("git update-server-info: %w", err)
151154
}
152155

@@ -156,7 +159,8 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork
156159
}
157160

158161
// 5 - Sync the repository branches and tags
159-
gitRepo, err := gitrepo.OpenRepository(ctx, repo)
162+
var gitRepo *git.Repository
163+
gitRepo, err = gitrepo.OpenRepository(ctx, repo)
160164
if err != nil {
161165
return nil, fmt.Errorf("OpenRepository: %w", err)
162166
}
@@ -165,19 +169,21 @@ func ForkRepository(ctx context.Context, doer, owner *user_model.User, opts Fork
165169
if _, err = repo_module.SyncRepoBranchesWithRepo(ctx, repo, gitRepo, doer.ID); err != nil {
166170
return nil, fmt.Errorf("SyncRepoBranchesWithRepo: %w", err)
167171
}
168-
if err := repo_module.SyncReleasesWithTags(ctx, repo, gitRepo); err != nil {
172+
if err = repo_module.SyncReleasesWithTags(ctx, repo, gitRepo); err != nil {
169173
return nil, fmt.Errorf("Sync releases from git tags failed: %v", err)
170174
}
171175

172176
// 6 - Update the repository
173177
// even if below operations failed, it could be ignored. And they will be retried
174-
if err := repo_module.UpdateRepoSize(ctx, repo); err != nil {
178+
if err = repo_module.UpdateRepoSize(ctx, repo); err != nil {
175179
log.Error("Failed to update size for repository: %v", err)
180+
err = nil
176181
}
177-
if err := repo_model.CopyLanguageStat(ctx, opts.BaseRepo, repo); err != nil {
182+
if err = repo_model.CopyLanguageStat(ctx, opts.BaseRepo, repo); err != nil {
178183
log.Error("Copy language stat from oldRepo failed: %v", err)
184+
err = nil
179185
}
180-
if err := repo_model.CopyLicense(ctx, opts.BaseRepo, repo); err != nil {
186+
if err = repo_model.CopyLicense(ctx, opts.BaseRepo, repo); err != nil {
181187
return nil, err
182188
}
183189

services/repository/fork_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44
package repository
55

66
import (
7+
"context"
78
"testing"
9+
"time"
810

11+
"code.gitea.io/gitea/models/db"
912
repo_model "code.gitea.io/gitea/models/repo"
1013
"code.gitea.io/gitea/models/unittest"
1114
user_model "code.gitea.io/gitea/models/user"
1215
"code.gitea.io/gitea/modules/git"
1316
"code.gitea.io/gitea/modules/setting"
17+
"code.gitea.io/gitea/modules/util"
1418

1519
"github.com/stretchr/testify/assert"
1620
)
@@ -46,3 +50,42 @@ func TestForkRepository(t *testing.T) {
4650
assert.Nil(t, fork2)
4751
assert.True(t, repo_model.IsErrReachLimitOfRepo(err))
4852
}
53+
54+
func TestForkRepositoryCleanup(t *testing.T) {
55+
assert.NoError(t, unittest.PrepareTestDatabase())
56+
57+
// a successful fork
58+
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
59+
repo10 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 10})
60+
61+
fork, err := ForkRepository(git.DefaultContext, user2, user2, ForkRepoOptions{
62+
BaseRepo: repo10,
63+
Name: "test",
64+
})
65+
assert.NoError(t, err)
66+
assert.NotNil(t, fork)
67+
68+
exist, err := util.IsExist(repo_model.RepoPath(user2.Name, "test"))
69+
assert.NoError(t, err)
70+
assert.True(t, exist)
71+
72+
err = DeleteRepositoryDirectly(db.DefaultContext, user2, fork.ID)
73+
assert.NoError(t, err)
74+
75+
// a failed fork because a timeout
76+
ctx, cancel := context.WithTimeout(db.DefaultContext, 1*time.Millisecond)
77+
defer cancel()
78+
fork2, err := ForkRepository(ctx, user2, user2, ForkRepoOptions{
79+
BaseRepo: repo10,
80+
Name: "test",
81+
})
82+
assert.Nil(t, fork2)
83+
assert.Error(t, err)
84+
85+
// assert the cleanup is successful
86+
unittest.AssertNotExistsBean(t, &repo_model.Repository{OwnerName: "test", Name: "test"})
87+
88+
exist, err = util.IsExist(repo_model.RepoPath("test", "test"))
89+
assert.NoError(t, err)
90+
assert.False(t, exist)
91+
}

tests/integration/repo_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,23 @@
44
package integration
55

66
import (
7+
"context"
78
"fmt"
89
"net/http"
910
"path"
1011
"strings"
1112
"testing"
1213
"time"
1314

15+
"code.gitea.io/gitea/models/db"
16+
repo_model "code.gitea.io/gitea/models/repo"
17+
"code.gitea.io/gitea/models/unittest"
18+
user_model "code.gitea.io/gitea/models/user"
19+
"code.gitea.io/gitea/modules/git"
1420
"code.gitea.io/gitea/modules/setting"
1521
"code.gitea.io/gitea/modules/test"
22+
"code.gitea.io/gitea/modules/util"
23+
repo_service "code.gitea.io/gitea/services/repository"
1624
"code.gitea.io/gitea/tests"
1725

1826
"github.com/PuerkitoBio/goquery"
@@ -442,3 +450,44 @@ func TestViewCommit(t *testing.T) {
442450
resp := MakeRequest(t, req, http.StatusNotFound)
443451
assert.True(t, test.IsNormalPageCompleted(resp.Body.String()), "non-existing commit should render 404 page")
444452
}
453+
454+
func TestGenerateRepository(t *testing.T) {
455+
defer tests.PrepareTestEnv(t)()
456+
457+
// a successful generate from template
458+
user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
459+
repo44 := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 44})
460+
461+
generatedRepo, err := repo_service.GenerateRepository(git.DefaultContext, user2, user2, repo44, repo_service.GenerateRepoOptions{
462+
Name: "generated-from-template-44",
463+
GitContent: true,
464+
})
465+
assert.NoError(t, err)
466+
assert.NotNil(t, generatedRepo)
467+
468+
exist, err := util.IsExist(repo_model.RepoPath(user2.Name, generatedRepo.Name))
469+
assert.NoError(t, err)
470+
assert.True(t, exist)
471+
472+
unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{OwnerName: user2.Name, Name: generatedRepo.Name})
473+
474+
err = repo_service.DeleteRepositoryDirectly(db.DefaultContext, user2, generatedRepo.ID)
475+
assert.NoError(t, err)
476+
477+
// a failed generate because a timeout
478+
ctx, cancel := context.WithTimeout(db.DefaultContext, 1*time.Millisecond)
479+
defer cancel()
480+
generatedRepo2, err := repo_service.GenerateRepository(ctx, user2, user2, repo44, repo_service.GenerateRepoOptions{
481+
Name: "generated-from-template-44",
482+
GitContent: true,
483+
})
484+
assert.Nil(t, generatedRepo2)
485+
assert.Error(t, err)
486+
487+
// assert the cleanup is successful
488+
unittest.AssertNotExistsBean(t, &repo_model.Repository{OwnerName: user2.Name, Name: generatedRepo.Name})
489+
490+
exist, err = util.IsExist(repo_model.RepoPath(user2.Name, generatedRepo.Name))
491+
assert.NoError(t, err)
492+
assert.False(t, exist)
493+
}

0 commit comments

Comments
 (0)