blob: c5790109707f74f5c443f27c2e5b392ab8649610 [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 Documents from '../../../documents/resources';
import reducer, { hasCustomReduce, getDesignDocList, getSelectedDesignDocPartitioned,
getSaveDesignDoc } from '../reducers';
import ActionTypes from '../actiontypes';
import '../../base';
describe('IndexEditor Reducer', () => {
describe('map editor', () => {
it('new view is assigned the default map code', () => {
const action = {
type: ActionTypes.EDIT_NEW_INDEX,
options: {
isNewView: true,
//designDocs: {find: () => { return { dDocModel: () => {}}; }}
}
};
const newState = reducer(undefined, action);
expect(newState.view.map).toBe('function (doc) {\n emit(doc._id, 1);\n}');
});
});
describe('reduce editor', () => {
describe('hasCustomReduce', () => {
it('is false for no reduce', () => {
const designDoc = {
_id: '_design/test-doc',
views: {
'test-view': {
map: '() => {};'
}
}
};
const designDocs = new Documents.AllDocs([designDoc], {
params: { limit: 10 },
database: {
safeID: () => { return 'id';}
}
});
const action = {
type: ActionTypes.EDIT_NEW_INDEX,
options: {
isNewView: false,
viewName: 'test-view',
designDocs: designDocs,
designDocId: designDoc._id
}
};
const newState = reducer(undefined, action);
expect(hasCustomReduce(newState)).toBe(false);
});
it('is false for built in reduce', () => {
const designDoc = {
_id: '_design/test-doc',
views: {
'test-view': {
map: '() => {};',
reduce: '_sum'
}
}
};
const designDocs = new Documents.AllDocs([designDoc], {
params: { limit: 10 },
database: {
safeID: () => { return 'id';}
}
});
const action = {
type: ActionTypes.EDIT_NEW_INDEX,
options: {
isNewView: false,
viewName: 'test-view',
designDocs: designDocs,
designDocId: designDoc._id
}
};
const newState = reducer(undefined, action);
expect(hasCustomReduce(newState)).toBe(false);
});
it('is true for custom reduce', () => {
const designDoc = {
_id: '_design/test-doc',
views: {
'test-view': {
map: '() => {};',
reduce: 'function (reduce) { reduce(); }'
}
}
};
const designDocs = new Documents.AllDocs([designDoc], {
params: { limit: 10 },
database: {
safeID: () => { return 'id';}
}
});
const action = {
type: ActionTypes.EDIT_NEW_INDEX,
options: {
isNewView: false,
viewName: 'test-view',
designDocs: designDocs,
designDocId: designDoc._id
}
};
const newState = reducer(undefined, action);
expect(hasCustomReduce(newState)).toBe(true);
});
});
describe('SELECT_REDUCE_CHANGE', () => {
const designDoc = {
_id: '_design/test-doc',
views: {
'test-view': {
map: '() => {};'
}
}
};
const designDocs = new Documents.AllDocs([designDoc], {
params: { limit: 10 },
database: {
safeID: () => { return 'id';}
}
});
const editAction = {
type: ActionTypes.EDIT_NEW_INDEX,
options: {
isNewView: false,
viewName: 'test-view',
designDocs: designDocs,
designDocId: designDoc._id
}
};
it('NONE returns null reduce', () => {
let newState = reducer(undefined, editAction);
const selectReduceaction = {
type: ActionTypes.SELECT_REDUCE_CHANGE,
reduceSelectedOption: 'NONE'
};
newState = reducer(newState, selectReduceaction);
expect(newState.view.reduce).toBe('');
});
it('builtin returns builtin reduce', () => {
let newState = reducer(undefined, editAction);
const selectReduceAction = {
type: ActionTypes.SELECT_REDUCE_CHANGE,
reduceSelectedOption: '_sum'
};
newState = reducer(newState, selectReduceAction);
expect(newState.view.reduce).toBe('_sum');
});
it('custom returns custom reduce', () => {
let newState = reducer(undefined, editAction);
const selectReduceAction = {
type: ActionTypes.SELECT_REDUCE_CHANGE,
reduceSelectedOption: 'CUSTOM'
};
newState = reducer(newState, selectReduceAction);
expect(newState.view.reduce).toBe('function (keys, values, rereduce) {\n if (rereduce) {\n return sum(values);\n } else {\n return values.length;\n }\n}');
});
});
});
describe('design doc selector', () => {
const designDoc = {
_id: '_design/test-doc',
views: {
'test-view': {
map: 'boom'
}
}
};
const mangoDoc = {
"_id": "_design/123mango",
"id": "_design/123mango",
"key": "_design/123mango",
"value": {
"rev": "20-9e4bc8b76fd7d752d620bbe6e0ea9a80"
},
"doc": {
"_id": "_design/123mango",
"_rev": "20-9e4bc8b76fd7d752d620bbe6e0ea9a80",
"views": {
"test-view": {
"map": "function(doc) {\n emit(doc._id, 2);\n}"
},
"new-view": {
"map": "function(doc) {\n if (doc.class === \"mammal\" && doc.diet === \"herbivore\")\n emit(doc._id, 1);\n}",
"reduce": "_sum"
}
},
"language": "query",
"indexes": {
"newSearch": {
"analyzer": "standard",
"index": "function(doc){\n index(\"default\", doc._id);\n}"
}
}
}
};
const designDocArray = _.map([designDoc, mangoDoc], (doc) => {
return Documents.Doc.prototype.parse(doc);
});
const designDocs = new Documents.AllDocs(designDocArray, {
params: { limit: 10 },
database: {
safeID: () => { return 'id'; }
}
});
const editAction = {
type: ActionTypes.EDIT_INDEX,
options: {
isNewView: false,
viewName: 'test-view',
designDocs: designDocs,
designDocId: designDoc._id
}
};
it('DESIGN_DOC_CHANGE changes design doc id', () => {
let newState = reducer(undefined, editAction);
const designDocId = 'another-one';
const ddocChangeAction = {
type: ActionTypes.DESIGN_DOC_CHANGE,
options: {
value: designDocId
}
};
newState = reducer(newState, ddocChangeAction);
expect(newState.designDocId).toBe(designDocId);
});
it('only filters mango docs', () => {
const newState = reducer(undefined, editAction);
const designDocs = getDesignDocList(newState);
expect(designDocs.length).toBe(1);
expect(designDocs[0]).toBe('_design/test-doc');
});
});
describe('EDIT_INDEX', () => {
const designDoc = {
_id: '_design/test-doc',
views: {
'test-view': {
map: 'boom'
}
}
};
const designDocs = new Documents.AllDocs([designDoc], {
params: { limit: 10 },
database: {
safeID: () => { return 'id';}
}
});
it('can set reduce for new design doc', () => {
const editAction = {
type: ActionTypes.EDIT_INDEX,
options: {
isNewView: true,
isNewDesignDoc: true,
viewName: 'test-view',
designDocs: designDocs,
designDocId: undefined
}
};
let newState = reducer(undefined, editAction);
const selectReduceAction = {
type: ActionTypes.SELECT_REDUCE_CHANGE,
reduceSelectedOption: '_sum'
};
newState = reducer(newState, selectReduceAction);
expect(newState.view.reduce).toBe('_sum');
});
});
describe('getSelectedDesignDocPartitioned', () => {
const designDocs = [
{id: '_design/docGlobal', get: () => { return {options: { partitioned: false }}; }},
{id: '_design/docPartitioned', get: () => { return {options: { partitioned: true }}; }},
{id: '_design/docNoOptions', get: () => { return {};}}
];
it('returns true for ddocs without partitioned flag on partitioned dbs', () => {
const isDbPartitioned = true;
const state = { designDocs, designDocId: '_design/docNoOptions' };
expect(getSelectedDesignDocPartitioned(state, isDbPartitioned)).toBe(true);
});
it('returns false for ddocs where partitioned is false on partitioned dbs', () => {
const isDbPartitioned = true;
const state = { designDocs, designDocId: '_design/docGlobal' };
expect(getSelectedDesignDocPartitioned(state, isDbPartitioned)).toBe(false);
});
it('returns true for ddocs where partitioned is true on partitioned dbs', () => {
const isDbPartitioned = true;
const state = { designDocs, designDocId: '_design/docPartitioned' };
expect(getSelectedDesignDocPartitioned(state, isDbPartitioned)).toBe(true);
});
it('any ddoc is global on non-partitioned dbs', () => {
const isDbPartitioned = false;
const state = { designDocs, designDocId: '_design/docGlobal' };
expect(getSelectedDesignDocPartitioned(state, isDbPartitioned)).toBe(false);
const state2 = { designDocs, designDocId: '_design/docPartitioned' };
expect(getSelectedDesignDocPartitioned(state2, isDbPartitioned)).toBe(false);
const state3 = { designDocs, designDocId: '_design/docNoOptions' };
expect(getSelectedDesignDocPartitioned(state3, isDbPartitioned)).toBe(false);
});
});
describe('getSaveDesignDoc', () => {
it('only sets partitioned flag when db is partitioned', () => {
const state = { designDocId: 'new-doc', newDesignDocPartitioned: true, };
const ddoc = getSaveDesignDoc(state, true);
expect(ddoc.get('options')).toEqual({ partitioned: true });
const ddoc2 = getSaveDesignDoc(state, false);
expect(ddoc2.get('options')).toBeUndefined();
});
});
});