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  }