github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/chat/utils/kbfs_path_utils_test.go (about)

     1  package utils
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/keybase/client/go/libkb"
     7  	"github.com/keybase/client/go/protocol/chat1"
     8  	"github.com/keybase/client/go/protocol/keybase1"
     9  	"github.com/stretchr/testify/require"
    10  	"golang.org/x/net/context"
    11  )
    12  
    13  func strPointer(str string) *string { return &str }
    14  func makeKBFSPathForTest(rawPath string, standardPath *string) chat1.KBFSPath {
    15  	if standardPath == nil {
    16  		return chat1.KBFSPath{RawPath: rawPath, StandardPath: rawPath}
    17  	}
    18  	return chat1.KBFSPath{RawPath: rawPath, StandardPath: *standardPath}
    19  }
    20  
    21  var kbfsPathTests = map[string]chat1.KBFSPath{
    22  	"/keybase ha":                            makeKBFSPathForTest("/keybase", nil),
    23  	"/keybase/哟":                             {},
    24  	"before/keybase":                         {},
    25  	"之前/keybase":                             makeKBFSPathForTest("/keybase", nil),
    26  	"/keybase/public":                        makeKBFSPathForTest("/keybase/public", nil),
    27  	"/keybase/team":                          makeKBFSPathForTest("/keybase/team", nil),
    28  	"/keybase/private/":                      makeKBFSPathForTest("/keybase/private/", strPointer("/keybase/private")),
    29  	"/keybase/team/keybase":                  makeKBFSPathForTest("/keybase/team/keybase", nil),
    30  	"/keybase/team/keybase/blahblah":         makeKBFSPathForTest("/keybase/team/keybase/blahblah", nil),
    31  	`/keybase/team/keybase/blah\ blah\ blah`: makeKBFSPathForTest(`/keybase/team/keybase/blah\ blah\ blah`, strPointer("/keybase/team/keybase/blah blah blah")),
    32  	`/keybase/team/keybase/blah\\blah\\blah`: makeKBFSPathForTest(`/keybase/team/keybase/blah\\blah\\blah`, strPointer(`/keybase/team/keybase/blah\blah\blah`)),
    33  	"/keybase/team/keybase/blahblah/":        makeKBFSPathForTest("/keybase/team/keybase/blahblah/", strPointer("/keybase/team/keybase/blahblah")),
    34  	"/keybase/private/songgao/🍻":             makeKBFSPathForTest("/keybase/private/songgao/🍻", nil),
    35  	"/keybase/private/songgao/🍻/🍹.png/":      makeKBFSPathForTest("/keybase/private/songgao/🍻/🍹.png/", strPointer("/keybase/private/songgao/🍻/🍹.png")),
    36  	"/keybase/private/songgao/囧/yo":          makeKBFSPathForTest("/keybase/private/songgao/囧/yo", nil),
    37  	"/keybase/team/keybase,blah":             {},
    38  	"/keybase/team/keybase.blah":             makeKBFSPathForTest("/keybase/team/keybase.blah", nil),
    39  	"/keybaseprivate":                        {},
    40  	"/keybaseprivate/team":                   {},
    41  	"/keybase/teamaa/keybase":                {},
    42  	"/keybase/.kbfs_status":                  makeKBFSPathForTest("/keybase/.kbfs_status", nil),
    43  	"/foo":                                   {},
    44  
    45  	"/keybase/private/songgao,strib#jzila/file":                                                                   makeKBFSPathForTest("/keybase/private/songgao,strib#jzila/file", nil),
    46  	"/keybase/private/song-gao,strib#jzila/file":                                                                  {},
    47  	"/keybase/private/songgao,strib#jzila,jakob223/file":                                                          makeKBFSPathForTest("/keybase/private/songgao,strib#jzila,jakob223/file", nil),
    48  	"/keybase/private/__songgao__@twitter,strib@github,jzila@reddit,jakob.weisbl.at@dns/file":                     makeKBFSPathForTest("/keybase/private/__songgao__@twitter,strib@github,jzila@reddit,jakob.weisbl.at@dns/file", nil),
    49  	`"/keybase/private/songgao,kbpbot_staging,songgao_test (files before songgao_test account reset 2019-05-10)"`: makeKBFSPathForTest(`"/keybase/private/songgao,kbpbot_staging,songgao_test (files before songgao_test account reset 2019-05-10)"`, strPointer("/keybase/private/songgao,kbpbot_staging,songgao_test (files before songgao_test account reset 2019-05-10)")),
    50  	"/keybase/private/songgao,[meatball+keybase@gao.io]@email":                                                    makeKBFSPathForTest("/keybase/private/songgao,[meatball+keybase@gao.io]@email", strPointer("/keybase/private/songgao,[meatball+keybase@gao.io]@email")),
    51  
    52  	"keybase://team/keybase/blahblah":                               makeKBFSPathForTest("keybase://team/keybase/blahblah", strPointer("/keybase/team/keybase/blahblah")),
    53  	"keybase://private/foo/blahblah":                                makeKBFSPathForTest("keybase://private/foo/blahblah", strPointer("/keybase/private/foo/blahblah")),
    54  	"keybase://public/foo/blahblah":                                 makeKBFSPathForTest("keybase://public/foo/blahblah", strPointer("/keybase/public/foo/blahblah")),
    55  	"keybase://public/foo/blah%20blah":                              makeKBFSPathForTest("keybase://public/foo/blah%20blah", strPointer("/keybase/public/foo/blah blah")),
    56  	"keybase://chat/blah":                                           {},
    57  	"keybase://private/songgao,[meatball+keybase@gao.io]@email/abc": makeKBFSPathForTest("keybase://private/songgao,[meatball+keybase@gao.io]@email/abc", strPointer("/keybase/private/songgao,[meatball+keybase@gao.io]@email/abc")),
    58  
    59  	"/Volumes/Keybase/team/keybase/blahblah":             makeKBFSPathForTest("/Volumes/Keybase/team/keybase/blahblah", strPointer("/keybase/team/keybase/blahblah")),
    60  	"/Volumes/Keybase/private/foo/blahblah":              makeKBFSPathForTest("/Volumes/Keybase/private/foo/blahblah", strPointer("/keybase/private/foo/blahblah")),
    61  	"/Volumes/Keybase/public/foo/blahblah":               makeKBFSPathForTest("/Volumes/Keybase/public/foo/blahblah", strPointer("/keybase/public/foo/blahblah")),
    62  	`/Volumes/Keybase\ (meatball)/team/keybase/blahblah`: makeKBFSPathForTest(`/Volumes/Keybase\ (meatball)/team/keybase/blahblah`, strPointer("/keybase/team/keybase/blahblah")),
    63  	`/Volumes/Keybase\ (meatball)/private/foo/blahblah`:  makeKBFSPathForTest(`/Volumes/Keybase\ (meatball)/private/foo/blahblah`, strPointer("/keybase/private/foo/blahblah")),
    64  	`/Volumes/Keybase\ (meatball)/public/foo/blahblah`:   makeKBFSPathForTest(`/Volumes/Keybase\ (meatball)/public/foo/blahblah`, strPointer("/keybase/public/foo/blahblah")),
    65  	`"/Volumes/Keybase (meatball)/public/foo/blahblah"`:  makeKBFSPathForTest(`"/Volumes/Keybase (meatball)/public/foo/blahblah"`, strPointer("/keybase/public/foo/blahblah")),
    66  
    67  	`K:\team\keybase\blahblah`:        makeKBFSPathForTest(`K:\team\keybase\blahblah`, strPointer("/keybase/team/keybase/blahblah")),
    68  	`K:\private\foo\blahblah`:         makeKBFSPathForTest(`K:\private\foo\blahblah`, strPointer("/keybase/private/foo/blahblah")),
    69  	`k:\public\foo\blahblah`:          makeKBFSPathForTest(`k:\public\foo\blahblah`, strPointer("/keybase/public/foo/blahblah")),
    70  	`K:\public\foo\blahblah lalala`:   makeKBFSPathForTest(`K:\public\foo\blahblah`, strPointer("/keybase/public/foo/blahblah")),
    71  	`"K:\public\foo\blahblah lalala"`: makeKBFSPathForTest(`"K:\public\foo\blahblah lalala"`, strPointer("/keybase/public/foo/blahblah lalala")),
    72  
    73  	"/keybase.":                        makeKBFSPathForTest("/keybase", nil),
    74  	"/keybase/team.":                   makeKBFSPathForTest("/keybase/team", nil),
    75  	"/keybase/team/keybase/blahblah.":  makeKBFSPathForTest("/keybase/team/keybase/blahblah", nil),
    76  	`K:\team\keybase\blahblah.`:        makeKBFSPathForTest(`K:\team\keybase\blahblah`, strPointer("/keybase/team/keybase/blahblah")),
    77  	"keybase://team/keybase/blahblah.": makeKBFSPathForTest("keybase://team/keybase/blahblah", strPointer("/keybase/team/keybase/blahblah")),
    78  
    79  	"/keybase?":                        makeKBFSPathForTest("/keybase", nil),
    80  	"/keybase/team?":                   makeKBFSPathForTest("/keybase/team", nil),
    81  	"/keybase/team/keybase/blahblah?":  makeKBFSPathForTest("/keybase/team/keybase/blahblah", nil),
    82  	`K:\team\keybase\blahblah?`:        makeKBFSPathForTest(`K:\team\keybase\blahblah`, strPointer("/keybase/team/keybase/blahblah")),
    83  	"keybase://team/keybase/blahblah?": makeKBFSPathForTest("keybase://team/keybase/blahblah", strPointer("/keybase/team/keybase/blahblah")),
    84  
    85  	`"/keybase/team/keybase/blahblah."`: makeKBFSPathForTest(`"/keybase/team/keybase/blahblah."`, strPointer("/keybase/team/keybase/blahblah.")),
    86  	`"K:\team\keybase\blahblah."`:       makeKBFSPathForTest(`"K:\team\keybase\blahblah."`, strPointer("/keybase/team/keybase/blahblah.")),
    87  
    88  	`"/keybase/team/keybase (local conflicted copy 2019-10-24 #2)"`: makeKBFSPathForTest(`"/keybase/team/keybase (local conflicted copy 2019-10-24 #2)"`, strPointer("/keybase/team/keybase (local conflicted copy 2019-10-24 #2)")),
    89  }
    90  
    91  func TestParseKBFSPathMatches(t *testing.T) {
    92  	for input, expected := range kbfsPathTests {
    93  		paths := ParseKBFSPaths(context.Background(), input)
    94  		if len(expected.RawPath) > 0 {
    95  			require.Len(t, paths, 1, "error matching: %s", input)
    96  			require.Equal(t, expected.RawPath, paths[0].RawPath, "wrong RawPath %q", input)
    97  			require.Equal(t, expected.StandardPath, paths[0].StandardPath, "wrong RebasePath %q", input)
    98  		} else {
    99  			require.Len(t, paths, 0, "unexpected match: %s", input)
   100  		}
   101  	}
   102  }
   103  
   104  func TestParseKBFSPathDetailed(t *testing.T) {
   105  	for _, input := range []string{
   106  		`this is a kbfs path /keybase/team/keybase/blah\ blah\ blah`,
   107  		`this is a kbfs path "K:\team\keybase\blah blah blah"`,
   108  	} {
   109  		paths := ParseKBFSPaths(context.Background(), input)
   110  		require.Len(t, paths, 1, "input: %s", input)
   111  		require.Equal(t, 20, paths[0].StartIndex, "input: %s", input)
   112  		require.Equal(t, "/keybase/team/keybase/blah blah blah", paths[0].StandardPath, "input: %s", input)
   113  		require.Equal(t, "keybase://team/keybase/blah%20blah%20blah", paths[0].PathInfo.DeeplinkPath, "input: %s", input)
   114  		if libkb.RuntimeGroup() == keybase1.RuntimeGroup_WINDOWSLIKE {
   115  			require.Equal(t, `\team\keybase\blah blah blah`, paths[0].PathInfo.PlatformAfterMountPath, "input: %s", input)
   116  		} else {
   117  			require.Equal(t, "/team/keybase/blah blah blah", paths[0].PathInfo.PlatformAfterMountPath, "input: %s", input)
   118  		}
   119  	}
   120  
   121  	withSuffix := `"/keybase/private/songgao,kbpbot_staging,songgao_test (files before songgao_test account reset 2019-05-10)"`
   122  	paths := ParseKBFSPaths(context.Background(), withSuffix)
   123  	require.Len(t, paths, 1, "input: %s", withSuffix)
   124  	require.Equal(t, "keybase://private/songgao%2Ckbpbot_staging%2Csonggao_test%20%28files%20before%20songgao_test%20account%20reset%202019-05-10%29", paths[0].PathInfo.DeeplinkPath)
   125  }