//go:build auth

package auth_test

import (
	"github.com/mudler/LocalAI/core/http/auth"
	. "github.com/onsi/ginkgo/v2"
	. "github.com/onsi/gomega"
)

var _ = Describe("InitDB", func() {
	Context("SQLite", func() {
		It("creates all tables with in-memory SQLite", func() {
			db, err := auth.InitDB(":memory:")
			Expect(err).ToNot(HaveOccurred())
			Expect(db).ToNot(BeNil())

			// Verify tables exist
			Expect(db.Migrator().HasTable(&auth.User{})).To(BeTrue())
			Expect(db.Migrator().HasTable(&auth.Session{})).To(BeTrue())
			Expect(db.Migrator().HasTable(&auth.UserAPIKey{})).To(BeTrue())
		})

		It("is idempotent - running twice does not error", func() {
			db, err := auth.InitDB(":memory:")
			Expect(err).ToNot(HaveOccurred())

			// Re-migrate on same DB should succeed
			err = db.AutoMigrate(&auth.User{}, &auth.Session{}, &auth.UserAPIKey{})
			Expect(err).ToNot(HaveOccurred())
		})

		It("creates composite index on users(provider, subject)", func() {
			db, err := auth.InitDB(":memory:")
			Expect(err).ToNot(HaveOccurred())

			// Insert a user to verify the index doesn't prevent normal operations
			user := &auth.User{
				ID:       "test-1",
				Provider: auth.ProviderGitHub,
				Subject:  "12345",
				Role:     "admin",
				Status:   auth.StatusActive,
			}
			Expect(db.Create(user).Error).ToNot(HaveOccurred())

			// Query using the indexed columns should work
			var found auth.User
			Expect(db.Where("provider = ? AND subject = ?", auth.ProviderGitHub, "12345").First(&found).Error).ToNot(HaveOccurred())
			Expect(found.ID).To(Equal("test-1"))
		})
	})
})
