kysely-mapper
Version:
Flexible Kysely-based utility for mapping between tables and objects
174 lines • 8.88 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());
});
};
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
;