diff --git a/flask_exercises/flask_excercises.py b/flask_exercises/flask_excercises.py index 7e30fe2..717d22e 100644 --- a/flask_exercises/flask_excercises.py +++ b/flask_exercises/flask_excercises.py @@ -1,31 +1,44 @@ -from flask import Flask +from flask import Flask, abort, request +from http import HTTPStatus class FlaskExercise: - """ - Вы должны создать API для обработки CRUD запросов. - В данной задаче все пользователи хранятся в одном словаре, где ключ - это имя пользователя, - а значение - его параметры. {"user1": {"age": 33}, "user2": {"age": 20}} - Словарь (dict) хранить в памяти, он должен быть пустым при старте flask. - - POST /user - создание пользователя. - В теле запроса приходит JSON в формате {"name": <имя пользователя>}. - Ответ должен вернуться так же в JSON в формате {"data": "User <имя пользователя> is created!"} - со статусом 201. - Если в теле запроса не было ключа "name", то в ответ возвращается JSON - {"errors": {"name": "This field is required"}} со статусом 422 - - GET /user/ - чтение пользователя - В ответе должен вернуться JSON {"data": "My name is "}. Статус 200 - - PATCH /user/ - обновление пользователя - В теле запроса приходит JSON в формате {"name": }. - В ответе должен вернуться JSON {"data": "My name is "}. Статус 200 - - DELETE /user/ - удаление пользователя - В ответ должен вернуться статус 204 - """ + users: dict = {} @staticmethod def configure_routes(app: Flask) -> None: - pass + @app.post("/user") + def user_post() -> tuple: + name = request.json.get("name") + if name is None: + return { + "errors": {"name": "This field is required"} + }, HTTPStatus.UNPROCESSABLE_ENTITY + + FlaskExercise.users[name] = {} + return {"data": f"User {name} is created!"}, HTTPStatus.CREATED + + @app.get("/user/") + def show_user(name: str) -> dict: + FlaskExercise.abort_if_user_not_found(name) + return {"data": f"My name is {name}"} + + @app.patch("/user/") + def update_user(name: str) -> dict: + FlaskExercise.abort_if_user_not_found(name) + new_name = request.json.get("name") + user = FlaskExercise.users.pop(name) + FlaskExercise.users[new_name] = user + return {"data": f"My name is {new_name}"} + + @app.delete("/user/") + def delete_user(name: str) -> tuple: + FlaskExercise.abort_if_user_not_found(name) + del FlaskExercise.users[name] + return "", HTTPStatus.NO_CONTENT + + @staticmethod + def abort_if_user_not_found(name: str) -> None: + name = FlaskExercise.users.get(name) + if name is None: + abort(HTTPStatus.NOT_FOUND) diff --git a/flask_exercises/test_flask_excercises.py b/flask_exercises/test_flask_excercises.py index e06f3be..72a48be 100644 --- a/flask_exercises/test_flask_excercises.py +++ b/flask_exercises/test_flask_excercises.py @@ -3,7 +3,6 @@ from flask import Flask from flask.testing import FlaskClient -import pytest from .flask_excercises import FlaskExercise @@ -43,13 +42,11 @@ def delete_user(self, username: str) -> dict: assert response.status_code == HTTPStatus.NO_CONTENT return response.get_json() - @pytest.mark.skip def test_create(self) -> None: response = self.create_user({"name": "Heisenberg"}) assert response == {"data": "User Heisenberg is created!"} - @pytest.mark.skip def test_unprocessable_entity(self) -> None: response = self.flask_client.post( "/user", @@ -58,23 +55,20 @@ def test_unprocessable_entity(self) -> None: ) assert response.status_code == HTTPStatus.UNPROCESSABLE_ENTITY - assert response == {"errors": {"name": "This field is required"}} + assert response.get_json() == {"errors": {"name": "This field is required"}} - @pytest.mark.skip def test_get(self) -> None: self.create_user({"name": "Heisenberg"}) response = self.retrieve_user("Heisenberg") assert response == {"data": "My name is Heisenberg"} - @pytest.mark.skip def test_update(self) -> None: self.create_user({"name": "Heisenberg"}) response = self.update_user("Heisenberg", {"name": "Jesse"}) assert response == {"data": "My name is Jesse"} - @pytest.mark.skip def test_delete(self) -> None: self.create_user({"name": "Heisenberg"}) self.delete_user("Heisenberg") @@ -82,7 +76,6 @@ def test_delete(self) -> None: response = self.flask_client.get("/user/Heisenberg") assert response.status_code == HTTPStatus.NOT_FOUND - @pytest.mark.skip def test_not_found(self) -> None: response = self.flask_client.get("/404") assert response.status_code == HTTPStatus.NOT_FOUND