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

describe('InvoiceIn', () => {
    describe('Component tax', () => {
        let controller;
        let $scope;
        let vnApp;
        let $httpBackend;

        beforeEach(ngModule('invoiceIn'));

        beforeEach(inject(($componentController, $rootScope, _vnApp_, _$httpBackend_) => {
            $httpBackend = _$httpBackend_;
            vnApp = _vnApp_;
            jest.spyOn(vnApp, 'showError');
            $scope = $rootScope.$new();
            $scope.model = crudModel;
            $scope.watcher = watcher;

            const $element = angular.element('<vn-invoice-in-tax></vn-invoice-in-tax>');
            controller = $componentController('vnInvoiceInTax', {$element, $scope});
            controller.$.model = crudModel;
            controller.invoiceIn = {id: 1};
        }));

        describe('taxRate()', () => {
            it('should set tax rate with the Sage tax type value', () => {
                const taxRateSelection = {
                    rate: 21
                };
                const invoiceInTax = {
                    taxableBase: 200
                };

                const taxRate = controller.taxRate(invoiceInTax, taxRateSelection);

                expect(taxRate).toEqual(42);
            });
        });

        describe('onSubmit()', () => {
            it('should make HTTP POST request to save tax values', () => {
                controller.card = {reload: () => {}};
                jest.spyOn($scope.watcher, 'check');
                jest.spyOn($scope.watcher, 'notifySaved');
                jest.spyOn($scope.watcher, 'updateOriginalData');
                jest.spyOn(controller.card, 'reload');
                jest.spyOn($scope.model, 'save');

                controller.onSubmit();

                expect($scope.model.save).toHaveBeenCalledWith();
                expect($scope.watcher.updateOriginalData).toHaveBeenCalledWith();
                expect($scope.watcher.check).toHaveBeenCalledWith();
                expect($scope.watcher.notifySaved).toHaveBeenCalledWith();
                expect(controller.card.reload).toHaveBeenCalledWith();
            });
        });

        describe('onResponse()', () => {
            it('should return success message', () => {
                controller.expense = {
                    code: 7050000005,
                    isWithheld: 0,
                    description: 'Test'
                };

                const data = [{
                    id: controller.expense.code,
                    isWithheld: controller.expense.isWithheld,
                    name: controller.expense.description
                }];

                jest.spyOn(controller.vnApp, 'showSuccess');
                $httpBackend.expect('POST', `Expenses`, data).respond();

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

                expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Expense saved!');
            });

            it('should return an error if code is empty', () => {
                controller.expense = {
                    code: null,
                    isWithheld: 0,
                    description: 'Test'
                };

                jest.spyOn(controller.vnApp, 'showError');
                controller.onResponse();

                expect(controller.vnApp.showError).toHaveBeenCalledWith(`The code can't be empty`);
            });

            it('should return an error if description is empty', () => {
                controller.expense = {
                    code: 7050000005,
                    isWithheld: 0,
                    description: null
                };

                jest.spyOn(controller.vnApp, 'showError');
                controller.onResponse();

                expect(controller.vnApp.showError).toHaveBeenCalledWith(`The description can't be empty`);
            });
        });
    });
});