package testutils import ( "bytes" "fmt" "log" "os" "path" "path/filepath" "runtime" "strings" "testing" "text/template" ) // GetHomeEnvVariableName Helper function to obtain the home directory on different systems. // Based on os.UserHomeDir(). func GetHomeEnvVariableName() string { env := "HOME" switch runtime.GOOS { case "windows": env = "USERPROFILE" case "plan9": env = "home" } return env } // CreateTemporaryHome create temporary home and initialize the credentials file as well func CreateTemporaryHome(createValidCredentialsFile bool, t *testing.T) string { // create a temporary file tempHome, err := os.MkdirTemp("", "tempHome") if err != nil { t.Fatalf("Failed to create temporary home directory: %v", err) } // create credentials file in temp directory stackitFolder := path.Join(tempHome, ".stackit") if err := os.Mkdir(stackitFolder, 0o750); err != nil { t.Fatalf("Failed to create stackit folder: %v", err) } filePath := path.Join(stackitFolder, "credentials.json") file, err := os.Create(filePath) if err != nil { t.Fatalf("Failed to create credentials file: %v", err) } defer func() { if err := file.Close(); err != nil { t.Fatalf("Error while closing the file: %v", err) } }() // Define content, default = invalid token token := "foo_token" if createValidCredentialsFile { token = GetTestProjectServiceAccountJson("") } if _, err = file.WriteString(token); err != nil { t.Fatalf("Error writing to file: %v", err) } return tempHome } // SetTemporaryHome Function to overwrite the home folder func SetTemporaryHome(tempHomePath string) { env := GetHomeEnvVariableName() if err := os.Setenv(env, tempHomePath); err != nil { fmt.Printf("Error setting temporary home directory %v", err) } } // CleanupTemporaryHome cleanup the temporary home and reset the environment variable func CleanupTemporaryHome(tempHomePath string, t *testing.T) { if err := os.RemoveAll(tempHomePath); err != nil { t.Fatalf("Error cleaning up temporary folder: %v", err) } originalHomeDir, err := os.UserHomeDir() if err != nil { t.Fatalf("Failed to restore home directory back to normal: %v", err) } // revert back to original home folder env := GetHomeEnvVariableName() if err := os.Setenv(env, originalHomeDir); err != nil { fmt.Printf("Error resetting temporary home directory %v", err) } } func ucFirst(s string) string { if s == "" { return "" } return strings.ToUpper(s[:1]) + s[1:] } func StringFromTemplateMust(tplFile string, data any) string { res, err := StringFromTemplate(tplFile, data) if err != nil { log.Fatalln(err) } return res } func StringFromTemplate(tplFile string, data any) (string, error) { fn := template.FuncMap{ "ucfirst": ucFirst, } file := filepath.Base(tplFile) tmpl, err := template.New(file).Funcs(fn).ParseFiles(tplFile) if err != nil { return "", err } tplBuf := &bytes.Buffer{} err = tmpl.Execute(tplBuf, data) if err != nil { return "", err } return tplBuf.String(), nil } func ResStr(prefix, resource, name string) string { return fmt.Sprintf("%s_%s.%s", prefix, resource, name) }