Path: blob/dev/cmd/integration-test/exporters.go
2070 views
package main12import (3"context"4"fmt"5"log"6"time"78"github.com/projectdiscovery/nuclei/v3/pkg/output"9"github.com/projectdiscovery/nuclei/v3/pkg/reporting/exporters/mongo"10"github.com/testcontainers/testcontainers-go"11mongocontainer "github.com/testcontainers/testcontainers-go/modules/mongodb"1213osutil "github.com/projectdiscovery/utils/os"14mongoclient "go.mongodb.org/mongo-driver/mongo"15mongooptions "go.mongodb.org/mongo-driver/mongo/options"16)1718const (19dbName = "test"20dbImage = "mongo:8"21)2223var exportersTestCases = []TestCaseInfo{24{Path: "exporters/mongo", TestCase: &mongoExporter{}, DisableOn: func() bool {25return osutil.IsWindows() || osutil.IsOSX()26}},27}2829type mongoExporter struct{}3031func (m *mongoExporter) Execute(filepath string) error {32ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute)33defer cancel()3435// Start a MongoDB container36mongodbContainer, err := mongocontainer.Run(ctx, dbImage)37defer func() {38if err := testcontainers.TerminateContainer(mongodbContainer); err != nil {39log.Printf("failed to terminate container: %s", err)40}41}()42if err != nil {43return fmt.Errorf("failed to start container: %w", err)44}4546connString, err := mongodbContainer.ConnectionString(ctx)47if err != nil {48return fmt.Errorf("failed to get connection string for MongoDB container: %s", err)49}50connString = connString + dbName5152// Create a MongoDB exporter and write a test result to the database53opts := mongo.Options{54ConnectionString: connString,55CollectionName: "test",56BatchSize: 1, // Ensure we write the result immediately57}5859exporter, err := mongo.New(&opts)60if err != nil {61return fmt.Errorf("failed to create MongoDB exporter: %s", err)62}63defer func() {64if err := exporter.Close(); err != nil {65fmt.Printf("failed to close exporter: %s\n", err)66}67}()6869res := &output.ResultEvent{70Request: "test request",71Response: "test response",72}7374err = exporter.Export(res)75if err != nil {76return fmt.Errorf("failed to export result event to MongoDB: %s", err)77}7879// Verify that the result was written to the database80clientOptions := mongooptions.Client().ApplyURI(connString)81client, err := mongoclient.Connect(ctx, clientOptions)82if err != nil {83return fmt.Errorf("error creating MongoDB client: %s", err)84}85defer func() {86if err := client.Disconnect(ctx); err != nil {87fmt.Printf("failed to disconnect from MongoDB: %s\n", err)88}89}()9091collection := client.Database(dbName).Collection(opts.CollectionName)92var actualRes output.ResultEvent93err = collection.FindOne(ctx, map[string]interface{}{"request": res.Request}).Decode(&actualRes)94if err != nil {95return fmt.Errorf("failed to find document in MongoDB: %s", err)96}9798if actualRes.Request != res.Request || actualRes.Response != res.Response {99return fmt.Errorf("exported result does not match expected result: got %v, want %v", actualRes, res)100}101102return nil103}104105106