This commit is contained in:
Athou
2024-08-07 08:10:14 +02:00
parent 2f6ddf0e70
commit cc32f8ad16
164 changed files with 2011 additions and 3288 deletions

View File

@@ -1,84 +1,82 @@
package com.commafeed.integration;
import java.io.IOException;
import java.net.HttpCookie;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.List;
import java.util.Objects;
import org.apache.commons.io.IOUtils;
import org.apache.hc.core5.http.HttpStatus;
import org.awaitility.Awaitility;
import org.eclipse.jetty.http.HttpStatus;
import org.glassfish.jersey.client.JerseyClientBuilder;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.jackson.internal.jackson.jaxrs.json.JacksonJsonProvider;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockserver.client.MockServerClient;
import org.mockserver.junit.jupiter.MockServerExtension;
import org.mockserver.integration.ClientAndServer;
import org.mockserver.model.HttpRequest;
import org.mockserver.model.HttpResponse;
import com.commafeed.CommaFeedDropwizardAppExtension;
import com.commafeed.JacksonCustomizer;
import com.commafeed.frontend.model.Entries;
import com.commafeed.frontend.model.Subscription;
import com.commafeed.frontend.model.request.LoginRequest;
import com.commafeed.frontend.model.request.SubscribeRequest;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.dropwizard.testing.junit5.DropwizardExtensionsSupport;
import io.restassured.RestAssured;
import io.restassured.http.Header;
import jakarta.ws.rs.client.Client;
import jakarta.ws.rs.client.Entity;
import jakarta.ws.rs.core.Form;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.Response;
import lombok.Getter;
@Getter
@ExtendWith(DropwizardExtensionsSupport.class)
@ExtendWith(MockServerExtension.class)
public abstract class BaseIT {
private static final HttpRequest FEED_REQUEST = HttpRequest.request().withMethod("GET").withPath("/");
private final CommaFeedDropwizardAppExtension extension = new CommaFeedDropwizardAppExtension() {
@Override
protected JerseyClientBuilder clientBuilder() {
return configureClientBuilder(super.clientBuilder().register(MultiPartFeature.class));
}
};
private Client client;
private String feedUrl;
private String baseUrl;
private String apiBaseUrl;
private String webSocketUrl;
private MockServerClient mockServerClient;
private Client client;
private String feedUrl;
private String baseUrl;
private String apiBaseUrl;
private String webSocketUrl;
protected JerseyClientBuilder configureClientBuilder(JerseyClientBuilder base) {
return base;
}
@BeforeEach
void init(MockServerClient mockServerClient) throws IOException {
this.mockServerClient = mockServerClient;
void init() throws IOException {
this.mockServerClient = ClientAndServer.startClientAndServer(0);
ObjectMapper mapper = new ObjectMapper();
new JacksonCustomizer().customize(mapper);
this.client = configureClientBuilder(new JerseyClientBuilder().register(new JacksonJsonProvider(mapper))).build();
this.feedUrl = "http://localhost:" + mockServerClient.getPort() + "/";
this.baseUrl = "http://localhost:8085/";
this.apiBaseUrl = this.baseUrl + "rest/";
this.webSocketUrl = "ws://localhost:8085/ws";
URL resource = Objects.requireNonNull(getClass().getResource("/feed/rss.xml"));
mockServerClient.when(FEED_REQUEST).respond(HttpResponse.response().withBody(IOUtils.toString(resource, StandardCharsets.UTF_8)));
this.client = extension.client();
this.feedUrl = "http://localhost:" + mockServerClient.getPort() + "/";
this.baseUrl = "http://localhost:" + extension.getLocalPort() + "/";
this.apiBaseUrl = this.baseUrl + "rest/";
this.webSocketUrl = "ws://localhost:" + extension.getLocalPort() + "/ws";
this.mockServerClient.when(FEED_REQUEST)
.respond(HttpResponse.response().withBody(IOUtils.toString(resource, StandardCharsets.UTF_8)));
}
@AfterEach
void cleanup() {
this.client.close();
if (this.mockServerClient != null) {
this.mockServerClient.close();
}
if (this.client != null) {
this.client.close();
}
}
protected void feedNowReturnsMoreEntries() throws IOException {
@@ -88,14 +86,20 @@ public abstract class BaseIT {
mockServerClient.when(FEED_REQUEST).respond(HttpResponse.response().withBody(IOUtils.toString(resource, StandardCharsets.UTF_8)));
}
protected String login() {
LoginRequest req = new LoginRequest();
req.setName("admin");
req.setPassword("admin");
try (Response response = client.target(apiBaseUrl + "user/login").request().post(Entity.json(req))) {
Assertions.assertEquals(HttpStatus.OK_200, response.getStatus());
return response.getCookies().get("JSESSIONID").getValue();
}
protected List<HttpCookie> login() {
Form form = new Form();
form.param("j_username", "admin");
form.param("j_password", "admin");
List<Header> setCookieHeaders = RestAssured.given()
.formParams("j_username", "admin", "j_password", "admin")
.post(baseUrl + "j_security_check")
.then()
.statusCode(HttpStatus.SC_OK)
.extract()
.headers()
.getList(HttpHeaders.SET_COOKIE);
return setCookieHeaders.stream().flatMap(h -> HttpCookie.parse(h.getValue()).stream()).toList();
}
protected Long subscribe(String feedUrl) {

View File

@@ -2,25 +2,28 @@ package com.commafeed.integration;
import java.util.Base64;
import org.eclipse.jetty.http.HttpStatus;
import org.apache.hc.core5.http.HttpStatus;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import com.commafeed.frontend.model.Entries;
import com.commafeed.frontend.model.UserModel;
import com.commafeed.frontend.model.request.MarkRequest;
import com.commafeed.frontend.model.request.ProfileModificationRequest;
import com.commafeed.frontend.model.request.SubscribeRequest;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.ws.rs.client.Entity;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.Response;
@QuarkusTest
class SecurityIT extends BaseIT {
@Test
void notLoggedIn() {
try (Response response = getClient().target(getApiBaseUrl() + "user/profile").request().get()) {
Assertions.assertEquals(HttpStatus.UNAUTHORIZED_401, response.getStatus());
Assertions.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getStatus());
}
}
@@ -31,18 +34,18 @@ class SecurityIT extends BaseIT {
.request()
.header(HttpHeaders.AUTHORIZATION, auth)
.get()) {
Assertions.assertEquals(HttpStatus.UNAUTHORIZED_401, response.getStatus());
Assertions.assertEquals(HttpStatus.SC_UNAUTHORIZED, response.getStatus());
}
}
@Test
void missingRole() {
String auth = "Basic " + Base64.getEncoder().encodeToString("demo:demo".getBytes());
try (Response response = getClient().target(getApiBaseUrl() + "admin/settings")
try (Response response = getClient().target(getApiBaseUrl() + "admin/metrics")
.request()
.header(HttpHeaders.AUTHORIZATION, auth)
.get()) {
Assertions.assertEquals(HttpStatus.FORBIDDEN_403, response.getStatus());
Assertions.assertEquals(HttpStatus.SC_FORBIDDEN, response.getStatus());
}
}
@@ -84,5 +87,16 @@ class SecurityIT extends BaseIT {
.request()
.get(Entries.class);
Assertions.assertEquals("my title for this feed", entries.getName());
// mark entry as read and expect it won't work because it's not a GET request
MarkRequest markRequest = new MarkRequest();
markRequest.setId("1");
markRequest.setRead(true);
try (Response markResponse = getClient().target(getApiBaseUrl() + "entry/mark")
.queryParam("apiKey", apiKey)
.request()
.post(Entity.json(markRequest))) {
Assertions.assertEquals(HttpStatus.SC_UNAUTHORIZED, markResponse.getStatus());
}
}
}

View File

@@ -1,6 +1,7 @@
package com.commafeed.integration;
import java.io.IOException;
import java.net.HttpCookie;
import java.net.URI;
import java.util.Collections;
import java.util.List;
@@ -8,6 +9,7 @@ import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import org.awaitility.Awaitility;
import org.glassfish.jersey.client.JerseyClientBuilder;
@@ -17,6 +19,7 @@ import org.junit.jupiter.api.Test;
import com.commafeed.frontend.model.request.FeedModificationRequest;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.websocket.ClientEndpointConfig;
import jakarta.websocket.CloseReason;
import jakarta.websocket.ContainerProvider;
@@ -25,8 +28,10 @@ import jakarta.websocket.Endpoint;
import jakarta.websocket.EndpointConfig;
import jakarta.websocket.Session;
import jakarta.ws.rs.client.Entity;
import jakarta.ws.rs.core.HttpHeaders;
import lombok.extern.slf4j.Slf4j;
@QuarkusTest
@Slf4j
class WebSocketIT extends BaseIT {
@@ -49,18 +54,17 @@ class WebSocketIT extends BaseIT {
public void onClose(Session session, CloseReason closeReason) {
closeReasonRef.set(closeReason);
}
}, buildConfig("fake-session-id"), URI.create(getWebSocketUrl()))) {
}, buildConfig(List.of()), URI.create(getWebSocketUrl()))) {
Awaitility.await().atMost(15, TimeUnit.SECONDS).untilTrue(connected);
log.info("connected to {}", session.getRequestURI());
Awaitility.await().atMost(15, TimeUnit.SECONDS).until(() -> closeReasonRef.get() != null);
Assertions.assertEquals(CloseReason.CloseCodes.VIOLATED_POLICY, closeReasonRef.get().getCloseCode());
}
}
@Test
void subscribeAndGetsNotified() throws DeploymentException, IOException {
String sessionId = login();
List<HttpCookie> cookies = login();
AtomicBoolean connected = new AtomicBoolean();
AtomicReference<String> messageRef = new AtomicReference<>();
@@ -70,7 +74,7 @@ class WebSocketIT extends BaseIT {
session.addMessageHandler(String.class, messageRef::set);
connected.set(true);
}
}, buildConfig(sessionId), URI.create(getWebSocketUrl()))) {
}, buildConfig(cookies), URI.create(getWebSocketUrl()))) {
Awaitility.await().atMost(15, TimeUnit.SECONDS).untilTrue(connected);
log.info("connected to {}", session.getRequestURI());
@@ -83,7 +87,7 @@ class WebSocketIT extends BaseIT {
@Test
void notNotifiedForFilteredEntries() throws DeploymentException, IOException {
String sessionId = login();
List<HttpCookie> cookies = login();
Long subscriptionId = subscribeAndWaitForEntries(getFeedUrl());
FeedModificationRequest req = new FeedModificationRequest();
@@ -100,7 +104,7 @@ class WebSocketIT extends BaseIT {
session.addMessageHandler(String.class, messageRef::set);
connected.set(true);
}
}, buildConfig(sessionId), URI.create(getWebSocketUrl()))) {
}, buildConfig(cookies), URI.create(getWebSocketUrl()))) {
Awaitility.await().atMost(15, TimeUnit.SECONDS).untilTrue(connected);
log.info("connected to {}", session.getRequestURI());
@@ -115,7 +119,7 @@ class WebSocketIT extends BaseIT {
@Test
void pingPong() throws DeploymentException, IOException {
String sessionId = login();
List<HttpCookie> cookies = login();
AtomicBoolean connected = new AtomicBoolean();
AtomicReference<String> messageRef = new AtomicReference<>();
@@ -125,7 +129,7 @@ class WebSocketIT extends BaseIT {
session.addMessageHandler(String.class, messageRef::set);
connected.set(true);
}
}, buildConfig(sessionId), URI.create(getWebSocketUrl()))) {
}, buildConfig(cookies), URI.create(getWebSocketUrl()))) {
Awaitility.await().atMost(15, TimeUnit.SECONDS).untilTrue(connected);
log.info("connected to {}", session.getRequestURI());
@@ -136,11 +140,12 @@ class WebSocketIT extends BaseIT {
}
}
private ClientEndpointConfig buildConfig(String sessionId) {
private ClientEndpointConfig buildConfig(List<HttpCookie> cookies) {
return ClientEndpointConfig.Builder.create().configurator(new ClientEndpointConfig.Configurator() {
@Override
public void beforeRequest(Map<String, List<String>> headers) {
headers.put("Cookie", Collections.singletonList("JSESSIONID=" + sessionId));
headers.put(HttpHeaders.COOKIE,
Collections.singletonList(cookies.stream().map(HttpCookie::toString).collect(Collectors.joining(";"))));
}
}).build();
}

View File

@@ -9,14 +9,15 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import com.commafeed.CommaFeedConfiguration.ApplicationSettings;
import com.commafeed.backend.model.User;
import com.commafeed.frontend.model.UserModel;
import com.commafeed.frontend.model.request.IDRequest;
import com.commafeed.integration.BaseIT;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.ws.rs.client.Entity;
@QuarkusTest
class AdminIT extends BaseIT {
@Override
@@ -24,12 +25,6 @@ class AdminIT extends BaseIT {
return base.register(HttpAuthenticationFeature.basic("admin", "admin"));
}
@Test
void getApplicationSettings() {
ApplicationSettings settings = getClient().target(getApiBaseUrl() + "admin/settings").request().get(ApplicationSettings.class);
Assertions.assertTrue(settings.getAllowRegistrations());
}
@Nested
class Users {
@Test

View File

@@ -9,9 +9,8 @@ import java.time.ZoneOffset;
import java.util.Objects;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.hc.core5.http.HttpStatus;
import org.awaitility.Awaitility;
import org.eclipse.jetty.http.HttpStatus;
import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.client.JerseyClientBuilder;
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
@@ -30,10 +29,12 @@ import com.commafeed.frontend.model.request.IDRequest;
import com.commafeed.frontend.model.request.MarkRequest;
import com.commafeed.integration.BaseIT;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.ws.rs.client.Entity;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
@QuarkusTest
class FeedIT extends BaseIT {
@Override
@@ -69,19 +70,19 @@ class FeedIT extends BaseIT {
.property(ClientProperties.FOLLOW_REDIRECTS, Boolean.FALSE)
.request()
.get()) {
Assertions.assertEquals(HttpStatus.TEMPORARY_REDIRECT_307, response.getStatus());
Assertions.assertEquals(HttpStatus.SC_TEMPORARY_REDIRECT, response.getStatus());
}
}
@Test
void unsubscribeFromUnknownFeed() {
Assertions.assertEquals(HttpStatus.NOT_FOUND_404, unsubsribe(1L));
Assertions.assertEquals(HttpStatus.SC_NOT_FOUND, unsubsribe(1L));
}
@Test
void unsubscribeFromKnownFeed() {
long subscriptionId = subscribe(getFeedUrl());
Assertions.assertEquals(HttpStatus.OK_200, unsubsribe(subscriptionId));
Assertions.assertEquals(HttpStatus.SC_OK, unsubsribe(subscriptionId));
}
private int unsubsribe(long subscriptionId) {
@@ -212,20 +213,7 @@ class FeedIT extends BaseIT {
void importExportOpml() throws IOException {
importOpml();
String opml = getClient().target(getApiBaseUrl() + "feed/export").request().get(String.class);
String expextedOpml = """
<?xml version="1.0" encoding="UTF-8"?>
<opml version="1.0">
<head>
<title>admin subscriptions in CommaFeed</title>
</head>
<body>
<outline text="out1" title="out1">
<outline text="feed1" type="rss" title="feed1" xmlUrl="https://hostname.local/commafeed/feed1.xml" />
</outline>
</body>
</opml>
""";
Assertions.assertEquals(StringUtils.normalizeSpace(expextedOpml), StringUtils.normalizeSpace(opml));
Assertions.assertTrue(opml.contains("<title>admin subscriptions in CommaFeed</title>"));
}
void importOpml() throws IOException {

View File

@@ -12,9 +12,11 @@ import com.commafeed.frontend.model.request.ProfileModificationRequest;
import com.commafeed.frontend.resource.fever.FeverResponse;
import com.commafeed.integration.BaseIT;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.ws.rs.client.Entity;
import jakarta.ws.rs.core.Form;
@QuarkusTest
class FeverIT extends BaseIT {
private Long userId;
@@ -26,7 +28,7 @@ class FeverIT extends BaseIT {
}
@BeforeEach
void init() {
void setup() {
// create api key
ProfileModificationRequest req = new ProfileModificationRequest();
req.setCurrentPassword("admin");
@@ -73,6 +75,7 @@ class FeverIT extends BaseIT {
Form form = new Form();
form.param("api_key", Digests.md5Hex("admin:" + apiKey));
form.param(what, "1");
return getClient().target(getApiBaseUrl() + "fever/user/{userId}")
.resolveTemplate("userId", userId)
.request()

View File

@@ -6,6 +6,9 @@ import org.junit.jupiter.api.Test;
import com.commafeed.frontend.model.ServerInfo;
import com.commafeed.integration.BaseIT;
import io.quarkus.test.junit.QuarkusTest;
@QuarkusTest
class ServerIT extends BaseIT {
@Test
@@ -16,7 +19,7 @@ class ServerIT extends BaseIT {
Assertions.assertTrue(serverInfos.isDemoAccountEnabled());
Assertions.assertTrue(serverInfos.isWebsocketEnabled());
Assertions.assertEquals(900000, serverInfos.getWebsocketPingInterval());
Assertions.assertEquals(10000, serverInfos.getTreeReloadInterval());
Assertions.assertEquals(30000, serverInfos.getTreeReloadInterval());
}
}

View File

@@ -1,30 +1,38 @@
package com.commafeed.integration.rest;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import com.commafeed.frontend.model.request.PasswordResetRequest;
import com.commafeed.integration.BaseIT;
import com.icegreen.greenmail.junit5.GreenMailExtension;
import com.icegreen.greenmail.util.GreenMail;
import com.icegreen.greenmail.util.ServerSetupTest;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.mail.internet.MimeMessage;
import jakarta.ws.rs.client.Entity;
@QuarkusTest
class UserIT extends BaseIT {
@Nested
class PasswordReset {
@RegisterExtension
static final GreenMailExtension GREEN_MAIL = new GreenMailExtension(ServerSetupTest.SMTP);
private GreenMail greenMail;
@BeforeEach
void init() {
GREEN_MAIL.setUser("noreply@commafeed.com", "user", "pass");
void setup() {
this.greenMail = new GreenMail(ServerSetupTest.SMTP);
this.greenMail.start();
this.greenMail.setUser("noreply@commafeed.com", "user", "pass");
}
@AfterEach
void cleanup() {
this.greenMail.stop();
}
@Test
@@ -34,7 +42,7 @@ class UserIT extends BaseIT {
getClient().target(getApiBaseUrl() + "user/passwordReset").request().post(Entity.json(req), Void.TYPE);
MimeMessage message = GREEN_MAIL.getReceivedMessages()[0];
MimeMessage message = greenMail.getReceivedMessages()[0];
Assertions.assertEquals("CommaFeed - Password recovery", message.getSubject());
Assertions.assertTrue(message.getContent().toString().startsWith("You asked for password recovery for account 'admin'"));
Assertions.assertEquals("CommaFeed <noreply@commafeed.com>", message.getFrom()[0].toString());

View File

@@ -1,5 +1,9 @@
package com.commafeed.integration.servlet;
import java.net.HttpCookie;
import java.util.List;
import java.util.stream.Collectors;
import org.glassfish.jersey.client.JerseyClientBuilder;
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
import org.junit.jupiter.api.Assertions;
@@ -8,10 +12,12 @@ import org.junit.jupiter.api.Test;
import com.commafeed.frontend.model.Settings;
import com.commafeed.integration.BaseIT;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.ws.rs.client.Entity;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.Response;
@QuarkusTest
class CustomCodeIT extends BaseIT {
@Override
@@ -30,16 +36,16 @@ class CustomCodeIT extends BaseIT {
getClient().target(getApiBaseUrl() + "user/settings").request().post(Entity.json(settings), Void.TYPE);
// check custom code servlets
String cookie = login();
List<HttpCookie> cookies = login();
try (Response response = getClient().target(getBaseUrl() + "custom_js.js")
.request()
.header(HttpHeaders.COOKIE, "JSESSIONID=" + cookie)
.header(HttpHeaders.COOKIE, cookies.stream().map(HttpCookie::toString).collect(Collectors.joining(";")))
.get()) {
Assertions.assertEquals("custom-js", response.readEntity(String.class));
}
try (Response response = getClient().target(getBaseUrl() + "custom_css.css")
.request()
.header(HttpHeaders.COOKIE, "JSESSIONID=" + cookie)
.header(HttpHeaders.COOKIE, cookies.stream().map(HttpCookie::toString).collect(Collectors.joining(";")))
.get()) {
Assertions.assertEquals("custom-css", response.readEntity(String.class));
}

View File

@@ -1,32 +1,34 @@
package com.commafeed.integration.servlet;
import org.eclipse.jetty.http.HttpStatus;
import java.net.HttpCookie;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.hc.core5.http.HttpStatus;
import org.glassfish.jersey.client.ClientProperties;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import com.commafeed.frontend.model.UserModel;
import com.commafeed.integration.BaseIT;
import jakarta.ws.rs.NotAuthorizedException;
import jakarta.ws.rs.client.Invocation.Builder;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.Response;
@QuarkusTest
class LogoutIT extends BaseIT {
@Test
void test() {
String cookie = login();
List<HttpCookie> cookies = login();
try (Response response = getClient().target(getBaseUrl() + "logout")
.request()
.header(HttpHeaders.COOKIE, "JSESSIONID=" + cookie)
.header(HttpHeaders.COOKIE, cookies.stream().map(HttpCookie::toString).collect(Collectors.joining(";")))
.property(ClientProperties.FOLLOW_REDIRECTS, Boolean.FALSE)
.get()) {
Assertions.assertEquals(HttpStatus.FOUND_302, response.getStatus());
Assertions.assertEquals(HttpStatus.SC_TEMPORARY_REDIRECT, response.getStatus());
List<String> setCookieHeaders = response.getStringHeaders().get(HttpHeaders.SET_COOKIE);
Assertions.assertTrue(setCookieHeaders.stream().flatMap(c -> HttpCookie.parse(c).stream()).allMatch(c -> c.getMaxAge() == 0));
}
Builder req = getClient().target(getApiBaseUrl() + "user/profile").request().header(HttpHeaders.COOKIE, "JSESSIONID=" + cookie);
Assertions.assertThrows(NotAuthorizedException.class, () -> req.get(UserModel.class));
}
}

View File

@@ -1,6 +1,10 @@
package com.commafeed.integration.servlet;
import org.eclipse.jetty.http.HttpStatus;
import java.net.HttpCookie;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.hc.core5.http.HttpStatus;
import org.glassfish.jersey.client.ClientProperties;
import org.glassfish.jersey.client.JerseyClientBuilder;
import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
@@ -9,9 +13,11 @@ import org.junit.jupiter.api.Test;
import com.commafeed.integration.BaseIT;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.Response;
@QuarkusTest
class NextUnreadIT extends BaseIT {
@Override
@@ -23,13 +29,13 @@ class NextUnreadIT extends BaseIT {
void test() {
subscribeAndWaitForEntries(getFeedUrl());
String cookie = login();
List<HttpCookie> cookies = login();
Response response = getClient().target(getBaseUrl() + "next")
.property(ClientProperties.FOLLOW_REDIRECTS, Boolean.FALSE)
.request()
.header(HttpHeaders.COOKIE, "JSESSIONID=" + cookie)
.header(HttpHeaders.COOKIE, cookies.stream().map(HttpCookie::toString).collect(Collectors.joining(";")))
.get();
Assertions.assertEquals(HttpStatus.FOUND_302, response.getStatus());
Assertions.assertEquals(HttpStatus.SC_TEMPORARY_REDIRECT, response.getStatus());
Assertions.assertEquals("https://hostname.local/commafeed/2", response.getHeaderString(HttpHeaders.LOCATION));
}

View File

@@ -5,8 +5,10 @@ import org.junit.jupiter.api.Test;
import com.commafeed.integration.BaseIT;
import io.quarkus.test.junit.QuarkusTest;
import jakarta.ws.rs.core.Response;
@QuarkusTest
class RobotsTxtIT extends BaseIT {
@Test
void test() {