{"id":19411602,"url":"https://github.com/levvolkov/sql_deadline","last_synced_at":"2026-04-14T04:03:21.692Z","repository":{"id":232466809,"uuid":"784425750","full_name":"levvolkov/SQL_deadline","owner":"levvolkov","description":"8 «SQL скоро дедлайн»","archived":false,"fork":false,"pushed_at":"2024-04-11T14:12:18.000Z","size":19709,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-07T15:21:35.758Z","etag":null,"topics":["automated-testing","docker","docker-mysql","faker","github-actions","gradle","issues","lombok","mysql","selenide"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/levvolkov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-09T20:35:36.000Z","updated_at":"2024-08-02T20:12:09.000Z","dependencies_parsed_at":"2024-11-10T12:39:46.206Z","dependency_job_id":null,"html_url":"https://github.com/levvolkov/SQL_deadline","commit_stats":null,"previous_names":["levvolkov/sql_deadline"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levvolkov%2FSQL_deadline","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levvolkov%2FSQL_deadline/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levvolkov%2FSQL_deadline/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/levvolkov%2FSQL_deadline/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/levvolkov","download_url":"https://codeload.github.com/levvolkov/SQL_deadline/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240589040,"owners_count":19825285,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automated-testing","docker","docker-mysql","faker","github-actions","gradle","issues","lombok","mysql","selenide"],"created_at":"2024-11-10T12:22:14.914Z","updated_at":"2025-10-30T21:07:58.685Z","avatar_url":"https://github.com/levvolkov.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Java CI with Gradle](https://github.com/LevVolkov/SQL_deadline/actions/workflows/gradle.yml/badge.svg)](https://github.com/LevVolkov/SQL_deadline/actions/workflows/gradle.yml)\n\n# 8. Домашнее задание к занятию «3.2. SQL»\n\nВ качестве результата пришлите ссылки на ваши GitHub-проекты в личном кабинете студента на сайте [netology.ru](https://netology.ru).\n\nВсе задачи этого занятия нужно делать **в разных репозиториях**.\n\n**Важно**: проекты с решением задач по данной теме реализуются с использованием Selenide.\n\n**Важно**: если у вас что-то не получилось, то оформляйте issue [по установленным правилам](https://github.com/netology-code/aqa-homeworks/blob/master/report-requirements.md).\n\n**Важно**: не делайте ДЗ всех занятий в одном репозитории. Иначе вам потом придётся достаточно сложно подключать системы Continuous integration.\n\n## Как сдавать задачи\n\n1. Инициализируйте на своём компьютере пустой Git-репозиторий.\n1. Добавьте в него готовый файл [.gitignore](https://github.com/netology-code/aqa-homeworks/blob/master/.gitignore).\n1. Добавьте в этот же каталог код, требуемый в ДЗ.\n1. Сделайте необходимые коммиты.      \n1. Добавьте в каталог `artifacts` целевой сервис [app-deadline.jar](https://github.com/netology-code/aqa-homeworks/blob/master/sql/app-deadline.jar).\n1. Создайте публичный репозиторий на GitHub и свяжите свой локальный репозиторий с удалённым.\n1. Сделайте пуш — удостоверьтесь, что ваш код появился на GitHub.\n1. Ссылку на ваш проект отправьте в личном кабинете на сайте [netology.ru](https://netology.ru).\n1. Задачи, отмеченные как необязательные, можно не сдавать, это не повлияет на получение зачёта.  \n1. Интеграция проектов с CI необязательна и выполняется по желанию студента.          \n\n**Важно**: задачи этого занятия не предполагают подключения к CI.\n\n## Volumes\n\nПожалуйста, ознакомьтесь с кратким руководством по работе с [volumes](https://github.com/netology-code/aqa-homeworks/blob/master/sql/volumes.md).\n\n## SQL\n\nПожалуйста, ознакомьтесь с кратким руководством по работе с клиентами [SQL](https://github.com/netology-code/aqa-homeworks/blob/master/sql/mysql-psql.md).\n\n## Настройка CI     \n\n**Важно**: интеграция проектов с CI необязательна           \n\nЕсли вы решили получить бейдж сборки в данном проекте, то можно использовать инструкцию по настройке интеграции с Github Actions ([инструкция](https://github.com/netology-code/aqa-homeworks/tree/master/github-actions-integration)) с небольшими доработками:   \n- в среде выполнения сборки необходимо запустить контейнер базы данных. В образах Github Actions есть докер и компоуз, поэтому будет достаточно добавить в yml файл секцию с запуском контейнера фоновом режиме            \n```\n    - name: Container start\n      run: docker-compose up \u0026\n```    \n- для успешного запуска SUT необходимо подождать полного запуска контейнера, самый простой способ выполнения данной задачи - использование команды sleep, добавляем в состав шагов сборки еще одну секцию     \n```\n    - name: Waiting for сontainer start\n      run: sleep 30\n```    \n\nПосле выполнения интеграции необходимо удостовериться, что в CI запускается контейнер, SUT и выполняются автотесты. Автотесты могут падать и сборка может быть красной из-за багов тестируемого приложения. В таком случае должны быть заведены репорты на обнаруженные в ходе тестирования дефекты в отдельных issues, [придерживайтесь схемы при описании](https://github.com/netology-code/aqa-homeworks/blob/master/report-requirements.md).      \n\n## Задача №1: скоро дедлайн\n\nСлучилось то, что обычно случается ближе к дедлайну: никто ничего не успевает и винит во всём остальных.\n\nРазработчикам особо не до вас, им ведь нужно пилить новые фичи, поэтому они подготовили сборку, работающую с СУБД, и даже приложили схему базы данных (см. файл [schema.sql](https://github.com/netology-code/aqa-homeworks/blob/master/sql/schema.sql)). Но при этом сказали: «Остальное вам нужно сделать самим, там несложно» 😈\n\nЧто вам нужно сделать:\n1. Внимательно изучить схему.\n1. Создать Docker container на базе MySQL 8, прописать создание базы данных, пользователя, пароля.\n1. Запустить SUT ([app-deadline.jar](https://github.com/netology-code/aqa-homeworks/blob/master/sql/app-deadline.jar)). Для указания параметров подключения к базе данных можно использовать:\n- либо переменные окружения `DB_URL`, `DB_USER`, `DB_PASS`;\n- либо указать их через флаги командной строки при запуске: `-P:jdbc.url=...`, `-P:jdbc.user=...`, `-P:jdbc.password=...`. Внимание: при запуске флаги не нужно указывать через запятую. Приложение не использует файл `application.properties` в качестве конфигурации, конфигурационный файл находится внутри JAR-архива;\n- либо можете схитрить и попробовать подобрать значения, зашитые в саму SUT.\n\nА дальше выясняется куча забавных вещей 😈 Рекомендуем вам попробовать разобраться самим, но если будет сложно, загляните в подсказку.\n\n### Проблема первая: SUT не стартует\n\n\u003cdetails\u003e\n   \u003csummary\u003eПодсказка\u003c/summary\u003e\n\n   Проблема: SUT не создаёт самостоятельно таблицы в базе данных.\n\n   Поэтому вам нужно сходить на сайт-описание Docker image MySQL и посмотреть, как при инициализации скармливать схему. Будет использоваться технология volumes.\n\u003c/details\u003e\n\n### Проблема вторая: SUT валится при повторном перезапуске\n\n\u003cdetails\u003e\n   \u003csummary\u003eПодсказка\u003c/summary\u003e\n\n   Проблема: SUT вставляет в базу данных демо-данные, а поскольку там есть ограничение уникальности, это приводит к ошибкам.\n\n   Поэтому вам нужно где-то настроить вычистку данных за SUT.\n\u003c/details\u003e\n\n### Проблема третья (опционально): пароли\n\nЕсли вы решите вдруг генерировать пользователей, чтобы под ними тестировать вход в приложение, то не должны удивляться тому, что в базе данных пароль пользователя хранится в зашифрованном виде.\n\nПопытка его записать туда в открытом виде ни к чему хорошему не приведёт.\n\nНастойчивые требования к разработчикам раскрыть алгоритм генерации пароля тоже ни к чему не привели.\n\nЧто же делать?\n\n\u003cdetails\u003e\n   \u003csummary\u003eПодсказка\u003c/summary\u003e\n\n   Если вы внимательно присмотритесь к демо-данным, то они очень, прямо подозрительно похожи на те, что были в одной из предыдущих задач.\n\n   Значит, вы можете попробовать использовать уже готовые зашифрованные пароли, зная то, какие они были в незашифрованном виде.\n\u003c/details\u003e\n\nЕсли вы добрались до этого шага и всё-таки успешно запустили SUT, вы уже герой.\n\nНо теперь выяснилась забавная информация: разработчики фронтенда поругались с разработчиками бэкенда, и вы можете протестировать только вход в систему.\n\nВнимательно посмотрите, как и куда сохраняются коды генерации в СУБД, и напишите тест, который, взяв информацию из БД о сгенерированном коде, позволит вам протестировать вход в систему через веб-интерфейс.\n\nP.S. Неплохо бы ещё проверить, что при трёхкратном неверном вводе пароля система блокируется.\n\nИтого в результате у вас должно получиться:\n* docker-compose.yml*,\n* app-deadline.jar,\n* schema.sql,\n* проект Gradle c кодом ваших автотестов.\n\nЕсли ваша система не поддерживает Docker, то вам, к сожалению, придётся вручную установить MySQL на свой компьютер и отрабатывать тесты уже на ней. В этом случае положите в репозиторий файлик `README.md`, в котором опишите последовательность действий со скриншотами для установки сервера MySQL и загрузки в него файла `schema.sql`.\n\n## Задача №2: backend vs frontend (необязательная)\n\nБэкенд-разработчики сказали, что они всё уже сделали, это фронтендщики тормозят. Поэтому функцию перевода денег с карты на карту мы протестировать через веб-интерфейс не можем.\n\nЗато они выдали нам описание REST API, которое позволяет это сделать, использовать нужно тот же `app-deadline.jar`.\n\nВот описание API:\n\n- Логин\n```http\nPOST http://localhost:9999/api/auth\nContent-Type: application/json\n\n{\n  \"login\": \"vasya\",\n  \"password\": \"qwerty123\"\n}\n```\n\n- Верификация\n```http\nPOST http://localhost:9999/api/auth/verification\nContent-Type: application/json\n\n{\n  \"login\": \"vasya\",\n  \"code\": \"599640\"\n}\n```\nВ ответе, в поле «token» придёт токен аутентификации, который нужно использовать в последующих запросах.\n\n\u003cdetails\u003e\n\u003csummary\u003eПодсказка по REST-assured\u003c/summary\u003e\n\nЕсли вам приходит в ответ следующий JSON:\n```json\n{\n  \"status\": \"ok\"\n}\n```\n\nто вы можете вытащить значение из ответа с помощью REST-assured следующим образом:\n\n```java\n      String status = ... // ваш обычный запрос  \n      .then()\n          .statusCode(200)\n      .extract()\n          .path(\"status\")\n      ;\n\n      // используются matcher'ы Hamcrest\n      assertThat(status, equalTo(\"ok\"));\n```\n\nЕсли вам нужно вытащить весь ответ, чтобы потом искать по нему, например, если нужно несколько полей, то:\n\n```java\n      Response response = ... // ваш обычный запрос  \n      .then()\n          .statusCode(200)\n      .extract()\n          .response()\n      ;\n\n      String status = response.path(\"status\");\n      // используются matcher'ы Hamcrest\n      assertThat(status, equalTo(\"ok\"));\n```\n\n\u003c/details\u003e\n\n- Просмотр карт\n```http\nGET http://localhost:9999/api/cards\nContent-Type: application/json\nAuthorization: Bearer {{token}}\n```\n\nГде {{token}} — это значение «token» с предыдущего шага. Фигурные скобки писать не нужно.\n\n- Перевод с карты на карту (любую)\n```\nPOST http://localhost:9999/api/transfer\nContent-Type: application/json\nAuthorization: Bearer {{token}}\n\n{\n  \"from\": \"5559 0000 0000 0002\",\n  \"to\": \"5559 0000 0000 0008\",\n  \"amount\": 5000\n}\n```\n\nВнимательно изучите запросы и ответы и, используя любой инструмент, который вам нравится, реализуйте тесты API.\n\nВ результате выполнения этой задачи вы должны положить в репозиторий следующие файлы:\n* docker-compose.yml*,\n* app-deadline.jar,\n* schema.sql,\n* код ваших автотестов.\n\nP.S. Всё не может быть хорошо, наверняка разработчики где-то допустили ошибки. Не забывайте заводить issue о найденных багах 😈\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flevvolkov%2Fsql_deadline","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flevvolkov%2Fsql_deadline","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flevvolkov%2Fsql_deadline/lists"}