Problema 3: Inserir produto

Implemente os testes de API usando RestAssured para inserção de produto (método POST do ProductController), considerando os seguintes cenários. Lembre-se de inserir o token no cabeçalho da requisição.

Se olharmos uma requisição Postman, nós passamos no body os dados a serem inseridos, correto?

Se repararmos bem, o lado esquerdo (parâmetro) é sempre uma String. Já o valor inserido é variável, pode ser String, Double (float). Já nas categorias, temos uma lista de objetos.

Logo, é exatamente o que já estudamos antes do Map que recebe dois tipos de dados, veja:

⬆️ Esse é especificamente para o POST. Caso vá fazer um PUT, crie um separadamente para ele.

setUp

Nós vamos dando um put até chegar em categories. Veja na imagem do Postman acima, que é inserido uma lista de categorias. Essa lista do postman é a mesma coisa do primeiro Map criado, possui uma Key ("id, String") e um valor de qualquer tipo.

Portanto, criaremos uma Lista, que conterá um Map de <String, Object>, igual a de cima.

Instanciaremos dois maps "category1 e category2", se tivesse a terceira, continuaríamos. Iremos inserir manualmente o "id" e o valor que está no PUT.

Após isso, alocamos esses Map's dentro da lista e por fim, daremos o PUT no Map inicial criado.

Ok, e para transformar esse Map criado em um objeto JSON?

Dentro dos métodos, faremos o seguinte:

Essa requisição é diferente, pois precisamos passar o token (admin ou client), ela é a PRIMEIRA coisa a ser passada no given, veja ➡️

@Test
public void insertShouldReturnProductCreatedWhenAdminLogged() {

    JSONObject newProduct = new JSONObject(postProductInstance);

    String productAsString = newProduct.toString();


    given()
            //isso serve para especificar o tipo da informação
            .header("Content-type", "application/json")
            .header("Authorization", "Bearer " + adminToken)
            .body(productAsString)
            .contentType(ContentType.JSON)
            .accept(ContentType.JSON)
    .when()
            .post("/products")
    .then()
            .statusCode(201)
            .body("name", equalTo("Meu produto"))
            .body("price", is(50.0F))
            .body("categories.id", hasItems(2, 3));

}

Atualizado