github.com/google/martian/v3@v3.3.3/querystring/query_string_verifier_test.go (about) 1 // Copyright 2015 Google Inc. All rights reserved. 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 // http://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 querystring 16 17 import ( 18 "net/http" 19 "testing" 20 21 "github.com/google/martian/v3" 22 "github.com/google/martian/v3/parse" 23 "github.com/google/martian/v3/verify" 24 ) 25 26 func TestVerifyRequestPasses(t *testing.T) { 27 v, err := NewVerifier("foo", "bar") 28 if err != nil { 29 t.Fatalf("NewVerifier(%q, %q): got %v, want no error", "foo", "bar", err) 30 } 31 32 req, err := http.NewRequest("GET", "http://www.google.com?foo=baz&foo=bar", nil) 33 if err != nil { 34 t.Fatalf("http.NewRequest(): got %v, want no error", err) 35 } 36 37 _, remove, err := martian.TestContext(req, nil, nil) 38 if err != nil { 39 t.Fatalf("TestContext(): got %v, want no error", err) 40 } 41 defer remove() 42 43 if err := v.ModifyRequest(req); err != nil { 44 t.Fatalf("ModifyRequest(): got %v, want no error", err) 45 } 46 if err := v.VerifyRequests(); err != nil { 47 t.Fatalf("VerifyRequests(): got %v, want no error", err) 48 } 49 } 50 51 func TestVerifyEmptyValue(t *testing.T) { 52 v, err := NewVerifier("foo", "") 53 if err != nil { 54 t.Fatalf("NewVerifier(%q, %q): got %v, want no error", "foo", "", err) 55 } 56 req, err := http.NewRequest("GET", "http://www.google.com?foo=bar", nil) 57 if err != nil { 58 t.Fatalf("http.NewRequest(): got %v, want no error", err) 59 } 60 _, remove, err := martian.TestContext(req, nil, nil) 61 if err != nil { 62 t.Fatalf("TestContext(): got %v, want no error", err) 63 } 64 defer remove() 65 if err := v.ModifyRequest(req); err != nil { 66 t.Fatalf("ModifyRequest(): got %v, want no error", err) 67 } 68 if err := v.VerifyRequests(); err != nil { 69 t.Fatalf("VerifyRequests(): got %v, want no error", err) 70 } 71 } 72 73 func TestFailureWithMissingKey(t *testing.T) { 74 v, err := NewVerifier("foo", "bar") 75 if err != nil { 76 t.Fatalf("NewVerifier(%q, %q): got %v, want no error", "foo", "bar", err) 77 } 78 req, err := http.NewRequest("GET", "http://www.google.com?fizz=bar", nil) 79 if err != nil { 80 t.Fatalf("http.NewRequest(): got %v, want no error", err) 81 } 82 _, remove, err := martian.TestContext(req, nil, nil) 83 if err != nil { 84 t.Fatalf("TestContext(): got %v, want no error", err) 85 } 86 defer remove() 87 if err := v.ModifyRequest(req); err != nil { 88 t.Fatalf("ModifyRequest(): got %v, want no error", err) 89 } 90 merr, ok := v.VerifyRequests().(*martian.MultiError) 91 if !ok { 92 t.Fatal("VerifyRequests(): got nil, want *verify.MultiError") 93 } 94 95 errs := merr.Errors() 96 if len(errs) != 1 { 97 t.Fatalf("len(merr.Errors()): got %d, want 1", len(errs)) 98 } 99 100 expectErr := "request(http://www.google.com?fizz=bar) param verification error: key foo not found" 101 for i := range errs { 102 if got, want := errs[i].Error(), expectErr; got != want { 103 t.Errorf("%d. err.Error(): mismatched error output\ngot: %s\nwant: %s", i, got, want) 104 } 105 } 106 } 107 108 func TestFailureWithMultiFail(t *testing.T) { 109 v, err := NewVerifier("foo", "bar") 110 if err != nil { 111 t.Fatalf("NewVerifier(%q, %q): got %v, want no error", "foo", "bar", err) 112 } 113 req, err := http.NewRequest("GET", "http://www.google.com?foo=baz", nil) 114 if err != nil { 115 t.Fatalf("http.NewRequest(): got %v, want no error", err) 116 } 117 _, remove, err := martian.TestContext(req, nil, nil) 118 if err != nil { 119 t.Fatalf("TestContext(): got %v, want no error", err) 120 } 121 defer remove() 122 if err := v.ModifyRequest(req); err != nil { 123 t.Fatalf("ModifyRequest(): got %v, want no error", err) 124 } 125 if err := v.ModifyRequest(req); err != nil { 126 t.Fatalf("ModifyRequest(): got %v, want no error", err) 127 } 128 merr, ok := v.VerifyRequests().(*martian.MultiError) 129 if !ok { 130 t.Fatalf("VerifyRequests(): got nil, want *verify.MultiError") 131 } 132 133 errs := merr.Errors() 134 if len(errs) != 2 { 135 t.Fatalf("len(merr.Errors()): got %d, want 2", len(errs)) 136 } 137 138 expectErr := "request(http://www.google.com?foo=baz) param verification error: got baz for key foo, want bar" 139 for i := range errs { 140 if got, want := errs[i].Error(), expectErr; got != want { 141 t.Errorf("%d. err.Error(): mismatched error output\ngot: %s\nwant: %s", i, 142 got, want) 143 } 144 } 145 v.ResetRequestVerifications() 146 if err := v.VerifyRequests(); err != nil { 147 t.Fatalf("VerifyRequests(): got %v, want no error", err) 148 } 149 } 150 151 func TestBadInputToConstructor(t *testing.T) { 152 if _, err := NewVerifier("", "bar"); err == nil { 153 t.Fatalf("NewVerifier(): no error returned for empty key") 154 } 155 } 156 157 func TestVerifierFromJSON(t *testing.T) { 158 msg := []byte(`{ 159 "querystring.Verifier": { 160 "scope": ["request"], 161 "name": "param", 162 "value": "true" 163 } 164 }`) 165 166 r, err := parse.FromJSON(msg) 167 if err != nil { 168 t.Fatalf("parse.FromJSON(): got %v, want no error", err) 169 } 170 reqmod := r.RequestModifier() 171 if reqmod == nil { 172 t.Fatal("reqmod: got nil, want not nil") 173 } 174 reqv, ok := reqmod.(verify.RequestVerifier) 175 if !ok { 176 t.Fatal("reqmod.(verify.RequestVerifier): got !ok, want ok") 177 } 178 179 req, err := http.NewRequest("GET", "http://example.com", nil) 180 if err != nil { 181 t.Fatalf("http.NewRequest(): got %v, want no error", err) 182 } 183 _, remove, err := martian.TestContext(req, nil, nil) 184 if err != nil { 185 t.Fatalf("TestContext(): got %v, want no error", err) 186 } 187 defer remove() 188 if err := reqv.ModifyRequest(req); err != nil { 189 t.Fatalf("ModifyRequest(): got %v, want no error", err) 190 } 191 if err := reqv.VerifyRequests(); err == nil { 192 t.Error("VerifyRequests(): got nil, want not nil") 193 } 194 }