@goatlab/fluent
Version:
Readable query Interface & API generator for TS and Node
255 lines • 12.6 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.genericUnifiedTestSuite = void 0;
const vitest_1 = require("vitest");
const flock_1 = require("../TypeOrmConnector/test/flock");
const genericUnifiedTestSuite = (options) => {
const { createGoatConnector, createTypeOrmConnector, dbType } = options;
let GoatRepo;
let TypeOrmRepo;
(0, vitest_1.beforeAll)(() => {
GoatRepo = createGoatConnector();
TypeOrmRepo = createTypeOrmConnector();
});
(0, vitest_1.describe)('Basic Tests', () => {
(0, vitest_1.beforeEach)(async () => {
// Clear data before each test to ensure clean state
await GoatRepo.clear();
});
(0, vitest_1.it)('insert - Should insert data', async () => {
const a = await GoatRepo.insert({ name: 'myGoat', age: 13 });
(0, vitest_1.expect)(typeof a.id).toBe('string');
(0, vitest_1.expect)(a.name).toBe('myGoat');
});
(0, vitest_1.it)('insert - Should insert data with customId', async () => {
const customId = dbType === 'postgresql'
? '550e8400-e29b-41d4-a716-446655440000'
: '631ce4304f9183f61ffb613a';
const a = await GoatRepo.insert({
id: customId,
name: 'myGoat',
age: 13,
});
(0, vitest_1.expect)(typeof a.id).toBe('string');
(0, vitest_1.expect)(a.id).toBe(customId);
});
(0, vitest_1.it)('insertMany - Should insert Multiple elements', async () => {
const insertedFlock = await GoatRepo.insertMany(flock_1.flock);
(0, vitest_1.expect)(insertedFlock[0].name).toBe('Goatee');
});
(0, vitest_1.it)('findById - Should GET an object by its ID', async () => {
const goats = await GoatRepo.insertMany(flock_1.flock);
const goat = await GoatRepo.findById(goats[0].id);
(0, vitest_1.expect)(goat?.id).toBe(goats[0].id);
(0, vitest_1.expect)(typeof goat?.id).toBe('string');
const anotherGoat = await GoatRepo.findById('507f1f77bcf86cd799439011');
(0, vitest_1.expect)(anotherGoat).toBe(null);
});
(0, vitest_1.it)('findById - Should GET selected Data', async () => {
const goats = await GoatRepo.insertMany(flock_1.flock);
const goat = await GoatRepo.findById(goats[0].id, {
select: { name: true },
});
(0, vitest_1.expect)(goat?.name).toBe(goats[0].name);
(0, vitest_1.expect)(goat?.age).toBeUndefined();
});
(0, vitest_1.it)('findByIds - Should GET data', async () => {
const goats = await GoatRepo.insertMany(flock_1.flock);
const storedGoats = await GoatRepo.findByIds([goats[0].id, goats[1].id]);
(0, vitest_1.expect)(storedGoats.length).toBe(2);
});
(0, vitest_1.it)('findByIds - Should GET selectedData', async () => {
const goats = await GoatRepo.insertMany(flock_1.flock);
const storedGoats = await GoatRepo.findByIds([goats[0].id, goats[1].id], {
select: { name: true },
});
(0, vitest_1.expect)(storedGoats[0]?.name).toBe(goats[0].name);
(0, vitest_1.expect)(storedGoats[0]?.age).toBeUndefined();
});
(0, vitest_1.it)('findMany - Should GET data', async () => {
await GoatRepo.insertMany(flock_1.flock);
const goats = await GoatRepo.findMany();
(0, vitest_1.expect)(goats.length).toBeGreaterThanOrEqual(flock_1.flock.length);
});
(0, vitest_1.it)('findMany - Should FILTER data', async () => {
await GoatRepo.insertMany(flock_1.flock);
const goats = await GoatRepo.findMany({
where: { breed: { family: 'Angora' } },
});
(0, vitest_1.expect)(goats.length).toBe(2);
});
(0, vitest_1.it)('findMany - Should FILTER not existing data', async () => {
await GoatRepo.insertMany(flock_1.flock);
const goats = await GoatRepo.findMany({
where: { name: 'TESTESTEST' },
});
(0, vitest_1.expect)(goats.length).toBe(0);
});
(0, vitest_1.it)('findMany - Should SELECT attributes', async () => {
await GoatRepo.insertMany(flock_1.flock);
const goats = await GoatRepo.findMany({
select: { name: true },
});
(0, vitest_1.expect)(goats[0]?.name).toBeDefined();
(0, vitest_1.expect)(goats[0]?.age).toBeUndefined();
});
(0, vitest_1.it)('findFirst - Should get only 1 object back', async () => {
await GoatRepo.insertMany(flock_1.flock);
const goat = await GoatRepo.findFirst();
(0, vitest_1.expect)(goat).toBeDefined();
(0, vitest_1.expect)(goat?.name).toBeDefined();
});
(0, vitest_1.it)('findFirst - Should FILTER AND SELECT DATA', async () => {
await GoatRepo.insertMany(flock_1.flock);
const goat = await GoatRepo.findFirst({
where: { breed: { family: 'Angora' } },
select: { name: true },
});
(0, vitest_1.expect)(goat?.name).toBeDefined();
(0, vitest_1.expect)(goat?.age).toBeUndefined();
});
(0, vitest_1.it)('requireFirst - Should fail if not found', async () => {
await (0, vitest_1.expect)(GoatRepo.requireFirst()).rejects.toThrow();
});
(0, vitest_1.it)('requireFirst - Should find first item', async () => {
await GoatRepo.insertMany(flock_1.flock);
const goat = await GoatRepo.requireFirst();
(0, vitest_1.expect)(goat).toBeDefined();
(0, vitest_1.expect)(goat.name).toBeDefined();
});
(0, vitest_1.it)('UpdateById - Should Update a single element', async () => {
const goats = await GoatRepo.insertMany(flock_1.flock);
await GoatRepo.updateById(goats[0].id, { name: 'MyNewName' });
const goat = await GoatRepo.findById(goats[0].id);
(0, vitest_1.expect)(goat?.name).toBe('MyNewName');
});
(0, vitest_1.it)('ReplaceById - Should Update a single element', async () => {
const goats = await GoatRepo.insertMany(flock_1.flock);
await GoatRepo.replaceById(goats[0].id, { name: 'MyNewName' });
const goat = await GoatRepo.findById(goats[0].id);
(0, vitest_1.expect)(goat?.name).toBe('MyNewName');
(0, vitest_1.expect)(goat?.age).toBeUndefined();
});
(0, vitest_1.it)('deleteById - Should delete an item', async () => {
const goats = await GoatRepo.insertMany(flock_1.flock);
const id = await GoatRepo.deleteById(goats[0].id);
(0, vitest_1.expect)(id).toBe(goats[0].id);
const findDeleted = await GoatRepo.findById(goats[0].id);
(0, vitest_1.expect)(findDeleted).toBe(null);
});
});
(0, vitest_1.describe)('Advanced Tests', () => {
(0, vitest_1.beforeEach)(async () => {
await TypeOrmRepo.clear();
});
(0, vitest_1.it)('Should get local data', async () => {
await TypeOrmRepo.insert({ test: true });
const value = await TypeOrmRepo.findFirst();
(0, vitest_1.expect)(value?.test).toBe(true);
});
(0, vitest_1.it)('pluck() should return a single array', async () => {
await TypeOrmRepo.insertMany([
{ test: true, order: 2 },
{ test: false, order: 3 },
{ test: true, order: 1 },
]);
const plucked = await TypeOrmRepo.pluck('order');
(0, vitest_1.expect)(Array.isArray(plucked)).toBe(true);
(0, vitest_1.expect)(plucked).toContain(1);
(0, vitest_1.expect)(plucked).toContain(2);
(0, vitest_1.expect)(plucked).toContain(3);
});
(0, vitest_1.it)('limit() should limit the amount of results', async () => {
await TypeOrmRepo.insertMany([
{ test: true },
{ test: false },
{ test: true },
]);
const results = await TypeOrmRepo.findMany({ limit: 2 });
(0, vitest_1.expect)(results.length).toBe(2);
});
(0, vitest_1.it)('offset() should start at the given position', async () => {
const _inserted = await TypeOrmRepo.insertMany([
{ test: true, order: 1 },
{ test: false, order: 2 },
{ test: true, order: 3 },
]);
const results = await TypeOrmRepo.findMany({
offset: 1,
orderBy: [{ order: 'asc' }],
});
(0, vitest_1.expect)(results.length).toBe(2);
(0, vitest_1.expect)(results[0].order).toBe(2);
});
(0, vitest_1.it)('orWhere() should filter the data', async () => {
await TypeOrmRepo.insertMany([
{ test: true, order: 1 },
{ test: false, order: 2 },
{ test: true, order: 3 },
]);
const results = await TypeOrmRepo.findMany({
where: {
OR: [{ test: true }, { order: 2 }],
},
});
(0, vitest_1.expect)(results.length).toBe(3);
});
(0, vitest_1.it)('orderBy() should order results desc', async () => {
await TypeOrmRepo.insertMany([
{ test: true, order: 2 },
{ test: false, order: 3 },
{ test: true, order: 1 },
]);
const results = await TypeOrmRepo.findMany({
orderBy: [{ order: 'desc' }],
});
(0, vitest_1.expect)(results[0].order).toBe(3);
(0, vitest_1.expect)(results[1].order).toBe(2);
(0, vitest_1.expect)(results[2].order).toBe(1);
});
(0, vitest_1.it)('orderBy() should order results asc', async () => {
await TypeOrmRepo.insertMany([
{ test: true, order: 2 },
{ test: false, order: 3 },
{ test: true, order: 1 },
]);
const results = await TypeOrmRepo.findMany({
orderBy: [{ order: 'asc' }],
});
(0, vitest_1.expect)(results[0].order).toBe(1);
(0, vitest_1.expect)(results[1].order).toBe(2);
(0, vitest_1.expect)(results[2].order).toBe(3);
});
(0, vitest_1.it)('orderBy() should order by Dates with Select()', async () => {
await new Promise(resolve => setTimeout(resolve, 10));
const first = await TypeOrmRepo.insert({ test: true });
await new Promise(resolve => setTimeout(resolve, 10));
const second = await TypeOrmRepo.insert({ test: true });
await new Promise(resolve => setTimeout(resolve, 10));
const third = await TypeOrmRepo.insert({ test: true });
const results = await TypeOrmRepo.findMany({
orderBy: [{ created: 'desc' }],
select: { id: true, created: true },
});
(0, vitest_1.expect)(results[0]?.id).toBe(third.id);
(0, vitest_1.expect)(results[1]?.id).toBe(second.id);
(0, vitest_1.expect)(results[2]?.id).toBe(first.id);
});
(0, vitest_1.it)('orderBy() should order by Dates without Select()', async () => {
await new Promise(resolve => setTimeout(resolve, 10));
const first = await TypeOrmRepo.insert({ test: true });
await new Promise(resolve => setTimeout(resolve, 10));
const second = await TypeOrmRepo.insert({ test: true });
await new Promise(resolve => setTimeout(resolve, 10));
const third = await TypeOrmRepo.insert({ test: true });
const results = await TypeOrmRepo.findMany({
orderBy: [{ created: 'desc' }],
});
(0, vitest_1.expect)(results[0]?.id).toBe(third.id);
(0, vitest_1.expect)(results[1]?.id).toBe(second.id);
(0, vitest_1.expect)(results[2]?.id).toBe(first.id);
});
});
};
exports.genericUnifiedTestSuite = genericUnifiedTestSuite;
//# sourceMappingURL=genericUnifiedTestSuite.js.map