github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/pkg/platform/runtime/envdef/file_transform_test.go (about)

     1  package envdef
     2  
     3  import (
     4  	"encoding/json"
     5  	"os"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/ActiveState/cli/internal/fileutils"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  func TestRelocateFile(t *testing.T) {
    15  	nullCharacter := "\u0000"
    16  	invalidPad := "too long"
    17  	cases := []struct {
    18  		Name        string
    19  		Replacement string
    20  		PadWith     *string
    21  		HasError    bool
    22  		Expected    string
    23  	}{
    24  		{
    25  			"null-padded", "/ghi", &nullCharacter, false,
    26  			"/ghi/something/else\u0000\u0000\u0000\u0000text\u0000",
    27  		},
    28  		{
    29  			"text-only", "/ghi", nil, false,
    30  			"/ghi/something/else\u0000text\u0000",
    31  		},
    32  		{
    33  			"invalid-padding", "/ghi", &invalidPad, true, "",
    34  		},
    35  		{
    36  			"replacement-too-long", "/too-long", &nullCharacter, true, "",
    37  		},
    38  	}
    39  
    40  	for _, c := range cases {
    41  		t.Run(c.Name, func(tt *testing.T) {
    42  			ft := &FileTransform{
    43  				Pattern: "/abcdef",
    44  				With:    c.Replacement,
    45  				PadWith: c.PadWith,
    46  			}
    47  
    48  			res, err := ft.relocateFile([]byte("/abcdef/something/else\u0000text\u0000"), c.Replacement)
    49  			if c.HasError != (err != nil) {
    50  				tt.Fatalf("relocateFile returned with err: %v", err)
    51  			}
    52  			if err == nil {
    53  				assert.Equal(tt, []byte(c.Expected), res)
    54  			}
    55  		})
    56  	}
    57  }
    58  
    59  func TestApplyConstTransforms(t *testing.T) {
    60  	dir, err := os.MkdirTemp("", "installdir")
    61  	assert.NoError(t, err)
    62  
    63  	dir, err = fileutils.GetLongPathName(dir)
    64  	assert.NoError(t, err)
    65  
    66  	cs, err := NewConstants(dir)
    67  	assert.NoError(t, err)
    68  	assert.NoError(t, err)
    69  
    70  	cases := []struct {
    71  		Name          string
    72  		TransformJSON string
    73  		HasError      bool
    74  		Expected      string
    75  	}{
    76  		{
    77  			"double-slashes", `[{"pattern":
    78  			   "\\",
    79  			"with": "\\\\", "in": ["INSTALLDIR"]}]`,
    80  			false, strings.Replace(dir, `\`, `\\`, -1),
    81  		},
    82  		{
    83  			"unchanged", `[]`, false, dir,
    84  		},
    85  		{
    86  			"invalid-constant", `[{"pattern": "\\", "with": "\\\\", "in": ["INVALID"]}]`,
    87  			true, "",
    88  		},
    89  	}
    90  
    91  	//
    92  	for _, c := range cases {
    93  		t.Run(c.Name, func(tt *testing.T) {
    94  			var ct []ConstTransform
    95  			err := json.Unmarshal([]byte(c.TransformJSON), &ct)
    96  			require.NoError(tt, err)
    97  			ft := &FileTransform{
    98  				ConstTransforms: ct,
    99  			}
   100  			res, err := ft.applyConstTransforms(cs)
   101  			if c.HasError != (err != nil) {
   102  				tt.Fatalf("applyConstTransforms returned with err: %v", err)
   103  			}
   104  			if err == nil {
   105  				assert.Equal(tt, c.Expected, res["INSTALLDIR"])
   106  			}
   107  		})
   108  	}
   109  
   110  }