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  }