Jixun Wu
3 years ago
committed by
MengYX
8 changed files with 70 additions and 8 deletions
@ -0,0 +1,2 @@ |
|||||
|
// Polyfill for node.
|
||||
|
global.Blob = global.Blob || require("node:buffer").Blob; |
Binary file not shown.
@ -0,0 +1,52 @@ |
|||||
|
import fs from 'fs'; |
||||
|
import { storage } from '@/utils/storage'; |
||||
|
|
||||
|
import { Decrypt as decryptJoox } from '../joox'; |
||||
|
import { extractQQMusicMeta as extractQQMusicMetaOrig } from '@/utils/qm_meta'; |
||||
|
|
||||
|
jest.mock('@/utils/storage'); |
||||
|
jest.mock('@/utils/qm_meta'); |
||||
|
|
||||
|
const loadJooxUUID = storage.loadJooxUUID as jest.MockedFunction<typeof storage.loadJooxUUID>; |
||||
|
const extractQQMusicMeta = extractQQMusicMetaOrig as jest.MockedFunction<typeof extractQQMusicMetaOrig>; |
||||
|
|
||||
|
const TEST_UUID_ZEROS = ''.padStart(32, '0'); |
||||
|
const encryptedFile1 = fs.readFileSync(__dirname + '/fixture/joox_1.bin'); |
||||
|
|
||||
|
describe('decrypt/joox', () => { |
||||
|
it('should be able to decrypt sample file (v4)', async () => { |
||||
|
loadJooxUUID.mockResolvedValue(TEST_UUID_ZEROS); |
||||
|
extractQQMusicMeta.mockImplementationOnce(async (blob: Blob) => { |
||||
|
return { |
||||
|
title: 'unused', |
||||
|
album: 'unused', |
||||
|
blob: blob, |
||||
|
artist: 'unused', |
||||
|
imgUrl: 'https://github.com/unlock-music', |
||||
|
}; |
||||
|
}); |
||||
|
|
||||
|
const result = await decryptJoox(new Blob([encryptedFile1]), 'test.bin', 'bin'); |
||||
|
const resultBuf = await result.blob.arrayBuffer(); |
||||
|
expect(resultBuf).toEqual(Buffer.from('Hello World', 'utf-8').buffer); |
||||
|
}); |
||||
|
|
||||
|
it('should reject E!99 files', async () => { |
||||
|
loadJooxUUID.mockResolvedValue(TEST_UUID_ZEROS); |
||||
|
|
||||
|
const input = new Blob([Buffer.from('E!99....')]); |
||||
|
await expect(decryptJoox(input, 'test.bin', 'bin')).rejects.toThrow('不支持的 joox 加密格式'); |
||||
|
}); |
||||
|
|
||||
|
it('should reject empty uuid', async () => { |
||||
|
loadJooxUUID.mockResolvedValue(''); |
||||
|
const input = new Blob([encryptedFile1]); |
||||
|
await expect(decryptJoox(input, 'test.bin', 'bin')).rejects.toThrow('UUID'); |
||||
|
}); |
||||
|
|
||||
|
it('should reject invalid uuid', async () => { |
||||
|
loadJooxUUID.mockResolvedValue('hello!'); |
||||
|
const input = new Blob([encryptedFile1]); |
||||
|
await expect(decryptJoox(input, 'test.bin', 'bin')).rejects.toThrow('UUID'); |
||||
|
}); |
||||
|
}); |
@ -0,0 +1 @@ |
|||||
|
export const extractQQMusicMeta = jest.fn(); |
@ -0,0 +1,4 @@ |
|||||
|
export const storage = { |
||||
|
loadJooxUUID: jest.fn(), |
||||
|
saveJooxUUID: jest.fn(), |
||||
|
}; |
Loading…
Reference in new issue