{
  "info": {
    "name": "Pizza API Lab · практика",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "description": "Импортируйте также окружение со своей сессией с главной страницы. Выберите это окружение в Postman. Запросы 01–06 — основная практика, 07–11 — дополнительные."
  },
  "variable": [
    {
      "key": "order_id",
      "value": ""
    },
    {
      "key": "attempt_key",
      "value": ""
    },
    {
      "key": "report_id",
      "value": ""
    }
  ],
  "item": [
    {
      "name": "01 · Меню",
      "request": {
        "method": "GET",
        "auth": {
          "type": "noauth"
        },
        "header": [],
        "url": "{{base_url}}/menu?category=pizza"
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
              "pm.test('Маргарита стоит 490',()=>pm.expect(pm.response.json().items.find(x=>x.id===7).price).to.eql(490));"
            ]
          }
        }
      ]
    },
    {
      "name": "02 · Создать заказ",
      "request": {
        "method": "POST",
        "auth": {
          "type": "bearer",
          "bearer": [
            {
              "key": "token",
              "value": "{{token}}",
              "type": "string"
            }
          ]
        },
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Idempotency-Key",
            "value": "{{attempt_key}}"
          }
        ],
        "url": "{{base_url}}/orders",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"dish_id\": 7,\n  \"quantity\": 2\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 201', () => pm.response.to.have.status(201));",
              "const o=pm.response.json();pm.collectionVariables.set('order_id',o.id);",
              "pm.test('Две пиццы, сумма 980',()=>{pm.expect(o.quantity).to.eql(2);pm.expect(o.total).to.eql(980);});"
            ]
          }
        },
        {
          "listen": "prerequest",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.collectionVariables.set('attempt_key',pm.variables.replaceIn('{{$guid}}'));"
            ]
          }
        }
      ]
    },
    {
      "name": "03 · Прочитать заказ",
      "request": {
        "method": "GET",
        "auth": {
          "type": "bearer",
          "bearer": [
            {
              "key": "token",
              "value": "{{token}}",
              "type": "string"
            }
          ]
        },
        "header": [],
        "url": "{{base_url}}/orders/{{order_id}}"
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
              "pm.test('ID и сумма сохранены',()=>{const o=pm.response.json();pm.expect(o.id).to.eql(pm.collectionVariables.get('order_id'));pm.expect(o.total).to.eql(980);});"
            ]
          }
        }
      ]
    },
    {
      "name": "04 · Нулевое количество",
      "request": {
        "method": "POST",
        "auth": {
          "type": "bearer",
          "bearer": [
            {
              "key": "token",
              "value": "{{token}}",
              "type": "string"
            }
          ]
        },
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Idempotency-Key",
            "value": "invalid-{{$guid}}"
          }
        ],
        "url": "{{base_url}}/orders",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"dish_id\": 7,\n  \"quantity\": 0\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 400', () => pm.response.to.have.status(400));",
              "pm.test('Ошибка количества',()=>pm.expect(pm.response.json().error).to.eql('INVALID_QUANTITY'));"
            ]
          }
        }
      ]
    },
    {
      "name": "05 · Без токена",
      "request": {
        "method": "POST",
        "auth": {
          "type": "noauth"
        },
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Idempotency-Key",
            "value": "{{attempt_key}}"
          }
        ],
        "url": "{{base_url}}/orders",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"dish_id\": 7,\n  \"quantity\": 2\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 401', () => pm.response.to.have.status(401));"
            ]
          }
        }
      ]
    },
    {
      "name": "06 · Повтор без второго заказа",
      "request": {
        "method": "POST",
        "auth": {
          "type": "bearer",
          "bearer": [
            {
              "key": "token",
              "value": "{{token}}",
              "type": "string"
            }
          ]
        },
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Idempotency-Key",
            "value": "{{attempt_key}}"
          }
        ],
        "url": "{{base_url}}/orders",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"dish_id\": 7,\n  \"quantity\": 2\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
              "pm.test('Тот же ID',()=>pm.expect(pm.response.json().id).to.eql(pm.collectionVariables.get('order_id')));"
            ]
          }
        }
      ]
    },
    {
      "name": "07 · Доступ закрыт",
      "request": {
        "method": "GET",
        "auth": {
          "type": "bearer",
          "bearer": [
            {
              "key": "token",
              "value": "{{token}}",
              "type": "string"
            }
          ]
        },
        "header": [],
        "url": "{{base_url}}/instructor"
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 403', () => pm.response.to.have.status(403));"
            ]
          }
        }
      ]
    },
    {
      "name": "08 · Неизвестный заказ",
      "request": {
        "method": "GET",
        "auth": {
          "type": "bearer",
          "bearer": [
            {
              "key": "token",
              "value": "{{token}}",
              "type": "string"
            }
          ]
        },
        "header": [],
        "url": "{{base_url}}/orders/does-not-exist"
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 404', () => pm.response.to.have.status(404));"
            ]
          }
        }
      ]
    },
    {
      "name": "09 · Конфликт ключа",
      "request": {
        "method": "POST",
        "auth": {
          "type": "bearer",
          "bearer": [
            {
              "key": "token",
              "value": "{{token}}",
              "type": "string"
            }
          ]
        },
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Idempotency-Key",
            "value": "{{attempt_key}}"
          }
        ],
        "url": "{{base_url}}/orders",
        "body": {
          "mode": "raw",
          "raw": "{\n  \"dish_id\": 7,\n  \"quantity\": 3\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 409', () => pm.response.to.have.status(409));"
            ]
          }
        }
      ]
    },
    {
      "name": "10 · Начать отчёт",
      "request": {
        "method": "POST",
        "auth": {
          "type": "bearer",
          "bearer": [
            {
              "key": "token",
              "value": "{{token}}",
              "type": "string"
            }
          ]
        },
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          }
        ],
        "url": "{{base_url}}/reports",
        "body": {
          "mode": "raw",
          "raw": "{}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 202', () => pm.response.to.have.status(202));",
              "pm.collectionVariables.set('report_id',pm.response.json().id);"
            ]
          }
        }
      ]
    },
    {
      "name": "11 · Готов ли отчёт",
      "request": {
        "method": "GET",
        "auth": {
          "type": "bearer",
          "bearer": [
            {
              "key": "token",
              "value": "{{token}}",
              "type": "string"
            }
          ]
        },
        "header": [],
        "url": "{{base_url}}/reports/{{report_id}}"
      },
      "event": [
        {
          "listen": "test",
          "script": {
            "type": "text/javascript",
            "exec": [
              "pm.test('HTTP 200', () => pm.response.to.have.status(200));",
              "pm.test('Допустимое состояние',()=>pm.expect(['processing','ready']).to.include(pm.response.json().status));"
            ]
          }
        }
      ]
    }
  ]
}