import { csEventSubscriber } from '../../core/csEventSubscriber'; import NativeContentsquareModule from '../../core/specs/NativeContentsquareModule'; import { onMetadataChange } from '../../metadata/csqMetadata'; import { CSQMetadata, EventSubscriberType } from '../../types/types'; jest.mock('../../core/csEventSubscriber', () => ({ csEventSubscriber: jest.fn(), })); jest.mock('../../core/specs/NativeContentsquareModule', () => ({ __esModule: true, default: { setOnMetadataChange: jest.fn(), }, })); describe('csqMetadata', () => { beforeEach(() => { jest.clearAllMocks(); }); describe('onMetadataChange', () => { it('should subscribe to metadata change events and call setOnMetadataChange', () => { // Given const mockCallback = jest.fn(); const mockRemoveListener = { remove: jest.fn() }; (csEventSubscriber as jest.Mock).mockReturnValue(mockRemoveListener); // When const unsubscribe = onMetadataChange(mockCallback); // Then expect(csEventSubscriber).toHaveBeenCalledWith( EventSubscriberType.ON_META_DATA_CHANGE, expect.any(Function) ); expect(NativeContentsquareModule.setOnMetadataChange).toHaveBeenCalled(); expect(typeof unsubscribe).toBe('function'); }); it('should invoke callback with CSQMetadata object', () => { // Given const mockCallback = jest.fn(); const mockRemoveListener = { remove: jest.fn() }; (csEventSubscriber as jest.Mock).mockReturnValue(mockRemoveListener); const mockMetadata: CSQMetadata = { userID: 'user123', sessionID: 'session456', identity: 'john.doe@example.com', environmentID: 'prod', projectID: 'project789', sessionReplayURL: 'https://example.com/replay/session456', }; // When onMetadataChange(mockCallback); // Get the subscriber callback const subscriberCallback = (csEventSubscriber as jest.Mock).mock .calls[0][1]; subscriberCallback(mockMetadata); // Then expect(mockCallback).toHaveBeenCalledWith(mockMetadata); expect(mockCallback).toHaveBeenCalledTimes(1); }); it('should handle metadata with null values', () => { // Given const mockCallback = jest.fn(); const mockRemoveListener = { remove: jest.fn() }; (csEventSubscriber as jest.Mock).mockReturnValue(mockRemoveListener); const mockMetadata: CSQMetadata = { userID: null, sessionID: 'session789', identity: null, environmentID: 'staging', projectID: null, sessionReplayURL: null, }; // When onMetadataChange(mockCallback); // Get the subscriber callback const subscriberCallback = (csEventSubscriber as jest.Mock).mock .calls[0][1]; subscriberCallback(mockMetadata); // Then expect(mockCallback).toHaveBeenCalledWith(mockMetadata); expect(mockCallback).toHaveBeenCalledTimes(1); }); it('should handle metadata with all null values', () => { // Given const mockCallback = jest.fn(); const mockRemoveListener = { remove: jest.fn() }; (csEventSubscriber as jest.Mock).mockReturnValue(mockRemoveListener); const mockMetadata: CSQMetadata = { userID: null, sessionID: null, identity: null, environmentID: null, projectID: null, sessionReplayURL: null, }; // When onMetadataChange(mockCallback); // Get the subscriber callback const subscriberCallback = (csEventSubscriber as jest.Mock).mock .calls[0][1]; subscriberCallback(mockMetadata); // Then expect(mockCallback).toHaveBeenCalledWith(mockMetadata); expect(mockCallback).toHaveBeenCalledTimes(1); }); it('should return an unsubscribe function that removes the listener', () => { // Given const mockCallback = jest.fn(); const mockRemoveListener = { remove: jest.fn() }; (csEventSubscriber as jest.Mock).mockReturnValue(mockRemoveListener); // When const unsubscribe = onMetadataChange(mockCallback); unsubscribe(); // Then expect(mockRemoveListener.remove).toHaveBeenCalled(); expect(mockRemoveListener.remove).toHaveBeenCalledTimes(1); }); it('should handle multiple metadata change events', () => { // Given const mockCallback = jest.fn(); const mockRemoveListener = { remove: jest.fn() }; (csEventSubscriber as jest.Mock).mockReturnValue(mockRemoveListener); const metadata1: CSQMetadata = { userID: 'user1', sessionID: 'session1', identity: 'user1@example.com', environmentID: 'prod', projectID: 'project1', sessionReplayURL: 'https://example.com/replay/session1', }; const metadata2: CSQMetadata = { userID: 'user2', sessionID: 'session2', identity: 'user2@example.com', environmentID: 'staging', projectID: 'project2', sessionReplayURL: 'https://example.com/replay/session2', }; // When onMetadataChange(mockCallback); const subscriberCallback = (csEventSubscriber as jest.Mock).mock .calls[0][1]; subscriberCallback(metadata1); subscriberCallback(metadata2); // Then expect(mockCallback).toHaveBeenCalledTimes(2); expect(mockCallback).toHaveBeenNthCalledWith(1, metadata1); expect(mockCallback).toHaveBeenNthCalledWith(2, metadata2); }); }); });