Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--gajim/common/helpers.py35
-rw-r--r--test/common/test_get_uf_relative_time.py89
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()