fabasoad/business-card

View on GitHub
src/__tests__/components/Certificates/TestUtils.ts

Summary

Maintainability
A
2 hrs
Test Coverage
A
97%
import * as items from '../../../components/Certificates/items.json'
import CertificateIssuerStorage from '../../../scripts/certificates/CertificateIssuerStorage'
import { CertificateIssuer } from '../../../scripts/certificates/types'
import { Locale } from '../../../scripts/i18n/types'
import { testSectionTitle } from '../Controls/TestUtils'

export function testCertificateItem(
  div: HTMLDivElement,
  locale: Locale,
  date: Date,
  issuerName: string,
  technology: string,
  name: string,
  url: string
) {
  const certificateIssuerStorage = new CertificateIssuerStorage()
  const issuer: CertificateIssuer = certificateIssuerStorage.findByName(issuerName)

  const monthIndex = date.getMonth()
  const year = date.getFullYear()

  let elements = div.getElementsByClassName('card-img')
  expect(elements).toHaveLength(1)
  expect(elements[0]).toHaveAttribute('src', '[object Object]')

  elements = div.getElementsByClassName('card-header')
  expect(elements).toHaveLength(1)
  expect(elements[0]).toHaveTextContent(issuer.name)

  elements = div.getElementsByClassName('card-link')
  expect(elements).toHaveLength(1)
  const cardLink = expect(elements[0])
  cardLink.toHaveAttribute('href', url)
  cardLink.toHaveTextContent(name)

  elements = div.getElementsByClassName('card-footer')
  expect(elements).toHaveLength(1)
  expect(elements[0]).toHaveTextContent(
    locale.code === 'jp'
      ? new RegExp(`.+business-card-year-singularbusiness-card-month-${monthIndex}`)
      : `business-card-month-${monthIndex} ${year}`
  )
}

export function testCertificatesMain(div: HTMLDivElement, locale: Locale) {
  function findByUrl(items: Array<any>, url: string): any {
    for (const item of items) {
      if (item.url === url) {
        return item
      }
    }
    return null
  }
  expect(div).toHaveClass('light-component')
  testSectionTitle(
    div.querySelector('div.section-title'),
    'business-card-certificates-title'
  )
  const divContainer = div.querySelector('div.container')
  expect(divContainer).not.toBeNull()
  const divRow = divContainer.querySelector('div.row')
  expect(divRow).toHaveClass('row-cols-2')
  expect(divRow).toHaveClass('row-cols-md-3')
  expect(divRow).toHaveClass('row-cols-lg-5')
  const divColElements = divRow.querySelectorAll('div.col-lg')
  expect(divColElements).toHaveLength(items.length)
  for (let ind = 0; ind < items.length; ind++) {
    const divCol = divColElements.item(ind)
    expect(divCol).toHaveClass('mb-2')
    const divCard: HTMLDivElement = divCol.querySelector('div.card')
    const divCardLinks = divCard.getElementsByClassName('card-link')
    expect(divCardLinks).toHaveLength(1)
    const item = findByUrl(items, divCardLinks.item(0).getAttribute('href'))
    const name = item.i18nTitleKey
    testCertificateItem(
      divCard,
      locale,
      new Date(item.date),
      item.issuer,
      item.technology,
      name,
      item.url
    )
  }
}