Back to Repositories

Validating Bengali Locale Implementation in iamkun/dayjs

This test suite validates Bengali (bn) locale functionality in dayjs, focusing on date formatting, relative time calculations, and locale-specific parsing. It ensures proper implementation of Bengali language support by comparing dayjs outputs with moment.js reference implementations.

Test Coverage Overview

The test suite provides comprehensive coverage of Bengali locale features:
  • Month formatting in various patterns (full, short)
  • Date string parsing with locale considerations
  • Relative time calculations across different time units
  • Integration with multiple dayjs plugins (relativeTime, localeData, preParsePostFormat)

Implementation Analysis

The testing approach uses Jest’s assertion framework to validate dayjs against moment.js implementations. It employs systematic verification patterns including:
  • Iterative testing across multiple date ranges
  • Multiple format pattern validation
  • Direct comparison with moment.js output
  • Plugin integration testing

Technical Details

Testing infrastructure includes:
  • Jest test framework
  • MockDate for date manipulation
  • dayjs plugins: relativeTime, localeData, preParsePostFormat
  • moment.js as reference implementation
  • Systematic test isolation using beforeEach/afterEach hooks

Best Practices Demonstrated

The test suite exemplifies several testing best practices:
  • Isolated test cases with proper setup/teardown
  • Comprehensive edge case coverage
  • Consistent comparison methodology
  • Modular test organization
  • Clear test case descriptions

iamkun/dayjs

test/locale/bn.test.js

            
import moment from 'moment'
import MockDate from 'mockdate'
import dayjs from '../../src'
import relativeTime from '../../src/plugin/relativeTime'
import localeData from '../../src/plugin/localeData'
import preParsePostFormat from '../../src/plugin/preParsePostFormat'
import '../../src/locale/bn'

dayjs.extend(localeData)
dayjs.extend(relativeTime)
dayjs.extend(preParsePostFormat)

beforeEach(() => {
  MockDate.set(new Date())
})

afterEach(() => {
  MockDate.reset()
})

it('Format Month with locale function', () => {
  for (let i = 0; i <= 7; i += 1) {
    const dayjsBN = dayjs()
      .locale('bn')
      .add(i, 'day')
    const momentBN = moment()
      .locale('bn')
      .add(i, 'day')
    const testFormat1 = 'DD MMMM YYYY MMM'
    const testFormat2 = 'MMMM'
    const testFormat3 = 'MMM'
    expect(dayjsBN.format(testFormat1)).toEqual(momentBN.format(testFormat1))
    expect(dayjsBN.format(testFormat2)).toEqual(momentBN.format(testFormat2))
    expect(dayjsBN.format(testFormat3)).toEqual(momentBN.format(testFormat3))
  }
})

it('Month short', () => {
  const date = '2021-02-01T05:54:32.005Z'
  const dayjsBN = dayjs(date)
    .locale('bn')
  const momentBN = moment(date)
    .locale('bn')
  const testFormat1 = 'DD MMMM YYYY MMM'
  expect(dayjsBN.format(testFormat1)).toEqual(momentBN.format(testFormat1))
})

it('Preparse with locale function', () => {
  for (let i = 0; i <= 7; i += 1) {
    dayjs.locale('bn')
    const momentBN = moment()
      .locale('bn')
      .add(i, 'day')
    expect(dayjs(momentBN.format()).format()).toEqual(momentBN.format())
  }
})

it('RelativeTime: Time from X', () => {
  const T = [
    [44.4, 'second'], // a few seconds
    [89.5, 'second'], // a minute
    [130, 'second'], // two minutes
    [43, 'minute'], // 44 minutes
    [1, 'hour'], // 1 hour
    [21, 'hour'], // 21 hours
    [2, 'day'], // 2 days
    [25, 'day'], // 25 days
    [2, 'month'], // 2 months
    [10, 'month'], // 10 months
    [18, 'month'], // 2 years
    [15, 'year'] // 15 years
  ]

  T.forEach((t) => {
    dayjs.locale('bn')
    moment.locale('bn')
    expect(dayjs().from(dayjs().add(t[0], t[1]))).toBe(moment().from(moment().add(t[0], t[1])))
    expect(dayjs().from(dayjs().add(t[0], t[1]), true))
      .toBe(moment().from(moment().add(t[0], t[1]), true))
  })
})