Ctrl K
ComunidadGuías…

tests/bundle-usage.unit.test.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { describe, expect, it } from 'vitest'
import { bundleUsageTestUtils } from '../supabase/functions/_backend/public/statistics/index.ts'

describe('bundle usage helpers', () => {
  it('generateDateLabels builds an inclusive range', () => {
    // Use dates in the past that won't be affected by "today" capping
    const labels = bundleUsageTestUtils.generateDateLabels(
      new Date('2024-10-24T12:00:00Z'),
      new Date('2024-11-02T23:59:59Z'),
    )

    expect(labels).toEqual([
      '2024-10-24',
      '2024-10-25',
      '2024-10-26',
      '2024-10-27',
      '2024-10-28',
      '2024-10-29',
      '2024-10-30',
      '2024-10-31',
      '2024-11-01',
      '2024-11-02',
    ])
  })

  it('fillMissingDailyData carries forward the previous day when a full day has no data', () => {
    const sourceDatasets = [
      { label: 'v1', data: [10, 0, 0] },
      { label: 'v2', data: [20, 0, 0] },
    ]
    // Use dates in the past to avoid "today" special handling
    const labels = ['2024-10-24', '2024-10-25', '2024-10-26']

    const result = bundleUsageTestUtils.fillMissingDailyData(sourceDatasets, labels)

    expect(result).toEqual([
      { label: 'v1', data: [10, 10, 10] },
      { label: 'v2', data: [20, 20, 20] },
    ])

    // ensure original references are untouched
    expect(sourceDatasets).toEqual([
      { label: 'v1', data: [10, 0, 0] },
      { label: 'v2', data: [20, 0, 0] },
    ])
  })

  it('fillMissingDailyData preserves zeros for recent dates that may still be accumulating', () => {
    // Use today's date to test the "skip filling for today" behavior
    const today = new Date().toISOString().split('T')[0]
    const yesterday = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString().split('T')[0]

    const sourceDatasets = [
      { label: 'v1', data: [10, 0] },
      { label: 'v2', data: [20, 0] },
    ]
    const labels = [yesterday, today]

    const result = bundleUsageTestUtils.fillMissingDailyData(sourceDatasets, labels)

    // Today's zero should be preserved (not filled forward)
    expect(result[0].data[1]).toBe(0)
    expect(result[1].data[1]).toBe(0)
  })

  it('buildDailyReportedCountsByName aggregates daily get counts by version', () => {
    const usage = [
      { date: '2024-10-24', app_id: 'app', version_name: '1.0.0', get: 3, install: 0, uninstall: 0 },
      { date: '2024-10-24', app_id: 'app', version_name: '1.1.0', get: 2, install: 0, uninstall: 0 },
      { date: '2024-10-25', app_id: 'app', version_name: '1.0.0', get: 1, install: 0, uninstall: 0 },
      { date: '2024-10-25', app_id: 'app', version_name: '1.1.0', get: 4, install: 0, uninstall: 0 },
    ]
    const dates = ['2024-10-24', '2024-10-25']
    const versions = ['1.0.0', '1.1.0']

    const counts = bundleUsageTestUtils.buildDailyReportedCountsByName(usage as any, dates, versions)
    expect(counts).toEqual({
      '2024-10-24': { '1.0.0': 3, '1.1.0': 2 },
      '2024-10-25': { '1.0.0': 1, '1.1.0': 4 },
    })
  })

  it('fillMissingDailyCounts carries forward historical zero days', () => {
    const versions = ['1.0.0', '1.1.0']
    const dates = ['2024-10-24', '2024-10-25', '2024-10-26']
    const counts = {
      '2024-10-24': { '1.0.0': 3, '1.1.0': 2 },
      '2024-10-25': { '1.0.0': 0, '1.1.0': 0 },
      '2024-10-26': { '1.0.0': 1, '1.1.0': 4 },
    }

    const filled = bundleUsageTestUtils.fillMissingDailyCounts(counts as any, dates, versions, '2024-11-01')
    expect(filled['2024-10-25']).toEqual({ '1.0.0': 3, '1.1.0': 2 })
  })

  it('convertCountsToPercentagesByName converts daily counts into 0-100 share', () => {
    const counts = {
      '2024-10-24': { '1.0.0': 3, '1.1.0': 2 },
      '2024-10-25': { '1.0.0': 1, '1.1.0': 4 },
    }
    const dates = ['2024-10-24', '2024-10-25']
    const versions = ['1.0.0', '1.1.0']

    const percentages = bundleUsageTestUtils.convertCountsToPercentagesByName(counts as any, dates, versions)
    expect(percentages['2024-10-24']['1.0.0']).toBe(60)
    expect(percentages['2024-10-24']['1.1.0']).toBe(40)
    expect(percentages['2024-10-25']['1.0.0']).toBe(20)
    expect(percentages['2024-10-25']['1.1.0']).toBe(80)
  })

  it('convertCountsToPercentagesByName keeps rounded totals at exactly 100', () => {
    const counts = {
      '2024-10-24': { '1.0.0': 1, '1.1.0': 1, '1.2.0': 1 },
    }
    const dates = ['2024-10-24']
    const versions = ['1.0.0', '1.1.0', '1.2.0']

    const percentages = bundleUsageTestUtils.convertCountsToPercentagesByName(counts as any, dates, versions)
    const total = versions.reduce((sum, version) => sum + percentages['2024-10-24'][version], 0)

    expect(total).toBeCloseTo(100, 5)
  })

  it('getLatestDayVersionShare returns top version share from latest day with data', () => {
    const versions = ['1.0.0', '1.1.0']
    const dates = ['2024-10-24', '2024-10-25']
    const counts = {
      '2024-10-24': { '1.0.0': 3, '1.1.0': 2 },
      '2024-10-25': { '1.0.0': 0, '1.1.0': 5 },
    }

    const latest = bundleUsageTestUtils.getLatestDayVersionShare(versions, dates, counts as any)
    expect(latest.name).toBe('1.1.0')
    expect(latest.percentage).toBe(100)
  })
})