import React from 'react'; import {mount} from 'enzyme'; import {noop} from 'lodash'; import {VocabularyItemsViewEdit} from '../components/VocabularyItemsViewEdit'; import {s} from 'core/helpers/testUtils'; const getPromise = () => Promise.resolve({}); describe('vocabularies', () => { beforeEach(window.module('superdesk.apps.vocabularies')); beforeEach(window.module('superdesk.templates-cache')); beforeEach(window.module(($provide) => { $provide.service('metadata', () => ({ initialize: getPromise, })); $provide.service('relationsService', () => ({})); $provide.service('sortByNameFilter', () => ({})); $provide.service('$filter', () => () => (a) => a); })); it('can fetch vocabularies', inject((api, vocabularies, $q, $rootScope) => { var fixture = {foo: 'bar'}; spyOn(api, 'getAll').and.returnValue($q.when(fixture)); var result; vocabularies.getVocabularies().then( (vocabs) => { result = vocabs; }, ); $rootScope.$digest(); expect(api.getAll).toHaveBeenCalledWith('vocabularies', {where: {type: 'manageable'}}); expect(result).toBe(fixture); expect(vocabularies.vocabularies).toBe(fixture); })); it('convert values for qcode having integer type', () => { const items = [{name: 'foo', qcode: '1', is_active: true}]; const schemaFields = [{key: 'name', required: true}, {key: 'qcode', type: 'integer'}]; const wrapper = mount( ( ), ); wrapper.setState({languages: []}); const instance = wrapper.instance() as VocabularyItemsViewEdit; wrapper.update(); const fakeEvent = {target: {value: '2'}}; wrapper.find('input[type="number"]').simulate('change', fakeEvent); expect(instance.getItemsForSaving()[0].qcode).toBe(2); }); describe('config controller', () => { beforeEach(inject((session) => { session.identity = {_id: 'user:1'}; })); it('can sync changes in the list', inject(($controller, $rootScope) => { const scope = $rootScope.$new(); scope.vocabularies = [{_id: 'foo', display_name: 'Foo'}]; $controller('VocabularyConfig', {$scope: scope}); scope.updateVocabulary({_id: 'foo', display_name: 'Bar'}); expect(scope.vocabularies.length).toBe(1); expect(scope.vocabularies[0].display_name).toBe('Bar'); scope.updateVocabulary({_id: 'new', display_name: 'New'}); expect(scope.vocabularies.length).toBe(2); })); }); describe('config modal', () => { describe('model', () => { it('being detected correctly', inject(($rootScope, $compile, $timeout) => { var scope = $rootScope.$new(); scope.vocabulary = {items: [ {foo: 'flareon', bar: 'beedrill', is_active: true}, {bar: 'bellsprout', spam: 'sandslash', is_active: true}, {qux: 'quagsire', foo: 'frillish', corge: 'corfish', is_active: true}, ]}; scope.matchFieldTypeToTab = angular.noop; $compile('
')(scope); $timeout.flush(); expect(scope.model).toEqual( {foo: null, bar: null, spam: null, qux: null, corge: null, is_active: null}, ); })); }); describe('controller', () => { var scope; var testItem; beforeEach(inject(($rootScope, $controller) => { scope = $rootScope.$new(); testItem = {foo: 'flareon', bar: 'beedrill', is_active: true}; scope.vocabulary = {items: [testItem]}; scope.closeVocabulary = jasmine.createSpy('close'); scope.updateVocabulary = jasmine.createSpy('update'); scope.matchFieldTypeToTab = angular.noop; })); it('can save vocabulary', inject((api, $q, $rootScope, metadata, $compile, $timeout) => { scope.vocabulary.items[0].foo = 'feraligatr'; scope.vocabulary.items[0].bar = 'bayleef'; scope.vocabulary.items[0].is_active = true; $compile('
')(scope); $timeout.flush(); spyOn(api, 'save').and.returnValue($q.when()); spyOn(metadata, 'initialize').and.returnValue($q.when()); scope.save(); $rootScope.$digest(); expect(api.save).toHaveBeenCalledWith( 'vocabularies', { items: [{foo: 'feraligatr', bar: 'bayleef', is_active: true}], }, undefined, undefined, undefined, {skipPostProcessing: true}, ); expect(metadata.initialize).toHaveBeenCalled(); })); it('can validate crop_size vocabulary for minimum value(200)', inject((api, $q, $rootScope, metadata, $timeout, $compile) => { scope.vocabulary._id = 'crop_sizes'; scope.vocabulary.items[0].name = '4-3'; scope.vocabulary.items[0].is_active = true; scope.vocabulary.items[0].width = 200; // minimum 200 allowed scope.vocabulary.items[0].height = 100; // minimum 200 allowed $compile('
')(scope); $timeout.flush(); spyOn(api, 'save').and.returnValue($q.when()); spyOn(metadata, 'initialize').and.returnValue($q.when()); scope.save(); $rootScope.$digest(); expect(scope.errorMessage).toBe( 'Minimum height and width should be greater than or equal to 200', ); expect(api.save).not.toHaveBeenCalled(); expect(metadata.initialize).toHaveBeenCalled(); })); it('validates items according to schema fields', (done) => { const items = [{name: '', qcode: ''}]; const schemaFields = [{key: 'name', required: true}, {key: 'qcode', required: true}]; const waitForDebouncing = 300; const onSetItemValidSpy = jasmine.createSpy('onSetItemValidSpy'); const wrapper = mount( ( ), ); wrapper.setState({languages: []}); wrapper.update(); wrapper.find(s(['vocabulary-items-view-edit', 'field--name'])) .simulate('change', {target: {value: 'abc'}}); setTimeout(() => { expect(onSetItemValidSpy).toHaveBeenCalledWith(false); wrapper.find(s(['vocabulary-items-view-edit', 'field--qcode'])) .simulate('change', {target: {value: 'abc'}}); setTimeout(() => { expect(onSetItemValidSpy).toHaveBeenCalledWith(true); done(); }, waitForDebouncing); }, waitForDebouncing); }); it('can remove an item', () => { const wrapper = mount( ( ), ); wrapper.setState({languages: []}); const instance = wrapper.instance() as VocabularyItemsViewEdit; expect(instance.getItemsForSaving().length).toBe(1); wrapper.find(s(['vocabulary-items-view-edit', 'remove'])) .simulate('click'); expect(instance.getItemsForSaving().length).toBe(0); }); }); }); });