Skip to content

Commit

Permalink
Feature: Ability to handle user information for resume (#24)
Browse files Browse the repository at this point in the history
* todo: user-info

* feature: utils function to validate user phone numbers

* feature: routes to handle user info + respective tests...

* chore: improve linter score, code improvements
  • Loading branch information
vantage-ola authored Oct 4, 2024
1 parent c8fa456 commit 5653cfa
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 2 deletions.
45 changes: 43 additions & 2 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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():
Expand Down
8 changes: 8 additions & 0 deletions models.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@

from dataclasses import dataclass

@dataclass
class User:
'''
User Class
'''
name: str
phone_number: str
email_address: str

@dataclass
class Experience:
Expand Down
39 changes: 39 additions & 0 deletions test_pytest.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
'''
Expand Down
9 changes: 9 additions & 0 deletions utils.py
Original file line number Diff line number Diff line change
@@ -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))

0 comments on commit 5653cfa

Please sign in to comment.