/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

/* eslint-disable max-nested-callbacks */
define([
    'underscore',
    'Magento_Ui/js/grid/sticky/sticky'
], function (_, Sticky) {
    'use strict';

    describe('ui/js/grid/sticky/sticky', function () {
        var stickyObj,
            data;

        /** Stub */
        Sticky.prototype.initialize = function () {};

        stickyObj = new Sticky({});

        describe('has initialized', function () {
            it('has been defined', function () {
                expect(stickyObj).toBeDefined();
            });
            it('has initialized observable', function () {
                data = stickyObj.initObservable();
                expect(data).toBeDefined();
            });
            it('has initListingNode method', function () {
                spyOn(stickyObj, 'initListingNode');
                stickyObj.initListingNode();
                expect(stickyObj.initListingNode).toHaveBeenCalled();
            });
            it('has initStickyToolbarNode method', function () {
                stickyObj.initStickyToolbarNode({});
                expect(stickyObj.stickyToolbarNode).toBeDefined();
            });
            it('has initContainerNode method', function () {
                spyOn(stickyObj, 'initContainerNode');
                stickyObj.initContainerNode();
                expect(stickyObj.initContainerNode).toHaveBeenCalled();
            });
            it('has initListeners method', function () {
                spyOn(stickyObj, 'initListeners');
                stickyObj.initListeners();
                expect(stickyObj.initListeners).toHaveBeenCalled();
            });
            it('has initOnScroll method', function () {
                spyOn(document, 'addEventListener').and.callFake(function () {});
                stickyObj.initOnScroll();
                expect(stickyObj.lastHorizontalScrollPos).toBeDefined();
            });
            it('has initOnListingScroll method', function () {
                spyOn(stickyObj, 'initOnListingScroll');
                stickyObj.initOnListingScroll();
                expect(stickyObj.initOnListingScroll).toHaveBeenCalled();
            });
            it('has initOnResize method', function () {
                spyOn(stickyObj, 'initOnResize');
                stickyObj.initOnResize();
                expect(stickyObj.initOnResize).toHaveBeenCalled();
            });
        });
        describe('has handlers', function () {
            it('has onWindowScroll event', function () {
                /** Stub */
                stickyObj.adjustOffset = function () {
                    return this;
                };

                stickyObj.lastHorizontalScrollPos = 100500;
                spyOn(stickyObj, 'adjustDataGridCapPositions');
                stickyObj.onWindowScroll();
                expect(stickyObj.adjustDataGridCapPositions).toHaveBeenCalled();
            });
            it('has onListingScroll method', function () {
                spyOn(stickyObj, 'adjustOffset');
                stickyObj.onListingScroll();
                expect(stickyObj.adjustOffset).toHaveBeenCalled();
            });
            it('has onResize method', function () {
                spyOn(stickyObj, 'onResize');
                stickyObj.onResize();
                expect(stickyObj.onResize).toHaveBeenCalled();
            });
        });
        describe('has getters', function () {
            it('has getListingWidth', function () {
                stickyObj.listingNode = {
                    /** Stub */
                    width: function () {
                        return 100500;
                    }
                };
                data = stickyObj.getListingWidth();
                expect(data).toBeDefined();
            });
            it('has getTableWidth method', function () {
                spyOn(stickyObj, 'getTableWidth');
                stickyObj.getTableWidth();
                expect(stickyObj.getTableWidth).toHaveBeenCalled();
            });
            it('has getTopElement', function () {
                stickyObj.toolbarNode = {};
                data = stickyObj.getTopElement();
                expect(data).toBeDefined();
            });
            it('has getOtherStickyElementsSize', function () {
                stickyObj.otherStickyElsSize = null;
                data = stickyObj.getOtherStickyElementsSize();
                expect(data).toEqual(stickyObj.otherStickyElsSize);
            });
            it('has getListingTopYCoord method', function () {
                spyOn(stickyObj, 'getListingTopYCoord');
                stickyObj.getListingTopYCoord();
                expect(stickyObj.getListingTopYCoord).toHaveBeenCalled();
            });
            it('has getMustBeSticky method', function () {
                spyOn(stickyObj, 'getMustBeSticky');
                stickyObj.getMustBeSticky();
                expect(stickyObj.getMustBeSticky).toHaveBeenCalled();
            });
        });
        describe('has dom manipulators', function () {
            it('has resizeContainer event', function () {
                spyOn(stickyObj, 'resizeContainer');
                stickyObj.resizeContainer();
                expect(stickyObj.resizeContainer).toHaveBeenCalled();
            });
            it('has resizeCols event', function () {
                spyOn(stickyObj, 'resizeCols');
                stickyObj.resizeCols();
                expect(stickyObj.resizeCols).toHaveBeenCalled();
            });
            it('has resetToTop event', function () {
                spyOn(stickyObj, 'resetToTop');
                stickyObj.resetToTop();
                expect(stickyObj.resetToTop).toHaveBeenCalled();
            });
            it('has "toggleContainerVisibility" method', function () {
                stickyObj.visible = false;
                stickyObj.toggleContainerVisibility();
                expect(stickyObj.visible).toEqual(true);
                stickyObj.visible = true;
                stickyObj.toggleContainerVisibility();
                expect(stickyObj.visible).toEqual(false);
            });
            it('has adjustContainerElemsWidth event', function () {
                /** Stub */
                stickyObj.resizeContainer = function () {
                    return this;
                };

                /** Stub */
                stickyObj.resizeCols = function () {
                    return this;
                };
                spyOn(stickyObj, 'resizeBulk');
                stickyObj.adjustContainerElemsWidth();
                expect(stickyObj.resizeBulk).toHaveBeenCalled();
            });
            it('has adjustOffset event', function () {
                spyOn(stickyObj, 'adjustOffset');
                stickyObj.adjustOffset();
                expect(stickyObj.adjustOffset).toHaveBeenCalled();
            });
        });
    });
});
