package sql

import (
	"testing"
	"time"

	"github.com/coreos/dex/storage"
)

func TestGC(t *testing.T) {
	// TODO(ericchiang): Add a GarbageCollect method to the storage interface so
	// we can write conformance tests instead of directly testing each implementation.
	s := &SQLite3{":memory:"}
	conn, err := s.open()
	if err != nil {
		t.Fatal(err)
	}
	defer conn.Close()

	clock := time.Now()
	now := func() time.Time { return clock }

	runGC := (gc{now, conn}).run

	a := storage.AuthRequest{
		ID:     storage.NewID(),
		Expiry: now().Add(time.Second),
	}

	if err := conn.CreateAuthRequest(a); err != nil {
		t.Fatal(err)
	}

	if err := runGC(); err != nil {
		t.Errorf("gc failed: %v", err)
	}

	if _, err := conn.GetAuthRequest(a.ID); err != nil {
		t.Errorf("failed to get auth request after gc: %v", err)
	}

	clock = clock.Add(time.Minute)

	if err := runGC(); err != nil {
		t.Errorf("gc failed: %v", err)
	}

	if _, err := conn.GetAuthRequest(a.ID); err == nil {
		t.Errorf("expected error after gc'ing auth request: %v", err)
	} else if err != storage.ErrNotFound {
		t.Errorf("expected error storage.NotFound got: %v", err)
	}
}