redux-form
Version:
A higher order component decorator for forms using Redux and React
273 lines (208 loc) • 6.54 kB
JavaScript
import expect from 'expect';
import { fromJS, Map, List } from 'immutable';
import setIn from '../setIn';
describe('structure.immutable.setIn', function () {
it('should handle undefined', function () {
var result = setIn(new Map(), undefined, 'success');
expect(result).toEqual('success');
});
it('should handle dot paths', function () {
var result = setIn(new Map(), 'a.b.c', 'success');
var a = result.get('a');
expect(a).toExist('a missing');
var b = a.get('b');
expect(b).toExist('b missing');
var c = b.get('c');
expect(c).toEqual('success');
});
it('should handle array paths', function () {
var result = setIn(new Map(), 'a.b[0]', 'success');
var a = result.get('a');
expect(a).toExist('a missing');
var b = a.get('b');
expect(b).toExist('b missing').toBeA(List).toEqual(fromJS(['success']));
});
it('should handle array paths with successive sets', function () {
var result = setIn(new Map(), 'a.b[2]', 'success');
result = setIn(result, 'a.b[0]', 'success');
var a = result.get('a');
expect(a).toExist('a missing');
var b = a.get('b');
expect(b).toExist('b missing').toBeA(List).toEqual(fromJS(['success', undefined, 'success']));
});
it('should handle array paths with existing array', function () {
var result = setIn(new Map({
a: new Map({
b: new List(['first'])
})
}), 'a.b[1].value', 'success');
var a = result.get('a');
expect(a).toExist('a missing');
var b = a.get('b');
expect(b).toExist('b missing').toBeA(List).toEqual(fromJS(['first', { value: 'success' }]));
});
it('should handle array paths with existing array with undefined', function () {
var result = setIn(new Map({
a: new Map({
b: new List(['first', undefined])
})
}), 'a.b[1].value', 'success');
var a = result.get('a');
expect(a).toExist('a missing');
var b = a.get('b');
expect(b).toExist('b missing').toBeA(List).toEqual(fromJS(['first', { value: 'success' }]));
});
it('should handle multiple array paths', function () {
var result = setIn(new Map(), 'a.b[0].c.d[13].e', 'success');
var a = result.get('a');
expect(a).toExist('a missing').toBeA(Map);
var b = a.get('b');
expect(b).toExist('b missing').toBeA(List);
var b0 = b.get(0);
expect(b0).toExist('b[0] missing').toBeA(Map);
var c = b0.get('c');
expect(c).toExist('c missing').toBeA(Map);
var d = c.get('d');
expect(d).toExist('d missing').toBeA(List);
var d13 = d.get(13);
expect(d13).toExist('d[13] missing').toBeA(Map);
var e = d13.get('e');
expect(e).toExist('e missing').toEqual('success');
});
it('should handle indexer paths', function () {
var result = setIn(new Map(), 'a.b[c].d[e]', 'success');
var a = result.get('a');
expect(a).toExist('a missing');
var b = a.get('b');
expect(b).toExist('b missing');
var c = b.get('c');
expect(c).toExist('c missing');
var d = c.get('d');
expect(d).toExist('d missing');
var e = d.get('e');
expect(e).toExist('e missing').toEqual('success');
});
it('should update existing Map', function () {
var initial = fromJS({
a: {
b: { c: 'one' }
}
});
var result = setIn(initial, 'a.b.c', 'two');
var a = result.get('a');
expect(a).toExist('a missing');
var b = a.get('b');
expect(b).toExist('b missing');
var c = b.get('c');
expect(c).toEqual('two');
});
it('should update existing List', function () {
var initial = fromJS({
a: {
b: [{ c: 'one' }]
}
});
var result = setIn(initial, 'a.b[0].c', 'two');
var a = result.get('a');
expect(a).toExist('a missing');
var b = a.get('b');
expect(b).toExist('b missing');
var b0 = b.get(0);
expect(b0).toExist();
var b0c = b0.get('c');
expect(b0c).toEqual('two');
});
it('should not break existing Map', function () {
var initial = fromJS({
a: {
b: { c: 'one' }
}
});
var result = setIn(initial, 'a.b.d', 'two');
var a = result.get('a');
expect(a).toExist('a missing');
var b = a.get('b');
expect(b).toExist('b missing');
var c = b.get('c');
expect(c).toEqual('one');
var d = b.get('d');
expect(d).toEqual('two');
});
it('should not break existing List', function () {
var initial = fromJS({
a: {
b: [{ c: 'one' }, { c: 'two' }]
}
});
var result = setIn(initial, 'a.b[0].c', 'changed');
var a = result.get('a');
expect(a).toExist('a missing');
var b = a.get('b');
expect(b).toExist('b missing');
var b0 = b.get(0);
expect(b0).toExist();
var b0c = b0.get('c');
expect(b0c).toEqual('changed');
var b1 = b.get(1);
expect(b1).toExist();
var b1c = b1.get('c');
expect(b1c).toEqual('two');
});
it('should add to an existing List', function () {
var initial = fromJS({
a: {
b: [{ c: 'one' }, { c: 'two' }]
}
});
var result = setIn(initial, 'a.b[2].c', 'three');
var a = result.get('a');
expect(a).toExist('a missing');
var b = a.get('b');
expect(b).toExist('b missing');
var b0 = b.get(0);
expect(b0).toExist();
var b0c = b0.get('c');
expect(b0c).toEqual('one');
var b1 = b.get(1);
expect(b1).toExist();
var b1c = b1.get('c');
expect(b1c).toEqual('two');
var b2 = b.get(2);
expect(b2).toExist();
var b2c = b2.get('c');
expect(b2c).toEqual('three');
});
it('should set a value directly on new list', function () {
var result = setIn(new Map(), 'a.b[2]', 'three');
var a = result.get('a');
expect(a).toExist('a missing');
var b = a.get('b');
expect(b).toExist('b missing');
var b0 = b.get(0);
expect(b0).toEqual(undefined);
var b1 = b.get(1);
expect(b1).toEqual(undefined);
var b2 = b.get(2);
expect(b2).toEqual('three');
});
it('should add to an existing List item', function () {
var initial = fromJS({
a: {
b: [{
c: '123'
}]
}
});
var result = setIn(initial, 'a.b[0].d', '12');
var a = result.get('a');
expect(a).toExist('a missing');
var b = a.get('b');
expect(b).toExist('b missing');
var b0 = b.get(0);
expect(b0).toExist();
var b0d = b0.get('d');
expect(b0d).toEqual('12');
var b0c = b0.get('c');
expect(b0c).toEqual('123');
});
});