/*
** Zabbix
** Copyright (C) 2001-2024 Zabbix SIA
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
**     http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
**/

package plugin

import (
	stdlog "log"
	"os"
	"strings"
	"testing"

	"github.com/google/go-cmp/cmp"
	"golang.zabbix.com/sdk/log"
	"golang.zabbix.com/sdk/plugin"
)

//nolint:paralleltest,tparallel
func Test_mssqlPlugin_Configure(t *testing.T) {
	log.DefaultLogger = stdlog.New(os.Stdout, "", stdlog.LstdFlags)

	type fields struct {
		config *pluginConfig
	}

	type args struct {
		global  *plugin.GlobalOptions
		options any
	}

	tests := []struct {
		name       string
		fields     fields
		args       args
		wantConfig *pluginConfig
	}{
		{
			"+valid",
			fields{},
			args{
				&plugin.GlobalOptions{Timeout: 3},
				[]byte(`KeepAlive=300`),
			},
			&pluginConfig{
				KeepAlive: 300,
				Timeout:   3,
			},
		},
		{
			"+withTimeout",
			fields{},
			args{
				&plugin.GlobalOptions{Timeout: 3},
				[]byte(
					strings.Join([]string{"KeepAlive=300", "Timeout=2"}, "\n"),
				),
			},
			&pluginConfig{
				KeepAlive: 300,
				Timeout:   2,
			},
		},
		{
			"+prevConfig",
			fields{
				&pluginConfig{
					Timeout:          44,
					KeepAlive:        22,
					CustomQueriesDir: "aaa",
				},
			},
			args{
				&plugin.GlobalOptions{Timeout: 3},
				[]byte(`KeepAlive=300`),
			},
			&pluginConfig{
				KeepAlive: 300,
				Timeout:   3,
			},
		},
		{
			"-marshalErr",
			fields{},
			args{
				&plugin.GlobalOptions{Timeout: 3},
				[]byte(
					strings.Join(
						[]string{"KeepAlive=300", "Timeout=2", "invalid"},
						"\n",
					),
				),
			},
			nil,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			t.Parallel()

			p := &mssqlPlugin{
				config: tt.fields.config,
				Base:   plugin.Base{Logger: log.New("test")},
			}

			p.Configure(tt.args.global, tt.args.options)

			if diff := cmp.Diff(tt.wantConfig, p.config); diff != "" {
				t.Errorf(
					"mssqlPlugin.Configure() mismatch (-want +got):\n%s",
					diff,
				)
			}
		})
	}
}

func Test_mssqlPlugin_Validate(t *testing.T) {
	t.Parallel()

	type args struct {
		options any
	}

	tests := []struct {
		name    string
		args    args
		wantErr bool
	}{
		{
			"+valid",
			args{[]byte(`KeepAlive=300`)},
			false,
		},
		{
			"-marshalErr",
			args{[]byte(`KeepDead=300`)},
			true,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			t.Parallel()

			err := (&mssqlPlugin{}).Validate(tt.args.options)
			if (err != nil) != tt.wantErr {
				t.Fatalf(
					"mssqlPlugin.Validate() error = %v, wantErr %v",
					err, tt.wantErr,
				)
			}
		})
	}
}