Skip to content

Commit

Permalink
integrations: basic test for Gitea {dump,restore}-repo
Browse files Browse the repository at this point in the history
This is a first step for integration testing of DumpRepository and
RestoreRepository. It:

* runs a Gitea server,
* dumps a repo via DumpRepository to the filesystem,
* restores the repo via RestoreRepository from the filesystem,
* dumps the restored repository to the filesystem,
* compares the first and second dump and expects them to be identical

The verification is trivial and the goal is to add more tests for each
topic of the dump.

Signed-off-by: Loïc Dachary <loic@dachary.org>
  • Loading branch information
Loïc Dachary authored and realaravinth committed Jan 1, 2022
1 parent 67d7ad6 commit bf5564c
Showing 1 changed file with 106 additions and 0 deletions.
106 changes: 106 additions & 0 deletions integrations/dump_restore_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
// Copyright 2022 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.

package integrations

import (
"context"
"io/ioutil"
"net/url"
"os"
"path/filepath"
"strings"
"testing"

repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/services/migrations"

"github.com/stretchr/testify/assert"
)

func TestDumpRestore(t *testing.T) {
onGiteaRun(t, func(t *testing.T, u *url.URL) {
AllowLocalNetworks := setting.Migrations.AllowLocalNetworks
setting.Migrations.AllowLocalNetworks = true
AppVer := setting.AppVer
// TODO: Gitea SDK need to parse the AppVer from server response, so we must set it to a valid version string now.
// See also https://github.com/go-gitea/gitea/pull/18146
setting.AppVer = "1.16.0"
defer func() {
setting.Migrations.AllowLocalNetworks = AllowLocalNetworks
setting.AppVer = AppVer
}()

assert.NoError(t, migrations.Init())

reponame := "repo1"

basePath, err := os.MkdirTemp("", reponame)
assert.NoError(t, err)
defer util.RemoveAll(basePath)

repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: reponame}).(*repo_model.Repository)
repoOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: repo.OwnerID}).(*user_model.User)
session := loginUser(t, repoOwner.Name)
token := getTokenForLoggedInUser(t, session)

//
// Phase 1: dump repo1 from the Gitea instance to the filesystem
//

ctx := context.Background()
var opts = migrations.MigrateOptions{
GitServiceType: structs.GiteaService,
Issues: true,
Comments: true,
AuthToken: token,
CloneAddr: repo.CloneLink().HTTPS,
RepoName: reponame,
}
err = migrations.DumpRepository(ctx, basePath, repoOwner.Name, opts)
assert.NoError(t, err)

//
// Verify desired side effects of the dump
//
d := filepath.Join(basePath, repo.OwnerName, repo.Name)
for _, f := range []string{"repo.yml", "topic.yml", "issue.yml"} {
assert.FileExists(t, filepath.Join(d, f))
}

//
// Phase 2: restore from the filesystem to the Gitea instance in restoredrepo
//

newreponame := "restoredrepo"
err = migrations.RestoreRepository(ctx, d, repo.OwnerName, newreponame, []string{"issues", "comments"})
assert.NoError(t, err)

newrepo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{Name: newreponame}).(*repo_model.Repository)

//
// Phase 3: dump restoredrepo from the Gitea instance to the filesystem
//
opts.RepoName = newreponame
opts.CloneAddr = newrepo.CloneLink().HTTPS
err = migrations.DumpRepository(ctx, basePath, repoOwner.Name, opts)
assert.NoError(t, err)

//
// Verify the dump of restoredrepo is the same as the dump of repo1
//
newd := filepath.Join(basePath, newrepo.OwnerName, newrepo.Name)
beforeBytes, err := ioutil.ReadFile(filepath.Join(d, "repo.yml"))
assert.NoError(t, err)
before := strings.ReplaceAll(string(beforeBytes), reponame, newreponame)
after, err := ioutil.ReadFile(filepath.Join(newd, "repo.yml"))
assert.NoError(t, err)
assert.EqualValues(t, before, string(after))
})
}

0 comments on commit bf5564c

Please sign in to comment.