CheckinCard.test.js 2.58 KB
import { mount } from '@vue/test-utils'
import { describe, it, expect } from 'vitest'
import CheckinCard from '../CheckinCard.vue'

describe('CheckinCard.vue', () => {
  const defaultPost = {
    id: 1,
    user: { name: 'Test User', avatar: '' },
    content: 'Test Content',
    images: [],
    videoList: [],
    audio: [],
    likes: 0,
    is_liked: false,
    is_my: false
  }

  const globalStubs = {
    'van-image': true,
    'van-row': true,
    'van-col': true,
    'van-icon': true,
    'van-image-preview': true,
    'van-tabs': { template: '<div><slot /></div>' },
    'van-tab': { name: 'van-tab', template: '<div><slot /></div>', props: ['title'] },
    'PostCountModel': true,
    'VideoPlayer': true,
    'AudioPlayer': true
  }

  it('renders content correctly', () => {
    const wrapper = mount(CheckinCard, {
      props: { post: defaultPost },
      global: {
        stubs: globalStubs
      }
    })
    expect(wrapper.text()).toContain('Test Content')
  })

  it('shows expand button when content overflows', async () => {
    const wrapper = mount(CheckinCard, {
      props: { post: { ...defaultPost, content: 'Long content...' } },
      global: {
        stubs: globalStubs
      }
    })

    const textEl = wrapper.find('.post-text').element
    Object.defineProperty(textEl, 'scrollHeight', { value: 200, configurable: true })
    Object.defineProperty(textEl, 'clientHeight', { value: 100, configurable: true })

    await wrapper.setProps({ post: { ...defaultPost, content: 'Updated Long Content' } })
    await wrapper.vm.$nextTick()
  })

  it('shows tabs when multiple media types exist', () => {
    const postWithMultiMedia = {
      ...defaultPost,
      images: ['img1.jpg'],
      videoList: [{ id: 1, video: 'vid1.mp4' }],
      audio: []
    }

    const wrapper = mount(CheckinCard, {
      props: { post: postWithMultiMedia },
      global: {
        stubs: globalStubs
      }
    })

    const tabs = wrapper.findAllComponents({ name: 'van-tab' })
    expect(tabs.length).toBe(2)
    expect(tabs[0].props('title')).toBe('图片')
    expect(tabs[1].props('title')).toBe('视频')
  })

  it('does not show tabs when single media type exists', () => {
    const postWithSingleMedia = {
      ...defaultPost,
      images: ['img1.jpg'],
      videoList: [],
      audio: []
    }

    const wrapper = mount(CheckinCard, {
      props: { post: postWithSingleMedia },
      global: {
        stubs: globalStubs
      }
    })

    const tabs = wrapper.findAllComponents({ name: 'van-tab' })
    expect(tabs.length).toBe(0)
    expect(wrapper.find('.post-images').exists()).toBe(true)
  })
})