40 lines
1.9 KiB
TypeScript
40 lines
1.9 KiB
TypeScript
import assert from 'node:assert/strict'
|
|
import { readFileSync } from 'node:fs'
|
|
import path from 'node:path'
|
|
import test from 'node:test'
|
|
|
|
const migrationPath = path.resolve(
|
|
__dirname,
|
|
'../../../prisma/migrations/20260717_recover_legacy_disposal_reminders/migration.sql'
|
|
)
|
|
|
|
test('旧通道零次投递的报废催办可重新生成统一通知中心任务', () => {
|
|
const sql = readFileSync(migrationPath, 'utf8')
|
|
|
|
assert.match(sql, /START TRANSACTION;/i)
|
|
assert.match(sql, /UPDATE `disposal_record` AS `disposal`/i)
|
|
assert.match(sql, /SET `disposal`\.`reminded_at` = NULL/i)
|
|
assert.match(sql, /`disposal`\.`status` = 'pending'/i)
|
|
assert.match(sql, /`legacy_delivery`\.`provider_type` = 'work_notice'/i)
|
|
assert.match(sql, /`legacy_delivery`\.`attempt_count` = 0/i)
|
|
assert.match(sql, /`legacy_delivery`\.`sent_at` IS NULL/i)
|
|
assert.match(sql, /`legacy_delivery`\.`read_at` IS NULL/i)
|
|
assert.match(sql, /`current_delivery`\.`provider_type` = 'notification_center'/i)
|
|
assert.match(sql, /SET `legacy_delivery`\.`status` = 'failed'/i)
|
|
assert.match(sql, /LEGACY_CHANNEL_RETIRED/i)
|
|
assert.match(sql, /`legacy_delivery`\.`failure_notified_at` = NOW\(3\)/i)
|
|
assert.match(sql, /LEFT JOIN `dingtalk_delivery` AS `current_delivery`/i)
|
|
assert.match(sql, /`current_delivery`\.`id` IS NULL/i)
|
|
assert.match(sql, /COMMIT;/i)
|
|
assert.doesNotMatch(sql, /DELETE\s+FROM\s+`?dingtalk_delivery`?/i)
|
|
})
|
|
|
|
test('已发送、已读或已有统一通知中心任务的催办不会被迁移重放', () => {
|
|
const sql = readFileSync(migrationPath, 'utf8')
|
|
|
|
assert.match(sql, /`legacy_delivery`\.`dingtalk_task_id` IS NULL/i)
|
|
assert.match(sql, /NOT EXISTS \([\s\S]*`current_delivery`\.`event_type` = 'disposal_overdue_reminder'[\s\S]*`current_delivery`\.`provider_type` = 'notification_center'/i)
|
|
assert.doesNotMatch(sql, /`sent_at`\s*=\s*NULL/i)
|
|
assert.doesNotMatch(sql, /`read_at`\s*=\s*NULL/i)
|
|
})
|