blob: fb36b2802b5cca5f826bfacef2ef6bfceafd6407 [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 * as Reducers from '../index-results/reducers';
import FauxtonAPI from '../../../core/api';
import Constants from '../constants';
import ActionTypes from '../index-results/actiontypes';
describe('Docs Reducers', () => {
const initialState = {
docs: [], // raw documents returned from couch
selectedDocs: [], // documents selected for manipulation
isLoading: false,
tableView: {
selectedFieldsTableView: [], // current columns to display
showAllFieldsTableView: false, // do we show all possible columns?
},
isEditable: true, // can the user manipulate the results returned?
selectedLayout: Constants.LAYOUT_ORIENTATION.METADATA,
textEmptyIndex: 'No Documents Found',
docType: Constants.INDEX_RESULTS_DOC_TYPE.VIEW,
fetchParams: {
limit: FauxtonAPI.constants.MISC.DEFAULT_PAGE_SIZE + 1,
skip: 0
},
pagination: {
pageStart: 1, // index of first doc in this page of results
currentPage: 1, // what page of results are we showing?
perPage: FauxtonAPI.constants.MISC.DEFAULT_PAGE_SIZE,
canShowNext: false // flag indicating if we can show a next page
},
queryOptionsPanel: {
isVisible: false,
showByKeys: false,
showBetweenKeys: false,
includeDocs: false,
betweenKeys: {
include: true,
startkey: '',
endkey: ''
},
byKeys: '',
descending: false,
skip: '',
limit: 'none',
reduce: false,
groupLevel: 'exact',
showReduce: false
}
};
const testDoc = {
id: 'foo',
key: 'foo',
value: {
rev: '1-967a00dff5e02add41819138abb3284d'
}
};
it('resets selectedDocs on state reset', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_SELECTED_DOCS,
selectedDocs: [{_id: '1'}]
};
const newState = Reducers.default(initialState, action);
const resetAction = {
type: ActionTypes.INDEX_RESULTS_REDUX_RESET_STATE
};
const newState2 = Reducers.default(newState, resetAction);
expect(newState2.selectedDocs).toEqual([]);
});
it('getDocs returns the docs attribute from the state', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_RESULTS,
docs: [testDoc],
fetchPArams: {
limit: 21,
skip: 0
},
canShowNext: true
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getDocs(newState)).toEqual([testDoc]);
});
it('getSelected returns the selectedDocs attribute from the state', () => {
const selectedDoc = {
_id: 'foo',
_rev: '1-967a00dff5e02add41819138abb3284d',
_deleted: true
};
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_SELECTED_DOCS,
selectedDocs: [selectedDoc]
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getSelectedDocs(newState)).toEqual([selectedDoc]);
});
it('getIsLoading returns the isLoading attribute from the state', () => {
expect(Reducers.getIsLoading(initialState)).toBe(false);
});
it('getIsEditable returns the isEditable attribute from the state', () => {
expect(Reducers.getIsEditable(initialState)).toBe(true);
});
it('getSelectedLayout returns the selectedLayout attribute from the state', () => {
expect(Reducers.getSelectedLayout(initialState)).toMatch(Constants.LAYOUT_ORIENTATION.METADATA);
});
it('getTextEmptyIndex returns the textEmptyIndex attribute from the state', () => {
expect(Reducers.getTextEmptyIndex(initialState)).toMatch('No Documents Found');
});
it('getDocType returns the docType attribute from the state', () => {
expect(Reducers.getDocType(initialState)).toMatch(Constants.INDEX_RESULTS_DOC_TYPE.VIEW);
});
it('getFetchParams returns the fetchParams attribute from the state', () => {
expect(Reducers.getFetchParams(initialState)).toEqual({
limit: FauxtonAPI.constants.MISC.DEFAULT_PAGE_SIZE + 1,
skip: 0
});
});
it('getPageStart returns the pageStart attribute from the state', () => {
expect(Reducers.getPageStart(initialState)).toBe(1);
});
it('getPrioritizedEnabled returns the showAllFieldsTableView attribute from the state', () => {
expect(Reducers.getPrioritizedEnabled(initialState)).toBe(false);
});
it('getPerPage returns the perPage attribute from the state', () => {
expect(Reducers.getPerPage(initialState)).toBe(FauxtonAPI.constants.MISC.DEFAULT_PAGE_SIZE);
});
it('getCanShowNext returns the canShowNext attribute from the state', () => {
expect(Reducers.getCanShowNext(initialState)).toBe(false);
});
it('getQueryOptionsPanel returns the queryOptionsPanel attribute from the state', () => {
expect(Reducers.getQueryOptionsPanel(initialState)).toEqual({
isVisible: false,
showByKeys: false,
showBetweenKeys: false,
includeDocs: false,
betweenKeys: {
include: true,
startkey: '',
endkey: ''
},
byKeys: '',
descending: false,
skip: '',
limit: 'none',
reduce: false,
groupLevel: 'exact',
showReduce: false
});
});
describe('removeGeneratedMangoDocs', () => {
it('returns false when language is query', () => {
expect(Reducers.removeGeneratedMangoDocs({ language: 'query' })).toBe(false);
});
it('returns true when language is not query', () => {
expect(Reducers.removeGeneratedMangoDocs({ language: 'foo' })).toBe(true);
});
});
describe('getShowPrioritizedEnabled', () => {
it('returns false when not table layout', () => {
expect(Reducers.getShowPrioritizedEnabled(initialState)).toBe(false);
});
it('returns true when table layout', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_CHANGE_LAYOUT,
layout: Constants.LAYOUT_ORIENTATION.TABLE
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getShowPrioritizedEnabled(newState)).toBe(true);
});
});
describe('getPageEnd', () => {
it('returns false when there are no results', () => {
expect(Reducers.getPageEnd(initialState)).toBe(false);
});
it('returns pageStart + results.length - 1 when there are results', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_RESULTS,
docs: [testDoc],
fetchPArams: {
limit: 21,
skip: 0
},
canShowNext: true
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getPageEnd(newState)).toBe(1);
});
});
describe('getHasResults', () => {
it('returns false when state is loading', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_IS_LOADING
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getHasResults(newState)).toBe(false);
});
it('returns false when docs.length is zero', () => {
expect(Reducers.getHasResults(initialState)).toBe(false);
});
it('returns true when not loading and there are results', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_RESULTS,
docs: [testDoc],
fetchPArams: {
limit: 21,
skip: 0
},
canShowNext: true
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getHasResults(newState)).toBe(true);
});
});
describe('getAllDocsSelected', () => {
it('returns false if docs.length is zero', () => {
expect(Reducers.getAllDocsSelected(initialState)).toBe(false);
});
it('returns false if docs but selectedDocs.length is zero', () => {
const selectedDoc = {
_id: 'foo',
_rev: '1-967a00dff5e02add41819138abb3284d',
_deleted: true
};
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_SELECTED_DOCS,
selectedDocs: [selectedDoc]
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getAllDocsSelected(newState)).toBe(false);
});
it('returns false there is a doc not in the selectedDocs array', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_RESULTS,
docs: [testDoc],
fetchPArams: {
limit: 21,
skip: 0
},
canShowNext: true
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getAllDocsSelected(newState)).toBe(false);
});
it('returns true when all selectable docs in the docs array are in the selectedDocs array', () => {
const newDocAction = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_RESULTS,
docs: [testDoc],
fetchPArams: {
limit: 21,
skip: 0
},
canShowNext: true,
docType: Constants.INDEX_RESULTS_DOC_TYPE.VIEW
};
const newState1 = Reducers.default(initialState, newDocAction);
const selectedDoc = {
_id: 'foo',
_rev: '1-967a00dff5e02add41819138abb3284d',
_deleted: true
};
const newSelectedDocAction = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_SELECTED_DOCS,
selectedDocs: [selectedDoc]
};
const newState2 = Reducers.default(newState1, newSelectedDocAction);
expect(Reducers.getAllDocsSelected(newState2)).toBe(true);
});
});
describe('getHasDocsSelected', () => {
it('returns false when there are no docs in the selectedDocs array', () => {
expect(Reducers.getHasDocsSelected(initialState)).toBe(false);
});
it('returns true when there are docs in the selectedDocs array', () => {
const selectedDoc = {
_id: 'foo',
_rev: '1-967a00dff5e02add41819138abb3284d',
_deleted: true
};
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_SELECTED_DOCS,
selectedDocs: [selectedDoc]
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getHasDocsSelected(newState)).toBe(true);
});
});
it('getNumDocsSelected returns the length of the selectedDocs array', () => {
expect(Reducers.getNumDocsSelected(initialState)).toBe(0);
});
describe('canShowPrevious', () => {
it('returns false when the current page is 1', () => {
expect(Reducers.getCanShowPrevious(initialState)).toBe(false);
});
it('returns true when the current page is greater than 1', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_PAGINATE_NEXT
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getCanShowPrevious(newState)).toBe(true);
});
});
describe('getQueryOptionsParams', () => {
it('returns an empty object by default', () => {
expect(Reducers.getQueryOptionsParams(initialState)).toEqual({});
});
it('adds include_docs when set in queryOptionsPanel', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_QUERY_OPTIONS,
options: {
includeDocs: true
}
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getQueryOptionsParams(newState)).toEqual({
include_docs: true
});
});
it('adds start_key, end_key, and inclusive end when set in queryOptionsPanel', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_QUERY_OPTIONS,
options: {
showBetweenKeys: true,
betweenKeys: {
include: true,
startkey: '"_design"',
endkey: '"_design0"'
}
}
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getQueryOptionsParams(newState)).toEqual({
inclusive_end: true,
start_key: '"_design"',
end_key: '"_design0"'
});
});
it('adds keys if showByKeys is set in queryOptionsPanel', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_QUERY_OPTIONS,
options: {
showByKeys: true,
byKeys: "['_design', 'foo']"
}
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getQueryOptionsParams(newState)).toEqual({
keys: "['_design', 'foo']"
});
});
it('adds limit if limit is set in the queryOptionsPanel', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_QUERY_OPTIONS,
options: {
limit: 50
}
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getQueryOptionsParams(newState)).toEqual({
limit: 50
});
});
it('adds skip if skip is set in the queryOptionsPanel', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_QUERY_OPTIONS,
options: {
skip: 5
}
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getQueryOptionsParams(newState)).toEqual({
skip: 5
});
});
it('adds descending if descending is set in the queryOptionsPanel', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_QUERY_OPTIONS,
options: {
descending: true
}
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getQueryOptionsParams(newState)).toEqual({
descending: true
});
});
it('adds reduce if reduce is set in the queryOptionsPanel', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_QUERY_OPTIONS,
options: {
reduce: true
}
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getQueryOptionsParams(newState)).toEqual({
reduce: true,
group: true
});
});
it('adds reduce and group_level if both are set in queryOptionsPanel', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_QUERY_OPTIONS,
options: {
reduce: true,
groupLevel: 2
}
};
const newState = Reducers.default(initialState, action);
expect(Reducers.getQueryOptionsParams(newState)).toEqual({
reduce: true,
group_level: 2
});
});
it('only adds update when set to non-default value in the queryOptionsPanel', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_QUERY_OPTIONS,
options: {
update: 'lazy'
}
};
const newStateLazy = Reducers.default(initialState, action);
expect(Reducers.getQueryOptionsParams(newStateLazy)).toEqual({
update: 'lazy'
});
action.options.update = 'false';
const newStateFalse = Reducers.default(initialState, action);
expect(Reducers.getQueryOptionsParams(newStateFalse)).toEqual({
update: 'false'
});
action.options.update = 'true';
const newStateTrue = Reducers.default(initialState, action);
expect(Reducers.getQueryOptionsParams(newStateTrue)).toEqual({
update: undefined
});
});
it('only adds stable when set to non-default value in the queryOptionsPanel', () => {
const action = {
type: ActionTypes.INDEX_RESULTS_REDUX_NEW_QUERY_OPTIONS,
options: {
stable: true
}
};
const newStateTrue = Reducers.default(initialState, action);
expect(Reducers.getQueryOptionsParams(newStateTrue)).toEqual({
stable: true
});
action.options.stable = false;
const newStateFalse = Reducers.default(initialState, action);
expect(Reducers.getQueryOptionsParams(newStateFalse)).toEqual({
stable: undefined
});
});
});
});