ElectronicBabylonianLiterature/ebl-frontend

View on GitHub
src/test-support/bibliography-fixtures.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import { Factory } from 'fishery'
import Chance from 'chance'
import Reference, { ReferenceType } from 'bibliography/domain/Reference'
import BibliographyEntry, {
  CslData,
} from 'bibliography/domain/BibliographyEntry'
import { ReferenceDto } from 'bibliography/domain/referenceDto'

const defaultChance = new Chance()

function integer(min: number, max: number, chance?: Chance.Chance): number {
  return (chance || defaultChance).integer({ min: min, max: max })
}

function type(chance = defaultChance): ReferenceType {
  return chance.pickone([
    'EDITION',
    'DISCUSSION',
    'COPY',
    'PHOTO',
    'TRANSLATION',
    'ARCHAEOLOGY',
  ])
}

const authorFactory = Factory.define<
  { given: string; family: string },
  { chance: Chance.Chance }
>(({ transientParams }) => {
  const chance = transientParams.chance ?? defaultChance
  return {
    given: chance.first(),
    family: chance.last(),
  }
})

export const cslDataFactory = Factory.define<
  CslData,
  { chance: Chance.Chance }
>(({ transientParams, associations }) => {
  const chance = transientParams.chance ?? defaultChance
  const issuedDate = chance.date()
  return {
    id: associations.id ?? chance.guid(),
    title: chance.sentence(),
    type: chance.pickone(['article-journal', 'paper-conference']),
    issued: {
      'date-parts': [
        [issuedDate.getFullYear(), issuedDate.getMonth(), issuedDate.getDate()],
      ],
    },
    volume: integer(1, 99, chance),
    page: `${integer(1, 99, chance)}-${integer(100, 999, chance)}`,
    issue: integer(1, 99, chance),
    'container-title': chance.sentence(),
    author: authorFactory.buildList(2, {}, { transient: { chance: chance } }),
    URL: chance.url(),
  }
})

export const cslDataWithContainerTitleShortFactory = cslDataFactory.params({
  'container-title-short': defaultChance.syllable(),
})

export const bibliographyEntryFactory = Factory.define<
  BibliographyEntry,
  CslData & { chance: Chance.Chance }
>(({ transientParams, associations }) => {
  const chance = transientParams.chance ?? defaultChance
  return new BibliographyEntry(
    cslDataFactory.build(transientParams, {
      transient: { chance },
      associations,
    })
  )
})

export function buildBorger1957(): BibliographyEntry {
  return bibliographyEntryFactory.build(
    {},
    {
      transient: {
        author: [{ family: 'Borger' }],
        issued: { 'date-parts': [[1957]] },
      },
    }
  )
}

export const referenceDtoFactory = Factory.define<
  ReferenceDto,
  { chance: Chance.Chance }
>(({ associations, transientParams }) => {
  const chance = transientParams.chance ?? defaultChance
  return {
    id: chance.string(),
    type: type(chance),
    pages: `${chance.natural()}-${chance.natural()}`,
    notes: chance.sentence(),
    linesCited: chance.pickset(['1.', '2.', "3'.", "4'.2."], 2),
    document: associations.document ?? null,
  }
})

export const referenceFactory = Factory.define<
  Reference,
  { chance: Chance.Chance }
>(({ associations, transientParams }) => {
  const chance = transientParams.chance ?? defaultChance

  return new Reference(
    type(chance),
    `${chance.natural()}-${chance.natural()}`,
    chance.sentence(),
    chance.pickset(['1.', '2.', "3'.", "4'.2."], 2),
    associations.document ??
      bibliographyEntryFactory.build({}, { transient: { chance } })
  )
})

export function buildReferenceWithContainerTitle(
  type: ReferenceType,
  cslData = {}
): Reference {
  return referenceFactory.build({
    type: type,
    document: bibliographyEntryFactory.build(
      {},
      { transient: cslDataWithContainerTitleShortFactory.build(cslData) }
    ),
  })
}

export function buildReferenceWithManyAuthors(): Reference {
  return referenceFactory.build({
    type: 'COPY',
    document: bibliographyEntryFactory.build(
      {},
      { transient: { author: authorFactory.buildList(4) } }
    ),
  })
}