feat(bot): add safe group unsetup flow

This commit is contained in:
2026-03-11 06:08:34 +04:00
parent 1b8c6e87f6
commit b6b6f9e1b8
25 changed files with 495 additions and 0 deletions

View File

@@ -93,6 +93,9 @@ function createRepositoryStub() {
async listHouseholdTopicBindings(householdId) {
return bindings.get(householdId) ?? []
},
async clearHouseholdTopicBindings(householdId) {
bindings.set(householdId, [])
},
async listReminderTargets() {
return []
},
@@ -514,4 +517,56 @@ describe('createHouseholdSetupService', () => {
reason: 'not_topic_message'
})
})
test('clears topic bindings when unsetup is run by a group admin', async () => {
const { repository } = createRepositoryStub()
const service = createHouseholdSetupService(repository)
const setup = await service.setupGroupChat({
actorIsAdmin: true,
telegramChatId: '-100123',
telegramChatType: 'supergroup',
title: 'Kojori House'
})
expect(setup.status).toBe('created')
if (setup.status === 'rejected') {
return
}
await service.bindTopic({
actorIsAdmin: true,
telegramChatId: '-100123',
role: 'purchase',
telegramThreadId: '777',
topicName: 'Shared purchases'
})
const result = await service.unsetupGroupChat({
actorIsAdmin: true,
telegramChatId: '-100123',
telegramChatType: 'supergroup'
})
expect(result).toEqual({
status: 'reset',
household: setup.household
})
expect(await repository.listHouseholdTopicBindings(setup.household.householdId)).toEqual([])
expect(await repository.getTelegramHouseholdChat('-100123')).toEqual(setup.household)
})
test('treats repeated unsetup as a no-op', async () => {
const { repository } = createRepositoryStub()
const service = createHouseholdSetupService(repository)
const result = await service.unsetupGroupChat({
actorIsAdmin: true,
telegramChatId: '-100123',
telegramChatType: 'supergroup'
})
expect(result).toEqual({
status: 'noop'
})
})
})