UNPKG

@evidence-dev/source-javascript

Version:

This is a JavaScript source for Evidence. It allows you to run arbitrary JavaScript code as a data source. It's a quick way to get data into Evidence without having to create a new connector.

102 lines (91 loc) 3.48 kB
import { describe, it, expect } from 'vitest'; import { getRunner } from './index.js'; import { EvidenceType } from '@evidence-dev/db-commons'; describe('Runner Tests', () => { it('empty query should not run', async () => { const runner = getRunner(); try { await runner('', './test/empty.js'); } catch (error) { expect(error).toBeInstanceOf(Error); expect(error.message).toBe('No { data } object exported from JavaScript file.'); } }); it('should return data from simple.js', async () => { const runner = getRunner(); const data = await runner('', './test/simple.js'); expect(data.rows.length).toBe(2); expect(data.rows[0].id).toBe(1); expect(data.rows[0].name).toBe('John Doe'); expect(data.rows[1].id).toBe(2); expect(data.rows[1].name).toBe('Jane Doe'); }); it('should return data from sample endpoint', async () => { const runner = getRunner(); const data = await runner('', './test/pokemon.js'); expect(data.rows.length).toBe(20); expect(data.rows[0].name).toBe('bulbasaur'); expect(data.rows[0].url).toBe('https://pokeapi.co/api/v2/pokemon/1/'); expect(data.rows[1].name).toBe('ivysaur'); expect(data.rows[1].url).toBe('https://pokeapi.co/api/v2/pokemon/2/'); }); it('should throw good error if data is not exported', async () => { const runner = getRunner(); try { await runner('', './test/noExport.js'); } catch (error) { expect(error).toBeInstanceOf(Error); expect(error.message).toBe('No { data } object exported from JavaScript file.'); } }); it('should throw js errors if js errors are thrown', async () => { const runner = getRunner(); try { await runner('', './test/invalid.js'); } catch (error) { expect(error.name).toBe('Error'); expect( error.message.startsWith( 'Failed to parse source for import analysis because the content contains invalid JS syntax' ) ).toBe(true); } }); it('javascript dates should be converted to evidence dates', async () => { const runner = getRunner(); const data = await runner('', './test/dates.js'); expect(data.columnTypes[0].evidenceType).toBe(EvidenceType.DATE); }); it('js numbers should be converted to evidence numbers', async () => { const runner = getRunner(); const data = await runner('', './test/numbers.js'); expect(data.rows[0].number).toBe(1); expect(data.columnTypes[0].evidenceType).toBe(EvidenceType.NUMBER); }); it('js booleans should be converted to evidence booleans', async () => { const runner = getRunner(); const data = await runner('', './test/bools.js'); expect(data.rows[0].bool).toBe(true); expect(data.rows[1].bool).toBe(false); expect(data.columnTypes[0].evidenceType).toBe(EvidenceType.BOOLEAN); }); it('js arrays should be converted to arrays', async () => { const runner = getRunner(); const data = await runner('', './test/arrays.js'); expect(data.rows[0].array.length).toBe(3); expect(data.rows[0].array[0]).toBe(1); expect(data.rows[0].array[1]).toBe(2); expect(data.rows[0].array[2]).toBe(3); }); it('js objects should be converted to objects', async () => { const runner = getRunner(); const data = await runner('', './test/objects.js'); expect(data.rows[0].object.name).toBe('John Doe'); expect(data.rows[0].object.age).toBe(30); }); it('js nulls should be converted to nulls', async () => { const runner = getRunner(); const data = await runner('', './test/nulls.js'); expect(data.rows[0].null).toBeNull(); }); });