github.com/buildpacks/pack@v0.33.3-0.20240516162812-884dd1837311/acceptance/invoke/pack_fixtures.go (about) 1 //go:build acceptance 2 // +build acceptance 3 4 package invoke 5 6 import ( 7 "bytes" 8 "fmt" 9 "io" 10 "os" 11 "path/filepath" 12 "strings" 13 "testing" 14 "text/template" 15 16 h "github.com/buildpacks/pack/testhelpers" 17 ) 18 19 type PackFixtureManager struct { 20 testObject *testing.T 21 assert h.AssertionManager 22 locations []string 23 } 24 25 func (m PackFixtureManager) FixtureLocation(name string) string { 26 m.testObject.Helper() 27 28 for _, dir := range m.locations { 29 fixtureLocation := filepath.Join(dir, name) 30 _, err := os.Stat(fixtureLocation) 31 if !os.IsNotExist(err) { 32 return fixtureLocation 33 } 34 } 35 36 m.testObject.Fatalf("fixture %s does not exist in %v", name, m.locations) 37 38 return "" 39 } 40 41 func (m PackFixtureManager) VersionedFixtureOrFallbackLocation(pattern, version, fallback string) string { 42 m.testObject.Helper() 43 44 versionedName := fmt.Sprintf(pattern, version) 45 46 for _, dir := range m.locations { 47 fixtureLocation := filepath.Join(dir, versionedName) 48 _, err := os.Stat(fixtureLocation) 49 if !os.IsNotExist(err) { 50 return fixtureLocation 51 } 52 } 53 54 return m.FixtureLocation(fallback) 55 } 56 57 func (m PackFixtureManager) TemplateFixture(templateName string, templateData map[string]interface{}) string { 58 m.testObject.Helper() 59 60 outputTemplate, err := os.ReadFile(m.FixtureLocation(templateName)) 61 m.assert.Nil(err) 62 63 return m.fillTemplate(outputTemplate, templateData) 64 } 65 66 func (m PackFixtureManager) TemplateVersionedFixture( 67 versionedPattern, version, fallback string, 68 templateData map[string]interface{}, 69 ) string { 70 m.testObject.Helper() 71 outputTemplate, err := os.ReadFile(m.VersionedFixtureOrFallbackLocation(versionedPattern, version, fallback)) 72 m.assert.Nil(err) 73 74 return m.fillTemplate(outputTemplate, templateData) 75 } 76 77 func (m PackFixtureManager) TemplateFixtureToFile(name string, destination *os.File, data map[string]interface{}) { 78 _, err := io.WriteString(destination, m.TemplateFixture(name, data)) 79 m.assert.Nil(err) 80 } 81 82 func (m PackFixtureManager) fillTemplate(templateContents []byte, data map[string]interface{}) string { 83 tpl, err := template.New(""). 84 Funcs(template.FuncMap{ 85 "StringsJoin": strings.Join, 86 "StringsDoubleQuote": func(s []string) []string { 87 result := []string{} 88 for _, str := range s { 89 result = append(result, fmt.Sprintf(`"%s"`, str)) 90 } 91 return result 92 }, 93 "StringsEscapeBackslash": func(s string) string { 94 result := []rune{} 95 for _, elem := range s { 96 switch { 97 case elem == '\\': 98 result = append(result, '\\', '\\') 99 default: 100 result = append(result, elem) 101 } 102 } 103 return string(result) 104 }, 105 }). 106 Parse(string(templateContents)) 107 m.assert.Nil(err) 108 109 var templatedContent bytes.Buffer 110 err = tpl.Execute(&templatedContent, data) 111 m.assert.Nil(err) 112 113 return templatedContent.String() 114 }