Path: blob/dev/pkg/reporting/exporters/pdf/pdf_test.go
4538 views
package pdf12import (3"os"4"path/filepath"5"sync"6"testing"7"time"89"github.com/projectdiscovery/nuclei/v3/pkg/model"10"github.com/projectdiscovery/nuclei/v3/pkg/model/types/severity"11"github.com/projectdiscovery/nuclei/v3/pkg/model/types/stringslice"12"github.com/projectdiscovery/nuclei/v3/pkg/output"13"github.com/stretchr/testify/require"14)1516func makeEvent(sev severity.Severity) *output.ResultEvent {17return &output.ResultEvent{18TemplateID: "test-template",19Host: "http://example.com",20Matched: "http://example.com/vulnerable",21Type: "http",22Timestamp: time.Now(),23Info: model.Info{24Name: "Test Finding",25Authors: stringslice.StringSlice{Value: "test"},26SeverityHolder: severity.Holder{Severity: sev},27Description: "A test vulnerability description.",28},29Request: "GET / HTTP/1.1\r\nHost: example.com",30Response: "HTTP/1.1 200 OK\r\nContent-Type: text/html",31}32}3334func TestNew_Defaults(t *testing.T) {35exp, err := New(&Options{})36require.NoError(t, err)37require.Equal(t, defaultFile, exp.options.File)38}3940func TestNew_CustomFile(t *testing.T) {41exp, err := New(&Options{File: "custom.pdf"})42require.NoError(t, err)43require.Equal(t, "custom.pdf", exp.options.File)44}4546func TestExport_NilEvent(t *testing.T) {47exp, err := New(&Options{File: "test.pdf"})48require.NoError(t, err)49require.NoError(t, exp.Export(nil))50require.Empty(t, exp.results)51}5253func TestClose_EmptyResults(t *testing.T) {54dir := t.TempDir()55out := filepath.Join(dir, "report.pdf")56exp, err := New(&Options{File: out})57require.NoError(t, err)58require.NoError(t, exp.Close())59_, statErr := os.Stat(out)60require.True(t, os.IsNotExist(statErr))61}6263func TestClose_WritesFile(t *testing.T) {64dir := t.TempDir()65out := filepath.Join(dir, "report.pdf")66exp, err := New(&Options{File: out})67require.NoError(t, err)68require.NoError(t, exp.Export(makeEvent(severity.High)))69require.NoError(t, exp.Close())7071info, err := os.Stat(out)72require.NoError(t, err)73require.Greater(t, info.Size(), int64(0))74}7576func TestExport_OmitRaw(t *testing.T) {77exp, err := New(&Options{File: "test.pdf", OmitRaw: true})78require.NoError(t, err)79event := makeEvent(severity.High)80require.NoError(t, exp.Export(event))8182require.Len(t, exp.results, 1)83require.Empty(t, exp.results[0].Request)84require.Empty(t, exp.results[0].Response)85require.NotEmpty(t, event.Request)86require.NotEmpty(t, event.Response)87}8889func TestExport_Concurrency(t *testing.T) {90exp, err := New(&Options{File: filepath.Join(t.TempDir(), "report.pdf")})91require.NoError(t, err)9293const workers = 5094var wg sync.WaitGroup95errs := make(chan error, workers)96wg.Add(workers)97for i := 0; i < workers; i++ {98go func() {99defer wg.Done()100errs <- exp.Export(makeEvent(severity.Medium))101}()102}103wg.Wait()104close(errs)105for e := range errs {106require.NoError(t, e)107}108require.Len(t, exp.results, workers)109}110111func TestSafeStr_ReplacesNonLatin1(t *testing.T) {112result := safeStr("hello 世界")113require.Equal(t, "hello ??", result)114}115116117