Add unit test for searching

This commit is contained in:
2025-09-10 16:56:50 +08:00
parent 0a88a65846
commit ff1f6e7340
3 changed files with 174 additions and 3 deletions

View File

@@ -70,3 +70,11 @@ func GetDB() *gorm.DB {
func IsReady() bool {
return ready
}
func Close() error {
sqlDB, err := db.DB()
if err != nil {
return err
}
return sqlDB.Close()
}

View File

@@ -104,8 +104,6 @@ func TestTag(t *testing.T) {
assert.Nil(t, tag6.AliasOf)
// cleanup
d, err := db.DB()
assert.Nil(t, err)
_ = d.Close()
_ = Close()
_ = os.Remove("test.db")
}

View File

@@ -0,0 +1,165 @@
package search
import (
"nysoure/server/dao"
"nysoure/server/model"
"os"
"testing"
"github.com/blevesearch/bleve"
"gorm.io/gorm"
)
func Init() {
err := index.Close()
if err != nil {
panic(err)
}
_ = os.RemoveAll("search_test.bleve")
mapper := bleve.NewIndexMapping()
index, err = bleve.New("search_test.bleve", mapper)
if err != nil {
panic(err)
}
}
func TearDown() {
err := index.Close()
if err != nil {
panic(err)
}
dao.Close()
os.RemoveAll("search_test.bleve")
os.Remove("test.db")
}
func TestSearchResource(t *testing.T) {
Init()
defer TearDown()
resources := []model.Resource{
// normal cases
{Model: gorm.Model{ID: 1}, Title: "The Great Adventure", AlternativeTitles: []string{"Adventure Time", "The Big Adventure"}},
{Model: gorm.Model{ID: 2}, Title: "Mystery of the Lost City", AlternativeTitles: []string{"Lost City Chronicles"}},
{Model: gorm.Model{ID: 3}, Title: "Romance in Paris", AlternativeTitles: []string{"Love in Paris", "Parisian Romance"}},
{Model: gorm.Model{ID: 4}, Title: "Sci-Fi Extravaganza", AlternativeTitles: []string{"Future World", "Sci-Fi Saga"}},
{Model: gorm.Model{ID: 5}, Title: "Comedy Nights", AlternativeTitles: []string{"Laugh Out Loud", "Comedy Central"}},
// With special characters
{Model: gorm.Model{ID: 6}, Title: "Action & Adventure", AlternativeTitles: []string{"Action-Packed", "Adventure Time!"}},
{Model: gorm.Model{ID: 7}, Title: "Horror: The Awakening", AlternativeTitles: []string{"Scary Movie", "Horror Nights"}},
{Model: gorm.Model{ID: 8}, Title: "Drama @ Home", AlternativeTitles: []string{"Home Stories", "Dramatic Tales"}},
{Model: gorm.Model{ID: 9}, Title: "Fantasy #1", AlternativeTitles: []string{"Fantasy World", "Magical Tales"}},
{Model: gorm.Model{ID: 10}, Title: "Thriller ~Uncut~"},
{Model: gorm.Model{ID: 11}, Title: "Epic ~ Saga ~"},
{Model: gorm.Model{ID: 12}, Title: "Journey - Dawn -", AlternativeTitles: []string{"Dawn Adventures", "Journey Chronicles"}},
{Model: gorm.Model{ID: 13}, Title: "Legends -Rise-", AlternativeTitles: []string{"Rise of Legends", "Legendary Tales"}},
{Model: gorm.Model{ID: 14}, Title: "Chronicles: Time", AlternativeTitles: []string{"Time Chronicles", "Chronicles of Ages"}},
}
// Add resources to index
for _, r := range resources {
err := AddResourceToIndex(r)
if err != nil {
t.Fatalf("Failed to add resource ID %d to index: %v", r.ID, err)
}
}
tests := []struct {
query string
expectedIDs []uint
unexpectedID uint
}{
// Basic searches
{query: "Adventure", expectedIDs: []uint{1, 6}},
{query: "Mystery", expectedIDs: []uint{2}},
{query: "Romance", expectedIDs: []uint{3}},
{query: "Sci-Fi", expectedIDs: []uint{4}},
{query: "Comedy", expectedIDs: []uint{5}},
// Exact matches
{query: "The Great Adventure", expectedIDs: []uint{1}},
{query: "Mystery of the Lost City", expectedIDs: []uint{2}},
{query: "Romance in Paris", expectedIDs: []uint{3}},
{query: "Sci-Fi Extravaganza", expectedIDs: []uint{4}},
{query: "Comedy Nights", expectedIDs: []uint{5}},
{query: "Action & Adventure", expectedIDs: []uint{6}},
{query: "Horror: The Awakening", expectedIDs: []uint{7}},
{query: "Drama @ Home", expectedIDs: []uint{8}},
{query: "Fantasy #1", expectedIDs: []uint{9}},
{query: "Thriller ~Uncut~", expectedIDs: []uint{10}},
{query: "Epic ~ Saga ~", expectedIDs: []uint{11}},
{query: "Journey - Dawn -", expectedIDs: []uint{12}},
{query: "Legends -Rise-", expectedIDs: []uint{13}},
{query: "Chronicles: Time", expectedIDs: []uint{14}},
// Searches with special characters
{query: "Action & Adventure", expectedIDs: []uint{6}},
{query: "Horror: The Awakening", expectedIDs: []uint{7}},
{query: "Drama @ Home", expectedIDs: []uint{8}},
{query: "Fantasy #1", expectedIDs: []uint{9}},
{query: "Thriller ~Uncut~", expectedIDs: []uint{10}},
{query: "Epic ~ Saga ~", expectedIDs: []uint{11}},
{query: "Journey - Dawn -", expectedIDs: []uint{12}},
{query: "Legends -Rise-", expectedIDs: []uint{13}},
{query: "Chronicles: Time", expectedIDs: []uint{14}},
// Case insensitivity
{query: "adventure", expectedIDs: []uint{1, 6}},
{query: "MYSTERY", expectedIDs: []uint{2}},
{query: "rOmAnCe", expectedIDs: []uint{3}},
// Searches using alternative titles
{query: "Adventure Time", expectedIDs: []uint{1, 6}},
{query: "Lost City Chronicles", expectedIDs: []uint{2}},
{query: "Love in Paris", expectedIDs: []uint{3}},
{query: "Future World", expectedIDs: []uint{4}},
{query: "Laugh Out Loud", expectedIDs: []uint{5}},
// Searches with special characters in alternative titles
{query: "Action-Packed", expectedIDs: []uint{6}},
{query: "Scary Movie", expectedIDs: []uint{7}},
{query: "Home Stories", expectedIDs: []uint{8}},
{query: "Fantasy World", expectedIDs: []uint{9}},
{query: "Epic Tales", expectedIDs: []uint{11}},
{query: "Dawn Adventures", expectedIDs: []uint{12}},
{query: "Rise of Legends", expectedIDs: []uint{13}},
{query: "Time Chronicles", expectedIDs: []uint{14}},
// Searches with special characters in queries
{query: "Horror:", expectedIDs: []uint{7}},
{query: "@ Home", expectedIDs: []uint{8}},
{query: "#1", expectedIDs: []uint{9}},
{query: "~Uncut~", expectedIDs: []uint{10}},
{query: "Uncut", expectedIDs: []uint{10}},
{query: "~ Saga ~", expectedIDs: []uint{11}},
{query: "Saga", expectedIDs: []uint{11}},
{query: "- Dawn -", expectedIDs: []uint{12}},
{query: "-Rise-", expectedIDs: []uint{13}},
}
for _, test := range tests {
t.Run(test.query, func(t *testing.T) {
resultIDs, err := SearchResource(test.query)
if err != nil {
t.Fatalf("Search failed for query '%s': %v", test.query, err)
}
// Check for expected IDs
for _, expectedID := range test.expectedIDs {
found := false
for _, resultID := range resultIDs {
if resultID == expectedID {
found = true
break
}
}
if !found {
t.Errorf("Expected ID %d not found in results for query '%s'", expectedID, test.query)
}
}
// Check for unexpected ID
if test.unexpectedID != 0 {
for _, resultID := range resultIDs {
if resultID == test.unexpectedID {
t.Errorf("Unexpected ID %d found in results for query '%s'", test.unexpectedID, test.query)
}
}
}
})
}
}