|
1 | 1 | import { OfrepWebProvider } from './ofrep-web-provider'; |
2 | | -import { OpenFeature } from '@openfeature/web-sdk'; |
3 | 2 | import TestLogger from './test-logger'; |
4 | | -import fetchMock from 'fetch-mock-jest'; |
5 | | -import { ChangePropagationStrategy } from './model/options'; |
| 3 | +// eslint-disable-next-line @nx/enforce-module-boundaries |
| 4 | +import { server } from '../../../../shared/ofrep-core/src/test/mock-service-worker'; |
| 5 | +import { ClientProviderEvents, ClientProviderStatus, OpenFeature } from '@openfeature/web-sdk'; |
6 | 6 |
|
7 | 7 | describe('OFREPWebProvider', () => { |
8 | | - beforeEach(async () => { |
9 | | - fetchMock.mockClear(); |
10 | | - fetchMock.reset(); |
11 | | - }); |
| 8 | + beforeAll(() => server.listen()); |
| 9 | + afterEach(() => server.resetHandlers()); |
| 10 | + afterAll(() => server.close()); |
| 11 | + |
| 12 | + const defaultContext = { |
| 13 | + targetingKey: '21640825-95e7-4335-b149-bd6881cf7875', |
| 14 | + errors: { |
| 15 | + // 403: true, |
| 16 | + }, |
| 17 | + }; |
| 18 | + |
12 | 19 | it('xxx', async () => { |
13 | | - const provider = new OfrepWebProvider('http://localhost:1031/ofrep/', [], { |
14 | | - logger: new TestLogger(), |
15 | | - changePropagationStrategy: ChangePropagationStrategy.POLLING, |
16 | | - pollingOptions: { |
17 | | - interval: 500, |
18 | | - }, |
| 20 | + const providerName = expect.getState().currentTestName || 'test-provider'; |
| 21 | + const provider = new OfrepWebProvider({ baseUrl: 'https://localhost:8080', pollInterval: 100 }, new TestLogger()); |
| 22 | + |
| 23 | + await OpenFeature.setContext(defaultContext); |
| 24 | + await OpenFeature.setProviderAndWait(providerName, provider); |
| 25 | + const client = OpenFeature.getClient(providerName); |
| 26 | + |
| 27 | + client.addHandler(ClientProviderEvents.Ready, (xxx) => { |
| 28 | + console.log(`ready: ${JSON.stringify(xxx)}`); |
19 | 29 | }); |
20 | 30 |
|
21 | | - const evaluateEndpoint = 'http://localhost:1031/ofrep/v1/evaluate'; |
22 | | - const flagChangesEndpoint = 'http://localhost:1031/ofrep/v1/flag/changes'; |
23 | | - const fetchResult = [ |
24 | | - { |
25 | | - key: 'flag1', |
26 | | - metadata: { |
27 | | - additionalProp1: 'xxx', |
28 | | - }, |
29 | | - reason: 'TARGETING_MATCH', |
30 | | - value: 'toto', |
31 | | - variant: 'Variant1', |
32 | | - ETag: '9f9fc0b4', |
33 | | - }, |
34 | | - { |
35 | | - key: 'flag2', |
36 | | - metadata: { |
37 | | - additionalProp1: 'xxx', |
38 | | - }, |
39 | | - reason: 'SPLIT', |
40 | | - value: 'titi', |
41 | | - variant: 'Variant150', |
42 | | - ETag: '6c23a4', |
43 | | - }, |
44 | | - { |
45 | | - key: 'flag3', |
46 | | - metadata: { |
47 | | - additionalProp1: 'xxx', |
48 | | - }, |
49 | | - reason: 'SPLIT', |
50 | | - value: 'titi', |
51 | | - variant: 'Variant150', |
52 | | - ETag: '6c23a4', |
53 | | - }, |
54 | | - ]; |
| 31 | + client.addHandler(ClientProviderEvents.Error, (xxx) => { |
| 32 | + console.log(`error: ${JSON.stringify(xxx)}`); |
| 33 | + }); |
55 | 34 |
|
56 | | - const fetchFlagChanges = [ |
57 | | - { |
58 | | - key: 'flag1', |
59 | | - ETag: '9f9fc0b1', |
60 | | - }, |
61 | | - { |
62 | | - key: 'flag2', |
63 | | - ETag: '6c23a5', |
64 | | - }, |
65 | | - { |
66 | | - key: 'flag3', |
67 | | - errorCode: 'FLAG_NOT_FOUND', |
68 | | - errorDetails: 'Flag not found', |
| 35 | + client.addHandler(ClientProviderEvents.Stale, (xxx) => { |
| 36 | + console.log(`stale: ${JSON.stringify(xxx)}`); |
| 37 | + }); |
| 38 | + |
| 39 | + client.addHandler(ClientProviderEvents.Reconciling, (xxx) => { |
| 40 | + console.log(`Reconciling: ${JSON.stringify(xxx)}`); |
| 41 | + }); |
| 42 | + |
| 43 | + client.addHandler(ClientProviderEvents.ContextChanged, (xxx) => { |
| 44 | + console.log(`ContextChanged: ${JSON.stringify(xxx)}`); |
| 45 | + }); |
| 46 | + |
| 47 | + client.addHandler(ClientProviderEvents.ConfigurationChanged, (xxx) => { |
| 48 | + console.log(`ConfigurationChanged: ${JSON.stringify(xxx)}`); |
| 49 | + }); |
| 50 | + |
| 51 | + console.log(client.getBooleanDetails('bool-flag', true)); |
| 52 | + |
| 53 | + console.log('status:', client.providerStatus); |
| 54 | + |
| 55 | + await OpenFeature.setContext({ |
| 56 | + ...defaultContext, |
| 57 | + errors: { |
| 58 | + 403: true, |
69 | 59 | }, |
70 | | - ]; |
71 | | - |
72 | | - fetchMock.post(evaluateEndpoint, (url, options) => { |
73 | | - const t = JSON.parse(options.body as string).flags as string[]; |
74 | | - if (t.length === 0) { |
75 | | - return fetchResult; |
76 | | - } |
77 | | - return fetchResult.filter((f) => t.includes(f.key)); |
78 | 60 | }); |
79 | | - fetchMock.post(flagChangesEndpoint, fetchFlagChanges, { overwriteRoutes: true }); |
80 | | - await OpenFeature.setContext({ targetingKey: 'user1' }); |
81 | | - await OpenFeature.setProviderAndWait(provider); |
82 | | - const cli = OpenFeature.getClient(); |
83 | | - console.log(cli.getStringDetails('flag1', 'default')); |
84 | | - console.log(cli.getStringDetails('flag3', 'default')); |
| 61 | + |
| 62 | + console.log('status:', client.providerStatus); |
| 63 | + |
| 64 | + console.log(client.getBooleanDetails('bool-flag', false)); |
85 | 65 |
|
86 | 66 | await new Promise((resolve) => setTimeout(resolve, 1000)); |
87 | | - console.log(cli.getStringDetails('flag3', 'default')); |
| 67 | + await OpenFeature.setContext({ |
| 68 | + ...defaultContext, |
| 69 | + email: 'john.doe@goff.org', |
| 70 | + }); |
| 71 | + await OpenFeature.close(); |
| 72 | + await new Promise((resolve) => setTimeout(resolve, 3000)); |
88 | 73 | }); |
89 | 74 | }); |
0 commit comments