joseph

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