Alone

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