/* Copyright (c) 2022 Betim Beja and Shko Online LLC Licensed under the MIT license. */ import type { SinonStub } from 'sinon'; import type { ShkoOnline } from '../ShkoOnline'; import type { MockToRaw, PropertyMap, PropertyToMock } from './PropertyTypes'; import { stub } from 'sinon'; import { MetadataDB } from '../ComponentFramework-Mock-Generator'; import { ClientMock } from './Client.mock'; import { CopilotMock } from './Copilot.mock'; import { DeviceMock } from './Device.mock'; import { FactoryMock } from './Factory.mocks'; import { FluentDesignStateMock } from './FluentDesignState.mock'; import { FormattingMock } from './Formatting.mock'; import { ModeMock } from './Mode.mock'; import { NavigationMock } from './Navigation.mock'; import { ResourcesMock } from './Resources.mock'; import { UserSettingsMock } from './UserSettings.mock'; import { UtilityMock } from './Utility.mock'; import { WebApiMock } from './WebApi.mock'; import { EventsBagMock } from './EventsBag.mock'; export class ContextMock,TEvents = ComponentFramework.IEventBag> implements ComponentFramework.Context { client: ClientMock; copilot: CopilotMock; device: DeviceMock; factory: FactoryMock; formatting: FormattingMock; mode: ModeMock; navigation: NavigationMock; parameters: IInputs; _parameters: PropertyToMock; _SetCanvasItems: SinonStub<[items: Partial>>], void>; resources: ResourcesMock; userSettings: UserSettingsMock; utils: UtilityMock; webAPI: WebApiMock; updatedProperties: string[]; fluentDesignLanguage?: FluentDesignStateMock; events: TEvents; constructor(inputs: PropertyMap, db: MetadataDB) { this.updatedProperties = []; this.events = new EventsBagMock() as TEvents; this.client = new ClientMock(); this.copilot = new CopilotMock(); this.device = new DeviceMock(); this.factory = new FactoryMock(); this.formatting = new FormattingMock(); this.fluentDesignLanguage = new FluentDesignStateMock(); this.mode = new ModeMock(); this.navigation = new NavigationMock(); this.parameters = {} as IInputs; this._parameters = {} as PropertyToMock; this._SetCanvasItems = stub(); this._SetCanvasItems.callsFake((parameters) => { const mappedParameters: { [key: string]: any } = {}; Object.getOwnPropertyNames>(this._parameters).forEach((propertyName) => { const parameter = this._parameters[propertyName]; if (propertyName in parameters) { mappedParameters[parameter._boundColumn] = parameters[propertyName as unknown as keyof typeof parameters]; } }); db.initCanvasItems([mappedParameters]); }); const CanvasEntity = db.getTableMetadata(MetadataDB.CanvasLogicalName) ?? ({ LogicalName: MetadataDB.CanvasLogicalName, EntitySetName: MetadataDB.CanvasLogicalName, Attributes: [], } as ShkoOnline.EntityMetadata); Object.getOwnPropertyNames>(inputs).forEach((propertyName) => { const parameterClass = inputs[propertyName] as unknown as new ( propertyName: string, db: MetadataDB, CanvasEntity: ShkoOnline.EntityMetadata, ) => PropertyToMock[keyof IInputs]; const parameter = new parameterClass(propertyName as string, db, CanvasEntity); this._parameters[propertyName] = parameter; this.parameters[propertyName] = parameter as unknown as IInputs[keyof IInputs]; }); db.initMetadata([CanvasEntity]); this.resources = new ResourcesMock(); this.userSettings = new UserSettingsMock(); this.utils = new UtilityMock(); this.webAPI = new WebApiMock(db, this.formatting); } } declare global { interface ObjectConstructor { getOwnPropertyNames(o: T): (keyof T)[]; } }