|
5 | 5 | package integrations
|
6 | 6 |
|
7 | 7 | import (
|
| 8 | + "fmt" |
| 9 | + "net/http" |
| 10 | + "net/url" |
8 | 11 | "os"
|
9 | 12 | "testing"
|
10 | 13 |
|
| 14 | + repo_model "code.gitea.io/gitea/models/repo" |
11 | 15 | "code.gitea.io/gitea/models/unittest"
|
12 | 16 | user_model "code.gitea.io/gitea/models/user"
|
13 | 17 | "code.gitea.io/gitea/modules/setting"
|
| 18 | + "code.gitea.io/gitea/modules/structs" |
14 | 19 | "code.gitea.io/gitea/services/migrations"
|
15 | 20 |
|
16 | 21 | "github.com/stretchr/testify/assert"
|
@@ -40,3 +45,54 @@ func TestMigrateLocalPath(t *testing.T) {
|
40 | 45 |
|
41 | 46 | setting.ImportLocalPaths = old
|
42 | 47 | }
|
| 48 | + |
| 49 | +func TestMigrateGiteaForm(t *testing.T) { |
| 50 | + onGiteaRun(t, func(t *testing.T, u *url.URL) { |
| 51 | + AllowLocalNetworks := setting.Migrations.AllowLocalNetworks |
| 52 | + setting.Migrations.AllowLocalNetworks = true |
| 53 | + AppVer := setting.AppVer |
| 54 | + // Gitea SDK (go-sdk) need to parse the AppVer from server response, so we must set it to a valid version string. |
| 55 | + setting.AppVer = "1.16.0" |
| 56 | + defer func() { |
| 57 | + setting.Migrations.AllowLocalNetworks = AllowLocalNetworks |
| 58 | + setting.AppVer = AppVer |
| 59 | + migrations.Init() |
| 60 | + }() |
| 61 | + assert.NoError(t, migrations.Init()) |
| 62 | + |
| 63 | + ownerName := "user2" |
| 64 | + repoName := "repo1" |
| 65 | + repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: ownerName}).(*user_model.User) |
| 66 | + session := loginUser(t, ownerName) |
| 67 | + token := getTokenForLoggedInUser(t, session) |
| 68 | + |
| 69 | + // Step 0: verify the repo is available |
| 70 | + req := NewRequestf(t, "GET", fmt.Sprintf("/%s/%s", ownerName, repoName)) |
| 71 | + _ = session.MakeRequest(t, req, http.StatusOK) |
| 72 | + // Step 1: get the Gitea migration form |
| 73 | + req = NewRequestf(t, "GET", "/repo/migrate/?service_type=%d", structs.GiteaService) |
| 74 | + resp := session.MakeRequest(t, req, http.StatusOK) |
| 75 | + // Step 2: load the form |
| 76 | + htmlDoc := NewHTMLParser(t, resp.Body) |
| 77 | + link, exists := htmlDoc.doc.Find(`form.ui.form[action^="/repo/migrate"]`).Attr("action") |
| 78 | + assert.True(t, exists, "The template has changed") |
| 79 | + // Step 4: submit the migration to only migrate issues |
| 80 | + migratedRepoName := "otherrepo" |
| 81 | + req = NewRequestWithValues(t, "POST", link, map[string]string{ |
| 82 | + "_csrf": htmlDoc.GetCSRF(), |
| 83 | + "service": fmt.Sprintf("%d", structs.GiteaService), |
| 84 | + "clone_addr": fmt.Sprintf("%s%s/%s", u, ownerName, repoName), |
| 85 | + "auth_token": token, |
| 86 | + "issues": "on", |
| 87 | + "repo_name": migratedRepoName, |
| 88 | + "description": "", |
| 89 | + "uid": fmt.Sprintf("%d", repoOwner.ID), |
| 90 | + }) |
| 91 | + resp = session.MakeRequest(t, req, http.StatusSeeOther) |
| 92 | + // Step 5: a redirection displays the migrated repository |
| 93 | + loc := resp.Header().Get("Location") |
| 94 | + assert.EqualValues(t, fmt.Sprintf("/%s/%s", ownerName, migratedRepoName), loc) |
| 95 | + // Step 6: check the repo was created |
| 96 | + unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: migratedRepoName}) |
| 97 | + }) |
| 98 | +} |
0 commit comments