UNPKG

tg-bot-builder

Version:

Modular NestJS builder for multi-step Telegram bots with Prisma persistence and pluggable session storage.

86 lines (75 loc) 2.63 kB
import { Logger } from '@nestjs/common'; import type { PrismaClient as ActualPrismaClient } from '@prisma/client/extension'; import type { IBotBuilderOptions } from '../../src'; import { BotRuntime, BotRuntimeDependencies, IBotRuntimeOptions, normalizeBotOptions, } from '../../src'; import { BuilderService } from '../../src'; import { createMockPrisma, PrismaClient as MockPrismaClient, } from '../mocks/prisma'; import { createInMemorySessionStorage } from '../mocks/session-storage'; type BotOptionOverrides = Partial<Omit<IBotBuilderOptions, 'prisma'>> & { prisma?: MockPrismaClient | ActualPrismaClient; }; export interface CreateTestBotRuntimeOptions extends BotOptionOverrides { logger?: Logger; runtimeDependencies?: BotRuntimeDependencies; } export interface CreateTestBuilderServiceOptions { prisma?: MockPrismaClient | ActualPrismaClient; } const DEFAULT_BOT_OPTIONS: IBotBuilderOptions = { TG_BOT_TOKEN: 'test-token', id: 'test-bot', pages: [], handlers: [], middlewares: [], keyboards: [], services: {}, pageMiddlewares: [], }; const mergeBotOptions = ( overrides: BotOptionOverrides, ): IBotBuilderOptions => ({ ...DEFAULT_BOT_OPTIONS, ...overrides, pages: overrides.pages ?? [], handlers: overrides.handlers ?? [], middlewares: overrides.middlewares ?? [], keyboards: overrides.keyboards ?? [], services: overrides.services ?? {}, pageMiddlewares: overrides.pageMiddlewares ?? [], dependencies: overrides.dependencies, prisma: overrides.prisma as ActualPrismaClient | undefined, }); export const createTestBotRuntime = ( options: CreateTestBotRuntimeOptions = {}, ): { runtime: BotRuntime; options: IBotRuntimeOptions } => { const { logger, runtimeDependencies, ...botOverrides } = options; const botOptions = mergeBotOptions(botOverrides); if (!botOptions.sessionStorage) { botOptions.sessionStorage = createInMemorySessionStorage(); } if (!botOptions.prisma) { botOptions.prisma = createMockPrisma() as unknown as ActualPrismaClient; } const normalized = normalizeBotOptions(botOptions); const runtime = new BotRuntime( normalized, logger ?? new Logger('TestBotRuntime'), runtimeDependencies, ); return { runtime, options: normalized }; }; export const createTestBuilderService = ( options: CreateTestBuilderServiceOptions = {}, ): BuilderService => { const prisma = options.prisma ?? (createMockPrisma() as unknown as ActualPrismaClient); return new BuilderService(prisma); };