package auth

import (
	"testing"
	"time"
)

func TestJWT_RoundTrip(t *testing.T) {
	tok, err := Issue("user-123")
	if err != nil {
		t.Fatal(err)
	}
	uid, err := Parse(tok)
	if err != nil {
		t.Fatalf("应能解析自签令牌: %v", err)
	}
	if uid != "user-123" {
		t.Errorf("subject = %q, want user-123", uid)
	}
}

func TestJWT_Expired(t *testing.T) {
	tok, _ := issue("u", -time.Hour) // 已过期
	if _, err := Parse(tok); err == nil {
		t.Error("过期令牌应拒绝")
	}
}

func TestJWT_Tampered(t *testing.T) {
	tok, _ := Issue("u")
	if _, err := Parse(tok + "x"); err == nil {
		t.Error("被篡改令牌应拒绝")
	}
	if _, err := Parse("not.a.jwt"); err == nil {
		t.Error("非法令牌应拒绝")
	}
	if _, err := Parse(""); err == nil {
		t.Error("空令牌应拒绝")
	}
}

func TestPassword_HashAndCheck(t *testing.T) {
	hash, err := HashPassword("s3cret-pw")
	if err != nil {
		t.Fatal(err)
	}
	if hash == "s3cret-pw" || hash == "" {
		t.Error("应为 bcrypt 哈希，非明文")
	}
	if !CheckPassword(hash, "s3cret-pw") {
		t.Error("正确密码应校验通过")
	}
	if CheckPassword(hash, "wrong-pw") {
		t.Error("错误密码应校验失败")
	}
}
