From 6410892f2ecb962d024d011df94a7e9ddd569b5a Mon Sep 17 00:00:00 2001 From: Vemparala Surya Vamsi <121419957+vsvamsi1@users.noreply.github.com> Date: Tue, 28 Mar 2023 20:03:29 +0530 Subject: [PATCH] chore: [one click binding] Create a registry to maintain the list of the widget query generators (#21764) ## Description Basic code to build datasource registry for one click binding. Fixes #21506 ## Type of change - New feature (non-breaking change which adds functionality) ## How Has This Been Tested? - Jest ### Test Plan > Add Testsmith test cases links that relate to this PR ### Issues raised during DP testing > Link issues raised during DP testing for better visiblity and tracking (copy link from comments dropped on this PR) ## Checklist: ### Dev activity - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my own code - [x] I have commented my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] PR is being merged under a feature flag ### QA activity: - [ ] Test plan has been approved by relevant developers - [ ] Test plan has been peer reviewed by QA - [ ] Cypress test cases have been added and approved by either SDET or manual QA - [ ] Organized project review call with relevant stakeholders after Round 1/2 of QA - [ ] Added Test Plan Approved label after reveiwing all Cypress test --- .../WidgetQueryGeneratorRegistry.test.ts | 32 +++++++++++++++++ .../src/utils/WidgetQueryGeneratorRegistry.ts | 36 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 app/client/src/utils/WidgetQueryGeneratorRegistry.test.ts create mode 100644 app/client/src/utils/WidgetQueryGeneratorRegistry.ts diff --git a/app/client/src/utils/WidgetQueryGeneratorRegistry.test.ts b/app/client/src/utils/WidgetQueryGeneratorRegistry.test.ts new file mode 100644 index 0000000000..d9e878d4f4 --- /dev/null +++ b/app/client/src/utils/WidgetQueryGeneratorRegistry.test.ts @@ -0,0 +1,32 @@ +import WidgetQueryGeneratorRegistry from "./WidgetQueryGeneratorRegistry"; + +describe("WidgetQueryGeneratorRegistry", () => { + const somepluginId = "somePluginId"; + + it("should be able to register a QueryGenerator", () => { + const someQueryGenerator = {}; + + WidgetQueryGeneratorRegistry.register(somepluginId, someQueryGenerator); + expect(WidgetQueryGeneratorRegistry.get(somepluginId)).toBeTruthy(); + }); + + it("should return a falsey value when searching for an non existing generator", () => { + const nonExistingQueryGeneratopr = "someId"; + expect( + WidgetQueryGeneratorRegistry.get(nonExistingQueryGeneratopr), + ).toBeFalsy(); + }); + + it("should return the same adaptor reference when querying the same pluginId", () => { + const adaptor = WidgetQueryGeneratorRegistry.get(somepluginId); + expect(adaptor).toBe(WidgetQueryGeneratorRegistry.get(somepluginId)); + }); + it("should not find the registered plugin after clearing the registry", () => { + WidgetQueryGeneratorRegistry.clear(); + expect(WidgetQueryGeneratorRegistry.get(somepluginId)).toBeFalsy(); + }); + + afterAll(() => { + WidgetQueryGeneratorRegistry.clear(); + }); +}); diff --git a/app/client/src/utils/WidgetQueryGeneratorRegistry.ts b/app/client/src/utils/WidgetQueryGeneratorRegistry.ts new file mode 100644 index 0000000000..1baea40574 --- /dev/null +++ b/app/client/src/utils/WidgetQueryGeneratorRegistry.ts @@ -0,0 +1,36 @@ +import { error } from "loglevel"; + +export default class WidgetQueryGeneratorRegistry { + private static queryGeneratorMap = new Map(); + + static register(pluginId: string, queryGenerator: any) { + if (this.queryGeneratorMap.has(pluginId)) { + error( + "There is already a widget query generator with the given pluginID:", + pluginId, + ); + + return; + } + + this.queryGeneratorMap.set(pluginId, queryGenerator); + } + + static clear() { + WidgetQueryGeneratorRegistry.queryGeneratorMap.clear(); + } + + static get(pluginId: string) { + const queryAdaptor = this.queryGeneratorMap.get(pluginId); + + if (!queryAdaptor) { + error( + "Couldn't find the query generator with the given pluginId:", + pluginId, + ); + return; + } + + return queryAdaptor; + } +}