stakwork / sphinx-nav-fiber

14 stars 47 forks source link

[Component Tests] Media - Sidebar #872

Closed tomsmith8 closed 8 months ago

tomsmith8 commented 9 months ago

Task

Write tests for the file src/components/App/SideBar/Media/index.tsx

Boiler plate example:

import React from 'react';
import { render, fireEvent } from '@testing-library/react';
import '@testing-library/jest-dom';
import Media from './Media'; // Update the import path according to your file structure
import * as DataStore from '~/stores/useDataStore';
import { formatDescription } from '~/utils/formatDescription';

jest.mock('~/utils/formatDescription');
jest.mock('~/stores/useDataStore');

describe('Media Component Tests', () => {
  const mockNode = {
    link: 'http://example.com',
    image_url: 'http://example.com/image.png',
    date: '2021-01-01',
    boost: 10,
    node_type: 'episode',
    type: 'video',
    id: '1',
    show_title: 'Example Show Title',
    episode_title: 'Example Episode Title',
    ref_id: 'ref1',
  };

  beforeEach(() => {
    // Mock the `useDataStore` to return the mockNode as selectedNode by default
    DataStore.useDataStore.mockImplementation(() => ({ selectedNode: mockNode }));

    // Mock the formatDescription utility function
    formatDescription.mockImplementation((desc) => `Formatted: ${desc}`);
  });

  it('Renders nothing if selectedNode is not provided and no node prop is passed', () => {
    DataStore.useDataStore.mockImplementation(() => ({ selectedNode: null }));
    const { container } = render(<Media />);
    expect(container).toBeEmptyDOMElement();
  });

  it('Renders the Episode component with correct props derived from the node or selectedNode', () => {
    const { getByText } = render(<Media />);
    expect(getByText(`Formatted: ${mockNode.episode_title}`)).toBeInTheDocument();
  });

  it('Correctly formats and displays the episodeTitle using formatDescription', () => {
    render(<Media node={mockNode} />);
    expect(formatDescription).toHaveBeenCalledWith(mockNode.episode_title);
  });

  it('Displays the BoostAmt component with the correct boostAmount', () => {
    const { getByText } = render(<Media />);
    expect(getByText(mockNode.boost.toString())).toBeInTheDocument(); // Assuming BoostAmt displays the boost amount
  });

  it('Renders the Booster component with appropriate props including content, count, refId, and a function to update the boost amount', () => {
    // This test might require checking the Booster's props directly or assuming behavior based on its effects (e.g., boost amount change).
    console.warn('Direct prop checking in child components may not be straightforward without specific tools or patterns like prop drilling or context.');
  });

  it('Renders Description component with the selectedNode', () => {
    const { getByText } = render(<Media />);
    // Assuming Description component displays some text based on the selectedNode
    expect(getByText('Description for: Example Episode Title')).toBeInTheDocument();
  });

  it('Renders Transcript component with the selectedNode', () => {
    const { getByText } = render(<Media />);
    // Assuming Transcript component displays some text based on the selectedNode
    expect(getByText('Transcript for: Example Episode Title')).toBeInTheDocument();
  });

  it('Initializes boostAmount state with the boost value from the node or selectedNode', () => {
    const { getByText } = render(<Media />);
    expect(getByText(mockNode.boost.toString())).toBeInTheDocument();
  });

  it('Updates boostAmount state correctly when Booster component triggers updateCount', () => {
    // Implementing this test requires simulating the Booster component's updateCount function and checking if the state updates accordingly.
    console.warn('This specific test case requires interaction simulation and may be better suited for integration or E2E testing.');
  });

  it('Confirms that useDataStore hook is called to obtain selectedNode', () => {
    render(<Media />);
    expect(DataStore.useDataStore).toHaveBeenCalled();
  });

  it('Verifies the component reacts correctly to changes in selectedNode from useDataStore', () => {
    // This test would involve changing the mock return value of useDataStore and potentially rerendering the component.
    console.warn('Reacting to hook changes in tests can be complex and might require advanced mocking or component restructuring.');
  });

  it('Ensures that the Episode, BoostAmt, Booster, Description, and Transcript components receive updated props when selectedNode changes', () => {
    // Similar to the above,

Acceptance Criteria

hangman32 commented 9 months ago

@tomsmith8 Can I get this?

tomsmith8 commented 9 months ago

Sure thing! @Knight0p6