/*
Copyright (c) Edgeless Systems GmbH

SPDX-License-Identifier: AGPL-3.0-only
*/

package cloudcmd

import (
	"context"
	"errors"
	"testing"

	"github.com/edgelesssys/constellation/v2/cli/internal/terraform"
	"github.com/stretchr/testify/assert"
)

func TestTerminator(t *testing.T) {
	someErr := errors.New("failed")

	testCases := map[string]struct {
		tfClient       tfDestroyer
		newTfClientErr error
		libvirt        *stubLibvirtRunner
		wantErr        bool
	}{
		"gcp": {
			libvirt:  &stubLibvirtRunner{},
			tfClient: &stubTerraformClient{},
		},
		"newTfClientErr": {
			libvirt:        &stubLibvirtRunner{},
			newTfClientErr: someErr,
			wantErr:        true,
		},
		"destroy cluster error": {
			tfClient: &stubTerraformClient{destroyErr: someErr},
			libvirt:  &stubLibvirtRunner{},
			wantErr:  true,
		},
		"clean up workspace error": {
			tfClient: &stubTerraformClient{cleanUpWorkspaceErr: someErr},
			libvirt:  &stubLibvirtRunner{},
			wantErr:  true,
		},
		"qemu stop libvirt error": {
			tfClient: &stubTerraformClient{},
			libvirt:  &stubLibvirtRunner{stopErr: someErr},
			wantErr:  true,
		},
	}

	for name, tc := range testCases {
		t.Run(name, func(t *testing.T) {
			assert := assert.New(t)

			terminator := &Terminator{
				newTerraformClient: func(_ context.Context, _ string) (tfDestroyer, error) {
					return tc.tfClient, tc.newTfClientErr
				},
				newLibvirtRunner: func() libvirtRunner {
					return tc.libvirt
				},
			}

			err := terminator.Terminate(context.Background(), "", terraform.LogLevelNone)

			if tc.wantErr {
				assert.Error(err)
				return
			}
			assert.NoError(err)
			cl := tc.tfClient.(*stubTerraformClient)
			assert.True(cl.destroyCalled)
			assert.True(cl.removeInstallerCalled)
			assert.True(tc.libvirt.stopCalled)
		})
	}
}