'use strict';
var common = require('../common');

describe('UiHelper', function () {
    // TODO: As per https://github.com/tmpvar/jsdom/issues/1565 there is no navigation support in jsdom, yet.
    // for now we use a mock function to trigger the event
    describe('historyChange', function () {
        this.timeout(30000);
        beforeEach(function () {
            $.PrivateBin.Helper.reset();
            cleanup();
        });

        jsc.property(
            'redirects to home, when the state is null',
            common.jscUrl(false, false),
            function (url) {
                const expected = common.urlToString(url),
                    clean = jsdom('', {url: expected});

                // make window.location.href writable
                Object.defineProperty(window.location, 'href', {
                    writable: true,
                    value: window.location.href
                });
                $.PrivateBin.UiHelper.mockHistoryChange();
                $.PrivateBin.Helper.reset();
                var result = window.location.href;
                clean();
                return expected === result;
            }
        );

        jsc.property(
            'does not redirect to home, when a new paste is created',
            common.jscUrl(false),
            jsc.nearray(common.jscBase64String()),
            function (url, fragment) {
                url.fragment = fragment.join('');
                const expected = common.urlToString(url),
                    clean = jsdom('', {url: expected});

                // make window.location.href writable
                Object.defineProperty(window.location, 'href', {
                    writable: true,
                    value: window.location.href
                });
                $.PrivateBin.UiHelper.mockHistoryChange([
                    {type: 'newpaste'}, '', expected
                ]);
                $.PrivateBin.Helper.reset();
                var result = window.location.href;
                clean();
                return expected === result;
            }
        );
    });

    describe('reloadHome', function () {
        this.timeout(30000);
        before(function () {
            $.PrivateBin.Helper.reset();
        });

        jsc.property(
            'redirects to home',
            common.jscUrl(),
            function (url) {
                const clean = jsdom('', {url: common.urlToString(url)});
                delete(url.query);
                delete(url.fragment);
                const expected = common.urlToString(url);

                // make window.location.href writable
                Object.defineProperty(window.location, 'href', {
                    writable: true,
                    value: window.location.href
                });
                $.PrivateBin.UiHelper.reloadHome();
                $.PrivateBin.Helper.reset();
                var result = window.location.href;
                clean();
                return expected === result;
            }
        );
    });

    describe('isVisible', function () {
        // TODO As per https://github.com/tmpvar/jsdom/issues/1048 there is no layout support in jsdom, yet.
        // once it is supported or a workaround is found, uncomment the section below
        /*
        before(function () {
            $.PrivateBin.Helper.reset();
        });

        jsc.property(
            'detect visible elements',
            jsc.nearray(common.jscAlnumString()),
            jsc.nearray(common.jscA2zString()),
            function (id, element) {
                id = id.join('');
                element = element.join('');
                var clean = jsdom(
                    '<' + element + ' id="' + id + '"></' + element + '>'
                );
                var result = $.PrivateBin.UiHelper.isVisible($('#' + id));
                clean();
                return result;
            }
        );
        */
    });

    describe('scrollTo', function () {
        // TODO Did not find a way to test that, see isVisible test above
    });
});