Тестовое задание Selectel

Запуск:

  • Запустить докер контейнеры приложения и БД PostgreSQL
docker-compose up -d  
  • Открыть терминал и выполнить команду для перевода к командному интерфейсу докер контейнера приложения
docker exec -it testtask_flask_1 /bin/sh
  • Выполнить команду инициализации БД
python manage.py db init
  • Выполнить миграции
python manage.py db migrate
  • Создать таблицы в БД
python manage.py db upgrade
  • Заполнить таблицы данными
python manage.py db_create
  • Запустить тесты
python tests.py

Описание url:

  • / - стартовая страница с списком API endpoints
  • /api/rooms - api endpint для получения информации о всех комнатах
  • /api/rooms/pk - api endpint для получения информации о конкретной комнате
  • /api/customers - api endpint для получения информации о всех клиентах
  • /api/customers/pk - api endpint для получения информации о конкретном клиенте
  • /api/racks - api endpint для получения информации о всех стойках
  • /api/racks/pk - api endpint для получения информации о конкретной стойке
  • /api/busy_racks - api endpoint для получения списка занятых стоек с именем комнаты и именем клиента
  • /api/racks_with_max_size - api endpoint для получения списка всех комнат, с наибольшим размером стойки
  • /api/customers_in_rooms - api endpoint для получения списка всех комнат с массивом id клиентов, у которых есть занятые стойки
  • /api/sum - api endpoint для получения суммы переданных аргументов
  • /api/dif - api endpoint для получения разности переданных аргументов
  • /api/prod - api endpoint для получения произведения переданных аргументов
  • /api/div - api endpoint для получения частного переданных аргументов

Работа с API:

API endpoint: api/rooms

  • методы: GET
  • JSON:
{
    "rooms": [
        {
            "id": 1,
            "name": "Room1"
        },
        ...
        {
            "id": N,
            "name": "RoomN"
        },
}

API endpoint: api/rooms/pk

  • методы: GET
  • JSON:
{
    "id": 1,
    "name": "Room1"
}

API endpoint: api/customers

  • методы: GET
  • JSON:
{
    "rooms": [
        {
            "id": 1,
            "name": "Client-1"
        },
        ...
        {
            "id": N,
            "name": "Client-N"
        },
}

API endpoint: api/customers/pk

  • методы: GET
  • JSON:
{
    "id": 1,
    "name": "Client-1"
}

API endpoint: api/racks

  • методы: GET
  • JSON:
{
    "racks": [
        {
            "customer_id": 1,
            "id": 1,
            "name": "Rack1",
            "room_id": 1,
            "size": 42,
            "state": "occupied"
        },
        ...
        {
            "customer_id": 1,
            "id": N,
            "name": "RackN",
            "room_id": 1,
            "size": 42,
            "state": "occupied"
        },
}
        

API endpoint: api/racks/pk

  • методы: GET
  • JSON:
{
    "customer_id": 1,
    "id": 1,
    "name": "Rack1",
    "room_id": 1,
    "size": 42,
    "state": "occupied"
}

API endpoint: api/busy_racks

  • методы: GET
  • JSON:
{
    "0": {
        "customer_name": "Client-1",
        "rack_id": 1,
        "rack_name": "Rack1",
        "room_name": "Room1"
    },
    "1": {
        "customer_name": "Client-2",
        "rack_id": 2,
        "rack_name": "Rack2",
        "room_name": "Room1"
    },
    ...
}

API endpoint: api/racks_with_max_size

  • методы: GET
  • JSON:
{
    "0": {
        "rack_id": 6,
        "rack_size": 47,
        "room_id": 3
    },
    "1": {
        "rack_id": 4,
        "rack_size": 42,
        "room_id": 2
    },
    ...
}

API endpoint: api/customers_in_rooms

  • методы: GET
  • JSON:
{
    "0": {
        "customers_id": [
            1,
            2
        ],
        "room_id": 1,
        "room_name": "Room1"
    },
    "1": {
        "customers_id": [
            1
        ],
        "room_id": 2,
        "room_name": "Room2"
    },
    ...
}

API endpoint: api/sum

  • методы: POST
  • JSON request:
{
    "args" : [1,2,3,4],
    "last_arg_multiplier" : 2,
    "reverse": "False"
}
  • JSON response:
{
    "result": 14
}

API endpoint: api/dif

  • методы: POST
  • JSON request:
{
    "args" : [1,2,3,4],
    "last_arg_multiplier" : 2,
    "reverse": "False"
}
  • JSON response:
{
    "result": -12
}

API endpoint: api/prod

  • методы: POST
  • JSON request:
{
    "args" : [1,2,3,4],
    "last_arg_multiplier" : 2,
    "reverse": "False"
}
  • JSON response:
{
    "result": 48
}

API endpoint: api/div

  • методы: POST
  • JSON request:
{
    "args" : [1,2,3,4],
    "last_arg_multiplier" : 3,
    "reverse": "True"
}
  • JSON response:
{
    "result": 2.0
}

Возможные проблемы:

  • Если не выполнилась команда
docker exec -it testtask_flask_1 /bin/sh
  • Необходимо выполнить команду для просмотра активных контейнеров
docker ps
  • Найти CONTAINER ID нашего запущенного приложения и вставить его в команду
docker exec -it <CONTAINER ID> /bin/sh