Back to Repositories

Validating Breton Locale Implementation in Day.js

This test suite validates the Breton (br) locale implementation in Day.js, focusing on date formatting and relative time functionality. It ensures compatibility with Moment.js by comparing output formats and relative time calculations across both libraries.

Test Coverage Overview

The test suite provides comprehensive coverage of Breton locale-specific date formatting and relative time calculations.
  • Tests month formatting with various format patterns (DD MMMM YYYY MMM, MMMM, MMM)
  • Validates relative time expressions for different time units (seconds to years)
  • Ensures parity with Moment.js implementations

Implementation Analysis

The testing approach employs Jest’s unit testing framework with MockDate for consistent date handling.
  • Uses parallel testing against Moment.js as reference implementation
  • Implements systematic format testing with multiple patterns
  • Employs array-driven test cases for relative time scenarios

Technical Details

Test implementation utilizes several key components:
  • Jest test runner and assertion library
  • MockDate for date manipulation
  • Day.js relative time plugin
  • Moment.js for reference comparisons
  • Breton locale configuration

Best Practices Demonstrated

The test suite exemplifies several testing best practices:
  • Consistent test setup and teardown using beforeEach/afterEach hooks
  • Comprehensive edge case coverage in relative time testing
  • Systematic format verification across multiple patterns
  • Reference-based testing against established library

iamkun/dayjs

test/locale/br.test.js

            
import moment from 'moment'
import MockDate from 'mockdate'
import dayjs from '../../src'
import relativeTime from '../../src/plugin/relativeTime'
import '../../src/locale/br'

dayjs.extend(relativeTime)

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

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

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

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('br')
    moment.locale('br')
    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))
  })
})