package persistencewiring

import (
	"testing"

	"github.com/DATA-DOG/go-sqlmock"
	database "github.com/nexuscrm/db"
	"github.com/nexuscrm/persistence"
)

func TestPermissionStateDirectWritersReuseExactTransactionOwner(t *testing.T) {
	sqlDB, _, err := sqlmock.New()
	if err != nil {
		t.Fatal(err)
	}
	defer sqlDB.Close()

	transactions := persistence.NewTransactionManager(database.NewConnectionFromDB(sqlDB))
	wiring, err := NewPermissionStateDirectWritersForTransactionManager(transactions)
	if err != nil {
		t.Fatal(err)
	}
	if wiring.Transactions != transactions {
		t.Fatal("direct writers constructed a second transaction owner")
	}

	if err := wiring.BindSchema(persistence.NewSchemaRepository(sqlDB, nil)); err != nil {
		t.Fatal(err)
	}
	if err := wiring.BindMetadata(persistence.NewMetadataRepository(sqlDB)); err != nil {
		t.Fatal(err)
	}
	if err := wiring.BindPermission(persistence.NewPermissionRepository(sqlDB)); err != nil {
		t.Fatal(err)
	}
	if err := wiring.BindUser(persistence.NewUserRepository(sqlDB)); err != nil {
		t.Fatal(err)
	}
}

func TestPermissionStateDirectWritersRejectMissingOwner(t *testing.T) {
	if _, err := NewPermissionStateDirectWritersForTransactionManager(nil); err == nil {
		t.Fatal("missing transaction owner was accepted")
	}
}
