diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | gajim/common/helpers.py | 35 | ||||
-rw-r--r-- | test/common/test_get_uf_relative_time.py | 89 |
3 files changed, 111 insertions, 14 deletions
diff --git a/.gitignore b/.gitignore index b6d34d8fe..08e2f0b64 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ node_modules/ .vscode *.sublime-project *.sublime-workspace +.idea diff --git a/gajim/common/helpers.py b/gajim/common/helpers.py index 5e9269591..e9bc17c6d 100644 --- a/gajim/common/helpers.py +++ b/gajim/common/helpers.py @@ -248,29 +248,36 @@ def get_uf_affiliation(affiliation: Union[Affiliation, str], return '' -def get_uf_relative_time(timestamp: float) -> str: +def get_uf_relative_time(timestamp: float, + timenow: Optional[float] = None) -> str: date_time = datetime.fromtimestamp(timestamp) - now = datetime.now() + if timenow: # used by unittest + now = datetime.fromtimestamp(timenow) + else: + now = datetime.now() timespan = now - date_time - if timespan > timedelta(days=365): - return str(date_time.year) - if timespan > timedelta(days=7): - return date_time.strftime('%b %d') - if timespan > timedelta(days=2): - return date_time.strftime('%a') - if date_time.strftime('%d') != now.strftime('%d'): - return _('Yesterday') - if timespan > timedelta(minutes=15): - return date_time.strftime('%H:%M') - if timespan > timedelta(minutes=1): + if timespan < timedelta(minutes=1): + return _('Just now') + if timespan < timedelta(minutes=15): minutes = int(timespan.seconds / 60) return ngettext('%i min ago', '%i mins ago', minutes, minutes, minutes) - return _('Just now') + today = now.date() + if date_time.date() == today: + format_string = app.settings.get('time_format') + return date_time.strftime(format_string) + yesterday = now.date() - timedelta(days=1) + if date_time.date() == yesterday: + return _('Yesterday') + if timespan < timedelta(days=7): # this week + return date_time.strftime('%a') # weekday + if timespan < timedelta(days=365): # this year + return date_time.strftime('%b %d') + return str(date_time.year) def to_one_line(msg: str) -> str: diff --git a/test/common/test_get_uf_relative_time.py b/test/common/test_get_uf_relative_time.py new file mode 100644 index 000000000..b1d22e1cd --- /dev/null +++ b/test/common/test_get_uf_relative_time.py @@ -0,0 +1,89 @@ + +import unittest +from datetime import datetime +from datetime import timedelta +from datetime import timezone + +from gajim.common import app +from gajim.common.helpers import get_uf_relative_time +from gajim.common.settings import Settings + +app.settings = Settings(in_memory=True) + + +class GetRelativeTimeTest(unittest.TestCase): + '''Tests for the get_uf_relative_time function.''' + + def test_sub_1_minute(self): + '''Test timedelta less than 1 minute''' + timenow = datetime(2023, 1, 2, 3, 4, 0, tzinfo=timezone.utc) + timestamp1 = timenow - timedelta(seconds=30) + self.assertEqual(get_uf_relative_time(timestamp1.timestamp(), + timenow.timestamp()), 'Just now') + + def test_sub_15_minutes(self): + '''Test timedelta less than 15 minutes and more than 1 minute ago''' + timenow = datetime(2023, 1, 2, 3, 4, 0, tzinfo=timezone.utc) + timestamp1 = timenow - timedelta(minutes=3) + self.assertEqual(get_uf_relative_time(timestamp1.timestamp(), + timenow.timestamp()), + '3 mins ago') + + def test_sub_15_minutes_next_day(self): + '''Test timedelta less than 15 minutes and it is the next day''' + timenow = datetime(2023, 1, 1, 0, 5, 0, tzinfo=timezone.utc) + timestamp1 = timenow - timedelta(minutes=10) + self.assertEqual(get_uf_relative_time(timestamp1.timestamp(), + timenow.timestamp()), + '10 mins ago') + + def test_today(self): + '''Test today: same day and more than 15 minutes ago''' + timenow = datetime(2023, 1, 2, 12, 0, 0, tzinfo=timezone.utc) + timestamp1 = timenow - timedelta(hours=4) + self.assertEqual(get_uf_relative_time(timestamp1.timestamp(), + timenow.timestamp()), + timestamp1.strftime(app.settings.get('time_format'))) + + def test_yesterday_less_than_24h(self): + '''Test yesterday and less than 24h ago''' + timenow = datetime(2023, 1, 2, 12, 0, 0, tzinfo=timezone.utc) + timestamp1 = datetime(2023, 1, 1, 14, 0, 0, tzinfo=timezone.utc) + self.assertEqual(get_uf_relative_time(timestamp1.timestamp(), + timenow.timestamp()), 'Yesterday') + + def test_yesterday_more_than_24h(self): + '''Test yesterday and more than 24h ago''' + timenow = datetime(2023, 1, 2, 12, 0, 0, tzinfo=timezone.utc) + timestamp1 = datetime(2023, 1, 1, 10, 0, 0, tzinfo=timezone.utc) + self.assertEqual(get_uf_relative_time(timestamp1.timestamp(), + timenow.timestamp()), + 'Yesterday') + + def test_weekday(self): + '''Test weekday: timestamp older than yesterday and less + than 7 days ago, should return the weekday, i.e. 'Sun' for Sunday''' + timenow = datetime(2023, 1, 5, 1, 2, 3, tzinfo=timezone.utc) + timestamp1 = datetime(2023, 1, 1, 4, 5, 6, tzinfo=timezone.utc) + self.assertEqual(get_uf_relative_time(timestamp1.timestamp(), + timenow.timestamp()), + timestamp1.strftime('%a')) + + def test_month_day(self): + '''Test month_day: timestamp more than 7 days ago but less than 365''' + timenow = datetime(2023, 1, 5, 1, 2, 3, tzinfo=timezone.utc) + timestamp1 = datetime(2022, 11, 15, 4, 5, 6, tzinfo=timezone.utc) + self.assertEqual(get_uf_relative_time(timestamp1.timestamp(), + timenow.timestamp()), + timestamp1.strftime('%b %d')) + + def test_year(self): + '''Test year: timestamp more than 365 days ago''' + timenow = datetime(2023, 1, 5, 1, 2, 3, tzinfo=timezone.utc) + timestamp1 = datetime(2022, 1, 1, 4, 5, 6, tzinfo=timezone.utc) + self.assertEqual(get_uf_relative_time(timestamp1.timestamp(), + timenow.timestamp()), '2022') + + +if __name__ == '__main__': + unittest.main() |