package workflows

import (
	"testing"

	"github.com/projectdiscovery/nuclei/v3/pkg/model/types/stringslice"
	"github.com/projectdiscovery/nuclei/v3/pkg/operators"
	"github.com/stretchr/testify/require"
)

func TestWorkflowMatchAndCompile(t *testing.T) {
	t.Run("name", func(t *testing.T) {
		matcher := &Matcher{Name: stringslice.StringSlice{Value: "sphinx"}}
		matched := matcher.Match(&operators.Result{Matches: map[string][]string{"sphinx": {}}, Extracts: map[string][]string{}})
		require.True(t, matched, "could not match value")
	})
	t.Run("name-negative", func(t *testing.T) {
		matcher := &Matcher{Name: stringslice.StringSlice{Value: "tomcat"}}
		matched := matcher.Match(&operators.Result{Matches: map[string][]string{"apache": {}}, Extracts: map[string][]string{}})
		require.False(t, matched, "could not match value")
	})
	t.Run("names-or", func(t *testing.T) {
		matcher := &Matcher{Name: stringslice.StringSlice{Value: []string{"sphinx", "elastic"}}, Condition: "or"}
		_ = matcher.Compile()
		matched := matcher.Match(&operators.Result{Matches: map[string][]string{"elastic": {}}, Extracts: map[string][]string{}})
		require.True(t, matched, "could not match value")
		matched = matcher.Match(&operators.Result{Matches: map[string][]string{"sphinx": {}}, Extracts: map[string][]string{}})
		require.True(t, matched, "could not match value")
		matched = matcher.Match(&operators.Result{Matches: map[string][]string{"random": {}}, Extracts: map[string][]string{}})
		require.False(t, matched, "could not match value")
	})
	t.Run("names-and", func(t *testing.T) {
		matcher := &Matcher{Name: stringslice.StringSlice{Value: []string{"sphinx", "elastic"}}, Condition: "and"}
		_ = matcher.Compile()
		matched := matcher.Match(&operators.Result{Matches: map[string][]string{"elastic": {}, "sphinx": {}}, Extracts: map[string][]string{}})
		require.True(t, matched, "could not match value")

		matched = matcher.Match(&operators.Result{Matches: map[string][]string{"sphinx": {}}, Extracts: map[string][]string{}})
		require.False(t, matched, "could not match value")
		matched = matcher.Match(&operators.Result{Matches: map[string][]string{"random": {}}, Extracts: map[string][]string{}})
		require.False(t, matched, "could not match value")
	})
}
