hyparquet/test/metadata.test.js

71 lines
2.9 KiB
JavaScript
Raw Normal View History

2024-02-13 18:52:29 +00:00
import fs from 'fs'
2024-01-03 18:33:37 +00:00
import { describe, expect, it } from 'vitest'
2024-01-20 20:17:11 +00:00
import { parquetMetadata, parquetMetadataAsync } from '../src/hyparquet.js'
2024-01-05 09:39:59 +00:00
import { toJson } from '../src/toJson.js'
2024-02-13 18:52:29 +00:00
import { fileToAsyncBuffer, fileToJson, readFileToArrayBuffer } from './helpers.js'
2024-01-15 21:40:12 +00:00
2024-02-24 19:01:08 +00:00
const files = fs.readdirSync('test/files').filter(f => f.endsWith('.parquet'))
2024-01-03 18:33:37 +00:00
describe('parquetMetadata', () => {
2024-02-24 19:01:08 +00:00
files.forEach(file => {
it(`should parse metadata from ${file}`, async () => {
2024-02-13 18:52:29 +00:00
const arrayBuffer = await readFileToArrayBuffer(`test/files/${file}`)
const result = toJson(parquetMetadata(arrayBuffer))
2024-02-13 18:52:29 +00:00
const base = file.replace('.parquet', '')
const expected = fileToJson(`test/files/${base}.metadata.json`)
expect(result, JSON.stringify(result, null, 2)).toEqual(expected)
2024-02-24 19:01:08 +00:00
})
2024-01-11 19:06:37 +00:00
})
2024-01-03 18:33:37 +00:00
it('should throw an error for a too short file', () => {
const arrayBuffer = new ArrayBuffer(0)
expect(() => parquetMetadata(arrayBuffer)).toThrow('parquet file is too short')
})
2024-01-15 21:40:12 +00:00
it('should throw an error for invalid metadata length', () => {
const arrayBuffer = new ArrayBuffer(12)
const view = new DataView(arrayBuffer)
view.setUint32(0, 0x31524150, true) // magic number PAR1
view.setUint32(4, 1000, true) // 1000 bytes exceeds buffer
view.setUint32(8, 0x31524150, true) // magic number PAR1
expect(() => parquetMetadata(arrayBuffer))
.toThrow('parquet metadata length 1000 exceeds available buffer 4')
})
2024-01-03 18:33:37 +00:00
it('should throw an error for invalid magic number', () => {
const arrayBuffer = new ArrayBuffer(8)
expect(() => parquetMetadata(arrayBuffer))
.toThrow('parquet file invalid (footer != PAR1)')
})
it('should throw an error for invalid metadata length', () => {
const { buffer } = new Uint8Array([255, 255, 255, 255, 80, 65, 82, 49])
expect(() => parquetMetadata(buffer))
.toThrow('parquet metadata length 4294967295 exceeds available buffer 0')
2024-01-03 18:33:37 +00:00
})
})
2024-01-15 21:40:12 +00:00
describe('parquetMetadataAsync', () => {
2024-02-24 19:01:08 +00:00
files.forEach(file => {
it(`should parse metadata async from ${file}`, async () => {
2024-02-13 18:52:29 +00:00
const asyncBuffer = fileToAsyncBuffer(`test/files/${file}`)
const result = await parquetMetadataAsync(asyncBuffer)
const base = file.replace('.parquet', '')
const expected = fileToJson(`test/files/${base}.metadata.json`)
2024-02-14 05:25:40 +00:00
expect(toJson(result)).toEqual(expected)
2024-02-24 19:01:08 +00:00
})
2024-01-15 21:40:12 +00:00
})
it('should throw an error for invalid magic number', () => {
const { buffer } = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255])
expect(parquetMetadataAsync(buffer)).rejects
.toThrow('parquet file invalid (footer != PAR1)')
})
it('should throw an error for invalid metadata length', () => {
const { buffer } = new Uint8Array([255, 255, 255, 255, 80, 65, 82, 49])
expect(parquetMetadataAsync(buffer)).rejects
.toThrow('parquet metadata length 4294967295 exceeds available buffer 0')
})
2024-01-15 21:40:12 +00:00
})