diff --git a/app.py b/app.py index 70efbd8..565b488 100644 --- a/app.py +++ b/app.py @@ -2,11 +2,16 @@ Flask Application ''' from flask import Flask, jsonify, request -from models import Experience, Education, Skill - +from models import Experience, Education, Skill, User +from utils import check_phone_number app = Flask(__name__) data = { + "user": [ + User("Jackie Stewart", + "+4478322678", + "jack@resume.com") + ], "experience": [ Experience("Software Developer", "A Cool Company", @@ -38,6 +43,42 @@ def hello_world(): ''' return jsonify({"message": "Hello, World!"}) +@app.route('/resume/user', methods=['GET', 'POST', 'PUT']) +def user(): + ''' + Handles User information + ''' + if request.method == 'GET': + return jsonify([user.__dict__ for user in data['user']]), 200 + # retrieve user's information. + body = request.get_json() + name = body['name'] + phone_number = body['phone_number'] + email = body['email_address'] + + # store the new user information. + if request.method == 'POST': + if not check_phone_number(phone_number): + return jsonify({"error": "Incorrect phone number !"}), 400 + + new_user = User(name, phone_number, email) + data['user'].append(new_user) + return jsonify(new_user.__dict__), 201 + + # edit the user information. + if request.method == 'PUT': + + for i, user in enumerate(data['user']): # find the user in the data. + if user.email_address == email: + if not check_phone_number(phone_number): + return jsonify({"error": "Incorrect phone number !"}), 400 + + data['user'][i] = User(name, phone_number, email) # update the user's info. + return jsonify(data['user'][i].__dict__), 200 + + return jsonify({"error": "User not found !"}), 404 + # add a default return statement for unsupported request methods + return jsonify({"error": "Unsupported request method !"}), 405 @app.route('/resume/experience', methods=['GET', 'POST']) def experience(): diff --git a/models.py b/models.py index b150e91..f96bd04 100644 --- a/models.py +++ b/models.py @@ -6,6 +6,14 @@ from dataclasses import dataclass +@dataclass +class User: + ''' + User Class + ''' + name: str + phone_number: str + email_address: str @dataclass class Experience: diff --git a/test_pytest.py b/test_pytest.py index c3d6f08..929569a 100644 --- a/test_pytest.py +++ b/test_pytest.py @@ -12,6 +12,45 @@ def test_client(): assert response.status_code == 200 assert response.json['message'] == "Hello, World!" +def test_user(): + ''' + Tests the /resume/user route. + ''' + # test GET request. + response = app.test_client().get('/resume/user') + assert response.status_code == 200 + assert isinstance(response.json, list) + + # test POST request with valid user information + response = app.test_client().post('/resume/user', json={ + 'name': 'John Doe', + 'phone_number': '+1234567890', + 'email_address': 'johndoe@example.com' + }) + assert response.status_code == 201 + assert response.json['name'] == 'John Doe' + assert response.json['phone_number'] == '+1234567890' + assert response.json['email_address'] == 'johndoe@example.com' + + # test PUT request with invalid email address + response = app.test_client().put('/resume/user', json={ + 'name': 'Ola Doe', + 'phone_number': '+0987654321', + 'email_address': 'invalid-email' + }) + assert response.status_code == 404 + assert response.json['error'] == 'User not found !' + + # test PUT request with valid email address + response = app.test_client().put('/resume/user', json={ + 'name': 'Ola Doe', + 'phone_number': '+0987654321', + 'email_address': 'johndoe@example.com' + }) + assert response.status_code == 200 + assert response.json['name'] == 'Ola Doe' + assert response.json['phone_number'] == '+0987654321' + assert response.json['email_address'] == 'johndoe@example.com' def test_experience(): ''' diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..52b6528 --- /dev/null +++ b/utils.py @@ -0,0 +1,9 @@ +""" Util functions for the Flask App.""" +import re + +def check_phone_number(phone_number): + """ Checks if the phone number is valid and follows + the international country code + """ + regex = re.compile(r'^\+\d{1,3}\d{1,14}$') + return bool(regex.match(phone_number)) \ No newline at end of file