import './index';

describe('Worker', () => {
    describe('Component vnWorkerCreate', () => {
        let $scope;
        let $state;
        let controller;

        beforeEach(ngModule('worker'));

        beforeEach(inject(($componentController, $rootScope, _$state_) => {
            $scope = $rootScope.$new();
            $state = _$state_;
            $scope.watcher = {
                submit: () => {
                    return {
                        then: callback => {
                            callback({data: {id: '1234'}});
                        }
                    };
                }
            };
            const $element = angular.element('<vn-worker-create></vn-worker-create>');
            controller = $componentController('vnWorkerCreate', {$element, $scope});
            controller.worker = {};
            controller.vnConfig = {user: {companyFk: 1}};
        }));

        describe('onSubmit()', () => {
            it(`should call submit() on the watcher then expect a callback`, () => {
                jest.spyOn($state, 'go');
                controller.onSubmit();

                expect(controller.$state.go).toHaveBeenCalledWith('worker.card.basicData', {id: '1234'});
            });
        });

        describe('province() setter', () => {
            it(`should set countryFk property`, () => {
                controller.worker.countryFk = null;
                controller.province = {
                    id: 1,
                    name: 'New york',
                    country: {
                        id: 2,
                        name: 'USA'
                    }
                };

                expect(controller.worker.countryFk).toEqual(2);
            });
        });

        describe('town() setter', () => {
            it(`should set provinceFk property`, () => {
                controller.town = {
                    provinceFk: 1,
                    code: 46001,
                    province: {
                        id: 1,
                        name: 'New york',
                        country: {
                            id: 2,
                            name: 'USA'
                        }
                    },
                    postcodes: []
                };

                expect(controller.worker.provinceFk).toEqual(1);
            });

            it(`should set provinceFk property and fill the postalCode if there's just one`, () => {
                controller.town = {
                    provinceFk: 1,
                    code: 46001,
                    province: {
                        id: 1,
                        name: 'New york',
                        country: {
                            id: 2,
                            name: 'USA'
                        }
                    },
                    postcodes: [{code: '46001'}]
                };

                expect(controller.worker.provinceFk).toEqual(1);
                expect(controller.worker.postcode).toEqual('46001');
            });
        });

        describe('postcode() setter', () => {
            it(`should set the town, provinceFk and contryFk properties`, () => {
                controller.postcode = {
                    townFk: 1,
                    code: 46001,
                    town: {
                        id: 1,
                        name: 'New York',
                        province: {
                            id: 1,
                            name: 'New york',
                            country: {
                                id: 2,
                                name: 'USA'
                            }
                        }
                    }
                };

                expect(controller.worker.city).toEqual('New York');
                expect(controller.worker.provinceFk).toEqual(1);
                expect(controller.worker.countryFk).toEqual(2);
            });
        });

        describe('generateCodeUser()', () => {
            it(`should generate worker code, name and company `, () => {
                controller.worker = {
                    firstName: 'default',
                    lastNames: 'generate worker'
                };

                controller.generateCodeUser();

                expect(controller.worker.code).toEqual('DGW');
                expect(controller.worker.name).toEqual('defaultgw');
                expect(controller.worker.companyFk).toEqual(controller.vnConfig.user.companyFk);
            });
        });
    });
});