Skip to content
quarry Artifact [0fbf42042b]
Login

Artifact [0fbf42042b]

Artifact 0fbf42042b0b393a9501270a68004aa5fb92c9b06ab09ce320114e70f258a3be:


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)
	}
}