UNPKG

kysely-mapper

Version:

Flexible Kysely-based utility for mapping between tables and objects

172 lines 8.13 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 all returns', () => { it('accepts readonly filters', () => __awaiter(void 0, void 0, void 0, function* () { const filter1 = { name: 'Not There' }; yield userMapper.select(filter1).returnAll(); yield userMapper.select(filter1).returnOne(); const filter2 = { name: ['name1', 'name2'] }; yield userMapper.select(filter2).returnAll(); yield userMapper.select(filter2).returnOne(); })); it('selects nothing when nothing matches filter', () => __awaiter(void 0, void 0, void 0, function* () { yield userMapper.insert().run(USERS); const users = yield userMapper.select({ name: 'Not There' }).returnAll(); expect(users.length).toEqual(0); })); it('selects all rows with no filter', () => __awaiter(void 0, void 0, void 0, function* () { yield userMapper.insert().run(USERS); // Test selecting all const users = yield userMapper.select().returnAll(); expect(users.length).toEqual(USERS.length); for (let i = 0; i < USERS.length; i++) { expect(users[i].handle).toEqual(USERS[i].handle); } })); it('selects via key column values', () => __awaiter(void 0, void 0, void 0, function* () { yield userMapper.insert().run(USERS); // Test selecting via key value const users1 = yield userMapper.select(2).returnAll(); expect(users1.length).toEqual(1); expect(users1[0].handle).toEqual(USERS[1].handle); // Test selecting via key tuple const users2 = yield userMapper.select([2]).returnAll(); expect(users2.length).toEqual(1); expect(users2[0].handle).toEqual(USERS[1].handle); })); it('selects with a matching field filter', () => __awaiter(void 0, void 0, void 0, function* () { yield userMapper.insert().run(USERS); let users = yield userMapper .select({ name: USERS[0].name, }) .returnAll(); expect(users.length).toEqual(2); expect(users[0].handle).toEqual(USERS[0].handle); expect(users[1].handle).toEqual(USERS[2].handle); users = yield userMapper .select({ name: USERS[0].name, handle: USERS[2].handle, }) .returnAll(); expect(users.length).toEqual(1); expect(users[0].handle).toEqual(USERS[2].handle); users = yield userMapper .select({ handle: [USERS[1].handle, USERS[2].handle], }) .returnAll(); expect(users.length).toEqual(2); expect(users[0].handle).toEqual(USERS[1].handle); expect(users[1].handle).toEqual(USERS[2].handle); })); it('selects with a binary operation filter', () => __awaiter(void 0, void 0, void 0, function* () { yield userMapper.insert().run(USERS); // Test selecting by condition (with results) let users = yield userMapper.select('name', '=', USERS[0].name).returnAll(); expect(users.length).toEqual(2); expect(users[0].handle).toEqual(USERS[0].handle); expect(users[1].handle).toEqual(USERS[2].handle); // Test selecting by condition (no results) users = yield userMapper.select('name', '=', 'nonexistent').returnAll(); expect(users.length).toEqual(0); })); it('selects with a binary operation filter using .ref()', () => __awaiter(void 0, void 0, void 0, function* () { yield userMapper.insert().run(USERS); // Test selecting by condition (with results) let users = yield userMapper .select(userMapper.ref('name'), '=', USERS[0].name) .returnAll(); expect(users.length).toEqual(2); expect(users[0].handle).toEqual(USERS[0].handle); expect(users[1].handle).toEqual(USERS[2].handle); // Test selecting by condition (no results) users = yield userMapper .select(userMapper.ref('email'), '=', 'nonexistent') .returnAll(); expect(users.length).toEqual(0); })); it('selects with a query expression filter', () => __awaiter(void 0, void 0, void 0, function* () { yield userMapper.insert().run(USERS); const users = yield userMapper .select(sql `name != ${USERS[0].name}`) .returnAll(); expect(users.length).toEqual(1); expect(users[0].handle).toEqual(USERS[1].handle); })); it('selects many 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().returnAll())[0].h; const users = yield mapper.select({ name: USERS[0].name }).returnAll(); expect(users).toEqual([ { id: ids[0].id, h: USERS[0].handle, }, { id: ids[2].id, h: USERS[2].handle, }, ]); ignore('inaccessible types are not allowed', () => __awaiter(void 0, void 0, void 0, function* () { // @ts-expect-error - aliases are not allowed in filter expressions mapper.select({ h: USERS[0].handle }); // @ts-expect-error - unselected columns are not allowed (yield mapper.select().returnAll())[0].name; })); })); ignore('detects selecting returnAll() simple filter type errors', () => __awaiter(void 0, void 0, void 0, function* () { // @ts-expect-error - only table columns are accessible unfiltered (yield userMapper.select().returnAll())[0].notThere; // @ts-expect-error - only table columns are accessible unfiltered (yield userMapper.select({}).returnAll())[0].notThere; // @ts-expect-error - only table columns are accessible w/ object filter // prettier-ignore (yield userMapper.select({ name: "Sue" }).returnAll())[0].notThere; // @ts-expect-error - only table columns are accessible w/ op filter // prettier-ignore (yield userMapper.select("name", "=", "Sue").returnAll())[0].notThere; // prettier-ignore (yield userMapper .select((qb) => qb) .returnAll() // @ts-expect-error - only table columns are accessible w/ QB filter )[0].notThere; // prettier-ignore (yield userMapper .select(sql `name = 'Sue'`) .returnAll() // @ts-expect-error - only table columns are accessible w/ expr filter )[0].notThere; })); }); //# sourceMappingURL=select-all.test.js.map