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  }