const should = require('should');
const sinon = require('sinon');
const {events} = require('../../../../core/server/lib/common');
const Urls = require('../../../../core/frontend/services/url/Urls');

describe('Unit: services/url/Urls', function () {
    let urls;
    let eventsToRemember;

    beforeEach(function () {
        urls = new Urls();

        urls.add({
            url: '/test/',
            resource: {
                data: {
                    id: 'object-id-1'
                }
            },
            generatorId: 2
        });

        urls.add({
            url: '/something/',
            resource: {
                data: {
                    id: 'object-id-2'
                }
            },
            generatorId: 1
        });

        urls.add({
            url: '/casper/',
            resource: {
                data: {
                    id: 'object-id-3'
                }
            },
            generatorId: 2
        });

        eventsToRemember = {};
        sinon.stub(events, 'emit').callsFake(function (eventName, data) {
            eventsToRemember[eventName] = data;
        });
    });

    afterEach(function () {
        sinon.restore();
    });

    it('fn: add', function () {
        urls.add({
            url: '/test/',
            resource: {
                data: {
                    id: 'object-id-x',
                    slug: 'a'
                }
            },
            generatorId: 1
        });

        should.exist(eventsToRemember['url.added']);
        eventsToRemember['url.added'].url.absolute.should.eql('http://127.0.0.1:2369/test/');
        eventsToRemember['url.added'].url.relative.should.eql('/test/');
        should.exist(eventsToRemember['url.added'].resource);
        should.exist(eventsToRemember['url.added'].resource.data);

        urls.getByResourceId('object-id-x').resource.data.slug.should.eql('a');

        // add duplicate
        urls.add({
            url: '/test/',
            resource: {
                data: {
                    id: 'object-id-x',
                    slug: 'b'
                }
            },
            generatorId: 1
        });

        should.exist(eventsToRemember['url.added']);

        urls.getByResourceId('object-id-x').resource.data.slug.should.eql('b');
    });

    it('fn: getByResourceId', function () {
        urls.getByResourceId('object-id-2').url.should.eql('/something/');
        should.exist(urls.getByResourceId('object-id-2').generatorId);
        urls.getByResourceId('object-id-2').generatorId.should.eql(1);
    });

    it('fn: getByGeneratorId', function () {
        urls.getByGeneratorId(2).length.should.eql(2);
    });

    it('fn: getByUrl', function () {
        urls.getByUrl('/something/').length.should.eql(1);
    });

    it('fn: removeResourceId', function () {
        urls.removeResourceId('object-id-2');
        should.not.exist(urls.getByResourceId('object-id-2'));

        urls.removeResourceId('does not exist');
    });
});
