26f897c1ec
release / release-please (push) Failing after 1m49s
docs / build (push) Failing after 6m34s
release / build-and-upload (arm64, linux) (push) Has been cancelled
release / build-and-upload (arm64, windows) (push) Has been cancelled
release / build-darwin (amd64, darwin) (push) Has been cancelled
release / checksums (push) Has been cancelled
release / finalize (push) Has been cancelled
release / build-darwin (arm64, darwin) (push) Has been cancelled
release / build-and-upload (amd64, linux) (push) Has been cancelled
release / build-and-upload (amd64, windows) (push) Has been cancelled
docs / deploy (push) Has been cancelled
209 lines
6.2 KiB
Go
209 lines
6.2 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"runtime"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestMakeBuildPrioritizesDotEnvUmamiWebsiteID(t *testing.T) {
|
|
skipMakeBuildTestsOnWindows(t)
|
|
|
|
makePath, err := exec.LookPath("make")
|
|
if err != nil {
|
|
t.Skip("make not available")
|
|
}
|
|
|
|
workDir := writeTestMakeWorkspace(t)
|
|
if err := os.WriteFile(filepath.Join(workDir, ".env"), []byte("NO_MISTAKES_UMAMI_WEBSITE_ID=website-from-dotenv\n"), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
output := runMakeDryBuild(t, makePath, workDir, map[string]string{
|
|
"UMAMI_WEBSITE_ID": "website-from-env",
|
|
})
|
|
|
|
if !strings.Contains(output, "TelemetryWebsiteID=website-from-dotenv") {
|
|
t.Fatalf("make build output should embed .env website id, got:\n%s", output)
|
|
}
|
|
if strings.Contains(output, "TelemetryWebsiteID=website-from-env") {
|
|
t.Fatalf("make build output should not prefer env website id when .env exists, got:\n%s", output)
|
|
}
|
|
}
|
|
|
|
func TestMakeBuildUsesEnvUmamiWebsiteIDWhenDotEnvMissing(t *testing.T) {
|
|
skipMakeBuildTestsOnWindows(t)
|
|
|
|
makePath, err := exec.LookPath("make")
|
|
if err != nil {
|
|
t.Skip("make not available")
|
|
}
|
|
|
|
workDir := writeTestMakeWorkspace(t)
|
|
output := runMakeDryBuild(t, makePath, workDir, map[string]string{
|
|
"UMAMI_WEBSITE_ID": "website-from-env",
|
|
})
|
|
|
|
if !strings.Contains(output, "TelemetryWebsiteID=website-from-env") {
|
|
t.Fatalf("make build output should embed env website id when .env is absent, got:\n%s", output)
|
|
}
|
|
}
|
|
|
|
func TestMakeBuildEmbedsDefaultSelfHostedTelemetryConfig(t *testing.T) {
|
|
skipMakeBuildTestsOnWindows(t)
|
|
|
|
makePath, err := exec.LookPath("make")
|
|
if err != nil {
|
|
t.Skip("make not available")
|
|
}
|
|
|
|
workDir := writeTestMakeWorkspace(t)
|
|
output := runMakeDryBuild(t, makePath, workDir, nil)
|
|
|
|
if !strings.Contains(output, "TelemetryHost=https://a.kunchenguid.com") {
|
|
t.Fatalf("make build output should embed default telemetry host, got:\n%s", output)
|
|
}
|
|
if !strings.Contains(output, "TelemetryWebsiteID=f959e889-92f5-4121-8a1f-571b10861198") {
|
|
t.Fatalf("make build output should embed default telemetry website id, got:\n%s", output)
|
|
}
|
|
}
|
|
|
|
func TestMakeBuildPrioritizesDotEnvUmamiHost(t *testing.T) {
|
|
skipMakeBuildTestsOnWindows(t)
|
|
|
|
makePath, err := exec.LookPath("make")
|
|
if err != nil {
|
|
t.Skip("make not available")
|
|
}
|
|
|
|
workDir := writeTestMakeWorkspace(t)
|
|
if err := os.WriteFile(filepath.Join(workDir, ".env"), []byte("NO_MISTAKES_UMAMI_HOST=https://dotenv.example\n"), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
output := runMakeDryBuild(t, makePath, workDir, map[string]string{
|
|
"UMAMI_HOST": "https://env.example",
|
|
})
|
|
|
|
if !strings.Contains(output, "TelemetryHost=https://dotenv.example") {
|
|
t.Fatalf("make build output should embed .env telemetry host, got:\n%s", output)
|
|
}
|
|
if strings.Contains(output, "TelemetryHost=https://env.example") {
|
|
t.Fatalf("make build output should not prefer env telemetry host when .env exists, got:\n%s", output)
|
|
}
|
|
}
|
|
|
|
func TestMakeBuildIgnoresUnrelatedDotEnvEntries(t *testing.T) {
|
|
skipMakeBuildTestsOnWindows(t)
|
|
|
|
makePath, err := exec.LookPath("make")
|
|
if err != nil {
|
|
t.Skip("make not available")
|
|
}
|
|
|
|
workDir := writeTestMakeWorkspace(t)
|
|
if err := os.WriteFile(filepath.Join(workDir, ".env"), []byte("VERSION=from-dotenv\nNO_MISTAKES_UMAMI_WEBSITE_ID=website-from-dotenv\n"), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
output := runMakeDryBuild(t, makePath, workDir, nil)
|
|
|
|
if !strings.Contains(output, "TelemetryWebsiteID=website-from-dotenv") {
|
|
t.Fatalf("make build output should still embed dotenv website id, got:\n%s", output)
|
|
}
|
|
if strings.Contains(output, "/internal/buildinfo.Version=from-dotenv") {
|
|
t.Fatalf("make build should ignore unrelated dotenv entries, got:\n%s", output)
|
|
}
|
|
}
|
|
|
|
func TestMakeBuildStripsInlineCommentsFromDotEnvUmamiWebsiteID(t *testing.T) {
|
|
skipMakeBuildTestsOnWindows(t)
|
|
|
|
makePath, err := exec.LookPath("make")
|
|
if err != nil {
|
|
t.Skip("make not available")
|
|
}
|
|
|
|
workDir := writeTestMakeWorkspace(t)
|
|
if err := os.WriteFile(filepath.Join(workDir, ".env"), []byte("NO_MISTAKES_UMAMI_WEBSITE_ID=website-from-dotenv # dev\n"), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
output := runMakeDryBuild(t, makePath, workDir, nil)
|
|
|
|
if !strings.Contains(output, "TelemetryWebsiteID=website-from-dotenv") {
|
|
t.Fatalf("make build output should strip inline comments from dotenv website id, got:\n%s", output)
|
|
}
|
|
if strings.Contains(output, "TelemetryWebsiteID=website-from-dotenv # dev") {
|
|
t.Fatalf("make build output should not embed inline comments in website id, got:\n%s", output)
|
|
}
|
|
}
|
|
|
|
func TestMakeBuildPreservesQuotedHashInDotEnvUmamiWebsiteID(t *testing.T) {
|
|
skipMakeBuildTestsOnWindows(t)
|
|
|
|
makePath, err := exec.LookPath("make")
|
|
if err != nil {
|
|
t.Skip("make not available")
|
|
}
|
|
|
|
workDir := writeTestMakeWorkspace(t)
|
|
if err := os.WriteFile(filepath.Join(workDir, ".env"), []byte("NO_MISTAKES_UMAMI_WEBSITE_ID=\"website # dev\"\n"), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
output := runMakeDryBuild(t, makePath, workDir, nil)
|
|
|
|
if !strings.Contains(output, "TelemetryWebsiteID=website # dev") {
|
|
t.Fatalf("make build output should preserve quoted hashes in dotenv website id, got:\n%s", output)
|
|
}
|
|
if strings.Contains(output, "TelemetryWebsiteID=\"website") {
|
|
t.Fatalf("make build output should not truncate quoted dotenv website id, got:\n%s", output)
|
|
}
|
|
}
|
|
|
|
func skipMakeBuildTestsOnWindows(t *testing.T) {
|
|
t.Helper()
|
|
if runtime.GOOS == "windows" {
|
|
t.Skip("make build tests are POSIX-oriented")
|
|
}
|
|
}
|
|
|
|
func writeTestMakeWorkspace(t *testing.T) string {
|
|
t.Helper()
|
|
|
|
data, err := os.ReadFile("Makefile")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
workDir := t.TempDir()
|
|
if err := os.WriteFile(filepath.Join(workDir, "Makefile"), data, 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return workDir
|
|
}
|
|
|
|
func runMakeDryBuild(t *testing.T, makePath, workDir string, extraEnv map[string]string) string {
|
|
t.Helper()
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
defer cancel()
|
|
|
|
cmd := exec.CommandContext(ctx, makePath, "-n", "build")
|
|
cmd.Dir = workDir
|
|
cmd.Env = filteredEnv(os.Environ(), "UMAMI_HOST", "UMAMI_WEBSITE_ID", "NO_MISTAKES_UMAMI_HOST", "NO_MISTAKES_UMAMI_WEBSITE_ID")
|
|
for key, value := range extraEnv {
|
|
cmd.Env = append(cmd.Env, key+"="+value)
|
|
}
|
|
out, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
t.Fatalf("make -n build failed: %v\n%s", err, out)
|
|
}
|
|
return string(out)
|
|
}
|