@Test
  public void testList() {
    User bruno = admin("bruno").build();
    City cidade = city("São Paulo").build();
    Hotel c1 = hotel("Macbook", cidade).build();
    Hotel c2 = hotel("IPhone", cidade).build();
    saveall(cidade, c1, c2, bruno);

    signIn(bruno);

    Page<HotelDTO> page = get("/hotel").expectedStatus(HttpStatus.OK).getPage(HotelDTO.class);

    assertThat(page.getNumber(), equalTo(0));
    assertThat(page.getSize(), equalTo(50));
    assertThat(page.getContent(), contains(convert.toDTO(c2), convert.toDTO(c1)));
  }
  @Test
  public void testUpdate() {
    User bruno = admin("bruno").build();
    City cidade = city("São Paulo").build();
    Hotel c = hotel("Days Inn", cidade).build();
    saveall(cidade, c, bruno);
    signIn(bruno);

    String name = "newname";
    c.setName(name);

    ResponseEntity<HotelDTO> response =
        put("/hotel/%s", c.getId())
            .json(convert.toDTO(c))
            .expectedStatus(HttpStatus.OK)
            .getResponse(HotelDTO.class);

    assertThat(response.getBody().getName(), equalTo(name));
    assertThat(response.getBody().getCity().getName(), not("teste"));

    Hotel entity = repository.findByIdWithCity(c.getId());

    assertThat(entity.getName(), equalTo(name));
    assertThat(entity.getCity().getName(), not("teste"));
  }
  @Test
  public void testSearchByCityName() {
    User bruno = admin("bruno").build();
    City cidade = city("São Paulo").build();
    Hotel c1 = hotel("Days Inn", cidade).build();
    Hotel c2 = hotel("Hilton", cidade).build();
    saveall(cidade, c1, c2, bruno);

    signIn(bruno);

    Page<HotelDTO> page =
        get("/hotel")
            .queryParam("search", "paulo")
            .expectedStatus(HttpStatus.OK)
            .getPage(HotelDTO.class);

    assertThat(page.getTotalElements(), equalTo(2L));
    assertThat(page.getContent(), contains(convert.toDTO(c1), convert.toDTO(c2)));
  }
  @Test
  public void testeListWithPagination() {
    User bruno = admin("bruno").build();
    City cidade = city("São Paulo").build();
    Hotel c1 = hotel("A-Hotel", cidade).build();
    Hotel c2 = hotel("B-Hotel", cidade).build();
    Hotel c3 = hotel("C-Hotel", cidade).build();
    Hotel c4 = hotel("D-Hotel", cidade).build();
    Hotel c5 = hotel("E-Hotel", cidade).build();
    saveall(cidade, c1, c2, c3, c4, c5, bruno);

    signIn(bruno);

    Page<HotelDTO> page =
        get("/hotel")
            .queryParam("page", "0")
            .queryParam("size", "2")
            .expectedStatus(HttpStatus.OK)
            .getPage(HotelDTO.class);

    assertThat(page.getNumber(), equalTo(0));
    assertThat(page.getSize(), equalTo(2));
    assertThat(page.getTotalElements(), equalTo(5l));
    assertThat(page.getTotalPages(), equalTo(3));
    assertThat(page.getContent(), hasSize(2));
    assertThat(page.getContent(), contains(convert.toDTO(c1), convert.toDTO(c2)));

    page =
        get("/hotel")
            .queryParam("size", "2")
            .queryParam("page", "2")
            .expectedStatus(HttpStatus.OK)
            .getPage(HotelDTO.class);

    assertThat(page.getNumber(), equalTo(2));
    assertThat(page.getSize(), equalTo(2));
    assertThat(page.getTotalElements(), equalTo(5l));
    assertThat(page.getTotalPages(), equalTo(3));
    assertThat(page.getContent(), hasSize(1));
    assertThat(page.getContent(), contains(convert.toDTO(c5)));
  }
  @Test
  public void testCreate() {
    User bruno = admin("bruno").build();
    City cidade = city("São Paulo").build();
    saveall(bruno, cidade);
    signIn(bruno);

    Hotel c = hotel("Days Inn", cidade).build();

    ResponseEntity<HotelDTO> response =
        post("/hotel")
            .json(convert.toDTO(c))
            .expectedStatus(HttpStatus.CREATED)
            .getResponse(HotelDTO.class);

    c.setId(response.getBody().getId());
    HotelDTO dto = convert.toDTO(c);
    assertThat(response.getBody(), equalTo(dto));
    assertThat(response.getBody().getCity(), equalTo(dto.getCity()));
    assertThat(repository.findAll(), hasSize(1));
  }
  @Test
  public void testCreateInvalidCity() {
    User bruno = admin("bruno").build();
    City cidade = city("São Paulo").build();
    saveall(bruno, cidade);
    signIn(bruno);

    Hotel c = hotel("Days Inn", cidade).build();
    c.getCity().setId(9999l);

    post("/hotel").json(convert.toDTO(c)).expectedStatus(HttpStatus.NOT_FOUND).getResponse();

    assertThat(repository.findAll(), hasSize(0));
  }
  @Test
  public void testRead() {
    User bruno = admin("bruno").build();
    City cidade = city("São Paulo").build();
    Hotel c1 = hotel("Days Inn", cidade).build();
    saveall(cidade, c1, bruno);

    signIn(bruno);

    ResponseEntity<HotelDTO> response =
        get("/hotel/" + c1.getId()).expectedStatus(HttpStatus.OK).getResponse(HotelDTO.class);
    HotelDTO dto = convert.toDTO(c1);
    assertThat(response.getBody(), equalTo(dto));
    assertThat(response.getBody().getCity(), equalTo(dto.getCity()));
  }
  @Test
  public void testCreateNotPersistyCity() {
    User bruno = admin("bruno").build();
    City cidade = city("São Paulo").build();
    saveall(bruno, cidade);
    signIn(bruno);

    Hotel c = hotel("Days Inn", cidade).build();
    c.getCity().setName("newname");

    ResponseEntity<HotelDTO> response =
        post("/hotel")
            .json(convert.toDTO(c))
            .expectedStatus(HttpStatus.CREATED)
            .getResponse(HotelDTO.class);

    assertThat(response.getBody().getCity().getName(), not("newname"));
    assertThat(cityRepository.findOne(cidade.getId()).getName(), not("newname"));
  }
  @Test
  public void testUpdateWithInvalidCity() {
    User bruno = admin("bruno").build();
    City cidade = city("São Paulo").build();
    Hotel c = hotel("Days Inn", cidade).build();
    saveall(cidade, c, bruno);
    signIn(bruno);

    String name = "newname";
    c.setName(name);
    c.getCity().setId(9999l);

    put("/hotel/%s", c.getId())
        .json(convert.toDTO(c))
        .expectedStatus(HttpStatus.NOT_FOUND)
        .getResponse();

    Hotel entity = repository.findByIdWithCity(c.getId());
    assertThat(entity.getName(), not(name));
    assertThat(entity.getCity().getName(), not("teste"));
  }