github.com/thiagoyeds/go-cloud@v0.26.0/docstore/urls_test.go (about) 1 // Copyright 2019 The Go Cloud Development Kit Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // https://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package docstore 16 17 import ( 18 "context" 19 "errors" 20 "net/url" 21 "testing" 22 23 "github.com/google/go-cmp/cmp" 24 ) 25 26 func TestURLMux(t *testing.T) { 27 ctx := context.Background() 28 29 mux := new(URLMux) 30 fake := &fakeOpener{} 31 mux.RegisterCollection("foo", fake) 32 mux.RegisterCollection("err", fake) 33 34 if diff := cmp.Diff(mux.CollectionSchemes(), []string{"err", "foo"}); diff != "" { 35 t.Errorf("Schemes: %s", diff) 36 } 37 if !mux.ValidCollectionScheme("foo") || !mux.ValidCollectionScheme("err") { 38 t.Errorf("ValidCollectionScheme didn't return true for valid scheme") 39 } 40 if mux.ValidCollectionScheme("foo2") || mux.ValidCollectionScheme("http") { 41 t.Errorf("ValidCollectionScheme didn't return false for invalid scheme") 42 } 43 44 for _, tc := range []struct { 45 name string 46 url string 47 wantErr bool 48 }{ 49 { 50 name: "empty URL", 51 wantErr: true, 52 }, 53 { 54 name: "invalid URL", 55 url: ":foo", 56 wantErr: true, 57 }, 58 { 59 name: "invalid URL no scheme", 60 url: "foo", 61 wantErr: true, 62 }, 63 { 64 name: "unregistered scheme", 65 url: "bar://mycollection", 66 wantErr: true, 67 }, 68 { 69 name: "func returns error", 70 url: "err://mycollection", 71 wantErr: true, 72 }, 73 { 74 name: "no query options", 75 url: "foo://mycollection", 76 }, 77 { 78 name: "empty query options", 79 url: "foo://mycollection?", 80 }, 81 { 82 name: "using api scheme prefix", 83 url: "docstore+foo://bar", 84 }, 85 { 86 name: "using api+type scheme prefix", 87 url: "docstore+collection+foo://bar", 88 }, 89 } { 90 t.Run(tc.name, func(t *testing.T) { 91 _, gotErr := mux.OpenCollection(ctx, tc.url) 92 if (gotErr != nil) != tc.wantErr { 93 t.Fatalf("got err %v, want error %v", gotErr, tc.wantErr) 94 } 95 if gotErr != nil { 96 return 97 } 98 if got := fake.u.String(); got != tc.url { 99 t.Errorf("got %q want %q", got, tc.url) 100 } 101 // Repeat with OpenCollectionURL. 102 parsed, err := url.Parse(tc.url) 103 if err != nil { 104 t.Fatal(err) 105 } 106 _, gotErr = mux.OpenCollectionURL(ctx, parsed) 107 if gotErr != nil { 108 t.Fatalf("got err %v want nil", gotErr) 109 } 110 if got := fake.u.String(); got != tc.url { 111 t.Errorf("got %q want %q", got, tc.url) 112 } 113 }) 114 } 115 } 116 117 type fakeOpener struct { 118 u *url.URL // last url passed to OpenCollectionURL 119 } 120 121 func (o *fakeOpener) OpenCollectionURL(ctx context.Context, u *url.URL) (*Collection, error) { 122 if u.Scheme == "err" { 123 return nil, errors.New("fail") 124 } 125 o.u = u 126 return nil, nil 127 }