Migrate AdminPreflightTest (#35042)

Part of #34494

Signed-off-by: stianst <stianst@gmail.com>
This commit is contained in:
Stian Thorgersen 2024-11-18 16:36:26 +01:00 • committed by GitHub
parent e4509a7199
commit de14e1c310
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 192 additions and 56 deletions

View file

@ -7,6 +7,7 @@ import org.keycloak.test.framework.database.TestDatabase;
import org.keycloak.test.framework.events.AdminEventsSupplier;
import org.keycloak.test.framework.events.EventsSupplier;
import org.keycloak.test.framework.events.SysLogServerSupplier;
import org.keycloak.test.framework.http.HttpClientSupplier;
import org.keycloak.test.framework.injection.Supplier;
import org.keycloak.test.framework.oauth.OAuthClientSupplier;
import org.keycloak.test.framework.realm.ClientSupplier;
@ -16,6 +17,7 @@ import org.keycloak.test.framework.server.DistributionKeycloakTestServerSupplier
import org.keycloak.test.framework.server.EmbeddedKeycloakTestServerSupplier;
import org.keycloak.test.framework.server.KeycloakTestServer;
import org.keycloak.test.framework.server.RemoteKeycloakTestServerSupplier;
import org.keycloak.test.framework.server.KeycloakUrlsSupplier;
import java.util.List;
import java.util.Map;
@ -32,12 +34,14 @@ public class CoreTestFrameworkExtension implements TestFrameworkExtension {
new DistributionKeycloakTestServerSupplier(),
new EmbeddedKeycloakTestServerSupplier(),
new RemoteKeycloakTestServerSupplier(),
new KeycloakUrlsSupplier(),
new DevMemDatabaseSupplier(),
new DevFileDatabaseSupplier(),
new OAuthClientSupplier(),
new SysLogServerSupplier(),
new EventsSupplier(),
new AdminEventsSupplier()
new AdminEventsSupplier(),
new HttpClientSupplier()
);
}

View file

@ -0,0 +1,12 @@
package org.keycloak.test.framework.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface InjectHttpClient {
}

View file

@ -0,0 +1,12 @@
package org.keycloak.test.framework.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface InjectKeycloakUrls {
}

View file

@ -0,0 +1,43 @@
package org.keycloak.test.framework.http;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.keycloak.test.framework.annotations.InjectHttpClient;
import org.keycloak.test.framework.injection.InstanceContext;
import org.keycloak.test.framework.injection.RequestedInstance;
import org.keycloak.test.framework.injection.Supplier;
import java.io.IOException;
public class HttpClientSupplier implements Supplier<HttpClient, InjectHttpClient> {
@Override
public Class<InjectHttpClient> getAnnotationClass() {
return InjectHttpClient.class;
}
@Override
public Class<HttpClient> getValueType() {
return HttpClient.class;
}
@Override
public HttpClient getValue(InstanceContext<HttpClient, InjectHttpClient> instanceContext) {
return HttpClientBuilder.create().build();
}
@Override
public void close(InstanceContext<HttpClient, InjectHttpClient> instanceContext) {
try {
((CloseableHttpClient) instanceContext.getValue()).close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public boolean compatible(InstanceContext<HttpClient, InjectHttpClient> a, RequestedInstance<HttpClient, InjectHttpClient> b) {
return false;
}
}

View file

@ -0,0 +1,48 @@
package org.keycloak.test.framework.server;
import org.keycloak.common.util.KeycloakUriBuilder;
import java.net.MalformedURLException;
import java.net.URL;
public class KeycloakUrls {
private final String baseUrl;
public KeycloakUrls(String baseUrl) {
this.baseUrl = baseUrl;
}
public String getBase() {
return baseUrl;
}
public URL getBaseUrl() {
return toUrl(getBase());
}
public String getAdmin() {
return baseUrl + "/admin";
}
public URL getAdminUrl() {
return toUrl(getAdmin());
}
public KeycloakUriBuilder getAdminBuilder() {
return toBuilder(getAdmin());
}
private URL toUrl(String url) {
try {
return new URL(url);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
private KeycloakUriBuilder toBuilder(String url) {
return KeycloakUriBuilder.fromUri(url);
}
}

View file

@ -0,0 +1,30 @@
package org.keycloak.test.framework.server;
import org.keycloak.test.framework.annotations.InjectKeycloakUrls;
import org.keycloak.test.framework.injection.InstanceContext;
import org.keycloak.test.framework.injection.RequestedInstance;
import org.keycloak.test.framework.injection.Supplier;
public class KeycloakUrlsSupplier implements Supplier<KeycloakUrls, InjectKeycloakUrls> {
@Override
public Class<InjectKeycloakUrls> getAnnotationClass() {
return InjectKeycloakUrls.class;
}
@Override
public Class<KeycloakUrls> getValueType() {
return KeycloakUrls.class;
}
@Override
public KeycloakUrls getValue(InstanceContext<KeycloakUrls, InjectKeycloakUrls> instanceContext) {
KeycloakTestServer testServer = instanceContext.getDependency(KeycloakTestServer.class);
return new KeycloakUrls(testServer.getBaseUrl());
}
@Override
public boolean compatible(InstanceContext<KeycloakUrls, InjectKeycloakUrls> a, RequestedInstance<KeycloakUrls, InjectKeycloakUrls> b) {
return true;
}
}

View file

@ -0,0 +1,42 @@
package org.keycloak.test.admin;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpOptions;
import org.junit.jupiter.api.Test;
import org.keycloak.services.cors.Cors;
import org.keycloak.test.framework.annotations.InjectHttpClient;
import org.keycloak.test.framework.annotations.InjectKeycloakUrls;
import org.keycloak.test.framework.annotations.KeycloakIntegrationTest;
import org.keycloak.test.framework.server.KeycloakUrls;
import java.io.IOException;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
@KeycloakIntegrationTest
public class AdminPreflightTest {
@InjectHttpClient
HttpClient client;
@InjectKeycloakUrls
KeycloakUrls keycloakUrls;
@Test
public void testPreflight() throws IOException {
HttpOptions options = new HttpOptions(keycloakUrls.getAdminBuilder().path("/realms/master/users").build());
options.setHeader("Origin", "http://test");
HttpResponse response = client.execute(options);
assertEquals(200, response.getStatusLine().getStatusCode());
assertEquals("true", response.getFirstHeader(Cors.ACCESS_CONTROL_ALLOW_CREDENTIALS).getValue());
assertEquals("DELETE, POST, GET, PUT", response.getFirstHeader(Cors.ACCESS_CONTROL_ALLOW_METHODS).getValue());
assertEquals("http://test", response.getFirstHeader(Cors.ACCESS_CONTROL_ALLOW_ORIGIN).getValue());
assertEquals("3600", response.getFirstHeader(Cors.ACCESS_CONTROL_MAX_AGE).getValue());
assertTrue(response.getFirstHeader(Cors.ACCESS_CONTROL_ALLOW_HEADERS).getValue().contains("Authorization"));
assertTrue(response.getFirstHeader(Cors.ACCESS_CONTROL_ALLOW_HEADERS).getValue().contains("Content-Type"));
}
}

View file

@ -1,55 +0,0 @@
package org.keycloak.testsuite.admin;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpOptions;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.keycloak.services.cors.Cors;
import java.io.IOException;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class AdminPreflightTest extends AbstractAdminTest {
private CloseableHttpClient client;
@Before
public void before() {
client = HttpClientBuilder.create().build();
}
@After
public void after() {
try {
client.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Test
public void testPreflight() throws IOException {
HttpOptions options = new HttpOptions(getAdminUrl("realms/master/users"));
options.setHeader("Origin", "http://test");
CloseableHttpResponse response = client.execute(options);
assertEquals(200, response.getStatusLine().getStatusCode());
assertEquals("true", response.getFirstHeader(Cors.ACCESS_CONTROL_ALLOW_CREDENTIALS).getValue());
assertEquals("DELETE, POST, GET, PUT", response.getFirstHeader(Cors.ACCESS_CONTROL_ALLOW_METHODS).getValue());
assertEquals("http://test", response.getFirstHeader(Cors.ACCESS_CONTROL_ALLOW_ORIGIN).getValue());
assertEquals("3600", response.getFirstHeader(Cors.ACCESS_CONTROL_MAX_AGE).getValue());
assertTrue(response.getFirstHeader(Cors.ACCESS_CONTROL_ALLOW_HEADERS).getValue().contains("Authorization"));
assertTrue(response.getFirstHeader(Cors.ACCESS_CONTROL_ALLOW_HEADERS).getValue().contains("Content-Type"));
}
private String getAdminUrl(String resource) {
return suiteContext.getAuthServerInfo().getContextRoot().toString() + "/auth/admin/" + resource;
}
}