package container

import (
	"errors"
	"io"
	"testing"

	"git.netflux.io/rob/octoplex/internal/container/mocks"
	"git.netflux.io/rob/octoplex/internal/testhelpers"
	"github.com/docker/docker/api/types/events"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/mock"
)

func TestHandleEvents(t *testing.T) {
	eventsC1 := make(chan events.Message)
	eventsC2 := make(chan events.Message)
	errC := make(chan error)

	containerID := "b905f51b47242090ae504c184c7bc84d6274511ef763c1847039dcaa00a3ad27"

	var dockerClient mocks.DockerClient
	defer dockerClient.AssertExpectations(t)

	dockerClient.
		EXPECT().
		Events(mock.Anything, mock.Anything).
		Return(eventsC1, errC).
		Once()
	dockerClient.
		EXPECT().
		Events(mock.Anything, mock.Anything).
		Return(eventsC2, errC).
		Once()

	logger := testhelpers.NewNopLogger()
	ch := make(chan events.Message)

	done := make(chan struct{})
	go func() {
		defer close(done)

		handleEvents(t.Context(), containerID, &dockerClient, logger, ch)
	}()

	go func() {
		eventsC1 <- events.Message{Action: "start"}
		eventsC1 <- events.Message{Action: "stop"}
		errC <- errors.New("foo")
		eventsC2 <- events.Message{Action: "continue"}
		errC <- io.EOF
	}()

	assert.Equal(t, events.Action("start"), (<-ch).Action)
	assert.Equal(t, events.Action("stop"), (<-ch).Action)
	assert.Equal(t, events.Action("continue"), (<-ch).Action)

	<-done
}