Scert/backend/internal/adminconsole/recovery_reconciliation_test.go

88 lines
2.8 KiB
Go

package adminconsole
import (
"strings"
"testing"
"git.pcux.cn/xuans/Scert/backend/internal/deployment"
"git.pcux.cn/xuans/Scert/backend/internal/localreset"
)
type reconciliationConsoleClient struct {
dispositionConsoleClient
sourceID string
mismatch bool
}
func (c *reconciliationConsoleClient) PrepareRecoveryReconciliation(sourceID string) (localreset.RecoveryPreparation, error) {
c.sourceID = sourceID
value, err := c.PrepareRecovery("tx-1", deployment.RecoveryActionVerifyCommit)
value.Summary.SourceDispositionID = sourceID
value.Summary.Phase = deployment.TransactionPhaseCommitVerified
return value, err
}
func (c *reconciliationConsoleClient) ExecuteRecovery(id, token string) (deployment.RecoveryDispositionSummary, error) {
value, err := c.dispositionConsoleClient.ExecuteRecovery(id, token)
if err != nil {
return value, err
}
value.SourceDispositionID = c.sourceID
if value.Status == "succeeded" {
value.ResultCode = "committed"
}
if c.mismatch {
value.SourceDispositionID = strings.Repeat("d", 64)
}
return value, nil
}
func TestRecoveryReconciliationConsoleConfirmation(t *testing.T) {
for _, mode := range []string{"success", "rejected", "cancelled", "expired", "disconnect", "mismatch"} {
t.Run(mode, func(t *testing.T) {
sourceID := strings.Repeat("a", 64)
client := &reconciliationConsoleClient{}
answer := "确认重新核查 " + sourceID + " " + dispositionActionLabel(deployment.RecoveryActionVerifyCommit)
switch mode {
case "rejected":
client.status = "rejected"
case "cancelled":
answer = "确认"
case "expired":
client.expired = true
case "disconnect":
client.executeError = true
case "mismatch":
client.mismatch = true
}
screen := &recoveryTestScreen{testTerminalInput: testTerminalInput{values: []string{sourceID, answer}}}
err := recoveryReconciliationFlow(t.Context(), client, screen)
output := strings.Join(screen.lines, "|")
if client.prepares != 1 || client.queries != 0 || strings.Contains(output, strings.Repeat("c", 64)) {
t.Fatal("终端重复调用或泄露令牌")
}
if mode == "cancelled" || mode == "expired" {
if client.executes != 0 {
t.Fatal("取消或过期仍执行核查")
}
return
}
if client.executes != 1 || !strings.Contains(output, "原不确定记录永久保留") {
t.Fatal("缺少明确警告或重复执行")
}
if mode == "disconnect" || mode == "mismatch" {
if err == nil || !strings.Contains(output, "新核查编号查询") {
t.Fatal("失去可靠响应后误报成功")
}
} else if err != nil {
t.Fatal(err)
}
if mode == "success" && !strings.Contains(output, "占用已安全释放") {
t.Fatal("缺少完成结果")
}
if mode == "rejected" && !strings.Contains(output, "原占用继续保留") {
t.Fatal("错误显示拒绝结果")
}
})
}
}