import { render, screen } from '@testing-library/react';
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import React from 'react';
// Use doMock to avoid hoisting issues and potential caching conflicts
vi.doMock('../google-maps-loader', () => ({
useGoogleMapsLoader: () => ({
isLoaded: true,
loadError: undefined,
load: async () => {},
}),
}));
describe('Map', () => {
let Map: any;
const mockMap = {
setCenter: vi.fn(),
setZoom: vi.fn(),
addListener: vi.fn(() => ({ remove: vi.fn() })),
};
const mockInfoWindow = {
open: vi.fn(),
close: vi.fn(),
setContent: vi.fn(),
addListener: vi.fn(() => ({ remove: vi.fn() })),
};
beforeEach(async () => {
vi.clearAllMocks();
// Dynamically import Map after doMock
const module = await import('./map');
Map = module.Map;
// Mock Google Maps Globals
global.google = {
maps: {
Map: vi.fn(function () {
return mockMap;
}),
InfoWindow: vi.fn(function () {
return mockInfoWindow;
}),
Circle: vi.fn(function () {
return { setMap: vi.fn() };
}),
Polygon: vi.fn(function () {
return { setMap: vi.fn() };
}),
marker: {
AdvancedMarkerElement: vi.fn(),
},
},
} as any;
});
afterEach(() => {
delete (global as any).google;
vi.resetModules();
});
it('renders correctly when loaded', () => {
render();
const mapElement = document.querySelector('gmp-map');
expect(mapElement).toBeInTheDocument();
});
it('renders markers correctly', () => {
const markers = [
{ position: { lat: 10, lng: 20 }, title: 'Marker 1' },
{ position: { lat: 30, lng: 40 }, title: 'Marker 2' },
];
render();
const advancedMarkers = document.querySelectorAll('gmp-advanced-marker');
expect(advancedMarkers.length).toBe(2);
expect(advancedMarkers[0]).toHaveAttribute('title', 'Marker 1');
});
});