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 empty payload
17 if payload is None:
18 return json.dumps({"users": sorted(self.database["users"], key=lambda x: x["name"])})
19
20 # Edge Case: Handle invalid JSON payload
21 try:
22 data = json.loads(payload)
23 except json.JSONDecodeError:
24 return json.dumps({"error": "Invalid JSON payload"})
25
26 # Edge Case: Handle missing 'users' key in payload
27 if "users" not in data:
28 return json.dumps({"error": "Missing 'users' key in payload"})
29
30 # Edge Case: Handle non-list 'users' value
31 if not isinstance(data["users"], list):
32 return json.dumps({"error": "'users' must be a list"})
33
34 # Filter users based on the requested names
35 requested_names = data["users"]
36 filtered_users = [user for user in self.database["users"] if user["name"] in requested_names]
37
38 # Edge Case: Handle non-existent users (they are simply not included in the response)
39 return json.dumps({"users": sorted(filtered_users, key=lambda x: x["name"])})
40
841 def post(self, url: str, payload: str | None = None) -> str:
9 pass
42 # Edge Case: Handle invalid URL
43 if url not in ["/add", "/iou"]:
44 return json.dumps({"error": "Invalid URL"})
45
46 # Edge Case: Handle empty payload
47 if payload is None:
48 return json.dumps({"error": "Payload required"})
49
50 # Edge Case: Handle invalid JSON payload
51 try:
52 data = json.loads(payload)
53 except json.JSONDecodeError:
54 return json.dumps({"error": "Invalid JSON payload"})
55
56 if url == "/add":
57 # Edge Case: Handle missing 'user' key
58 if "user" not in data:
59 return json.dumps({"error": "Missing 'user' key"})
60
61 # Edge Case: Handle non-string user name
62 if not isinstance(data["user"], str):
63 return json.dumps({"error": "User name must be a string"})
64
65 # Edge Case: Handle duplicate user
66 for user in self.database["users"]:
67 if user["name"] == data["user"]:
68 return json.dumps({"error": "User already exists"})
69
70 # Create new user
71 new_user = {
72 "name": data["user"],
73 "owes": {},
74 "owed_by": {},
75 "balance": 0.0
76 }
77 self.database["users"].append(new_user)
78 return json.dumps(new_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 data:
85 return json.dumps({"error": f"Missing '{key}' key"})
86
87 # Edge Case: Handle non-string lender/borrower
88 if not isinstance(data["lender"], str) or not isinstance(data["borrower"], str):
89 return json.dumps({"error": "Lender and borrower must be strings"})
90
91 # Edge Case: Handle non-numeric amount
92 if not isinstance(data["amount"], (int, float)):
93 return json.dumps({"error": "Amount must be a number"})
94
95 # Edge Case: Handle negative amount
96 if data["amount"] < 0:
97 return json.dumps({"error": "Amount must be positive"})
98
99 # Edge Case: Handle lender equals borrower
100 if data["lender"] == data["borrower"]:
101 return json.dumps({"error": "Lender and borrower cannot be the same"})
102
103 # Find lender and borrower
104 lender = None
105 borrower = None
106 for user in self.database["users"]:
107 if user["name"] == data["lender"]:
108 lender = user
109 elif user["name"] == data["borrower"]:
110 borrower = user
111
112 # Edge Case: Handle non-existent lender or borrower
113 if lender is None or borrower is None:
114 return json.dumps({"error": "Lender or borrower does not exist"})
115
116 # Update owes and owed_by relationships
117 # Update lender's owed_by
118 if data["borrower"] in lender["owed_by"]:
119 lender["owed_by"][data["borrower"]] += data["amount"]
120 else:
121 lender["owed_by"][data["borrower"]] = data["amount"]
122
123 # Update borrower's owes
124 if data["lender"] in borrower["owes"]:
125 borrower["owes"][data["lender"]] += data["amount"]
126 else:
127 borrower["owes"][data["lender"]] = data["amount"]
128
129 # Update balances
130 lender["balance"] += data["amount"]
131 borrower["balance"] -= data["amount"]
132
133 # Return updated users
134 updated_users = [lender, borrower]
135 return json.dumps({"users": sorted(updated_users, key=lambda x: x["name"])})
136
137 # Handled Edge Cases: None database, invalid URL, empty payload, invalid JSON, missing keys, non-list values, non-existent users, duplicate user, non-string names, negative amounts, lender equals borrower, non-numeric amounts
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.