import Postgrator from 'postgrator' import { DeepPartial } from 'typeorm' import { SnakeNamingStrategy } from 'typeorm-naming-strategies' import { appDataSource } from '../src/data_source' import { Filter } from '../src/entity/filter' import { Label } from '../src/entity/label' import { LibraryItem } from '../src/entity/library_item' import { Reminder } from '../src/entity/reminder' import { User } from '../src/entity/user' import { UserDeviceToken } from '../src/entity/user_device_tokens' import { entityManager, getRepository, setClaims } from '../src/repository' import { userRepository } from '../src/repository/user' import { createUser } from '../src/services/create_user' import { saveLabelsInLibraryItem } from '../src/services/labels' import { createLibraryItem } from '../src/services/library_item' import { createDeviceToken } from '../src/services/user_device_tokens' import { generateFakeUuid } from './util' const runMigrations = async () => { const migrationDirectory = __dirname + '/../../db/migrations' console.log( 'running migrations from', migrationDirectory, 'into database', process.env.PG_DB ) const postgrator = new Postgrator({ migrationDirectory: migrationDirectory, driver: 'pg', host: process.env.PG_HOST, port: process.env.PG_PORT, username: process.env.PG_USER, password: process.env.PG_PASSWORD, database: process.env.PG_DB, schemaTable: 'schemaversion', validateChecksums: true, }) const migrations = await postgrator.migrate('max') for (const migration of migrations) { console.log(` - ${migration.action} ${migration.name}`) } } export const createTestConnection = async (): Promise => { // need to manually run migrations before creating the connection // await runMigrations() appDataSource.setOptions({ type: 'postgres', host: process.env.PG_HOST, port: Number(process.env.PG_PORT), schema: 'omnivore', username: process.env.PG_USER, password: process.env.PG_PASSWORD, database: process.env.PG_DB, logging: ['query', 'info'], entities: [__dirname + '/../src/entity/**/*{.js,.ts}'], subscribers: [__dirname + '/../src/events/**/*{.js,.ts}'], namingStrategy: new SnakeNamingStrategy(), }) await appDataSource.initialize() } export const deleteFiltersFromUser = async (userId: string) => { await entityManager.transaction(async (t) => { await setClaims(t, userId) const filterRepo = t.getRepository(Filter) const userFilters = await filterRepo.findBy({ user: { id: userId } }) await Promise.all( userFilters.map((filter) => { return filterRepo.delete(filter.id) }) ) }) } export const createTestUser = async ( name: string, invite?: string | undefined, password?: string, pendingConfirmation?: boolean ): Promise => { const [newUser] = await createUser({ provider: 'GOOGLE', sourceUserId: 'fake-user-id-' + name, email: `${name}@omnivore.app`, username: name, bio: `i am ${name}`, name: name, inviteCode: invite, password: password, pendingConfirmation, }) return newUser } export const createUserWithoutProfile = async (name: string): Promise => { return userRepository.save({ source: 'GOOGLE', sourceUserId: 'fake-user-id-' + name, email: `${name}@omnivore.app`, name: name, }) } export const createTestReminder = async ( user: User, pageId?: string ): Promise => { return getRepository(Reminder).save({ user: user, elasticPageId: pageId, remindAt: new Date(), }) } export const getReminder = async (id: string): Promise => { return getRepository(Reminder).findOneBy({ id }) } export const createTestDeviceToken = async ( user: User ): Promise => { return createDeviceToken(user.id, 'fake-token') } export const createTestLibraryItem = async ( userId: string, labels?: Label[] ): Promise => { const item: DeepPartial = { user: { id: userId }, title: 'test title', originalContent: '

test content

', originalUrl: `https://blog.omnivore.app/test-url-${generateFakeUuid()}`, slug: 'test-with-omnivore', } const createdItem = await createLibraryItem(item, userId) if (labels) { await saveLabelsInLibraryItem(labels, createdItem.id, userId) } return createdItem }