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) } } }