package oltp
import (
"testing"
"time"
)
// An invite whose link lapsed is listed as holding its name; a live one
// and a re-sent one are not, and withdrawing the lapsed one frees the
// name for anyone.
func TestLapsedInvitesNameTheNamesTheyHold(t *testing.T) {
d := testDB(t)
for _, n := range []string{"gone", "fresh", "resent"} {
if _, err := d.InviteAccount(n, n+"@example.org", false); err != nil {
t.Fatal(err)
}
}
past := time.Now().Add(-30 * 24 * time.Hour).UTC().Format(time.RFC3339)
for _, n := range []string{"gone", "resent"} {
if _, err := d.w.Exec(`UPDATE invite SET expires = ? WHERE account = ?`, past, n); err != nil {
t.Fatal(err)
}
}
// A re-send mints a new link with a fresh expiry.
if _, err := d.InviteAccount("resent", "[email protected]", false); err != nil {
t.Fatal(err)
}
got, err := d.LapsedInvites(time.Now())
if err != nil {
t.Fatal(err)
}
if len(got) != 1 || got[0] != "gone" {
t.Fatalf("FAIL: lapsed %v, want [gone]", got)
}
if got, _ := d.LapsedInvites(time.Now().Add(-60 * 24 * time.Hour)); len(got) != 0 {
t.Errorf("FAIL: an invite lapsed 30 days ago was listed as lapsed 60 days ago: %v", got)
}
if err := d.WithdrawInvite("gone"); err != nil {
t.Fatal(err)
}
if _, err := d.InviteAccount("gone", "[email protected]", false); err != nil {
t.Errorf("FAIL: the freed name could not be invited again: %v", err)
}
}