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", &registry)
   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  }