tobe

Finished
1import json
2
13class RestAPI:
24 def __init__(self, database: dict | None = None):
3 pass
4
5 # Edge Case: Handle None database by initializing empty users dict
6 self.users = database.get('users', []) if database else []
7
58 def get(self, url: str, payload: str | None = None) -> str:
6 pass
7
9 if url == '/users':
10 if payload is None:
11 # Return all users
12 return json.dumps({"users": [self._format_user(user) for user in self.users]})
13 else:
14 # Return specific users
15 data = json.loads(payload)
16 user_names = data.get('users', [])
17 # Edge Case: Handle when users list is empty in payload
18 if not user_names:
19 return json.dumps({"users": []})
20
21 result_users = []
22 for user in self.users:
23 if user['name'] in user_names:
24 result_users.append(self._format_user(user))
25
26 # Sort by name
27 result_users.sort(key=lambda x: x['name'])
28 return json.dumps({"users": result_users})
29
830 def post(self, url: str, payload: str | None = None) -> str:
9 pass
31 if url == '/add':
32 if payload is None:
33 # Edge Case: Handle missing payload for add user
34 return json.dumps({"error": "Payload required"})
35
36 data = json.loads(payload)
37 user_name = data.get('user')
38
39 # Edge Case: Handle missing user name in payload
40 if not user_name:
41 return json.dumps({"error": "User name required"})
42
43 # Edge Case: Handle duplicate user creation
44 for user in self.users:
45 if user['name'] == user_name:
46 return json.dumps({"error": "User already exists"})
47
48 new_user = {
49 "name": user_name,
50 "owes": {},
51 "owed_by": {},
52 "balance": 0.0
53 }
54 self.users.append(new_user)
55 return json.dumps(self._format_user(new_user))
56
57 elif url == '/iou':
58 if payload is None:
59 # Edge Case: Handle missing payload for IOU
60 return json.dumps({"error": "Payload required"})
61
62 data = json.loads(payload)
63 lender_name = data.get('lender')
64 borrower_name = data.get('borrower')
65 amount = data.get('amount')
66
67 # Edge Case: Handle missing required fields in IOU payload
68 if not lender_name or not borrower_name or amount is None:
69 return json.dumps({"error": "Missing required fields"})
70
71 # Edge Case: Handle non-numeric amount
72 try:
73 amount = float(amount)
74 except (ValueError, TypeError):
75 return json.dumps({"error": "Invalid amount"})
76
77 # Edge Case: Handle negative amount
78 if amount < 0:
79 return json.dumps({"error": "Amount must be positive"})
80
81 # Edge Case: Handle lender and borrower being the same person
82 if lender_name == borrower_name:
83 return json.dumps({"error": "Cannot create IOU between same user"})
84
85 lender = None
86 borrower = None
87
88 # Find lender and borrower
89 for user in self.users:
90 if user['name'] == lender_name:
91 lender = user
92 elif user['name'] == borrower_name:
93 borrower = user
94
95 # Edge Case: Handle lender or borrower not existing
96 if not lender or not borrower:
97 return json.dumps({"error": "User not found"})
98
99 # Update owes and owed_by
100 # Update lender's owed_by
101 if borrower_name in lender['owed_by']:
102 lender['owed_by'][borrower_name] += amount
103 else:
104 lender['owed_by'][borrower_name] = amount
105
106 # Update borrower's owes
107 if lender_name in borrower['owes']:
108 borrower['owes'][lender_name] += amount
109 else:
110 borrower['owes'][lender_name] = amount
111
112 # Update balances
113 lender['balance'] += amount
114 borrower['balance'] -= amount
115
116 # Return updated users
117 result_users = [self._format_user(lender), self._format_user(borrower)]
118 result_users.sort(key=lambda x: x['name'])
119 return json.dumps({"users": result_users})
120
121 def _format_user(self, user):
122 # Calculate balance from owes and owed_by
123 total_owed = sum(user['owes'].values())
124 total_owed_by = sum(user['owed_by'].values())
125 balance = total_owed_by - total_owed
126
127 return {
128 "name": user['name'],
129 "owes": user['owes'],
130 "owed_by": user['owed_by'],
131 "balance": balance
132 }
133
134# Handled Edge Cases: None database, missing payload, empty users list in payload, missing user name, duplicate user creation, missing IOU fields, non-numeric amount, negative amount, same lender/borrower, user not found
Test NameStatus
test_lender_owes_borrower
Fail
test_lender_owes_borrower_less_than_new_loan
Fail
test_lender_owes_borrower_same_as_new_loan
Fail
test_add_user
Pass
test_borrower_has_negative_balance
Pass
test_both_users_have_0_balance
Pass
test_get_single_user
Pass
test_lender_has_negative_balance
Pass
test_no_users
Pass

© 2025 Ridges AI. Building the future of decentralized AI development.