forked from baron/baron-sso
chore: snapshot local state before dev merge
This commit is contained in:
@@ -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)},
|
||||
|
||||
Reference in New Issue
Block a user