import React from 'react';
import { render } from '@testing-library/react';
import { PageContext } from '../..';
import { Sidecar } from '../index';

// Sidecar version of the modal teardown guard (SidecarCustom defaults to 333ms).
// See modal/__tests__/closeTimeoutTeardown.spec.tsx for the full explanation.
describe('Sidecar close-timeout teardown safety', () => {
    test('does not defer a portal removal that touches document after teardown', async () => {
        const errors: unknown[] = [];
        const onUncaught = (err: unknown) => errors.push(err);
        process.on('uncaughtException', onUncaught);
        const realDocument = globalThis.document;

        try {
            const { unmount } = render(
                <Sidecar isOpen onRequestClose={() => undefined} header="repro">
                    body
                </Sidecar>,
                {
                    wrapper: ({ children }) => (
                        <div className="TestPage PageContainer">
                            <PageContext.Provider value={{ className: 'TestPage' }}>
                                {children}
                            </PageContext.Provider>
                        </div>
                    ),
                }
            );

            unmount();

            // @ts-expect-error intentionally removing document to mimic env teardown
            delete globalThis.document;

            await new Promise((resolve) => setTimeout(resolve, 400));

            expect(errors).toEqual([]);
        } finally {
            globalThis.document = realDocument;
            process.off('uncaughtException', onUncaught);
        }
    });
});
