blob: db969a767727b3561538b177c848b00432de45d1 [file] [log] [blame]
// Copyright 2024 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package docs
import (
"slices"
"strings"
"testing"
"golang.org/x/oscar/internal/storage"
"golang.org/x/oscar/internal/testutil"
)
func TestCorpus(t *testing.T) {
lg := testutil.Slogger(t)
db := storage.MemDB()
corpus := New(lg, db)
corpus.Add("id1", "Title1", "text1")
corpus.Add("id3", "Title3", "text3")
corpus.Add("id2", "Title2", "text2")
extra := make(map[string]string)
var ids []string
do := func(d *Doc) {
t.Helper()
if !strings.HasPrefix(d.ID, "id") {
t.Fatalf("invalid prefix %q", d.ID)
}
n := d.ID[len("id"):]
title := "Title" + n + extra[d.ID]
text := "text" + n + extra[d.ID]
if d.Title != title || d.Text != text {
t.Fatalf("Doc id=%s has Title=%q, Text=%q, want %q, %q", d.ID, d.Title, d.Text, title, text)
}
ids = append(ids, d.ID)
}
// Basic iteration.
for d := range corpus.Docs("") {
do(d)
}
want := []string{"id1", "id2", "id3"}
if !slices.Equal(ids, want) {
t.Errorf("Docs() = %v, want %v", ids, want)
}
// Break during iteration.
ids = nil
for d := range corpus.Docs("") {
do(d)
if d.ID == "id2" {
break
}
}
want = []string{"id1", "id2"}
if !slices.Equal(ids, want) {
t.Errorf("Docs with break = %v, want %v", ids, want)
}
// DocsAfter iteration uses insert order.
var last *Doc
ids = nil
for d := range corpus.DocsAfter(0, "") {
do(d)
last = d
}
want = []string{"id1", "id3", "id2"}
if !slices.Equal(ids, want) {
t.Errorf("Docs() = %v, want %v", ids, want)
}
// DocsAfter incremental iteration.
corpus.Add("id4", "Title4", "text4")
extra["id2"] = "X"
corpus.Add("id2", "Title2X", "text2X") // edits existing text
corpus.Add("id3", "Title3", "text3") // no-op, ignored
ids = nil
for d := range corpus.DocsAfter(last.DBTime, "") {
do(d)
}
want = []string{"id4", "id2"}
if !slices.Equal(ids, want) {
t.Errorf("DocsAfter(last.DBTime=%d) = %v, want %v", last.DBTime, ids, want)
}
// DocsAfter with break.
ids = nil
for d := range corpus.DocsAfter(last.DBTime, "") {
do(d)
break
}
want = []string{"id4"}
if !slices.Equal(ids, want) {
t.Errorf("DocsAfter(last.DBTime=%d) with break = %v, want %v", last.DBTime, ids, want)
}
// Docs with prefix.
corpus.Add("id11", "Title11", "text11")
ids = nil
for d := range corpus.Docs("id1") {
do(d)
}
want = []string{"id1", "id11"}
if !slices.Equal(ids, want) {
t.Errorf("Docs(id1) = %v, want %v", ids, want)
}
// DocsAfter with prefix.
ids = nil
for d := range corpus.DocsAfter(0, "id1") {
do(d)
}
want = []string{"id1", "id11"}
if !slices.Equal(ids, want) {
t.Errorf("DocsAfter(0, id1) = %v, want %v", ids, want)
}
}