@eclipse-emfcloud/model-service-theia
Version:
Model service Theia
120 lines (95 loc) • 3.61 kB
text/typescript
// *****************************************************************************
// Copyright (C) 2024 STMicroelectronics.
//
// This program and the accompanying materials are made available under the
// terms of the Eclipse Public License v. 2.0 which is available at
// http://www.eclipse.org/legal/epl-2.0.
//
// This Source Code may also be made available under the following Secondary
// Licenses when the conditions for such availability set forth in the Eclipse
// Public License v. 2.0 are satisfied: MIT License which is
// available at https://opensource.org/licenses/MIT.
//
// SPDX-License-Identifier: EPL-2.0 OR MIT
// *****************************************************************************
import { Container, ContainerModule } from '@theia/core/shared/inversify';
import chai, { expect } from 'chai';
import chaiAsPromised from 'chai-as-promised';
import sinon from 'sinon';
import {
FrontendModelHubImpl,
FrontendModelHubProvider,
} from '../frontend-model-hub';
import { bindFrontendModelHubProvider } from '../frontend-model-hub-provider';
import { FrontendModelHubSubscriber } from '../frontend-model-hub-subscriber';
import { FakeModelHubProtocol, connectClient } from './fake-model-hub-protocol';
import { testModule } from './test-module';
chai.use(chaiAsPromised);
function createTestContainer(): Container {
const container = new Container();
container.load(
testModule,
new ContainerModule((bind, unbind) => {
unbind(FrontendModelHubProvider);
bindFrontendModelHubProvider(bind);
})
);
return container;
}
const MODEL1_ID = 'test.model1';
const MODEL1 = { name: 'Model 1' };
describe('FrontendModelHubProvider', () => {
const appContext = 'test-app';
let fake: FakeModelHubProtocol;
let subscriber: FrontendModelHubSubscriber;
let modelHubProvider: FrontendModelHubProvider<string>;
let bombFrontendModelHubImpl: () => void;
beforeEach(async () => {
const container = createTestContainer();
subscriber = container.get<FrontendModelHubSubscriber>(
FrontendModelHubSubscriber
);
modelHubProvider = container.get<FrontendModelHubProvider<string>>(
FrontendModelHubProvider
);
fake = container.get(FakeModelHubProtocol);
fake.setModel(MODEL1_ID, MODEL1);
connectClient(fake, subscriber);
bombFrontendModelHubImpl = () => {
sinon
.stub(
FrontendModelHubImpl.prototype,
'initialize' as unknown as keyof FrontendModelHubImpl
)
.callsFake(() => {
throw new Error('Boom!');
});
};
});
afterEach(() => {
sinon.restore();
});
it('get model hub already available', async () => {
fake.fakeModelHubCreated(appContext);
const modelHub = await modelHubProvider(appContext);
expect(modelHub).to.exist;
});
it('waits for hub to become available', async () => {
setTimeout(() => fake.fakeModelHubCreated('random-context'), 25);
setTimeout(() => fake.fakeModelHubCreated(appContext), 35);
const modelHub = await modelHubProvider(appContext);
expect(modelHub).to.exist;
});
it('handles exception in initialization', async () => {
fake.fakeModelHubCreated(appContext);
bombFrontendModelHubImpl();
const modelHub = modelHubProvider(appContext);
expect(modelHub).eventually.to.be.rejected;
});
it('handles exception in awaited initialization', async () => {
const modelHub = modelHubProvider(appContext);
bombFrontendModelHubImpl();
fake.fakeModelHubCreated(appContext);
expect(modelHub).eventually.to.be.rejected;
});
});