88 lines
2.8 KiB
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("错误显示拒绝结果")
|
|
}
|
|
})
|
|
}
|
|
}
|