adapt ObjectToConfigAdapter.getFlattenedPaths to consider arrays as final values (#56105)

* adapt getFlattenedPaths to consider arrays as final values

* add getUnusedConfigKeys test

* improve tests
This commit is contained in:
Pierre Gayvallet 2020-01-28 16:04:43 +01:00 committed by GitHub
parent 7d2074a95a
commit a1ccb29731
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 73 additions and 15 deletions

View file

@ -0,0 +1,53 @@
/*
* Licensed to Elasticsearch B.V. under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch B.V. licenses this file to you 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 { ObjectToConfigAdapter } from './object_to_config_adapter';
describe('ObjectToConfigAdapter', () => {
describe('#getFlattenedPaths()', () => {
it('considers arrays as final values', () => {
const data = {
string: 'string',
array: ['an', 'array'],
};
const config = new ObjectToConfigAdapter(data);
expect(config.getFlattenedPaths()).toEqual(['string', 'array']);
});
it('handles nested arrays', () => {
const data = {
string: 'string',
array: ['an', 'array'],
nested: {
number: 12,
array: [{ key: 1 }, { key: 2 }],
},
};
const config = new ObjectToConfigAdapter(data);
expect(config.getFlattenedPaths()).toEqual([
'string',
'array',
'nested.number',
'nested.array',
]);
});
});
});

View file

@ -19,6 +19,7 @@
import { cloneDeep, get, has, set } from 'lodash';
import { getFlattenedObject } from '../../utils';
import { Config, ConfigPath } from './';
/**
@ -41,24 +42,10 @@ export class ObjectToConfigAdapter implements Config {
}
public getFlattenedPaths() {
return [...flattenObjectKeys(this.rawConfig)];
return Object.keys(getFlattenedObject(this.rawConfig));
}
public toRaw() {
return cloneDeep(this.rawConfig);
}
}
function* flattenObjectKeys(
obj: { [key: string]: any },
path: string = ''
): IterableIterator<string> {
if (typeof obj !== 'object' || obj === null) {
yield path;
} else {
for (const [key, value] of Object.entries(obj)) {
const newPath = path !== '' ? `${path}.${key}` : key;
yield* flattenObjectKeys(value, newPath);
}
}
}

View file

@ -200,6 +200,24 @@ describe('getUnusedConfigKeys', () => {
).toEqual(['foo.dolly']);
});
it('handles array values', async () => {
expect(
await getUnusedConfigKeys({
coreHandledConfigPaths: ['core', 'array'],
pluginSpecs: [],
disabledPluginSpecs: [],
settings: {
core: {
prop: 'value',
array: [1, 2, 3],
},
array: ['some', 'values'],
},
legacyConfig: getConfig({}),
})
).toEqual([]);
});
describe('using deprecation', () => {
it('should use the plugin deprecations provider', async () => {
expect(