diff options
Diffstat (limited to 'internal/gitaly/service/repository/create_fork_test.go')
-rw-r--r-- | internal/gitaly/service/repository/create_fork_test.go | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/internal/gitaly/service/repository/create_fork_test.go b/internal/gitaly/service/repository/create_fork_test.go index 502a31f34..c699e40c0 100644 --- a/internal/gitaly/service/repository/create_fork_test.go +++ b/internal/gitaly/service/repository/create_fork_test.go @@ -9,6 +9,7 @@ import ( "testing" "github.com/stretchr/testify/require" + "gitlab.com/gitlab-org/gitaly/v16/internal/git" "gitlab.com/gitlab-org/gitaly/v16/internal/git/gittest" "gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/config" "gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/storage" @@ -88,6 +89,97 @@ func TestCreateFork_successful(t *testing.T) { } } +func TestCreateFork_revision(t *testing.T) { + t.Parallel() + + mainRef := git.ReferenceName("refs/heads/main") + wipRef := git.ReferenceName("refs/heads/wip") + unknownRef := []byte("refs/heads/unknown") + invalidRef := []byte("v1.2.3") + ambiguousRef := git.ReferenceName("refs/heads/v1.0.0") + + cfg, client := setupRepositoryService(t) + + ctx := testhelper.Context(t) + ctx = testhelper.MergeOutgoingMetadata(ctx, testcfg.GitalyServersMetadataFromCfg(t, cfg)) + + for _, tt := range []struct { + name string + revision []byte + expectedRefs []git.ReferenceName + expectedErr bool + }{ + { + name: "all branches", + revision: nil, + expectedRefs: []git.ReferenceName{mainRef, wipRef}, + }, + { + name: "single revision with success", + revision: []byte(wipRef), + expectedRefs: []git.ReferenceName{wipRef}, + }, + { + name: "single unknown revision with failure", + revision: unknownRef, + expectedErr: true, + }, + { + name: "single invalid revision with failure", + revision: invalidRef, + expectedErr: true, + }, + { + name: "ambiguous reference", + revision: []byte(ambiguousRef), + expectedErr: true, + }, + } { + t.Run(tt.name, func(t *testing.T) { + + repo, repoPath := gittest.CreateRepository(t, ctx, cfg) + + commitID := gittest.WriteCommit(t, cfg, repoPath) + for _, ref := range []git.ReferenceName{ + mainRef, + wipRef, + "refs/tags/v1.0.0", + } { + gittest.WriteRef(t, cfg, repoPath, ref, commitID) + } + + forkedRepo := &gitalypb.Repository{ + RelativePath: gittest.NewRepositoryName(t), + StorageName: repo.GetStorageName(), + } + + _, err := client.CreateFork(ctx, &gitalypb.CreateForkRequest{ + Repository: forkedRepo, + SourceRepository: repo, + Revision: tt.revision, + }) + + if tt.expectedErr { + require.Error(t, err) + } else { + require.NoError(t, err) + + replicaPath := gittest.GetReplicaPath(t, ctx, cfg, forkedRepo) + forkedRepoPath := filepath.Join(cfg.Storages[0].Path, replicaPath) + + actualRefs := strings.Split(strings.Trim(string(gittest.Exec(t, cfg, "-C", forkedRepoPath, "show-ref")), "\n"), "\n") + var expectedRefs []string + + for _, ref := range tt.expectedRefs { + expectedRefs = append(expectedRefs, fmt.Sprintf("%s %s", commitID.String(), ref)) + } + + require.Equal(t, expectedRefs, actualRefs) + } + }) + } +} + func TestCreateFork_refs(t *testing.T) { t.Parallel() ctx := testhelper.Context(t) |