package opworker

import (
	"context"
	"fmt"
	"testing"

	"github.com/golang/mock/gomock"
	"github.com/pingcap/dbaas/central/config"
	"github.com/pingcap/dbaas/central/db/entity"
	"github.com/pingcap/dbaas/central/model/tenant/handler"
	. "github.com/smartystreets/goconvey/convey"
	"github.com/tidbcloud/pkgv2/mail/mock_mail"
)

func TestMarketplaceWorker_notifyOpsAndRD(t *testing.T) {
	Convey("TestMarketplaceWorker_notifyOpsAndRD", t, func() {
		ctrl := gomock.NewController(t)
		defer ctrl.Finish()

		mockedMail := mock_mail.NewMockFacade(ctrl)
		ctx := context.Background()
		w := MarketplaceWorker{
			GlobalWorker: GlobalWorker{},
			mailFacade:   mockedMail,
		}
		accountProvider := "aws"
		accountCode := "accountCode"
		tenant := &entity.Tenant{
			Updatable: entity.Updatable{
				Base: entity.Base{ID: 1},
			},
			Alias:                     "alias",
			AccountManager:            "accountManager",
			ThirdPartyAccountProvider: &accountProvider,
			ThirdPartyAccountCode:     &accountCode,
		}
		input := handler.SubscribeChange{
			AccountProvider: accountProvider,
			AccountCode:     accountCode,
			SubscribeStatus: handler.SubscribeStatusUnsubscribed,
		}
		Convey("normal case", func() {
			vars := map[string]string{
				"accountProvider": input.AccountProvider,
				"accountCode":     input.AccountCode,
				"orgID":           fmt.Sprint(tenant.ID.Uint64()),
				"orgName":         tenant.Alias,
			}

			mockedMail.EXPECT().SendMailWithTemplate(
				ctx, []string{"accountManager"},
				config.CustomerStatusUpdateSubject, config.TNCustomerUpdateSubscribeStatusChanged,
				vars, gomock.Any()).Return(nil)

			err := w.notifyOpsAndRD(ctx, tenant, input)
			So(err, ShouldBeNil)
		})
	})
}
