use of com.yahoo.elide.graphql.subscriptions.websocket.SubscriptionWebSocket in project elide by yahoo.
the class SubscriptionWebSocketTest method testErrorInStream.
@Test
void testErrorInStream() throws IOException {
SubscriptionWebSocket endpoint = SubscriptionWebSocket.builder().executorService(executorService).elide(elide).build();
Book book1 = new Book();
book1.setTitle("Book 1");
book1.setId(1);
Book book2 = new Book();
book2.setTitle("Book 2");
book2.setId(2);
reset(dataStoreTransaction);
when(dataStoreTransaction.getAttribute(any(), any(), any())).thenThrow(new BadRequestException("Bad Request"));
when(dataStoreTransaction.loadObjects(any(), any())).thenReturn(new DataStoreIterableBuilder(List.of(book1, book2)).build());
ConnectionInit init = new ConnectionInit();
endpoint.onOpen(session);
endpoint.onMessage(session, mapper.writeValueAsString(init));
Subscribe subscribe = Subscribe.builder().id("1").payload(Subscribe.Payload.builder().query("subscription {book(topic: ADDED) {id title}}").build()).build();
endpoint.onMessage(session, mapper.writeValueAsString(subscribe));
List<String> expected = List.of("{\"type\":\"connection_ack\"}", "{\"type\":\"next\",\"id\":\"1\",\"payload\":{\"data\":{\"book\":{\"id\":\"1\",\"title\":null}},\"errors\":[{\"message\":\"Exception while fetching data (/book/title) : Bad Request\",\"locations\":[{\"line\":1,\"column\":38}],\"path\":[\"book\",\"title\"],\"extensions\":{\"classification\":\"DataFetchingException\"}}]}}", "{\"type\":\"next\",\"id\":\"1\",\"payload\":{\"data\":{\"book\":{\"id\":\"2\",\"title\":null}},\"errors\":[{\"message\":\"Exception while fetching data (/book/title) : Bad Request\",\"locations\":[{\"line\":1,\"column\":38}],\"path\":[\"book\",\"title\"],\"extensions\":{\"classification\":\"DataFetchingException\"}}]}}", "{\"type\":\"complete\",\"id\":\"1\"}");
ArgumentCaptor<String> message = ArgumentCaptor.forClass(String.class);
verify(remote, times(4)).sendText(message.capture());
assertEquals(expected, message.getAllValues());
}
use of com.yahoo.elide.graphql.subscriptions.websocket.SubscriptionWebSocket in project elide by yahoo.
the class SubscriptionWebSocketTest method testDoubleInit.
@Test
void testDoubleInit() throws IOException {
SubscriptionWebSocket endpoint = SubscriptionWebSocket.builder().executorService(executorService).elide(elide).build();
ConnectionInit init = new ConnectionInit();
endpoint.onOpen(session);
endpoint.onMessage(session, mapper.writeValueAsString(init));
endpoint.onMessage(session, mapper.writeValueAsString(init));
ArgumentCaptor<String> message = ArgumentCaptor.forClass(String.class);
verify(remote, times(1)).sendText(message.capture());
assertEquals("{\"type\":\"connection_ack\"}", message.getAllValues().get(0));
ArgumentCaptor<CloseReason> closeReason = ArgumentCaptor.forClass(CloseReason.class);
verify(session, times(1)).close(closeReason.capture());
assertEquals(MULTIPLE_INIT, closeReason.getValue());
}
use of com.yahoo.elide.graphql.subscriptions.websocket.SubscriptionWebSocket in project elide by yahoo.
the class SubscriptionWebSocketTest method testActualComplete.
@Test
void testActualComplete() throws IOException {
SubscriptionWebSocket endpoint = SubscriptionWebSocket.builder().executorService(executorService).elide(elide).build();
ConnectionInit init = new ConnectionInit();
endpoint.onOpen(session);
endpoint.onMessage(session, mapper.writeValueAsString(init));
Subscribe subscribe = Subscribe.builder().id("1").payload(Subscribe.Payload.builder().query("subscription {book(topic: ADDED) {id title}}").build()).build();
endpoint.onMessage(session, mapper.writeValueAsString(subscribe));
String complete = "{\"id\":\"5d585eff-ed05-48c2-8af7-ad662930ba74\",\"type\":\"complete\"}";
endpoint.onMessage(session, complete);
}
use of com.yahoo.elide.graphql.subscriptions.websocket.SubscriptionWebSocket in project elide by yahoo.
the class SubscriptionWebSocketTest method testSchemaQuery.
@Test
void testSchemaQuery() throws IOException {
SubscriptionWebSocket endpoint = SubscriptionWebSocket.builder().executorService(executorService).elide(elide).build();
String graphQLRequest = "{" + "__schema {" + "types {" + " name" + "}" + "}" + "__type(name: \"Author\") {" + " name" + " fields {" + " name" + " type { name }" + " }" + "}" + "}";
ConnectionInit init = new ConnectionInit();
endpoint.onOpen(session);
endpoint.onMessage(session, mapper.writeValueAsString(init));
Subscribe subscribe = Subscribe.builder().id("1").payload(Subscribe.Payload.builder().query(graphQLRequest).build()).build();
endpoint.onMessage(session, mapper.writeValueAsString(subscribe));
List<String> expected = List.of("{\"type\":\"connection_ack\"}", "{\"type\":\"next\",\"id\":\"1\",\"payload\":{\"data\":{\"__schema\":{\"types\":[{\"name\":\"Author\"},{\"name\":\"AuthorTopic\"},{\"name\":\"AuthorType\"},{\"name\":\"Book\"},{\"name\":\"BookTopic\"},{\"name\":\"Boolean\"},{\"name\":\"DeferredID\"},{\"name\":\"String\"},{\"name\":\"Subscription\"},{\"name\":\"__Directive\"},{\"name\":\"__DirectiveLocation\"},{\"name\":\"__EnumValue\"},{\"name\":\"__Field\"},{\"name\":\"__InputValue\"},{\"name\":\"__Schema\"},{\"name\":\"__Type\"},{\"name\":\"__TypeKind\"},{\"name\":\"address\"}]},\"__type\":{\"name\":\"Author\",\"fields\":[{\"name\":\"id\",\"type\":{\"name\":\"DeferredID\"}},{\"name\":\"homeAddress\",\"type\":{\"name\":\"address\"}},{\"name\":\"name\",\"type\":{\"name\":\"String\"}},{\"name\":\"type\",\"type\":{\"name\":\"AuthorType\"}}]}}}}", "{\"type\":\"complete\",\"id\":\"1\"}");
ArgumentCaptor<String> message = ArgumentCaptor.forClass(String.class);
verify(remote, times(3)).sendText(message.capture());
assertEquals(expected, message.getAllValues());
}
use of com.yahoo.elide.graphql.subscriptions.websocket.SubscriptionWebSocket in project elide by yahoo.
the class SubscriptionWebSocketTest method testMissingType.
@Test
void testMissingType() throws IOException {
SubscriptionWebSocket endpoint = SubscriptionWebSocket.builder().executorService(executorService).elide(elide).build();
String invalid = "{ \"id\": 123 }";
endpoint.onOpen(session);
endpoint.onMessage(session, invalid);
verify(remote, never()).sendText(any());
ArgumentCaptor<CloseReason> closeReason = ArgumentCaptor.forClass(CloseReason.class);
verify(session, times(1)).close(closeReason.capture());
assertEquals(INVALID_MESSAGE, closeReason.getValue());
}
Aggregations