Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 38 additions & 25 deletions flask_exercises/flask_excercises.py
Original file line number Diff line number Diff line change
@@ -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/<name> - чтение пользователя
В ответе должен вернуться JSON {"data": "My name is <name>"}. Статус 200

PATCH /user/<name> - обновление пользователя
В теле запроса приходит JSON в формате {"name": <new_name>}.
В ответе должен вернуться JSON {"data": "My name is <new_name>"}. Статус 200

DELETE /user/<name> - удаление пользователя
В ответ должен вернуться статус 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/<string:name>")
def show_user(name: str) -> dict:
FlaskExercise.abort_if_user_not_found(name)
return {"data": f"My name is {name}"}

@app.patch("/user/<string:name>")
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/<string:name>")
def delete_user(name: str) -> tuple:
FlaskExercise.abort_if_user_not_found(name)
FlaskExercise.users.pop(name)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pop() выполняет две операции - del и возврат удаленного. Здесь нужна только первая

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

replaced pop with del

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)
9 changes: 1 addition & 8 deletions flask_exercises/test_flask_excercises.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

from flask import Flask
from flask.testing import FlaskClient
import pytest

from .flask_excercises import FlaskExercise

Expand Down Expand Up @@ -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",
Expand All @@ -58,31 +55,27 @@ 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")

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