@shko.online/componentframework-mock
Version:
Mocking library to help with testing PowerApps Component Framework Components
101 lines (96 loc) • 4.27 kB
text/typescript
/*
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<IInputs extends ShkoOnline.PropertyTypes<IInputs>,TEvents = ComponentFramework.IEventBag>
implements ComponentFramework.Context<IInputs, TEvents>
{
client: ClientMock;
copilot: CopilotMock;
device: DeviceMock;
factory: FactoryMock;
formatting: FormattingMock;
mode: ModeMock;
navigation: NavigationMock;
parameters: IInputs;
_parameters: PropertyToMock<IInputs>;
_SetCanvasItems: SinonStub<[items: Partial<MockToRaw<IInputs, PropertyToMock<IInputs>>>], void>;
resources: ResourcesMock;
userSettings: UserSettingsMock;
utils: UtilityMock;
webAPI: WebApiMock;
updatedProperties: string[];
fluentDesignLanguage?: FluentDesignStateMock;
events: TEvents;
constructor(inputs: PropertyMap<IInputs>, 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<IInputs>;
this._SetCanvasItems = stub();
this._SetCanvasItems.callsFake((parameters) => {
const mappedParameters: { [key: string]: any } = {};
Object.getOwnPropertyNames<PropertyToMock<IInputs>>(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<PropertyMap<IInputs>>(inputs).forEach((propertyName) => {
const parameterClass = inputs[propertyName] as unknown as new (
propertyName: string,
db: MetadataDB,
CanvasEntity: ShkoOnline.EntityMetadata,
) => PropertyToMock<IInputs>[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<T>(o: T): (keyof T)[];
}
}