package gormutil

import (
	"testing"
	"time"

	"github.com/go-sql-driver/mysql"
	"github.com/stretchr/testify/require"
)

func TestConfigMySQLTimeouts(t *testing.T) {
	tests := []struct {
		name            string
		config          Config
		expectedTimeout time.Duration
		expectedRead    time.Duration
		expectedWrite   time.Duration
	}{
		{
			name:            "defaults",
			config:          testConfig(),
			expectedTimeout: defaultTimeout,
			expectedRead:    defaultReadTimeout,
			expectedWrite:   defaultWriteTimeout,
		},
		{
			name: "configured",
			config: func() Config {
				config := testConfig()
				config.Timeout = 2 * time.Minute
				config.ReadTimeout = 90 * time.Second
				config.WriteTimeout = 45 * time.Second
				return config
			}(),
			expectedTimeout: 2 * time.Minute,
			expectedRead:    90 * time.Second,
			expectedWrite:   45 * time.Second,
		},
		{
			name: "non-positive values use defaults",
			config: func() Config {
				config := testConfig()
				config.Timeout = -time.Second
				config.ReadTimeout = 0
				config.WriteTimeout = -time.Minute
				return config
			}(),
			expectedTimeout: defaultTimeout,
			expectedRead:    defaultReadTimeout,
			expectedWrite:   defaultWriteTimeout,
		},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			config, err := mysql.ParseDSN(test.config.DSN())
			require.NoError(t, err)
			require.Equal(t, test.expectedTimeout, config.Timeout)
			require.Equal(t, test.expectedRead, config.ReadTimeout)
			require.Equal(t, test.expectedWrite, config.WriteTimeout)
		})
	}
}

func testConfig() Config {
	return Config{
		User:     "root",
		Host:     "127.0.0.1",
		Database: "test",
		Port:     3306,
	}
}
