├── assets ├── trainee-qa-1.png └── trainee-qa-2.png └── trainee ├── backend-str.md ├── backend.md ├── frontend-22.md ├── frontend.md └── qa-cre.md /assets/trainee-qa-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avito-tech/verticals/dcff04187a9a080eb7f1763452d9075d02d0f0d7/assets/trainee-qa-1.png -------------------------------------------------------------------------------- /assets/trainee-qa-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/avito-tech/verticals/dcff04187a9a080eb7f1763452d9075d02d0f0d7/assets/trainee-qa-2.png -------------------------------------------------------------------------------- /trainee/backend-str.md: -------------------------------------------------------------------------------- 1 | ## Задача 2 | 3 | Нужно сделать простой сервис для управления номерами отелей и бронированиями. 4 | 5 | * Методы реализуются в виде HTTP-хендлеров, на выходе возвращают JSON в теле ответа. В случае ошибок нужно вернуть текст ошибки (тоже в JSON). 6 | 7 | * Сервис должен иметь хендлеры для работы с каталогом номеров отеля: 8 | * **добавить номер отеля**. Принимает на вход текстовое описание и цену за ночь. Возвращает ID номера отеля. 9 | * **удалить номер отеля и все его брони**. Принимает на вход ID номера отеля. 10 | * **получить список номеров отеля**. Должна быть возможность отсортировать по цене или по дате добавления (по возрастанию и убыванию). 11 | 12 | * Сервис должен иметь хендлеры для работы со списком броней номеров: 13 | * **добавить бронь**. Принимает на вход существующий ID номера отеля, дату начала, дату окончания брони (проверять, свободен ли отель на эти даты, не нужно; даты должны быть в формате `“год-месяц-день”`, например: `“2020-01-30”`; даты должны быть валидными). Возвращает ID брони. 14 | * **удалить бронь**. Принимает на вход ID брони. 15 | * **получить список броней номера отеля**. Принимает на вход ID номера отеля. Возвращает список бронирований, каждое бронирование содержит ID, дату начала, дату окончания. Бронирования должны быть отсортированы по дате начала. 16 | 17 | * Примеры запросов и ответов: 18 | * Запрос создания брони: `curl -X POST -d "room_id=24” -d "date_start=2021-12-30" -d "date_end=2022-01-02" http://localhost:9000/bookings/create` 19 | * Ответ: `{"booking_id": 1444}` 20 | * Запрос списка броней номера: `curl -X GET "http://localhost:9000/bookings/list?room_id=24"` 21 | * Ответ: `[{"booking_id": 1444, "date_start": "2021-12-30", "date_end": "2022-01-02"}, ...]` 22 | 23 | ## Требования 24 | 25 | * HTTP JSON API (можно вызвать, например, через curl), без авторизации. 26 | * Данные не теряются между перезагрузками сервиса. 27 | * Язык программирования Go/PHP — очень желательно, можно на Python/JavaScript/Java/C#. 28 | * База данных PostgreSQL/MySQL. Миграции не нужны, достаточно файла с запросами на создание всех таблиц в БД. 29 | * Можно использовать любой фреймворк или обойтись без него. 30 | * Графический интерфейс делать необязательно, но можно при желании. 31 | * Стараться использовать оптимальные подходы (алгоритмы, структуры, индексы). 32 | * Простая инструкция для запуска (в идеале — с возможностью запустить через `docker-compose up`, но это необязательно). 33 | * Код на GitHub (просьба не делать форк этого репозитория, чтобы не плодить плагиат). 34 | * Если есть сомнения по деталям — решение принять самостоятельно, но в своём README.md рекомендуем выписать вопросы и принятые решения по ним. 35 | 36 | ## Дополнительные усложнения 37 | 38 | Это необязательно, но будет плюсом: 39 | 40 | * Юнит-тесты. 41 | * Документация (достаточно структурированного описания методов и примеров их вызова в README.md). 42 | * Реализовать проверку в момент бронирования, свободен ли номер на даты новой брони. Например, при наличии брони на 20-25 июня не давать бронировать на 23-27 июня. 43 | -------------------------------------------------------------------------------- /trainee/backend.md: -------------------------------------------------------------------------------- 1 | ## Создать JSON API для сайта объявлений 2 | Необходимо создать сервис для хранения и подачи объявлений. Объявления должны храниться в базе данных. Сервис должен предоставлять API, работающее поверх HTTP в формате JSON. 3 | 4 | ### Требования 5 | - язык, технологии: Go/Python/PHP/Java/JavaScript, PostgreSQL/MySQL, любой фраемворк (или без него) 6 | - код должен быть выложен на github 7 | - 3 метода: получение списка объявлений, получение одного объявления, создание объявления 8 | - валидация полей (не больше 3 ссылок на фото, описание не больше 1000 символов, название не больше 200 символов) 9 | 10 | ### Метод получения списка объявлений 11 | - нужна пагинация, на одной странице должно присутствовать 10 объявлений 12 | - нужна возможность сортировки: по цене (возрастание/убывание) и по дате создания (возрастание/убывание) 13 | - поля в ответе: название объявления, ссылка на главное фото (первое в списке), цена 14 | 15 | ### Метод получения конкретного объявления 16 | - обязательные поля в ответе: название объявления, цена, ссылка на главное фото 17 | - опциональные поля (можно запросить, передав параметр fields): описание, ссылки на все фото 18 | 19 | ### Метод создания объявления: 20 | - принимает все вышеперечисленные поля: название, описание, несколько ссылок на фотографии (сами фото загружать никуда не требуется), цена 21 | - возвращает ID созданного объявления и код результата (ошибка или успех) 22 | 23 | ### Усложнения 24 | Не обязательно, но задание может быть выполнено с любым числом усложнений: 25 | - написаны юнит тесты 26 | - контейнеризация – возможность поднять проект с помощью `docker-compose up` 27 | - кеширование – для увеличения скорости ответа от сервера, может быть добавлено кеширование (Redis/Memcached) -------------------------------------------------------------------------------- /trainee/frontend-22.md: -------------------------------------------------------------------------------- 1 | # RE Frontend Internship test 2022 2 | 3 | ## Задание 4 | Нужно создать SPA приложение, умеющее выводить список игр, а также карточку отдельной игры, используя данный JSON API. 5 | 6 | ## JSON API 7 | > API доступен на хосте [https://avito-trainee-re-euiom.ondigitalocean.app/](https://avito-trainee-re-euiom.ondigitalocean.app/) 8 | 9 | ### Ручки 10 | 11 | + __Список__ 12 | 13 | GET `/items?page=1&limit=10` 14 | - `page` - номер страницы выдачи 15 | - `limit` - кол-во игр на страницу 16 | 17 | 18 | + __Карточка__ 19 | 20 | GET `/item/:item_id` 21 | - `item_id` - ID игры 22 | 23 | 24 | ## Требования 25 | 1. Приложение должно запускаться локально и выводить постраничный список объектов; по клику на результат в списке открывать карточку объекта на отдельном экране; 26 | 2. Можно использовать любой современный JS стэк (React/Vue/Angular/Svelte), NodeJS; 27 | 3. Можно использовать готовые решения для вывода/подгрузки/UI и проч., если сможете обосновать выбор; 28 | 4. Работа принимается в виде git репозитория на любой из площадок: GitHub / GitLab / BitBucket; 29 | 5. Плюсами будут: тесты, следование паттернам проектирования; 30 | 6. Опционально: типизация, сборка фронта, оптимизации производительности, эстетичность и современность UI, семантичная разметка, a11y. 31 | -------------------------------------------------------------------------------- /trainee/frontend.md: -------------------------------------------------------------------------------- 1 | ## Отображать список объектов и расширенную информацию 2 | - Необходимо получить из JSON API список объектов недвижимости. 3 | У каждого есть заголовок, цена, адрес, превью-изображение и уникальный идентификатор (id). 4 | На главной странице их нужно отобразить списком выведя всю доступную информацию о них. 5 | - При клике на отдельный элемент, так же из JSON API, используя id, нужно получить расширенную информацию о нём и вывести 6 | на отдельной странице. На ней дополнительно будет присутствовать описание, имя продавца, и простая галерея фотографий 7 | с возможностью пролистывания 8 | 9 | ### Требования 10 | - Проект запускается и работает на `localhost` 11 | - Использовать систему контроля версий `git` 12 | - Зависимости не хранятся в проекте, а инсталятся через `npm` 13 | - Можно использовать любые современные фрэймворки и библиотеки (React, Vue, Angular, TypeScript), либо нативный Javascript 14 | 15 | ### Методы для получения данных (JSON API) 16 | - Список методов API http://134.209.138.34/ 17 | - Список объектов http://134.209.138.34/items 18 | - Расширенная информация об объекте http://134.209.138.34/item/:id (пример http://134.209.138.34/item/1849621339) 19 | 20 | ### Хорошо если будет 21 | - Проект выложен на `Github/Bitbucket` 22 | - Простой запуск, вроде двух команд `npm i` `npm run start` 23 | -------------------------------------------------------------------------------- /trainee/qa-cre.md: -------------------------------------------------------------------------------- 1 | ### Задача №1 2 | Найти на Авито (сайт/мобильные приложения) один **любой** баг и описать на него баг-репорт. 3 | 4 | *Дополнительно:* сделать это внутри категории коммерческая недвижимость. 5 | 6 | ##### Результат 7 | Выложить отдельным файлом `task-1.md` 8 | 9 | ### Задача №2 10 | Команда разработки реализует следующую фичу: 11 | На мобильном сайте (m.avito.ru), в фильтры необходимо добавить контрол для выбора станций метро. Эта возможность есть только в тех городах, где есть метрополитен. 12 | 13 | ##### Критерии приемки фичи от product owner 14 | - переключение между табами Алфавит/Линия не сбрасывает выбор; 15 | - при выборе станции снизу выезжает плавающая кнопка "Выбрать N станций"; 16 | - при выборе любой станции из алфавитного списка, выбор дублируется и внутри линии, при этом линия не разворачивается; 17 | - кнопка “Сбросить” появляется только при выбранных станциях; 18 | - при выборе станции метро через поисковую строку, поиск закрывается; 19 | - на экране “Уточнить”, примененный фильтр по метро отображаем с формулировкой "Выбрано n станций". 20 | 21 | ##### Макеты 22 | ![](../assets/trainee-qa-1.png) 23 | ![](../assets/trainee-qa-2.png) 24 | 25 | Реализацию можно посмотреть [здесь](https://m.avito.ru/moskva/kommercheskaya_nedvizhimost?cd=1&searchForm=true) (*нужно включить эмуляцию мобильных устройств в Google Chrome*) 26 | 27 | ##### Задание 28 | Написать end-to-end автотесты, которые будут проверять самые важные, на ваш взгляд, сценарии использования этого фильтра. 29 | 30 | ##### Требования 31 | - язык программирования и технологии: любой; 32 | - код должен быть выложен на github; 33 | - тесты должны работать :) Т.е. их можно запустить и увидеть результат выполнения (passed/failed). 34 | 35 | ##### Результат 36 | Работающий код выложить в директорию `task-2` со всем необходимым для запуска теста 37 | 38 | ### Задача №3 39 | У пользователя есть возможность авторизоваться на сайте через форму https://www.avito.ru/#login 40 | В качестве логина можно использовать номер мобильного телефона или электронную почту. 41 | В качестве пароля можно использовать цифры, буквы латинского языка и специальные символы. Допустимая длина пароля от 8 до 16 символов. 42 | 43 | ##### Задача 44 | Составить набор тестовых данных, при котором мы гарантированно будем знать, что авторизация работает. 45 | 46 | ##### Результат 47 | Выложить отдельным файлом `task-3.md` --------------------------------------------------------------------------------