import React from 'react' import { render, fireEvent, act } from '@testing-library/react' import ShareLinkButton from '../ShareLinkButton' import { LiveBlogPost } from '../index' const mockClipboardWrite = jest.fn(() => Promise.resolve()) Object.defineProperty(navigator, 'clipboard', { value: { writeText: mockClipboardWrite }, configurable: true, }) describe('Share Link button', () => { const defaultProps = { postId: '0cb263ac-3843-4a22-976a-fcee9b8ba7de', articleUrl: 'https://ft.com/content/e46f26ed-27d1-4291-9709-e1031ba7e781', } beforeEach(() => { mockClipboardWrite.mockClear() jest.useFakeTimers() }) afterEach(() => { jest.runOnlyPendingTimers() jest.useRealTimers() }) it('should render share link button', () => { const { container } = render() expect( container.querySelector('button[data-component="share-link-button"]') ).toBeTruthy() }) it('should construct the correct URL with query parameter and post hash', async () => { const { container } = render() const button = container.querySelector( 'button[data-component="share-link-button"]' ) await act(async () => { button && fireEvent.click(button) }) expect(mockClipboardWrite).toHaveBeenCalledWith( 'https://ft.com/content/e46f26ed-27d1-4291-9709-e1031ba7e781?feature=blog-post-sharing#post-0cb263ac-3843-4a22-976a-fcee9b8ba7de' ) }) // it('should prevent default link behavior', () => { // const { container } = render() // const button = container.querySelector( // 'button[data-component="share-link-button"]' // ) // const event = new MouseEvent('click', { bubbles: true, cancelable: true }) // const preventDefaultSpy = jest.spyOn(event, 'preventDefault') // button?.dispatchEvent(event) // expect(preventDefaultSpy).toHaveBeenCalled() // }) it('should show "Link copied" after clicking', async () => { const { container } = render() const button = container.querySelector( 'button[data-component="share-link-button"]' ) await act(async () => { button && fireEvent.click(button) }) expect(container.querySelector('[data-tooltip="show"]')).toBeTruthy() }) it('should hide "Link copied" message after 8 seconds', async () => { const { container } = render() const button = container.querySelector( 'button[data-component="share-link-button"]' ) await act(async () => { button && fireEvent.click(button) }) act(() => { jest.advanceTimersByTime(8000) }) expect(container.querySelector('[data-tooltip="hide"]')).toBeTruthy() }) }) describe('LiveBlogPost meta container', () => { const defaultProps = { id: '00000000-0000-0000-0000-000000000000', postId: '00000000-0000-0000-0000-000000000000', title: 'Sample Live Blog Post', content: 'This is a sample live blog post.', bodyHTML: '

This is a sample live blog post.

', body: {}, publishedTimestamp: '2024-06-01T12:00:00Z', publishedDate: '2024-06-01T12:00:00Z', isPinned: true, articleUrl: 'https://ft.com/content/00000000-0000-0000-0000-000000000000', showShareButtons: false, showShareLinkButton: false, byline: { tree: {} }, ad: null, indicators: {}, authors: [], } it('should hide the timestamp on pinned posts', () => { const { container } = render( ) expect( container.querySelector('.x-live-blog-post__timestamp-container') ).toBeFalsy() }) it('should show the timestamp on non-pinned posts', () => { const { container } = render( ) expect( container.querySelector('.x-live-blog-post__timestamp-container') ).toBeTruthy() }) it("should render the editor's pick label when the post is pinned", () => { const { container } = render( ) expect( container.querySelector('.x-live-blog-post__label')?.textContent ).toBe("Editor's pick") }) it("should not render the editor's pick label when the post is not pinned", () => { const { container } = render( ) expect( container.querySelector('.x-live-blog-post__label')?.textContent ).not.toBe("Editor's pick") }) })