Files
household-bot/packages/adapters-db/src/household-config-repository.test.ts

103 lines
3.5 KiB
TypeScript

import { randomUUID } from 'node:crypto'
import { afterAll, describe, expect, test } from 'bun:test'
import { eq, inArray } from 'drizzle-orm'
import { createDbClient, schema } from '@household/db'
import { createDbHouseholdConfigurationRepository } from './household-config-repository'
const databaseUrl = process.env.DATABASE_URL
const testIfDatabase = databaseUrl ? test : test.skip
describe('createDbHouseholdConfigurationRepository', () => {
const createdHouseholdIds: string[] = []
afterAll(async () => {
if (!databaseUrl || createdHouseholdIds.length === 0) {
return
}
const { db, queryClient } = createDbClient(databaseUrl, {
max: 1,
prepare: false
})
await db.delete(schema.households).where(inArray(schema.households.id, createdHouseholdIds))
await queryClient.end({ timeout: 5 })
})
testIfDatabase('registers a Telegram household chat and binds topics', async () => {
const repositoryClient = createDbHouseholdConfigurationRepository(databaseUrl!)
const suffix = randomUUID()
const telegramChatId = `-100${Date.now()}`
const registered = await repositoryClient.repository.registerTelegramHouseholdChat({
householdName: `Integration Household ${suffix}`,
telegramChatId,
telegramChatType: 'supergroup',
title: 'Integration Household'
})
createdHouseholdIds.push(registered.household.householdId)
expect(registered.status).toBe('created')
expect(registered.household.telegramChatId).toBe(telegramChatId)
const existing = await repositoryClient.repository.registerTelegramHouseholdChat({
householdName: 'Ignored replacement title',
telegramChatId,
telegramChatType: 'supergroup',
title: 'Updated Integration Household'
})
expect(existing.status).toBe('existing')
expect(existing.household.householdId).toBe(registered.household.householdId)
expect(existing.household.title).toBe('Updated Integration Household')
const purchase = await repositoryClient.repository.bindHouseholdTopic({
householdId: registered.household.householdId,
role: 'purchase',
telegramThreadId: '7001',
topicName: 'Общие покупки'
})
const feedback = await repositoryClient.repository.bindHouseholdTopic({
householdId: registered.household.householdId,
role: 'feedback',
telegramThreadId: '7002',
topicName: 'Feedback'
})
expect(purchase.role).toBe('purchase')
expect(feedback.role).toBe('feedback')
const resolvedChat = await repositoryClient.repository.getTelegramHouseholdChat(telegramChatId)
const resolvedPurchase = await repositoryClient.repository.findHouseholdTopicByTelegramContext({
telegramChatId,
telegramThreadId: '7001'
})
const bindings = await repositoryClient.repository.listHouseholdTopicBindings(
registered.household.householdId
)
expect(resolvedChat?.householdId).toBe(registered.household.householdId)
expect(resolvedPurchase?.role).toBe('purchase')
expect(bindings).toHaveLength(2)
const verificationClient = createDbClient(databaseUrl!, {
max: 1,
prepare: false
})
const storedChatRows = await verificationClient.db
.select({ title: schema.householdTelegramChats.title })
.from(schema.householdTelegramChats)
.where(eq(schema.householdTelegramChats.telegramChatId, telegramChatId))
.limit(1)
expect(storedChatRows[0]?.title).toBe('Updated Integration Household')
await verificationClient.queryClient.end({ timeout: 5 })
await repositoryClient.close()
})
})