import './index.js';

describe('Item', () => {
    describe('Component vnItemRequest', () => {
        let $scope;
        let controller;
        let $httpBackend;

        beforeEach(ngModule('item'));

        beforeEach(inject(($componentController, $rootScope, _$httpBackend_) => {
            $httpBackend = _$httpBackend_;
            $scope = $rootScope.$new();
            controller = $componentController('vnItemRequest', {$element: null, $scope});
        }));

        afterAll(() => {
            $scope.$destroy();
            $element.remove();
        });

        describe('getState()', () => {
            it(`should return an string depending to the isOK value`, () => {
                let isOk = null;
                let result = controller.getState(isOk);

                expect(result).toEqual('Pending');

                isOk = 1;
                result = controller.getState(isOk);

                expect(result).toEqual('Accepted');

                isOk = 0;
                result = controller.getState(isOk);

                expect(result).toEqual('Denied');
            });
        });

        describe('confirmRequest()', () => {
            it(`should do nothing if the request does't have itemFk or saleQuantity`, () => {
                let request = {};
                jest.spyOn(controller.vnApp, 'showSuccess');

                controller.confirmRequest(request);

                expect(controller.vnApp.showSuccess).not.toHaveBeenCalled();
            });

            it('should perform a query and call vnApp.showSuccess() and refresh if the conditions are met', () => {
                jest.spyOn(controller.vnApp, 'showSuccess');

                const expectedResult = {concept: 'Melee Weapon'};
                let request = {itemFk: 1, saleQuantity: 1, id: 1};

                $httpBackend.expectPOST(`TicketRequests/${request.id}/confirm`).respond(expectedResult);
                controller.confirmRequest(request);
                $httpBackend.flush();

                expect(controller.vnApp.showSuccess).toHaveBeenCalled();
            });
        });

        describe('changeQuantity()', () => {
            it(`should call confirmRequest() if there's no sale id in the request`, () => {
                let request = {};
                jest.spyOn(controller, 'confirmRequest');

                controller.changeQuantity(request);

                expect(controller.confirmRequest).toHaveBeenCalledWith(jasmine.any(Object));
            });

            it(`should perform a query and call vnApp.showSuccess() if the conditions are met`, () => {
                let request = {saleFk: 1, saleQuantity: 1};
                jest.spyOn(controller.vnApp, 'showSuccess');

                $httpBackend.expectPATCH(`Sales/${request.saleFk}`).respond();
                controller.changeQuantity(request);
                $httpBackend.flush();

                expect(controller.vnApp.showSuccess).toHaveBeenCalled();
            });
        });

        describe('compareDate()', () => {
            it(`should return "success" if receives a future date`, () => {
                let date = '3019-02-18T11:00:00.000Z';
                let result = controller.compareDate(date);

                expect(result).toEqual('success');
            });

            it(`should return "warning" if date is today`, () => {
                let date = Date.vnNew();
                let result = controller.compareDate(date);

                expect(result).toEqual('warning');
            });
        });

        describe('onDenyAccept()', () => {
            it(`should deny the request`, () => {
                const request = {
                    id: 1,
                    response: 'new'
                };

                $httpBackend.expectPOST(`TicketRequests/${request.id}/deny`)
                    .respond({response: 'denied'});
                controller.onDenyAccept(request);
                $httpBackend.flush();

                expect(request.response).toBe('denied');
            });
        });
    });
});