Skip to content

Commit 9d78605

Browse files
Add PUT update for experience by index (fix #8)
1 parent da93a74 commit 9d78605

2 files changed

Lines changed: 86 additions & 15 deletions

File tree

app.py

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,15 @@ def hello_world():
4848
return jsonify({"message": "Hello, World!"})
4949

5050

51-
@app.route('/resume/experience', methods=['GET', 'POST', 'DELETE'])
51+
@app.route('/resume/experience', methods=['GET', 'POST', 'PUT', 'DELETE'])
5252
def experience():
5353
'''
5454
Handle experience requests
5555
'''
56+
response = {}
57+
status = 200
5658
if request.method == 'GET':
57-
experience_list = [
59+
response = [
5860
{
5961
"title": exp.title,
6062
"company": exp.company,
@@ -65,9 +67,7 @@ def experience():
6567
}
6668
for exp in data['experience']
6769
]
68-
return jsonify(experience_list)
69-
70-
if request.method == 'POST':
70+
elif request.method == 'POST':
7171
new_experience = Experience(
7272
title=request.json['title'],
7373
company=request.json['company'],
@@ -77,12 +77,41 @@ def experience():
7777
logo=request.json['logo']
7878
)
7979
data['experience'].append(new_experience)
80-
index = len(data['experience']) - 1
81-
return jsonify({"id": index})
82-
83-
if request.method == 'DELETE':
84-
return _delete_experience(request.get_json())
85-
return jsonify({})
80+
response = {"id": len(data['experience']) - 1}
81+
elif request.method == 'PUT':
82+
body = request.get_json()
83+
if not body or 'id' not in body:
84+
response = {"error": "ID is required for update"}
85+
status = 400
86+
else:
87+
try:
88+
item_id = int(body['id'])
89+
except (ValueError, TypeError):
90+
response = {"error": "ID must be an integer"}
91+
status = 400
92+
else:
93+
if item_id < 0 or item_id >= len(data['experience']):
94+
response = {"error": "ID is out of range"}
95+
status = 400
96+
else:
97+
try:
98+
updated_experience = Experience(
99+
title=body['title'],
100+
company=body['company'],
101+
start_date=body['start_date'],
102+
end_date=body['end_date'],
103+
description=body['description'],
104+
logo=body['logo']
105+
)
106+
except KeyError as exc:
107+
response = {"error": f"Missing field: {exc}"}
108+
status = 400
109+
else:
110+
data['experience'][item_id] = updated_experience
111+
response = {"id": item_id}
112+
elif request.method == 'DELETE':
113+
response, status = _delete_experience(request.get_json())
114+
return jsonify(response), status
86115

87116

88117
@app.route('/resume/experience/<int:index>', methods=['GET'])
@@ -161,15 +190,15 @@ def skill(): # pylint: disable=too-many-return-statements
161190

162191
def _delete_experience(body):
163192
if not body or 'id' not in body:
164-
return jsonify({"error": "ID is required for deletion"}), 400
193+
return {"error": "ID is required for deletion"}, 400
165194
try:
166195
item_id = int(body['id'])
167196
except (ValueError, TypeError):
168-
return jsonify({"error": "ID must be an integer"}), 400
197+
return {"error": "ID must be an integer"}, 400
169198
if item_id < 0 or item_id >= len(data["experience"]):
170-
return jsonify({"error": "ID is out of range"}), 400
199+
return {"error": "ID is out of range"}, 400
171200
data["experience"].pop(item_id)
172-
return jsonify({"deleted": item_id}), 200
201+
return {"deleted": item_id}, 200
173202

174203
def _delete_skill(body):
175204
if not body or 'id' not in body:

test_pytest.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,3 +245,45 @@ def test_spellcheck_endpoint():
245245
item["before"] == "Teh dog" and item["after"] == "The dog"
246246
for item in response.json
247247
)
248+
def test_update_experience():
249+
'''
250+
Update an experience by index using PUT
251+
'''
252+
client = app.test_client()
253+
254+
new_experience = {
255+
"title": "Original Title",
256+
"company": "Original Company",
257+
"start_date": "October 2022",
258+
"end_date": "Present",
259+
"description": "Original description",
260+
"logo": "example-logo.png"
261+
}
262+
263+
post_response = client.post('/resume/experience', json=new_experience)
264+
assert post_response.status_code == 200
265+
item_id = post_response.json['id']
266+
267+
updated_experience = {
268+
"id": item_id,
269+
"title": "Updated Title",
270+
"company": "Updated Company",
271+
"start_date": "October 2022",
272+
"end_date": "Present",
273+
"description": "Updated description",
274+
"logo": "example-logo.png"
275+
}
276+
277+
put_response = client.put('/resume/experience', json=updated_experience)
278+
assert put_response.status_code == 200
279+
assert put_response.json["id"] == item_id
280+
281+
get_response = client.get('/resume/experience')
282+
assert get_response.json[item_id] == {
283+
"title": "Updated Title",
284+
"company": "Updated Company",
285+
"start_date": "October 2022",
286+
"end_date": "Present",
287+
"description": "Updated description",
288+
"logo": "example-logo.png"
289+
}

0 commit comments

Comments
 (0)