UNPKG

kysely-mapper

Version:

Flexible Kysely-based utility for mapping between tables and objects

113 lines 5.98 kB
/** * 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