Newer
Older
package de.ozgcloud.admin.keycloak;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.keycloak.admin.client.resource.GroupsResource;
import org.keycloak.representations.idm.GroupRepresentation;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Spy;
import com.thedeanda.lorem.LoremIpsum;
import jakarta.ws.rs.core.Response;
class KeycloakApiServiceTest {
@Spy
@InjectMocks
private KeycloakApiService service;
@Mock
private GroupsResource groupsResource;
@Mock
private Response response;
@Nested
class TestGetAllGroups {
@Test
void shouldCallGroupsResource() {
service.getAllGroups();
verify(groupsResource).groups("", 0, Integer.MAX_VALUE, false);
}
@Test
void shouldReturnGroupRepresentations() {
var groupRepresentation = GroupRepresentationTestFactory.create();
when(groupsResource.groups("", 0, Integer.MAX_VALUE, false)).thenReturn(List.of(groupRepresentation));
var gotGroupRepresentations = service.getAllGroups();
assertThat(gotGroupRepresentations).containsExactly(groupRepresentation);
}
}
@Nested
class TestAddGroup {
private final GroupRepresentation groupRepresentation = GroupRepresentationTestFactory.create();
private final String RESOURCE_ID = GroupRepresentationTestFactory.create().getId();
@BeforeEach
void init() {
when(groupsResource.add(groupRepresentation)).thenReturn(response);
doReturn(RESOURCE_ID).when(service).getCreatedResourceIdFromResponse(response);
void shouldCallGroupsResource() {
verify(groupsResource).add(groupRepresentation);
}
@Test
void shouldGetAddedResourceIdFromResponse() {
callService();
verify(service).getCreatedResourceIdFromResponse(response);
}
@Test
void shouldReturnAddedResourceId() {
var id = callService();
assertThat(id).isEqualTo(RESOURCE_ID);
}
private String callService() {
return service.addGroup(groupRepresentation);
}
}
@Nested
class TestGetCreatedResourceIdFromResponse {
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
private final String RESOURCE_ID = GroupRepresentationTestFactory.create().getId();
private final String LOCATION = LoremIpsum.getInstance().getUrl();
@Test
void shouldExtractResourceIdFromLocationHeader() {
givenResponseCreated();
callService();
verify(service).extractResourceIdFromLocationHeader(LOCATION);
}
@Test
void shouldReturnResourceId() {
givenResponseCreated();
var id = callService();
assertThat(id).isEqualTo(RESOURCE_ID);
}
@Test
void shouldThrowExceptionIsStatusOtherThenCreated() {
givenResponseUnauthorized();
assertThatExceptionOfType(ResourceCreationException.class).isThrownBy(this::callService)
.withMessageStartingWith("Failed to add group - got response with status 403 (Unauthorized)");
}
private void givenResponseCreated() {
when(response.getStatus()).thenReturn(201);
when(response.getHeaderString("Location")).thenReturn(LOCATION);
doReturn(RESOURCE_ID).when(service).extractResourceIdFromLocationHeader(LOCATION);
}
private void givenResponseUnauthorized() {
when(response.getStatus()).thenReturn(403);
when(response.getStatusInfo()).thenReturn(Response.Status.UNAUTHORIZED);
}
private String callService() {
return service.getCreatedResourceIdFromResponse(response);
}
}
@Nested
class TestExtractResourceIdFromLocationHeader {
private final String RESOURCE_ID = GroupRepresentationTestFactory.create().getId();
private final String LOCATION = "https://keycloak-url.test/admin/realms/test/groups/" + RESOURCE_ID;
@Test
void shouldReturnId() {
var id = service.extractResourceIdFromLocationHeader(LOCATION);
assertThat(id).isEqualTo(RESOURCE_ID);
}
}
}