@Test(dataProvider = "dataWithoutVersionHeader")
  @SuppressWarnings("unchecked")
  public void shouldRouteQueryRequestsUsingDefaultVersionBehaviour(
      String resource,
      DefaultVersionBehaviour versionBehaviour,
      boolean expectException,
      RequestHandler provider) {

    // Given
    AcceptAPIVersionContext apiVersionContext =
        new AcceptAPIVersionContext(
            new RootContext(),
            "PROTOCOL_NAME",
            AcceptAPIVersion.newBuilder().withDefaultProtocolVersion("1.0").build());
    ServerContext context = new ServerContext(apiVersionContext);
    QueryRequest request = Requests.newQueryRequest(resource);
    QueryResultHandler handler = mock(QueryResultHandler.class);
    setDefaultVersionBehaviour(router, versionBehaviour);

    // When
    router.handleQuery(context, request, handler);

    // Then
    if (expectException) {
      ArgumentCaptor<ResourceException> exceptionCaptor =
          ArgumentCaptor.forClass(ResourceException.class);
      verify(handler).handleError(exceptionCaptor.capture());
      assertThat(exceptionCaptor.getValue()).isInstanceOf(BadRequestException.class);
      verifyZeroInteractions(
          usersHandlerOne,
          usersHandlerTwo,
          usersHandlerThree,
          groupsHandlerOne,
          groupsHandlerTwo,
          groupsHandlerThree);
    } else {
      verify(provider)
          .handleQuery(
              Matchers.<ServerContext>anyObject(), Matchers.<QueryRequest>anyObject(), eq(handler));
    }
  }
  @Test(dataProvider = "annotatedRequestHandlerData")
  public void testQueryCollectionAnnotatedRequestHandler(
      Class<?> requestHandler,
      boolean collection,
      boolean create,
      boolean read,
      boolean update,
      boolean delete,
      boolean patch,
      boolean resourceAction,
      boolean collectionAction,
      boolean query)
      throws Exception {

    // Given
    Object provider = requestHandler.newInstance();
    Connection connection = Resources.newInternalConnection(createHandler(collection, provider));
    QueryRequest req = Requests.newQueryRequest("/test");

    // When
    Promise<QueryResult, ResourceException> promise =
        connection.queryAsync(new RootContext(), req, mock(QueryResourceHandler.class));

    // Then
    if (query && collection) {
      AssertJPromiseAssert.assertThat(promise).succeeded();
      QueryResult result = promise.get();
      Assertions.assertThat(result.getPagedResultsCookie()).isEqualTo("query");
    } else if (collection) {
      AssertJPromiseAssert.assertThat(promise)
          .failedWithException()
          .isInstanceOf(NotSupportedException.class);
    } else {
      AssertJPromiseAssert.assertThat(promise)
          .failedWithException()
          .isInstanceOf(BadRequestException.class);
    }
  }