Ctrl K
ComunidadGuías…

scripts/install_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package scripts

import (
	"crypto/sha256"
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
	"strings"
	"testing"

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

func TestInstallRelease(t *testing.T) {
	for _, tc := range []struct{ input, tag string }{
		{"26.10.0", "26.10.0"},
		{"26.10.1", "26.10.1"},
		{"v26.10.1", "26.10.1"},
		{"26.10.0-rc.1", "26.10.0-rc.1"},
		{"0.31.0", "v0.31.0"},
		{"v0.31.0", "v0.31.0"},
		{"", "26.10.2"},
		{"", "v0.31.0"},
	} {
		input, tag := tc.input, tc.tag
		t.Run("version="+input, func(t *testing.T) {
			dir := t.TempDir()
			mockBin := filepath.Join(dir, "bin")
			require.NoError(t, os.Mkdir(mockBin, 0755))
			version := strings.TrimPrefix(tag, "v")
			writeExecutable(t, filepath.Join(dir, "memos"), "#!/bin/sh\nprintf '%s\\n' '"+version+"'\n")
			archive := filepath.Join(dir, "release.tar.gz")
			out, err := exec.Command("tar", "-czf", archive, "-C", dir, "memos").CombinedOutput()
			require.NoError(t, err, string(out))
			data, err := os.ReadFile(archive)
			require.NoError(t, err)
			asset := "memos_" + version + "_linux_amd64.tar.gz"
			require.NoError(t, os.WriteFile(filepath.Join(dir, "checksums.txt"), []byte(fmt.Sprintf("%x  %s\n", sha256.Sum256(data), asset)), 0644))
			writeExecutable(t, filepath.Join(mockBin, "uname"), "#!/bin/sh\ncase $1 in -s) echo Linux;; -m) echo x86_64;; esac\n")
			writeExecutable(t, filepath.Join(mockBin, "curl"), `#!/bin/sh
set -eu
url= dest=
while [ "$#" -gt 0 ]; do
  case "$1" in
    -o) dest="$2"; shift 2;;
    -H) shift 2;;
    -*) shift;;
    *) url="$1"; shift;;
  esac
done
printf '%s\n' "$url" >> "$TEST_DOWNLOAD_LOG"
case "$url" in
  */releases/latest) printf '{"tag_name":"%s"}\n' "$TEST_TAG";;
  */checksums.txt) cp "$TEST_FIXTURE/checksums.txt" "$dest";;
  */memos_*.tar.gz) cp "$TEST_FIXTURE/release.tar.gz" "$dest";;
  *) exit 1;;
esac
`)
			args := []string{"install.sh", "--install-dir", filepath.Join(dir, "installed")}
			if input != "" {
				args = append(args, "--version", input)
			}
			cmd := exec.Command("sh", args...)
			logPath := filepath.Join(dir, "downloads.log")
			cmd.Env = append(os.Environ(), "PATH="+mockBin+string(os.PathListSeparator)+os.Getenv("PATH"), "TEST_FIXTURE="+dir,
				"TEST_TAG="+tag, "TEST_DOWNLOAD_LOG="+logPath, "MEMOS_VERSION=", "MEMOS_SKIP_CHECKSUM=0", "REPO=usememos/memos")
			out, err = cmd.CombinedOutput()
			require.NoError(t, err, string(out))
			log, err := os.ReadFile(logPath)
			require.NoError(t, err)
			require.Contains(t, string(log), "https://github.com/usememos/memos/releases/download/"+tag+"/"+asset)
			require.Contains(t, string(log), "/"+tag+"/checksums.txt")
			out, err = exec.Command(filepath.Join(dir, "installed", "memos")).CombinedOutput()
			require.NoError(t, err)
			require.Equal(t, version+"\n", string(out))
		})
	}
}