acebase/spec/export-import.spec.js
Ewout Stortenbeker 8c85e46541 - Fixes for issue #96 and discussion #92
- disabled trailing /* index path removal
- improved path variables handling in queries and indexes
- export & import using serialize2 compatible format
- updated tests
2022-05-05 17:04:23 +02:00

100 lines
No EOL
4 KiB
JavaScript

/// <reference types="@types/jasmine" />
const { createTempDB } = require("./tempdb");
const util = require('util');
const fs = require('fs');
const { PathReference } = require("acebase-core");
describe('export/import', () => {
let db, removeDB;
beforeAll(async ()=> {
({ db, removeDB } = await createTempDB());
});
afterAll(async () => {
await removeDB();
});
it('export string escaping', async () => {
// Backslash test inspired by issue #56 https://github.com/appy-one/acebase/issues/56
const ref = db.ref('backslashes');
await ref.set({ text: 'Strings with multiple \\ backslashes \\ are \\ exported ok' });
let json = '';
await ref.export(str => json += str);
expect(json).toEqual(`{"text":"Strings with multiple \\ backslashes \\ are \\ exported ok"}`);
});
it('typesafety', async () => {
// Test typesafety of non-JSON data, inspired by issue #57 https://github.com/appy-one/acebase/issues/57
const ref = db.ref('typesafety');
const obj = {
text: 'Checking typesafety',
date: new Date(),
binary: new Uint8Array([98, 105, 110, 97, 114, 121, 32, 100, 97, 116, 97]), // TextEncoder().encode('binary data'),
reference: new PathReference('some/other/data')
};
await ref.set(obj);
let json = '';
await ref.export(str => json += str);
expect(json).toEqual(`{"text":"Checking typesafety","date":{".type":"date",".val":"${obj.date.toISOString()}"},"binary":{".type":"binary",".val":"<~@VK^gEd8d<@<>o~>"},"reference":{".type":"reference",".val":"some/other/data"}}`);
// Now import again
let index = 0;
await ref.import(length => {
const data = json.slice(index, index + length);
index += data.length;
return data;
});
const obj2 = (await ref.get()).val();
expect(obj2.date).toBeInstanceOf(Date);
expect(obj2.binary).toBeInstanceOf(ArrayBuffer);
expect(obj2.reference).toBeInstanceOf(PathReference);
obj2.binary = new Uint8Array(obj2.binary); // Convert ArrayBuffer to Uint8Array for value comparison
expect(obj2).toEqual(obj);
});
it('import local datasets', async () => {
const importFile = async (filename, path) => {
const fd = fs.openSync(filename, 'r');
const read = length => {
return new Promise((resolve, reject) => {
const buffer = new Uint8Array(length);
fs.read(fd, buffer, 0, length, null, err => {
if (err) { reject(err); }
else { resolve(buffer); }
});
});
};
await db.ref(path).import(read);
fs.closeSync(fd);
// Alternative: use read stream (ignores size argument because if too large, read returns null)
// const stream = fs.createReadStream(filename, { encoding: 'utf-8' });
// await new Promise(resolve => stream.once('readable', resolve));
// let eof = false;
// stream.once('end', () => { eof = true; })
// const read = async (size) => {
// const data = stream.read();
// if (data === null) {
// if (eof) { throw new Error('Unexpected EOF'); }
// await new Promise(resolve => stream.once('readable', resolve));
// data = stream.read();
// }
// return data;
// };
// await db.ref(path).import(read);
// stream.close();
};
// Import movies dataset. TODO: use larger dataset from https://raw.githubusercontent.com/prust/wikipedia-movie-data/master/movies.json
await importFile(__dirname + '/dataset/movies.json', 'movies');
// Import meteorites dataset
await importFile(__dirname + '/dataset/meteorites.json', 'meteorites');
// TODO: Check data now
}, 1000e3);
});