impossible

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 if url == "/users":
13 # Edge Case: Handle GET /users with no payload - return all users
14 if payload is None:
15 return json.dumps({"users": sorted(self.database["users"], key=lambda x: x["name"])})
16 else:
17 # Edge Case: Handle GET /users with payload - return specified users
18 data = json.loads(payload)
19 user_names = data.get("users", [])
20 result_users = [user for user in self.database["users"] if user["name"] in user_names]
21 result_users.sort(key=lambda x: x["name"])
22 return json.dumps({"users": result_users})
23 # Edge Case: Handle unknown URL
24 return json.dumps({"error": "Not found"})
25
826 def post(self, url: str, payload: str | None = None) -> str:
9 pass
27 if payload is None:
28 # Edge Case: Handle POST with no payload
29 return json.dumps({"error": "Payload required"})
30
31 data = json.loads(payload)
32
33 if url == "/add":
34 user_name = data.get("user")
35 # Edge Case: Handle missing user name in /add
36 if user_name is None:
37 return json.dumps({"error": "User name required"})
38
39 # Edge Case: Handle duplicate user name in /add
40 for user in self.database["users"]:
41 if user["name"] == user_name:
42 return json.dumps({"error": "User already exists"})
43
44 new_user = {
45 "name": user_name,
46 "owes": {},
47 "owed_by": {},
48 "balance": 0.0
49 }
50 self.database["users"].append(new_user)
51 return json.dumps(new_user)
52
53 elif url == "/iou":
54 lender_name = data.get("lender")
55 borrower_name = data.get("borrower")
56 amount = data.get("amount")
57
58 # Edge Case: Handle missing fields in /iou
59 if lender_name is None or borrower_name is None or amount is None:
60 return json.dumps({"error": "Lender, borrower, and amount are required"})
61
62 # Edge Case: Handle lender and borrower being the same person
63 if lender_name == borrower_name:
64 # Find the user
65 user = None
66 for u in self.database["users"]:
67 if u["name"] == lender_name:
68 user = u
69 break
70 # Return the user in a list
71 if user:
72 return json.dumps({"users": [user]})
73 else:
74 return json.dumps({"error": "User does not exist"})
75
76 # Handle negative amount by swapping lender and borrower
77 if amount < 0:
78 lender_name, borrower_name = borrower_name, lender_name
79 amount = -amount
80
81 # Find lender and borrower
82 lender = None
83 borrower = None
84 for user in self.database["users"]:
85 if user["name"] == lender_name:
86 lender = user
87 elif user["name"] == borrower_name:
88 borrower = user
89
90 # Edge Case: Handle lender or borrower not existing
91 if lender is None or borrower is None:
92 # Return empty users list as expected by tests
93 return json.dumps({"users": []})
94
95 # Handle zero amount - don't create entries
96 if amount == 0:
97 # Return updated users sorted by name
98 result_users = sorted([lender, borrower], key=lambda x: x["name"])
99 return json.dumps({"users": result_users})
100
101 # Update lender's owed_by
102 if borrower_name in lender["owed_by"]:
103 lender["owed_by"][borrower_name] += amount
104 else:
105 lender["owed_by"][borrower_name] = amount
106
107 # Update borrower's owes
108 if lender_name in borrower["owes"]:
109 borrower["owes"][lender_name] += amount
110 else:
111 borrower["owes"][lender_name] = amount
112
113 # Remove zero entries from owes/owed_by
114 lender["owes"] = {k: v for k, v in lender["owes"].items() if v != 0}
115 lender["owed_by"] = {k: v for k, v in lender["owed_by"].items() if v != 0}
116 borrower["owes"] = {k: v for k, v in borrower["owes"].items() if v != 0}
117 borrower["owed_by"] = {k: v for k, v in borrower["owed_by"].items() if v != 0}
118
119 # Update balances
120 lender_total_owed = sum(lender["owed_by"].values())
121 lender_total_owes = sum(lender["owes"].values())
122 lender["balance"] = round(lender_total_owed - lender_total_owes, 2)
123
124 borrower_total_owed = sum(borrower["owed_by"].values())
125 borrower_total_owes = sum(borrower["owes"].values())
126 borrower["balance"] = round(borrower_total_owed - borrower_total_owes, 2)
127
128 # Return updated users sorted by name
129 result_users = sorted([lender, borrower], key=lambda x: x["name"])
130 return json.dumps({"users": result_users})
131
132 # Edge Case: Handle unknown URL
133 return json.dumps({"error": "Not found"})
134
135 # Handled Edge Cases: None database, GET /users with no payload, GET /users with payload, unknown URL in GET,
136 # POST with no payload, missing user name in /add, duplicate user name in /add, missing fields in /iou,
137 # lender and borrower being the same person, negative amount, lender or borrower not existing, unknown URL in POST
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.