UNPKG

kysely-mapper

Version:

Flexible Kysely-based utility for mapping between tables and objects

217 lines 11.5 kB
"use strict"; 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 test_setup_1 = require("./utils/test-setup"); const test_mappers_1 = require("./utils/test-mappers"); const test_objects_1 = require("./utils/test-objects"); const test_utils_1 = require("./utils/test-utils"); const table_mapper_1 = require("../mappers/table-mapper"); let db; let userMapper; let userMapperReturningNothing; beforeAll(() => __awaiter(void 0, void 0, void 0, function* () { db = yield (0, test_setup_1.createDB)(); userMapper = (0, test_mappers_1.createUserMapperReturningAll)(db); userMapperReturningNothing = (0, test_mappers_1.createUserMapperReturningNothing)(db); })); beforeEach(() => (0, test_setup_1.resetDB)(db)); afterAll(() => (0, test_setup_1.destroyDB)(db)); describe('deleting rows via TableMapper', () => { it('accepts readonly filters', () => __awaiter(void 0, void 0, void 0, function* () { const filter = { name: 'Not There' }; yield userMapper.delete(filter).run(); yield userMapper.delete(filter).returnCount(); })); it("doesn't delete anything if no rows match", () => __awaiter(void 0, void 0, void 0, function* () { const count = yield userMapper .delete({ name: test_objects_1.USERS[0].name }) .returnCount(); expect(count).toEqual(0); const success = yield userMapper.delete({ name: test_objects_1.USERS[0].name }).run(); expect(success).toEqual(false); })); it('deletes rows without returning a count', () => __awaiter(void 0, void 0, void 0, function* () { const testMapper = new table_mapper_1.TableMapper(db, 'users').withTransforms({ countTransform: (count) => Number(count), }); yield testMapper.insert().run(test_objects_1.USERS); const success = yield testMapper.delete({ name: test_objects_1.USERS[0].name }).run(); expect(success).toBe(true); const users = yield testMapper.select().returnAll(); expect(users.length).toEqual(1); expect(users[0].handle).toEqual(test_objects_1.USERS[1].handle); })); it('deletes rows returning the deletion count as bigint default', () => __awaiter(void 0, void 0, void 0, function* () { const defaultMapper = (0, test_mappers_1.createUserMapperReturningDefault)(db); const count1 = yield defaultMapper .delete({ name: test_objects_1.USERS[0].name }) .returnCount(); expect(count1).toEqual(BigInt(0)); yield defaultMapper.insert().run(test_objects_1.USERS); const count2 = yield defaultMapper .delete({ name: test_objects_1.USERS[0].name }) .returnCount(); expect(count2).toEqual(BigInt(2)); const users = yield defaultMapper.select().returnAll(); expect(users.length).toEqual(1); expect(users[0].handle).toEqual(test_objects_1.USERS[1].handle); })); it('deletes rows returning the deletion count inferred as a number', () => __awaiter(void 0, void 0, void 0, function* () { const testMapper = new table_mapper_1.TableMapper(db, 'users').withTransforms({ countTransform: (count) => Number(count), }); yield testMapper.insert().run(test_objects_1.USERS); const count = yield testMapper .delete({ name: test_objects_1.USERS[0].name }) .returnCount(); expect(count).toEqual(2); })); it('deletes rows returning the deletion count as number', () => __awaiter(void 0, void 0, void 0, function* () { const count1 = yield userMapper .delete({ name: test_objects_1.USERS[0].name }) .returnCount(); expect(count1).toEqual(0); yield userMapper.insert().run(test_objects_1.USERS); const count2 = yield userMapper .delete({ name: test_objects_1.USERS[0].name }) .returnCount(); expect(count2).toEqual(2); const users = yield userMapper.select().returnAll(); expect(users.length).toEqual(1); expect(users[0].handle).toEqual(test_objects_1.USERS[1].handle); })); it('deletes all rows without a filter', () => __awaiter(void 0, void 0, void 0, function* () { yield userMapper.insert().run(test_objects_1.USERS); const count1 = yield userMapper.delete().returnCount(); expect(count1).toEqual(3); const users1 = yield userMapper.select().returnAll(); expect(users1.length).toEqual(0); yield userMapper.insert().run(test_objects_1.USERS); const success = yield userMapper.delete().run(); expect(success).toBe(true); const users2 = yield userMapper.select().returnAll(); expect(users2.length).toEqual(0); })); it('deletes rows specified via compound filter', () => __awaiter(void 0, void 0, void 0, function* () { yield userMapper.insert().run(test_objects_1.USERS); const count1 = yield userMapper .delete(({ and, cmpr }) => and([ cmpr('name', '=', test_objects_1.USERS[0].name), cmpr('handle', '=', test_objects_1.USERS[0].handle), ])) .returnCount(); expect(count1).toEqual(1); const count2 = yield userMapper .delete(({ or, cmpr }) => or([ cmpr('name', '=', test_objects_1.USERS[0].name), cmpr('handle', '=', test_objects_1.USERS[0].handle), ])) .returnCount(); expect(count2).toEqual(1); })); it('deletes rows specified via binary operation', () => __awaiter(void 0, void 0, void 0, function* () { yield userMapper.insert().run(test_objects_1.USERS); const count1 = yield userMapper .delete('name', '=', test_objects_1.USERS[0].name) .returnCount(); expect(count1).toEqual(2); const users = yield userMapper.select().returnAll(); expect(users.length).toEqual(1); expect(users[0].handle).toEqual(test_objects_1.USERS[1].handle); })); it('modifies a delete query builder', () => __awaiter(void 0, void 0, void 0, function* () { yield userMapper.insert().run(test_objects_1.USERS); yield userMapper.insert().run(Object.assign(Object.assign({}, test_objects_1.USERS[1]), { handle: 'user4' })); const count1 = yield userMapper .delete() .modify((qb) => qb.where('name', '=', test_objects_1.USERS[0].name)) .returnCount(); expect(count1).toEqual(2); const count2 = yield userMapper .delete({ name: test_objects_1.USERS[1].name }) .modify((qb) => qb.where('handle', '=', 'user4')) .returnCount(); expect(count2).toEqual(1); const users = yield userMapper.select().returnAll(); expect(users.length).toEqual(1); })); it('compiles an unparameterized delete query', () => __awaiter(void 0, void 0, void 0, function* () { yield userMapper.insert().run(test_objects_1.USERS); const compilation = userMapper.delete({ name: test_objects_1.USERS[0].name }).compile(); const count1 = yield compilation.returnCount({}); expect(count1).toEqual(2); const users = yield userMapper.select().returnAll(); expect(users.length).toEqual(1); expect(users[0].handle).toEqual(test_objects_1.USERS[1].handle); yield userMapper.insert().run(test_objects_1.USERS[2]); const success = yield compilation.run({}); expect(success).toBe(true); const users2 = yield userMapper.select().returnAll(); expect(users2.length).toEqual(1); expect(users2[0].handle).toEqual(test_objects_1.USERS[1].handle); })); it('parameterizes and compiles a delete query', () => __awaiter(void 0, void 0, void 0, function* () { const parameterization = userMapper.parameterize(({ mapper, param }) => mapper.delete({ name: param('targetName') })); const count1 = yield parameterization.returnCount({ targetName: test_objects_1.USERS[0].name, }); expect(count1).toEqual(0); yield userMapper.insert().run(test_objects_1.USERS); const count2 = yield parameterization.returnCount({ targetName: test_objects_1.USERS[0].name, }); expect(count2).toEqual(2); const users = yield userMapper.select().returnAll(); expect(users.length).toEqual(1); expect(users[0].handle).toEqual(test_objects_1.USERS[1].handle); const count3 = yield parameterization.returnCount({ targetName: test_objects_1.USERS[1].name, }); expect(count3).toEqual(1); const users2 = yield userMapper.select().returnAll(); expect(users2.length).toEqual(0); (0, test_utils_1.ignore)('parameterization type errors', () => { // @ts-expect-error - errors on invalid parameter names parameterization.run({ notThere: 'foo' }); userMapper.parameterize( // @ts-expect-error - errors on invalid parameter name ({ mapper, param }) => mapper.select({ name: param('notThere') })); userMapper.parameterize( // @ts-expect-error - errors on invalid parameter type ({ mapper, param }) => mapper.select({ name: param('name') })); // @ts-expect-error - errors on invalid parameter value name parameterization.run({ notThere: 'foo' }); // @ts-expect-error - errors on invalid parameter value type parameterization.run({ targetName: 123 }); }); })); (0, test_utils_1.ignore)('detects deletion type errors', () => __awaiter(void 0, void 0, void 0, function* () { // @ts-expect-error - table must have all filter fields userMapper.delete({ notThere: 'xyz' }); // @ts-expect-error - table must have all filter fields userMapper.delete('notThere', '=', 'foo'); userMapper.delete(({ or, cmpr }) => // @ts-expect-error - only table columns are accessible via anyOf() or([cmpr('notThere', '=', 'xyz'), cmpr('alsoNotThere', '=', 'Sue')])); userMapper.delete(({ or, cmpr }) => // @ts-expect-error - only table columns are accessible via allOf() or([cmpr('notThere', '=', 'xyz'), cmpr('alsoNotThere', '=', 'Sue')])); // @ts-expect-error - ID filter must have correct type userMapper.delete('str'); // @ts-expect-error - ID filter must have correct type userMapper.delete(['str']); // @ts-expect-error - ID filter not allowed when when no ID column userMapperReturningNothing.delete(1); // @ts-expect-error - ID filter not allowed when when no ID column userMapperReturningNothing.delete([1]); })); }); //# sourceMappingURL=delete.test.js.map