ElectronicBabylonianLiterature/ebl-frontend

View on GitHub
src/fragmentarium/ui/fragment/References.test.tsx

Summary

Maintainability
A
0 mins
Test Coverage
import React from 'react'
import { render, screen } from '@testing-library/react'
import { Promise } from 'bluebird'
import _ from 'lodash'

import { changeValueByLabel, clickNth, submitForm } from 'test-support/utils'
import References from './References'
import Reference from 'bibliography/domain/Reference'
import {
  buildBorger1957,
  referenceFactory,
} from 'test-support/bibliography-fixtures'
import BibliographyEntry from 'bibliography/domain/BibliographyEntry'

const defaultReference = new Reference()

let container: HTMLElement
let expectedReference: Reference
let references: Reference[]
let searchEntry: BibliographyEntry
let searchBibliography
let updateReferences

beforeEach(async () => {
  searchEntry = buildBorger1957()
  expectedReference = new Reference(
    'COPY',
    '1-2',
    'notes',
    ['1', '2'],
    searchEntry
  )
  searchBibliography = (): Promise<BibliographyEntry[]> =>
    Promise.resolve([searchEntry])
  updateReferences = jest.fn()
})

describe('Edit references', () => {
  beforeEach(async () => {
    references = referenceFactory.buildList(2)
    await renderReferencesAndWait()
  })

  test('Add reference', async () => {
    clickNth(screen, 'Add Reference')
    await submitForm(container)

    expect(updateReferences).toHaveBeenCalledWith([
      ...references,
      defaultReference,
    ])
  })

  test('Delete reference', async () => {
    clickNth(screen, 'Delete Reference')
    await submitForm(container)

    expect(updateReferences).toHaveBeenCalledWith(_.tail(references))
  })

  test('Edit reference', async () => {
    await inputReference()
    await submitForm(container)

    expect(updateReferences).toHaveBeenCalledWith([
      expectedReference,
      ..._.tail(references),
    ])
  })
})

it('Creates a default reference if none present', async () => {
  updateReferences.mockImplementationOnce(() => Promise.resolve())
  references = []
  await renderReferencesAndWait()
  await submitForm(container)

  expect(updateReferences).toHaveBeenCalledWith([defaultReference])
})

function renderReferences(): void {
  container = render(
    <References
      references={references}
      searchBibliography={searchBibliography}
      updateReferences={updateReferences}
    />
  ).container
}

async function renderReferencesAndWait(): Promise<void> {
  renderReferences()
  await screen.findAllByText('Document')
}

async function inputReference(): Promise<void> {
  changeValueByLabel(screen, /ReferenceForm-Document-.*/, 'Borger')
  await screen.findByText(/Borger 1957/)
  clickNth(screen, /Borger 1957/, 0)
  changeValueByLabel(screen, 'Type', 'COPY')
  changeValueByLabel(screen, 'Pages', '1-2')
  changeValueByLabel(screen, 'Notes', 'notes')
  changeValueByLabel(screen, 'Lines Cited', '1,2')
}