code.gitea.io/gitea@v1.22.3/tests/integration/mirror_push_test.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package integration 5 6 import ( 7 "context" 8 "fmt" 9 "net/http" 10 "net/url" 11 "strconv" 12 "testing" 13 14 "code.gitea.io/gitea/models/db" 15 repo_model "code.gitea.io/gitea/models/repo" 16 "code.gitea.io/gitea/models/unittest" 17 user_model "code.gitea.io/gitea/models/user" 18 "code.gitea.io/gitea/modules/git" 19 "code.gitea.io/gitea/modules/gitrepo" 20 "code.gitea.io/gitea/modules/setting" 21 gitea_context "code.gitea.io/gitea/services/context" 22 "code.gitea.io/gitea/services/migrations" 23 mirror_service "code.gitea.io/gitea/services/mirror" 24 repo_service "code.gitea.io/gitea/services/repository" 25 "code.gitea.io/gitea/tests" 26 27 "github.com/stretchr/testify/assert" 28 ) 29 30 func TestMirrorPush(t *testing.T) { 31 onGiteaRun(t, testMirrorPush) 32 } 33 34 func testMirrorPush(t *testing.T, u *url.URL) { 35 defer tests.PrepareTestEnv(t)() 36 37 setting.Migrations.AllowLocalNetworks = true 38 assert.NoError(t, migrations.Init()) 39 40 user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) 41 srcRepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1}) 42 43 mirrorRepo, err := repo_service.CreateRepositoryDirectly(db.DefaultContext, user, user, repo_service.CreateRepoOptions{ 44 Name: "test-push-mirror", 45 }) 46 assert.NoError(t, err) 47 48 ctx := NewAPITestContext(t, user.LowerName, srcRepo.Name) 49 50 doCreatePushMirror(ctx, fmt.Sprintf("%s%s/%s", u.String(), url.PathEscape(ctx.Username), url.PathEscape(mirrorRepo.Name)), user.LowerName, userPassword)(t) 51 52 mirrors, _, err := repo_model.GetPushMirrorsByRepoID(db.DefaultContext, srcRepo.ID, db.ListOptions{}) 53 assert.NoError(t, err) 54 assert.Len(t, mirrors, 1) 55 56 ok := mirror_service.SyncPushMirror(context.Background(), mirrors[0].ID) 57 assert.True(t, ok) 58 59 srcGitRepo, err := gitrepo.OpenRepository(git.DefaultContext, srcRepo) 60 assert.NoError(t, err) 61 defer srcGitRepo.Close() 62 63 srcCommit, err := srcGitRepo.GetBranchCommit("master") 64 assert.NoError(t, err) 65 66 mirrorGitRepo, err := gitrepo.OpenRepository(git.DefaultContext, mirrorRepo) 67 assert.NoError(t, err) 68 defer mirrorGitRepo.Close() 69 70 mirrorCommit, err := mirrorGitRepo.GetBranchCommit("master") 71 assert.NoError(t, err) 72 73 assert.Equal(t, srcCommit.ID, mirrorCommit.ID) 74 75 // Cleanup 76 doRemovePushMirror(ctx, fmt.Sprintf("%s%s/%s", u.String(), url.PathEscape(ctx.Username), url.PathEscape(mirrorRepo.Name)), user.LowerName, userPassword, int(mirrors[0].ID))(t) 77 mirrors, _, err = repo_model.GetPushMirrorsByRepoID(db.DefaultContext, srcRepo.ID, db.ListOptions{}) 78 assert.NoError(t, err) 79 assert.Len(t, mirrors, 0) 80 } 81 82 func doCreatePushMirror(ctx APITestContext, address, username, password string) func(t *testing.T) { 83 return func(t *testing.T) { 84 csrf := GetCSRF(t, ctx.Session, fmt.Sprintf("/%s/%s/settings", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame))) 85 86 req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/settings", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame)), map[string]string{ 87 "_csrf": csrf, 88 "action": "push-mirror-add", 89 "push_mirror_address": address, 90 "push_mirror_username": username, 91 "push_mirror_password": password, 92 "push_mirror_interval": "0", 93 }) 94 ctx.Session.MakeRequest(t, req, http.StatusSeeOther) 95 96 flashCookie := ctx.Session.GetCookie(gitea_context.CookieNameFlash) 97 assert.NotNil(t, flashCookie) 98 assert.Contains(t, flashCookie.Value, "success") 99 } 100 } 101 102 func doRemovePushMirror(ctx APITestContext, address, username, password string, pushMirrorID int) func(t *testing.T) { 103 return func(t *testing.T) { 104 csrf := GetCSRF(t, ctx.Session, fmt.Sprintf("/%s/%s/settings", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame))) 105 106 req := NewRequestWithValues(t, "POST", fmt.Sprintf("/%s/%s/settings", url.PathEscape(ctx.Username), url.PathEscape(ctx.Reponame)), map[string]string{ 107 "_csrf": csrf, 108 "action": "push-mirror-remove", 109 "push_mirror_id": strconv.Itoa(pushMirrorID), 110 "push_mirror_address": address, 111 "push_mirror_username": username, 112 "push_mirror_password": password, 113 "push_mirror_interval": "0", 114 }) 115 ctx.Session.MakeRequest(t, req, http.StatusSeeOther) 116 117 flashCookie := ctx.Session.GetCookie(gitea_context.CookieNameFlash) 118 assert.NotNil(t, flashCookie) 119 assert.Contains(t, flashCookie.Value, "success") 120 } 121 }