1 package emulator
2
3 import (
4 "context"
5 "fmt"
6 "io/fs"
7 "os"
8 "path/filepath"
9 "testing"
10
11 "github.com/stretchr/testify/assert"
12
13 "edge-infra.dev/pkg/lib/fog"
14 )
15
16 func EqualError(msg string) assert.ErrorAssertionFunc {
17 return func(t assert.TestingT, err error, _ ...interface{}) bool {
18 return assert.EqualError(t, err, msg)
19 }
20 }
21
22 func TestGetRootDir(t *testing.T) {
23 cases := map[string]struct {
24 dir string
25 exp string
26 errAssert assert.ErrorAssertionFunc
27 }{
28 "Valid": {
29 dir: os.TempDir(),
30 exp: os.TempDir(),
31 errAssert: assert.NoError,
32 },
33 "Invalid Path": {
34 dir: "not/a/val id/path",
35 exp: "",
36 errAssert: EqualError("workspace directory could not be found: stat not/a/val id/path: no such file or directory"),
37 },
38 "No Path": {
39 dir: "",
40 exp: defaultDir,
41 errAssert: assert.NoError,
42 },
43 }
44 for name, tc := range cases {
45 t.Run(name, func(t *testing.T) {
46 t.Setenv(envFilePathDir, tc.dir)
47 dir, err := GetWorkspaceDir(fog.New())
48 tc.errAssert(t, err)
49 assert.Equal(t, tc.exp, dir)
50 })
51 }
52 }
53
54 func TestGetRootDirWithPerms(t *testing.T) {
55 cases := map[string]struct {
56 dir string
57 mode fs.FileMode
58 errAssert assert.ErrorAssertionFunc
59 }{
60 "RWX": {
61 dir: t.TempDir(),
62 mode: 0744,
63 errAssert: assert.NoError,
64 },
65 "Read Write": {
66 dir: t.TempDir(),
67 mode: 0644,
68 errAssert: EqualError("workspace directory perms aren't accessible by remotecli"),
69 },
70 "Read": {
71 dir: t.TempDir(),
72 mode: 0444,
73 errAssert: EqualError("workspace directory perms aren't accessible by remotecli"),
74 },
75 "No Access": {
76 dir: t.TempDir(),
77 mode: 0000,
78 errAssert: EqualError("workspace directory perms aren't accessible by remotecli"),
79 },
80 }
81 for name, tc := range cases {
82 t.Run(name, func(t *testing.T) {
83 err := os.Chmod(tc.dir, tc.mode)
84 assert.NoError(t, err)
85 t.Setenv(envFilePathDir, tc.dir)
86
87 _, err = GetWorkspaceDir(fog.New())
88 tc.errAssert(t, err)
89 })
90 }
91 }
92
93 func TestNewWorkspace(t *testing.T) {
94 projectID, bannerID, storeID := "project", "banner", "store"
95 data := []byte(fmt.Sprintf(`
96 {
97 "project_ID": "%s",
98 "banner_ID": "%s",
99 "store_ID": "%s"
100 }`, projectID, bannerID, storeID))
101
102 filepath := createTempFile(t)
103 err := os.WriteFile(filepath, data, 0644)
104 assert.NoError(t, err)
105
106 expected := &workspace{
107 ProjectID: projectID,
108 BannerID: bannerID,
109 StoreID: storeID,
110 }
111 ws, err := newWorkspace(filepath)
112 assert.NoError(t, err)
113 assert.Equal(t, expected, ws)
114 }
115
116 func TestNewWorkspaceBadEnv(t *testing.T) {
117 expected := &workspace{}
118 ws, err := newWorkspace("a/bad/file/path")
119 assert.Error(t, err)
120 assert.Equal(t, expected, ws)
121 }
122
123 func TestLoadFiles(t *testing.T) {
124 projectID, bannerID, storeID := "project", "banner", "store"
125 ctx := context.Background()
126 dir := t.TempDir()
127 config := NewConfig(ctx, dir)
128 em := NewEmulator(ctx, &cliService{}, config)
129
130 makeTempFile := func(name, data string) (f *os.File) {
131 f, err := os.Create(filepath.Join(dir, name))
132 assert.NoError(t, err)
133 _, err = f.WriteString(data)
134 assert.NoError(t, err)
135 return f
136 }
137
138 data := "connect a b c d"
139 connectHistoryFile := makeTempFile(connectHistoryFileName, data)
140 defer connectHistoryFile.Close()
141 expectedConnectHistory := []string{data}
142
143 data = "echo hello"
144 sessionHistoryFile := makeTempFile(sessionHistoryFileName, data)
145 defer sessionHistoryFile.Close()
146 expectedSessionHistory := []string{data}
147
148 data = fmt.Sprintf(`
149 {
150 "project_ID": "%s",
151 "banner_ID": "%s",
152 "store_ID": "%s"
153 }`, projectID, bannerID, storeID)
154 workspaceFile := makeTempFile(workspaceFileName, data)
155 defer workspaceFile.Close()
156 expectedWorkspace := &workspace{
157 ProjectID: projectID,
158 BannerID: bannerID,
159 StoreID: storeID,
160 }
161
162 em.loadWorkspace(connectHistoryFile.Name(), sessionHistoryFile.Name(), workspaceFile.Name())
163
164 assert.Equal(t, expectedSessionHistory, em.sessionHistory.history)
165 assert.Equal(t, expectedConnectHistory, em.connectHistory.history)
166 assert.Equal(t, expectedWorkspace, em.workspace)
167 }
168
View as plain text