package permissions

import (
	"context"
	"database/sql"
	"testing"
)

func TestNewSQLAssignmentPolicyDirectWriteAuthorityRequiresTransactionManager(t *testing.T) {
	if _, err := NewSQLAssignmentPolicyDirectWriteAuthority(nil); err == nil {
		t.Fatal("nil transaction manager was accepted")
	}
}

type assignmentPolicyAuthorityTxManager struct{ tx *sql.Tx }

type assignmentPolicyForeignAuthorityTxManager struct {
	assignmentPolicyAuthorityTxManager
}

func (assignmentPolicyForeignAuthorityTxManager) OwnsPessimisticTx(context.Context) bool {
	return false
}

func (assignmentPolicyAuthorityTxManager) WithTransaction(ctx context.Context, fn func(context.Context) error) error {
	return fn(ctx)
}

func (assignmentPolicyAuthorityTxManager) WithPessimisticTransaction(ctx context.Context, fn func(context.Context) error) error {
	return fn(ctx)
}

func (assignmentPolicyAuthorityTxManager) WithRetry(ctx context.Context, fn func(context.Context) error, _ int) error {
	return fn(ctx)
}

func (assignmentPolicyAuthorityTxManager) WithPessimisticRetry(ctx context.Context, fn func(context.Context) error, _ int) error {
	return fn(ctx)
}

func (assignmentPolicyAuthorityTxManager) IsTransactionActive(context.Context) bool { return true }
func (assignmentPolicyAuthorityTxManager) IsPessimisticTx(context.Context) bool     { return true }
func (assignmentPolicyAuthorityTxManager) OwnsPessimisticTx(context.Context) bool   { return true }
func (manager assignmentPolicyAuthorityTxManager) ExtractTx(context.Context) interface{} {
	return manager.tx
}
func (assignmentPolicyAuthorityTxManager) DetachTx(ctx context.Context) context.Context {
	return ctx
}
