tests/search: use data from frontend JSON page

tests/search/run.sh now runs tests by comparing data fetched from the
frontend instead of directly from the database.

For golang/go#44142

Change-Id: Ic66cd2ff4867170d9f89b5f7a9f4bbc6ad64370b
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/346529
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/devtools/docker/compose.yaml b/devtools/docker/compose.yaml
index 70ea027..c41397d 100644
--- a/devtools/docker/compose.yaml
+++ b/devtools/docker/compose.yaml
@@ -42,6 +42,19 @@
     volumes:
       - ../../:/pkgsite
     working_dir: /pkgsite
+  searchtest:
+    image: golang:1.16.7
+    depends_on:
+      - frontend
+    environment:
+      <<: *database-variables
+      <<: *go-variables
+      WAITFORIT_TIMEOUT: 300
+    entrypoint: ./third_party/wait-for-it/wait-for-it.sh frontend:8080 -- go run
+    command: "tests/search/main.go -frontend http://frontend:8080"
+    volumes:
+      - ../../:/pkgsite
+    working_dir: /pkgsite
   api:
     image: golang:1.16.7
     depends_on:
diff --git a/tests/search/main.go b/tests/search/main.go
index f579afe..8d8a450 100755
--- a/tests/search/main.go
+++ b/tests/search/main.go
@@ -22,10 +22,14 @@
 	"golang.org/x/pkgsite/internal/database"
 	"golang.org/x/pkgsite/internal/derrors"
 	"golang.org/x/pkgsite/internal/experiment"
+	"golang.org/x/pkgsite/internal/frontend"
 	"golang.org/x/pkgsite/internal/log"
 	"golang.org/x/pkgsite/internal/postgres"
 )
 
+var frontendHost = flag.String("frontend", "http://localhost:8080",
+	"Use the frontend host referred to by this URL for comparing data")
+
 func main() {
 	flag.Parse()
 
@@ -36,15 +40,10 @@
 	}
 	log.SetLevel(cfg.LogLevel)
 
-	// Wrap the postgres driver with our own wrapper, which adds OpenCensus instrumentation.
-	ddb, err := database.Open("pgx", cfg.DBConnInfo(), "seeddb")
-	if err != nil {
-		log.Fatalf(ctx, "database.Open for host %s failed with %v", cfg.DBHost, err)
+	if err := runImportedByUpdates(ctx, cfg.DBConnInfo(), cfg.DBHost); err != nil {
+		log.Fatal(ctx, err)
 	}
-	db := postgres.New(ddb)
-	defer db.Close()
-
-	if err := run(ctx, db); err != nil {
+	if err := run(*frontendHost); err != nil {
 		log.Fatal(ctx, err)
 	}
 }
@@ -59,21 +58,30 @@
 	internal.ExperimentSymbolSearch,
 }
 
-func run(ctx context.Context, db *postgres.DB) error {
+func runImportedByUpdates(ctx context.Context, dbConnInfo, dbHost string) error {
+	ddb, err := database.Open("pgx", dbConnInfo, "seeddb")
+	if err != nil {
+		log.Fatalf(ctx, "database.Open for host %s failed with %v", dbHost, err)
+	}
+	db := postgres.New(ddb)
+	defer db.Close()
 	counts, err := readImportedByCounts(importedbyFile)
 	if err != nil {
 		return err
 	}
-	if _, err := db.UpdateSearchDocumentsImportedByCountWithCounts(ctx, counts); err != nil {
-		return err
-	}
+	_, err = db.UpdateSearchDocumentsImportedByCountWithCounts(ctx, counts)
+	return err
+}
+
+func run(frontendHost string) error {
 	tests, err := readSearchTests(testFile)
 	if err != nil {
 		return err
 	}
+	client := frontend.NewClient(frontendHost)
 	var failed bool
 	for _, st := range tests {
-		output, err := runTest(ctx, db, st)
+		output, err := runTest(client, st)
 		if err != nil {
 			return err
 		}
@@ -93,16 +101,17 @@
 	return nil
 }
 
-func runTest(ctx context.Context, db *postgres.DB, st *searchTest) (output []string, err error) {
+func runTest(client *frontend.Client, st *searchTest) (output []string, err error) {
 	defer derrors.Wrap(&err, "runTest(ctx, db, st.title: %q)", st.title)
-	results, err := db.Search(ctx, st.query, postgres.SearchOptions{MaxResults: 10, SearchSymbols: true})
+	searchPage, err := client.Search(st.query, "symbol")
 	if err != nil {
 		return nil, err
 	}
+	gotResults := searchPage.Results
 	for i, want := range st.results {
-		got := &postgres.SearchResult{}
-		if len(results) > i {
-			got = results[i]
+		got := &frontend.SearchResult{}
+		if len(gotResults) > i {
+			got = gotResults[i]
 		}
 		if want.symbol != got.SymbolName || want.pkg != got.PackagePath {
 			output = append(output,
diff --git a/tests/search/run.sh b/tests/search/run.sh
index 2549d72..6cc661d 100755
--- a/tests/search/run.sh
+++ b/tests/search/run.sh
@@ -16,7 +16,7 @@
   export GO_DISCOVERY_DATABASE_NAME=discovery_symbol_test
   export GO_DISCOVERY_CONFIG_DYNAMIC=tests/search/config.yaml
   export GO_DISCOVERY_SEED_DB_FILE=tests/search/seed.txt
-  dockercompose build && dockercompose run seeddb && ./devtools/go.sh run tests/search/main.go
+  dockercompose build && dockercompose run seeddb && dockercompose run searchtest
 
   local status=$?
   if [ $status -eq 0 ]