packagedatabaseimport("honeypot/internal/types""net/url""os""testing""time")funcTestDatabaseIntegration(t*testing.T){// Use an in-memory database for testingdb:=NewDatabase(":memory:")ifdb==nil{t.Fatal("Failed to create in-memory database")}deferdb.Close()// 1. Test CreateTables (called by NewDatabase)// 2. Test InsertEventevent:=&types.LogEvent{Time:time.Now().UTC().Format(time.RFC3339Nano),Type:"ssh",Event:types.EventAuthAttempt,RemoteAddr:"1.2.3.4",RemotePort:12345,DstPort:22,Fields:map[string]interface{}{"username":"admin"},}err:=db.InsertEvent(event)iferr!=nil{t.Fatalf("InsertEvent failed: %v",err)}// 3. Test QueryEventsMetaq:=url.Values{}q.Set("type","ssh")meta,err:=db.QueryEventsMeta(q)iferr!=nil{t.Fatalf("QueryEventsMeta failed: %v",err)}ifmeta.Total!=1{t.Errorf("expected 1 event, got %v",meta.Total)}// 4. Test StreamEventsvarevents[]Eventerr=db.StreamEvents(q,func(eEvent)error{events=append(events,e)returnnil})iferr!=nil{t.Fatalf("StreamEvents failed: %v",err)}iflen(events)!=1{t.Errorf("expected 1 event in stream, got %v",len(events))}ifevents[0].RemoteAddr!="1.2.3.4"{t.Errorf("expected remote addr 1.2.3.4, got %v",events[0].RemoteAddr)}// 5. Test GetDashboardStatsstats,err:=db.GetDashboardStats()iferr!=nil{t.Fatalf("GetDashboardStats failed: %v",err)}ifstats.Count24h!=1{t.Errorf("expected count_24h = 1, got %v",stats.Count24h)}iflen(stats.StatsAll.RemoteAddrs)!=1||stats.StatsAll.RemoteAddrs[0].Label!="1.2.3.4"{t.Errorf("unexpected top remote addrs: %v",stats.StatsAll.RemoteAddrs)}// 6. Test GetPortStatsportStats,err:=db.GetTopNFields("dst_port","type = ?",[]any{"ssh"},50)iferr!=nil{t.Fatalf("GetPortStats failed: %v",err)}iflen(portStats)!=1||portStats[0].Label!="22"{t.Errorf("unexpected port stats: %v",portStats)}// 7. Test GetSubnetStatssubnetStats,err:=db.GetSubnetStats("1.2.3.0/24")iferr!=nil{t.Fatalf("GetSubnetStats failed: %v",err)}iflen(subnetStats)!=1||subnetStats[0].Label!="1.2.3.4"{t.Errorf("unexpected subnet stats: %v",subnetStats)}// 8. Test GetFirstLastSeenForAddressfirstSeen,lastSeen,count,err:=db.GetFirstLastSeenTotalForNet("non-existent")iferr==nil{t.Fatal("GetFirstLastSeenTotalForSubnet should have failed")}iffirstSeen!=""||lastSeen!=""||count!=0{t.Errorf("expected empty strings for non-existent subnet, got %q, %q, %d",firstSeen,lastSeen,count)}}funcTestNewDatabase(t*testing.T){// Test with empty stringifdb:=NewDatabase("");db!=nil{t.Error("NewDatabase(\"\") should return nil")}// Test with a temporary filetmpFile:="test_db.duckdb"deferos.Remove(tmpFile)db:=NewDatabase(tmpFile)ifdb==nil{t.Fatal("NewDatabase failed with temp file")}db.Close()}