From ff1f6e7340c6e3c17494bd4c46c14cac52b1c928 Mon Sep 17 00:00:00 2001 From: nyne Date: Wed, 10 Sep 2025 16:56:50 +0800 Subject: [PATCH] Add unit test for searching --- server/dao/db.go | 8 ++ server/dao/tag_test.go | 4 +- server/search/search_test.go | 165 +++++++++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+), 3 deletions(-) create mode 100644 server/search/search_test.go diff --git a/server/dao/db.go b/server/dao/db.go index 7ed17a0..b5b08d0 100644 --- a/server/dao/db.go +++ b/server/dao/db.go @@ -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() +} diff --git a/server/dao/tag_test.go b/server/dao/tag_test.go index cc8084a..2363b37 100644 --- a/server/dao/tag_test.go +++ b/server/dao/tag_test.go @@ -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") } diff --git a/server/search/search_test.go b/server/search/search_test.go new file mode 100644 index 0000000..6a41988 --- /dev/null +++ b/server/search/search_test.go @@ -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) + } + } + } + }) + } +}