github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/internal/subshell/sscommon/rcfile_test.go (about) 1 package sscommon 2 3 import ( 4 "fmt" 5 "reflect" 6 "runtime" 7 "strings" 8 "testing" 9 10 "github.com/ActiveState/cli/internal/constants" 11 "github.com/ActiveState/cli/internal/fileutils" 12 ) 13 14 func fakeContents(before, contents, after string) string { 15 var blocks []string 16 if before != "" { 17 blocks = append(blocks, before) 18 } 19 if contents != "" { 20 blocks = append( 21 blocks, 22 fmt.Sprintf("# %s", constants.RCAppendDefaultStartLine), 23 contents, 24 fmt.Sprintf("# %s", constants.RCAppendDefaultStopLine), 25 ) 26 } 27 if after != "" { 28 blocks = append(blocks, after) 29 } 30 31 return strings.Join(blocks, fileutils.LineEnd) 32 } 33 34 func fakeFileWithContents(t *testing.T, before, contents, after string) string { 35 f := fileutils.TempFileUnsafe("", "") 36 defer f.Close() 37 _, err := f.WriteString(fakeContents(before, contents, after)) 38 if err != nil { 39 t.Fatal(err) 40 } 41 return f.Name() 42 } 43 44 func TestWriteRcFile(t *testing.T) { 45 type args struct { 46 rcTemplateName string 47 path string 48 env map[string]string 49 } 50 51 fish := fmt.Sprintf( 52 `set -xg PATH "foo:$PATH" 53 if test ! -z "$%s"; test -f "$%s/%s" 54 echo "State Tool is operating on project $%s, located at $%s" 55 end`, 56 constants.ActivatedStateEnvVarName, 57 constants.ActivatedStateEnvVarName, 58 constants.ConfigFileName, 59 constants.ActivatedStateNamespaceEnvVarName, 60 constants.ActivatedStateEnvVarName) 61 if runtime.GOOS == "windows" { 62 fish = strings.ReplaceAll(fish, "\n", "\r\n") 63 } 64 65 tests := []struct { 66 name string 67 args args 68 want error 69 wantContents string 70 }{ 71 { 72 "Write RC to empty file", 73 args{ 74 "fishrc_append.fish", 75 fakeFileWithContents(t, "", "", ""), 76 map[string]string{ 77 "PATH": "foo", 78 }, 79 }, 80 nil, 81 fakeContents("", fish, ""), 82 }, 83 { 84 "Write RC update", 85 args{ 86 "fishrc_append.fish", 87 fakeFileWithContents(t, "before", "SOMETHING ELSE", "after"), 88 map[string]string{ 89 "PATH": "foo", 90 }, 91 }, 92 nil, 93 fakeContents(strings.Join([]string{"before", "after"}, fileutils.LineEnd), fish, ""), 94 }, 95 } 96 for _, tt := range tests { 97 t.Run(tt.name, func(t *testing.T) { 98 if got := WriteRcFile(tt.args.rcTemplateName, tt.args.path, DefaultID, tt.args.env); !reflect.DeepEqual(got, tt.want) { 99 t.Errorf("WriteRcFile() = %v, want %v", got, tt.want) 100 } 101 if !fileutils.FileExists(tt.args.path) { 102 t.Errorf("File does not exist: %s", tt.args.path) 103 } 104 data := fileutils.ReadFileUnsafe(tt.args.path) 105 contents := strings.TrimSpace(string(data)) 106 if contents != tt.wantContents { 107 t.Errorf("File contents don't match, got = '%s' want ='%s'", contents, tt.wantContents) 108 } 109 }) 110 } 111 }