blob: 4d053d5925e0189b3cf540ddbd6d8902120605b7 [file] [log] [blame]
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
import {mount} from 'enzyme';
import React from 'react';
import sinon from 'sinon';
import FauxtonAPI from '../../../core/api';
import AnalyzerDropdown from '../components/AnalyzerDropdown';
import SearchForm from '../components/SearchForm';
import SearchIndexEditor from '../components/SearchIndexEditor';
import '../base';
describe('SearchIndexEditor', () => {
const defaultProps = {
isLoading: false,
isCreatingIndex: false,
database: { id: 'my_db' },
lastSavedDesignDocName: 'last_ddoc',
lastSavedSearchIndexName: 'last_idx',
searchIndexFunction: '',
saveDoc: {},
designDocs: [],
searchIndexName: '',
ddocPartitioned: false,
newDesignDocPartitioned: false,
analyzerType: '',
singleAnalyzer: '',
defaultAnalyzer: '',
defaultMultipleAnalyzer: '',
analyzerFields: [],
setAnalyzerType: () => {},
setDefaultMultipleAnalyzer: () => {},
setSingleAnalyzer: () => {},
addAnalyzerRow: () => {},
setSearchIndexName: () => {},
saveSearchIndex: () => {},
selectDesignDoc: () => {},
updateNewDesignDocName: () => {}
};
it('generates the correct cancel link when db, ddoc and views have special chars', () => {
const editorEl = mount(<SearchIndexEditor
{...defaultProps}
database={{ id: 'db%$1' }}
lastSavedDesignDocName={'_design/doc/1$2'}
lastSavedSearchIndexName={'search?abc/123'}
/>);
const expectedUrl = `/${encodeURIComponent('db%$1')}/_design/${encodeURIComponent('doc/1$2')}/_search/${encodeURIComponent('search?abc/123')}`;
expect(editorEl.find('a.index-cancel-link').prop('href')).toMatch(expectedUrl);
});
it('does not save when missing the index name', () => {
const spy = sinon.stub();
const editorEl = mount(<SearchIndexEditor
{...defaultProps}
database={{ id: 'test_db' }}
designDocs={[{id: '_design/d1'}, {id: '_design/d2'}]}
ddocName='_design/d1'
searchIndexName={''}
saveSearchIndex={spy}
saveDoc={{id: '_design/d'}}
/>);
editorEl.find('button#save-index').simulate('click', {preventDefault: () => {}});
sinon.assert.notCalled(spy);
});
});
describe('AnalyzerDropdown', () => {
it('check default values and settings', () => {
const el = mount(<AnalyzerDropdown />);
// confirm default label
expect(el.find('label').length).toBe(2);
expect(el.find('label').first().text()).toBe('Type');
// confirm default value
expect(el.find('select').hasClass('standard')).toBeTruthy();
});
it('omits label element if empty label passed', () => {
const el = mount(<AnalyzerDropdown label="" />);
// (1, because there are normally 2 labels, see prev test)
expect(el.find('label').length).toBe(1);
});
it('custom ID works', () => {
const customID = 'myCustomID';
const el = mount(<AnalyzerDropdown id={customID} />);
expect(el.find('select').prop('id')).toBe(customID);
});
it('sets default value', () => {
const defaultSelected = 'russian';
const el = mount(
<AnalyzerDropdown defaultSelected={defaultSelected} />
);
expect(el.find('select').hasClass(defaultSelected)).toBeTruthy();
});
it('custom classes get applied', () => {
const el = mount(<AnalyzerDropdown classes="nuthatch vulture" />);
expect(el.find('.nuthatch').exists()).toBeTruthy();
expect(el.find('.vulture').exists()).toBeTruthy();
});
it('custom change handler gets called', () => {
const spy = sinon.spy();
const el = mount(<AnalyzerDropdown onChange={spy} />);
const newVal = 'whitespace';
el.find('select').simulate('change', { target: { value: newVal }});
expect(spy.calledOnce).toBeTruthy();
});
});
describe('SearchForm', () => {
const defaultProps = {
searchResults: [{id: 'elephant'}],
searchPerformed: true,
hasActiveQuery: false,
searchQuery: 'a_search',
database: { id: 'foo' },
querySearch: () => {},
setSearchQuery: () => {}
};
beforeEach(() => {
sinon.stub(FauxtonAPI, 'urls').returns('/fake/url');
});
afterEach(() => {
FauxtonAPI.urls.restore();
});
it('renders docs from the search results', () => {
const el = mount(<SearchForm
{...defaultProps}
/>);
expect(el.find('pre').first().text('elephant')).toBeTruthy();
});
it('renders with links', () => {
const el = mount(<SearchForm
{...defaultProps}
/>);
expect(el.find('a')).toBeTruthy();
});
});