kysely-mapper
Version:
Flexible Kysely-based utility for mapping between tables and objects
113 lines • 5.98 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 { sql } from 'kysely';
import { TableMapper } from '../mappers/table-mapper';
import { createDB, resetDB, destroyDB } from './utils/test-setup';
import { createUserMapperReturningID } from './utils/test-mappers';
import { USERS } from './utils/test-objects';
import { ignore } from './utils/test-utils';
let db;
let userMapper;
beforeAll(() => __awaiter(void 0, void 0, void 0, function* () {
db = yield createDB();
userMapper = createUserMapperReturningID(db);
}));
beforeEach(() => resetDB(db));
afterAll(() => destroyDB(db));
describe('selecting one return', () => {
it('selects the first row with no filter', () => __awaiter(void 0, void 0, void 0, function* () {
yield userMapper.insert().run(USERS);
let user = yield userMapper.select().returnOne();
expect(user === null || user === void 0 ? void 0 : user.handle).toEqual(USERS[0].handle);
user = yield userMapper.select({}).returnOne();
expect(user === null || user === void 0 ? void 0 : user.handle).toEqual(USERS[0].handle);
}));
it('selects the first row with a matching field filter', () => __awaiter(void 0, void 0, void 0, function* () {
yield userMapper.insert().run(USERS);
let user = yield userMapper.select({ name: USERS[0].name }).returnOne();
expect(user === null || user === void 0 ? void 0 : user.handle).toEqual(USERS[0].handle);
user = yield userMapper
.select({
name: USERS[0].name,
handle: USERS[2].handle,
})
.returnOne();
expect(user === null || user === void 0 ? void 0 : user.handle).toEqual(USERS[2].handle);
user = yield userMapper
.select({
id: [1, 2],
handle: [USERS[1].handle, USERS[2].handle],
})
.returnOne();
expect(user === null || user === void 0 ? void 0 : user.handle).toEqual(USERS[1].handle);
}));
it('selects the first row with a binary operation filter', () => __awaiter(void 0, void 0, void 0, function* () {
yield userMapper.insert().run(USERS);
// Test selecting by condition (with result)
let user = yield userMapper.select('name', '=', USERS[0].name).returnOne();
expect(user === null || user === void 0 ? void 0 : user.handle).toEqual(USERS[0].handle);
// Test selecting by condition (no result)
user = yield userMapper.select('name', '=', 'nonexistent').returnOne();
expect(user).toBeNull();
}));
it('selects the first row with a query expression filter', () => __awaiter(void 0, void 0, void 0, function* () {
yield userMapper.insert().run(USERS);
const user = yield userMapper
.select(sql `name != ${USERS[0].name}`)
.returnOne();
expect(user === null || user === void 0 ? void 0 : user.handle).toEqual(USERS[1].handle);
}));
it('selects the first row with a compound filter', () => __awaiter(void 0, void 0, void 0, function* () {
const userIDs = yield userMapper.insert().returnAll(USERS);
const user = yield userMapper
.select(({ and, cmpr }) => and([cmpr('name', '=', USERS[0].name), cmpr('id', '>', userIDs[0].id)]))
.returnOne();
expect(user === null || user === void 0 ? void 0 : user.handle).toEqual(USERS[2].handle);
}));
it('selects one returning selected columns and aliases', () => __awaiter(void 0, void 0, void 0, function* () {
const ids = yield userMapper.insert().returnAll(USERS);
const mapper = new TableMapper(db, 'users', {
selectedColumns: ['id', 'handle as h'],
});
// Should allow access to aliased columns
(yield mapper.select().returnOne()).h;
const user = yield mapper.select({ handle: USERS[0].handle }).returnOne();
expect(user).toEqual({ id: ids[0].id, h: USERS[0].handle });
ignore('inaccessible types are not allowed', () => __awaiter(void 0, void 0, void 0, function* () {
// @ts-expect-error - unselected columns are not allowed
(yield mapper.select().returnAll())[0].name;
}));
}));
ignore('detects selecting returnOne() type errors', () => __awaiter(void 0, void 0, void 0, function* () {
// @ts-expect-error - only table columns are accessible unfiltered
(yield userMapper.select({}).returnOne()).notThere;
// @ts-expect-error - only table columns are accessible w/ object filter
(yield userMapper.select({ name: 'Sue' }).returnOne()).notThere;
// @ts-expect-error - only table columns are accessible w/ op filter
// prettier-ignore
(yield userMapper.select("name", "=", "Sue").returnOne()).notThere;
// prettier-ignore
(yield userMapper
.select((qb) => qb)
.returnOne()
// @ts-expect-error - only table columns are accessible w/ QB filter
).notThere;
// prettier-ignore
(yield userMapper
.select(sql `name = 'Sue'`)
.returnOne()
// @ts-expect-error - only table columns are accessible w/ expr filter
).notThere;
}));
});
//# sourceMappingURL=select-one.test.js.map