package session

import (
	"net/http/httptest"
	"testing"
	"time"

	"github.com/form3tech-oss/jwt-go"
	"github.com/gin-gonic/gin"
	"github.com/onsi/gomega"
)

func TestNewSessionExpiresAfterSevenDays(t *testing.T) {
	g := gomega.NewWithT(t)
	secret := []byte("test-session-secret")
	sm := &SessionManager{sessionSecret: secret}

	before := time.Now()
	tokenString, err := sm.NewSession(&Session{Username: "test-user"})
	after := time.Now()
	g.Expect(err).NotTo(gomega.HaveOccurred())

	claims := &sessionTokenBody{}
	token, err := jwt.ParseWithClaims(tokenString, claims, func(_ *jwt.Token) (any, error) {
		return secret, nil
	})
	g.Expect(err).NotTo(gomega.HaveOccurred())
	g.Expect(token.Valid).To(gomega.BeTrue())
	g.Expect(claims.ExpiresAt).To(gomega.BeNumerically(">=", before.Add(7*24*time.Hour).Unix()))
	g.Expect(claims.ExpiresAt).To(gomega.BeNumerically("<=", after.Add(7*24*time.Hour).Unix()))
}

func TestSetCookieExpiresAfterSevenDays(t *testing.T) {
	g := gomega.NewWithT(t)
	recorder := httptest.NewRecorder()
	ctx, _ := gin.CreateTestContext(recorder)
	sm := &SessionManager{}

	sm.SetCookie(ctx, "signed-session-token")

	cookies := recorder.Result().Cookies()
	g.Expect(cookies).To(gomega.HaveLen(1))
	g.Expect(cookies[0].Name).To(gomega.Equal("clinic.session_id"))
	g.Expect(cookies[0].Value).To(gomega.Equal("signed-session-token"))
	g.Expect(cookies[0].MaxAge).To(gomega.Equal(604800))
}

func TestSkipCsrfTokenIncludesLogQuery(t *testing.T) {
	g := gomega.NewWithT(t)

	g.Expect(skipCsrfToken).To(gomega.ContainElement("/log/query"))
}
