1
0
forked from baron/baron-sso

chore: snapshot local state before dev merge

This commit is contained in:
2026-06-17 21:25:42 +09:00
parent b2808759d2
commit 49560e8a8c
107 changed files with 8958 additions and 939 deletions

View File

@@ -92,10 +92,263 @@ func TestNewWorksmobileUserPatchPayloadNormalizesMalformedKoreanCellPhone(t *tes
DomainID: 1001,
Email: "phone-canonical@samaneng.com",
CellPhone: "+82+821062836786",
LevelID: "level-manager",
UserName: WorksmobileUserName{LastName: "Phone Canonical User"},
Organizations: []WorksmobileUserOrganization{
{
DomainID: 1001,
Primary: true,
OrgUnits: []WorksmobileUserOrgUnit{{OrgUnitID: "externalKey:tenant-1", Primary: true}},
},
},
})
require.Equal(t, "+82 01062836786", payload.CellPhone)
data, err := json.Marshal(payload)
require.NoError(t, err)
require.NotContains(t, string(data), "level-manager")
}
func TestWorksmobileHTTPClientUpdateUserResolvesLevelNameToLevelObject(t *testing.T) {
transport := &captureRoundTripper{
responses: []captureResponse{
{statusCode: http.StatusOK, body: `{"levels":[{"levelId":"level-deputy","levelName":"대리"}]}`},
{statusCode: http.StatusOK, body: `{}`},
{statusCode: http.StatusOK, body: `{"domainId":300286336,"email":"grade@samaneng.com","userExternalKey":"user-grade","userName":{"lastName":"Grade User"},"organizations":[{"domainId":300286336,"primary":true,"orgUnits":[{"orgUnitId":"works-org","primary":true}]}]}`},
{statusCode: http.StatusOK, body: `{}`},
},
}
client := &WorksmobileHTTPClient{
BaseURL: "https://works.example.test",
DirectoryToken: "directory-token-1",
HTTPClient: &http.Client{Transport: transport},
}
err := client.UpdateUserOnly(context.Background(), WorksmobileUserPayload{
DomainID: 300286336,
Email: "grade@samaneng.com",
LevelID: "대리",
UserName: WorksmobileUserName{LastName: "Grade User"},
})
require.NoError(t, err)
require.Len(t, transport.requests, 4)
require.Equal(t, http.MethodGet, transport.requests[0].Method)
require.Equal(t, "/v1.0/users/levels", transport.requests[0].URL.Path)
require.Equal(t, "300286336", transport.requests[0].URL.Query().Get("domainId"))
require.Equal(t, http.MethodPatch, transport.requests[1].Method)
require.Equal(t, http.MethodGet, transport.requests[2].Method)
require.Equal(t, http.MethodPatch, transport.requests[3].Method)
var fullPatch map[string]any
require.Len(t, transport.requestBodies, 2)
require.NoError(t, json.Unmarshal(transport.requestBodies[0], &fullPatch))
require.NotContains(t, fullPatch, "level")
require.NotContains(t, fullPatch, "levelId")
var levelPatch map[string]any
require.NoError(t, json.Unmarshal(transport.requestBodies[1], &levelPatch))
organizations := levelPatch["organizations"].([]any)
organization := organizations[0].(map[string]any)
require.Equal(t, "level-deputy", organization["levelId"])
require.NotContains(t, levelPatch, "levelId")
}
func TestWorksmobileHTTPClientUpdateUserPassesLevelExternalKeyThrough(t *testing.T) {
transport := &captureRoundTripper{
responses: []captureResponse{
{statusCode: http.StatusOK, body: `{}`},
{statusCode: http.StatusOK, body: `{"domainId":300286336,"email":"grade@samaneng.com","userExternalKey":"user-grade","userName":{"lastName":"Grade User"},"organizations":[{"domainId":300286336,"primary":true,"orgUnits":[{"orgUnitId":"works-org","primary":true}]}]}`},
{statusCode: http.StatusOK, body: `{}`},
},
}
client := &WorksmobileHTTPClient{
BaseURL: "https://works.example.test",
DirectoryToken: "directory-token-1",
HTTPClient: &http.Client{Transport: transport},
}
err := client.UpdateUserOnly(context.Background(), WorksmobileUserPayload{
DomainID: 300286336,
Email: "grade@samaneng.com",
LevelID: "externalKey:lead",
UserName: WorksmobileUserName{LastName: "Grade User"},
})
require.NoError(t, err)
require.Len(t, transport.requests, 3)
require.Equal(t, http.MethodPatch, transport.requests[0].Method)
require.Equal(t, http.MethodGet, transport.requests[1].Method)
require.Equal(t, http.MethodPatch, transport.requests[2].Method)
var levelPatch map[string]any
require.Len(t, transport.requestBodies, 2)
require.NoError(t, json.Unmarshal(transport.requestBodies[1], &levelPatch))
organizations := levelPatch["organizations"].([]any)
organization := organizations[0].(map[string]any)
require.Equal(t, "externalKey:lead", organization["levelId"])
}
func TestWorksmobileHTTPClientUpdateUserInfersLevelDomainFromPrimaryOrganization(t *testing.T) {
transport := &captureRoundTripper{
responses: []captureResponse{
{statusCode: http.StatusOK, body: `{}`},
{statusCode: http.StatusOK, body: `{"domainId":300285955,"email":"grade@samaneng.com","userExternalKey":"user-grade","userName":{"lastName":"Grade User"},"organizations":[{"domainId":300285955,"primary":false,"orgUnits":[{"orgUnitId":"works-saman","primary":true}]},{"domainId":300286337,"primary":true,"orgUnits":[{"orgUnitId":"works-gpdtdc","primary":true}]}]}`},
{statusCode: http.StatusOK, body: `{}`},
},
}
client := &WorksmobileHTTPClient{
BaseURL: "https://works.example.test",
DirectoryToken: "directory-token-1",
HTTPClient: &http.Client{Transport: transport},
}
err := client.UpdateUserOnly(context.Background(), WorksmobileUserPayload{
DomainID: 300285955,
Email: "grade@samaneng.com",
LevelID: "externalKey:prin",
UserName: WorksmobileUserName{LastName: "Grade User"},
Organizations: []WorksmobileUserOrganization{
{
DomainID: 300286337,
Primary: true,
OrgUnits: []WorksmobileUserOrgUnit{{OrgUnitID: "externalKey:gpdtdc", Primary: true}},
},
{
DomainID: 300285955,
Primary: false,
OrgUnits: []WorksmobileUserOrgUnit{{OrgUnitID: "externalKey:saman", Primary: true}},
},
},
})
require.NoError(t, err)
require.Len(t, transport.requests, 3)
var levelPatch map[string]any
require.Len(t, transport.requestBodies, 2)
require.NoError(t, json.Unmarshal(transport.requestBodies[1], &levelPatch))
require.Equal(t, float64(300286337), levelPatch["domainId"])
organizations := levelPatch["organizations"].([]any)
require.NotContains(t, organizations[0].(map[string]any), "levelId")
require.Equal(t, "externalKey:prin", organizations[1].(map[string]any)["levelId"])
}
func TestWorksmobileHTTPClientUpdateUserUsesLevelDomainForOrganizationLevel(t *testing.T) {
transport := &captureRoundTripper{
responses: []captureResponse{
{statusCode: http.StatusOK, body: `{"levels":[{"levelId":"level-principal","levelName":"수석"}]}`},
{statusCode: http.StatusOK, body: `{}`},
{statusCode: http.StatusOK, body: `{"domainId":300286336,"email":"grade@samaneng.com","userExternalKey":"user-grade","userName":{"lastName":"Grade User"},"organizations":[{"domainId":300286336,"primary":false,"orgUnits":[{"orgUnitId":"works-hanmac","primary":true}]},{"domainId":300286337,"primary":true,"orgUnits":[{"orgUnitId":"works-gsim","primary":true}]}]}`},
{statusCode: http.StatusOK, body: `{}`},
},
}
client := &WorksmobileHTTPClient{
BaseURL: "https://works.example.test",
DirectoryToken: "directory-token-1",
HTTPClient: &http.Client{Transport: transport},
}
err := client.UpdateUserOnly(context.Background(), WorksmobileUserPayload{
DomainID: 300286336,
LevelDomainID: 300286337,
Email: "grade@samaneng.com",
LevelID: "수석",
UserName: WorksmobileUserName{LastName: "Grade User"},
})
require.NoError(t, err)
require.Len(t, transport.requests, 4)
require.Equal(t, http.MethodGet, transport.requests[0].Method)
require.Equal(t, "/v1.0/users/levels", transport.requests[0].URL.Path)
require.Equal(t, "300286337", transport.requests[0].URL.Query().Get("domainId"))
var levelPatch map[string]any
require.Len(t, transport.requestBodies, 2)
require.NoError(t, json.Unmarshal(transport.requestBodies[1], &levelPatch))
require.Equal(t, float64(300286337), levelPatch["domainId"])
organizations := levelPatch["organizations"].([]any)
require.NotContains(t, organizations[0].(map[string]any), "levelId")
require.Equal(t, "level-principal", organizations[1].(map[string]any)["levelId"])
}
func TestDecodeWorksmobileUserRequestAcceptsStoredLevelName(t *testing.T) {
var payload WorksmobileUserPayload
err := decodeWorksmobileRequest(domain.JSONMap{
"request": map[string]any{
"domainId": int64(300286336),
"email": "grade@samaneng.com",
"levelName": "대리",
"userName": map[string]any{"lastName": "Grade User"},
},
}, &payload)
require.NoError(t, err)
require.Equal(t, "대리", payload.LevelID)
}
func TestWorksmobileUserPayloadJSONPreservesLevelDomainID(t *testing.T) {
encoded, err := json.Marshal(WorksmobileUserPayload{
DomainID: 300285955,
LevelDomainID: 300286337,
Email: "tester@samaneng.com",
LevelID: "externalKey:prin",
UserName: WorksmobileUserName{LastName: "Tester"},
})
require.NoError(t, err)
var raw map[string]any
require.NoError(t, json.Unmarshal(encoded, &raw))
require.Equal(t, float64(300286337), raw["levelDomainId"])
var decoded WorksmobileUserPayload
require.NoError(t, json.Unmarshal(encoded, &decoded))
require.Equal(t, int64(300286337), decoded.LevelDomainID)
require.Equal(t, "externalKey:prin", decoded.LevelID)
}
func TestWorksmobileHTTPClientCreateUserSendsLevelInSeparatePatch(t *testing.T) {
transport := &captureRoundTripper{
responses: []captureResponse{
{statusCode: http.StatusOK, body: `{"levels":[{"levelId":"level-deputy","levelName":"대리"}]}`},
{statusCode: http.StatusOK, body: `{}`},
{statusCode: http.StatusOK, body: `{"domainId":300286336,"email":"grade@samaneng.com","userExternalKey":"user-grade","userName":{"lastName":"Grade User"},"organizations":[{"domainId":300286336,"primary":true,"orgUnits":[{"orgUnitId":"works-org","primary":true}]}]}`},
{statusCode: http.StatusOK, body: `{}`},
},
}
client := &WorksmobileHTTPClient{
BaseURL: "https://works.example.test",
DirectoryToken: "directory-token-1",
HTTPClient: &http.Client{Transport: transport},
}
err := client.CreateUser(context.Background(), WorksmobileUserPayload{
DomainID: 300286336,
Email: "grade@samaneng.com",
LevelID: "대리",
UserName: WorksmobileUserName{LastName: "Grade User"},
})
require.NoError(t, err)
require.Len(t, transport.requests, 4)
require.Equal(t, http.MethodGet, transport.requests[0].Method)
require.Equal(t, http.MethodPost, transport.requests[1].Method)
require.Equal(t, http.MethodGet, transport.requests[2].Method)
require.Equal(t, http.MethodPatch, transport.requests[3].Method)
var createPayload map[string]any
require.Len(t, transport.requestBodies, 2)
require.NoError(t, json.Unmarshal(transport.requestBodies[0], &createPayload))
require.NotContains(t, createPayload, "level")
require.NotContains(t, createPayload, "levelId")
require.NotContains(t, createPayload, "levelName")
var levelPayload map[string]any
require.NoError(t, json.Unmarshal(transport.requestBodies[1], &levelPayload))
organizations := levelPayload["organizations"].([]any)
organization := organizations[0].(map[string]any)
require.Equal(t, "level-deputy", organization["levelId"])
}
func TestNewWorksmobileSCIMUserPayloadNormalizesMalformedKoreanCellPhone(t *testing.T) {
@@ -1561,6 +1814,26 @@ func TestParseWorksmobileDirectoryUserIncludesFullNameLevelAndOrgRole(t *testing
require.True(t, *user.OrgUnitManagers["works-org-1"])
}
func TestParseWorksmobileDirectoryUserReadsOrganizationLevel(t *testing.T) {
user := parseWorksmobileDirectoryUser(map[string]any{
"userId": "works-user",
"email": "tester@samaneng.com",
"userName": map[string]any{
"lastName": "홍길동",
},
"organizations": []any{
map[string]any{
"primary": true,
"levelId": "level-1",
"levelName": "책임",
},
},
})
require.Equal(t, "level-1", user.LevelID)
require.Equal(t, "책임", user.LevelName)
}
func TestParseWorksmobileDirectoryUserIncludesAllOrgUnitManagerFlags(t *testing.T) {
user := parseWorksmobileDirectoryUser(map[string]any{
"userId": "works-user",
@@ -1572,7 +1845,9 @@ func TestParseWorksmobileDirectoryUserIncludesAllOrgUnitManagerFlags(t *testing.
},
"organizations": []any{
map[string]any{
"primary": true,
"primary": true,
"levelId": "level-1",
"levelName": "책임",
"orgUnits": []any{
map[string]any{
"orgUnitId": "externalKey:primary-org",
@@ -1598,7 +1873,9 @@ func TestParseWorksmobileDirectoryUserIncludesAllOrgUnitManagerFlags(t *testing.
require.Equal(t, "EMP001", user.EmployeeNumber)
require.Equal(t, []WorksmobileUserOrganization{
{
Primary: true,
Primary: true,
LevelID: "level-1",
LevelName: "책임",
OrgUnits: []WorksmobileUserOrgUnit{
{OrgUnitID: "externalKey:primary-org", Primary: true, IsManager: boolPtr(false)},
{OrgUnitID: "externalKey:secondary-org", Primary: false, IsManager: boolPtr(true)},