Back to Repositories

Testing Day.js Duration and ObjectSupport Plugin Integration in iamkun/dayjs

This test suite validates the interaction between Day.js duration plugin and object support plugin, focusing on date manipulation operations. It ensures correct handling of duration objects and numerical values when performing date arithmetic operations.

Test Coverage Overview

The test suite provides comprehensive coverage of Day.js date manipulation functionality, specifically addressing plugin ordering issues between objectSupport and Duration plugins.

  • Tests duration-based date addition and subtraction
  • Validates numeric time unit operations
  • Verifies date parsing from strings and objects
  • Confirms hour setting functionality using both number and object approaches

Implementation Analysis

The testing approach employs Jest’s describe/it pattern to organize related test cases systematically. Each test follows a consistent structure of creating a base date, performing operations, and validating the result using precise timestamp formatting.

MockDate is utilized to ensure consistent date handling across test executions, with proper setup and teardown in beforeEach and afterEach blocks.

Technical Details

  • Testing Framework: Jest
  • Plugins: duration, objectSupport
  • Mocking: MockDate for date simulation
  • Date Format: YYYY-MM-DD HH:mm:ss.SSS
  • Test Environment: Node.js

Best Practices Demonstrated

The test suite exemplifies several testing best practices including isolated test cases, consistent assertion patterns, and proper test setup/teardown.

  • Clear test case descriptions
  • Consistent test structure
  • Proper plugin initialization
  • Effective use of beforeEach/afterEach hooks
  • Precise timestamp validation

iamkun/dayjs

test/issues/issue2027.swapped-order.test.js

            
import MockDate from 'mockdate'
import dayjs from '../../src'
import duration from '../../src/plugin/duration'
import objectSupport from '../../src/plugin/objectSupport'

dayjs.extend(duration)
dayjs.extend(objectSupport)

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

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

// issue 2027
describe('issue 2027 - order objectSupport > Duration', () => {
  it('add Duration object returns correct date', () => {
    const baseDate = dayjs('2022-06-26T14:01:02.003')
    const durationToAdd = dayjs.duration(6, 'hours')
    const testDate = baseDate.add(durationToAdd)

    expect(testDate.format('YYYY-MM-DD HH:mm:ss.SSS')).toBe('2022-06-26 20:01:02.003')
  })

  it('subtract Duration object returns correct date', () => {
    const baseDate = dayjs('2022-06-26T14:01:02.003')
    const durationToAdd = dayjs.duration(6, 'hours')
    const testDate = baseDate.subtract(durationToAdd)

    expect(testDate.format('YYYY-MM-DD HH:mm:ss.SSS')).toBe('2022-06-26 08:01:02.003')
  })

  it('add number with unit returns correct date', () => {
    const baseDate = dayjs('2022-06-26T14:01:02.003')
    const testDate = baseDate.add(6, 'hours')

    expect(testDate.format('YYYY-MM-DD HH:mm:ss.SSS')).toBe('2022-06-26 20:01:02.003')
  })
  it('subtract number with unit returns correct date', () => {
    const baseDate = dayjs('2022-06-26T14:01:02.003')
    const testDate = baseDate.subtract(6, 'hours')

    expect(testDate.format('YYYY-MM-DD HH:mm:ss.SSS')).toBe('2022-06-26 08:01:02.003')
  })

  it('parse string returns correct date', () => {
    const testDate = dayjs('2022-06-26T14:01:02.003')

    expect(testDate.format('YYYY-MM-DD HH:mm:ss.SSS')).toBe('2022-06-26 14:01:02.003')
  })
  it('parse object returns correct date', () => {
    const testDate = dayjs({
      year: '2022',
      month: '05',
      day: '26',
      hour: '14',
      minute: '01',
      second: '02',
      millisecond: '003'
    })

    expect(testDate.format('YYYY-MM-DD HH:mm:ss.SSS')).toBe('2022-06-26 14:01:02.003')
  })

  it('set hour with number returns correct date', () => {
    const baseDate = dayjs('2022-06-26T14:01:02.003')
    const testDate = baseDate.hour(10)

    expect(testDate.format('YYYY-MM-DD HH:mm:ss.SSS')).toBe('2022-06-26 10:01:02.003')
  })
  it('set hour with object returns correct date', () => {
    const baseDate = dayjs('2022-06-26T14:01:02.003')
    const testDate = baseDate.set({ hour: '10' })

    expect(testDate.format('YYYY-MM-DD HH:mm:ss.SSS')).toBe('2022-06-26 10:01:02.003')
  })
})