@@ -483,3 +483,94 @@ testIdpUpdate = do
483
483
-- the SCIM users can still login
484
484
for_ uids $ \ (_, email) -> do
485
485
void $ loginWithSaml True tid email idp3
486
+
487
+ testAllowUpdatesBySCIMWhenE2EIdEnabled :: (HasCallStack ) => App ()
488
+ testAllowUpdatesBySCIMWhenE2EIdEnabled = do
489
+ (tok, uid, su) <- setup
490
+
491
+ su1 <- checkUpdateHandle tok uid su
492
+ su2 <- checkUpdateDisplayName tok uid su1
493
+
494
+ -- the following should not be part of the e2eid certification, but are checked here anyway
495
+ su3 <- checkUpdateLocale tok uid su2
496
+ su4 <- checkUpdateEmail tok uid su3
497
+ void $ checkUpdateExternalId tok uid su4
498
+ where
499
+ setup :: App (String , String , Value )
500
+ setup = do
501
+ (owner, tid, _) <- createTeam OwnDomain 1
502
+ setTeamFeatureStatus owner tid " sso" " enabled" >>= assertSuccess
503
+ setTeamFeatureStatus owner tid " mlsE2EId" " enabled" >>= assertSuccess
504
+ void $ registerTestIdPWithMeta owner >>= getJSON 201
505
+ tok <- createScimTokenV6 owner def >>= getJSON 200 >>= (%. " token" ) >>= asString
506
+ scimUser <- randomScimUser
507
+ email <- scimUser %. " emails" >>= asList >>= assertOne >>= (%. " value" ) >>= asString
508
+ uid <- createScimUser OwnDomain tok scimUser >>= getJSON 201 >>= (%. " id" ) >>= asString
509
+ activateEmail OwnDomain email
510
+ pure (tok, uid, scimUser)
511
+
512
+ checkUpdateHandle :: (HasCallStack ) => String -> String -> Value -> App Value
513
+ checkUpdateHandle tok uid scimUser = do
514
+ newHandle <- randomHandle
515
+ su <- setField " userName" newHandle scimUser
516
+ bindResponse (updateScimUser OwnDomain tok uid su) $ \ res -> do
517
+ res. status `shouldMatchInt` 200
518
+ res. json %. " userName" `shouldMatch` newHandle
519
+ bindResponse (getUsersId OwnDomain [uid]) $ \ res -> do
520
+ res. status `shouldMatchInt` 200
521
+ u <- res. json >>= asList >>= assertOne
522
+ u %. " handle" `shouldMatch` newHandle
523
+ pure su
524
+
525
+ checkUpdateDisplayName :: (HasCallStack ) => String -> String -> Value -> App Value
526
+ checkUpdateDisplayName tok uid scimUser = do
527
+ let displayName = " Alice in Wonderland"
528
+ su <- setField " displayName" displayName scimUser
529
+ bindResponse (updateScimUser OwnDomain tok uid su) $ \ res -> do
530
+ res. status `shouldMatchInt` 200
531
+ res. json %. " displayName" `shouldMatch` displayName
532
+ bindResponse (getUsersId OwnDomain [uid]) $ \ res -> do
533
+ res. status `shouldMatchInt` 200
534
+ u <- res. json >>= asList >>= assertOne
535
+ u %. " name" `shouldMatch` displayName
536
+ pure su
537
+
538
+ checkUpdateLocale :: (HasCallStack ) => String -> String -> Value -> App Value
539
+ checkUpdateLocale tok uid scimUser = do
540
+ su <- setField " preferredLanguage" " fr" scimUser
541
+ bindResponse (updateScimUser OwnDomain tok uid su) $ \ res -> do
542
+ res. status `shouldMatchInt` 200
543
+ res. json %. " preferredLanguage" `shouldMatch` " fr"
544
+ bindResponse (getUsersId OwnDomain [uid]) $ \ res -> do
545
+ res. status `shouldMatchInt` 200
546
+ u <- res. json >>= asList >>= assertOne
547
+ u %. " locale" `shouldMatch` " fr"
548
+ pure su
549
+
550
+ checkUpdateEmail :: (HasCallStack ) => String -> String -> Value -> App Value
551
+ checkUpdateEmail tok uid scimUser = do
552
+ newEmail <- randomEmail
553
+ su <- setField " emails" [object [" value" .= newEmail]] scimUser
554
+ bindResponse (updateScimUser OwnDomain tok uid su) $ \ res -> do
555
+ res. status `shouldMatchInt` 200
556
+ res. json %. " emails" `shouldMatch` [object [" value" .= newEmail]]
557
+ activateEmail OwnDomain newEmail
558
+ bindResponse (getUsersId OwnDomain [uid]) $ \ res -> do
559
+ res. status `shouldMatchInt` 200
560
+ u <- res. json >>= asList >>= assertOne
561
+ u %. " email" `shouldMatch` newEmail
562
+ pure su
563
+
564
+ checkUpdateExternalId :: (HasCallStack ) => String -> String -> Value -> App Value
565
+ checkUpdateExternalId tok uid scimUser = do
566
+ newExtId <- randomUUIDString
567
+ su <- setField " externalId" newExtId scimUser
568
+ bindResponse (updateScimUser OwnDomain tok uid su) $ \ res -> do
569
+ res. status `shouldMatchInt` 200
570
+ res. json %. " externalId" `shouldMatch` newExtId
571
+ bindResponse (getUsersId OwnDomain [uid]) $ \ res -> do
572
+ res. status `shouldMatchInt` 200
573
+ u <- res. json >>= asList >>= assertOne
574
+ subject <- u %. " sso_id.subject" >>= asString
575
+ subject `shouldContainString` newExtId
576
+ pure su
0 commit comments