package oci import ( "testing" "time" "github.com/oracle/oci-go-sdk/v65/common" "github.com/oracle/oci-go-sdk/v65/identity" "github.com/oracle/oci-go-sdk/v65/identitydomains" ) func domainSummary(id, name, url string, state identity.DomainLifecycleStateEnum) identity.DomainSummary { return identity.DomainSummary{Id: &id, DisplayName: &name, Url: &url, LifecycleState: state} } func TestPickDomainURL(t *testing.T) { domains := []identity.DomainSummary{ domainSummary("ocid1.domain.idcs", "OracleIdentityCloudService", "https://idcs-a.example.com", identity.DomainLifecycleStateActive), domainSummary("ocid1.domain.default", "Default", "https://idcs-b.example.com", identity.DomainLifecycleStateActive), domainSummary("ocid1.domain.off", "Off", "https://idcs-c.example.com", identity.DomainLifecycleStateInactive), } cases := []struct { name string domains []identity.DomainSummary domainID string want string }{ {"缺省优先 Default 域", domains, "", "https://idcs-b.example.com"}, {"按 OCID 精确匹配", domains, "ocid1.domain.idcs", "https://idcs-a.example.com"}, {"OCID 不存在返回空", domains, "ocid1.domain.miss", ""}, {"非 ACTIVE 域不可选", domains, "ocid1.domain.off", ""}, {"无 Default 时取第一个 ACTIVE", domains[:1], "", "https://idcs-a.example.com"}, {"空列表返回空", nil, "", ""}, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { if got := pickDomainURL(tc.domains, tc.domainID); got != tc.want { t.Fatalf("pickDomainURL() = %q, want %q", got, tc.want) } }) } } func TestToDomainListUser(t *testing.T) { created := "2024-12-12T14:52:00Z" lastLogin := "2026-07-01T08:00:00.123Z" yes, no := true, false u := identitydomains.User{ Id: common.String("scim-1"), Ocid: common.String("ocid1.user.oc1..a"), UserName: common.String("oci"), Active: &yes, Meta: &identitydomains.Meta{Created: &created}, Emails: []identitydomains.UserEmails{{ Value: common.String("a@b.c"), Primary: &yes, Verified: &yes, Type: identitydomains.UserEmailsTypeWork, }}, UrnIetfParamsScimSchemasOracleIdcsExtensionMfaUser: &identitydomains.ExtensionMfaUser{ MfaStatus: identitydomains.ExtensionMfaUserMfaStatusEnrolled, }, UrnIetfParamsScimSchemasOracleIdcsExtensionUserStateUser: &identitydomains.ExtensionUserStateUser{ LastSuccessfulLoginDate: &lastLogin, }, } got := toDomainListUser(u, "ocid1.user.oc1..a") if got.ID != "ocid1.user.oc1..a" || !got.IsCurrentUser { t.Fatalf("ID/IsCurrentUser 映射错误: %+v", got) } if !got.MfaActivated || !got.EmailVerified || got.Email != "a@b.c" { t.Fatalf("MFA/邮箱映射错误: %+v", got) } if got.LifecycleState != "ACTIVE" || got.TimeCreated == nil || got.LastLoginTime == nil { t.Fatalf("状态/时间映射错误: %+v", got) } inactive := identitydomains.User{Id: common.String("scim-2"), Ocid: common.String("ocid1.user.oc1..b"), Active: &no} if s := toDomainListUser(inactive, "x").LifecycleState; s != "INACTIVE" { t.Fatalf("inactive 用户 LifecycleState = %q, want INACTIVE", s) } } func TestParseScimTime(t *testing.T) { valid := "2026-07-10T01:02:03Z" bad := "not-a-time" empty := "" cases := []struct { name string in *string want *time.Time }{ {"合法 RFC3339", &valid, func() *time.Time { t0, _ := time.Parse(time.RFC3339, valid); return &t0 }()}, {"nil 返回 nil", nil, nil}, {"空串返回 nil", &empty, nil}, {"非法格式返回 nil", &bad, nil}, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { got := parseScimTime(tc.in) if (got == nil) != (tc.want == nil) { t.Fatalf("parseScimTime() = %v, want %v", got, tc.want) } if got != nil && !got.Equal(*tc.want) { t.Fatalf("parseScimTime() = %v, want %v", got, tc.want) } }) } }