import { expect, test, describe, vi } from 'vitest' import { resizeImage, formatDate, formatDuration, cacheCoverColor, calcCoverColor, getCoverColor, storage, } from '@/web/utils/common' import { IpcChannels } from '@/shared/IpcChannels' import { CacheAPIs } from '@/shared/CacheAPIs' test('resizeImage', () => { expect(resizeImage('https://test.com/test.jpg', 'xs')).toBe( 'https://test.com/test.jpg?param=128y128' ) expect(resizeImage('https://test.com/test.jpg', 'sm')).toBe( 'https://test.com/test.jpg?param=256y256' ) expect(resizeImage('https://test.com/test.jpg', 'md')).toBe( 'https://test.com/test.jpg?param=512y512' ) expect(resizeImage('https://test.com/test.jpg', 'lg')).toBe( 'https://test.com/test.jpg?param=1024y1024' ) // test http => https expect(resizeImage('http://test.com/test.jpg', 'xs')).toBe( 'https://test.com/test.jpg?param=128y128' ) expect(resizeImage('', 'xs')).toBe('') }) test('formatDate', () => { const time = 1650590574000 expect(formatDate(time)).toBe('2022年04月22日') expect(formatDate(time, 'en')).toBe('Apr 22, 2022') expect(formatDate(time, 'en', 'YYYY-MMM-DD')).toBe('2022-Apr-22') expect(formatDate(time, 'zh-CN')).toBe('2022年04月22日') expect(formatDate(time, 'zh-TW')).toBe('2022年04月22日') }) test('formatDuration', () => { expect(formatDuration(1000)).toBe('0:01') expect(formatDuration(60000)).toBe('1:00') expect(formatDuration(3600000)).toBe('1:00:00') expect(formatDuration(3700000)).toBe('1:01:40') expect(formatDuration(3600000, 'en-US', 'hh[hr] mm[min]')).toBe('1 hr') expect(formatDuration(3600000, 'zh-CN', 'hh[hr] mm[min]')).toBe('1 小时') // expect(formatDuration(3600000, 'zh-TW', 'hh[hr] mm[min]')).toBe('1 小時') expect(formatDuration(3700000, 'en-US', 'hh[hr] mm[min]')).toBe('1 hr 1 min') expect(formatDuration(3700000, 'zh-CN', 'hh[hr] mm[min]')).toBe('1 小时 1 分钟') // expect(formatDuration(3700000, 'zh-TW', 'hh[hr] mm[min]')).toBe('1 小時 1 分鐘') expect(formatDuration(0)).toBe('0:00') expect(formatDuration(0, 'en-US', 'hh[hr] mm[min]')).toBe('0 min') expect(formatDuration(0, 'zh-CN', 'hh[hr] mm[min]')).toBe('0 分钟') }) // describe('cacheCoverColor', () => { // test('cache with valid url', () => { // vi.stubGlobal('ipcRenderer', { // send: (channel: IpcChannels, ...args: any[]) => { // expect(channel).toBe(IpcChannels.CacheCoverColor) // expect(args[0].api).toBe(CacheAPIs.CoverColor) // expect(args[0].query).toEqual({ // id: '109951165911363', // color: '#fff', // }) // }, // }) // const sendSpy = vi.spyOn(window.ipcRenderer as any, 'send') // cacheCoverColor( // 'https://p2.music.126.net/2qW-OYZod7SgrzxTwtyBqA==/109951165911363.jpg?param=256y256', // '#fff' // ) // expect(sendSpy).toHaveBeenCalledTimes(1) // vi.stubGlobal('ipcRenderer', undefined) // }) // test('cache with invalid url', () => { // vi.stubGlobal('ipcRenderer', { // send: (channel: IpcChannels, ...args: any[]) => { // expect(channel).toBe(IpcChannels.CacheCoverColor) // expect(args[0].api).toBe(CacheAPIs.CoverColor) // expect(args[0].query).toEqual({ // id: '', // color: '#fff', // }) // }, // }) // const sendSpy = vi.spyOn(window.ipcRenderer as any, 'send') // cacheCoverColor('not a valid url', '#fff') // expect(sendSpy).toHaveBeenCalledTimes(0) // vi.stubGlobal('ipcRenderer', undefined) // }) // }) // test('calcCoverColor', async () => { // vi.mock('color.js', () => { // return { // average: vi.fn( // () => // new Promise(resolve => { // resolve('#fff') // }) // ), // } // }) // vi.stubGlobal('ipcRenderer', { // send: (channel: IpcChannels, ...args: any[]) => { // expect(channel).toBe(IpcChannels.CacheCoverColor) // expect(args[0].api).toBe(CacheAPIs.CoverColor) // expect(args[0].query).toEqual({ // id: '109951165911363', // color: '#808080', // }) // }, // }) // const sendSpy = vi.spyOn(window.ipcRenderer as any, 'send') // expect( // await calcCoverColor( // 'https://p2.music.126.net/2qW-OYZod7SgrzxTwtyBqA==/109951165911363.jpg?param=256y256' // ) // ).toBe('#808080') // vi.stubGlobal('ipcRenderer', undefined) // }) // describe('getCoverColor', () => { // test('hit cache', async () => { // vi.stubGlobal('ipcRenderer', { // sendSync: (channel: IpcChannels, ...args: any[]) => { // expect(channel).toBe(IpcChannels.GetApiCache) // expect(args[0].api).toBe(CacheAPIs.CoverColor) // expect(args[0].query).toEqual({ // id: '109951165911363', // }) // return '#fff' // }, // }) // const sendSyncSpy = vi.spyOn(window.ipcRenderer as any, 'sendSync') // expect( // await getCoverColor( // 'https://p2.music.126.net/2qW-OYZod7SgrzxTwtyBqA==/109951165911363.jpg?param=256y256' // ) // ).toBe('#fff') // expect(sendSyncSpy).toHaveBeenCalledTimes(1) // vi.stubGlobal('ipcRenderer', undefined) // }) // test('did not hit cache', async () => { // vi.stubGlobal('ipcRenderer', { // sendSync: (channel: IpcChannels, ...args: any[]) => { // expect(channel).toBe(IpcChannels.GetApiCache) // expect(args[0].api).toBe(CacheAPIs.CoverColor) // expect(args[0].query).toEqual({ // id: '109951165911363', // }) // return undefined // }, // send: () => { // // // }, // }) // const sendSyncSpy = vi.spyOn(window.ipcRenderer as any, 'sendSync') // const sendSpy = vi.spyOn(window.ipcRenderer as any, 'send') // expect( // await getCoverColor( // 'https://p2.music.126.net/2qW-OYZod7SgrzxTwtyBqA==/109951165911363.jpg?param=256y256' // ) // ).toBe('#808080') // expect(sendSyncSpy).toHaveBeenCalledTimes(1) // expect(sendSpy).toHaveBeenCalledTimes(1) // vi.stubGlobal('ipcRenderer', undefined) // }) // test('invalid url', async () => { // expect(await getCoverColor('not a valid url')).toBe(undefined) // }) // }) test('storage', () => { const mockLocalStorage: any = { test: { key: 'value', }, } vi.stubGlobal('localStorage', { getItem: (key: string) => { return mockLocalStorage[key] ?? undefined }, setItem: (key: string, value: string) => { expect(key).toBe('test') expect(value).toEqual(`{"key":"value2"}`) mockLocalStorage[key] = value }, }) expect(storage.set('test', { key: 'value2' })).toBe(undefined) expect(storage.get('test')).toEqual({ key: 'value2' }) expect(storage.get('test2')).toBe(null) vi.stubGlobal('localStorage', undefined) })