github.com/rclone/rclone@v1.66.1-0.20240517100346-7b89735ae726/fs/config/rc_test.go (about) 1 package config_test 2 3 import ( 4 "context" 5 "os" 6 "testing" 7 8 _ "github.com/rclone/rclone/backend/local" 9 "github.com/rclone/rclone/fs" 10 "github.com/rclone/rclone/fs/config" 11 "github.com/rclone/rclone/fs/config/configfile" 12 "github.com/rclone/rclone/fs/config/obscure" 13 "github.com/rclone/rclone/fs/rc" 14 "github.com/stretchr/testify/assert" 15 "github.com/stretchr/testify/require" 16 ) 17 18 const testName = "configTestNameForRc" 19 20 func TestRc(t *testing.T) { 21 ctx := context.Background() 22 configfile.Install() 23 // Create the test remote 24 call := rc.Calls.Get("config/create") 25 assert.NotNil(t, call) 26 in := rc.Params{ 27 "name": testName, 28 "type": "local", 29 "parameters": rc.Params{ 30 "test_key": "sausage", 31 }, 32 } 33 out, err := call.Fn(ctx, in) 34 require.NoError(t, err) 35 require.Nil(t, out) 36 assert.Equal(t, "local", config.FileGet(testName, "type")) 37 assert.Equal(t, "sausage", config.FileGet(testName, "test_key")) 38 39 // The sub tests rely on the remote created above but they can 40 // all be run independently 41 42 t.Run("Dump", func(t *testing.T) { 43 call := rc.Calls.Get("config/dump") 44 assert.NotNil(t, call) 45 in := rc.Params{} 46 out, err := call.Fn(context.Background(), in) 47 require.NoError(t, err) 48 require.NotNil(t, out) 49 50 require.NotNil(t, out[testName]) 51 config := out[testName].(rc.Params) 52 53 assert.Equal(t, "local", config["type"]) 54 assert.Equal(t, "sausage", config["test_key"]) 55 }) 56 57 t.Run("Get", func(t *testing.T) { 58 call := rc.Calls.Get("config/get") 59 assert.NotNil(t, call) 60 in := rc.Params{ 61 "name": testName, 62 } 63 out, err := call.Fn(context.Background(), in) 64 require.NoError(t, err) 65 require.NotNil(t, out) 66 67 assert.Equal(t, "local", out["type"]) 68 assert.Equal(t, "sausage", out["test_key"]) 69 }) 70 71 t.Run("ListRemotes", func(t *testing.T) { 72 assert.NoError(t, os.Setenv("RCLONE_CONFIG_MY-LOCAL_TYPE", "local")) 73 defer func() { 74 assert.NoError(t, os.Unsetenv("RCLONE_CONFIG_MY-LOCAL_TYPE")) 75 }() 76 call := rc.Calls.Get("config/listremotes") 77 assert.NotNil(t, call) 78 in := rc.Params{} 79 out, err := call.Fn(context.Background(), in) 80 require.NoError(t, err) 81 require.NotNil(t, out) 82 83 var remotes []string 84 err = out.GetStruct("remotes", &remotes) 85 require.NoError(t, err) 86 87 assert.Contains(t, remotes, testName) 88 assert.Contains(t, remotes, "my-local") 89 }) 90 91 t.Run("Update", func(t *testing.T) { 92 call := rc.Calls.Get("config/update") 93 assert.NotNil(t, call) 94 in := rc.Params{ 95 "name": testName, 96 "parameters": rc.Params{ 97 "test_key": "rutabaga", 98 "test_key2": "cabbage", 99 }, 100 } 101 out, err := call.Fn(context.Background(), in) 102 require.NoError(t, err) 103 assert.Nil(t, out) 104 105 assert.Equal(t, "local", config.FileGet(testName, "type")) 106 assert.Equal(t, "rutabaga", config.FileGet(testName, "test_key")) 107 assert.Equal(t, "cabbage", config.FileGet(testName, "test_key2")) 108 }) 109 110 t.Run("Password", func(t *testing.T) { 111 call := rc.Calls.Get("config/password") 112 assert.NotNil(t, call) 113 pw2 := obscure.MustObscure("password") 114 in := rc.Params{ 115 "name": testName, 116 "parameters": rc.Params{ 117 "test_key": "rutabaga", 118 "test_key2": pw2, // check we encode an already encoded password 119 }, 120 } 121 out, err := call.Fn(context.Background(), in) 122 require.NoError(t, err) 123 assert.Nil(t, out) 124 125 assert.Equal(t, "local", config.FileGet(testName, "type")) 126 assert.Equal(t, "rutabaga", obscure.MustReveal(config.FileGet(testName, "test_key"))) 127 assert.Equal(t, pw2, obscure.MustReveal(config.FileGet(testName, "test_key2"))) 128 }) 129 130 // Delete the test remote 131 call = rc.Calls.Get("config/delete") 132 assert.NotNil(t, call) 133 in = rc.Params{ 134 "name": testName, 135 } 136 out, err = call.Fn(context.Background(), in) 137 require.NoError(t, err) 138 assert.Nil(t, out) 139 assert.Equal(t, "", config.FileGet(testName, "type")) 140 assert.Equal(t, "", config.FileGet(testName, "test_key")) 141 } 142 143 func TestRcProviders(t *testing.T) { 144 call := rc.Calls.Get("config/providers") 145 assert.NotNil(t, call) 146 in := rc.Params{} 147 out, err := call.Fn(context.Background(), in) 148 require.NoError(t, err) 149 require.NotNil(t, out) 150 var registry []*fs.RegInfo 151 err = out.GetStruct("providers", ®istry) 152 require.NoError(t, err) 153 foundLocal := false 154 for _, provider := range registry { 155 if provider.Name == "local" { 156 foundLocal = true 157 break 158 } 159 } 160 assert.True(t, foundLocal, "didn't find local provider") 161 } 162 163 func TestRcSetPath(t *testing.T) { 164 oldPath := config.GetConfigPath() 165 newPath := oldPath + ".newPath" 166 call := rc.Calls.Get("config/setpath") 167 assert.NotNil(t, call) 168 in := rc.Params{ 169 "path": newPath, 170 } 171 _, err := call.Fn(context.Background(), in) 172 require.NoError(t, err) 173 assert.Equal(t, newPath, config.GetConfigPath()) 174 175 in["path"] = oldPath 176 _, err = call.Fn(context.Background(), in) 177 require.NoError(t, err) 178 assert.Equal(t, oldPath, config.GetConfigPath()) 179 } 180 181 func TestRcPaths(t *testing.T) { 182 call := rc.Calls.Get("config/paths") 183 assert.NotNil(t, call) 184 out, err := call.Fn(context.Background(), nil) 185 require.NoError(t, err) 186 187 assert.Equal(t, config.GetConfigPath(), out["config"]) 188 assert.Equal(t, config.GetCacheDir(), out["cache"]) 189 assert.Equal(t, os.TempDir(), out["temp"]) 190 }