mirror of
https://github.com/whekin/household-bot.git
synced 2026-04-01 04:34:04 +00:00
103 lines
3.5 KiB
TypeScript
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()
|
|
})
|
|
})
|