gitlab-org--gitlab-foss/workhorse/internal/git/archive_test.go

88 lines
2.6 KiB
Go

package git
import (
"net/http/httptest"
"os"
"testing"
"gitlab.com/gitlab-org/gitaly/v15/proto/go/gitalypb"
"gitlab.com/gitlab-org/gitlab/workhorse/internal/testhelper"
"github.com/stretchr/testify/require"
)
func TestParseBasename(t *testing.T) {
for _, testCase := range []struct {
in string
out gitalypb.GetArchiveRequest_Format
}{
{"archive", gitalypb.GetArchiveRequest_TAR_GZ},
{"master.tar.gz", gitalypb.GetArchiveRequest_TAR_GZ},
{"foo-master.tgz", gitalypb.GetArchiveRequest_TAR_GZ},
{"foo-v1.2.1.gz", gitalypb.GetArchiveRequest_TAR_GZ},
{"foo.tar.bz2", gitalypb.GetArchiveRequest_TAR_BZ2},
{"archive.tbz", gitalypb.GetArchiveRequest_TAR_BZ2},
{"archive.tbz2", gitalypb.GetArchiveRequest_TAR_BZ2},
{"archive.tb2", gitalypb.GetArchiveRequest_TAR_BZ2},
{"archive.bz2", gitalypb.GetArchiveRequest_TAR_BZ2},
} {
basename := testCase.in
out, ok := parseBasename(basename)
if !ok {
t.Fatalf("parseBasename did not recognize %q", basename)
}
if out != testCase.out {
t.Fatalf("expected %q, got %q", testCase.out, out)
}
}
}
func TestFinalizeArchive(t *testing.T) {
tempFile, err := os.CreateTemp("", "gitlab-workhorse-test")
if err != nil {
t.Fatal(err)
}
defer tempFile.Close()
// Deliberately cause an EEXIST error: we know tempFile.Name() already exists
err = finalizeCachedArchive(tempFile, tempFile.Name())
if err != nil {
t.Fatalf("expected nil from finalizeCachedArchive, received %v", err)
}
}
func TestSetArchiveHeaders(t *testing.T) {
for _, testCase := range []struct {
in gitalypb.GetArchiveRequest_Format
out string
}{
{gitalypb.GetArchiveRequest_ZIP, "application/zip"},
{gitalypb.GetArchiveRequest_TAR, "application/octet-stream"},
{gitalypb.GetArchiveRequest_TAR_GZ, "application/octet-stream"},
{gitalypb.GetArchiveRequest_TAR_BZ2, "application/octet-stream"},
} {
w := httptest.NewRecorder()
// These should be replaced, not appended to
w.Header().Set("Content-Type", "test")
w.Header().Set("Content-Length", "test")
w.Header().Set("Content-Disposition", "test")
// This should be deleted
w.Header().Set("Set-Cookie", "test")
// This should be preserved
w.Header().Set("Cache-Control", "public, max-age=3600")
setArchiveHeaders(w, testCase.in, "filename")
testhelper.RequireResponseHeader(t, w, "Content-Type", testCase.out)
testhelper.RequireResponseHeader(t, w, "Content-Length")
testhelper.RequireResponseHeader(t, w, "Content-Disposition", `attachment; filename="filename"`)
testhelper.RequireResponseHeader(t, w, "Cache-Control", "public, max-age=3600")
require.Empty(t, w.Header().Get("Set-Cookie"), "remove Set-Cookie")
}
}