1212import org .junit .Test ;
1313
1414import java .io .IOException ;
15+ import java .text .DateFormat ;
16+ import java .text .SimpleDateFormat ;
17+ import java .time .ZonedDateTime ;
1518import java .util .Arrays ;
19+ import java .util .Date ;
1620
1721import static org .hamcrest .CoreMatchers .*;
1822import static org .hamcrest .MatcherAssert .assertThat ;
@@ -30,7 +34,15 @@ public static void tearDown() throws InterruptedException {
3034
3135 String orgAdminToken = System .getenv (Constants .SLACK_SDK_TEST_GRID_ORG_ADMIN_USER_TOKEN );
3236
33- private UsersCreateResponse createNewUser () throws IOException , SCIMApiException {
37+ private UsersCreateResponse createNewFullUser () throws IOException , SCIMApiException {
38+ return createNewUser (true );
39+ }
40+
41+ private UsersCreateResponse createNewGuestUser () throws IOException , SCIMApiException {
42+ return createNewUser (false );
43+ }
44+
45+ private UsersCreateResponse createNewUser (boolean isFullMember ) throws IOException , SCIMApiException {
3446 String userName = "user" + System .currentTimeMillis ();
3547 User newUser = new User ();
3648 newUser .setName (new User .Name ());
@@ -40,6 +52,15 @@ private UsersCreateResponse createNewUser() throws IOException, SCIMApiException
4052 User .Email email = new User .Email ();
4153 email .setValue ("seratch+" + System .currentTimeMillis () + "@gmail.com" );
4254 newUser .setEmails (Arrays .asList (email ));
55+ if (!isFullMember ) {
56+ // guest
57+ DateFormat df = new SimpleDateFormat ("yyyy-MM-dd'T'HH:mm:ssXXX" );
58+ String expiration = df .format (Date .from (ZonedDateTime .now ().plusDays (14 ).toInstant ()));
59+ newUser .setSlackGuest (User .SlackGuest .builder ()
60+ .type (User .SlackGuest .Types .MULTI )
61+ .expiration (expiration )
62+ .build ());
63+ }
4364 return slack .scim (orgAdminToken ).createUser (req -> req .user (newUser ));
4465 }
4566
@@ -101,9 +122,9 @@ public void readUser_dummy() throws IOException {
101122 }
102123
103124 @ Test
104- public void createAndDeleteUser () throws Exception {
125+ public void createAndDeleteFullUser () throws Exception {
105126 if (orgAdminToken != null ) {
106- UsersCreateResponse creation = createNewUser ();
127+ UsersCreateResponse creation = createNewFullUser ();
107128 assertThat (creation .getId (), is (notNullValue ()));
108129
109130 UsersReadResponse readResp = slack .scim (orgAdminToken ).readUser (req -> req .id (creation .getId ()));
@@ -165,6 +186,78 @@ public void createAndDeleteUser() throws Exception {
165186 }
166187 }
167188
189+ @ Test
190+ public void createAndDeleteGuestUser () throws Exception {
191+ if (orgAdminToken != null ) {
192+ UsersCreateResponse creation = createNewGuestUser ();
193+ assertThat (creation .getId (), is (notNullValue ()));
194+
195+ UsersReadResponse readResp = slack .scim (orgAdminToken ).readUser (req -> req .id (creation .getId ()));
196+ assertThat (readResp .getId (), is (creation .getId ()));
197+ assertThat (readResp .getUserName (), is (creation .getUserName ()));
198+ assertThat (readResp .getSlackGuest ().getType (), is (User .SlackGuest .Types .MULTI ));
199+ assertThat (readResp .getSlackGuest ().getExpiration (), is (notNullValue ()));
200+
201+ try {
202+ // https://api.slack.com/scim#filter
203+ // filter query matching the created data
204+ String userName = creation .getUserName ();
205+ UsersSearchResponse searchResp = slack .scim (orgAdminToken ).searchUsers (req -> req .count (1 ).filter ("userName eq \" " + userName + "\" " ));
206+ assertThat (searchResp .getItemsPerPage (), is (1 ));
207+ assertThat (searchResp .getResources ().size (), is (1 ));
208+ assertThat (searchResp .getResources ().get (0 ).getId (), is (creation .getId ()));
209+ assertThat (searchResp .getResources ().get (0 ).getUserName (), is (creation .getUserName ()));
210+ assertThat (searchResp .getResources ().get (0 ).getSlackGuest (), is (notNullValue ()));
211+
212+ String originalUserName = creation .getUserName ();
213+
214+ User user = new User ();
215+ user .setUserName (originalUserName + "_ed" );
216+ slack .scim (orgAdminToken ).patchUser (req -> req .id (creation .getId ()).user (user ));
217+
218+ readResp = slack .scim (orgAdminToken ).readUser (req -> req .id (creation .getId ()));
219+ assertThat (readResp .getId (), is (creation .getId ()));
220+ assertThat (readResp .getUserName (), is (originalUserName + "_ed" ));
221+
222+ User modifiedUser = readResp ;
223+ modifiedUser .setUserName (originalUserName + "_rv" );
224+ modifiedUser .setNickName (originalUserName + "_rv" ); // required
225+ slack .scim (orgAdminToken ).updateUser (req -> req .id (modifiedUser .getId ()).user (modifiedUser ));
226+
227+ readResp = slack .scim (orgAdminToken ).readUser (req -> req .id (modifiedUser .getId ()));
228+ assertThat (readResp .getId (), is (creation .getId ()));
229+ assertThat (readResp .getUserName (), is (originalUserName + "_rv" ));
230+ assertThat (readResp .getSlackGuest ().getType (), is (User .SlackGuest .Types .MULTI ));
231+ assertThat (readResp .getSlackGuest ().getExpiration (), is (notNullValue ()));
232+
233+ } finally {
234+ UsersDeleteResponse deletion = slack .scim (orgAdminToken ).deleteUser (req -> req .id (creation .getId ()));
235+ assertThat (deletion , is (nullValue ()));
236+
237+ // can call twice
238+ UsersDeleteResponse deletion2 = slack .scim (orgAdminToken ).deleteUser (req -> req .id (creation .getId ()));
239+ assertThat (deletion2 , is (nullValue ()));
240+
241+ // Verify if the deletion is completed (there is some delay)
242+ int counter = 0 ;
243+ UsersReadResponse supposedToBeDeleted = null ;
244+ while (counter < 10 ) {
245+ Thread .sleep (1000 );
246+ supposedToBeDeleted = slack .scim (orgAdminToken ).readUser (req -> req .id (creation .getId ()));
247+ if (!supposedToBeDeleted .getActive ()) {
248+ break ;
249+ }
250+ }
251+ assertThat (supposedToBeDeleted , is (notNullValue ()));
252+ assertThat (supposedToBeDeleted .getActive (), is (false ));
253+
254+ // can call again
255+ UsersDeleteResponse deletion3 = slack .scim (orgAdminToken ).deleteUser (req -> req .id (creation .getId ()));
256+ assertThat (deletion3 , is (nullValue ()));
257+ }
258+ }
259+ }
260+
168261 @ Test
169262 public void groups () throws IOException , SCIMApiException {
170263 if (orgAdminToken != null ) {
@@ -174,7 +267,7 @@ public void groups() throws IOException, SCIMApiException {
174267 newGroup .setDisplayName ("Test Group" + System .currentTimeMillis ());
175268
176269 Group .Member member = new Group .Member ();
177- UsersCreateResponse newUser = createNewUser ();
270+ UsersCreateResponse newUser = createNewFullUser ();
178271 assertThat (newUser .getId (), is (notNullValue ()));
179272 member .setValue (newUser .getId ());
180273 newGroup .setMembers (Arrays .asList (member ));
@@ -210,7 +303,7 @@ public void groupAndUsers() throws IOException, SCIMApiException {
210303 if (orgAdminToken != null ) {
211304 Group newGroup = new Group ();
212305 newGroup .setDisplayName ("Test Group" + System .currentTimeMillis ());
213- UsersCreateResponse newUser = createNewUser ();
306+ UsersCreateResponse newUser = createNewFullUser ();
214307 assertThat (newUser .getId (), is (notNullValue ()));
215308 try {
216309 Group .Member member = new Group .Member ();
0 commit comments