[DEV-3192] Fix populating default bucket data to meet min required bucket values
parent
48cae2bb4d
commit
8ac2a367db
|
@ -56,14 +56,49 @@ module.exports = Class( 'ProgramInit',
|
||||||
{
|
{
|
||||||
const defaults = program.defaults || {};
|
const defaults = program.defaults || {};
|
||||||
|
|
||||||
// initialize to an array with a single element of the default value
|
var data = {},
|
||||||
return Promise.resolve(
|
groups = program.meta.groups;
|
||||||
Object.keys( defaults ).reduce(
|
|
||||||
( data, key ) => ( data[ key ] === undefined )
|
Object.keys( program.groupExclusiveFields ).forEach( function( group, index )
|
||||||
? ( data[ key ] = [ defaults[ key ] ], data )
|
{
|
||||||
: data,
|
var length = program.groupExclusiveFields[ group ].length;
|
||||||
doc_data || {}
|
|
||||||
)
|
while ( length-- )
|
||||||
);
|
{
|
||||||
|
var field = program.groupExclusiveFields[ group ][ length ],
|
||||||
|
defaultValue;
|
||||||
|
|
||||||
|
if ( defaults.hasOwnProperty(field) )
|
||||||
|
{
|
||||||
|
defaultValue = defaults[ field ];
|
||||||
|
// Initialize with existing document data if any
|
||||||
|
data[ field ] = doc_data[ field ] ? doc_data[ field ] : [];
|
||||||
|
|
||||||
|
// If no document data, initialize with default value
|
||||||
|
if ( !doc_data[ field ] )
|
||||||
|
{
|
||||||
|
data[ field ][ 0 ] = defaultValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If min rows on the group is greater than the data
|
||||||
|
// currently in the bucket, then populate the rest
|
||||||
|
// of the data with the default data until the
|
||||||
|
// arrays are the same length
|
||||||
|
if ( groups.hasOwnProperty( group ) &&
|
||||||
|
data[ field ].length < groups[ group ].min )
|
||||||
|
{
|
||||||
|
var index = data[ field ].length;
|
||||||
|
|
||||||
|
while ( index < groups[ group ].min )
|
||||||
|
{
|
||||||
|
data[ field ][ index ] = defaultValue;
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return Promise.resolve( data );
|
||||||
},
|
},
|
||||||
} );
|
} );
|
||||||
|
|
|
@ -34,6 +34,12 @@ describe( 'ProgramInit', () =>
|
||||||
{
|
{
|
||||||
label: "initializes defaults",
|
label: "initializes defaults",
|
||||||
defaults: { a: "one", b: "two" },
|
defaults: { a: "one", b: "two" },
|
||||||
|
meta: {
|
||||||
|
groups: {}
|
||||||
|
},
|
||||||
|
groupExclusiveFields: {
|
||||||
|
Something: [ "a", "b" ]
|
||||||
|
},
|
||||||
doc_data: {},
|
doc_data: {},
|
||||||
expected: {
|
expected: {
|
||||||
a: [ "one" ],
|
a: [ "one" ],
|
||||||
|
@ -43,18 +49,33 @@ describe( 'ProgramInit', () =>
|
||||||
{
|
{
|
||||||
label: "does nothing with no data or defaults",
|
label: "does nothing with no data or defaults",
|
||||||
defaults: {},
|
defaults: {},
|
||||||
|
meta: {
|
||||||
|
groups: {}
|
||||||
|
},
|
||||||
|
groupExclusiveFields: {},
|
||||||
doc_data: {},
|
doc_data: {},
|
||||||
expected: {},
|
expected: {},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "produces empty object given undefined data",
|
label: "produces empty object given undefined data",
|
||||||
defaults: {},
|
defaults: {},
|
||||||
|
meta: {
|
||||||
|
groups: {}
|
||||||
|
},
|
||||||
|
groupExclusiveFields: {},
|
||||||
doc_data: undefined,
|
doc_data: undefined,
|
||||||
expected: {},
|
expected: {},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "keeps existing data with defaults",
|
label: "keeps existing data with defaults",
|
||||||
defaults: { foo: "init" },
|
defaults: { foo: "init" },
|
||||||
|
meta: {
|
||||||
|
groups: {}
|
||||||
|
},
|
||||||
|
groupExclusiveFields: {
|
||||||
|
Something: [ "foo" ],
|
||||||
|
SomethingElse: [ "bar" ]
|
||||||
|
},
|
||||||
doc_data: { bar: [ "baz" ] },
|
doc_data: { bar: [ "baz" ] },
|
||||||
expected: {
|
expected: {
|
||||||
foo: [ "init" ],
|
foo: [ "init" ],
|
||||||
|
@ -64,6 +85,12 @@ describe( 'ProgramInit', () =>
|
||||||
{
|
{
|
||||||
label: "keeps existing doc data with no defaults",
|
label: "keeps existing doc data with no defaults",
|
||||||
defaults: {},
|
defaults: {},
|
||||||
|
meta: {
|
||||||
|
groups: {}
|
||||||
|
},
|
||||||
|
groupExclusiveFields: {
|
||||||
|
Something: [ "foo" ],
|
||||||
|
},
|
||||||
doc_data: { foo: [ "bar" ] },
|
doc_data: { foo: [ "bar" ] },
|
||||||
expected: {
|
expected: {
|
||||||
foo: [ "bar" ],
|
foo: [ "bar" ],
|
||||||
|
@ -72,12 +99,74 @@ describe( 'ProgramInit', () =>
|
||||||
{
|
{
|
||||||
label: "does not overwrite existing data with defaults",
|
label: "does not overwrite existing data with defaults",
|
||||||
defaults: { foo: "init" },
|
defaults: { foo: "init" },
|
||||||
|
meta: {
|
||||||
|
groups: {}
|
||||||
|
},
|
||||||
|
groupExclusiveFields: {
|
||||||
|
Something: [ "foo" ]
|
||||||
|
},
|
||||||
doc_data: { foo: [ "bar" ] },
|
doc_data: { foo: [ "bar" ] },
|
||||||
expected: {
|
expected: {
|
||||||
foo: [ "bar" ],
|
foo: [ "bar" ],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
].forEach( ({ label, doc_data, id, defaults, expected }) =>
|
{
|
||||||
|
label: "does not overwrite existing data with defaults and multiple rows",
|
||||||
|
defaults: { foo: "init" },
|
||||||
|
meta: {
|
||||||
|
groups: {
|
||||||
|
Something: {
|
||||||
|
min: 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
groupExclusiveFields: {
|
||||||
|
Something: [ "foo" ]
|
||||||
|
},
|
||||||
|
doc_data: { foo: [ "bar", "baz", "test" ] },
|
||||||
|
expected: {
|
||||||
|
foo: [ "bar", "baz", "test" ],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "initializes with default bucket data",
|
||||||
|
defaults: { foo: "init" },
|
||||||
|
meta: {
|
||||||
|
groups: {
|
||||||
|
Something: {
|
||||||
|
min: 5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
groupExclusiveFields: {
|
||||||
|
Something: [ "foo" ]
|
||||||
|
},
|
||||||
|
doc_data: {},
|
||||||
|
expected: {
|
||||||
|
foo: [ "init", "init", "init", "init", "init" ],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: "fix missing bucket data values",
|
||||||
|
defaults: { foo: "init" },
|
||||||
|
meta: {
|
||||||
|
groups: {
|
||||||
|
Something: {
|
||||||
|
min: 5
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
groupExclusiveFields: {
|
||||||
|
Something: [ "foo" ]
|
||||||
|
},
|
||||||
|
doc_data: {
|
||||||
|
foo: [ "1", "2", "3", "4" ],
|
||||||
|
},
|
||||||
|
expected: {
|
||||||
|
foo: [ "1", "2", "3", "4", "init" ],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
].forEach( ({ label, doc_data, id, defaults, meta, groupExclusiveFields, expected }) =>
|
||||||
{
|
{
|
||||||
it( label, () =>
|
it( label, () =>
|
||||||
{
|
{
|
||||||
|
@ -86,6 +175,8 @@ describe( 'ProgramInit', () =>
|
||||||
const program = {
|
const program = {
|
||||||
id: "foo",
|
id: "foo",
|
||||||
defaults: defaults,
|
defaults: defaults,
|
||||||
|
meta: meta,
|
||||||
|
groupExclusiveFields : groupExclusiveFields
|
||||||
};
|
};
|
||||||
|
|
||||||
return expect( sut.init( program, doc_data ) )
|
return expect( sut.init( program, doc_data ) )
|
||||||
|
|
Loading…
Reference in New Issue