import './index.js';
import watcher from 'core/mocks/watcher';
import crudModel from 'core/mocks/crud-model';

describe('Supplier Component vnSupplierAccount', () => {
    let $scope;
    let controller;
    let $httpBackend;

    beforeEach(ngModule('supplier'));

    beforeEach(inject(($componentController, $rootScope, _$httpBackend_) => {
        $httpBackend = _$httpBackend_;
        $scope = $rootScope.$new();
        $scope.model = crudModel;
        $scope.watcher = watcher;

        $scope.bankEntity = {
            open: () => {}
        };

        const $element = angular.element('<vn-supplier-account></vn-supplier-account>');
        controller = $componentController('vnSupplierAccount', {$element, $scope});
        controller.supplierAccount = {
            supplierFk: 442,
            name: 'Verdnatura'
        };
    }));

    describe('onAccept()', () => {
        it('should set the created bank entity id into the target account', () => {
            controller.supplierAccounts = [{}, {}, {}];

            const data = {
                id: 999,
                index: 1
            };

            controller.onAccept(data);

            const targetAccount = controller.supplierAccounts[data.index];

            expect(targetAccount.bankEntityFk).toEqual(data.id);
        });
    });

    describe('onSubmit()', () => {
        it(`should reload the card`, done => {
            controller.card = {reload: () => {}};
            controller.$.payMethodToTransfer = {show: () => {}};
            jest.spyOn(controller.$.payMethodToTransfer, 'show');
            jest.spyOn(controller.$.model, 'save').mockReturnValue(new Promise(resolve => {
                return resolve({
                    id: 1234
                });
            }));
            jest.spyOn(controller.card, 'reload').mockReturnValue(new Promise(resolve => {
                return resolve({
                    id: 1234
                });
            }));

            controller.wireTransferFk = 'a';
            controller.supplier = {payMethodFk: 'b'};
            controller.onSubmit().then(() => {
                expect(controller.card.reload).toHaveBeenCalledWith();
                expect(controller.$.payMethodToTransfer.show).toHaveBeenCalled();
                done();
            }).catch(done.fail);
        });
    });

    describe('setWireTransfer()', () => {
        it(`should make HTTP PATCH request to set wire transfer and call notifySaved`, () => {
            const supplierId = 1;
            const params = {
                id: supplierId,
                payMethodFk: 2
            };
            const response = {
                data: {id: 2}
            };
            const uri = 'payMethods/findOne?filter=%7B%22where%22:%7B%22code%22:%22wireTransfer%22%7D%7D';
            jest.spyOn($scope.watcher, 'notifySaved');

            controller.$params.id = supplierId;
            controller.wireTransferFk = 2;
            controller.supplier = {payMethodFk: 1};
            $httpBackend.expectGET(uri).respond(response);
            $httpBackend.expectPATCH(`Suppliers/${supplierId}`, params).respond();
            controller.setWireTransfer();
            $httpBackend.flush();

            expect($scope.watcher.notifySaved).toHaveBeenCalledWith();
        });
    });
});