github.com/qri-io/qri@v0.10.1-0.20220104210721-c771715036cb/dsref/parse_test.go (about) 1 package dsref 2 3 import ( 4 "testing" 5 ) 6 7 func TestParseFull(t *testing.T) { 8 goodCases := []struct { 9 description string 10 text string 11 expect Ref 12 }{ 13 {"human friendly", "abc/my_dataset", Ref{Username: "abc", Name: "my_dataset"}}, 14 {"full reference", "abc/my_dataset@base32identifier/ipfs/QmSecond", Ref{Username: "abc", Name: "my_dataset", InitID: "base32identifier", Path: "/ipfs/QmSecond"}}, 15 {"right hand side", "@base32identifier/ipfs/QmSecond", Ref{InitID: "base32identifier", Path: "/ipfs/QmSecond"}}, 16 {"just path", "@/ipfs/QmSecond", Ref{Path: "/ipfs/QmSecond"}}, 17 {"long name", "peer/some_name@/mem/QmXATayrFgsS3tpCi2ykfpNJ8uiCWT74dttnvJvVo1J7Rn", Ref{Username: "peer", Name: "some_name", Path: "/mem/QmXATayrFgsS3tpCi2ykfpNJ8uiCWT74dttnvJvVo1J7Rn"}}, 18 {"name-has-dash", "abc/my-dataset", Ref{Username: "abc", Name: "my-dataset"}}, 19 {"dash-in-username", "some-user/my_dataset", Ref{Username: "some-user", Name: "my_dataset"}}, 20 {"legacy profileID", "@QmFirst/ipfs/QmSecond", Ref{ProfileID: "QmFirst", Path: "/ipfs/QmSecond"}}, 21 {"legacy profileID for ED key", "abc/my_dataset@12D3KooWDbd4L1UzsmxH7T7nufQBL3jC9MpS6syvXZjRdk4XqoK4/ipfs/QmSecond", Ref{Username: "abc", Name: "my_dataset", ProfileID: "12D3KooWDbd4L1UzsmxH7T7nufQBL3jC9MpS6syvXZjRdk4XqoK4", Path: "/ipfs/QmSecond"}}, 22 } 23 for i, c := range goodCases { 24 ref, err := Parse(c.text) 25 if err != nil { 26 t.Errorf("case %d %q error: %s", i, c.description, err) 27 continue 28 } 29 if !ref.Equals(c.expect) { 30 t.Errorf("case %d %q mismatch: expect %q, got %q", i, c.description, c.expect, ref) 31 } 32 } 33 34 badCases := []struct { 35 description string 36 text string 37 expectErr string 38 }{ 39 {"missing at", "/ipfs/QmThis", "unexpected character at position 0: '/'"}, 40 {"invalid base58", "@/ipfs/QmOne", "path contains invalid base58 characters"}, 41 {"no slash", "foo", "need username separated by '/' from dataset name"}, 42 {"http url", "https://apple.com", "unexpected character at position 5: ':'"}, 43 {"domain name", "apple.com", "unexpected character at position 5: '.'"}, 44 {"local filename", "foo.json", "unexpected character at position 3: '.'"}, 45 {"absolute filepath", "/usr/local/bin/file.cbor", "unexpected character at position 0: '/'"}, 46 {"absolute dirname", "/usr/local/bin", "unexpected character at position 0: '/'"}, 47 {"dot in dataset", "abc/data.set", "unexpected character at position 8: '.'"}, 48 {"equals in dataset", "abc/my+ds", "unexpected character at position 6: '+'"}, 49 } 50 for i, c := range badCases { 51 _, err := Parse(c.text) 52 if err == nil || err.Error() != c.expectErr { 53 t.Errorf("case %d %q expected error: %q, got %q", i, c.description, c.expectErr, err) 54 continue 55 } 56 } 57 } 58 59 func TestParseBadUpperCase(t *testing.T) { 60 ref, err := Parse("test_peer_bad_upper_case/a_New_Dataset") 61 if err != ErrBadCaseName { 62 t.Errorf("expected to get error %s, but got %s", ErrBadCaseName, err) 63 } 64 expect := Ref{Username: "test_peer_bad_upper_case", Name: "a_New_Dataset"} 65 if !ref.Equals(expect) { 66 t.Errorf("mismatch: expect %s, got %s", expect, ref) 67 } 68 } 69 70 func TestParseHumanFriendly(t *testing.T) { 71 goodCases := []struct { 72 description string 73 text string 74 expect Ref 75 }{ 76 {"human friendly", "abc/my_dataset", Ref{Username: "abc", Name: "my_dataset"}}, 77 } 78 for i, c := range goodCases { 79 ref, err := ParseHumanFriendly(c.text) 80 if err != nil { 81 t.Errorf("case %d %q error: %s", i, c.description, err) 82 continue 83 } 84 if !ref.Equals(c.expect) { 85 t.Errorf("case %d %q mismatch: expect %s, got %s", i, c.description, c.expect, ref) 86 } 87 } 88 89 badCases := []struct { 90 description string 91 text string 92 expectErr string 93 }{ 94 {"full reference", "abc/my_dataset@QmFirst/ipfs/QmSecond", ErrNotHumanFriendly.Error()}, 95 {"only name", "my_dataset", "need username separated by '/' from dataset name"}, 96 {"right hand side", "@QmFirst/ipfs/QmSecond", ErrNotHumanFriendly.Error()}, 97 {"just path", "@/ipfs/QmSecond", ErrNotHumanFriendly.Error()}, 98 {"missing at", "/ipfs/QmThis", "unexpected character at position 0: '/'"}, 99 {"invalid base58", "@/ipfs/QmOne", ErrNotHumanFriendly.Error()}, 100 } 101 for i, c := range badCases { 102 _, err := ParseHumanFriendly(c.text) 103 if err == nil || err.Error() != c.expectErr { 104 t.Errorf("case %d %q expected error: %q, got %q", i, c.description, c.expectErr, err) 105 continue 106 } 107 } 108 } 109 110 func TestIsValidName(t *testing.T) { 111 goodCases := []struct { 112 text string 113 }{ 114 {"abc"}, 115 {"aDataset"}, 116 {"a1234"}, 117 {"a_dataset_name"}, 118 {"DatasetName"}, 119 } 120 for i, c := range goodCases { 121 if !IsValidName(c.text) { 122 t.Errorf("case %d %q should be valid", i, c.text) 123 continue 124 } 125 } 126 127 badCases := []struct { 128 text string 129 }{ 130 {"_bad"}, 131 {"1dataset"}, 132 {"dataset!"}, 133 } 134 for i, c := range badCases { 135 if IsValidName(c.text) { 136 t.Errorf("case %d %q should not be considered valid", i, c.text) 137 continue 138 } 139 } 140 }