kysely-mapper
Version:
Flexible Kysely-based utility for mapping between tables and objects
148 lines • 7.6 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const table_mapper_1 = require("../mappers/table-mapper");
const test_setup_1 = require("./utils/test-setup");
const test_objects_1 = require("./utils/test-objects");
const test_utils_1 = require("./utils/test-utils");
const test_types_1 = require("./utils/test-types");
const test_mappers_1 = require("./utils/test-mappers");
let db;
beforeAll(() => __awaiter(void 0, void 0, void 0, function* () {
db = yield (0, test_setup_1.createDB)();
userMapperReturningNothing = (0, test_mappers_1.createUserMapperReturningNothing)(db);
userMapperReturningAll = (0, test_mappers_1.createUserMapperReturningAll)(db);
}));
beforeEach(() => (0, test_setup_1.resetDB)(db));
afterAll(() => (0, test_setup_1.destroyDB)(db));
let userMapperReturningNothing;
let userMapperReturningAll;
describe('compiled insertions', () => {
it('compiles a non-returning insert query without transformation', () => __awaiter(void 0, void 0, void 0, function* () {
const compilation = userMapperReturningNothing
.insert()
.columns(['name', 'handle'])
.compile();
// test run()
const success1 = yield compilation.run(test_objects_1.USERS[1]);
expect(success1).toBe(true);
// test returnOne()
const success2 = yield compilation.returnOne(test_objects_1.USERS[2]);
expect(success2).toBeUndefined();
const readUsers = yield userMapperReturningAll.select().returnAll();
expect(readUsers.length).toEqual(2);
expect(readUsers[0].handle).toEqual(test_objects_1.USERS[1].handle);
expect(readUsers[0].email).toEqual(null);
expect(readUsers[1].handle).toEqual(test_objects_1.USERS[2].handle);
expect(readUsers[1].email).toEqual(null);
}));
it('compiles a returning insert query without transformation', () => __awaiter(void 0, void 0, void 0, function* () {
const compilation = userMapperReturningAll
.insert()
.columns(['name', 'handle', 'email'])
.compile();
// test returnOne()
const insertReturn = yield compilation.returnOne(test_objects_1.USERS[0]);
expect(insertReturn).toEqual(Object.assign(Object.assign({}, test_objects_1.USERS[0]), { id: 1 }));
// Ensure that the provided columns are accessible
((_) => { })(insertReturn.name);
// test run()
const success1 = yield compilation.run(test_objects_1.USERS[1]);
expect(success1).toBe(true);
// test that non-specified columns are not inserted
const success2 = yield compilation.run(Object.assign(Object.assign({}, test_objects_1.USERS[2]), { id: 100 }));
expect(success2).toBe(true);
const readUsers = yield userMapperReturningAll.select().returnAll();
expect(readUsers.length).toEqual(3);
expect(readUsers[0].handle).toEqual(test_objects_1.USERS[0].handle);
expect(readUsers[1].handle).toEqual(test_objects_1.USERS[1].handle);
expect(readUsers[2].handle).toEqual(test_objects_1.USERS[2].handle);
expect(readUsers[2].id).toEqual(3);
(0, test_utils_1.ignore)('check compile-time types', () => {
compilation.returnOne({
name: 'xyz',
handle: 'pdq',
email: 'abc@def.hij',
// @ts-expect-error - only insertable columns are allowed
notThere: 32,
});
// @ts-expect-error - only expected columns are returned
insertReturn.notThere;
});
}));
it('compiles an insert query with transformation', () => __awaiter(void 0, void 0, void 0, function* () {
expect.assertions(7);
const columnSubset = [
'name',
'handle',
'email',
];
const transformMapper = new table_mapper_1.TableMapper(db, 'users', {
insertReturnColumns: ['id'],
}).withTransforms({
selectTransform: (row) => {
const names = row.name.split(' ');
return new test_types_1.User(row.id, names[0], names[1], row.handle, row.email);
},
insertTransform: (source, columns) => {
expect(columns).toEqual(columnSubset);
return {
name: `${source.firstName} ${source.lastName}`,
handle: source.handle,
email: source.email,
};
},
insertReturnTransform: (source, returns) => new test_types_1.User(returns.id, source.firstName, source.lastName, source.handle, source.email),
countTransform: (count) => Number(count),
});
const user1 = new test_types_1.User(0, 'John', 'Doe', 'johndoe', 'jdoe@abc.def');
const user2 = new test_types_1.User(0, 'Sam', 'Gamgee', 'sg', 'sg@abc.def');
const user3 = new test_types_1.User(100, 'Sue', 'Rex', 'srex', 'srex@abc.def');
const compilation = transformMapper
.insert()
.columns(columnSubset)
.compile();
// test returnOne()
const insertReturn = yield compilation.returnOne(user1);
expect(insertReturn).toEqual(test_types_1.User.create(1, user1));
// Ensure that the provided columns are accessible
((_) => { })(insertReturn.firstName);
// test run()
const success1 = yield compilation.run(user2);
expect(success1).toBe(true);
// test that non-specified columns are not inserted
const success2 = yield compilation.run(user3);
expect(success2).toBe(true);
const readUsers = yield transformMapper.select().returnAll();
expect(readUsers).toEqual([
test_types_1.User.create(1, user1),
test_types_1.User.create(2, user2),
test_types_1.User.create(3, user3),
]);
(0, test_utils_1.ignore)('check compile-time types', () => {
// @ts-expect-error - only insertable objecs are allowed
compilation.returnOne(test_objects_1.USERS[0]);
// @ts-expect-error - only insertable objecs are allowed
compilation.run(test_objects_1.USERS[0]);
});
}));
it('requires all indicated columns to be inserted', () => __awaiter(void 0, void 0, void 0, function* () {
const compilation = userMapperReturningAll
.insert()
.columns(['name', 'handle', 'email'])
.compile();
const insertValues = { name: 'John Doe', handle: 'johndoe' };
expect(() => compilation.returnOne(insertValues)).rejects.toThrow(`column 'email' missing`);
const success = yield compilation.run(Object.assign(Object.assign({}, insertValues), { email: null }));
expect(success).toBe(true);
}));
});
//# sourceMappingURL=insert-compile.test.js.map
;