resources/assets/js/components/ui/LyricsPane.spec.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { expect, it } from 'vitest'
import UnitTestCase from '@/__tests__/UnitTestCase'
import factory from '@/__tests__/factory'
import { eventBus } from '@/utils'
import { screen } from '@testing-library/vue'
import LyricsPane from './LyricsPane.vue'
import Magnifier from '@/components/ui/Magnifier.vue'

new class extends UnitTestCase {
  protected test () {
    it('renders', () => expect(this.renderComponent().html()).toMatchSnapshot())

    it('provides a button to add lyrics if current user is admin', async () => {
      const song = factory('song', { lyrics: null })

      const mock = this.mock(eventBus, 'emit')
      this.beAdmin().renderComponent(song)

      await this.user.click(screen.getByRole('button', { name: 'Click here' }))

      expect(mock).toHaveBeenCalledWith('MODAL_SHOW_EDIT_SONG_FORM', song, 'lyrics')
    })

    it('does not have a button to add lyrics if current user is not an admin', async () => {
      this.be().renderComponent(factory('song', { lyrics: null }))
      expect(screen.queryByRole('button', { name: 'Click here' })).toBeNull()
    })
  }

  private renderComponent (song?: Song) {
    song = song || factory('song', {
      lyrics: 'Foo bar baz qux'
    })

    return this.render(LyricsPane, {
      props: {
        song
      },
      global: {
        stubs: {
          Magnifier
        }
      }
    })
  }
}