@Test
  public void testDeleteContextElement_OK() throws Exception {
    ArgumentCaptor<UpdateContext> updateContextArg = ArgumentCaptor.forClass(UpdateContext.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));
    UpdateContextResponse response = new UpdateContextResponse();
    response.setContextElementResponses(Collections.singletonList(contextElementResponse));
    when(ngsiController.updateContext(any())).thenReturn(response);

    mockMvc
        .perform(delete("/v1/contextEntities/12345678").accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.code").value("200"));

    verify(ngsiController).updateContext(updateContextArg.capture());

    UpdateContext updateContext = updateContextArg.getValue();
    assertNotNull(updateContext);
    assertNotNull(updateContext.getContextElements());
    assertEquals(1, updateContext.getContextElements().size());
    assertEquals(UpdateAction.DELETE, updateContext.getUpdateAction());
    assertEquals("12345678", updateContext.getContextElements().get(0).getEntityId().getId());
    assertEquals("", updateContext.getContextElements().get(0).getEntityId().getType());
    assertEquals(false, updateContext.getContextElements().get(0).getEntityId().getIsPattern());
  }
  @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());
  }
  @Override
  public UpdateContextResponse updateContext(final UpdateContext update) {

    // send response with status 200 = OK
    UpdateContextResponse updateContextResponse = new UpdateContextResponse();
    List<ContextElementResponse> contextElementResponseList = new ArrayList<>();
    StatusCode statusCode = new StatusCode(CodeEnum.CODE_200);
    for (ContextElement contextElement : update.getContextElements()) {
      logger.info("=> updateContext: {}", contextElement.toString());
      contextElementResponseList.add(new ContextElementResponse(contextElement, statusCode));
    }
    updateContextResponse.setContextElementResponses(contextElementResponseList);
    return updateContextResponse;
  }
  @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());
  }
  private QueryContextResponse createRoomQueryResponse(EntityId queryEntityId) {
    QueryContextResponse queryContextResponse = new QueryContextResponse();

    List<ContextElementResponse> contextElementResponseList = new ArrayList<>();
    if ((queryEntityId.getIsPattern()) && (queryEntityId.getId().equals("Room*"))) {
      for (int varTemp : tempTab) {
        for (int varRoom = 1; varRoom < 5; varRoom++) {
          for (int varFloor = 1; varFloor < 4; varFloor++) {
            ContextElement contextElement = new ContextElement();
            String name = "Room" + varFloor + varRoom;
            EntityId entityId = new EntityId(name, "Room", false);
            contextElement.setEntityId(entityId);
            int value = ((varTemp + (2 * varFloor) + varRoom));
            ContextAttribute tempContextAttribute =
                new ContextAttribute("temperature", "double", String.valueOf(value));
            ContextAttribute floorContextAttribute =
                new ContextAttribute("floor", "string", "Floor" + varFloor);
            List<ContextAttribute> contextAttributeList = new ArrayList<>();
            contextAttributeList.add(tempContextAttribute);
            contextAttributeList.add(floorContextAttribute);
            contextElement.setContextAttributeList(contextAttributeList);
            ContextElementResponse contextElementResponse = new ContextElementResponse();
            contextElementResponse.setContextElement(contextElement);
            contextElementResponse.setStatusCode(new StatusCode(CodeEnum.CODE_200));
            contextElementResponseList.add(contextElementResponse);
          }
        }
      }
    } else {
      String id = queryEntityId.getId();
      int varFloor = Integer.parseInt(String.valueOf(id.charAt(4)));
      int varRoom = Integer.parseInt(String.valueOf(id.charAt(5)));
      Random rand = new Random();
      int i = rand.nextInt(tempTab.length);
      int varTemp = tempTab[i];
      ContextElement contextElement = new ContextElement();

      contextElement.setEntityId(queryEntityId);
      int value = ((varTemp + (2 * varFloor) + varRoom));
      ContextAttribute tempContextAttribute =
          new ContextAttribute("temperature", "double", String.valueOf(value));
      ContextAttribute floorContextAttribute =
          new ContextAttribute("floor", "string", "Floor" + varFloor);
      List<ContextAttribute> contextAttributeList = new ArrayList<>();
      contextAttributeList.add(tempContextAttribute);
      contextAttributeList.add(floorContextAttribute);
      contextElement.setContextAttributeList(contextAttributeList);
      ContextElementResponse contextElementResponse = new ContextElementResponse();
      contextElementResponse.setContextElement(contextElement);
      contextElementResponse.setStatusCode(new StatusCode(CodeEnum.CODE_200));
      contextElementResponseList.add(contextElementResponse);
    }
    queryContextResponse.setContextElementResponses(contextElementResponseList);
    return queryContextResponse;
  }
  private QueryContextResponse createShutterQueryResponse(EntityId queryEntityId) {
    QueryContextResponse queryContextResponse = new QueryContextResponse();

    List<ContextElementResponse> contextElementResponseList = new ArrayList<>();
    Random rand = new Random();
    if ((queryEntityId.getIsPattern()) && (queryEntityId.getId().equals("Shutter*"))) {
      for (int varRoom = 1; varRoom < 5; varRoom++) {
        for (int varFloor = 1; varFloor < 4; varFloor++) {
          ContextElement contextElement = new ContextElement();
          String name = "Shutter" + varFloor + varRoom;
          EntityId entityId = new EntityId(name, "Room", false);
          contextElement.setEntityId(entityId);
          int i = rand.nextInt(statusTab.length);
          String varStatus = statusTab[i];
          ContextAttribute statusContextAttribute =
              new ContextAttribute("status", "string", varStatus);
          List<ContextAttribute> contextAttributeList = new ArrayList<>();
          contextAttributeList.add(statusContextAttribute);
          contextElement.setContextAttributeList(contextAttributeList);
          ContextElementResponse contextElementResponse = new ContextElementResponse();
          contextElementResponse.setContextElement(contextElement);
          contextElementResponse.setStatusCode(new StatusCode(CodeEnum.CODE_200));
          contextElementResponseList.add(contextElementResponse);
        }
      }

    } else {
      int i = rand.nextInt(statusTab.length);
      String varStatus = statusTab[i];
      ContextElement contextElement = new ContextElement();
      contextElement.setEntityId(queryEntityId);
      ContextAttribute statusContextAttribute = new ContextAttribute("status", "string", varStatus);
      List<ContextAttribute> contextAttributeList = new ArrayList<>();
      contextAttributeList.add(statusContextAttribute);
      contextElement.setContextAttributeList(contextAttributeList);
      ContextElementResponse contextElementResponse = new ContextElementResponse();
      contextElementResponse.setContextElement(contextElement);
      contextElementResponse.setStatusCode(new StatusCode(CodeEnum.CODE_200));
      contextElementResponseList.add(contextElementResponse);
    }
    queryContextResponse.setContextElementResponses(contextElementResponseList);
    return queryContextResponse;
  }
  @Test
  public void testUpdateContextAttributeValue_OK() throws Exception {
    ArgumentCaptor<UpdateContext> updateContextArg = ArgumentCaptor.forClass(UpdateContext.class);

    ContextAttribute attribute = new ContextAttribute("temp", "float", "15.5");
    attribute.setMetadata(
        Collections.singletonList(new ContextMetadata("ID", "string", "DEADBEEF")));

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

    UpdateContextAttribute updateContextAttribute = new UpdateContextAttribute();
    updateContextAttribute.setAttribute(attribute);

    mockMvc
        .perform(
            put("/v1/contextEntities/12345678/attributes/temp/DEADBEEF")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .content(json(mapper, updateContextAttribute)))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.code").value(CodeEnum.CODE_200.getLabel()));

    verify(ngsiController).updateContext(updateContextArg.capture());

    UpdateContext updateContextRequest = updateContextArg.getValue();
    assertNotNull(updateContextRequest);
    assertEquals(UpdateAction.UPDATE, updateContextRequest.getUpdateAction());
    assertNotNull(updateContextRequest.getContextElements());
    assertEquals(1, updateContextRequest.getContextElements().size());
    assertNotNull(updateContextRequest.getContextElements().get(0).getEntityId());
    assertEquals(
        "12345678", updateContextRequest.getContextElements().get(0).getEntityId().getId());
    assertEquals("", updateContextRequest.getContextElements().get(0).getEntityId().getType());
    assertEquals(
        false, updateContextRequest.getContextElements().get(0).getEntityId().getIsPattern());
    assertNotNull(updateContextRequest.getContextElements().get(0).getContextAttributeList());
    assertEquals(
        1, updateContextRequest.getContextElements().get(0).getContextAttributeList().size());
    assertEquals(
        "temp",
        updateContextRequest
            .getContextElements()
            .get(0)
            .getContextAttributeList()
            .get(0)
            .getName());
    assertEquals(
        "float",
        updateContextRequest
            .getContextElements()
            .get(0)
            .getContextAttributeList()
            .get(0)
            .getType());
    assertEquals(
        "15.5",
        updateContextRequest
            .getContextElements()
            .get(0)
            .getContextAttributeList()
            .get(0)
            .getValue());
    assertNotNull(
        updateContextRequest
            .getContextElements()
            .get(0)
            .getContextAttributeList()
            .get(0)
            .getMetadata());
    assertEquals(
        1,
        updateContextRequest
            .getContextElements()
            .get(0)
            .getContextAttributeList()
            .get(0)
            .getMetadata()
            .size());
    assertEquals(
        "ID",
        updateContextRequest
            .getContextElements()
            .get(0)
            .getContextAttributeList()
            .get(0)
            .getMetadata()
            .get(0)
            .getName());
    assertEquals(
        "string",
        updateContextRequest
            .getContextElements()
            .get(0)
            .getContextAttributeList()
            .get(0)
            .getMetadata()
            .get(0)
            .getType());
    assertEquals(
        "DEADBEEF",
        updateContextRequest
            .getContextElements()
            .get(0)
            .getContextAttributeList()
            .get(0)
            .getMetadata()
            .get(0)
            .getValue());
  }