@@ -754,3 +754,76 @@ func TestHTTPSRedirectHandlerWithQuery(t *testing.T) {
754754 t .Errorf ("got %q; want %q" , w .Header ().Get ("Location" ), "https://foobar.com/?query=bar" )
755755 }
756756}
757+
758+ func TestServeSearch (t * testing.T ) {
759+ var err error
760+ db , err = NewSQLiteDB (":memory:" )
761+ if err != nil {
762+ t .Fatal (err )
763+ }
764+ links := []* Link {
765+ {Short : "alpha" , Long : "http://alpha/" , Owner : "foo@example.com" },
766+ {Short : "beta" , Long : "http://beta/" , Owner : "foo@example.com" },
767+ {Short : "gamma" , Long : "http://gamma/" , Owner : "bar@example.com" },
768+ {Short : "delta" , Long : "http://delta/" , Owner : "FOO@example.com" },
769+ }
770+ for _ , link := range links {
771+ if err := db .Save (link ); err != nil {
772+ t .Error (err )
773+ }
774+ }
775+
776+ tests := []struct {
777+ name string
778+ owner string
779+ wantStatus int
780+ wantContains []string // substrings that should appear in response body
781+ wantNotContains []string // substrings that should NOT appear in response body
782+ }{
783+ {
784+ name : "search by owner with multiple links" ,
785+ owner : "foo@example.com" ,
786+ wantStatus : http .StatusOK ,
787+ wantContains : []string {"alpha" , "beta" , "delta" , "3 total" },
788+ wantNotContains : []string {"gamma" },
789+ },
790+ {
791+ name : "search by owner case insensitive" ,
792+ owner : "FOO@EXAMPLE.COM" ,
793+ wantStatus : http .StatusOK ,
794+ wantContains : []string {"alpha" , "beta" , "delta" },
795+ },
796+ {
797+ name : "search by owner with single link" ,
798+ owner : "bar@example.com" ,
799+ wantStatus : http .StatusOK ,
800+ wantContains : []string {"gamma" , "1 total" },
801+ wantNotContains : []string {"alpha" , "beta" },
802+ },
803+ }
804+
805+ for _ , tt := range tests {
806+ t .Run (tt .name , func (t * testing.T ) {
807+ testURL := "/.search?q=owner:" + url .QueryEscape (tt .owner )
808+ r := httptest .NewRequest ("GET" , testURL , nil )
809+ w := httptest .NewRecorder ()
810+ serveHandler ().ServeHTTP (w , r )
811+
812+ if w .Code != tt .wantStatus {
813+ t .Errorf ("serveSearch(owner=%q) = %d; want %d" , tt .owner , w .Code , tt .wantStatus )
814+ }
815+
816+ body := w .Body .String ()
817+ for _ , s := range tt .wantContains {
818+ if ! strings .Contains (body , s ) {
819+ t .Errorf ("serveSearch(owner=%q) body missing %q" , tt .owner , s )
820+ }
821+ }
822+ for _ , s := range tt .wantNotContains {
823+ if strings .Contains (body , s ) {
824+ t .Errorf ("serveSearch(owner=%q) body unexpectedly contains %q" , tt .owner , s )
825+ }
826+ }
827+ })
828+ }
829+ }
0 commit comments