package output import ( "fmt" "strings" "testing" "github.com/pkg/errors" "github.com/projectdiscovery/nuclei/v3/pkg/types" "github.com/stretchr/testify/require" ) func TestStandardWriterRequest(t *testing.T) { t.Run("WithoutTraceAndError", func(t *testing.T) { w, err := NewStandardWriter(&types.Options{}) require.NoError(t, err) require.NotPanics(t, func() { w.Request("path", "input", "http", nil) w.Close() }) }) t.Run("TraceAndErrorWithoutError", func(t *testing.T) { traceWriter := &testWriteCloser{} errorWriter := &testWriteCloser{} w, err := NewStandardWriter(&types.Options{}) w.traceFile = traceWriter w.errorFile = errorWriter require.NoError(t, err) w.Request("path", "input", "http", nil) require.Equal(t, `{"template":"path","type":"http","input":"input","address":"input:","error":"none"}`, traceWriter.String()) require.Empty(t, errorWriter.String()) }) t.Run("ErrorWithWrappedError", func(t *testing.T) { errorWriter := &testWriteCloser{} w, err := NewStandardWriter(&types.Options{}) w.errorFile = errorWriter require.NoError(t, err) w.Request( "misconfiguration/tcpconfig.yaml", "https://example.com/tcpconfig.html", "http", fmt.Errorf("GET https://example.com/tcpconfig.html/tcpconfig.html giving up after 2 attempts: %w", errors.New("context deadline exceeded (Client.Timeout exceeded while awaiting headers)")), ) require.Equal(t, `{"template":"misconfiguration/tcpconfig.yaml","type":"http","input":"https://example.com/tcpconfig.html","address":"example.com:443","error":"cause=\"context deadline exceeded (Client.Timeout exceeded while awaiting headers)\"","kind":"unknown-error"}`, errorWriter.String()) }) } type testWriteCloser struct { strings.Builder } func (w testWriteCloser) Close() error { return nil }