Give each handler and service test its own database (closes #131)
check / check (push) Waiting to run
check / check (push) Waiting to run
Test databases in internal/handlers and internal/service were named after the address of the running test. A later test could get the address of a finished one, and with it a database that test's server might still hold open. Each test database now gets a random name, as in internal/ircserver. A new test in each package opens two test databases at once and checks that they do not share one; both new tests fail with the old names. Model: opus-5-5 Co-authored-by: clawbot <sneak+clawbot@sneak.cloud>
This commit was merged in pull request #138.
This commit is contained in:
@@ -7,6 +7,7 @@ package handlers_test
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"crypto/rand"
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
@@ -152,9 +153,12 @@ func newTestServerWith(
|
|||||||
) *testServer {
|
) *testServer {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
|
// A random name, so that no other test can share it, not
|
||||||
|
// even one that has finished but still holds its database
|
||||||
|
// open.
|
||||||
dbURL := fmt.Sprintf(
|
dbURL := fmt.Sprintf(
|
||||||
"file:test_%p?mode=memory&cache=shared",
|
"file:%s?mode=memory&cache=shared",
|
||||||
t,
|
rand.Text(),
|
||||||
)
|
)
|
||||||
copyTemplateDB(t, dbURL)
|
copyTemplateDB(t, dbURL)
|
||||||
|
|
||||||
@@ -667,6 +671,29 @@ func TestCreateSessionDuplicate(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestEachTestServerHasItsOwnDatabase checks that starting a
|
||||||
|
// second test server leaves the first one's database alone and
|
||||||
|
// starts on an empty one of its own.
|
||||||
|
func TestEachTestServerHasItsOwnDatabase(t *testing.T) {
|
||||||
|
first := newTestServer(t)
|
||||||
|
first.createSession("samenick")
|
||||||
|
|
||||||
|
second := newTestServer(t)
|
||||||
|
|
||||||
|
resp := postSession(t, first, "samenick")
|
||||||
|
|
||||||
|
defer func() { _ = resp.Body.Close() }()
|
||||||
|
|
||||||
|
if resp.StatusCode != http.StatusConflict {
|
||||||
|
t.Fatalf(
|
||||||
|
"first server: expected 409, got %d",
|
||||||
|
resp.StatusCode,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
second.createSession("samenick")
|
||||||
|
}
|
||||||
|
|
||||||
func TestCreateSessionEmpty(t *testing.T) {
|
func TestCreateSessionEmpty(t *testing.T) {
|
||||||
tserver := newTestServer(t)
|
tserver := newTestServer(t)
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ package service_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"crypto/rand"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -43,9 +44,12 @@ type testEnv struct {
|
|||||||
func newTestEnv(t *testing.T) *testEnv {
|
func newTestEnv(t *testing.T) *testEnv {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
|
|
||||||
|
// A random name, so that no other test can share it, not
|
||||||
|
// even one that has finished but still holds its database
|
||||||
|
// open.
|
||||||
dbURL := fmt.Sprintf(
|
dbURL := fmt.Sprintf(
|
||||||
"file:svc_test_%p?mode=memory&cache=shared",
|
"file:%s?mode=memory&cache=shared",
|
||||||
t,
|
rand.Text(),
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -137,6 +141,19 @@ func createSession(
|
|||||||
return sessionID
|
return sessionID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestEachTestEnvHasItsOwnDatabase checks that a test
|
||||||
|
// environment starts on an empty database while another one
|
||||||
|
// is still open.
|
||||||
|
func TestEachTestEnvHasItsOwnDatabase(t *testing.T) {
|
||||||
|
ctx := t.Context()
|
||||||
|
|
||||||
|
first := newTestEnv(t)
|
||||||
|
createSession(ctx, t, first.db, "samenick")
|
||||||
|
|
||||||
|
second := newTestEnv(t)
|
||||||
|
createSession(ctx, t, second.db, "samenick")
|
||||||
|
}
|
||||||
|
|
||||||
func TestFanOut(t *testing.T) {
|
func TestFanOut(t *testing.T) {
|
||||||
env := newTestEnv(t)
|
env := newTestEnv(t)
|
||||||
ctx := t.Context()
|
ctx := t.Context()
|
||||||
|
|||||||
Reference in New Issue
Block a user