/*
* Copyright 2016 Red Hat Inc. and/or its affiliates and other contributors
* as indicated by the @author tags. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.keycloak.testsuite.admin.event;
import org.junit.Before;
import org.junit.Test;
import org.keycloak.admin.client.resource.RealmResource;
import org.keycloak.admin.client.resource.UsersResource;
import org.keycloak.events.EventType;
import org.keycloak.events.admin.OperationType;
import org.keycloak.representations.idm.AdminEventRepresentation;
import org.keycloak.representations.idm.AuthDetailsRepresentation;
import org.keycloak.representations.idm.EventRepresentation;
import org.keycloak.representations.idm.RealmRepresentation;
import org.keycloak.representations.idm.UserRepresentation;
import org.keycloak.testsuite.admin.ApiUtil;
import org.keycloak.testsuite.util.UserBuilder;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
/**
* Test getting and filtering admin events.
*
* @author Stan Silvert ssilvert@redhat.com (C) 2016 Red Hat Inc.
*/
public class AdminEventTest extends AbstractEventTest {
@Before
public void initConfig() {
enableEvents();
testRealmResource().clearAdminEvents();
}
private List<AdminEventRepresentation> events() {
return testRealmResource().getAdminEvents();
}
private String createUser(String username) {
UserRepresentation user = createUserRepresentation(username, username + "@foo.com", "foo", "bar", true);
String userId = ApiUtil.createUserWithAdminClient(testRealmResource(), user);
getCleanup().addUserId(userId);
return userId;
}
private void updateRealm() {
RealmRepresentation realm = testRealmResource().toRepresentation();
realm.setDisplayName("Fury Road");
testRealmResource().update(realm);
}
@Test
public void clearAdminEventsTest() {
createUser("user0");
assertEquals(1, events().size());
testRealmResource().clearAdminEvents();
assertEquals(Collections.EMPTY_LIST, events());
}
@Test
public void adminEventAttributeTest() {
createUser("user5");
List<AdminEventRepresentation> events = events();
assertEquals(1, events.size());
AdminEventRepresentation event = events.get(0);
assertTrue(event.getTime() > 0);
assertEquals(realmName(), event.getRealmId());
assertEquals("CREATE", event.getOperationType());
assertNotNull(event.getResourcePath());
assertNull(event.getError());
AuthDetailsRepresentation details = event.getAuthDetails();
assertEquals("master", details.getRealmId());
assertNotNull(details.getClientId());
assertNotNull(details.getUserId());
assertNotNull(details.getIpAddress());
}
@Test
public void retrieveAdminEventTest() {
createUser("user1");
List<AdminEventRepresentation> events = events();
assertEquals(1, events.size());
AdminEventRepresentation event = events().get(0);
assertEquals("CREATE", event.getOperationType());
assertEquals(realmName(), event.getRealmId());
assertEquals("master", event.getAuthDetails().getRealmId());
assertNull(event.getRepresentation());
}
@Test
public void testGetRepresentation() {
configRep.setAdminEventsDetailsEnabled(Boolean.TRUE);
saveConfig();
createUser("user2");
AdminEventRepresentation event = events().get(0);
assertNotNull(event.getRepresentation());
assertTrue(event.getRepresentation().contains("foo"));
assertTrue(event.getRepresentation().contains("bar"));
}
@Test
public void testFilterAdminEvents() {
// two CREATE and one UPDATE
createUser("user3");
createUser("user4");
updateRealm();
assertEquals(3, events().size());
List<AdminEventRepresentation> events = testRealmResource().getAdminEvents(Arrays.asList("CREATE"), null, null, null, null, null, null, null, null, null);
assertEquals(2, events.size());
}
@Test
public void defaultMaxResults() {
RealmResource realm = adminClient.realms().realm("test");
AdminEventRepresentation event = new AdminEventRepresentation();
event.setOperationType(OperationType.CREATE.toString());
event.setAuthDetails(new AuthDetailsRepresentation());
event.setRealmId(realm.toRepresentation().getId());
for (int i = 0; i < 110; i++) {
testingClient.testing("test").onAdminEvent(event, false);
}
assertEquals(100, realm.getAdminEvents(null, null, null, null, null, null, null, null, null, null).size());
assertEquals(105, realm.getAdminEvents(null, null, null, null, null, null, null, null, 0, 105).size());
assertTrue(realm.getAdminEvents(null, null, null, null, null, null, null, null, 0, 1000).size() >= 110);
}
}