tests/search: check expected mode

The expected search mode is now checked.

This will allow us to expand tests/search/main.go to package search
tests.

Change-Id: I2e2bd8636794d2c75a9b642cc470c6234da7ea3a
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/346533
Trust: Julie Qiu <julie@golang.org>
Run-TryBot: Julie Qiu <julie@golang.org>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
Reviewed-by: Jamal Carvalho <jamal@golang.org>
diff --git a/internal/frontend/client.go b/internal/frontend/client.go
index 2012877..a71469d 100644
--- a/internal/frontend/client.go
+++ b/internal/frontend/client.go
@@ -56,7 +56,7 @@
 
 // Search returns a SearchPage for a search query and mode.
 func (c *Client) Search(q, mode string) (_ *SearchPage, err error) {
-	defer derrors.Wrap(&err, "Search(%q)", q)
+	defer derrors.Wrap(&err, "Search(%q, %q)", q, mode)
 	u := fmt.Sprintf("%s/search?q=%s&content=json&m=%s", c.url, url.QueryEscape(q), mode)
 	body, err := c.fetchJSONPage(u)
 	if err != nil {
diff --git a/tests/search/main.go b/tests/search/main.go
index 8d8a450..881d6be 100755
--- a/tests/search/main.go
+++ b/tests/search/main.go
@@ -50,9 +50,12 @@
 
 const (
 	importedbyFile = "tests/search/importedby.txt"
-	testFile       = "tests/search/scripts/symbolsearch.txt"
 )
 
+var testFiles = []string{
+	"tests/search/scripts/symbolsearch.txt",
+}
+
 var symbolSearchExperiments = []string{
 	internal.ExperimentSearchGrouping,
 	internal.ExperimentSymbolSearch,
@@ -74,9 +77,13 @@
 }
 
 func run(frontendHost string) error {
-	tests, err := readSearchTests(testFile)
-	if err != nil {
-		return err
+	var tests []*searchTest
+	for _, testFile := range testFiles {
+		ts, err := readSearchTests(testFile)
+		if err != nil {
+			return err
+		}
+		tests = append(tests, ts...)
 	}
 	client := frontend.NewClient(frontendHost)
 	var failed bool
@@ -103,7 +110,7 @@
 
 func runTest(client *frontend.Client, st *searchTest) (output []string, err error) {
 	defer derrors.Wrap(&err, "runTest(ctx, db, st.title: %q)", st.title)
-	searchPage, err := client.Search(st.query, "symbol")
+	searchPage, err := client.Search(st.query, "")
 	if err != nil {
 		return nil, err
 	}
@@ -113,12 +120,12 @@
 		if len(gotResults) > i {
 			got = gotResults[i]
 		}
-		if want.symbol != got.SymbolName || want.pkg != got.PackagePath {
+		if want.symbol != got.SymbolName || want.pkg != got.PackagePath || st.mode != searchPage.SearchMode {
 			output = append(output,
-				fmt.Sprintf("query %s, mismatch result %d:\n\twant: %q %q\n\t got: %q %q\n",
+				fmt.Sprintf("query %s, mismatch result %d:\n\twant: %q %q [%q]\n\t got: %q %q [%q]\n",
 					st.query, i+1,
-					want.pkg, want.symbol,
-					got.PackagePath, got.SymbolName))
+					want.pkg, want.symbol, st.mode,
+					got.PackagePath, got.SymbolName, searchPage.SearchMode))
 		}
 	}
 	return output, nil
@@ -127,6 +134,7 @@
 type searchTest struct {
 	title   string
 	query   string
+	mode    string
 	results []*searchResult
 }
 
@@ -191,7 +199,16 @@
 				// The last position was a title, so this must be the start
 				// of a new test set.
 				curr = posQuery
-				test.query = line
+				parts := strings.Fields(line)
+				mode := strings.TrimSuffix(strings.TrimPrefix(parts[0], "["), "]")
+				if len(parts) <= 1 {
+					return nil, fmt.Errorf("invalid syntax on line %d: %q (not enough elements)", num, line)
+				}
+				if mode != "" && mode != "package" && mode != "symbol" {
+					return nil, fmt.Errorf("invalid syntax on line %d: %q (invalid mode: %q)", num, line, mode)
+				}
+				test.mode = mode
+				test.query = strings.Join(parts[1:], " ")
 			case posQuery, posResult:
 				// The last position was a query or a result, so this must be
 				// an expected search result.
diff --git a/tests/search/scripts/symbolsearch.txt b/tests/search/scripts/symbolsearch.txt
index 8467a3e..5de7c23 100644
--- a/tests/search/scripts/symbolsearch.txt
+++ b/tests/search/scripts/symbolsearch.txt
@@ -5,20 +5,20 @@
 # This file contains test scripts for symbol search.
 
 Same symbol appears multiple times in one package.
-Foo
+[symbol] symbol:Foo
 Foo gopkg.in/foo.v1
 FOO github.com/julieqiu/api-demo
 FoO github.com/julieqiu/api-demo
 Foo github.com/julieqiu/api-demo
 
 Prefer symbols by popularity, then alphabetically, Add
-Add
+[symbol] symbol:Add
 Add math/bits
 
 Prefer symbols by package path, then symbol name
 # TODO: derank fields and methods; log.Logger.Writer should not
 # appear in this list.
-Writer
+[symbol] symbol:Writer
 Writer archive/tar
 Writer archive/zip
 Writer bufio
@@ -30,39 +30,39 @@
 Writer log
 
 Search for package path element and symbol.
-math Add
+[symbol] symbol:math Add
 Add math/bits
 
 Search for package path element with slash and symbol.
-math/big Float
+[symbol] symbol:math/big Float
 Float math/big
 
 Search for <package path>.<symbol>.
-math/big.Float
+[symbol] symbol:math/big.Float
 Float math/big
 
 Search for <package name>.<symbol>.
-big.Float
+[symbol] symbol:big.Float
 Float math/big
 
 Multi-word search without subpaths
-julieqiu foo
+[symbol] symbol:julieqiu foo
 FOO github.com/julieqiu/api-demo
 FoO github.com/julieqiu/api-demo
 Foo github.com/julieqiu/api-demo
 
 Multi-word search with subpaths
-github.com/julieqiu foo
+[symbol] symbol:github.com/julieqiu foo
 FOO github.com/julieqiu/api-demo
 FoO github.com/julieqiu/api-demo
 Foo github.com/julieqiu/api-demo
 
 Multi-word search with hostname
-github.com foo
+[symbol] symbol:github.com foo
 FOO github.com/julieqiu/api-demo
 FoO github.com/julieqiu/api-demo
 Foo github.com/julieqiu/api-demo
 
 Multi-word three word search
-bee cmd command
+[symbol] symbol:bee cmd command
 Command github.com/beego/bee/cmd/commands