kysely-mapper
Version:
Flexible Kysely-based utility for mapping between tables and objects
217 lines • 11.5 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 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
;