5
5
from django .contrib .auth .models import User
6
6
from django .contrib .sites .models import Site
7
7
from django .core .cache import cache
8
+ from django .utils import timezone
8
9
9
10
from last_seen .models import LastSeen , user_seen , clear_interval
10
11
from last_seen import settings
@@ -23,45 +24,99 @@ def test_unicode(self):
23
24
24
25
class TestLastSeenManager (TestCase ):
25
26
26
- @mock .patch ('last_seen.models.LastSeen.objects.create' , autospec = True )
27
- @mock .patch ('last_seen.models.LastSeen.objects.filter' , autospec = True )
28
- def test_seen (self , filter , create ):
29
- user = User (username = 'testuser' )
30
- filter .return_value .update .return_value = 1
27
+ @mock .patch ('last_seen.models.LastSeen.objects.get_or_create' ,
28
+ autospec = True )
29
+ def test_seen (self , get_or_create ):
30
+ user = User (username = 'testuser' , pk = 1 )
31
+ lastseen = mock .Mock (LastSeen )
32
+ get_or_create .return_value = (lastseen , True )
31
33
32
34
LastSeen .objects .seen (user = user )
33
35
34
- filter .assert_called_with (user = user ,
36
+ get_or_create .assert_called_with (user = user ,
35
37
module = settings .LAST_SEEN_DEFAULT_MODULE ,
36
38
site = Site .objects .get_current ())
37
- self .assertFalse (create .called )
39
+ self .assertFalse (lastseen . save .called )
38
40
39
- @mock .patch ('last_seen.models.LastSeen.objects.create' , autospec = True )
40
- @ mock . patch ( 'last_seen.models.LastSeen.objects.filter' , autospec = True )
41
- def test_seen_no_default (self , filter , create ):
42
- user = User (username = 'testuser' )
41
+ @mock .patch ('last_seen.models.LastSeen.objects.get_or_create' ,
42
+ autospec = True )
43
+ def test_seen_no_default (self , get_or_create ):
44
+ user = User (username = 'testuser' , pk = 1 )
43
45
site = Site (pk = 2 )
44
- filter .return_value . update . return_value = 1
46
+ get_or_create .return_value = ( None , True )
45
47
46
48
LastSeen .objects .seen (user = user , site = site , module = "test" )
47
49
48
- filter .assert_called_with (user = user , module = "test" , site = site )
49
- self .assertFalse (create .called )
50
+ get_or_create .assert_called_with (user = user , module = "test" , site = site )
50
51
51
- @mock .patch ('last_seen.models.LastSeen.objects.create' , autospec = True )
52
- @ mock . patch ( 'last_seen.models.LastSeen.objects.filter' , autospec = True )
53
- def test_seen_create (self , filter , create ):
52
+ @mock .patch ('last_seen.models.LastSeen.objects.get_or_create' ,
53
+ autospec = True )
54
+ def test_seen_create (self , get_or_create ):
54
55
user = User (username = 'testuser' )
55
- filter .return_value .update .return_value = 0
56
+ lastseen = mock .Mock (LastSeen )
57
+ get_or_create .return_value = (lastseen , True )
56
58
57
59
LastSeen .objects .seen (user = user )
58
60
59
- filter .assert_called_with (user = user ,
61
+ get_or_create .assert_called_with (user = user ,
62
+ module = settings .LAST_SEEN_DEFAULT_MODULE ,
63
+ site = Site .objects .get_current ())
64
+ self .assertFalse (lastseen .save .called )
65
+
66
+ @mock .patch ('last_seen.models.LastSeen.objects.get_or_create' ,
67
+ autospec = True )
68
+ def test_seen_update (self , get_or_create ):
69
+ user = User (username = 'testuser' )
70
+ lastseen = mock .Mock (LastSeen )
71
+ # force last seen old
72
+ old_time = timezone .now () - \
73
+ datetime .timedelta (seconds = (settings .LAST_SEEN_INTERVAL * 2 ))
74
+ lastseen .last_seen = old_time
75
+ get_or_create .return_value = (lastseen , False )
76
+
77
+ ret = LastSeen .objects .seen (user = user )
78
+
79
+ get_or_create .assert_called_with (user = user ,
80
+ module = settings .LAST_SEEN_DEFAULT_MODULE ,
81
+ site = Site .objects .get_current ())
82
+ self .assertTrue (lastseen .save .called )
83
+ self .assertNotEqual (ret .last_seen , old_time )
84
+
85
+ @mock .patch ('last_seen.models.LastSeen.objects.get_or_create' ,
86
+ autospec = True )
87
+ def test_seen_update_forced (self , get_or_create ):
88
+ user = User (username = 'testuser' )
89
+ lastseen = mock .Mock (LastSeen )
90
+ # force last seen old
91
+ old_time = timezone .now ()
92
+ lastseen .last_seen = old_time
93
+ get_or_create .return_value = (lastseen , False )
94
+
95
+ ret = LastSeen .objects .seen (user = user , force = True )
96
+
97
+ get_or_create .assert_called_with (user = user ,
60
98
module = settings .LAST_SEEN_DEFAULT_MODULE ,
61
99
site = Site .objects .get_current ())
62
- create .assert_called_with (user = user ,
100
+ self .assertTrue (lastseen .save .called )
101
+ self .assertNotEqual (ret .last_seen , old_time )
102
+
103
+ @mock .patch ('last_seen.models.LastSeen.objects.get_or_create' ,
104
+ autospec = True )
105
+ def test_seen_found_not_updated (self , get_or_create ):
106
+ user = User (username = 'testuser' )
107
+ lastseen = mock .Mock (LastSeen )
108
+ # force last seen old
109
+ old_time = timezone .now ()
110
+ lastseen .last_seen = old_time
111
+ get_or_create .return_value = (lastseen , False )
112
+
113
+ ret = LastSeen .objects .seen (user = user )
114
+
115
+ get_or_create .assert_called_with (user = user ,
63
116
module = settings .LAST_SEEN_DEFAULT_MODULE ,
64
117
site = Site .objects .get_current ())
118
+ self .assertFalse (lastseen .save .called )
119
+ self .assertEqual (ret .last_seen , old_time )
65
120
66
121
def test_when_non_existent (self ):
67
122
user = User (username = 'testuser' , pk = 1 )
@@ -92,9 +147,13 @@ def test_seen_site(self, filter):
92
147
93
148
class TestUserSeen (TestCase ):
94
149
150
+ def setUp (self ):
151
+ [cache .delete (key ) for key in cache ._cache .keys ()]
152
+
95
153
@mock .patch ('last_seen.models.LastSeen.objects.seen' , autospec = True )
96
154
def test_user_seen (self , seen ):
97
- user = User (username = 'testuser' , pk = 1 )
155
+ user = User (username = 'testuser' , pk = 999 )
156
+
98
157
user_seen (user )
99
158
site = Site .objects .get_current ()
100
159
seen .assert_called_with (user , module = settings .LAST_SEEN_DEFAULT_MODULE ,
@@ -140,8 +199,8 @@ def test_clear_interval(self, cache, filter):
140
199
clear_interval (user )
141
200
142
201
filter .assert_called_with (user = user )
143
- expected = [ 'last_seen:1:mod1:1' , 'last_seen:1:mod2:1' ]
144
- cache .delete_many .assert_called_with (expected )
202
+ expected = { 'last_seen:1:mod1:1' : - 1 , 'last_seen:1:mod2:1' : - 1 }
203
+ cache .set_many .assert_called_with (expected )
145
204
146
205
@mock .patch ('last_seen.models.LastSeen.objects.filter' , autospec = True )
147
206
@mock .patch ('last_seen.models.cache' , autospec = True )
@@ -154,6 +213,17 @@ def test_clear_interval_none(self, cache, filter):
154
213
filter .assert_called_with (user = user )
155
214
self .assertFalse (cache .delete_many .called )
156
215
216
+ def test_clear_interval_works (self ):
217
+ user = User .objects .create (username = 'testuser' )
218
+
219
+ user_seen (user )
220
+ when1 = LastSeen .objects .when (user = user )
221
+ clear_interval (user )
222
+ user_seen (user )
223
+ when2 = LastSeen .objects .when (user = user )
224
+
225
+ self .assertNotEqual (when1 , when2 )
226
+
157
227
158
228
class TestMiddleware (TestCase ):
159
229
0 commit comments