kysely-mapper
Version:
Flexible Kysely-based utility for mapping between tables and objects
201 lines • 10.4 kB
JavaScript
/**
* Tests TableMapper.selectMany(), TableMapper.selectOne(), and query filters.
*/
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());
});
};
import { TableMapper } from '../mappers/table-mapper';
import { createDB, resetDB, destroyDB } from './utils/test-setup';
import { createUserMapperReturningID, createUserMapperReturningNothing, } from './utils/test-mappers';
import { USERS } from './utils/test-objects';
import { ignore } from './utils/test-utils';
let db;
let userMapper;
let userMapperReturningNothing;
beforeAll(() => __awaiter(void 0, void 0, void 0, function* () {
db = yield createDB();
userMapper = createUserMapperReturningID(db);
userMapperReturningNothing = createUserMapperReturningNothing(db);
}));
beforeEach(() => resetDB(db));
afterAll(() => destroyDB(db));
describe('general selection', () => {
it('compiles an unparameterized select query', () => __awaiter(void 0, void 0, void 0, function* () {
yield userMapper.insert().run(USERS);
const compilation = userMapper.select({ name: USERS[0].name }).compile();
const users = yield compilation.returnAll({});
expect(users.length).toEqual(2);
expect(users[0].handle).toEqual(USERS[0].handle);
expect(users[1].handle).toEqual(USERS[2].handle);
// Ensure that the provided columns are not optional
((_) => { })(users[0].handle);
const user = yield compilation.returnOne({});
expect(user === null || user === void 0 ? void 0 : user.handle).toEqual(USERS[0].handle);
// Ensure that the provided columns are not optional
((_) => { })(user.name);
ignore('compilation type errors', () => {
// @ts-expect-error - errors on invalid column names
users[0].notThere;
// @ts-expect-error - errors on invalid column names
user.notThere;
});
}));
it('parameterizes and compiles a select query', () => __awaiter(void 0, void 0, void 0, function* () {
yield userMapper.insert().run(USERS);
const parameterization = userMapper.parameterize(({ mapper, param }) => mapper.select({ name: param('name') }));
// test returnAll() returning multiple
const users = yield parameterization.returnAll({ name: USERS[0].name });
expect(users.length).toEqual(2);
expect(users[0].handle).toEqual(USERS[0].handle);
expect(users[1].handle).toEqual(USERS[2].handle);
// Ensure that the provided columns are not optional
((_) => { })(users[0].handle);
// test returnAll() returning none
const users2 = yield parameterization.returnAll({ name: 'not there' });
expect(users2.length).toEqual(0);
// test returnOne() returning one
const user = yield parameterization.returnOne({ name: USERS[1].name });
expect(user === null || user === void 0 ? void 0 : user.handle).toEqual(USERS[1].handle);
// Ensure that the provided columns are not optional
((_) => { })(user.name);
// test returnOne() returning none
const user2 = yield parameterization.returnOne({ name: 'not there' });
expect(user2).toBeNull();
ignore('parameterization type errors', () => {
// @ts-expect-error - errors on invalid parameter names
parameterization.returnAll({ notThere: 'foo' });
// @ts-expect-error - errors on invalid column names
users[0].notThere;
// @ts-expect-error - errors on invalid column names
user.notThere;
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.returnOne({ notThere: 'foo' });
// @ts-expect-error - errors on invalid parameter value type
parameterization.returnOne({ name: 123 });
});
}));
it('modifies the underlying query builder', () => __awaiter(void 0, void 0, void 0, function* () {
yield userMapper.insert().run(USERS);
const users = yield userMapper
.select()
.modify((qb) => qb.where('name', '=', USERS[0].name).orderBy('handle', 'desc'))
.returnAll();
expect(users.length).toEqual(2);
expect(users[0].handle).toEqual(USERS[2].handle);
expect(users[1].handle).toEqual(USERS[0].handle);
const user = yield userMapper
.select()
.modify((qb) => qb.where('name', '=', USERS[0].name).orderBy('handle', 'desc'))
.returnOne();
expect(user === null || user === void 0 ? void 0 : user.handle).toEqual(USERS[2].handle);
}));
it('does not modify the underlying selected columns', () => __awaiter(void 0, void 0, void 0, function* () {
yield userMapper.insert().run(USERS);
const users = yield userMapper
.select()
.modify((qb) => qb.select('name').orderBy('handle', 'desc'))
.returnAll();
expect(users).toEqual([
Object.assign(Object.assign({}, USERS[2]), { id: 3 }),
Object.assign(Object.assign({}, USERS[1]), { id: 2 }),
Object.assign(Object.assign({}, USERS[0]), { id: 1 }),
]);
// Ensure that columns can be addressed by name.
((_) => { })(users[0].id);
((_) => { })(users[0].handle);
((_) => { })(users[0].name);
((_) => { })(users[0].email);
const user = yield userMapper
.select()
.modify((qb) => qb.select('name').orderBy('handle', 'desc'))
.returnOne();
expect(user).toEqual(Object.assign(Object.assign({}, USERS[2]), { id: 3 }));
// Ensure that columns can be addressed by name.
((_) => { })(user.id);
((_) => { })(user.handle);
((_) => { })(user.name);
((_) => { })(user.email);
ignore('detects modify() type errors', () => __awaiter(void 0, void 0, void 0, function* () {
// @ts-expect-error - cannot access invalid columns
users[0].notThere;
// @ts-expect-error - cannot access invalid columns
user.notThere;
}));
}));
it('selects via a multi-column key tuple (definition order)', () => __awaiter(void 0, void 0, void 0, function* () {
const mapper = new TableMapper(db, 'users', {
keyColumns: ['id', 'name'],
});
yield mapper.insert().run(USERS);
const users = yield mapper.select([3, 'Sue']).returnAll();
expect(users.length).toEqual(1);
expect(users[0].name).toEqual(USERS[2].name);
ignore('detects key colum tuple type errors', () => {
// @ts-expect-error - key tuple must have correct length
mapper.select(['Sue']);
// @ts-expect-error - key tuple must have correct length
mapper.select(['Sue', 3, 'foo']);
// @ts-expect-error - key tuple must have correct types
mapper.select(['Sue', 'foo']);
// @ts-expect-error - primitive key values are not allowed
mapper.select('Sue');
// @ts-expect-error - primitive key values are not allowed
mapper.select(1);
});
}));
it('selects via a multi-column key tuple (different order)', () => __awaiter(void 0, void 0, void 0, function* () {
const mapper = new TableMapper(db, 'users', {
keyColumns: ['name', 'id'],
});
yield mapper.insert().run(USERS);
const users = yield mapper.select(['Sue', 3]).returnAll();
expect(users.length).toEqual(1);
expect(users[0].name).toEqual(USERS[2].name);
ignore('detects key colum tuple type errors', () => {
// @ts-expect-error - key tuple must have correct length
mapper.select(['Sue']);
// @ts-expect-error - key tuple must have correct length
mapper.select(['Sue', 3, 'foo']);
// @ts-expect-error - key tuple must have correct types
mapper.select(['Sue', 'foo']);
// @ts-expect-error - primitive key values are not allowed
mapper.select('Sue');
// @ts-expect-error - primitive key values are not allowed
mapper.select(1);
});
}));
ignore('detects select(filter) type errors', () => __awaiter(void 0, void 0, void 0, function* () {
// @ts-expect-error - doesn't allow only two arguments
userMapper.select('name', '=');
// @ts-expect-error - object filter fields must be valid
userMapper.select({ notThere: 'xyz' });
userMapper.select(({ or, cmpr }) =>
// @ts-expect-error - where expression columns must be valid
or([cmpr('notThere', '=', 'Sue')]));
// @ts-expect-error - binary op filter fields must be valid
userMapper.select('notThere', '=', 'foo');
// @ts-expect-error - binary op filter fields must be valid
userMapper.select('users.notThere', '=', 'foo');
// @ts-expect-error - ID filter must have correct type
userMapper.select('str');
// @ts-expect-error - ID filter must have correct type
userMapper.select(['str']);
// @ts-expect-error - ID filter not allowed when when no ID column
userMapperReturningNothing.select(1);
// @ts-expect-error - ID filter not allowed when when no ID column
userMapperReturningNothing.select([1]);
}));
});
//# sourceMappingURL=select-general.test.js.map