hope

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
8 # Convert list of user dicts to a more usable format
9 self.user_data = {}
10 for user in self.users:
11 self.user_data[user['name']] = {
12 'owes': user.get('owes', {}),
13 'owed_by': user.get('owed_by', {}),
14 'balance': user.get('balance', 0.0)
15 }
16
517 def get(self, url: str, payload: str | None = None) -> str:
6 pass
7
18 # Edge Case: Handle invalid URL
19 if url != '/users':
20 return json.dumps({"error": "Invalid URL"})
21
22 # Edge Case: Handle invalid payload format
23 if payload is not None:
24 try:
25 payload_data = json.loads(payload)
26 except json.JSONDecodeError:
27 return json.dumps({"error": "Invalid payload format"})
28 else:
29 payload_data = None
30
31 # If no payload, return all users
32 if payload_data is None:
33 result_users = []
34 for name in sorted(self.user_data.keys()):
35 user_info = self.user_data[name]
36 balance = sum(user_info['owed_by'].values()) - sum(user_info['owes'].values())
37 result_users.append({
38 'name': name,
39 'owes': user_info['owes'],
40 'owed_by': user_info['owed_by'],
41 'balance': round(balance, 2)
42 })
43 return json.dumps({'users': result_users})
44
45 # If payload with specific users
46 # Edge Case: Handle missing 'users' key in payload
47 if 'users' not in payload_data:
48 return json.dumps({"error": "Missing users key in payload"})
49
50 requested_users = payload_data['users']
51 result_users = []
52
53 # Edge Case: Handle non-existent users in request
54 for name in sorted(requested_users):
55 if name in self.user_data:
56 user_info = self.user_data[name]
57 balance = sum(user_info['owed_by'].values()) - sum(user_info['owes'].values())
58 result_users.append({
59 'name': name,
60 'owes': user_info['owes'],
61 'owed_by': user_info['owed_by'],
62 'balance': round(balance, 2)
63 })
64
65 return json.dumps({'users': result_users})
66 # Handled Edge Cases: Invalid URL, invalid payload format, missing 'users' key in payload, non-existent users in request
67
868 def post(self, url: str, payload: str | None = None) -> str:
9 pass
69 # Edge Case: Handle invalid URL
70 if url not in ['/add', '/iou']:
71 return json.dumps({"error": "Invalid URL"})
72
73 # Edge Case: Handle missing payload
74 if payload is None:
75 return json.dumps({"error": "Missing payload"})
76
77 # Edge Case: Handle invalid payload format
78 try:
79 payload_data = json.loads(payload)
80 except json.JSONDecodeError:
81 return json.dumps({"error": "Invalid payload format"})
82
83 if url == '/add':
84 # Edge Case: Handle missing 'user' key in payload
85 if 'user' not in payload_data:
86 return json.dumps({"error": "Missing user key in payload"})
87
88 user_name = payload_data['user']
89
90 # Edge Case: Handle duplicate user creation
91 if user_name in self.user_data:
92 return json.dumps({"error": "User already exists"})
93
94 # Create new user
95 self.user_data[user_name] = {
96 'owes': {},
97 'owed_by': {},
98 'balance': 0.0
99 }
100
101 new_user = {
102 'name': user_name,
103 'owes': {},
104 'owed_by': {},
105 'balance': 0.0
106 }
107
108 return json.dumps(new_user)
109 # Handled Edge Cases: Invalid URL, missing payload, invalid payload format, missing 'user' key in payload, duplicate user creation
110
111 elif url == '/iou':
112 # Edge Case: Handle missing required keys in payload
113 required_keys = ['lender', 'borrower', 'amount']
114 for key in required_keys:
115 if key not in payload_data:
116 return json.dumps({"error": f"Missing {key} key in payload"})
117
118 lender = payload_data['lender']
119 borrower = payload_data['borrower']
120 amount = payload_data['amount']
121
122 # Edge Case: Handle non-numeric amount
123 if not isinstance(amount, (int, float)):
124 return json.dumps({"error": "Amount must be a number"})
125
126 # Edge Case: Handle negative amount
127 if amount < 0:
128 return json.dumps({"error": "Amount cannot be negative"})
129
130 # Edge Case: Handle same lender and borrower
131 if lender == borrower:
132 return json.dumps({"error": "Lender and borrower cannot be the same"})
133
134 # Edge Case: Handle non-existent lender or borrower
135 if lender not in self.user_data:
136 return json.dumps({"error": "Lender does not exist"})
137 if borrower not in self.user_data:
138 return json.dumps({"error": "Borrower does not exist"})
139
140 # Update IOU information
141 # Handle lender side
142 if borrower in self.user_data[lender]['owes']:
143 # Lender owes borrower money, so this IOU reduces that debt
144 self.user_data[lender]['owes'][borrower] -= amount
145 if self.user_data[lender]['owes'][borrower] <= 0:
146 # Debt is fully paid or overpaid
147 remaining_amount = -self.user_data[lender]['owes'][borrower]
148 del self.user_data[lender]['owes'][borrower]
149 if remaining_amount > 0:
150 # Lender is now owed money
151 self.user_data[lender]['owed_by'][borrower] = remaining_amount
152 else:
153 # Lender doesn't owe borrower, so borrower owes lender
154 if borrower in self.user_data[lender]['owed_by']:
155 self.user_data[lender]['owed_by'][borrower] += amount
156 else:
157 self.user_data[lender]['owed_by'][borrower] = amount
158
159 # Handle borrower side
160 if lender in self.user_data[borrower]['owed_by']:
161 # Borrower is owed money by lender, so this IOU reduces that
162 self.user_data[borrower]['owed_by'][lender] -= amount
163 if self.user_data[borrower]['owed_by'][lender] <= 0:
164 # Credit is fully used or overused
165 remaining_amount = -self.user_data[borrower]['owed_by'][lender]
166 del self.user_data[borrower]['owed_by'][lender]
167 if remaining_amount > 0:
168 # Borrower now owes money
169 self.user_data[borrower]['owes'][lender] = remaining_amount
170 else:
171 # Borrower is not owed money by lender, so borrower owes lender
172 if lender in self.user_data[borrower]['owes']:
173 self.user_data[borrower]['owes'][lender] += amount
174 else:
175 self.user_data[borrower]['owes'][lender] = amount
176
177 # Prepare response with updated user information
178 updated_users = []
179 for name in sorted([lender, borrower]):
180 user_info = self.user_data[name]
181 balance = sum(user_info['owed_by'].values()) - sum(user_info['owes'].values())
182 updated_users.append({
183 'name': name,
184 'owes': user_info['owes'],
185 'owed_by': user_info['owed_by'],
186 'balance': round(balance, 2)
187 })
188
189 return json.dumps({'users': updated_users})
190 # Handled Edge Cases: Invalid URL, missing payload, invalid payload format, missing required keys in payload, non-numeric amount, negative amount, same lender and borrower, non-existent lender or borrower
191 # Handled Edge Cases: Invalid URL, missing payload, invalid payload format, missing required keys in payload, non-numeric amount, negative amount, same lender and borrower, non-existent lender or borrower, missing 'user' key in payload, duplicate user creation, missing 'users' key in payload, non-existent users in request
Test NameStatus
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_lender_owes_borrower
Pass
test_lender_owes_borrower_less_than_new_loan
Pass
test_lender_owes_borrower_same_as_new_loan
Pass
test_no_users
Pass

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