11package invite .provision ;
22
33import com .fasterxml .jackson .core .JsonProcessingException ;
4+ import com .fasterxml .jackson .core .type .TypeReference ;
45import com .github .tomakehurst .wiremock .stubbing .ServeEvent ;
56import com .github .tomakehurst .wiremock .verification .LoggedRequest ;
67import invite .AbstractTest ;
7- import invite .eduid .EduIDProvision ;
88import invite .exception .RemoteException ;
9- import invite .model .*;
9+ import invite .model .Authority ;
10+ import invite .model .RemoteProvisionedGroup ;
11+ import invite .model .RemoteProvisionedUser ;
12+ import invite .model .Role ;
13+ import invite .model .User ;
14+ import invite .model .UserRole ;
1015import invite .provision .scim .OperationType ;
11- import invite .provision .scim .UserRequest ;
1216import org .junit .jupiter .api .Test ;
1317import org .springframework .beans .factory .annotation .Autowired ;
18+ import org .springframework .http .HttpStatus ;
1419
1520import java .util .List ;
1621import java .util .Map ;
@@ -49,19 +54,28 @@ void newUserRequestWithInvalidRemoteResponse() throws JsonProcessingException {
4954 @ Test
5055 void newUserRequestWithEduIDProvisioning () throws JsonProcessingException {
5156 User user = userRepository .findBySubIgnoreCase (GUEST_SUB ).get ();
52-
5357 this .stubForManageProvisioning (List .of ("1" ));
5458
55- EduIDProvision eduIDProvision = new EduIDProvision (user .getEduId (), UUID .randomUUID ().toString ());
56- stubFor (post (urlPathMatching ("/myconext/api/invite/provision-eduid" )).willReturn (aResponse ()
57- .withHeader ("Content-Type" , "application/json" )
58- .withBody (objectMapper .writeValueAsString (eduIDProvision ))));
59+ String eduIdForInstitution = UUID .randomUUID ().toString ();
60+ super .stubForProvisionEduID (eduIdForInstitution );
5961
6062 String remoteScimIdentifier = this .stubForCreateScimUser ();
6163 provisioningService .newUserRequest (user );
64+ List <ServeEvent > events = this .mockServer .getAllServeEvents ();
65+ ServeEvent serveEvent = events .stream ()
66+ .filter (event -> event .getRequest ().getUrl ().equalsIgnoreCase ("/api/scim/v2/Users" ))
67+ .findFirst ()
68+ .orElseThrow (IllegalArgumentException ::new );
69+ //UserRequest can not be deserialized from String due to missing constructors and setters
70+ Map <String , Object > userRequest = objectMapper .readValue (serveEvent .getRequest ().getBodyAsString (), new TypeReference <>() {
71+ });
72+ assertEquals (eduIdForInstitution , userRequest .get ("userName" ));
73+ assertEquals (eduIdForInstitution , userRequest .get ("externalId" ));
74+
6275 List <RemoteProvisionedUser > remoteProvisionedUsers = remoteProvisionedUserRepository .findAll ();
6376 assertEquals (1 , remoteProvisionedUsers .size ());
6477 assertEquals (remoteScimIdentifier , remoteProvisionedUsers .get (0 ).getRemoteIdentifier ());
78+
6579 }
6680
6781 @ Test
@@ -93,6 +107,7 @@ void updateUserRequest() throws JsonProcessingException {
93107 remoteProvisionedUserRepository .save (remoteProvisionedUser );
94108 this .stubForManageProvisioning (List .of ("1" , "4" , "5" ));
95109 this .stubForUpdateScimUser ();
110+ super .stubForProvisionEduID (UUID .randomUUID ().toString ());
96111 provisioningService .updateUserRequest (user );
97112 List <LoggedRequest > loggedRequests = findAll (putRequestedFor (urlPathMatching (String .format ("/api/scim/v2/Users/(.*)" ))));
98113
@@ -101,6 +116,26 @@ void updateUserRequest() throws JsonProcessingException {
101116 assertEquals (remoteScimIdentifier , userRequest .get ("id" ));
102117 }
103118
119+ @ Test
120+ void updateUserRequestWithEduIDProvisioningError () throws JsonProcessingException {
121+ User user = userRepository .findBySubIgnoreCase (GUEST_SUB ).get ();
122+ //Need to ensure the user is updated, therefore the remote needs to exists and provisioning is scimn
123+ String remoteScimIdentifier = UUID .randomUUID ().toString ();
124+ RemoteProvisionedUser remoteProvisionedUser = new RemoteProvisionedUser (user , remoteScimIdentifier , "7" );
125+ remoteProvisionedUserRepository .save (remoteProvisionedUser );
126+ this .stubForManageProvisioning (List .of ("1" , "4" , "5" ));
127+ this .stubForUpdateScimUser ();
128+ try {
129+ provisioningService .updateUserRequest (user );
130+ fail ("Expected RemoteException" );
131+ } catch (RemoteException e ) {
132+ assertTrue (e .getMessage ().contains ("Error in provisionEduid" ));
133+ assertEquals (HttpStatus .BAD_REQUEST , e .getStatusCode ());
134+ assertNotNull (e .getReference ());
135+ }
136+
137+ }
138+
104139 @ Test
105140 void deleteUserRequest () throws JsonProcessingException {
106141 User user = userRepository .findBySubIgnoreCase (GUEST_SUB ).get ();
0 commit comments