From eda559c1608cdae370ed4b99c2f2c8ef6b89bf8f Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 13 Feb 2020 19:42:32 +0100 Subject: [PATCH 1/2] Fix rules with factory function as initialValue --- src/QueryBuilderGroup.vue | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/QueryBuilderGroup.vue b/src/QueryBuilderGroup.vue index 37a068a..0d333a6 100644 --- a/src/QueryBuilderGroup.vue +++ b/src/QueryBuilderGroup.vue @@ -208,20 +208,19 @@ export default class QueryBuilderGroup extends Vue implements QueryBuilderGroupI throw new Error(`"initialValue" of "${selectedRule.identifier}" must not be an object - use a factory function!`); } - let initialValue: any = null; // null as sensitive default... - if (typeof selectedRule.initialValue === 'function') { - // Use factory function - initialValue = selectedRule.initialValue(); - } - + let value: any = null; // null as sensitive default... if (typeof selectedRule.initialValue !== 'undefined') { - // If it exists use the primitive value - ({ initialValue } = selectedRule); + // If a valid has been passed along, use it + value = selectedRule.initialValue; + } + if (typeof value === 'function') { + // initialValue is a factory function + value = value(); } children.push({ identifier: selectedRule.identifier, - value: initialValue, + value, } as Rule); this.$emit( From 6df69d2ea90b9677c045441206e09e26ea36a500 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 13 Feb 2020 19:43:03 +0100 Subject: [PATCH 2/2] Add regression test for rules with factory function --- tests/unit/query-builder.spec.ts | 43 +++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/tests/unit/query-builder.spec.ts b/tests/unit/query-builder.spec.ts index 1471282..a576a81 100644 --- a/tests/unit/query-builder.spec.ts +++ b/tests/unit/query-builder.spec.ts @@ -4,9 +4,15 @@ import QueryBuilder from '@/QueryBuilder.vue'; import App from '../components/App.vue'; import QueryBuilderGroup from '@/QueryBuilderGroup.vue'; import QueryBuilderRule from '@/QueryBuilderRule.vue'; +import { QueryBuilderConfig } from '@/types'; + +interface QueryBuilderTemplate { + value: any, + config: QueryBuilderConfig, +} describe('Test basic functionality of QueryBuilder.vue', () => { - const getTemplate = () => ({ + const getTemplate = (): QueryBuilderTemplate => ({ value: null, config: { operators: [ @@ -114,6 +120,41 @@ describe('Test basic functionality of QueryBuilder.vue', () => { }); }); + it('makes use of an initial value\'s factory function', () => { + const initialValue = jest.fn(() => 'Hello World'); + + const data = getTemplate(); + data.config.rules = [ + { + identifier: 'txt', + name: 'Text Selection', + component: Component, + initialValue, + }, + ]; + + const app = mount(App, { + data() { + return data; + }, + }); + const wrapper = app.find(QueryBuilder); + + // Assert rules are available + const rules = wrapper.find('.query-builder-group__group-control select').findAll('option'); + const addRuleBtn = wrapper.find('.query-builder-group__rule-adding-button'); + + // Assert update has propagated with default value + rules.at(1).setSelected(); + addRuleBtn.trigger('click'); + expect(wrapper.emittedByOrder()).toHaveLength(1); + expect(wrapper.emittedByOrder()[0]).toStrictEqual({ + name: 'input', + args: [{ operatorIdentifier: 'and', children: [{ identifier: 'txt', value: 'Hello World' }] }], + }); + expect(initialValue).toHaveBeenCalled(); + }); + it('deletes a rule', () => { const data = () => ({ query: {