import React, {JSX} from 'react'; import {initialize, mockInstances} from '@googlemaps/jest-mocks'; import {cleanup, render} from '@testing-library/react'; import {APIProvider} from '../api-provider'; import {Map as GoogleMap} from '../map'; import {AdvancedMarker} from '../advanced-marker'; import {Pin, PinProps} from '../pin'; import {waitForSpy} from './__utils__/wait-for-spy'; jest.mock('../../libraries/google-maps-api-loader'); let wrapper: ({children}: {children: React.ReactNode}) => JSX.Element | null; let createMarkerSpy: jest.Mock< void, [google.maps.marker.AdvancedMarkerElementOptions] >; let createPinElementSpy: jest.Mock< void, [google.maps.marker.PinElementOptions] >; beforeEach(() => { initialize(); // Create wrapper component wrapper = ({children}: {children: React.ReactNode}) => ( {children} ); createMarkerSpy = jest.fn(); google.maps.marker.AdvancedMarkerElement = class extends ( google.maps.marker.AdvancedMarkerElement ) { constructor(options: google.maps.marker.AdvancedMarkerElementOptions) { createMarkerSpy(options); super(options); } }; createPinElementSpy = jest.fn(); google.maps.marker.PinElement = class extends google.maps.marker.PinElement { __options: google.maps.marker.PinElementOptions; constructor(options: google.maps.marker.PinElementOptions) { super(options); this.__options = options; createPinElementSpy(options); } }; }); afterEach(() => { cleanup(); jest.restoreAllMocks(); }); test('pin view logs an error when used outside of AdvancedMarker', async () => { const errorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); render(, { wrapper }); // expect an error-message to be written to console const errorArgs = await waitForSpy(errorSpy); expect(errorArgs).toMatchSnapshot(); // assert that no instance was created expect(mockInstances.get(google.maps.marker.PinElement)).toHaveLength(0); }); // skipped due to a broken implementation of Pin in @googlemaps/jest-mocks xtest('props are passed to Pin instance', async () => { const pinViewProps: PinProps = { background: 'yellow', borderColor: 'green' }; const {rerender} = render( , { wrapper } ); await waitForSpy(createPinElementSpy); expect(createMarkerSpy).toHaveBeenCalled(); expect(createPinElementSpy).toHaveBeenCalled(); expect(createPinElementSpy.mock.lastCall![0]).toEqual(pinViewProps); rerender( ); const [lastOptions] = createPinElementSpy.mock.lastCall!; expect(lastOptions.background).toEqual('blue'); expect(lastOptions.borderColor).toEqual('black'); expect(lastOptions.scale).toEqual(1.2); });