armor

Finished
1import json
2
13class RestAPI:
24 def __init__(self, database: dict | None = None):
3 pass
4
5 """
6 Initialize the REST API with an optional database.
7
8 Args:
9 database: A dictionary containing initial user data.
10 """
11 if database is None:
12 self.database = {'users': []}
13 else:
14 self.database = database
15
516 def get(self, url: str, payload: str | None = None) -> str:
6 pass
7
17 """
18 Handle GET requests to the API.
19
20 Args:
21 url: The endpoint URL.
22 payload: Optional JSON payload.
23
24 Returns:
25 A JSON string response.
26 """
27 if url == '/users':
28 if payload is None:
29 # Return all users sorted by name
30 users = sorted(self.database['users'], key=lambda x: x['name'])
31 return json.dumps({'users': users})
32 else:
33 # Return specific users
34 data = json.loads(payload)
35 user_names = data.get('users', [])
36
37 # Edge Case: Handle when users list is empty
38 if not user_names:
39 return json.dumps({'users': []})
40
41 # Filter users by name
42 result_users = [user for user in self.database['users'] if user['name'] in user_names]
43 # Sort by name
44 result_users.sort(key=lambda x: x['name'])
45 return json.dumps({'users': result_users})
46
47 # Edge Case: Handle unknown URLs
48 return json.dumps({'error': 'Not found'})
49
850 def post(self, url: str, payload: str | None = None) -> str:
9 pass
51 """
52 Handle POST requests to the API.
53
54 Args:
55 url: The endpoint URL.
56 payload: JSON payload.
57
58 Returns:
59 A JSON string response.
60 """
61 if payload is None:
62 # Edge Case: Handle missing payload
63 return json.dumps({'error': 'Payload required'})
64
65 data = json.loads(payload)
66
67 if url == '/add':
68 user_name = data.get('user')
69
70 # Edge Case: Handle missing user name
71 if not user_name:
72 return json.dumps({'error': 'User name required'})
73
74 # Edge Case: Handle duplicate user
75 for user in self.database['users']:
76 if user['name'] == user_name:
77 return json.dumps({'error': 'User already exists'})
78
79 # Create new user
80 new_user = {
81 'name': user_name,
82 'owes': {},
83 'owed_by': {},
84 'balance': 0.0
85 }
86 self.database['users'].append(new_user)
87 return json.dumps(new_user)
88
89 elif url == '/iou':
90 lender_name = data.get('lender')
91 borrower_name = data.get('borrower')
92 amount = data.get('amount')
93
94 # Edge Case: Handle missing fields
95 if not lender_name or not borrower_name or amount is None:
96 return json.dumps({'error': 'Lender, borrower, and amount are required'})
97
98 # Edge Case: Handle non-numeric amount
99 try:
100 amount = float(amount)
101 except (ValueError, TypeError):
102 return json.dumps({'error': 'Amount must be a number'})
103
104 # Edge Case: Handle negative amount
105 if amount < 0:
106 return json.dumps({'error': 'Amount must be positive'})
107
108 # Edge Case: Handle same lender and borrower
109 if lender_name == borrower_name:
110 return json.dumps({'error': 'Lender and borrower cannot be the same'})
111
112 # Find users
113 lender = None
114 borrower = None
115 for user in self.database['users']:
116 if user['name'] == lender_name:
117 lender = user
118 elif user['name'] == borrower_name:
119 borrower = user
120
121 # Edge Case: Handle unknown users
122 if lender is None or borrower is None:
123 return json.dumps({'error': 'Both lender and borrower must exist'})
124
125 # Update IOUs
126 # Update lender's owed_by
127 if borrower_name in lender['owed_by']:
128 lender['owed_by'][borrower_name] += amount
129 else:
130 lender['owed_by'][borrower_name] = amount
131
132 # Update borrower's owes
133 if lender_name in borrower['owes']:
134 borrower['owes'][lender_name] += amount
135 else:
136 borrower['owes'][lender_name] = amount
137
138 # Recalculate balances
139 lender_total_owed = sum(lender['owed_by'].values())
140 lender_total_owes = sum(lender['owes'].values())
141 lender['balance'] = lender_total_owed - lender_total_owes
142
143 borrower_total_owed = sum(borrower['owed_by'].values())
144 borrower_total_owes = sum(borrower['owes'].values())
145 borrower['balance'] = borrower_total_owed - borrower_total_owes
146
147 # Return updated users sorted by name
148 result_users = sorted([lender, borrower], key=lambda x: x['name'])
149 return json.dumps({'users': result_users})
150
151 # Edge Case: Handle unknown URLs
152 return json.dumps({'error': 'Not found'})
153
154 # Handled Edge Cases: Missing payload, missing user name, duplicate user, missing fields,
155 # non-numeric amount, negative amount, same lender and borrower, unknown users, unknown URLs
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.