package middleware

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestSanitizeSortColumn_AllowedColumn_Passes(t *testing.T) {
	allowed := []string{"created_at", "updated_at", "name"}
	result := SanitizeSortColumn("created_at", allowed, "created_at")
	assert.Equal(t, "created_at", result)
}

func TestSanitizeSortColumn_CaseInsensitive(t *testing.T) {
	allowed := []string{"created_at", "updated_at", "name"}
	result := SanitizeSortColumn("Created_At", allowed, "created_at")
	assert.Equal(t, "created_at", result)
}

func TestSanitizeSortColumn_SQLInjection_ReturnsDefault(t *testing.T) {
	allowed := []string{"created_at", "updated_at", "name"}

	tests := []struct {
		name  string
		input string
	}{
		{"drop table", "created_at; DROP TABLE auth_user; --"},
		{"union select", "name UNION SELECT * FROM auth_user"},
		{"or 1=1", "name OR 1=1"},
		{"semicolon", "created_at;"},
		{"subquery", "(SELECT password FROM auth_user LIMIT 1)"},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			result := SanitizeSortColumn(tt.input, allowed, "created_at")
			assert.Equal(t, "created_at", result, "SQL injection attempt should return default")
		})
	}
}

func TestSanitizeSortColumn_Empty_ReturnsDefault(t *testing.T) {
	allowed := []string{"created_at", "updated_at", "name"}
	result := SanitizeSortColumn("", allowed, "created_at")
	assert.Equal(t, "created_at", result)
}

func TestSanitizeSortColumn_Whitespace_ReturnsDefault(t *testing.T) {
	allowed := []string{"created_at", "updated_at", "name"}
	result := SanitizeSortColumn("   ", allowed, "created_at")
	assert.Equal(t, "created_at", result)
}

func TestSanitizeSortColumn_UnknownColumn_ReturnsDefault(t *testing.T) {
	allowed := []string{"created_at", "updated_at", "name"}
	result := SanitizeSortColumn("nonexistent_column", allowed, "created_at")
	assert.Equal(t, "created_at", result)
}
