package revocation

import (
	"encoding/hex"
	"github.com/DATA-DOG/go-sqlmock"
	"reflect"
	"testing"
	"time"
)

func TestSQLDatabase(t *testing.T) {
	db, err := sqlmock.New()
	if err != nil {
		t.Fatalf("failed to create new mock database stub: %v", err)
	}
	columns := []string{"ThirdPartyCaveatID", "RevocationCaveatID", "RevocationTime"}
	sqlmock.ExpectExec("CREATE TABLE IF NOT EXISTS tableName (.+)").
		WillReturnResult(sqlmock.NewResult(0, 1))
	d, err := newSQLDatabase(db, "tableName")
	if err != nil {
		t.Fatalf("failed to create SQLDatabase: %v", err)
	}

	tpCavID, revCavID := "tpCavID", []byte("revCavID")
	tpCavID2, revCavID2 := "tpCavID2", []byte("revCavID2")
	encRevCavID := hex.EncodeToString(revCavID)
	encRevCavID2 := hex.EncodeToString(revCavID2)
	sqlmock.ExpectExec("INSERT INTO tableName (.+) VALUES (.+)").
		WithArgs(tpCavID, encRevCavID).
		WillReturnResult(sqlmock.NewResult(0, 1)) // no insert id, 1 affected row
	if err := d.InsertCaveat(tpCavID, revCavID); err != nil {
		t.Errorf("failed to InsertCaveat into SQLDatabase: %v", err)
	}

	sqlmock.ExpectExec("INSERT INTO tableName (.+) VALUES (.+)").
		WithArgs(tpCavID2, encRevCavID2).
		WillReturnResult(sqlmock.NewResult(0, 1)) // no insert id, 1 affected row
	if err := d.InsertCaveat(tpCavID2, revCavID2); err != nil {
		t.Errorf("second InsertCaveat into SQLDatabase failed: %v", err)
	}

	// Test Revocation
	sqlmock.ExpectExec("UPDATE tableName SET RevocationTime=.+").
		WillReturnResult(sqlmock.NewResult(0, 1))
	if err := d.Revoke(tpCavID); err != nil {
		t.Errorf("failed to Revoke Caveat: %v", err)
	}

	// Test IsRevoked returns true.
	sqlmock.ExpectQuery("SELECT 1 FROM tableName").
		WithArgs(encRevCavID).
		WillReturnRows(sqlmock.NewRows(columns).AddRow(1, 1, 1))
	if revoked, err := d.IsRevoked(revCavID); err != nil || !revoked {
		t.Errorf("expected revCavID to be revoked: err: (%v)", err)
	}

	// Test IsRevoked returns false.
	sqlmock.ExpectQuery("SELECT 1 FROM tableName").
		WithArgs(encRevCavID2).
		WillReturnRows(sqlmock.NewRows(columns))
	if revoked, err := d.IsRevoked(revCavID2); err != nil || revoked {
		t.Errorf("expected revCavID to not be revoked: err: (%v)", err)
	}

	// Test RevocationTime.
	revocationTime := time.Now()
	sqlmock.ExpectQuery("SELECT RevocationTime FROM tableName").
		WithArgs(tpCavID).
		WillReturnRows(sqlmock.NewRows([]string{"RevocationTime"}).AddRow(revocationTime))
	if got, err := d.RevocationTime(tpCavID); err != nil || !reflect.DeepEqual(*got, revocationTime) {
		t.Errorf("got %v, expected %v: err : %v", got, revocationTime, err)
	}
}
