|
1 | 1 | import type { EvaluationContext} from '@openfeature/web-sdk'; |
2 | | -import { InMemoryProvider, OpenFeature } from '@openfeature/web-sdk'; |
| 2 | +import { InMemoryProvider, OpenFeature, ProviderEvents } from '@openfeature/web-sdk'; |
3 | 3 | import '@testing-library/jest-dom'; // see: https://testing-library.com/docs/react-testing-library/setup |
4 | 4 | import { render, renderHook, screen, waitFor, fireEvent, act } from '@testing-library/react'; |
5 | 5 | import * as React from 'react'; |
@@ -310,32 +310,46 @@ describe('OpenFeatureProvider', () => { |
310 | 310 | const DOMAIN = 'mutate-context-with-function'; |
311 | 311 | OpenFeature.setProvider(DOMAIN, suspendingProvider(), { done: false }); |
312 | 312 |
|
| 313 | + const reconcile = jest.fn(); |
| 314 | + OpenFeature.getClient(DOMAIN).addHandler(ProviderEvents.Reconciling, reconcile); |
| 315 | + |
313 | 316 | const setter = jest.fn((prevContext: EvaluationContext) => ({ ... prevContext, user: '[email protected]' })); |
314 | 317 | render( |
315 | 318 | <OpenFeatureProvider domain={DOMAIN}> |
316 | | - <React.Suspense fallback={<div>{FALLBACK}</div>}> |
317 | | - <TestComponent name="Will" setter={setter} /> |
318 | | - </React.Suspense> |
| 319 | + <MutateButton setter={setter} /> |
319 | 320 | </OpenFeatureProvider>, |
320 | 321 | ); |
321 | 322 |
|
322 | | - await waitFor(() => { |
323 | | - expect(screen.getByText('Will says hi')).toBeInTheDocument(); |
324 | | - }); |
325 | | - |
326 | 323 | act(() => { |
327 | 324 | fireEvent.click(screen.getByText('Update Context')); |
328 | 325 | }); |
329 | | - await waitFor( |
330 | | - () => { |
331 | | - expect(screen.getByText('Will says aloha')).toBeInTheDocument(); |
332 | | - }, |
333 | | - { timeout: DELAY * 4 }, |
| 326 | + expect(setter).toHaveBeenCalledTimes(1); |
| 327 | + expect(setter).toHaveBeenCalledWith({ done: false }); |
| 328 | + expect(reconcile).toHaveBeenCalledTimes(1); |
| 329 | + expect(OpenFeature.getContext(DOMAIN)).toEqual({ done: false, user: '[email protected]' }); |
| 330 | + }); |
| 331 | + |
| 332 | + it('should noop if the previous context is passed in unchanged', async () => { |
| 333 | + const DOMAIN = 'mutate-context-noop'; |
| 334 | + OpenFeature.setProvider(DOMAIN, suspendingProvider(), { done: false }); |
| 335 | + |
| 336 | + const reconcile = jest.fn(); |
| 337 | + OpenFeature.getClient(DOMAIN).addHandler(ProviderEvents.Reconciling, reconcile); |
| 338 | + |
| 339 | + const setter = jest.fn((prevContext: EvaluationContext) => prevContext); |
| 340 | + render( |
| 341 | + <OpenFeatureProvider domain={DOMAIN}> |
| 342 | + <MutateButton setter={setter} /> |
| 343 | + </OpenFeatureProvider>, |
334 | 344 | ); |
335 | 345 |
|
| 346 | + act(() => { |
| 347 | + fireEvent.click(screen.getByText('Update Context')); |
| 348 | + }); |
336 | 349 | expect(setter).toHaveBeenCalledTimes(1); |
337 | 350 | expect(setter).toHaveBeenCalledWith({ done: false }); |
338 | | - expect(OpenFeature.getContext(DOMAIN)).toEqual({ done: false, user: '[email protected]' }); |
| 351 | + expect(reconcile).toHaveBeenCalledTimes(0); |
| 352 | + expect(OpenFeature.getContext(DOMAIN)).toEqual({ done: false }); |
339 | 353 | }); |
340 | 354 | }); |
341 | 355 | }); |
0 commit comments