@Test
  public void testGetContextElement_OK() throws Exception {
    ArgumentCaptor<QueryContext> queryContextArg = ArgumentCaptor.forClass(QueryContext.class);

    List attributes = Collections.singletonList(new ContextAttribute("test", "string", "OK"));

    ContextElement contextElement = new ContextElement();
    contextElement.setEntityId(new EntityId("12345678", "", false));
    contextElement.setContextAttributeList(attributes);
    ContextElementResponse contextElementResponse =
        new ContextElementResponse(contextElement, new StatusCode(CodeEnum.CODE_200));
    QueryContextResponse response = new QueryContextResponse();
    response.setContextElementResponses(Collections.singletonList(contextElementResponse));
    when(ngsiController.queryContext(any())).thenReturn(response);

    mockMvc
        .perform(get("/v1/contextEntities/12345678").accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.statusCode.code").value("200"))
        .andExpect(jsonPath("$.contextElement.attributes[0].name").value("test"))
        .andExpect(jsonPath("$.contextElement.attributes[0].type").value("string"))
        .andExpect(jsonPath("$.contextElement.attributes[0].value").value("OK"));

    verify(ngsiController).queryContext(queryContextArg.capture());

    QueryContext queryContext = queryContextArg.getValue();
    assertNotNull(queryContext);
    assertNotNull(queryContext.getEntityIdList());
    assertEquals(1, queryContext.getEntityIdList().size());
    assertNull(queryContext.getAttributeList());
    assertEquals("12345678", queryContext.getEntityIdList().get(0).getId());
    assertEquals("", queryContext.getEntityIdList().get(0).getType());
    assertEquals(false, queryContext.getEntityIdList().get(0).getIsPattern());
  }
  @Test
  public void testGetContextEntityTypes_Error() throws Exception {
    QueryContextResponse response = new QueryContextResponse();
    response.setErrorCode(new StatusCode(CodeEnum.CODE_500));
    when(ngsiController.queryContext(any())).thenReturn(response);

    mockMvc
        .perform(get("/v1/contextEntityTypes/TempSensor").accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        .andDo(mvcResult -> System.out.println(mvcResult.getResponse().getContentAsString()))
        .andExpect(jsonPath("$.errorCode.code").value("500"))
        .andExpect(jsonPath("$.contextResponses").doesNotExist());

    verify(ngsiController).queryContext(any());
  }
  @Test
  public void testGetContextElement_Error() throws Exception {
    ArgumentCaptor<UpdateContext> updateContextArg = ArgumentCaptor.forClass(UpdateContext.class);

    QueryContextResponse response = new QueryContextResponse();
    response.setErrorCode(new StatusCode(CodeEnum.CODE_400));
    when(ngsiController.queryContext(any())).thenReturn(response);

    mockMvc
        .perform(get("/v1/contextEntities/12345678").accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.statusCode.code").value("400"))
        .andExpect(jsonPath("$.contextElement").doesNotExist());

    verify(ngsiController).queryContext(any());
  }
  @Test
  public void testGetContextEntityTypesAttribute_OK() throws Exception {
    ArgumentCaptor<QueryContext> queryContextArg = ArgumentCaptor.forClass(QueryContext.class);

    List attributes = Collections.singletonList(new ContextAttribute("test", "string", "OK"));

    ContextElement contextElement = new ContextElement();
    contextElement.setEntityId(new EntityId("12345678", "TempSensor", false));
    contextElement.setContextAttributeList(attributes);
    ContextElementResponse contextElementResponse =
        new ContextElementResponse(contextElement, new StatusCode(CodeEnum.CODE_200));
    QueryContextResponse response = new QueryContextResponse();
    response.setContextElementResponses(Collections.singletonList(contextElementResponse));
    when(ngsiController.queryContext(any())).thenReturn(response);

    mockMvc
        .perform(
            get("/v1/contextEntityTypes/TempSensor/attributes/temp")
                .accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        .andDo(mvcResult -> System.out.println(mvcResult.getResponse().getContentAsString()))
        .andExpect(jsonPath("$.errorCode").doesNotExist())
        .andExpect(jsonPath("$.contextResponses").isArray())
        .andExpect(jsonPath("$.contextResponses[0].statusCode.code").value("200"))
        .andExpect(jsonPath("$.contextResponses[0].contextElement.id").value("12345678"))
        .andExpect(jsonPath("$.contextResponses[0].contextElement.type").value("TempSensor"))
        .andExpect(jsonPath("$.contextResponses[0].contextElement.isPattern").value("false"))
        .andExpect(
            jsonPath("$.contextResponses[0].contextElement.attributes[0].name").value("test"))
        .andExpect(
            jsonPath("$.contextResponses[0].contextElement.attributes[0].type").value("string"))
        .andExpect(
            jsonPath("$.contextResponses[0].contextElement.attributes[0].value").value("OK"));

    verify(ngsiController).queryContext(queryContextArg.capture());

    QueryContext queryContext = queryContextArg.getValue();
    assertNotNull(queryContext);
    assertNotNull(queryContext.getEntityIdList());
    assertEquals(1, queryContext.getEntityIdList().size());
    assertNotNull(queryContext.getAttributeList());
    assertEquals(".*", queryContext.getEntityIdList().get(0).getId());
    assertEquals("TempSensor", queryContext.getEntityIdList().get(0).getType());
    assertEquals(true, queryContext.getEntityIdList().get(0).getIsPattern());
    assertEquals("temp", queryContext.getAttributeList().get(0));
  }
  @Test
  public void testGetContextAttributeValue_NotImplemented() throws Exception {
    ArgumentCaptor<QueryContext> queryContextArg = ArgumentCaptor.forClass(QueryContext.class);

    List attributes = Collections.singletonList(new ContextAttribute("test", "string", "OK"));

    ContextElement contextElement = new ContextElement();
    contextElement.setEntityId(new EntityId("12345678", "", false));
    contextElement.setContextAttributeList(attributes);
    ContextElementResponse contextElementResponse =
        new ContextElementResponse(contextElement, new StatusCode(CodeEnum.CODE_200));
    QueryContextResponse response = new QueryContextResponse();
    response.setContextElementResponses(Collections.singletonList(contextElementResponse));
    when(ngsiController.queryContext(any())).thenReturn(response);

    mockMvc
        .perform(
            get("/v1/contextEntities/12345678/attributes/test/DEADBEEF")
                .accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.code").value("500"));

    verify(ngsiController, never()).queryContext(queryContextArg.capture());
  }