refactor: mapping 落库化(期望状态改从镜像视图构造 + 拼音拍平组名)
- mapping.BuildFromMirror:由镜像 active 用户/部门构造期望 LLDAP 状态(纯函数), 组名/DN 直接复用快照落库时算好的拍平拼音,用户 DN 固定 ou=people、去掉离职 OU - Feat: FlatDeptInfo 已在本阶段完成测试覆盖(拍平拼音父子/空拼音回落/重名消歧/DN 稳定) - 移除已被目标架构取代的旧「嵌套 CN」测试断言 - 旧 Build(OpenLDAP 单阶段)暂留保证过渡期编译,阶段6退役
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
package mapping
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"idsync/internal/feishu"
|
||||
)
|
||||
|
||||
// TestFlatDeptInfoParentChild 验证拍平拼音链:子部门链 = 父链.子拼音。
|
||||
func TestFlatDeptInfoParentChild(t *testing.T) {
|
||||
depts := []*feishu.Department{
|
||||
dept("od-root", "0", "Acme"),
|
||||
dept("od-rd", "od-root", "研发部"),
|
||||
dept("od-backend", "od-rd", "后端组"),
|
||||
}
|
||||
out := FlatDeptInfo(depts, "dc=example,dc=com")
|
||||
|
||||
if out["od-root"].Chain != "Acme" || out["od-root"].Level != 0 {
|
||||
t.Errorf("根部门 = %+v", out["od-root"])
|
||||
}
|
||||
if out["od-rd"].Chain != "Acme.yanfabu" || out["od-rd"].Level != 1 {
|
||||
t.Errorf("研发部 = %+v", out["od-rd"])
|
||||
}
|
||||
if out["od-backend"].Chain != "Acme.yanfabu.houduanzu" || out["od-backend"].Level != 2 {
|
||||
t.Errorf("后端组 = %+v", out["od-backend"])
|
||||
}
|
||||
wantDN := "cn=Acme.yanfabu.houduanzu,ou=groups,dc=example,dc=com"
|
||||
if out["od-backend"].DN != wantDN {
|
||||
t.Errorf("后端组 DN = %q, 期望 %q", out["od-backend"].DN, wantDN)
|
||||
}
|
||||
}
|
||||
|
||||
// TestFlatDeptInfoFallsBackOnEmptyPinyin 验证纯符号部门名回落部门 ID,链非空且稳定。
|
||||
func TestFlatDeptInfoFallsBackOnEmptyPinyin(t *testing.T) {
|
||||
depts := []*feishu.Department{
|
||||
dept("od-root", "0", "Acme"),
|
||||
dept("od-sym", "od-root", "★☆"),
|
||||
}
|
||||
out := FlatDeptInfo(depts, "dc=example,dc=com")
|
||||
if out["od-sym"].Chain != "Acme.dept-od-sym" {
|
||||
t.Errorf("纯符号部门链 = %q, 期望回落部门 ID", out["od-sym"].Chain)
|
||||
}
|
||||
if !strings.Contains(out["od-sym"].DN, out["od-sym"].Chain) {
|
||||
t.Errorf("DN 未包含 Chain: %q", out["od-sym"].DN)
|
||||
}
|
||||
}
|
||||
|
||||
// TestFlatDeptInfoDisambiguatesCollision 验证同名部门消歧:链撞车时追加部门 ID,组名保持唯一。
|
||||
func TestFlatDeptInfoDisambiguatesCollision(t *testing.T) {
|
||||
depts := []*feishu.Department{
|
||||
dept("od-root", "0", "Acme"),
|
||||
dept("od-a", "od-root", "开发组"),
|
||||
dept("od-b", "od-root", "开发组"),
|
||||
}
|
||||
out := FlatDeptInfo(depts, "dc=example,dc=com")
|
||||
|
||||
if out["od-a"].Chain != "Acme.kaifazu" {
|
||||
t.Errorf("od-a 链 = %q", out["od-a"].Chain)
|
||||
}
|
||||
if out["od-b"].Chain != "Acme.kaifazu.od-b" {
|
||||
t.Errorf("od-b 链 = %q, 期望追加部门 ID 消歧", out["od-b"].Chain)
|
||||
}
|
||||
if out["od-a"].DN == out["od-b"].DN {
|
||||
t.Errorf("两个同名部门的 DN 不应相同")
|
||||
}
|
||||
}
|
||||
|
||||
// TestFlatDeptInfoStable 验证同一输入产生的 DN 稳定(幂等,便于物化比对)。
|
||||
func TestFlatDeptInfoStable(t *testing.T) {
|
||||
depts := []*feishu.Department{
|
||||
dept("od-root", "0", "Acme"),
|
||||
dept("od-rd", "od-root", "研发部"),
|
||||
}
|
||||
a := FlatDeptInfo(depts, "dc=example,dc=com")
|
||||
b := FlatDeptInfo(depts, "dc=example,dc=com")
|
||||
for id := range a {
|
||||
if a[id].DN != b[id].DN || a[id].Chain != b[id].Chain {
|
||||
t.Errorf("部门 %s 的命名不稳定: %q vs %q", id, a[id].DN, b[id].DN)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user