class SplitwiseWrapper: def __init__(self, config_file="data/splitwise.ini"): # Get key and secret from config file config = configparser.ConfigParser() config.read(config_file) if "App" not in config: raise ValueError( "Please provide app key and secret for Splitwise in config file." ) self._consumer_key = config["App"].get('key') self._consumer_secret = config["App"].get('secret') if self._consumer_key is None or self._consumer_secret is None: raise ValueError( "Please provide app key and secret for Splitwise in config file." ) # Create user section if it does not exist yet if "User" not in config: config.add_section("User") # Save config for later access self._config = config self._config_file = config_file # Init splitwise self._s = Splitwise( consumer_key=self._consumer_key, consumer_secret=self._consumer_secret, ) if self._access_token is not None: self._s.setOAuth2AccessToken(self._access_token) # Cache for logged in user self._user: User = User() @property def _access_token(self): token = self._config['User'].get('token', "") token_type = self._config['User'].get('token_type', "") if token == "" or token_type == "": return None else: return {"access_token": token, "token_type": token_type} def set_access_token(self, token): """ Set O-Auth token and write to file. :token: { "access_token": str, "token_type": str } """ self._config['User']['token'] = token['access_token'] self._config['User']['token_type'] = token['token_type'] with open(self._config_file, 'w') as f: self._config.write(f) self._s.setOAuth2AccessToken(token) @property def s(self): return self._s @property def user(self) -> User: if self._user.getId() is None: self._user = self.s.getCurrentUser() return self._user def pay_bill(self, paying_user_id: int, bill: CoffeeBill) -> str: """ Pay a bill by creating an expense for `paying_user` with respect to logged in splitwise user. :param paying_user_id: Splitwise id of paying user :param bill: CoffeeBill to be payed :return: Splitwise transaction id """ # Convert amount to string amount_str = f"{bill.sum:.2f}" # User which will pay money paying_user = ExpenseUser() paying_user.setId(paying_user_id) paying_user.setOwedShare(amount_str) # User which will receive money my_user = ExpenseUser() my_user.setId(self.user.getId()) my_user.setPaidShare(amount_str) # Create Expense/Transaction expense = Expense() expense.setCost(amount_str) expense.setDescription(f"CoffeeTracker, Rechnung {bill.id}") expense.addUser(paying_user) expense.addUser(my_user) # Execute transaction expense_response, errors = self.s.createExpense(expense) if errors is not None: raise RuntimeError( "An error occured while processing the transaction with Splitwise: " f"{errors.errors}") return f"{expense_response.getId()}"
def login(): sObj = Splitwise(consumer_key, consumer_secret) url, secret = sObj.getAuthorizeURL() session_flask['secret'] = secret return redirect(url)
def init(config: cfg.Configuration): access_token = config.splitwise_access_token if not access_token: access_token = get_access_token(config) return Splitwise(config.splitwise_key, config.splitwise_secret, access_token)
def setUp(self): self.sObj = Splitwise('consumerkey', 'consumersecret')
def login(): wise = Splitwise('consumer_key', 'consumer_secret') url, secret = wise.getAuthorizeURL() session[KEY_SECRET] = secret return redirect(url)
def __init__(self, userId=None, auth_token=None): self.userId = userId self.splitwise_handle = Splitwise(SplitwiseOAuthManager.CONSUMER_KEY, SplitwiseOAuthManager.CONSUMER_SECRET) self.auth_token = auth_token
import json from splitwise import Splitwise import config import utils from excel import generate_expenses_xlsx import yacht_expense_details s = Splitwise(config.consumer_key, config.consumer_secret, api_key=config.API_key) utils.create_folder(config.json_filename) expenses = s.getExpenses(group_id=config.group_id, limit=config.expenses_list_limit) group = s.getGroup(id=config.group_id) members_json = group.__dict__['members'] members_array = json.loads( json.dumps(members_json, default=lambda o: o.__dict__, ensure_ascii=False)) def expenses_to_json(expenses): expenses_array = [] for expense in expenses: comments = s.getComments(expense.id) js = json.loads( json.dumps(expense.__dict__, default=lambda o: o.__dict__, ensure_ascii=False)) js['comments'] = json.loads( json.dumps(comments, default=lambda o: o.__dict__, ensure_ascii=False))
class GetExpenseTestCase(unittest.TestCase): def setUp(self): self.sObj = Splitwise('consumerkey', 'consumersecret') def test_getExpense_equally_distributed_success(self, mockMakeRequest): mockMakeRequest.return_value = '{"expense":{"id":1010404721,"group_id":19433671,"friendship_id":null,"expense_bundle_id":null,"description":"test","repeats":false,"repeat_interval":"never","email_reminder":false,"email_reminder_in_advance":-1,"next_repeat":null,"details":null,"comments_count":0,"payment":false,"creation_method":"equal","transaction_method":"offline","transaction_confirmed":false,"transaction_id":null,"cost":"10.0","currency_code":"SGD","repayments":[{"from":643871,"to":79774,"amount":"5.0"}],"date":"2020-06-23T09:56:09Z","created_at":"2020-06-23T09:56:14Z","created_by":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"},"custom_picture":true},"updated_at":"2020-06-23T09:56:14Z","updated_by":null,"deleted_at":null,"deleted_by":null,"category":{"id":18,"name":"General"},"receipt":{"large":null,"original":null},"users":[{"user":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"}},"user_id":79774,"paid_share":"10.0","owed_share":"5.0","net_balance":"5.0"},{"user":{"id":643871,"first_name":"Shantanu","last_name":"Alshi","picture":{"medium":"https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png"}},"user_id":643871,"paid_share":"0.0","owed_share":"5.0","net_balance":"-5.0"}],"comments":[]}}' # noqa: E501 expense = self.sObj.getExpense(1010404721) mockMakeRequest.assert_called_with( "https://secure.splitwise.com/api/v3.0/get_expense/1010404721") self.assertEqual(expense.getId(), 1010404721) self.assertEqual(expense.getGroupId(), 19433671) self.assertEqual(expense.getFriendshipId(), None) self.assertEqual(expense.getExpenseBundleId(), None) self.assertEqual(expense.getDescription(), "test") self.assertEqual(expense.getRepeatInterval(), "never") self.assertEqual(expense.getEmailReminderInAdvance(), -1) self.assertEqual(expense.getNextRepeat(), None) self.assertEqual(expense.getDetails(), None) self.assertEqual(expense.getCommentsCount(), 0) self.assertEqual(expense.getCreationMethod(), "equal") self.assertEqual(expense.getTransactionMethod(), "offline") # self.assertEqual(expense.getTransactionId(), None) self.assertEqual(expense.getCost(), "10.0") self.assertEqual(expense.getCurrencyCode(), "SGD") self.assertEqual(len(expense.getRepayments()), 1) self.assertEqual(expense.getRepayments()[0].getFromUser(), 643871) self.assertEqual(expense.getRepayments()[0].getToUser(), 79774) self.assertEqual(expense.getRepayments()[0].getAmount(), "5.0") self.assertEqual(expense.getDate(), "2020-06-23T09:56:09Z") self.assertEqual(expense.getCreatedAt(), "2020-06-23T09:56:14Z") self.assertEqual(expense.getCreatedBy().getId(), 79774) self.assertEqual(expense.getCreatedBy().getFirstName(), "Naman") self.assertEqual(expense.getCreatedBy().getLastName(), "Aggarwal") self.assertEqual( expense.getCreatedBy().getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg" ) self.assertEqual(expense.getUpdatedAt(), "2020-06-23T09:56:14Z") self.assertEqual(expense.getUpdatedBy(), None) self.assertEqual(expense.getDeletedAt(), None) self.assertEqual(expense.getDeletedBy(), None) self.assertEqual(expense.getCategory().getId(), 18) self.assertEqual(expense.getCategory().getName(), "General") self.assertEqual(expense.getReceipt().getLarge(), None) self.assertEqual(expense.getReceipt().getOriginal(), None) self.assertEqual(len(expense.getUsers()), 2) self.assertEqual(expense.getUsers()[0].getId(), 79774) self.assertEqual(expense.getUsers()[0].getFirstName(), "Naman") self.assertEqual(expense.getUsers()[0].getLastName(), "Aggarwal") self.assertEqual( expense.getUsers()[0].getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg" ) self.assertEqual(expense.getUsers()[0].getPaidShare(), "10.0") self.assertEqual(expense.getUsers()[0].getOwedShare(), "5.0") self.assertEqual(expense.getUsers()[0].getNetBalance(), "5.0") self.assertEqual(expense.getUsers()[1].getId(), 643871) self.assertEqual(expense.getUsers()[1].getFirstName(), "Shantanu") self.assertEqual(expense.getUsers()[1].getLastName(), "Alshi") self.assertEqual( expense.getUsers()[1].getPicture().getMedium(), "https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png" ) self.assertEqual(expense.getUsers()[1].getPaidShare(), "0.0") self.assertEqual(expense.getUsers()[1].getOwedShare(), "5.0") self.assertEqual(expense.getUsers()[1].getNetBalance(), "-5.0") # self.assertEqual(len(expense.getComments()), 0) def test_getExpense_equally_except_one_success(self, mockMakeRequest): mockMakeRequest.return_value = '{"expense":{"id":1010396012,"group_id":10843533,"friendship_id":null,"expense_bundle_id":null,"description":"anna shop groceries parantha execpt curd","repeats":false,"repeat_interval":"never","email_reminder":false,"email_reminder_in_advance":-1,"next_repeat":null,"details":null,"comments_count":0,"payment":false,"creation_method":"equal","transaction_method":"offline","transaction_confirmed":false,"transaction_id":null,"cost":"8.0","currency_code":"SGD","repayments":[{"from":281236,"to":79774,"amount":"2.67"},{"from":643871,"to":79774,"amount":"2.66"}],"date":"2020-06-23T09:33:07Z","created_at":"2020-06-23T09:33:38Z","created_by":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"},"custom_picture":true},"updated_at":"2020-06-23T09:33:38Z","updated_by":null,"deleted_at":null,"deleted_by":null,"category":{"id":12,"name":"Groceries"},"receipt":{"large":null,"original":null},"users":[{"user":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"}},"user_id":79774,"paid_share":"8.0","owed_share":"2.67","net_balance":"5.33"},{"user":{"id":281236,"first_name":"Siddharth","last_name":"Goel","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/medium_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg"}},"user_id":281236,"paid_share":"0.0","owed_share":"2.67","net_balance":"-2.67"},{"user":{"id":643871,"first_name":"Shantanu","last_name":"Alshi","picture":{"medium":"https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png"}},"user_id":643871,"paid_share":"0.0","owed_share":"2.66","net_balance":"-2.66"}],"comments":[]}}' # noqa: E501 expense = self.sObj.getExpense(1010396012) mockMakeRequest.assert_called_with( "https://secure.splitwise.com/api/v3.0/get_expense/1010396012") self.assertEqual(expense.getId(), 1010396012) self.assertEqual(expense.getGroupId(), 10843533) self.assertEqual(expense.getFriendshipId(), None) self.assertEqual(expense.getExpenseBundleId(), None) self.assertEqual(expense.getDescription(), "anna shop groceries parantha execpt curd") self.assertEqual(expense.getRepeatInterval(), "never") self.assertEqual(expense.getEmailReminderInAdvance(), -1) self.assertEqual(expense.getNextRepeat(), None) self.assertEqual(expense.getDetails(), None) self.assertEqual(expense.getCommentsCount(), 0) self.assertEqual(expense.getCreationMethod(), "equal") self.assertEqual(expense.getTransactionMethod(), "offline") # self.assertEqual(expense.getTransactionId(), None) self.assertEqual(expense.getCost(), "8.0") self.assertEqual(expense.getCurrencyCode(), "SGD") self.assertEqual(len(expense.getRepayments()), 2) self.assertEqual(expense.getRepayments()[0].getFromUser(), 281236) self.assertEqual(expense.getRepayments()[0].getToUser(), 79774) self.assertEqual(expense.getRepayments()[0].getAmount(), "2.67") self.assertEqual(expense.getRepayments()[1].getFromUser(), 643871) self.assertEqual(expense.getRepayments()[1].getToUser(), 79774) self.assertEqual(expense.getRepayments()[1].getAmount(), "2.66") self.assertEqual(expense.getDate(), "2020-06-23T09:33:07Z") self.assertEqual(expense.getCreatedAt(), "2020-06-23T09:33:38Z") self.assertEqual(expense.getCreatedBy().getId(), 79774) self.assertEqual(expense.getCreatedBy().getFirstName(), "Naman") self.assertEqual(expense.getCreatedBy().getLastName(), "Aggarwal") self.assertEqual( expense.getCreatedBy().getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg" ) self.assertEqual(expense.getUpdatedAt(), "2020-06-23T09:33:38Z") self.assertEqual(expense.getUpdatedBy(), None) self.assertEqual(expense.getDeletedAt(), None) self.assertEqual(expense.getDeletedBy(), None) self.assertEqual(expense.getCategory().getId(), 12) self.assertEqual(expense.getCategory().getName(), "Groceries") self.assertEqual(expense.getReceipt().getLarge(), None) self.assertEqual(expense.getReceipt().getOriginal(), None) self.assertEqual(len(expense.getUsers()), 3) self.assertEqual(expense.getUsers()[0].getId(), 79774) self.assertEqual(expense.getUsers()[0].getFirstName(), "Naman") self.assertEqual(expense.getUsers()[0].getLastName(), "Aggarwal") self.assertEqual( expense.getUsers()[0].getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg" ) self.assertEqual(expense.getUsers()[0].getPaidShare(), "8.0") self.assertEqual(expense.getUsers()[0].getOwedShare(), "2.67") self.assertEqual(expense.getUsers()[0].getNetBalance(), "5.33") self.assertEqual(expense.getUsers()[1].getId(), 281236) self.assertEqual(expense.getUsers()[1].getFirstName(), "Siddharth") self.assertEqual(expense.getUsers()[1].getLastName(), "Goel") self.assertEqual( expense.getUsers()[1].getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/medium_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg" ) self.assertEqual(expense.getUsers()[1].getPaidShare(), "0.0") self.assertEqual(expense.getUsers()[1].getOwedShare(), "2.67") self.assertEqual(expense.getUsers()[1].getNetBalance(), "-2.67") self.assertEqual(expense.getUsers()[2].getId(), 643871) self.assertEqual(expense.getUsers()[2].getFirstName(), "Shantanu") self.assertEqual(expense.getUsers()[2].getLastName(), "Alshi") self.assertEqual( expense.getUsers()[2].getPicture().getMedium(), "https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png" ) self.assertEqual(expense.getUsers()[2].getPaidShare(), "0.0") self.assertEqual(expense.getUsers()[2].getOwedShare(), "2.66") self.assertEqual(expense.getUsers()[2].getNetBalance(), "-2.66") def test_getExpense_itemized_success(self, mockMakeRequest): mockMakeRequest.return_value = '{"expense":{"id":1004919507,"group_id":10843533,"friendship_id":null,"expense_bundle_id":null,"description":"Anna shop","repeats":false,"repeat_interval":"never","email_reminder":false,"email_reminder_in_advance":-1,"next_repeat":null,"details":"Mango - 2.20 (Naman Aggarwal)\\nBread - 3.00 (Siddharth Goel)\\nVegetable \\u0026 misc - 5.80 (Naman Aggarwal, Shantanu Alshi, Siddharth Goel)\\nTax: Naman Aggarwal - 0.00, ruks - 0.00, Shantanu Alshi - 0.00, Siddharth Goel - 0.00\\nTip: Naman Aggarwal - 0.00, ruks - 0.00, Shantanu Alshi - 0.00, Siddharth Goel - 0.00\\n","comments_count":0,"payment":false,"creation_method":"itemized","transaction_method":"offline","transaction_confirmed":false,"transaction_id":null,"cost":"11.0","currency_code":"SGD","repayments":[{"from":79774,"to":281236,"amount":"4.14"},{"from":643871,"to":281236,"amount":"1.93"}],"date":"2020-06-14T06:53:49Z","created_at":"2020-06-14T06:54:37Z","created_by":{"id":281236,"first_name":"Siddharth","last_name":"Goel","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/medium_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg"},"custom_picture":true},"updated_at":"2020-06-14T06:54:37Z","updated_by":null,"deleted_at":null,"deleted_by":null,"category":{"id":12,"name":"Groceries"},"receipt":{"large":null,"original":null},"users":[{"user":{"id":281236,"first_name":"Siddharth","last_name":"Goel","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/medium_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg"}},"user_id":281236,"paid_share":"11.0","owed_share":"4.93","net_balance":"6.07"},{"user":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"}},"user_id":79774,"paid_share":"0.0","owed_share":"4.14","net_balance":"-4.14"},{"user":{"id":643871,"first_name":"Shantanu","last_name":"Alshi","picture":{"medium":"https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png"}},"user_id":643871,"paid_share":"0.0","owed_share":"1.93","net_balance":"-1.93"}],"comments":[]}}' # noqa: E501 expense = self.sObj.getExpense(1004919507) mockMakeRequest.assert_called_with( "https://secure.splitwise.com/api/v3.0/get_expense/1004919507") self.assertEqual(expense.getId(), 1004919507) self.assertEqual(expense.getGroupId(), 10843533) self.assertEqual(expense.getFriendshipId(), None) self.assertEqual(expense.getExpenseBundleId(), None) self.assertEqual(expense.getDescription(), "Anna shop") self.assertEqual(expense.getRepeatInterval(), "never") self.assertEqual(expense.getEmailReminderInAdvance(), -1) self.assertEqual(expense.getNextRepeat(), None) # self.assertEqual(expense.getDetails(), # "Mango - 2.20 (Naman Aggarwal)\nBread - 3.00 (Siddharth Goel)\nVegetable \u0026 misc - 5.80\ # (Naman Aggarwal, Shantanu Alshi, Siddharth Goel)\nTax: Naman Aggarwal - 0.00, ruks - 0.00, Shantanu Alshi - 0.00, \ # Siddharth Goel - 0.00\nTip: Naman Aggarwal - 0.00, ruks - 0.00, Shantanu Alshi - 0.00, Siddharth Goel - 0.00\n") self.assertEqual(expense.getCommentsCount(), 0) self.assertEqual(expense.getCreationMethod(), "itemized") self.assertEqual(expense.getTransactionMethod(), "offline") # self.assertEqual(expense.getTransactionId(), None) self.assertEqual(expense.getCost(), "11.0") self.assertEqual(expense.getCurrencyCode(), "SGD") self.assertEqual(len(expense.getRepayments()), 2) self.assertEqual(expense.getRepayments()[0].getFromUser(), 79774) self.assertEqual(expense.getRepayments()[0].getToUser(), 281236) self.assertEqual(expense.getRepayments()[0].getAmount(), "4.14") self.assertEqual(expense.getRepayments()[1].getFromUser(), 643871) self.assertEqual(expense.getRepayments()[1].getToUser(), 281236) self.assertEqual(expense.getRepayments()[1].getAmount(), "1.93") self.assertEqual(expense.getDate(), "2020-06-14T06:53:49Z") self.assertEqual(expense.getCreatedAt(), "2020-06-14T06:54:37Z") self.assertEqual(expense.getCreatedBy().getId(), 281236) self.assertEqual(expense.getCreatedBy().getFirstName(), "Siddharth") self.assertEqual(expense.getCreatedBy().getLastName(), "Goel") self.assertEqual( expense.getCreatedBy().getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/medium_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg" ) self.assertEqual(expense.getUpdatedAt(), "2020-06-14T06:54:37Z") self.assertEqual(expense.getUpdatedBy(), None) self.assertEqual(expense.getDeletedAt(), None) self.assertEqual(expense.getDeletedBy(), None) self.assertEqual(expense.getCategory().getId(), 12) self.assertEqual(expense.getCategory().getName(), "Groceries") self.assertEqual(expense.getReceipt().getLarge(), None) self.assertEqual(expense.getReceipt().getOriginal(), None) self.assertEqual(len(expense.getUsers()), 3) self.assertEqual(expense.getUsers()[0].getId(), 281236) self.assertEqual(expense.getUsers()[0].getFirstName(), "Siddharth") self.assertEqual(expense.getUsers()[0].getLastName(), "Goel") self.assertEqual( expense.getUsers()[0].getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/medium_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg" ) self.assertEqual(expense.getUsers()[0].getPaidShare(), "11.0") self.assertEqual(expense.getUsers()[0].getOwedShare(), "4.93") self.assertEqual(expense.getUsers()[0].getNetBalance(), "6.07") self.assertEqual(expense.getUsers()[1].getId(), 79774) self.assertEqual(expense.getUsers()[1].getFirstName(), "Naman") self.assertEqual(expense.getUsers()[1].getLastName(), "Aggarwal") self.assertEqual( expense.getUsers()[1].getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg" ) self.assertEqual(expense.getUsers()[1].getPaidShare(), "0.0") self.assertEqual(expense.getUsers()[1].getOwedShare(), "4.14") self.assertEqual(expense.getUsers()[1].getNetBalance(), "-4.14") self.assertEqual(expense.getUsers()[2].getId(), 643871) self.assertEqual(expense.getUsers()[2].getFirstName(), "Shantanu") self.assertEqual(expense.getUsers()[2].getLastName(), "Alshi") self.assertEqual( expense.getUsers()[2].getPicture().getMedium(), "https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png" ) self.assertEqual(expense.getUsers()[2].getPaidShare(), "0.0") self.assertEqual(expense.getUsers()[2].getOwedShare(), "1.93") self.assertEqual(expense.getUsers()[2].getNetBalance(), "-1.93") def test_getExpense_non_group_success(self, mockMakeRequest): mockMakeRequest.return_value = '{"expense":{"id":982430660,"group_id":null,"friendship_id":null,"expense_bundle_id":null,"description":"From flatmates","repeats":false,"repeat_interval":"never","email_reminder":false,"email_reminder_in_advance":-1,"next_repeat":null,"details":null,"comments_count":0,"payment":false,"creation_method":"equal","transaction_method":"offline","transaction_confirmed":false,"transaction_id":null,"cost":"2162.82","currency_code":"SGD","repayments":[{"from":784241,"to":79774,"amount":"2162.82"}],"date":"2020-05-06T05:48:14Z","created_at":"2020-05-06T05:48:30Z","created_by":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"},"custom_picture":true},"updated_at":"2020-05-06T05:48:30Z","updated_by":null,"deleted_at":null,"deleted_by":null,"category":{"id":18,"name":"General"},"receipt":{"large":null,"original":null},"users":[{"user":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"}},"user_id":79774,"paid_share":"2162.82","owed_share":"0.0","net_balance":"2162.82"},{"user":{"id":784241,"first_name":"ruks","last_name":null,"picture":{"medium":"https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-ruby47-100px.png"}},"user_id":784241,"paid_share":"0.0","owed_share":"2162.82","net_balance":"-2162.82"}],"comments":[]}}' # noqa: E501 expense = self.sObj.getExpense(982430660) mockMakeRequest.assert_called_with( "https://secure.splitwise.com/api/v3.0/get_expense/982430660") self.assertEqual(expense.getId(), 982430660) self.assertEqual(expense.getGroupId(), None) self.assertEqual(expense.getFriendshipId(), None) self.assertEqual(expense.getExpenseBundleId(), None) self.assertEqual(expense.getDescription(), "From flatmates") self.assertEqual(expense.getRepeatInterval(), "never") self.assertEqual(expense.getEmailReminderInAdvance(), -1) self.assertEqual(expense.getNextRepeat(), None) self.assertEqual(expense.getDetails(), None) self.assertEqual(expense.getCommentsCount(), 0) self.assertEqual(expense.getCreationMethod(), "equal") self.assertEqual(expense.getTransactionMethod(), "offline") # self.assertEqual(expense.getTransactionId(), None) self.assertEqual(expense.getCost(), "2162.82") self.assertEqual(expense.getCurrencyCode(), "SGD") self.assertEqual(len(expense.getRepayments()), 1) self.assertEqual(expense.getRepayments()[0].getFromUser(), 784241) self.assertEqual(expense.getRepayments()[0].getToUser(), 79774) self.assertEqual(expense.getRepayments()[0].getAmount(), "2162.82") self.assertEqual(expense.getDate(), "2020-05-06T05:48:14Z") self.assertEqual(expense.getCreatedAt(), "2020-05-06T05:48:30Z") self.assertEqual(expense.getCreatedBy().getId(), 79774) self.assertEqual(expense.getCreatedBy().getFirstName(), "Naman") self.assertEqual(expense.getCreatedBy().getLastName(), "Aggarwal") self.assertEqual( expense.getCreatedBy().getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg" ) self.assertEqual(expense.getUpdatedAt(), "2020-05-06T05:48:30Z") self.assertEqual(expense.getUpdatedBy(), None) self.assertEqual(expense.getDeletedAt(), None) self.assertEqual(expense.getDeletedBy(), None) self.assertEqual(expense.getCategory().getId(), 18) self.assertEqual(expense.getCategory().getName(), "General") self.assertEqual(expense.getReceipt().getLarge(), None) self.assertEqual(expense.getReceipt().getOriginal(), None) self.assertEqual(len(expense.getUsers()), 2) self.assertEqual(expense.getUsers()[0].getId(), 79774) self.assertEqual(expense.getUsers()[0].getFirstName(), "Naman") self.assertEqual(expense.getUsers()[0].getLastName(), "Aggarwal") self.assertEqual( expense.getUsers()[0].getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg" ) self.assertEqual(expense.getUsers()[0].getPaidShare(), "2162.82") self.assertEqual(expense.getUsers()[0].getOwedShare(), "0.0") self.assertEqual(expense.getUsers()[0].getNetBalance(), "2162.82") self.assertEqual(expense.getUsers()[1].getId(), 784241) self.assertEqual(expense.getUsers()[1].getFirstName(), "ruks") self.assertEqual(expense.getUsers()[1].getLastName(), None) self.assertEqual( expense.getUsers()[1].getPicture().getMedium(), "https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-ruby47-100px.png" ) self.assertEqual(expense.getUsers()[1].getPaidShare(), "0.0") self.assertEqual(expense.getUsers()[1].getOwedShare(), "2162.82") self.assertEqual(expense.getUsers()[1].getNetBalance(), "-2162.82") def test_getExpense_exception(self, mockMakeRequest): mockMakeRequest.side_effect = Exception( "Invalid response %s. Please check your consumer key and secret." % 404) with self.assertRaises(Exception): self.sObj.getExpense(123) mockMakeRequest.assert_called_with( "https://secure.splitwise.com/api/v3.0/get_expense/123")
state = { 'john': {'balance': 3000, 'credit': 999, 'rewards': 1337}, 'mary': {'balance': 200, 'credit': 700, 'rewards': 500}, 'leonard': {'balance': 0, 'credit': 100, 'rewards': 1} } AUTH_THRESH = 60 auth = time.time() - 60 ip_alexa = '82.132.222.99' #splitwise shit session = {} consumer_key = "8K5e87K3y5haqW8hmG6x6mbP8GeOwyFqoed01b6q" consumer_secret = "pW2YnEoK7vuiNCyES5c6Rvj2iBo0z5xOaFfujm4L" session['access_token'] = {'oauth_token': 'y5dvUvYXr5MO038WUBBpfCVKoYSMxHq7jQjHqGJG', 'oauth_token_secret': 'CyoxnwNMTi9sZ5BMD1ASl1r6e7Z9SRahLZq58lY6'} sObj = Splitwise(consumer_key, consumer_secret) sObj.setAccessToken(session['access_token']) def add_bill(cost=100.0): users = [] group = sObj.getGroup(10204809) people = group.getMembers() expense = Expense() expense.setCost(str(cost)) expense.setDescription("Capital One Transfer") # per_person = str(round(cost / len(people), 2)) per_person = cost paying_user =sObj.getCurrentUser() paying_id = paying_user.getId()
from splitwise import Splitwise # Go to https://secure.splitwise.com/oauth_clients and get the key and secret sObj = Splitwise("key", "secret") url, secret = sObj.getAuthorizeURL() # go to URL ad obtain verification code access_token = sObj.getAccessToken(url.split('=')[1], secret, "verification code") sObj.setAccessToken(access_token) # Parameters to search for expenses a_group_id = None a_friendship_id = None a_expense_bundle_id = None a_description = None a_details = None a_payment = None a_cost = None a_date_start = None a_date_end = None a_category_id = None # Parameters to substitute to found expenses b_group_id = None b_friendship_id = None b_expense_bundle_id = None b_description = None b_details = None b_payment = None b_cost = None
def add_comment_to_expense(expense_id: id, comment: str): resp, err = s.createComment(expense_id, comment) return resp, err if __name__ == "__main__": config = read_config(CONFIG_PATH) client_id = config['oauth']['client_id'] client_secret = config['oauth']['client_secret'] redirect_uri = config['oauth']['redirect_uri'] server_addr = config['server']['addr'] server_port = config.getint('server', 'port') server_debug = config.getboolean('server', 'debug') # TODO: initiate the oauth from a route instead of CLI to make this a web app s = Splitwise(client_id, client_secret) # see if we already have an access token, otherwise initialize the OAuth flow if config.has_option('oauth', 'access_token'): access_token = json.loads(config['oauth']['access_token']) s.setOAuth2AccessToken(access_token) else: print("No access token found. Initiating Splitwise integration") server_thread = threading.Thread(target=app.run, args=(server_addr, server_port, server_debug)) server_thread.start() # TODO: use url_for in 'with app.app_context():'. requires setting SERVER_NAME env var redirect_uri = redirect_uri + '/authorized' url, state = s.getOAuth2AuthorizeURL(redirect_uri) webbrowser.open_new_tab(url) server_thread.join()
class GetExpensesTestCase(unittest.TestCase): def setUp(self): self.sObj = Splitwise('consumerkey', 'consumersecret') def test_getExpenses_limit_and_offset_success(self, mockMakeRequest): mockMakeRequest.return_value = '{"expenses":[{"id":1010395720,"group_id":10843533,"friendship_id":null,"expense_bundle_id":null,"description":"Potato","repeats":false,"repeat_interval":"never","email_reminder":false,"email_reminder_in_advance":-1,"next_repeat":null,"details":null,"comments_count":0,"payment":false,"creation_method":"equal","transaction_method":"offline","transaction_confirmed":false,"transaction_id":null,"cost":"0.9","currency_code":"SGD","repayments":[{"from":281236,"to":79774,"amount":"0.3"},{"from":643871,"to":79774,"amount":"0.3"}],"date":"2020-06-23T09:32:56Z","created_at":"2020-06-23T09:33:05Z","created_by":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"},"custom_picture":true},"updated_at":"2020-06-23T09:33:05Z","updated_by":null,"deleted_at":null,"deleted_by":null,"category":{"id":12,"name":"Groceries"},"receipt":{"large":null,"original":null},"users":[{"user":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"}},"user_id":79774,"paid_share":"0.9","owed_share":"0.3","net_balance":"0.6"},{"user":{"id":281236,"first_name":"Siddharth","last_name":"Goel","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/medium_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg"}},"user_id":281236,"paid_share":"0.0","owed_share":"0.3","net_balance":"-0.3"},{"user":{"id":643871,"first_name":"Shantanu","last_name":"Alshi","picture":{"medium":"https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png"}},"user_id":643871,"paid_share":"0.0","owed_share":"0.3","net_balance":"-0.3"}]},{"id":1009711631,"group_id":10843533,"friendship_id":null,"expense_bundle_id":null,"description":"Mexican Dinner","repeats":false,"repeat_interval":"never","email_reminder":true,"email_reminder_in_advance":null,"next_repeat":null,"details":"","comments_count":0,"payment":false,"creation_method":"split","transaction_method":"offline","transaction_confirmed":false,"transaction_id":null,"cost":"32.7","currency_code":"SGD","repayments":[{"from":281236,"to":79774,"amount":"10.9"},{"from":643871,"to":79774,"amount":"10.9"}],"date":"2020-06-22T07:17:32Z","created_at":"2020-06-22T07:17:54Z","created_by":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"},"custom_picture":true},"updated_at":"2020-06-22T07:17:54Z","updated_by":null,"deleted_at":null,"deleted_by":null,"category":{"id":13,"name":"Dining out"},"receipt":{"large":null,"original":null},"users":[{"user":{"id":281236,"first_name":"Siddharth","last_name":"Goel","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/medium_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg"}},"user_id":281236,"paid_share":"0.0","owed_share":"10.9","net_balance":"-10.9"},{"user":{"id":643871,"first_name":"Shantanu","last_name":"Alshi","picture":{"medium":"https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png"}},"user_id":643871,"paid_share":"0.0","owed_share":"10.9","net_balance":"-10.9"},{"user":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"}},"user_id":79774,"paid_share":"32.7","owed_share":"10.9","net_balance":"21.8"}]}]}' # noqa: E501 expenses = self.sObj.getExpenses(2, 3) args, kwargs = mockMakeRequest.call_args parsed = urlparse.urlparse(args[0]) qs = parse_qs(parsed.query) self.assertEqual(qs['offset'], ['2']) self.assertEqual(qs['limit'], ['3']) self.assertEqual(len(expenses), 2) self.assertEqual(expenses[0].getId(), 1010395720) self.assertEqual(expenses[0].getGroupId(), 10843533) self.assertEqual(expenses[0].getFriendshipId(), None) self.assertEqual(expenses[0].getExpenseBundleId(), None) self.assertEqual(expenses[0].getDescription(), "Potato") self.assertEqual(expenses[0].getRepeatInterval(), "never") self.assertEqual(expenses[0].getEmailReminderInAdvance(), -1) self.assertEqual(expenses[0].getNextRepeat(), None) self.assertEqual(expenses[0].getDetails(), None) self.assertEqual(expenses[0].getCommentsCount(), 0) self.assertEqual(expenses[0].getCreationMethod(), "equal") self.assertEqual(expenses[0].getTransactionMethod(), "offline") # self.assertEqual(expenses[0].getTransactionId(), None) self.assertEqual(expenses[0].getCost(), "0.9") self.assertEqual(expenses[0].getCurrencyCode(), "SGD") self.assertEqual(len(expenses[0].getRepayments()), 2) self.assertEqual(expenses[0].getRepayments()[0].getFromUser(), 281236) self.assertEqual(expenses[0].getRepayments()[0].getToUser(), 79774) self.assertEqual(expenses[0].getRepayments()[0].getAmount(), "0.3") self.assertEqual(expenses[0].getRepayments()[1].getFromUser(), 643871) self.assertEqual(expenses[0].getRepayments()[1].getToUser(), 79774) self.assertEqual(expenses[0].getRepayments()[1].getAmount(), "0.3") self.assertEqual(expenses[0].getDate(), "2020-06-23T09:32:56Z") self.assertEqual(expenses[0].getCreatedAt(), "2020-06-23T09:33:05Z") self.assertEqual(expenses[0].getCreatedBy().getId(), 79774) self.assertEqual(expenses[0].getCreatedBy().getFirstName(), "Naman") self.assertEqual(expenses[0].getCreatedBy().getLastName(), "Aggarwal") self.assertEqual(expenses[0].getCreatedBy().getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg") self.assertEqual(expenses[0].getUpdatedAt(), "2020-06-23T09:33:05Z") self.assertEqual(expenses[0].getUpdatedBy(), None) self.assertEqual(expenses[0].getDeletedAt(), None) self.assertEqual(expenses[0].getDeletedBy(), None) self.assertEqual(expenses[0].getCategory().getId(), 12) self.assertEqual(expenses[0].getCategory().getName(), "Groceries") self.assertEqual(expenses[0].getReceipt().getLarge(), None) self.assertEqual(expenses[0].getReceipt().getOriginal(), None) self.assertEqual(len(expenses[0].getUsers()), 3) self.assertEqual(expenses[0].getUsers()[0].getId(), 79774) self.assertEqual(expenses[0].getUsers()[0].getFirstName(), "Naman") self.assertEqual(expenses[0].getUsers()[0].getLastName(), "Aggarwal") self.assertEqual(expenses[0].getUsers()[0].getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg") self.assertEqual(expenses[0].getUsers()[0].getPaidShare(), "0.9") self.assertEqual(expenses[0].getUsers()[0].getOwedShare(), "0.3") self.assertEqual(expenses[0].getUsers()[0].getNetBalance(), "0.6") self.assertEqual(expenses[0].getUsers()[1].getId(), 281236) self.assertEqual(expenses[0].getUsers()[1].getFirstName(), "Siddharth") self.assertEqual(expenses[0].getUsers()[1].getLastName(), "Goel") self.assertEqual(expenses[0].getUsers()[1].getPicture().getMedium( ), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/medium_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg") self.assertEqual(expenses[0].getUsers()[1].getPaidShare(), "0.0") self.assertEqual(expenses[0].getUsers()[1].getOwedShare(), "0.3") self.assertEqual(expenses[0].getUsers()[1].getNetBalance(), "-0.3") self.assertEqual(expenses[0].getUsers()[2].getId(), 643871) self.assertEqual(expenses[0].getUsers()[2].getFirstName(), "Shantanu") self.assertEqual(expenses[0].getUsers()[2].getLastName(), "Alshi") self.assertEqual(expenses[0].getUsers()[2].getPicture().getMedium(), "https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png") self.assertEqual(expenses[0].getUsers()[2].getPaidShare(), "0.0") self.assertEqual(expenses[0].getUsers()[2].getOwedShare(), "0.3") self.assertEqual(expenses[0].getUsers()[2].getNetBalance(), "-0.3") self.assertEqual(expenses[1].getId(), 1009711631) self.assertEqual(expenses[1].getGroupId(), 10843533) self.assertEqual(expenses[1].getFriendshipId(), None) self.assertEqual(expenses[1].getExpenseBundleId(), None) self.assertEqual(expenses[1].getDescription(), "Mexican Dinner") self.assertEqual(expenses[1].getRepeatInterval(), "never") self.assertEqual(expenses[1].getEmailReminderInAdvance(), None) self.assertEqual(expenses[1].getNextRepeat(), None) self.assertEqual(expenses[1].getDetails(), "") self.assertEqual(expenses[1].getCommentsCount(), 0) self.assertEqual(expenses[1].getCreationMethod(), "split") self.assertEqual(expenses[1].getTransactionMethod(), "offline") # self.assertEqual(expenses[1].getTransactionId(), None) self.assertEqual(expenses[1].getCost(), "32.7") self.assertEqual(expenses[1].getCurrencyCode(), "SGD") self.assertEqual(len(expenses[1].getRepayments()), 2) self.assertEqual(expenses[1].getRepayments()[0].getFromUser(), 281236) self.assertEqual(expenses[1].getRepayments()[0].getToUser(), 79774) self.assertEqual(expenses[1].getRepayments()[0].getAmount(), "10.9") self.assertEqual(expenses[1].getRepayments()[1].getFromUser(), 643871) self.assertEqual(expenses[1].getRepayments()[1].getToUser(), 79774) self.assertEqual(expenses[1].getRepayments()[1].getAmount(), "10.9") self.assertEqual(expenses[1].getDate(), "2020-06-22T07:17:32Z") self.assertEqual(expenses[1].getCreatedAt(), "2020-06-22T07:17:54Z") self.assertEqual(expenses[1].getCreatedBy().getId(), 79774) self.assertEqual(expenses[1].getCreatedBy().getFirstName(), "Naman") self.assertEqual(expenses[1].getCreatedBy().getLastName(), "Aggarwal") self.assertEqual(expenses[1].getCreatedBy().getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg") self.assertEqual(expenses[1].getUpdatedAt(), "2020-06-22T07:17:54Z") self.assertEqual(expenses[1].getUpdatedBy(), None) self.assertEqual(expenses[1].getDeletedAt(), None) self.assertEqual(expenses[1].getDeletedBy(), None) self.assertEqual(expenses[1].getCategory().getId(), 13) self.assertEqual(expenses[1].getCategory().getName(), "Dining out") self.assertEqual(expenses[1].getReceipt().getLarge(), None) self.assertEqual(expenses[1].getReceipt().getOriginal(), None) self.assertEqual(len(expenses[1].getUsers()), 3) self.assertEqual(expenses[1].getUsers()[0].getId(), 281236) self.assertEqual(expenses[1].getUsers()[0].getFirstName(), "Siddharth") self.assertEqual(expenses[1].getUsers()[0].getLastName(), "Goel") self.assertEqual(expenses[1].getUsers()[0].getPicture().getMedium( ), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/medium_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg") self.assertEqual(expenses[1].getUsers()[0].getPaidShare(), "0.0") self.assertEqual(expenses[1].getUsers()[0].getOwedShare(), "10.9") self.assertEqual(expenses[1].getUsers()[0].getNetBalance(), "-10.9") self.assertEqual(expenses[1].getUsers()[1].getId(), 643871) self.assertEqual(expenses[1].getUsers()[1].getFirstName(), "Shantanu") self.assertEqual(expenses[1].getUsers()[1].getLastName(), "Alshi") self.assertEqual(expenses[1].getUsers()[1].getPicture().getMedium(), "https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png") self.assertEqual(expenses[1].getUsers()[1].getPaidShare(), "0.0") self.assertEqual(expenses[1].getUsers()[1].getOwedShare(), "10.9") self.assertEqual(expenses[1].getUsers()[1].getNetBalance(), "-10.9") self.assertEqual(expenses[1].getUsers()[2].getId(), 79774) self.assertEqual(expenses[1].getUsers()[2].getFirstName(), "Naman") self.assertEqual(expenses[1].getUsers()[2].getLastName(), "Aggarwal") self.assertEqual(expenses[1].getUsers()[2].getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg") self.assertEqual(expenses[1].getUsers()[2].getPaidShare(), "32.7") self.assertEqual(expenses[1].getUsers()[2].getOwedShare(), "10.9") self.assertEqual(expenses[1].getUsers()[2].getNetBalance(), "21.8") def test_getExpenses_all_options_success(self, mockMakeRequest): mockMakeRequest.return_value = '{"expenses":[{"id":1010395720,"group_id":10843533,"friendship_id":null,"expense_bundle_id":null,"description":"Potato","repeats":false,"repeat_interval":"never","email_reminder":false,"email_reminder_in_advance":-1,"next_repeat":null,"details":null,"comments_count":0,"payment":false,"creation_method":"equal","transaction_method":"offline","transaction_confirmed":false,"transaction_id":null,"cost":"0.9","currency_code":"SGD","repayments":[{"from":281236,"to":79774,"amount":"0.3"},{"from":643871,"to":79774,"amount":"0.3"}],"date":"2020-06-23T09:32:56Z","created_at":"2020-06-23T09:33:05Z","created_by":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"},"custom_picture":true},"updated_at":"2020-06-23T09:33:05Z","updated_by":null,"deleted_at":null,"deleted_by":null,"category":{"id":12,"name":"Groceries"},"receipt":{"large":null,"original":null},"users":[{"user":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"}},"user_id":79774,"paid_share":"0.9","owed_share":"0.3","net_balance":"0.6"},{"user":{"id":281236,"first_name":"Siddharth","last_name":"Goel","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/medium_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg"}},"user_id":281236,"paid_share":"0.0","owed_share":"0.3","net_balance":"-0.3"},{"user":{"id":643871,"first_name":"Shantanu","last_name":"Alshi","picture":{"medium":"https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png"}},"user_id":643871,"paid_share":"0.0","owed_share":"0.3","net_balance":"-0.3"}]},{"id":1009711631,"group_id":10843533,"friendship_id":null,"expense_bundle_id":null,"description":"Mexican Dinner","repeats":false,"repeat_interval":"never","email_reminder":true,"email_reminder_in_advance":null,"next_repeat":null,"details":"","comments_count":0,"payment":false,"creation_method":"split","transaction_method":"offline","transaction_confirmed":false,"transaction_id":null,"cost":"32.7","currency_code":"SGD","repayments":[{"from":281236,"to":79774,"amount":"10.9"},{"from":643871,"to":79774,"amount":"10.9"}],"date":"2020-06-22T07:17:32Z","created_at":"2020-06-22T07:17:54Z","created_by":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"},"custom_picture":true},"updated_at":"2020-06-22T07:17:54Z","updated_by":null,"deleted_at":null,"deleted_by":null,"category":{"id":13,"name":"Dining out"},"receipt":{"large":null,"original":null},"users":[{"user":{"id":281236,"first_name":"Siddharth","last_name":"Goel","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/medium_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg"}},"user_id":281236,"paid_share":"0.0","owed_share":"10.9","net_balance":"-10.9"},{"user":{"id":643871,"first_name":"Shantanu","last_name":"Alshi","picture":{"medium":"https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png"}},"user_id":643871,"paid_share":"0.0","owed_share":"10.9","net_balance":"-10.9"},{"user":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"}},"user_id":79774,"paid_share":"32.7","owed_share":"10.9","net_balance":"21.8"}]}]}' # noqa: E501 self.sObj.getExpenses(2, 3, "123", "1234", "2020-12-12", "2020-12-19", "2020-12-13", "2020-12-18") args, kwargs = mockMakeRequest.call_args parsed = urlparse.urlparse(args[0]) qs = parse_qs(parsed.query) self.assertEqual(qs['offset'], ['2']) self.assertEqual(qs['limit'], ['3']) self.assertEqual(qs['group_id'], ['123']) self.assertEqual(qs['friendship_id'], ['1234']) self.assertEqual(qs['dated_after'], ['2020-12-12']) self.assertEqual(qs['dated_before'], ['2020-12-19']) self.assertEqual(qs['updated_after'], ['2020-12-13']) self.assertEqual(qs['updated_before'], ['2020-12-18']) def test_getExpenses_exception(self, mockMakeRequest): mockMakeRequest.side_effect = Exception( "Invalid response %s. Please check your consumer key and secret." % 404) with self.assertRaises(Exception): self.sObj.getExpenses(2, 3) args, kwargs = mockMakeRequest.call_args parsed = urlparse.urlparse(args[0]) qs = parse_qs(parsed.query) self.assertEqual(qs['offset'], ['2']) self.assertEqual(qs['limit'], ['3'])
class UpdateUserTestCase(unittest.TestCase): def setUp(self): self.sObj = Splitwise('consumerkey', 'consumersecret') def test_updateUser_success(self, mockMakeRequest): mockMakeRequest.return_value = '{"user": {"id": 79774, "first_name": "Naman", "last_name": "Aggarwal", "picture": {"small": "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/small_mypic.jpg", "medium": "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg", "large": "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/large_mypic.jpg"}, "custom_picture": true, "email": "*****@*****.**", "registration_status": "confirmed", "locale": "en", "country_code": "IN", "date_format": "MM/DD/YYYY", "default_currency": "SGD", "default_group_id": null, "notifications_read": "2020-07-01T16:00:19Z", "notifications_count": 0, "notifications": {"added_as_friend": true, "added_to_group": true, "expense_added": false, "expense_updated": false, "bills": true, "payments": true, "monthly_summary": true, "announcements": true}}, "errors": []}' # noqa: E501 user = User() user.setId(10) user.setLastName('Aggarwal') updated_user, error = self.sObj.updateUser(user) mockMakeRequest.assert_called_with( "https://secure.splitwise.com/api/v3.0/update_user", "POST", { "id": 10, "last_name": "Aggarwal" }) self.assertEqual(updated_user.getId(), 79774) self.assertEqual(updated_user.getFirstName(), "Naman") self.assertEqual(updated_user.getLastName(), "Aggarwal") self.assertEqual( updated_user.getPicture().getSmall(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/small_mypic.jpg" ) self.assertEqual( updated_user.getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg" ) self.assertEqual( updated_user.getPicture().getLarge(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/large_mypic.jpg" ) self.assertEqual(updated_user.getEmail(), "*****@*****.**") self.assertEqual(updated_user.getRegistrationStatus(), "confirmed") self.assertEqual(updated_user.getLocale(), "en") self.assertEqual(updated_user.getDateFormat(), "MM/DD/YYYY") self.assertEqual(updated_user.getDefaultCurrency(), "SGD") self.assertEqual(updated_user.getDefaultGroupId(), None) self.assertIsNone(error) def test_updateUser_error(self, mockMakeRequest): mockMakeRequest.return_value = '{"user": null, "errors": {"base": ["Unknown error"]} }' # noqa: E501 user = User() user.setId(10) user.setLastName('Aggarwal') updated_user, error = self.sObj.updateUser(user) mockMakeRequest.assert_called_with( "https://secure.splitwise.com/api/v3.0/update_user", "POST", { "id": 10, "last_name": "Aggarwal" }) self.assertIsNone(updated_user) self.assertIsNotNone(error) def test_updateUser_raise_exception_when_no_id(self, mockMakeRequest): user = User() user.setLastName('Aggarwal') with self.assertRaises(SplitwiseBadRequestException): self.sObj.updateUser(user) mockMakeRequest.assert_not_called() def test_updateUser_exception(self, mockMakeRequest): mockMakeRequest.side_effect = Exception( "Invalid response %s. Please check your consumer key and secret." % 404) user = User() user.setId(10) user.setLastName('Aggarwal') with self.assertRaises(Exception): self.sObj.updateUser(user) mockMakeRequest.assert_called_with( "https://secure.splitwise.com/api/v3.0/update_user", "POST", { "id": 10, "last_name": "Aggarwal" })
class CreateExpenseTestCase(unittest.TestCase): def setUp(self): self.sObj = Splitwise('consumerkey', 'consumersecret') @patch('io.open') def test_createExpense_split_equally_with_receipt_success( self, mockOpen, mockMakeRequest): mockFile = MagicMock() mockOpen.return_value = mockFile mockMakeRequest.return_value = '{"expenses":[{"id":1010906976,"group_id":19433671,"friendship_id":null,"expense_bundle_id":null,"description":"Testing","repeats":false,"repeat_interval":"never","email_reminder":false,"email_reminder_in_advance":-1,"next_repeat":null,"details":null,"comments_count":0,"payment":false,"creation_method":null,"transaction_method":"offline","transaction_confirmed":false,"transaction_id":null,"cost":"10.0","currency_code":"SGD","repayments":[{"from":643871,"to":79774,"amount":"5.0"}],"date":"2020-06-24T06:57:29Z","created_at":"2020-06-24T06:57:29Z","created_by":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"},"custom_picture":true},"updated_at":"2020-06-24T06:57:29Z","updated_by":null,"deleted_at":null,"deleted_by":null,"category":{"id":18,"name":"General"},"receipt":{"large":null,"original":null},"users":[{"user":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"}},"user_id":79774,"paid_share":"10.0","owed_share":"5.0","net_balance":"5.0"},{"user":{"id":643871,"first_name":"Shantanu","last_name":"Alshi","picture":{"medium":"https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png"}},"user_id":643871,"paid_share":"0.0","owed_share":"5.0","net_balance":"-5.0"}]}],"errors":{}}' # noqa: E501 expense = Expense() expense.setCost('10') expense.setDescription("Testing") expense.setGroupId(19433671) expense.setSplitEqually() expense.setReceipt("temp.jpg") expenseRes, errors = self.sObj.createExpense(expense) mockMakeRequest.assert_called_with( "https://secure.splitwise.com/api/v3.0/create_expense", "POST", { 'cost': '10', 'description': 'Testing', 'group_id': 19433671, 'split_equally': True, 'receiptPath': 'temp.jpg' }, files={'receipt': mockFile}) self.assertIsNone(errors) self.assertEqual(expenseRes.getId(), 1010906976) self.assertEqual(expenseRes.getGroupId(), 19433671) self.assertEqual(expenseRes.getFriendshipId(), None) self.assertEqual(expenseRes.getExpenseBundleId(), None) self.assertEqual(expenseRes.getDescription(), "Testing") self.assertEqual(expenseRes.getRepeatInterval(), "never") self.assertEqual(expenseRes.getEmailReminderInAdvance(), -1) self.assertEqual(expenseRes.getNextRepeat(), None) self.assertEqual(expenseRes.getDetails(), None) self.assertEqual(expenseRes.getCommentsCount(), 0) self.assertEqual(expenseRes.getCreationMethod(), None) self.assertEqual(expenseRes.getTransactionMethod(), "offline") self.assertEqual(expenseRes.getTransactionId(), None) self.assertEqual(expenseRes.getCost(), "10.0") self.assertEqual(expenseRes.getCurrencyCode(), "SGD") self.assertEqual(len(expenseRes.getRepayments()), 1) self.assertEqual(expenseRes.getRepayments()[0].getFromUser(), 643871) self.assertEqual(expenseRes.getRepayments()[0].getToUser(), 79774) self.assertEqual(expenseRes.getRepayments()[0].getAmount(), "5.0") self.assertEqual(expenseRes.getDate(), "2020-06-24T06:57:29Z") self.assertEqual(expenseRes.getCreatedAt(), "2020-06-24T06:57:29Z") self.assertEqual(expenseRes.getCreatedBy().getId(), 79774) self.assertEqual(expenseRes.getCreatedBy().getFirstName(), "Naman") self.assertEqual(expenseRes.getCreatedBy().getLastName(), "Aggarwal") self.assertEqual( expenseRes.getCreatedBy().getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg" ) self.assertEqual(expenseRes.getUpdatedAt(), "2020-06-24T06:57:29Z") self.assertEqual(expenseRes.getUpdatedBy(), None) self.assertEqual(expenseRes.getDeletedAt(), None) self.assertEqual(expenseRes.getDeletedBy(), None) self.assertEqual(expenseRes.getCategory().getId(), 18) self.assertEqual(expenseRes.getCategory().getName(), "General") self.assertEqual(expenseRes.getReceipt().getLarge(), None) self.assertEqual(expenseRes.getReceipt().getOriginal(), None) self.assertEqual(len(expenseRes.getUsers()), 2) self.assertEqual(expenseRes.getUsers()[0].getId(), 79774) self.assertEqual(expenseRes.getUsers()[0].getFirstName(), "Naman") self.assertEqual(expenseRes.getUsers()[0].getLastName(), "Aggarwal") self.assertEqual( expenseRes.getUsers()[0].getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg" ) self.assertEqual(expenseRes.getUsers()[0].getPaidShare(), "10.0") self.assertEqual(expenseRes.getUsers()[0].getOwedShare(), "5.0") self.assertEqual(expenseRes.getUsers()[0].getNetBalance(), "5.0") self.assertEqual(expenseRes.getUsers()[1].getId(), 643871) self.assertEqual(expenseRes.getUsers()[1].getFirstName(), "Shantanu") self.assertEqual(expenseRes.getUsers()[1].getLastName(), "Alshi") self.assertEqual( expenseRes.getUsers()[1].getPicture().getMedium(), "https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png" ) self.assertEqual(expenseRes.getUsers()[1].getPaidShare(), "0.0") self.assertEqual(expenseRes.getUsers()[1].getOwedShare(), "5.0") self.assertEqual(expenseRes.getUsers()[1].getNetBalance(), "-5.0") mockOpen.assert_called_with("temp.jpg", "rb") def test_createExpense_split_equally_success(self, mockMakeRequest): mockMakeRequest.return_value = '{"expenses":[{"id":1010906976,"group_id":19433671,"friendship_id":null,"expense_bundle_id":null,"description":"Testing","repeats":false,"repeat_interval":"never","email_reminder":false,"email_reminder_in_advance":-1,"next_repeat":null,"details":null,"comments_count":0,"payment":false,"creation_method":null,"transaction_method":"offline","transaction_confirmed":false,"transaction_id":null,"cost":"10.0","currency_code":"SGD","repayments":[{"from":643871,"to":79774,"amount":"5.0"}],"date":"2020-06-24T06:57:29Z","created_at":"2020-06-24T06:57:29Z","created_by":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"},"custom_picture":true},"updated_at":"2020-06-24T06:57:29Z","updated_by":null,"deleted_at":null,"deleted_by":null,"category":{"id":18,"name":"General"},"receipt":{"large":null,"original":null},"users":[{"user":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"}},"user_id":79774,"paid_share":"10.0","owed_share":"5.0","net_balance":"5.0"},{"user":{"id":643871,"first_name":"Shantanu","last_name":"Alshi","picture":{"medium":"https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png"}},"user_id":643871,"paid_share":"0.0","owed_share":"5.0","net_balance":"-5.0"}]}],"errors":{}}' # noqa: E501 expense = Expense() expense.setCost('10') expense.setDescription("Testing") expense.setGroupId(19433671) expense.setSplitEqually() expenseRes, errors = self.sObj.createExpense(expense) mockMakeRequest.assert_called_with( "https://secure.splitwise.com/api/v3.0/create_expense", "POST", { 'cost': '10', 'description': 'Testing', 'group_id': 19433671, 'split_equally': True }, files=None) self.assertIsNone(errors) self.assertEqual(expenseRes.getId(), 1010906976) self.assertEqual(expenseRes.getGroupId(), 19433671) self.assertEqual(expenseRes.getFriendshipId(), None) self.assertEqual(expenseRes.getExpenseBundleId(), None) self.assertEqual(expenseRes.getDescription(), "Testing") self.assertEqual(expenseRes.getRepeatInterval(), "never") self.assertEqual(expenseRes.getEmailReminderInAdvance(), -1) self.assertEqual(expenseRes.getNextRepeat(), None) self.assertEqual(expenseRes.getDetails(), None) self.assertEqual(expenseRes.getCommentsCount(), 0) self.assertEqual(expenseRes.getCreationMethod(), None) self.assertEqual(expenseRes.getTransactionMethod(), "offline") self.assertEqual(expenseRes.getTransactionId(), None) self.assertEqual(expenseRes.getCost(), "10.0") self.assertEqual(expenseRes.getCurrencyCode(), "SGD") self.assertEqual(len(expenseRes.getRepayments()), 1) self.assertEqual(expenseRes.getRepayments()[0].getFromUser(), 643871) self.assertEqual(expenseRes.getRepayments()[0].getToUser(), 79774) self.assertEqual(expenseRes.getRepayments()[0].getAmount(), "5.0") self.assertEqual(expenseRes.getDate(), "2020-06-24T06:57:29Z") self.assertEqual(expenseRes.getCreatedAt(), "2020-06-24T06:57:29Z") self.assertEqual(expenseRes.getCreatedBy().getId(), 79774) self.assertEqual(expenseRes.getCreatedBy().getFirstName(), "Naman") self.assertEqual(expenseRes.getCreatedBy().getLastName(), "Aggarwal") self.assertEqual( expenseRes.getCreatedBy().getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg" ) self.assertEqual(expenseRes.getUpdatedAt(), "2020-06-24T06:57:29Z") self.assertEqual(expenseRes.getUpdatedBy(), None) self.assertEqual(expenseRes.getDeletedAt(), None) self.assertEqual(expenseRes.getDeletedBy(), None) self.assertEqual(expenseRes.getCategory().getId(), 18) self.assertEqual(expenseRes.getCategory().getName(), "General") self.assertEqual(expenseRes.getReceipt().getLarge(), None) self.assertEqual(expenseRes.getReceipt().getOriginal(), None) self.assertEqual(len(expenseRes.getUsers()), 2) self.assertEqual(expenseRes.getUsers()[0].getId(), 79774) self.assertEqual(expenseRes.getUsers()[0].getFirstName(), "Naman") self.assertEqual(expenseRes.getUsers()[0].getLastName(), "Aggarwal") self.assertEqual( expenseRes.getUsers()[0].getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg" ) self.assertEqual(expenseRes.getUsers()[0].getPaidShare(), "10.0") self.assertEqual(expenseRes.getUsers()[0].getOwedShare(), "5.0") self.assertEqual(expenseRes.getUsers()[0].getNetBalance(), "5.0") self.assertEqual(expenseRes.getUsers()[1].getId(), 643871) self.assertEqual(expenseRes.getUsers()[1].getFirstName(), "Shantanu") self.assertEqual(expenseRes.getUsers()[1].getLastName(), "Alshi") self.assertEqual( expenseRes.getUsers()[1].getPicture().getMedium(), "https://s3.amazonaws.com/splitwise/uploads/user/default_avatars/avatar-blue19-100px.png" ) self.assertEqual(expenseRes.getUsers()[1].getPaidShare(), "0.0") self.assertEqual(expenseRes.getUsers()[1].getOwedShare(), "5.0") self.assertEqual(expenseRes.getUsers()[1].getNetBalance(), "-5.0") def test_createExpense_split_manually_success(self, mockMakeRequest): mockMakeRequest.return_value = '{"expenses":[{"id":1010934284,"group_id":null,"friendship_id":null,"expense_bundle_id":null,"description":"Testing","repeats":false,"repeat_interval":"never","email_reminder":false,"email_reminder_in_advance":-1,"next_repeat":null,"details":null,"comments_count":0,"payment":false,"creation_method":null,"transaction_method":"offline","transaction_confirmed":false,"transaction_id":null,"cost":"10.0","currency_code":"SGD","repayments":[{"from":281236,"to":79774,"amount":"8.0"}],"date":"2020-06-24T08:14:07Z","created_at":"2020-06-24T08:14:07Z","created_by":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"},"custom_picture":true},"updated_at":"2020-06-24T08:14:07Z","updated_by":null,"deleted_at":null,"deleted_by":null,"category":{"id":18,"name":"General"},"receipt":{"large":null,"original":null},"users":[{"user":{"id":79774,"first_name":"Naman","last_name":"Aggarwal","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg"}},"user_id":79774,"paid_share":"10.0","owed_share":"2.0","net_balance":"8.0"},{"user":{"id":281236,"first_name":"Siddharth","last_name":"Goel","picture":{"medium":"https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/medium_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg"}},"user_id":281236,"paid_share":"0.0","owed_share":"8.0","net_balance":"-8.0"}]}],"errors":{}}' # noqa: E501 expense = Expense() expense.setCost('10') expense.setDescription("Testing") user1 = ExpenseUser() user1.setId(79774) user1.setPaidShare('10.00') user1.setOwedShare('2.0') user2 = ExpenseUser() user2.setId(281236) user2.setPaidShare('0.00') user2.setOwedShare('8.00') users = [] users.append(user1) users.append(user2) expense.setUsers(users) expenseRes, errors = self.sObj.createExpense(expense) mockMakeRequest.assert_called_with( "https://secure.splitwise.com/api/v3.0/create_expense", "POST", { 'cost': '10', 'description': 'Testing', 'users__0__user_id': 79774, 'users__0__paid_share': '10.00', 'users__0__owed_share': '2.0', 'users__1__user_id': 281236, 'users__1__paid_share': '0.00', 'users__1__owed_share': '8.00' }, files=None) self.assertIsNone(errors) self.assertEqual(expenseRes.getId(), 1010934284) self.assertEqual(expenseRes.getGroupId(), None) self.assertEqual(expenseRes.getFriendshipId(), None) self.assertEqual(expenseRes.getExpenseBundleId(), None) self.assertEqual(expenseRes.getDescription(), "Testing") self.assertEqual(expenseRes.getRepeatInterval(), "never") self.assertEqual(expenseRes.getEmailReminderInAdvance(), -1) self.assertEqual(expenseRes.getNextRepeat(), None) self.assertEqual(expenseRes.getDetails(), None) self.assertEqual(expenseRes.getCommentsCount(), 0) self.assertEqual(expenseRes.getCreationMethod(), None) self.assertEqual(expenseRes.getTransactionMethod(), "offline") self.assertEqual(expenseRes.getTransactionId(), None) self.assertEqual(expenseRes.getCost(), "10.0") self.assertEqual(expenseRes.getCurrencyCode(), "SGD") self.assertEqual(len(expenseRes.getRepayments()), 1) self.assertEqual(expenseRes.getRepayments()[0].getFromUser(), 281236) self.assertEqual(expenseRes.getRepayments()[0].getToUser(), 79774) self.assertEqual(expenseRes.getRepayments()[0].getAmount(), "8.0") self.assertEqual(expenseRes.getDate(), "2020-06-24T08:14:07Z") self.assertEqual(expenseRes.getCreatedAt(), "2020-06-24T08:14:07Z") self.assertEqual(expenseRes.getCreatedBy().getId(), 79774) self.assertEqual(expenseRes.getCreatedBy().getFirstName(), "Naman") self.assertEqual(expenseRes.getCreatedBy().getLastName(), "Aggarwal") self.assertEqual( expenseRes.getCreatedBy().getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg" ) self.assertEqual(expenseRes.getUpdatedAt(), "2020-06-24T08:14:07Z") self.assertEqual(expenseRes.getUpdatedBy(), None) self.assertEqual(expenseRes.getDeletedAt(), None) self.assertEqual(expenseRes.getDeletedBy(), None) self.assertEqual(expenseRes.getCategory().getId(), 18) self.assertEqual(expenseRes.getCategory().getName(), "General") self.assertEqual(expenseRes.getReceipt().getLarge(), None) self.assertEqual(expenseRes.getReceipt().getOriginal(), None) self.assertEqual(len(expenseRes.getUsers()), 2) self.assertEqual(expenseRes.getUsers()[0].getId(), 79774) self.assertEqual(expenseRes.getUsers()[0].getFirstName(), "Naman") self.assertEqual(expenseRes.getUsers()[0].getLastName(), "Aggarwal") self.assertEqual( expenseRes.getUsers()[0].getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/79774/medium_mypic.jpg" ) self.assertEqual(expenseRes.getUsers()[0].getPaidShare(), "10.0") self.assertEqual(expenseRes.getUsers()[0].getOwedShare(), "2.0") self.assertEqual(expenseRes.getUsers()[0].getNetBalance(), "8.0") self.assertEqual(expenseRes.getUsers()[1].getId(), 281236) self.assertEqual(expenseRes.getUsers()[1].getFirstName(), "Siddharth") self.assertEqual(expenseRes.getUsers()[1].getLastName(), "Goel") self.assertEqual( expenseRes.getUsers()[1].getPicture().getMedium(), "https://splitwise.s3.amazonaws.com/uploads/user/avatar/281236/medium_f5fccc37-0a88-4519-9398-59c8c19b92aa.jpeg" ) self.assertEqual(expenseRes.getUsers()[1].getPaidShare(), "0.0") self.assertEqual(expenseRes.getUsers()[1].getOwedShare(), "8.0") self.assertEqual(expenseRes.getUsers()[1].getNetBalance(), "-8.0") def test_createExpense_error(self, mockMakeRequest): mockMakeRequest.return_value = '{"expenses":[],"errors":{"base":["An unknown error occurred. Please try again or contact [email protected] if you experience repeated issues. Sorry for the trouble!"]}}' # noqa: E501 expense = Expense() expense.setCost('10') expense.setDescription("Testing") user1 = ExpenseUser() user1.setId(79774) user1.setPaidShare('10.00') user1.setOwedShare('2.0') user2 = ExpenseUser() user2.setId(281236) user2.setPaidShare('0.00') user2.setOwedShare('8.00') users = [] users.append(user1) users.append(user2) expense.setUsers(users) expenseRes, errors = self.sObj.createExpense(expense) mockMakeRequest.assert_called_with( "https://secure.splitwise.com/api/v3.0/create_expense", "POST", { 'cost': '10', 'description': 'Testing', 'users__0__user_id': 79774, 'users__0__paid_share': '10.00', 'users__0__owed_share': '2.0', 'users__1__user_id': 281236, 'users__1__paid_share': '0.00', 'users__1__owed_share': '8.00' }, files=None) self.assertEqual( errors.getErrors(), { 'base': [ 'An unknown error occurred. Please try again or contact [email protected] if you experience repeated issues. \ Sorry for the trouble!' ] }) def test_createExpense_exception(self, mockMakeRequest): mockMakeRequest.side_effect = Exception( "Invalid response %s. Please check your consumer key and secret." % 404) expense = Expense() expense.setCost('10') expense.setDescription("Testing") user1 = ExpenseUser() user1.setId(79774) user1.setPaidShare('10.00') user1.setOwedShare('2.0') user2 = ExpenseUser() user2.setId(281236) user2.setPaidShare('0.00') user2.setOwedShare('8.00') users = [] users.append(user1) users.append(user2) expense.setUsers(users) with self.assertRaises(Exception): expenseRes, errors = self.sObj.createExpense(expense) mockMakeRequest.assert_called_with( "https://secure.splitwise.com/api/v3.0/create_expense", "POST", { 'cost': '10', 'description': 'Testing', 'users__0__user_id': 79774, 'users__0__paid_share': '10.00', 'users__0__owed_share': '2.0', 'users__1__user_id': 281236, 'users__1__paid_share': '0.00', 'users__1__owed_share': '8.00' }, files=None)