def test_cancellation(self): Transaction.objects.create(from_user=None, to_user=self.user, amount=10000000, verified=True) today = date.today() for date_pair in ( (today - timedelta(days=1), today), (today + timedelta(days=5), today + timedelta(days=7)), (today + timedelta(days=10), today + timedelta(days=12)), (today + timedelta(days=15), today + timedelta(days=17)), ): self.selenium_client.get( '/reservation/{}/?from_date={}&to_date={}'.format( self.habitat.id, *date_pair)) button = self.selenium_client.web_driver.find_elements_by_tag_name( 'input')[-1] button.location_once_scrolled_into_view button.click() sleep(1) button = self.selenium_client.web_driver.find_element_by_link_text( 'بله') button.location_once_scrolled_into_view button.click() sleep(1) self.assertEqual(Transaction.get_balance_from_user(self.user), 10000000 - self.cost_per_day * 6) # do a little stupid thing to travel in the time for reservation in Reservation.objects.all(): reservation.from_date -= timedelta(days=5) reservation.to_date -= timedelta(days=5) reservation.save() self.selenium_client.get('/reservation/list') cancel_buttons = self.get_cancel_buttons() self.assertEqual(len(cancel_buttons), 2) cancel_buttons[0].click() sleep(1) cancel_buttons = self.get_cancel_buttons() self.assertEqual(len(cancel_buttons), 1) cancel_buttons[0].click() sleep(1) cancel_buttons = self.get_cancel_buttons() self.assertEqual(len(cancel_buttons), 0) punishment = self.cost_per_day * 2 * settings.CANCELLATION_FEE * 5 self.assertEqual(Transaction.get_balance_from_user(self.user), 10000000 - self.cost_per_day * 2 - punishment) self.assertEqual( Transaction.get_balance_from_user(self.habitat_owner_user), self.cost_per_day * 2 * (1 - settings.RESERVATION_FEE) + punishment)
def test_login_redirect(self): self.selenium_client.logout() Transaction.objects.create(from_user=None, to_user=self.user, amount=10000000, verified=True) self.selenium_client.get( '/reservation/{}/?persons=1&from_date={}&to_date={}'.format( self.habitat.id, date.today() + timedelta(days=50), date.today() + timedelta(days=52), )) button = self.selenium_client.web_driver.find_elements_by_tag_name( 'input')[-1] button.location_once_scrolled_into_view button.click() sleep(1) self.selenium_client.login_without_navigation('ali', 'hello') button = self.selenium_client.web_driver.find_elements_by_tag_name( 'input')[-1] button.location_once_scrolled_into_view button.click() sleep(1) button = self.selenium_client.web_driver.find_element_by_link_text( 'بله') button.location_once_scrolled_into_view button.click() sleep(1) self.assertEqual(Transaction.get_balance_from_user(self.user), 10000000 - self.cost_per_day * 2)
def test_withdrawal_request(self): # request withdrawal self.client.force_login(self.user) post_url = self.navigate_to_withdrawal_page() amount = self.prior_balance // 2 response = self.client.post(post_url, data={'amount': amount}, follow=True) self.assertTrue( 'درخواست شما ثبت شد.' in response.content.decode('utf8')) transaction = Transaction.objects.last() self.client.logout() # approve withdrawal self.client.force_login(self.staff_user) post_url, response = self.navigate_to_withdrawal_approval_page() self.assertTrue( transaction.from_user.username in response.content.decode('utf8')) self.assertTrue( str(transaction.amount) in response.content.decode('utf8')) response = self.client.post(post_url, data={'verified': '1'}, follow=True) self.assertFalse( str(transaction.amount) in response.content.decode('utf8')) transaction.refresh_from_db() self.assertTrue(transaction.verified) self.assertEqual(Transaction.get_balance_from_user(self.user), self.prior_balance - amount)
def clean(self): cleaned_data = super().clean() room_type = cleaned_data.get('room') from_date = cleaned_data.get('from_date') to_date = cleaned_data.get('to_date') if from_date and to_date: if to_date <= from_date: raise ValidationError('بازه زمانی رزرو صحیح نیست.') if room_type: if not room_type.has_empty_room(from_date, to_date): raise ValidationError('اتاق در این زمان خالی نیست.') days = (to_date - from_date) / timedelta(days=1) required_money = room_type.cost_per_night * days self.cost = required_money balance = Transaction.get_balance_from_user(self.member.user) if balance < required_money: self.amount_required = required_money - balance raise ValidationError( 'باید حداقل {} در حساب خود داشته باشید. لطفا حساب خود را شارژ کنید.' .format(required_money))
def balance(self): return Transaction.get_balance_from_user(self.user)
def clean_amount(self): amount = self.cleaned_data['amount'] if amount > Transaction.get_balance_from_user(self.request.user): raise ValidationError('مبلغ بیش از موجودی حساب شماست.') return amount