Example #1
0
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)
Example #3
0
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')
Example #5
0
def login():
    wise = Splitwise('consumer_key', 'consumer_secret')
    url, secret = wise.getAuthorizeURL()
    session[KEY_SECRET] = secret
    return redirect(url)
Example #6
0
 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
Example #7
0
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")
Example #9
0
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()
Example #10
0
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
Example #11
0
File: app.py Project: omijn/tmo
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()
Example #12
0
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"
            })
Example #14
0
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)