balena-supervisor/test/legacy/18-startup.spec.ts
Felipe Lalanne 48e0733c7e Remove side effects for module imports
The supervisor uses the following pattern for async module
initialization

```typescript
// module.ts

export const initialised = (async () => {
    // do some async initialization
})();

// somewhere else
import * as module from 'module';

async function setup() {
  await module.initialise;
}
```

The above pattern means that whenever the module is imported, the
initialisation procedure will be ran, which is an anti-pattern.

This converts any instance of this pattern into a function

```typescript
export const initialised = _.once(async () => {
    // do some async initialization
});
```

And anywhere else on the code it replaces the call with a

```typescript
await module.initialised();
```

Change-type: patch
2022-09-06 15:48:18 -04:00

47 lines
1.5 KiB
TypeScript

import { SinonStub, stub } from 'sinon';
import { expect } from 'chai';
import * as _ from 'lodash';
import * as apiBinder from '~/src/api-binder';
import * as applicationManager from '~/src/compose/application-manager';
import * as deviceState from '~/src/device-state';
import * as constants from '~/src/lib/constants';
import { docker } from '~/lib/docker-utils';
import { Supervisor } from '~/src/supervisor';
describe('Startup', () => {
let startStub: SinonStub;
let vpnStatusPathStub: SinonStub;
let deviceStateStub: SinonStub;
let dockerStub: SinonStub;
before(async () => {
startStub = stub(apiBinder as any, 'start').resolves();
deviceStateStub = stub(deviceState, 'applyTarget').resolves();
// @ts-expect-error
applicationManager.initialized = () => Promise.resolve();
vpnStatusPathStub = stub(constants, 'vpnStatusPath').returns('');
dockerStub = stub(docker, 'listContainers').returns(Promise.resolve([]));
});
after(() => {
startStub.restore();
vpnStatusPathStub.restore();
deviceStateStub.restore();
dockerStub.restore();
});
it('should startup correctly', async () => {
const supervisor = new Supervisor();
await supervisor.init();
// Cast as any to access private properties
const anySupervisor = supervisor as any;
expect(anySupervisor.db).to.not.be.null;
expect(anySupervisor.config).to.not.be.null;
expect(anySupervisor.logger).to.not.be.null;
expect(anySupervisor.deviceState).to.not.be.null;
expect(anySupervisor.apiBinder).to.not.be.null;
});
});