1
+ import signal
2
+ import threading
1
3
import unittest
4
+ import sys
5
+
6
+ if sys .version_info > (3 , 0 ):
7
+ from queue import Queue
8
+ else :
9
+ from Queue import Queue
2
10
3
11
from django .conf import settings
4
12
from django .template import Template , Context
8
16
from menu import Menu , MenuItem
9
17
10
18
# XXX TODO: test MENU_HIDE_EMPTY
11
- # XXX TODO: test check_children
12
19
13
20
class MenuTests (TestCase ):
14
21
"""
@@ -52,7 +59,7 @@ def kids3_1(request):
52
59
]
53
60
54
61
kids3 = (
55
- MenuItem ("kids3-1" , "/parent3/kids3-1" , children = kids3_1 ),
62
+ MenuItem ("kids3-1" , "/parent3/kids3-1" , children = kids3_1 , slug = "salty" ),
56
63
MenuItem (kids3_2_title , "/parent3/kids3-2" )
57
64
)
58
65
@@ -68,74 +75,107 @@ def kids3_1(request):
68
75
69
76
self .factory = RequestFactory ()
70
77
78
+ def test_thread_safety_and_checks (self ):
79
+ """
80
+ Ensure our thread safety works, this also ensures our checks work
81
+ """
82
+ # this shouldn't ever take more than 5 seconds, add a safety in case someting breaks
83
+ signal .alarm (5 )
84
+
85
+ def t1 (results ):
86
+ "Closure for thread 1"
87
+ request = self .factory .get ('/kids2-2/visible' )
88
+ items = Menu .process (request , 'test' )
89
+ results .put_nowait (len (items [0 ].children ) == 2 )
90
+
91
+ def t2 (results ):
92
+ "Closure for thread 2"
93
+ request = self .factory .get ('/kids2-2/hidden' )
94
+ items = Menu .process (request , 'test' )
95
+ results .put_nowait (len (items [0 ].children ) == 1 )
96
+
97
+ results = Queue ()
98
+ for _ in range (50 ):
99
+ threads = [
100
+ threading .Thread (target = t1 , args = (results ,)),
101
+ threading .Thread (target = t2 , args = (results ,))
102
+ ]
103
+ for thread in threads :
104
+ thread .start ()
105
+ for thread in threads :
106
+ thread .join ()
107
+
108
+
109
+ self .assertTrue (all ([
110
+ results .get ()
111
+ for _ in range (100 )
112
+ ]))
113
+
114
+ def test_slug (self ):
115
+ """
116
+ Ensure our slugification works as expected
117
+ """
118
+ request = self .factory .get ('/parent3/kids3-1' )
119
+ items = Menu .process (request , 'test' )
120
+ self .assertEqual (items [1 ].slug , "parent-3" )
121
+ self .assertEqual (items [1 ].children [0 ].slug , "salty" )
122
+
71
123
def test_exact_url (self ):
72
124
"""
73
125
Ensure that the exact_url setting works
74
126
"""
75
127
# the extra stuff will still cause kids3-2 to be selected
76
128
request = self .factory .get ('/parent3/kids3-2/extra_stuff_here' )
77
- Menu .process (request , 'test' )
78
- self .assertEqual (Menu . items [ 'test' ] [1 ].children [1 ].selected , True )
129
+ items = Menu .process (request , 'test' )
130
+ self .assertEqual (items [1 ].children [1 ].selected , True )
79
131
80
132
# but here it won't, because exact_url is set
81
133
request = self .factory .get ('/parent3/kids3-1/kid1/extra_stuff_here' )
82
- Menu .process (request , 'test' )
83
- self .assertEqual (Menu . items [ 'test' ] [1 ].children [0 ].children [0 ].selected , False )
134
+ items = Menu .process (request , 'test' )
135
+ self .assertEqual (items [1 ].children [0 ].children [0 ].selected , False )
84
136
85
137
def test_callable_title (self ):
86
138
"""
87
139
Ensure callable titles work
88
140
"""
89
141
self .kids3_2_desired_title = "fun"
90
142
request = self .factory .get ('/parent3' )
91
- Menu .process (request , 'test' )
92
- self .assertEqual (Menu .items ['test' ][1 ].children [1 ].title , "/parent3-fun" )
93
-
94
- def test_checks (self ):
95
- """
96
- Ensure checks on menus work
97
- """
98
- request = self .factory .get ('/kids2-2/visible' )
99
- Menu .process (request , 'test' )
100
- self .assertEqual (len (Menu .items ['test' ][0 ].children ), 2 )
101
-
102
- request = self .factory .get ('/kids2-2/hidden' )
103
- Menu .process (request , 'test' )
104
- self .assertEqual (len (Menu .items ['test' ][0 ].children ), 1 )
143
+ items = Menu .process (request , 'test' )
144
+ self .assertEqual (items [1 ].children [1 ].title , "/parent3-fun" )
105
145
106
146
def test_select_parents (self ):
107
147
"""
108
148
Ensure the MENU_SELECT_PARENTS setting works
109
149
"""
110
150
settings .MENU_SELECT_PARENTS = False
111
151
request = self .factory .get ('/parent2/kids2-1' )
112
- Menu .process (request , 'test' )
113
- self .assertEqual (Menu . items [ 'test' ] [0 ].selected , True )
114
- self .assertEqual (Menu . items [ 'test' ] [0 ].children [1 ].selected , True )
115
- self .assertEqual (Menu . items [ 'test' ] [1 ].selected , False )
152
+ items = Menu .process (request , 'test' )
153
+ self .assertEqual (items [0 ].selected , True )
154
+ self .assertEqual (items [0 ].children [1 ].selected , True )
155
+ self .assertEqual (items [1 ].selected , False )
116
156
117
157
request = self .factory .get ('/kids2-2' )
118
- Menu .process (request , 'test' )
119
- self .assertEqual (Menu . items [ 'test' ] [0 ].selected , False )
120
- self .assertEqual (Menu . items [ 'test' ] [0 ].children [0 ].selected , True )
121
- self .assertEqual (Menu . items [ 'test' ] [1 ].selected , False )
158
+ items = Menu .process (request , 'test' )
159
+ self .assertEqual (items [0 ].selected , False )
160
+ self .assertEqual (items [0 ].children [0 ].selected , True )
161
+ self .assertEqual (items [1 ].selected , False )
122
162
123
163
settings .MENU_SELECT_PARENTS = True
124
164
request = self .factory .get ('/kids2-2' )
125
- Menu .process (request , 'test' )
126
- self .assertEqual (Menu . items [ 'test' ] [0 ].selected , True )
127
- self .assertEqual (Menu . items [ 'test' ] [0 ].children [0 ].selected , True )
128
- self .assertEqual (Menu . items [ 'test' ] [1 ].selected , False )
165
+ items = Menu .process (request , 'test' )
166
+ self .assertEqual (items [0 ].selected , True )
167
+ self .assertEqual (items [0 ].children [0 ].selected , True )
168
+ self .assertEqual (items [1 ].selected , False )
129
169
130
170
request = self .factory .get ('/parent3/kids3-1/kid1' )
131
- Menu .process (request , 'test' )
132
- self .assertEqual (Menu . items [ 'test' ] [0 ].selected , False )
133
- self .assertEqual (Menu . items [ 'test' ] [0 ].children [1 ].selected , False )
134
- self .assertEqual (Menu . items [ 'test' ] [1 ].selected , True )
135
- self .assertEqual (Menu . items [ 'test' ] [1 ].children [0 ].selected , True )
136
- self .assertEqual (Menu . items [ 'test' ] [1 ].children [0 ].children [0 ].selected , True )
137
- self .assertEqual (Menu . items [ 'test' ] [1 ].children [1 ].selected , False )
138
- self .assertEqual (Menu . items [ 'test' ] [2 ].selected , False )
171
+ items = Menu .process (request , 'test' )
172
+ self .assertEqual (items [0 ].selected , False )
173
+ self .assertEqual (items [0 ].children [1 ].selected , False )
174
+ self .assertEqual (items [1 ].selected , True )
175
+ self .assertEqual (items [1 ].children [0 ].selected , True )
176
+ self .assertEqual (items [1 ].children [0 ].children [0 ].selected , True )
177
+ self .assertEqual (items [1 ].children [1 ].selected , False )
178
+ self .assertEqual (items [2 ].selected , False )
139
179
140
180
def test_template_tag (self ):
141
181
"""
0 commit comments