diff --git a/app.py b/app.py index 314e633..d195c43 100644 --- a/app.py +++ b/app.py @@ -2,6 +2,10 @@ from flask import Flask, jsonify, request, Response import mockdb.mockdb_interface as db +from mockdb.dummy_data import initial_db_state + +db_state = initial_db_state + app = Flask(__name__) @@ -10,7 +14,7 @@ def create_response( data: dict = None, status: int = 200, message: str = "" ) -> Tuple[Response, int]: """Wraps response in a consistent format throughout the API. - + Format inspired by https://medium.com/@shazow/how-i-design-json-api-responses-71900f00f2db Modifications included: - make success a boolean since there's only 2 values @@ -52,8 +56,69 @@ def mirror(name): return create_response(data) -# TODO: Implement the rest of the API here! +@app.get("/users") +def getAllUsers(): + team = request.args.get("team") + if team: + return create_response( + {"users": list(filter(lambda x: x["team"] == team, db.get("users")))} + ) + return create_response({"users": db.get("users")}) + + +@app.get("/users/") +def getUserById(id): + data = {"user": db.getById("users", id)} + if data["user"]: + return create_response(data) + return create_response(None, 404, "id:{id} is not exist".format(id=id)) + +@app.post("/users") +def addUser(): + data = request.get_json() + state = list(filter(lambda x: x not in data, ["name", "team", "age"])) + if not bool(state): + state = list( + filter( + lambda x: x in ["name", "team", "age"] and bool(data[x]) == False, data + ) + ) + if not bool(state): + req = {"newUser": db.create("users", request.get_json())} + db.updateUsersData() + return create_response(req, 201) + return create_response( + None, + 422, + "Name, age and team must be entered and the following data was not entered:{state}".format( + state=state + ), + ) + + +@app.put("/users/") +def updateUser(id): + data = request.get_json() + req = {"user": db.updateById("users", id, data)} + if req["user"]: + db.updateUsersData() + return create_response(req) + return create_response(None, 404, "id:{id} is not exist".format(id=id)) + + +@app.delete("/users/") +def deleteUser(id): + if db.getById("users", id): + data = {"users": db.deleteById("users", id)} + db.updateUsersData() + return create_response( + None, 200, "The user with id:{id} was deleted".format(id=id) + ) + return create_response(None, 404, "id:{id} is not exist".format(id=id)) + + +# TODO: Implement the rest of the API here! """ ~~~~~~~~~~~~ END API ~~~~~~~~~~~~ """ diff --git a/conftest.py b/conftest.py index e919768..a38efe0 100644 --- a/conftest.py +++ b/conftest.py @@ -1,7 +1,7 @@ import pytest -@pytest.fixture("session") +@pytest.fixture def client(): from app import app diff --git a/mockdb/dummy_data.py b/mockdb/dummy_data.py index 642261c..de6dc4d 100644 --- a/mockdb/dummy_data.py +++ b/mockdb/dummy_data.py @@ -1,8 +1 @@ -initial_db_state = { - "users": [ - {"id": 1, "name": "Aria", "age": 19, "team": "LWB"}, - {"id": 2, "name": "Tim", "age": 20, "team": "LWB"}, - {"id": 3, "name": "Varun", "age": 23, "team": "NNB"}, - {"id": 4, "name": "Alex", "age": 24, "team": "C2TC"}, - ] -} +initial_db_state={'users': [{'id': 1, 'name': 'Aria', 'age': 30, 'team': 'LWB'}, {'id': 2, 'name': 'Tim', 'age': 20, 'team': 'LWB'}, {'id': 3, 'name': 'Varun', 'age': 23, 'team': 'NNB'}, {'age': 20, 'name': 'Aria', 'team': 'LWB', 'id': 5}, {'age': 30, 'name': 'Aria', 'team': 'LWB', 'id': 6}, {'age': 19, 'name': 'Aria', 'team': 'LWB', 'id': 7}]} \ No newline at end of file diff --git a/mockdb/mockdb_interface.py b/mockdb/mockdb_interface.py index e059be8..62d13e9 100644 --- a/mockdb/mockdb_interface.py +++ b/mockdb/mockdb_interface.py @@ -32,3 +32,8 @@ def updateById(type, id, update_values): def deleteById(type, id): db_state[type] = [i for i in get(type) if i["id"] != id] + + +def updateUsersData(): + with open("./mockdb/dummy_data.py", "w") as file: + file.write("initial_db_state=" + str(db_state)) diff --git a/test_app.py b/test_app.py index 586aba5..7a98382 100644 --- a/test_app.py +++ b/test_app.py @@ -1,7 +1,9 @@ - # pytest automatically injects fixtures # that are defined in conftest.py # in this case, client is injected +from flask import json + + def test_index(client): res = client.get("/") assert res.status_code == 200 @@ -17,25 +19,90 @@ def test_mirror(client): def test_get_users(client): res = client.get("/users") assert res.status_code == 200 - res_users = res.json["result"]["users"] - assert len(res_users) == 4 assert res_users[0]["name"] == "Aria" def tests_get_users_with_team(client): res = client.get("/users?team=LWB") assert res.status_code == 200 - res_users = res.json["result"]["users"] - assert len(res_users) == 2 assert res_users[1]["name"] == "Tim" def test_get_user_id(client): res = client.get("/users/1") assert res.status_code == 200 - res_user = res.json["result"]["user"] assert res_user["name"] == "Aria" assert res_user["age"] == 19 + + +def test_get_user_id_not_exist(client): + res = client.get("/users/6") + assert res.status_code == 404 + assert res.json["result"] == None + assert res.json["message"] == "id:6 is not exist" + assert res.json["success"] == False + + +def test_add_user(client): + res = client.post( + "/users", + headers={"Content-Type": "application/json"}, + data=json.dumps({"age": 20, "name": "Aria", "team": "LWB"}), + ) + assert res.status_code == 201 + res_user = res.json["result"]["newUser"] + assert res_user["name"] == "Aria" + assert res_user["age"] == 20 + + +def test_add_user_Missing_or_incorrect_data(client): + res = client.post( + "/users", + headers={"Content-Type": "application/json"}, + data=json.dumps({"name": "Aria", "team": "LWB"}), + ) + assert res.status_code == 422 + assert res.json["result"] == None + assert bool(res.json["message"]) + + +def test_update_user_id(client): + res = client.put( + "users/1", + headers={"Content-Type": "application/json"}, + data=json.dumps({"age": 30}), + ) + assert res.status_code == 200 + res_user = res.json["result"]["user"] + assert res_user["age"] == 30 + assert res_user["name"] == "Aria" + + +def test_update_user_id_not_exist(client): + res = client.put( + "/users/6", + headers={"Content-Type": "application/json"}, + data=json.dumps({"age": 30}), + ) + assert res.status_code == 404 + assert res.json["result"] == None + assert res.json["message"] == "id:6 is not exist" + assert res.json["success"] == False + + +def test_delete_user_id(client): + res = client.delete("/users/4") + assert res.status_code == 200 + assert res.json["success"] == True + assert res.json["message"] == "The user with id:4 was deleted" + + +def test_delete_user_id_not_exist(client): + res = client.delete("/users/10") + assert res.status_code == 404 + assert res.json["result"] == None + assert res.json["message"] == "id:10 is not exist" + assert res.json["success"] == False