Back to Repositories

Validating Duration Plugin Order Operations in iamkun/dayjs

This test suite validates the correct ordering and functionality of Day.js duration and object support plugins, focusing on date manipulation operations. It ensures proper handling of duration objects and numeric values for time calculations.

Test Coverage Overview

The test suite provides comprehensive coverage of Day.js date manipulation operations using both Duration objects and direct numeric values.

  • Tests add/subtract operations with Duration objects
  • Validates numeric time unit calculations
  • Verifies date parsing from strings and objects
  • Confirms hour setting functionality using both number and object approaches

Implementation Analysis

The testing approach utilizes Jest’s describe/it pattern for organizing test cases, with MockDate for consistent date handling across test runs.

Tests implement dayjs plugin extension pattern using duration and objectSupport plugins, demonstrating proper plugin ordering requirements. Each test case follows AAA (Arrange-Act-Assert) pattern with explicit date formatting verification.

Technical Details

  • Testing Framework: Jest
  • Plugins: duration, objectSupport
  • Mock Library: MockDate
  • Date Format: YYYY-MM-DD HH:mm:ss.SSS
  • Test Setup: beforeEach/afterEach hooks for date mocking

Best Practices Demonstrated

The test suite exemplifies several testing best practices including isolated test cases, consistent date formatting, and thorough edge case coverage.

  • Consistent test case structure and naming
  • Proper test isolation using mock date reset
  • Comprehensive validation of both object and primitive inputs
  • Clear expected vs actual value comparisons

iamkun/dayjs

test/issues/issue2027.correct-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(objectSupport)
dayjs.extend(duration)

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')
  })
})