import './index.js';

describe('Item', () => {
    describe('Component vnItemTax', () => {
        let $element;
        let $stateParams;
        let controller;
        let $httpBackend;

        beforeEach(ngModule('item'));

        beforeEach(inject((_$httpBackend_, $rootScope, _$stateParams_, $compile) => {
            $stateParams = _$stateParams_;
            $stateParams.id = 1;
            $httpBackend = _$httpBackend_;

            $httpBackend.whenRoute('GET', 'TaxClasses')
                .respond([
                    {id: 1, description: 'Reduced VAT', code: 'R'},
                    {id: 2, description: 'General VAT', code: 'G'}
                ]);

            $httpBackend.whenRoute('GET', 'Items/:id/taxes')
                .respond([
                    {id: 1, taxClassFk: 1}
                ]);

            $element = $compile(`<vn-item-tax></vn-item-tax`)($rootScope);
            controller = $element.controller('vnItemTax');
        }));

        afterEach(() => {
            $element.remove();
        });

        describe('getTaxes()', () => {
            it('should perform a query to set the array of taxes into the controller', () => {
                $httpBackend.flush();

                expect(controller.taxes[0].id).toEqual(1);
                expect(controller.taxes[0].taxClassFk).toEqual(1);
            });
        });

        describe('submit()', () => {
            it('should perform a post to update taxes', () => {
                jest.spyOn(controller.$.watcher, 'notifySaved');
                jest.spyOn(controller.$.watcher, 'updateOriginalData');

                controller.$onInit();
                $httpBackend.flush();

                controller.taxes.push({id: 3, description: 'General VAT', code: 'G'});

                $httpBackend.whenPOST(`Items/updateTaxes`).respond(true);
                controller.submit();
                $httpBackend.flush();

                expect(controller.$.watcher.notifySaved).toHaveBeenCalledWith();
                expect(controller.$.watcher.updateOriginalData).toHaveBeenCalledWith();
            });
        });
    });
});