package persistence

import (
	"context"
	"testing"

	"github.com/DATA-DOG/go-sqlmock"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestMetadataRepository_GetSharingRules_LoadsOwnerBasedRule(t *testing.T) {
	db, mock, err := sqlmock.New()
	require.NoError(t, err)
	defer db.Close()

	repo := NewMetadataRepository(db)
	rows := sqlmock.NewRows([]string{
		"Id",
		"ObjectApiName",
		"Name",
		"Criteria",
		"AccessLevel",
		"SharedFromRoleId",
		"SharedFromGroupId",
		"ShareWithRoleId",
		"ShareWithGroupId",
	}).AddRow(
		"sr_1",
		"Account",
		"Owners to Marketing",
		nil,
		"Edit",
		"role_source",
		nil,
		nil,
		"group_target",
	)

	mock.ExpectQuery("SELECT .*FROM .*SharingRule.*LOWER\\(`ObjectApiName`\\) = LOWER\\(\\?\\).*IsDeleted").
		WithArgs("Account", false).
		WillReturnRows(rows)

	rules, err := repo.GetSharingRules(context.Background(), "Account")
	require.NoError(t, err)
	require.Len(t, rules, 1)

	assert.Equal(t, "sr_1", rules[0].ID)
	assert.Equal(t, "", rules[0].Criteria)
	require.NotNil(t, rules[0].SharedFromRoleID)
	assert.Equal(t, "role_source", *rules[0].SharedFromRoleID)
	require.NotNil(t, rules[0].ShareWithGroupID)
	assert.Equal(t, "group_target", *rules[0].ShareWithGroupID)

	require.NoError(t, mock.ExpectationsWereMet())
}
