UNPKG

kysely-mapper

Version:

Flexible Kysely-based utility for mapping between tables and objects

174 lines 8.88 kB
"use strict"; /** * 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()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); const kysely_1 = require("kysely"); const table_mapper_1 = require("../mappers/table-mapper"); 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"); let db; let userMapper; beforeAll(() => __awaiter(void 0, void 0, void 0, function* () { db = yield (0, test_setup_1.createDB)(); userMapper = (0, test_mappers_1.createUserMapperReturningID)(db); })); beforeEach(() => (0, test_setup_1.resetDB)(db)); afterAll(() => (0, test_setup_1.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(test_objects_1.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(test_objects_1.USERS); // Test selecting all const users = yield userMapper.select().returnAll(); expect(users.length).toEqual(test_objects_1.USERS.length); for (let i = 0; i < test_objects_1.USERS.length; i++) { expect(users[i].handle).toEqual(test_objects_1.USERS[i].handle); } })); it('selects via key column values', () => __awaiter(void 0, void 0, void 0, function* () { yield userMapper.insert().run(test_objects_1.USERS); // Test selecting via key value const users1 = yield userMapper.select(2).returnAll(); expect(users1.length).toEqual(1); expect(users1[0].handle).toEqual(test_objects_1.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(test_objects_1.USERS[1].handle); })); it('selects with a matching field filter', () => __awaiter(void 0, void 0, void 0, function* () { yield userMapper.insert().run(test_objects_1.USERS); let users = yield userMapper .select({ name: test_objects_1.USERS[0].name, }) .returnAll(); expect(users.length).toEqual(2); expect(users[0].handle).toEqual(test_objects_1.USERS[0].handle); expect(users[1].handle).toEqual(test_objects_1.USERS[2].handle); users = yield userMapper .select({ name: test_objects_1.USERS[0].name, handle: test_objects_1.USERS[2].handle, }) .returnAll(); expect(users.length).toEqual(1); expect(users[0].handle).toEqual(test_objects_1.USERS[2].handle); users = yield userMapper .select({ handle: [test_objects_1.USERS[1].handle, test_objects_1.USERS[2].handle], }) .returnAll(); expect(users.length).toEqual(2); expect(users[0].handle).toEqual(test_objects_1.USERS[1].handle); expect(users[1].handle).toEqual(test_objects_1.USERS[2].handle); })); it('selects with a binary operation filter', () => __awaiter(void 0, void 0, void 0, function* () { yield userMapper.insert().run(test_objects_1.USERS); // Test selecting by condition (with results) let users = yield userMapper.select('name', '=', test_objects_1.USERS[0].name).returnAll(); expect(users.length).toEqual(2); expect(users[0].handle).toEqual(test_objects_1.USERS[0].handle); expect(users[1].handle).toEqual(test_objects_1.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(test_objects_1.USERS); // Test selecting by condition (with results) let users = yield userMapper .select(userMapper.ref('name'), '=', test_objects_1.USERS[0].name) .returnAll(); expect(users.length).toEqual(2); expect(users[0].handle).toEqual(test_objects_1.USERS[0].handle); expect(users[1].handle).toEqual(test_objects_1.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(test_objects_1.USERS); const users = yield userMapper .select((0, kysely_1.sql) `name != ${test_objects_1.USERS[0].name}`) .returnAll(); expect(users.length).toEqual(1); expect(users[0].handle).toEqual(test_objects_1.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(test_objects_1.USERS); const mapper = new table_mapper_1.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: test_objects_1.USERS[0].name }).returnAll(); expect(users).toEqual([ { id: ids[0].id, h: test_objects_1.USERS[0].handle, }, { id: ids[2].id, h: test_objects_1.USERS[2].handle, }, ]); (0, test_utils_1.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: test_objects_1.USERS[0].handle }); // @ts-expect-error - unselected columns are not allowed (yield mapper.select().returnAll())[0].name; })); })); (0, test_utils_1.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((0, kysely_1.sql) `name = 'Sue'`) .returnAll() // @ts-expect-error - only table columns are accessible w/ expr filter )[0].notThere; })); }); //# sourceMappingURL=select-all.test.js.map