1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-09-24 17:51:14 +02:00

Move user tests and add new read model test

This commit is contained in:
Gastón Fournier 2025-09-24 16:50:15 +02:00
parent 3ed342459a
commit 2a4e9781f1
No known key found for this signature in database
GPG Key ID: AF45428626E17A8E
4 changed files with 65 additions and 6 deletions

View File

@ -44,7 +44,7 @@ const mapUserToColumns = (user: ICreateUser) => ({
image_url: user.imageUrl,
});
export const rowToUser = (row) => {
const rowToUser = (row) => {
if (!row) {
throw new NotFoundError('No user found');
}

View File

@ -1,9 +1,33 @@
import type { Logger, LogProvider } from '../../logger.js';
import type { Db } from '../../db/db.js';
import { rowToUser, USER_COLUMNS_PUBLIC, USERS_TABLE } from './user-store.js';
import type { User } from '../../internals.js';
import { USER_COLUMNS_PUBLIC, USERS_TABLE } from './user-store.js';
import type { Row } from '../../db/crud/row-type.js';
type Response = {
id: number;
name?: string;
username?: string;
email?: string;
imageUrl?: string;
seenAt?: Date;
createdAt?: Date;
updatedAt?: Date | null;
deletedAt?: Date | null;
};
const toResponse = (row: Row<Response>): Response => {
return {
id: row.id,
name: row.name,
username: row.username,
email: row.email,
imageUrl: row.image_url,
seenAt: row.seen_at,
createdAt: row.created_at,
updatedAt: row.updated_at,
deletedAt: row.deleted_at,
};
};
export class UserUpdatesReadModel {
private db: Db;
@ -29,7 +53,7 @@ export class UserUpdatesReadModel {
async getUsersUpdatedAfter(
date: Date,
limit: number = 100,
): Promise<User[]> {
): Promise<Response[]> {
const result = await this.db(USERS_TABLE)
.where({
// also consider deleted users (different than activeUsers query)
@ -38,8 +62,8 @@ export class UserUpdatesReadModel {
updated_at: { $gt: date },
})
.orderBy('updated_at', 'asc')
.select(USER_COLUMNS_PUBLIC)
.select([...USER_COLUMNS_PUBLIC, 'updated_at', 'deleted_at'])
.limit(limit);
return result.map(rowToUser);
return result.map(toResponse);
}
}

View File

@ -0,0 +1,35 @@
import dbInit, { type ITestDb } from '../helpers/database-init.js';
import getLogger from '../../fixtures/no-logger.js';
import type { IUnleashStores } from '../../../lib/types/index.js';
import { beforeAll, afterAll, test, expect } from 'vitest';
let stores: IUnleashStores;
let db: ITestDb;
beforeAll(async () => {
db = await dbInit('user_store_serial', getLogger, {
experimental: { flags: {} },
});
stores = db.stores;
});
afterAll(async () => {
await db.destroy();
});
test('should have no users', async () => {
const readModel = stores.userUpdatesReadModel;
const lastUpdatedAt = await readModel.getLastUpdatedAt();
expect(lastUpdatedAt).toBeNull();
const users = await readModel.getUsersUpdatedAfter(new Date(0));
expect(users).toEqual([]);
});
test('should have no users', async () => {
const readModel = stores.userUpdatesReadModel;
const lastUpdatedAt = await readModel.getLastUpdatedAt();
expect(lastUpdatedAt).toBeNull();
const users = await readModel.getUsersUpdatedAfter(new Date(0));
expect(users).toEqual([]);
});