jsonschema2ddl
Version:
Convert JSON Schema to DDL
137 lines (120 loc) • 4.48 kB
text/typescript
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]"),
],
]);
});