Files
Athou_commafeed/commafeed-server/src/test/java/com/commafeed/integration/WebSocketIT.java

162 lines
5.8 KiB
Java
Raw Normal View History

package com.commafeed.integration;
import java.io.IOException;
2024-08-07 08:10:14 +02:00
import java.net.HttpCookie;
import java.net.URI;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
2024-08-07 08:10:14 +02:00
import java.util.stream.Collectors;
import jakarta.websocket.ClientEndpointConfig;
import jakarta.websocket.CloseReason;
import jakarta.websocket.ContainerProvider;
import jakarta.websocket.DeploymentException;
import jakarta.websocket.Endpoint;
import jakarta.websocket.EndpointConfig;
import jakarta.websocket.Session;
import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.MediaType;
2024-08-14 16:00:47 +02:00
import org.apache.hc.core5.http.HttpStatus;
import org.awaitility.Awaitility;
2025-02-03 05:16:30 +01:00
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
2024-08-14 16:00:47 +02:00
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import com.commafeed.frontend.model.request.FeedModificationRequest;
2024-08-07 08:10:14 +02:00
import io.quarkus.test.junit.QuarkusTest;
2024-08-14 16:00:47 +02:00
import io.restassured.RestAssured;
2024-06-10 08:57:33 +02:00
import lombok.extern.slf4j.Slf4j;
2023-12-17 14:11:15 +01:00
2024-08-07 08:10:14 +02:00
@QuarkusTest
2024-06-10 08:57:33 +02:00
@Slf4j
class WebSocketIT extends BaseIT {
2024-08-14 16:00:47 +02:00
@BeforeEach
void setup() {
RestAssured.authentication = RestAssured.preemptive().basic("admin", "admin");
}
2025-02-03 05:16:30 +01:00
@AfterEach
void tearDown() {
RestAssured.reset();
}
@Test
void sessionClosedIfNotLoggedIn() throws DeploymentException, IOException {
AtomicBoolean connected = new AtomicBoolean();
AtomicReference<CloseReason> closeReasonRef = new AtomicReference<>();
2024-06-10 08:57:33 +02:00
try (Session session = ContainerProvider.getWebSocketContainer().connectToServer(new Endpoint() {
@Override
public void onOpen(Session session, EndpointConfig config) {
connected.set(true);
}
@Override
public void onClose(Session session, CloseReason closeReason) {
closeReasonRef.set(closeReason);
}
2024-08-07 08:10:14 +02:00
}, buildConfig(List.of()), URI.create(getWebSocketUrl()))) {
Awaitility.await().atMost(15, TimeUnit.SECONDS).untilTrue(connected);
2024-06-10 08:57:33 +02:00
log.info("connected to {}", session.getRequestURI());
Awaitility.await().atMost(15, TimeUnit.SECONDS).until(() -> closeReasonRef.get() != null);
}
}
@Test
void subscribeAndGetsNotified() throws DeploymentException, IOException {
2024-08-07 08:10:14 +02:00
List<HttpCookie> cookies = login();
AtomicBoolean connected = new AtomicBoolean();
AtomicReference<String> messageRef = new AtomicReference<>();
2024-06-10 08:57:33 +02:00
try (Session session = ContainerProvider.getWebSocketContainer().connectToServer(new Endpoint() {
@Override
public void onOpen(Session session, EndpointConfig config) {
2023-12-28 10:25:44 +01:00
session.addMessageHandler(String.class, messageRef::set);
connected.set(true);
}
2024-08-07 08:10:14 +02:00
}, buildConfig(cookies), URI.create(getWebSocketUrl()))) {
Awaitility.await().atMost(15, TimeUnit.SECONDS).untilTrue(connected);
2024-06-10 08:57:33 +02:00
log.info("connected to {}", session.getRequestURI());
Long subscriptionId = subscribe(getFeedUrl());
Awaitility.await().atMost(15, TimeUnit.SECONDS).until(() -> messageRef.get() != null);
Assertions.assertEquals("new-feed-entries:" + subscriptionId + ":2", messageRef.get());
}
}
@Test
void notNotifiedForFilteredEntries() throws DeploymentException, IOException {
2024-08-07 08:10:14 +02:00
List<HttpCookie> cookies = login();
Long subscriptionId = subscribeAndWaitForEntries(getFeedUrl());
FeedModificationRequest req = new FeedModificationRequest();
req.setId(subscriptionId);
req.setName("feed-name");
req.setFilter("!title.contains('item 4')");
2024-08-14 16:00:47 +02:00
RestAssured.given().body(req).contentType(MediaType.APPLICATION_JSON).post("rest/feed/modify").then().statusCode(HttpStatus.SC_OK);
AtomicBoolean connected = new AtomicBoolean();
AtomicReference<String> messageRef = new AtomicReference<>();
2024-06-10 08:57:33 +02:00
try (Session session = ContainerProvider.getWebSocketContainer().connectToServer(new Endpoint() {
@Override
public void onOpen(Session session, EndpointConfig config) {
session.addMessageHandler(String.class, messageRef::set);
connected.set(true);
}
2024-08-07 08:10:14 +02:00
}, buildConfig(cookies), URI.create(getWebSocketUrl()))) {
Awaitility.await().atMost(15, TimeUnit.SECONDS).untilTrue(connected);
2024-06-10 08:57:33 +02:00
log.info("connected to {}", session.getRequestURI());
feedNowReturnsMoreEntries();
forceRefreshAllFeeds();
Awaitility.await().atMost(15, TimeUnit.SECONDS).until(() -> messageRef.get() != null);
Assertions.assertEquals("new-feed-entries:" + subscriptionId + ":1", messageRef.get());
}
}
2023-12-28 10:25:44 +01:00
@Test
void pingPong() throws DeploymentException, IOException {
2024-08-07 08:10:14 +02:00
List<HttpCookie> cookies = login();
2023-12-28 10:25:44 +01:00
AtomicBoolean connected = new AtomicBoolean();
AtomicReference<String> messageRef = new AtomicReference<>();
try (Session session = ContainerProvider.getWebSocketContainer().connectToServer(new Endpoint() {
@Override
public void onOpen(Session session, EndpointConfig config) {
session.addMessageHandler(String.class, messageRef::set);
connected.set(true);
}
2024-08-07 08:10:14 +02:00
}, buildConfig(cookies), URI.create(getWebSocketUrl()))) {
2023-12-28 10:25:44 +01:00
Awaitility.await().atMost(15, TimeUnit.SECONDS).untilTrue(connected);
2024-06-10 08:57:33 +02:00
log.info("connected to {}", session.getRequestURI());
2023-12-28 10:25:44 +01:00
session.getAsyncRemote().sendText("ping");
Awaitility.await().atMost(15, TimeUnit.SECONDS).until(() -> messageRef.get() != null);
Assertions.assertEquals("pong", messageRef.get());
}
}
2024-08-07 08:10:14 +02:00
private ClientEndpointConfig buildConfig(List<HttpCookie> cookies) {
2023-12-28 10:25:44 +01:00
return ClientEndpointConfig.Builder.create().configurator(new ClientEndpointConfig.Configurator() {
@Override
public void beforeRequest(Map<String, List<String>> headers) {
2024-08-07 08:10:14 +02:00
headers.put(HttpHeaders.COOKIE,
Collections.singletonList(cookies.stream().map(HttpCookie::toString).collect(Collectors.joining(";"))));
2023-12-28 10:25:44 +01:00
}
}).build();
}
}