147 lines
3.0 KiB
Go
147 lines
3.0 KiB
Go
package models
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestEmergencyToken_TableName(t *testing.T) {
|
|
token := EmergencyToken{}
|
|
assert.Equal(t, "emergency_tokens", token.TableName())
|
|
}
|
|
|
|
func TestEmergencyToken_IsExpired(t *testing.T) {
|
|
now := time.Now()
|
|
|
|
tests := []struct {
|
|
name string
|
|
expiresAt *time.Time
|
|
expected bool
|
|
}{
|
|
{
|
|
name: "nil expiration (never expires)",
|
|
expiresAt: nil,
|
|
expected: false,
|
|
},
|
|
{
|
|
name: "expired token (1 hour ago)",
|
|
expiresAt: ptrTime(now.Add(-1 * time.Hour)),
|
|
expected: true,
|
|
},
|
|
{
|
|
name: "expired token (1 day ago)",
|
|
expiresAt: ptrTime(now.Add(-24 * time.Hour)),
|
|
expected: true,
|
|
},
|
|
{
|
|
name: "valid token (1 hour from now)",
|
|
expiresAt: ptrTime(now.Add(1 * time.Hour)),
|
|
expected: false,
|
|
},
|
|
{
|
|
name: "valid token (30 days from now)",
|
|
expiresAt: ptrTime(now.Add(30 * 24 * time.Hour)),
|
|
expected: false,
|
|
},
|
|
{
|
|
name: "expired by 1 second",
|
|
expiresAt: ptrTime(now.Add(-1 * time.Second)),
|
|
expected: true,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
token := &EmergencyToken{
|
|
ExpiresAt: tt.expiresAt,
|
|
}
|
|
result := token.IsExpired()
|
|
assert.Equal(t, tt.expected, result)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestEmergencyToken_DaysUntilExpiration(t *testing.T) {
|
|
// Test with actual time.Now() since the method uses it internally
|
|
now := time.Now()
|
|
|
|
tests := []struct {
|
|
name string
|
|
expires *time.Time
|
|
minDays int
|
|
maxDays int
|
|
}{
|
|
{
|
|
name: "nil expiration",
|
|
expires: nil,
|
|
minDays: -1,
|
|
maxDays: -1,
|
|
},
|
|
{
|
|
name: "expires in ~1 day",
|
|
expires: ptrTime(now.Add(24 * time.Hour)),
|
|
minDays: 0,
|
|
maxDays: 1,
|
|
},
|
|
{
|
|
name: "expires in ~30 days",
|
|
expires: ptrTime(now.Add(30 * 24 * time.Hour)),
|
|
minDays: 29,
|
|
maxDays: 30,
|
|
},
|
|
{
|
|
name: "expires in ~60 days",
|
|
expires: ptrTime(now.Add(60 * 24 * time.Hour)),
|
|
minDays: 59,
|
|
maxDays: 60,
|
|
},
|
|
{
|
|
name: "expires in ~90 days",
|
|
expires: ptrTime(now.Add(90 * 24 * time.Hour)),
|
|
minDays: 89,
|
|
maxDays: 90,
|
|
},
|
|
{
|
|
name: "expired ~1 day ago",
|
|
expires: ptrTime(now.Add(-24 * time.Hour)),
|
|
minDays: -2,
|
|
maxDays: -1,
|
|
},
|
|
{
|
|
name: "expired ~10 days ago",
|
|
expires: ptrTime(now.Add(-10 * 24 * time.Hour)),
|
|
minDays: -11,
|
|
maxDays: -10,
|
|
},
|
|
{
|
|
name: "expires in ~12 hours (partial day)",
|
|
expires: ptrTime(now.Add(12 * time.Hour)),
|
|
minDays: 0,
|
|
maxDays: 1,
|
|
},
|
|
{
|
|
name: "expires in ~36 hours (1.5 days)",
|
|
expires: ptrTime(now.Add(36 * time.Hour)),
|
|
minDays: 1,
|
|
maxDays: 2,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
token := &EmergencyToken{ExpiresAt: tt.expires}
|
|
result := token.DaysUntilExpiration()
|
|
|
|
assert.GreaterOrEqual(t, result, tt.minDays, "days should be >= min")
|
|
assert.LessOrEqual(t, result, tt.maxDays, "days should be <= max")
|
|
})
|
|
}
|
|
}
|
|
|
|
// ptrTime is a helper to create a pointer to a time.Time
|
|
func ptrTime(t time.Time) *time.Time {
|
|
return &t
|
|
}
|