ElectronicBabylonianLiterature/ebl-frontend

View on GitHub
src/fragmentarium/ui/front-page/Fragmentarium.test.tsx

Summary

Maintainability
A
0 mins
Test Coverage
import React from 'react'
import { MemoryRouter, withRouter } from 'react-router-dom'
import { render, screen } from '@testing-library/react'
import SessionContext from 'auth/SessionContext'
import FragmentSearchService from 'fragmentarium/application/FragmentSearchService'
import MemorySession, { Session } from 'auth/Session'
import FragmentService from 'fragmentarium/application/FragmentService'
import Fragmentarium from './Fragmentarium'
import Promise from 'bluebird'
import Bluebird from 'bluebird'
import {
  fragmentFactory,
  fragmentInfoFactory,
} from 'test-support/fragment-fixtures'
import { statisticsFactory } from 'test-support/fragment-data-fixtures'
import { Fragment, FragmentInfo } from 'fragmentarium/domain/fragment'
import WordService from 'dictionary/application/WordService'
import { queryItemOf } from 'test-support/utils'
import { DictionaryContext } from 'dictionary/ui/dictionary-context'

jest.mock('fragmentarium/application/FragmentSearchService')
jest.mock('fragmentarium/application/FragmentService')
jest.mock('dictionary/application/WordService')

const fragmentService = new (FragmentService as jest.Mock<
  jest.Mocked<FragmentService>
>)()
const fragmentSearchService = new (FragmentSearchService as jest.Mock<
  jest.Mocked<FragmentSearchService>
>)()
const wordService = new (WordService as jest.Mock<jest.Mocked<WordService>>)()

let session: Session
let container: Element
let statistics: { transliteratedFragments: number; lines: number }
async function renderFragmentarium() {
  const FragmentariumWithRouter = withRouter<any, typeof Fragmentarium>(
    Fragmentarium
  )
  container = render(
    <MemoryRouter>
      <SessionContext.Provider value={session}>
        <DictionaryContext.Provider value={wordService}>
          <FragmentariumWithRouter
            fragmentService={fragmentService}
            fragmentSearchService={fragmentSearchService}
            wordService={wordService}
          />
        </DictionaryContext.Provider>
      </SessionContext.Provider>
    </MemoryRouter>
  ).container
  await screen.findByText('Current size of the corpus:')
}

beforeEach(() => {
  statistics = statisticsFactory.build()
  fragmentService.statistics.mockReturnValue(Bluebird.resolve(statistics))
  wordService.findAll.mockReturnValue(Promise.resolve([]))
  fragmentService.fetchPeriods.mockReturnValueOnce(Promise.resolve([]))
  fragmentService.fetchGenres.mockReturnValueOnce(Promise.resolve([]))
  fragmentService.fetchProvenances.mockRejectedValueOnce(Promise.resolve([]))
})

describe('Statistics', () => {
  beforeEach(async () => {
    session = new MemorySession([])
    await renderFragmentarium()
  })
  it('Shows the number of transliterated tablets', () => {
    expect(container).toHaveTextContent(
      statistics.transliteratedFragments.toLocaleString()
    )
  })
  it('Shows the number of transliterated lines', () => {
    expect(container).toHaveTextContent(statistics.lines.toLocaleString())
  })
})

describe('Fragment lists', () => {
  let latest: Fragment
  let needsRevision: FragmentInfo

  beforeEach(async () => {
    latest = fragmentFactory.build()
    session = new MemorySession(['read:fragments', 'transliterate:fragments'])
    fragmentService.queryLatest.mockReturnValueOnce(
      Promise.resolve({ items: [queryItemOf(latest)], matchCountTotal: 0 })
    )
    fragmentService.find.mockReturnValueOnce(Promise.resolve(latest))
    needsRevision = fragmentInfoFactory.build()
    fragmentSearchService.fetchNeedsRevision.mockReturnValue(
      Promise.resolve([needsRevision])
    )
    await renderFragmentarium()
  })

  test('Shows the latest additions', () => {
    expect(container).toHaveTextContent(latest.number)
  })

  test('Shows the fragments needing revision.', () => {
    expect(container).toHaveTextContent(needsRevision.number)
  })
})