import { describe, it, expect } from 'vitest'

import {
  getFileSizeInMB,
  getReadableFileSize,
  getReadableFileSizeAsText,
} from '@/utils/files'

describe('getReadableFileSizeAsText', () => {
  const testsParams = [
    {
      description: 'returns 0 bytes if provided file size is 0',
      inputFileSize: 0,
      expectedReadableFileSize: '0 bytes',
    },
    {
      description: 'returns 1.0KB if provided file size is 1024',
      inputFileSize: 1024,
      expectedReadableFileSize: '1.0KB',
    },
    {
      description: 'returns 43.5MB if provided file size is 45654654',
      inputFileSize: 45654654,
      expectedReadableFileSize: '43.5MB',
    },
  ]

  testsParams.map((testParams) => {
    it(testParams.description, () => {
      expect(getReadableFileSizeAsText(testParams.inputFileSize)).toStrictEqual(
        testParams.expectedReadableFileSize
      )
    })
  })
})

describe('getReadableFileSize (as object)', () => {
  const testsParams = [
    {
      description: 'returns 0 bytes if provided file size is 0',
      inputFileSize: 0,
      expectedReadableFileSize: { size: '0', suffix: 'bytes' },
    },
    {
      description: 'returns 1.0KB if provided file size is 1024',
      inputFileSize: 1024,
      expectedReadableFileSize: { size: '1.0', suffix: 'KB' },
    },
    {
      description: 'returns 43.5MB if provided file size is 45654654',
      inputFileSize: 45654654,
      expectedReadableFileSize: { size: '43.5', suffix: 'MB' },
    },
  ]

  testsParams.map((testParams) => {
    it(testParams.description, () => {
      expect(getReadableFileSize(testParams.inputFileSize)).toStrictEqual(
        testParams.expectedReadableFileSize
      )
    })
  })
})

describe('getFileSizeInMB', () => {
  const testsParams = [
    {
      description: 'returns 0 if provided file size is 0',
      inputFileSize: 0,
      expectedFileSize: 0,
    },
    {
      description: 'returns 1 (MB) if provided file size is 1048576',
      inputFileSize: 1048576,
      expectedFileSize: 1,
    },
    {
      description: 'returns 2.53 (MB) if provided file size is 2652897',
      inputFileSize: 2652897,
      expectedFileSize: 2.53,
    },
  ]

  testsParams.map((testParams) => {
    it(testParams.description, () => {
      expect(getFileSizeInMB(testParams.inputFileSize)).toStrictEqual(
        testParams.expectedFileSize
      )
    })
  })
})
