kysely-mapper
Version:
Flexible Kysely-based utility for mapping between tables and objects
178 lines • 9.15 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_types_1 = require("./utils/test-types");
let db;
beforeAll(() => __awaiter(void 0, void 0, void 0, function* () {
db = yield (0, test_setup_1.createDB)();
}));
beforeEach(() => (0, test_setup_1.resetDB)(db));
afterAll(() => (0, test_setup_1.destroyDB)(db));
describe('updating with transformation', () => {
it('transforms users for update without transforming return', () => __awaiter(void 0, void 0, void 0, function* () {
const mapper = new table_mapper_1.TableMapper(db, 'users', {
insertReturnColumns: ['id'],
updateReturnColumns: ['id'],
}).withTransforms({
updateTransform: (source) => ({
name: `${source.firstName} ${source.lastName}`,
handle: source.handle,
email: source.email,
}),
});
const insertReturns = yield mapper
.insert()
.returnAll([test_objects_1.userRow1, test_objects_1.userRow2, test_objects_1.userRow3]);
const updatingUser1 = test_types_1.UpdatingUser.create(0, Object.assign({}, test_objects_1.userObject1, { firstName: 'Suzanne' }));
const updateReturns = yield mapper
.update(({ or, cmpr }) => or([
cmpr('id', '=', insertReturns[0].id),
cmpr('id', '=', insertReturns[2].id),
]))
.returnAll(updatingUser1);
expect(updateReturns).toEqual([
{ id: insertReturns[0].id },
{ id: insertReturns[2].id },
]);
const readUsers = yield mapper
.select()
.modify((qb) => qb.orderBy('id'))
.returnAll();
expect(readUsers).toEqual([
Object.assign({}, test_objects_1.userRow1, {
id: insertReturns[0].id,
name: 'Suzanne Smith',
}),
Object.assign({}, test_objects_1.userRow2, { id: insertReturns[1].id }),
Object.assign({}, test_objects_1.userRow1, {
id: insertReturns[2].id,
name: 'Suzanne Smith',
}),
]);
}));
it('transforms update return into object without transforming update', () => __awaiter(void 0, void 0, void 0, function* () {
const updateReturnTransformMapper = new table_mapper_1.TableMapper(db, 'users', {
insertReturnColumns: ['id'],
updateReturnColumns: ['id'],
}).withTransforms({
updateReturnTransform: (source, returns) => new test_types_1.ReturnedUser(returns.id, source.name ? source.name.split(' ')[0] : '(first)', source.name ? source.name.split(' ')[1] : '(last)', source.handle ? source.handle : '(handle)', source.email ? source.email : '(email)'),
});
const insertReturn = yield updateReturnTransformMapper
.insert()
.returnOne(test_objects_1.userRow1);
const updateReturn1 = yield updateReturnTransformMapper
.update({ id: insertReturn.id })
.returnAll({ name: 'Suzanne Smith' });
expect(updateReturn1).toEqual([
new test_types_1.ReturnedUser(insertReturn.id, 'Suzanne', 'Smith', '(handle)', '(email)'),
]);
// Ensure the returned value is accessible as a ReturnedUser
((_) => { })(updateReturn1[0].firstName);
const updateReturn2 = yield updateReturnTransformMapper
.update({ id: insertReturn.id })
.returnOne({ name: 'Suzanne Smithy' });
expect(updateReturn2).toEqual(new test_types_1.ReturnedUser(insertReturn.id, 'Suzanne', 'Smithy', '(handle)', '(email)'));
// Ensure the returned value is accessible as a ReturnedUser
((_) => { })(updateReturn2.firstName);
}));
it('transforms update return into primitive without transforming update', () => __awaiter(void 0, void 0, void 0, function* () {
const updateReturnTransformMapper = new table_mapper_1.TableMapper(db, 'users', {
insertReturnColumns: ['id'],
updateReturnColumns: ['id'],
}).withTransforms({
insertReturnTransform: (_source, returns) => returns.id,
updateReturnTransform: (_source, returns) => returns.id,
});
const insertReturn = yield updateReturnTransformMapper
.insert()
.returnOne(test_objects_1.userRow1);
const updateReturn1 = yield updateReturnTransformMapper
.update({ id: insertReturn })
.returnAll({ name: 'Suzanne Smith' });
expect(updateReturn1).toEqual([1]);
// Ensure the returned value is accessible as a number
((_) => { })(updateReturn1[0]);
const updateReturn2 = yield updateReturnTransformMapper
.update({ id: insertReturn })
.returnOne({ name: 'Suzanne Smithy' });
expect(updateReturn2).toEqual(1);
// Ensure the returned value is accessible as a number
((_) => { })(updateReturn2);
}));
it("transforms update and update return, columns is ['*']", () => __awaiter(void 0, void 0, void 0, function* () {
expect.assertions(2);
const updateAndReturnTransformMapper = new table_mapper_1.TableMapper(db, 'users', {
insertReturnColumns: ['id'],
updateReturnColumns: ['id'],
}).withTransforms({
updateTransform: (source, columns) => {
expect(columns).toEqual(['*']);
return {
name: `${source.firstName} ${source.lastName}`,
handle: source.handle,
email: source.email,
};
},
updateReturnTransform: (source, returns) => new test_types_1.ReturnedUser(returns.id, source.firstName, source.lastName, source.handle, source.email),
});
const insertReturn = yield updateAndReturnTransformMapper
.insert()
.returnOne(test_objects_1.userRow1);
const updateReturn = yield updateAndReturnTransformMapper
.update({ id: insertReturn.id })
.returnAll(test_types_1.UpdatingUser.create(0, test_objects_1.userObject1));
expect(updateReturn).toEqual([
new test_types_1.ReturnedUser(insertReturn.id, test_objects_1.userObject1.firstName, test_objects_1.userObject1.lastName, test_objects_1.userObject1.handle, test_objects_1.userObject1.email),
]);
// Ensure the returned value is accessible as a ReturnedUser
((_) => { })(updateReturn[0].firstName);
}));
it('transforms a union of updating object types', () => __awaiter(void 0, void 0, void 0, function* () {
const mapper = new table_mapper_1.TableMapper(db, 'users', {
keyColumns: ['id'],
}).withTransforms({
updateTransform: (source) => source instanceof test_types_1.UpdatingUser
? {
name: `${source.firstName} ${source.lastName}`,
handle: source.handle,
email: source.email,
}
: source,
});
const insertReturn = yield mapper.insert().returnOne(test_objects_1.userRow1);
// test with UpdatingUser
yield mapper
.update({ id: insertReturn.id })
.columns(['name'])
.run(test_types_1.UpdatingUser.create(0, test_objects_1.userObject1));
const readUser1 = yield mapper.select(insertReturn.id).returnOne();
expect(readUser1).toEqual({
id: insertReturn.id,
name: `${test_objects_1.userObject1.firstName} ${test_objects_1.userObject1.lastName}`,
email: test_objects_1.userRow1.email,
handle: test_objects_1.userRow1.handle,
});
// test with Updateable<Users>
const newName = 'Suzanne Smith Something';
yield mapper.update({ id: insertReturn.id }).run({ name: newName });
const readUser2 = yield mapper.select(insertReturn.id).returnOne();
expect(readUser2).toEqual({
id: insertReturn.id,
name: newName,
email: test_objects_1.userRow1.email,
handle: test_objects_1.userRow1.handle,
});
}));
});
//# sourceMappingURL=update-transform.test.js.map
;