Immune

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 = [self._create_user_object(user) for user in self.database["users"]]
31 users.sort(key=lambda x: x["name"])
32 return json.dumps({"users": users})
33 else:
34 # Return specified users sorted by name
35 data = json.loads(payload)
36 user_names = data.get("users", [])
37
38 # Edge Case: Empty user list in payload
39 if not user_names:
40 return json.dumps({"users": []})
41
42 # Edge Case: Non-existent users in payload
43 users = []
44 for user in self.database["users"]:
45 if user["name"] in user_names:
46 users.append(self._create_user_object(user))
47
48 users.sort(key=lambda x: x["name"])
49 return json.dumps({"users": users})
50
51 # Edge Case: Invalid URL
52 return json.dumps({"error": "Invalid URL"})
53
854 def post(self, url: str, payload: str | None = None) -> str:
9 pass
55 """
56 Handle POST requests to the API.
57
58 Args:
59 url: The endpoint URL.
60 payload: JSON payload.
61
62 Returns:
63 A JSON string response.
64 """
65 if payload is None:
66 # Edge Case: Missing payload
67 return json.dumps({"error": "Payload required"})
68
69 data = json.loads(payload)
70
71 if url == "/add":
72 user_name = data.get("user")
73
74 # Edge Case: Missing user name
75 if not user_name:
76 return json.dumps({"error": "User name required"})
77
78 # Edge Case: User already exists
79 for user in self.database["users"]:
80 if user["name"] == user_name:
81 return json.dumps({"error": "User already exists"})
82
83 new_user = {
84 "name": user_name,
85 "owes": {},
86 "owed_by": {},
87 "balance": 0.0
88 }
89 self.database["users"].append(new_user)
90 return json.dumps(self._create_user_object(new_user))
91
92 elif url == "/iou":
93 lender_name = data.get("lender")
94 borrower_name = data.get("borrower")
95 amount = data.get("amount")
96
97 # Edge Case: Missing required fields
98 if not lender_name or not borrower_name or amount is None:
99 return json.dumps({"error": "Lender, borrower, and amount required"})
100
101 # Edge Case: Lender and borrower are the same
102 if lender_name == borrower_name:
103 return json.dumps({"error": "Lender and borrower cannot be the same"})
104
105 # Edge Case: Negative amount
106 if amount < 0:
107 return json.dumps({"error": "Amount must be positive"})
108
109 # Edge Case: Non-existent lender or borrower
110 lender = None
111 borrower = None
112 for user in self.database["users"]:
113 if user["name"] == lender_name:
114 lender = user
115 if user["name"] == borrower_name:
116 borrower = user
117
118 if not lender or not borrower:
119 return json.dumps({"error": "Lender or borrower does not exist"})
120
121 # Update IOUs
122 # Update lender's owed_by
123 if borrower_name in lender["owed_by"]:
124 lender["owed_by"][borrower_name] += amount
125 else:
126 lender["owed_by"][borrower_name] = amount
127
128 # Update borrower's owes
129 if lender_name in borrower["owes"]:
130 borrower["owes"][lender_name] += amount
131 else:
132 borrower["owes"][lender_name] = amount
133
134 # Return updated user objects
135 updated_users = [
136 self._create_user_object(lender),
137 self._create_user_object(borrower)
138 ]
139 updated_users.sort(key=lambda x: x["name"])
140 return json.dumps({"users": updated_users})
141
142 # Edge Case: Invalid URL
143 return json.dumps({"error": "Invalid URL"})
144
145 def _create_user_object(self, user: dict) -> dict:
146 """
147 Create a user object with calculated balance.
148
149 Args:
150 user: A user dictionary from the database.
151
152 Returns:
153 A user object with calculated balance.
154 """
155 owed_by_total = sum(user["owed_by"].values())
156 owes_total = sum(user["owes"].values())
157 balance = round(owed_by_total - owes_total, 2)
158
159 return {
160 "name": user["name"],
161 "owes": user["owes"],
162 "owed_by": user["owed_by"],
163 "balance": balance
164 }
165# Handled Edge Cases: Invalid URL, Missing payload, Missing user name, User already exists, Missing required fields, Lender and borrower are the same, Negative amount, Non-existent lender or borrower, Empty user list in payload, Non-existent users in payload
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.