package actions

import (
	"context"
	"testing"

	log "github.com/sirupsen/logrus"
	"gotest.tools/assert"
)

func TestGraphEvent(t *testing.T) {
	runnerConfig := &RunnerConfig{
		Ctx:          context.Background(),
		WorkflowPath: "multi.workflow",
		WorkingDir:   "testdata",
		EventName:    "push",
	}
	runner, err := NewRunner(runnerConfig)
	assert.NilError(t, err)

	graph, err := runner.GraphEvent("push")
	assert.NilError(t, err)
	assert.DeepEqual(t, graph, [][]string{{"build"}})

	graph, err = runner.GraphEvent("release")
	assert.NilError(t, err)
	assert.DeepEqual(t, graph, [][]string{{"deploy"}})
}

func TestRunEvent(t *testing.T) {
	if testing.Short() {
		t.Skip("skipping integration test")
	}

	tables := []struct {
		workflowPath string
		eventName    string
		errorMessage string
	}{
		{"basic.workflow", "push", ""},
		{"pipe.workflow", "push", ""},
		{"fail.workflow", "push", "exit with `FAILURE`: 1"},
		{"buildfail.workflow", "push", "COPY failed"},
		{"regex.workflow", "push", "exit with `NEUTRAL`: 78"},
		{"gitref.workflow", "push", ""},
		{"env.workflow", "push", ""},
		{"detect_event.workflow", "", ""},
	}
	log.SetLevel(log.DebugLevel)

	for _, table := range tables {
		runnerConfig := &RunnerConfig{
			Ctx:          context.Background(),
			WorkflowPath: table.workflowPath,
			WorkingDir:   "testdata",
			EventName:    table.eventName,
		}
		runner, err := NewRunner(runnerConfig)
		assert.NilError(t, err, table.workflowPath)

		err = runner.RunEvent()
		if table.errorMessage == "" {
			assert.NilError(t, err, table.workflowPath)
		} else {
			assert.ErrorContains(t, err, table.errorMessage)
		}
	}
}
