import React from 'react'; import { cleanup, render, screen } from '@testing-library/react'; import { expect } from 'chai'; import type { AllPreferences } from './'; import preferences, { withPreferences } from './index'; import sinon from 'sinon'; function TestComponent(props: { outerProp: number; enableMaps: boolean }) { return
{JSON.stringify(props)}
; } class TestComponentClass extends React.Component { constructor(props: { outerProp: number; enableMaps: boolean }) { super(props); } render() { return
{JSON.stringify(this.props)}
; } } describe('React integration', function () { const sandbox = sinon.createSandbox(); afterEach(function () { cleanup(); return sandbox.restore(); }); it('allows reading preference values and accounts for updates', function () { const callbacks: any = {}; sandbox.stub(preferences, 'getPreferences').returns({ enableMaps: true, trackUsageStatistics: true, enableFeedbackPanel: true, } as Partial as any); sandbox .stub(preferences, 'onPreferenceValueChanged') .callsFake((key, cb) => { callbacks[key] ??= []; callbacks[key].push(cb); return () => { const index = callbacks[key].indexOf(cb); if (index !== -1) callbacks[key].splice(index, 1); }; }); const WrappedComponent = withPreferences( TestComponent, ['enableMaps', 'trackUsageStatistics'], React ); render(); const contents = screen.getByTestId('props-as-json'); expect(JSON.parse(String(contents.textContent))).to.deep.equal({ outerProp: 42, enableMaps: true, trackUsageStatistics: true, }); expect(callbacks.trackUsageStatistics).to.have.lengthOf(1); callbacks.trackUsageStatistics[0](false); expect(JSON.parse(String(contents.textContent))).to.deep.equal({ outerProp: 42, enableMaps: true, trackUsageStatistics: false, }); cleanup(); expect(callbacks.trackUsageStatistics).to.have.lengthOf(0); }); it('works with class components', function () { sandbox.stub(preferences, 'getPreferences').returns({ enableMaps: true, trackUsageStatistics: true, enableFeedbackPanel: true, } as Partial as any); const WrappedComponent = withPreferences( TestComponentClass, ['enableMaps', 'trackUsageStatistics'], React ); render(); const contents = screen.getByTestId('props-as-json'); expect(JSON.parse(String(contents.textContent))).to.deep.equal({ outerProp: 42, enableMaps: true, trackUsageStatistics: true, }); }); });