internal/postgres: remove module from version_map in DeleteModule

postgres.DeleteModule is updated to delete the corresponding module_path
and resolved_version row from the version_map table.

Fixes #39633

Change-Id: I9de46b08e535bea52c2ea4dbab1c71a8e1c2c2f7
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/238637
Reviewed-by: Julie Qiu <julie@golang.org>
diff --git a/internal/postgres/insert_module.go b/internal/postgres/insert_module.go
index d2d0a76..7ccc4d7 100644
--- a/internal/postgres/insert_module.go
+++ b/internal/postgres/insert_module.go
@@ -697,6 +697,11 @@
 		if _, err := db.db.Exec(ctx, stmt, modulePath, version); err != nil {
 			return err
 		}
+
+		if _, err = db.db.Exec(ctx, `DELETE FROM version_map WHERE module_path = $1 AND resolved_version = $2`, modulePath, version); err != nil {
+			return err
+		}
+
 		var x int
 		err = db.db.QueryRow(ctx, `SELECT 1 FROM modules WHERE module_path=$1 LIMIT 1`, modulePath).Scan(&x)
 		if err != sql.ErrNoRows || err == nil {
diff --git a/internal/postgres/insert_module_test.go b/internal/postgres/insert_module_test.go
index 16275a5..4562ac3 100644
--- a/internal/postgres/insert_module_test.go
+++ b/internal/postgres/insert_module_test.go
@@ -291,25 +291,42 @@
 	defer ResetTestDB(testDB, t)
 
 	v := sample.DefaultModule()
+
 	if err := testDB.InsertModule(ctx, v); err != nil {
 		t.Fatal(err)
 	}
 	if _, err := testDB.LegacyGetModuleInfo(ctx, v.ModulePath, v.Version); err != nil {
 		t.Fatal(err)
 	}
+
+	vm := sample.DefaultVersionMap()
+	if err := testDB.UpsertVersionMap(ctx, vm); err != nil {
+		t.Fatal(err)
+	}
+	if _, err := testDB.GetVersionMap(ctx, v.ModulePath, v.Version); err != nil {
+		t.Fatal(err)
+	}
+
 	if err := testDB.DeleteModule(ctx, v.ModulePath, v.Version); err != nil {
 		t.Fatal(err)
 	}
 	if _, err := testDB.LegacyGetModuleInfo(ctx, v.ModulePath, v.Version); !errors.Is(err, derrors.NotFound) {
 		t.Errorf("got %v, want NotFound", err)
 	}
+
 	var x int
 	err := testDB.Underlying().QueryRow(ctx, "SELECT 1 FROM imports_unique WHERE from_module_path = $1",
 		v.ModulePath).Scan(&x)
 	if err != sql.ErrNoRows {
 		t.Errorf("imports_unique: got %v, want ErrNoRows", err)
 	}
-	// TODO(golang/go#39633): check removal from version_map
+	err = testDB.Underlying().QueryRow(
+		ctx,
+		"SELECT 1 FROM version_map WHERE module_path = $1 AND resolved_version = $2",
+		v.ModulePath, v.Version).Scan(&x)
+	if err != sql.ErrNoRows {
+		t.Errorf("version_map: got %v, want ErrNoRows", err)
+	}
 }
 
 func TestPostgres_NewerAlternative(t *testing.T) {
diff --git a/internal/testing/sample/sample.go b/internal/testing/sample/sample.go
index 6f6af2c..13e17ae 100644
--- a/internal/testing/sample/sample.go
+++ b/internal/testing/sample/sample.go
@@ -9,6 +9,7 @@
 import (
 	"fmt"
 	"math"
+	"net/http"
 	"path"
 	"strings"
 	"time"
@@ -150,6 +151,17 @@
 		LegacyPackage(ModulePath, Suffix))
 }
 
+func DefaultVersionMap() *internal.VersionMap {
+	return &internal.VersionMap{
+		ModulePath:       ModulePath,
+		RequestedVersion: VersionString,
+		ResolvedVersion:  VersionString,
+		Status:           http.StatusOK,
+		GoModPath:        "",
+		Error:            "",
+	}
+}
+
 // Module creates a Module with the given path and version.
 // The list of suffixes is used to create LegacyPackages within the module.
 func Module(modulePath, version string, suffixes ...string) *internal.Module {
diff --git a/internal/worker/fetch_test.go b/internal/worker/fetch_test.go
index bf3fb91..f3ee028 100644
--- a/internal/worker/fetch_test.go
+++ b/internal/worker/fetch_test.go
@@ -80,12 +80,14 @@
 		if vs.Status != want {
 			t.Fatalf("testDB.GetModuleVersionState(ctx, %q, %q): status = %v, want = %d", modulePath, version, vs.Status, want)
 		}
-		vm, err := testDB.GetVersionMap(ctx, modulePath, version)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if vm.Status != want {
-			t.Fatalf("testDB.GetVersionMap(ctx, %q, %q): status = %d, want = %d", modulePath, version, vm.Status, want)
+		if want != http.StatusNotFound {
+			vm, err := testDB.GetVersionMap(ctx, modulePath, version)
+			if err != nil {
+				t.Fatal(err)
+			}
+			if vm.Status != want {
+				t.Fatalf("testDB.GetVersionMap(ctx, %q, %q): status = %d, want = %d", modulePath, version, vm.Status, want)
+			}
 		}
 	}
 
@@ -203,12 +205,9 @@
 	if vs.Status != wantCode {
 		t.Fatalf("testDB.GetModuleVersionState(ctx, %q, %q): status=%v, want %d", modulePath, version, vs.Status, wantCode)
 	}
-	vm, err := testDB.GetVersionMap(ctx, modulePath, version)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if vm.Status != wantCode {
-		t.Fatalf("testDB.GetVersionMap(ctx, %q, %q): status=%v, want %d", modulePath, version, vm.Status, wantCode)
+	_, err = testDB.GetVersionMap(ctx, modulePath, version)
+	if !errors.Is(err, derrors.NotFound) {
+		t.Fatalf("got %v, want Is(NotFound)", err)
 	}
 }
 
@@ -357,12 +356,9 @@
 		t.Errorf("testDB.GetModuleVersionState(ctx, %q, %q): goModPath=%q, want %q", modulePath, version, vs.GoModPath, goModPath)
 	}
 
-	vm, err := testDB.GetVersionMap(ctx, modulePath, version)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if vm.Status != wantCode {
-		t.Fatalf("testDB.GetVersionMap(ctx, %q, %q): status=%v, want %d", modulePath, version, vm.Status, wantCode)
+	_, err = testDB.GetVersionMap(ctx, modulePath, version)
+	if !errors.Is(err, derrors.NotFound) {
+		t.Fatalf("got %v, want Is(NotFound)", err)
 	}
 }