js-sdk/packages/server/test/transaction-context.spec.ts

64 lines
2.0 KiB
TypeScript

import {
OpenFeature,
AsyncLocalStorageTransactionContextPropagator,
NOOP_TRANSACTION_CONTEXT_PROPAGATOR,
} from '../src';
describe('AsyncLocalStorageTransactionContextPropagator', () => {
beforeAll(() => {
OpenFeature.setTransactionContextPropagator(new AsyncLocalStorageTransactionContextPropagator());
});
afterAll(() => {
OpenFeature.setTransactionContextPropagator(NOOP_TRANSACTION_CONTEXT_PROPAGATOR);
});
it('should return given transaction context in callback', (done) => {
OpenFeature.setTransactionContext({ targetingKey: 'my-key' }, async () => {
expect(OpenFeature.getTransactionContext()).toEqual({ targetingKey: 'my-key' });
done();
});
});
it('should not return transaction context in callstack root', (done) => {
let resolve1: (value?: unknown) => unknown = jest.fn();
const promise1 = new Promise((resolve) => {
resolve1 = resolve;
});
OpenFeature.setTransactionContext({ targetingKey: 'my-key' }, async () => {
expect(OpenFeature.getTransactionContext()).toEqual({ targetingKey: 'my-key' });
await promise1;
done();
});
expect(OpenFeature.getTransactionContext()).toEqual({});
resolve1();
});
it('should use the assigned transaction contexts for concurrent promises', (done) => {
let resolve1: (value?: unknown) => unknown = jest.fn();
const promise1 = new Promise((resolve) => {
resolve1 = resolve;
});
let resolve2: (value?: unknown) => unknown = jest.fn();
const promise2 = new Promise((resolve) => {
resolve2 = resolve;
});
OpenFeature.setTransactionContext({ targetingKey: 'promise-1' }, async () => {
expect(OpenFeature.getTransactionContext()).toEqual({ targetingKey: 'promise-1' });
resolve2();
await promise1;
done();
});
OpenFeature.setTransactionContext({ targetingKey: 'promise-2' }, async () => {
expect(OpenFeature.getTransactionContext()).toEqual({ targetingKey: 'promise-2' });
await promise2;
resolve1();
});
});
});