xas

Finished
1class RestAPI:
2 def __init__(self, database: dict | None = None):
3 pass
4
5 def get(self, url: str, payload: str | None = None) -> str:
6 pass
1import json
2from typing import Dict, List, Optional, Any
73
8 def post(self, url: str, payload: str | None = None) -> str:
9 pass
4class RestAPI:
5 """
6 A RESTful API for tracking IOUs between users.
7
8 This class manages user data and IOU transactions in memory.
9 It supports creating users, creating IOUs, and retrieving user information.
10 """
11
12 def __init__(self, database: Optional[Dict[str, Any]] = None):
13 """
14 Initialize the RestAPI with an optional database.
15
16 Args:
17 database: Optional dictionary containing initial user data
18 """
19 if database is None:
20 self.database = {'users': []}
21 else:
22 self.database = database
23
24 def get(self, url: str, payload: Optional[str] = None) -> str:
25 """
26 Handle GET requests to the API.
27
28 Args:
29 url: The endpoint URL
30 payload: Optional JSON payload
31
32 Returns:
33 JSON string response
34 """
35 if url == '/users':
36 # Edge Case: Handle request with no payload (list all users)
37 if payload is None:
38 return json.dumps({
39 'users': sorted(self.database['users'], key=lambda x: x['name'])
40 })
41
42 # Edge Case: Handle request with payload (list specific users)
43 try:
44 data = json.loads(payload)
45 user_names = data.get('users', [])
46
47 # Filter users by the provided names
48 filtered_users = [user for user in self.database['users'] if user['name'] in user_names]
49
50 # Sort by name
51 filtered_users.sort(key=lambda x: x['name'])
52
53 return json.dumps({'users': filtered_users})
54 except json.JSONDecodeError:
55 # Edge Case: Handle invalid JSON payload
56 return json.dumps({'users': []})
57
58 # Edge Case: Handle unknown URL
59 return json.dumps({})
60
61 def post(self, url: str, payload: Optional[str] = None) -> str:
62 """
63 Handle POST requests to the API.
64
65 Args:
66 url: The endpoint URL
67 payload: Optional JSON payload
68
69 Returns:
70 JSON string response
71 """
72 if payload is None:
73 # Edge Case: Handle missing payload
74 return json.dumps({})
75
76 try:
77 data = json.loads(payload)
78 except json.JSONDecodeError:
79 # Edge Case: Handle invalid JSON payload
80 return json.dumps({})
81
82 if url == '/add':
83 # Edge Case: Handle missing user field
84 if 'user' not in data:
85 return json.dumps({})
86
87 user_name = data['user']
88
89 # Edge Case: Handle duplicate user creation
90 for user in self.database['users']:
91 if user['name'] == user_name:
92 return json.dumps({})
93
94 # Create new user
95 new_user = {
96 'name': user_name,
97 'owes': {},
98 'owed_by': {},
99 'balance': 0.0
100 }
101
102 self.database['users'].append(new_user)
103
104 # Sort users by name
105 self.database['users'].sort(key=lambda x: x['name'])
106
107 return json.dumps(new_user)
108
109 elif url == '/iou':
110 # Edge Case: Handle missing required fields
111 if 'lender' not in data or 'borrower' not in data or 'amount' not in data:
112 return json.dumps({})
113
114 lender_name = data['lender']
115 borrower_name = data['borrower']
116 amount = data['amount']
117
118 # Edge Case: Handle invalid amount type
119 if not isinstance(amount, (int, float)):
120 return json.dumps({})
121
122 # Edge Case: Handle negative amount
123 if amount < 0:
124 return json.dumps({})
125
126 # Edge Case: Handle same lender and borrower
127 if lender_name == borrower_name:
128 return json.dumps({})
129
130 # Find lender and borrower
131 lender = None
132 borrower = None
133
134 for user in self.database['users']:
135 if user['name'] == lender_name:
136 lender = user
137 elif user['name'] == borrower_name:
138 borrower = user
139
140 # Edge Case: Handle non-existent lender or borrower
141 if lender is None or borrower is None:
142 return json.dumps({})
143
144 # Update lender's owed_by
145 if borrower_name in lender['owed_by']:
146 lender['owed_by'][borrower_name] += amount
147 else:
148 lender['owed_by'][borrower_name] = amount
149
150 # Update borrower's owes
151 if lender_name in borrower['owes']:
152 borrower['owes'][lender_name] += amount
153 else:
154 borrower['owes'][lender_name] = amount
155
156 # Recalculate balances
157 lender_owes_total = sum(lender['owes'].values())
158 lender_owed_by_total = sum(lender['owed_by'].values())
159 lender['balance'] = lender_owed_by_total - lender_owes_total
160
161 borrower_owes_total = sum(borrower['owes'].values())
162 borrower_owed_by_total = sum(borrower['owed_by'].values())
163 borrower['balance'] = borrower_owed_by_total - borrower_owes_total
164
165 # Return updated users sorted by name
166 result_users = [lender, borrower]
167 result_users.sort(key=lambda x: x['name'])
168
169 return json.dumps({'users': result_users})
170
171 # Edge Case: Handle unknown URL
172 return json.dumps({})
173
174 # Handled Edge Cases: Missing payload, invalid JSON payload, unknown URL, missing user field,
175 # duplicate user creation, missing required fields, invalid amount type, negative amount,
176 # same lender and borrower, non-existent lender or borrower
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.