UNPKG

jsonschema2ddl

Version:
137 lines (120 loc) 4.48 kB
import test from 'ava'; import dayjs from 'dayjs'; import { JSONSchemaToDatabase } from '../src/translators'; import { db, schema, schema_flat, schema_long_names, schema_time } from './helpers'; test('test_flat_schema', async t => { const conn = db(); const schem = schema_flat(); const translator = new JSONSchemaToDatabase(schem, { database_flavor: "postgres", db_schema_name: "schm", root_table_name: "my_table", }); await translator.create_tables(conn, { auto_commit: true, drop_tables: true }); await translator.create_links(conn); await translator.analyze(conn); const data = [ { "user_id": 1, "user_name": "john", "age": 20, "address": "USA" }, { "user_id": 2, "user_name": "doe", "age": 21, "address": "USA" }, ] const statement = ` INSERT INTO "schm"."my_table" (user_id, user_name, age, address) VALUES($1, $2, $3, $4) `; for (const line of data) { await conn.query(statement, Object.values(line)); } const { rows } = await conn.query('SELECT * FROM "schm"."my_table"'); t.is(rows.length, 2); }); test('test_schema', async t => { const conn = db(); const schem = schema(); const translator = new JSONSchemaToDatabase(schem, { db_schema_name: "schm", root_table_name: "my_table", }) await translator.create_tables(conn, { auto_commit: true, drop_tables: true }); await translator.create_links(conn); await translator.analyze(conn); let data: any[] = [ { "street_address": "street1", "city": "LA", "state": "CA" }, { "street_address": "street2", "city": "SF", "state": "CA" }, ]; let statement = ` INSERT INTO "schm"."address"(street_address, city, state) VALUES($1, $2, $3) `; for (const line of data) { await conn.query(statement, Object.values(line)); } let result = await conn.query('SELECT * FROM "schm"."address"'); t.is(result.rows.length, 2); data = [ { "user_id": 1, "user_name": "john", "age": 20, "address": 1 }, { "user_id": 2, "user_name": "doe", "age": 21, "address": 2 }, ]; statement = ` INSERT INTO "schm"."my_table"(user_id, user_name, age, address) VALUES($1, $2, $3, $4) `; for (const line of data) { await conn.query(statement, Object.values(line)); } result = await conn.query('SELECT * FROM "schm"."my_table"') t.is(result.rows.length, 2); const bad_data = { "user_id": 3, "user_name": "doe", "age": 21, "address": 1000 }; await t.throwsAsync(async () => { await conn.query(statement, Object.values(bad_data)); }); result = await conn.query('SELECT * FROM "schm"."my_table"'); t.is(result.rows.length, 2); }); test('test_comments', t => { const schem = schema_long_names(); const translator = new JSONSchemaToDatabase(schem); const table_comments = { "root": "the root of everything", "basic_address": "This is an address", }; let column_comments = { "basic_address": { "city": "This is a city" } }; t.is(translator.table_definitions["root"].comment, table_comments["root"]); t.is(translator.table_definitions["#/definitions/basicAddress"].comment, table_comments["basic_address"]); const columns = translator.table_definitions["#/definitions/basicAddress"].columns; column_comments = columns.reduce((a: any, c: any) => { if (c.comment) { a[c.name] = c.comment; } return a; }, {}); t.is(column_comments, column_comments); }); test('test_time_types', async t => { const conn = db(); const schem = schema_time(); const translator = new JSONSchemaToDatabase(schem); await translator.create_tables(conn, { auto_commit: true, drop_tables: true }); const data = [ { "ts": new Date(2018, 2, 3, 12, 45, 56), "d": new Date(2018, 7, 8), }, { "ts": "2017-02-03T01:23:45Z", "d": "2013-03-02" }, ]; const statement = `INSERT INTO root (ts, d) VALUES($1, $2)`; for (const line of data) { await conn.query(statement, Object.values(line)); } const result = await conn.query("SELECT ts, d FROM root"); const rows = result.rows.map(({ ts, d }) => [dayjs(ts).format("YYYY-M-DTHH:mm:ssZ[Z]"), dayjs(d).format("YYYY-M-DTHH:mm:ssZ[Z]")]); t.deepEqual(rows, [ [ dayjs(new Date(2018, 2, 3, 12, 45, 56)).format("YYYY-M-DTHH:mm:ssZ[Z]"), dayjs(new Date(2018, 7, 8)).format("YYYY-M-DTHH:mm:ssZ[Z]"), ], [ dayjs(new Date(2017, 1, 3, 1, 23, 45)).format("YYYY-M-DTHH:mm:ssZ[Z]"), dayjs(new Date(2013, 2, 2)).format("YYYY-M-DTHH:mm:ssZ[Z]"), ], ]); });