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 structure
6 if database is None:
7 self.database = {"users": []}
8 else:
9 self.database = database
10
511 def get(self, url: str, payload: str | None = None) -> str:
6 pass
7
12 # Edge Case: Handle invalid URL
13 if url != "/users":
14 return json.dumps({"error": "Invalid URL"})
15
16 # Edge Case: Handle invalid payload format
17 if payload is not None:
18 try:
19 payload_data = json.loads(payload)
20 except json.JSONDecodeError:
21 return json.dumps({"error": "Invalid payload format"})
22
23 # Edge Case: Handle missing 'users' key in payload
24 if "users" not in payload_data:
25 return json.dumps({"error": "Missing 'users' key in payload"})
26
27 # Edge Case: Handle non-list 'users' value
28 if not isinstance(payload_data["users"], list):
29 return json.dumps({"error": "'users' must be a list"})
30
31 # Edge Case: Filter users based on payload
32 requested_users = payload_data["users"]
33 users = [user for user in self.database["users"] if user["name"] in requested_users]
34 else:
35 # Edge Case: Return all users when no payload
36 users = self.database["users"]
37
38 # Sort users by name
39 users.sort(key=lambda x: x["name"])
40 return json.dumps({"users": users})
41
842 def post(self, url: str, payload: str | None = None) -> str:
9 pass
43 # Edge Case: Handle invalid URL
44 if url not in ["/add", "/iou"]:
45 return json.dumps({"error": "Invalid URL"})
46
47 # Edge Case: Handle missing payload
48 if payload is None:
49 return json.dumps({"error": "Missing payload"})
50
51 # Edge Case: Handle invalid payload format
52 try:
53 payload_data = json.loads(payload)
54 except json.JSONDecodeError:
55 return json.dumps({"error": "Invalid payload format"})
56
57 if url == "/add":
58 # Edge Case: Handle missing 'user' key
59 if "user" not in payload_data:
60 return json.dumps({"error": "Missing 'user' key"})
61
62 # Edge Case: Handle non-string user name
63 if not isinstance(payload_data["user"], str):
64 return json.dumps({"error": "User name must be a string"})
65
66 # Edge Case: Handle duplicate user
67 for user in self.database["users"]:
68 if user["name"] == payload_data["user"]:
69 return json.dumps({"error": "User already exists"})
70
71 # Create new user
72 new_user = {
73 "name": payload_data["user"],
74 "owes": {},
75 "owed_by": {},
76 "balance": 0.0
77 }
78 self.database["users"].append(new_user)
79 return json.dumps(new_user)
80
81 elif url == "/iou":
82 # Edge Case: Handle missing required keys
83 required_keys = ["lender", "borrower", "amount"]
84 for key in required_keys:
85 if key not in payload_data:
86 return json.dumps({"error": f"Missing '{key}' key"})
87
88 # Edge Case: Handle non-string lender/borrower
89 if not isinstance(payload_data["lender"], str) or not isinstance(payload_data["borrower"], str):
90 return json.dumps({"error": "Lender and borrower must be strings"})
91
92 # Edge Case: Handle non-numeric amount
93 if not isinstance(payload_data["amount"], (int, float)):
94 return json.dumps({"error": "Amount must be a number"})
95
96 # Edge Case: Handle negative amount
97 if payload_data["amount"] < 0:
98 return json.dumps({"error": "Amount must be positive"})
99
100 # Edge Case: Handle lender equals borrower
101 if payload_data["lender"] == payload_data["borrower"]:
102 return json.dumps({"error": "Lender and borrower cannot be the same"})
103
104 # Find lender and borrower
105 lender = None
106 borrower = None
107 for user in self.database["users"]:
108 if user["name"] == payload_data["lender"]:
109 lender = user
110 elif user["name"] == payload_data["borrower"]:
111 borrower = user
112
113 # Edge Case: Handle lender not found
114 if lender is None:
115 return json.dumps({"error": "Lender not found"})
116
117 # Edge Case: Handle borrower not found
118 if borrower is None:
119 return json.dumps({"error": "Borrower not found"})
120
121 # Update IOUs
122 # Update lender's owed_by
123 if payload_data["borrower"] in lender["owed_by"]:
124 lender["owed_by"][payload_data["borrower"]] += payload_data["amount"]
125 else:
126 lender["owed_by"][payload_data["borrower"]] = payload_data["amount"]
127
128 # Update borrower's owes
129 if payload_data["lender"] in borrower["owes"]:
130 borrower["owes"][payload_data["lender"]] += payload_data["amount"]
131 else:
132 borrower["owes"][payload_data["lender"]] = payload_data["amount"]
133
134 # Update balances
135 lender["balance"] += payload_data["amount"]
136 borrower["balance"] -= payload_data["amount"]
137
138 # Return updated users
139 updated_users = [lender, borrower]
140 updated_users.sort(key=lambda x: x["name"])
141 return json.dumps({"users": updated_users})
142
143 # Handled Edge Cases: None database, invalid URL, invalid payload format, missing 'users' key, non-list 'users' value, missing payload, missing 'user' key, non-string user name, duplicate user, missing required keys, non-string lender/borrower, non-numeric amount, negative amount, lender equals borrower, lender not found, borrower 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.