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  }