ElectronicBabylonianLiterature/ebl-frontend

View on GitHub
src/signs/ui/search/Signs.test.tsx

Summary

Maintainability
B
4 hrs
Test Coverage
import React from 'react'
import { render, screen } from '@testing-library/react'
import { MemoryRouter, withRouter } from 'react-router-dom'
import Promise from 'bluebird'
import SessionContext from 'auth/SessionContext'
import MemorySession from 'auth/Session'
import SignService from 'signs/application/SignService'
import Signs from 'signs/ui/search/Signs'
import { OrderedSignFactory, signFactory } from 'test-support/sign-fixtures'

jest.mock('signs/application/SignService')

const SignsWithRouter = withRouter<any, typeof Signs>(Signs)

const signs = signFactory.buildList(2)
const orderedSigns = OrderedSignFactory.build()
const signService = new (SignService as jest.Mock<jest.Mocked<SignService>>)()
let session: MemorySession

describe('Searching for word', () => {
  beforeEach(() => {
    session = new MemorySession(['read:words'])
    signService.search.mockReturnValue(Promise.resolve(signs))
    signService.findSignsByOrder.mockReturnValue(Promise.resolve(orderedSigns))
  })
  it('displays result on successfull query', async () => {
    const value = signs[1].values[0]
    await renderSigns(
      `/signs?sign=${value.value}&subIndex=1&value=${value.value}`
    )
    expect(
      screen.getAllByText(new RegExp(`${value.value}`))[0]
    ).toBeInTheDocument()
    expect(screen.getByLabelText('Query')).toHaveValue(value.value)
  })
  it('displays empty search if no query', async () => {
    await renderSigns('/signs')
    expect(screen.getByLabelText('Query')).toHaveValue('')
  })
})

it('Displays a message if user is not logged in', async () => {
  session = new MemorySession([])
  await renderSigns('/signs')
  expect(screen.getByText('Please log in to search for Signs.')).toBeVisible()
})

async function renderSigns(path: string): Promise<void> {
  render(
    <MemoryRouter initialEntries={[path]}>
      <SessionContext.Provider value={session}>
        <SignsWithRouter signService={signService} />
      </SessionContext.Provider>
    </MemoryRouter>
  )
  await screen.findAllByText('Signs')
}