import React, { forwardRef } from 'react';
import { render, waitFor } from '@testing-library/react';
import { PluginRender } from './Plugin';
import { ResourceBrowserPluginType } from '../types';
import * as RBI from '../ResourceBrowserInput/ResourceBrowserInput';
import * as RBInlineButton from '../ResourceBrowserInlineButton/ResourceBrowserInlineButton';
import * as AuthContext from '../ResourceBrowserContext/AuthProvider';
jest.spyOn(RBI, 'ResourceBrowserInput');
jest.mock('../ResourceBrowserInlineButton/ResourceBrowserInlineButton', () => ({
ResourceBrowserInlineButton: jest.fn(() =>
),
}));
jest.spyOn(AuthContext, 'AuthProvider');
const baseProps = {
type: null,
modalTitle: 'Asset picker',
value: null,
isOtherSourceValue: false,
onChange: jest.fn(),
onClear: jest.fn(),
useResource: () => ({ data: null, error: null, isLoading: false }),
plugin: null,
pluginMode: null,
searchEnabled: false,
source: null,
sources: [],
isLoading: false,
error: null,
setSource: jest.fn(),
isModalOpen: false,
onModalStateChange: jest.fn(),
onRetry: jest.fn(),
};
describe('Plugin', () => {
it('Does not render ResourceBrowserInput if render is false', async () => {
//@ts-ignore
render();
await waitFor(() => {
expect(RBI.ResourceBrowserInput).not.toHaveBeenCalled();
});
});
it('Does render ResourceBrowserInput if render is true', async () => {
const props = baseProps;
render();
await waitFor(() => {
expect(RBI.ResourceBrowserInput).toHaveBeenCalledWith(props, {});
});
});
it('Does render ResourceBrowserInlineButton if inline is true', async () => {
const props = baseProps;
render();
await waitFor(() => {
expect(RBInlineButton.ResourceBrowserInlineButton).toHaveBeenCalledWith({ ...props, inlineType: 'image' }, {});
});
});
it('Wraps content in AuthProvider when source requires auth', async () => {
const sourceWithAuth = {
id: '123',
type: 'dam' as ResourceBrowserPluginType,
configuration: {
authUrl: 'https://example.com/auth',
redirectUrl: 'https://example.com/redirect',
clientId: 'abc123',
scope: 'scope1',
},
};
const props = { ...baseProps, source: sourceWithAuth };
render();
await waitFor(() => {
expect(AuthContext.AuthProvider).toHaveBeenCalledWith({ authConfig: sourceWithAuth, children: expect.anything() }, {});
});
});
it('Wraps content in AuthProvider when alwaysUseResourceRequestProxy is true', async () => {
const sourceWithAuth = {
id: '123',
type: 'dam' as ResourceBrowserPluginType,
configuration: {
alwaysUseResourceRequestProxy: true,
},
};
const props = { ...baseProps, source: sourceWithAuth };
render();
await waitFor(() => {
expect(AuthContext.AuthProvider).toHaveBeenCalledWith({ authConfig: sourceWithAuth, children: expect.anything() }, {});
});
});
});