f21fa5b5e8
Commilitia Drop:自托管的跨设备剪贴板同步与点对点文件传输。 - 后端 Go(chi / SQLite WAL / SSE Hub / WebRTC signaling + 状态机 / Relay ring buffer),编译进单个 distroless 镜像(前端 go:embed)。 - 前端 React + TanStack Router + Zustand,自实现 SSE + WebRTC P2P,NAT 受阻时回退服务端中继;聚珍(Juzhen)CJK 综合排版。 - 桌面端 Wails v2(macOS / Windows),瘦客户端复用 web。 - 鉴权 OIDC PKCE(自建 Casdoor 等),refresh_token 信封加密存系统密钥库;iOS Shortcut 用 HS256 scoped token。 架构文档与变更记录见 docs 分支(PROJECT_BRIEF / FRONTEND_DESIGN / CHANGELOG)。 本次为公开发布初始提交:完整开发历史(含部署细节)留存于私有归档,公开仓库自此干净起步。
55 lines
1.5 KiB
Go
55 lines
1.5 KiB
Go
package transfer
|
|
|
|
import "testing"
|
|
|
|
func TestIsValidTransition(t *testing.T) {
|
|
allowed := map[string][]string{
|
|
StatePending: {StateAccepted, StateP2PActive, StateRelayActive, StateCancelled, StateFailed},
|
|
StateAccepted: {StateP2PActive, StateRelayActive, StateDone, StateCancelled, StateFailed},
|
|
StateP2PActive: {StateRelayActive, StateDone, StateFailed, StateCancelled},
|
|
StateRelayActive: {StateDone, StateFailed, StateCancelled},
|
|
}
|
|
all := []string{StatePending, StateAccepted, StateP2PActive, StateRelayActive,
|
|
StateDone, StateFailed, StateCancelled}
|
|
|
|
for from, tos := range allowed {
|
|
ok := map[string]bool{}
|
|
for _, to := range tos {
|
|
ok[to] = true
|
|
}
|
|
for _, to := range all {
|
|
got := IsValidTransition(from, to)
|
|
want := ok[to]
|
|
if got != want {
|
|
t.Errorf("transition %s→%s: got %v, want %v", from, to, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Terminals reject all outbound.
|
|
for _, term := range []string{StateDone, StateFailed, StateCancelled} {
|
|
for _, to := range all {
|
|
if IsValidTransition(term, to) {
|
|
t.Errorf("terminal %s should not allow transition to %s", term, to)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestIsTerminal(t *testing.T) {
|
|
cases := map[string]bool{
|
|
StatePending: false,
|
|
StateAccepted: false,
|
|
StateP2PActive: false,
|
|
StateRelayActive: false,
|
|
StateDone: true,
|
|
StateFailed: true,
|
|
StateCancelled: true,
|
|
}
|
|
for s, want := range cases {
|
|
if got := IsTerminal(s); got != want {
|
|
t.Errorf("IsTerminal(%s): got %v, want %v", s, got, want)
|
|
}
|
|
}
|
|
}
|