import assert from 'assert/strict';
import {BookshelfClickEventRepository, ClickEvent} from '../src';
import sinon from 'sinon';

describe('BookshelfClickEventRepository', function () {
    afterEach(function () {
        sinon.restore();
    });

    it('toPrimitive', async function () {
        const repository = new BookshelfClickEventRepository({} as any, {
            sentry: undefined
        });
        assert.deepEqual(
            repository.toPrimitive(ClickEvent.create({
                id: 'id',
                recommendationId: 'recommendationId',
                memberId: 'memberId',
                createdAt: new Date('2021-01-01')
            })),
            {
                id: 'id',
                recommendation_id: 'recommendationId',
                member_id: 'memberId',
                created_at: new Date('2021-01-01')
            }
        );
    });

    it('modelToEntity', async function () {
        const repository = new BookshelfClickEventRepository({} as any, {
            sentry: undefined
        });
        const entity = repository.modelToEntity({
            id: 'id',
            get: (key: string) => {
                return {
                    recommendation_id: 'recommendationId',
                    member_id: 'memberId',
                    created_at: new Date('2021-01-01')
                }[key];
            }
        } as any);

        assert.deepEqual(
            entity,
            ClickEvent.create({
                id: 'id',
                recommendationId: 'recommendationId',
                memberId: 'memberId',
                createdAt: new Date('2021-01-01')
            })
        );
    });

    it('modelToEntity returns null on errors', async function () {
        const captureException = sinon.stub();
        const repository = new BookshelfClickEventRepository({} as any, {
            sentry: {
                captureException
            }
        });

        sinon.stub(ClickEvent, 'create').throws(new Error('test'));
        const entity = repository.modelToEntity({
            id: 'id',
            get: (key: string) => {
                return {
                    recommendation_id: 'recommendationId',
                    member_id: 'memberId',
                    created_at: new Date('2021-01-01')
                }[key];
            }
        } as any);

        assert.deepEqual(
            entity,
            null
        );
        sinon.assert.calledOnce(captureException);
    });

    it('getFieldToColumnMap returns', async function () {
        const captureException = sinon.stub();
        const repository = new BookshelfClickEventRepository({} as any, {
            sentry: {
                captureException
            }
        });

        assert.ok(repository.getFieldToColumnMap());
    });
});
