package document import ( "fmt" "os" "sync" "testing" ) // 测试用结构体 type TestDoc struct { ID string `bson:"_id"` Name string `bson:"name"` Age int `bson:"age"` } func TestDocumentStore(t *testing.T) { // 测试目录 dir := "./testdb" defer os.RemoveAll(dir) // 初始化文档存储 ds, err := NewDocumentStore(dir) if err != nil { t.Fatalf("Failed to create document store: %v", err) } defer ds.storage.Close() // 测试文档ID testID := "001" // 测试文档内容 testDoc := TestDoc{ ID: testID, Name: "Alice", Age: 30, } // 测试存储和获取 if err := ds.StoreDocument(testID, testDoc); err != nil { t.Errorf("StoreDocument failed: %v", err) } var result TestDoc if err := ds.GetDocument(testID, &result); err != nil { t.Errorf("GetDocument failed: %v", err) } if result.Name != testDoc.Name || result.Age != testDoc.Age { t.Errorf("Retrieved document mismatch: got %+v want %+v", result, testDoc) } // 测试删除功能 if err := ds.DeleteDocument(testID); err != nil { t.Errorf("DeleteDocument failed: %v", err) } if err := ds.GetDocument(testID, &result); err == nil { t.Errorf("Expected error after DeleteDocument") } } func TestErrorHandling(t *testing.T) { // 测试无效文档(包含不支持的类型) dir := "./testdb_error" defer os.RemoveAll(dir) ds, _ := NewDocumentStore(dir) invalidDoc := struct { F func() }{} if err := ds.StoreDocument("invalid", invalidDoc); err == nil { t.Error("Expected error for invalid document") } } func TestConcurrentAccess(t *testing.T) { // 测试并发写入同一ID dir := "./testdb_concurrent" defer os.RemoveAll(dir) numGoroutines := 10 var wg sync.WaitGroup key := "concurrent_test" ds, _ := NewDocumentStore(dir) wg.Add(numGoroutines) for i := 0; i < numGoroutines; i++ { go func(i int) { defer wg.Done() testDoc := TestDoc{ ID: key, Name: fmt.Sprintf("Test%d", i), } err := ds.StoreDocument(key, testDoc) if err != nil { t.Errorf("StoreDocument failed: %v", err) } }(i) } wg.Wait() // 验证最终值是否为最后一个写入 var result TestDoc if err := ds.GetDocument(key, &result); err != nil { t.Errorf("GetDocument failed: %v", err) } }