@@ -20,72 +20,106 @@ def get_response(self, *args, **params):
20
20
return super ().get_response (* args , ** params )
21
21
22
22
def create_base_data (self ):
23
+ user_1 = self .user
24
+ user_2 = self .create_user ()
25
+
26
+ self .create_member (organization = self .organization , user = user_2 )
27
+
23
28
# Depending on test we run migrations in Django 1.8. This causes
24
29
# extra rows to be created, so remove them to keep this test working
25
30
SavedSearch .objects .filter (is_global = True ).delete ()
26
31
27
- SavedSearch .objects .create (
28
- name = "foo" ,
32
+ # Note names are prefixed with A-Z to make it easy to understand the sorting
33
+
34
+ savedsearch_global = SavedSearch .objects .create (
35
+ name = "A Global Query" ,
36
+ query = "is:unresolved" ,
37
+ sort = SortOptions .DATE ,
38
+ is_global = True ,
39
+ visibility = Visibility .ORGANIZATION ,
40
+ date_added = timezone .now (),
41
+ )
42
+ savedsearch_org = SavedSearch .objects .create (
43
+ organization = self .organization ,
44
+ owner = user_1 ,
45
+ name = "B Simple SavedSearch 1" ,
29
46
query = "some test" ,
47
+ sort = SortOptions .NEW ,
48
+ visibility = Visibility .ORGANIZATION ,
49
+ date_added = timezone .now (),
50
+ )
51
+ savedsearch_org_diff_owner = SavedSearch .objects .create (
52
+ organization = self .organization ,
53
+ owner = user_2 ,
54
+ name = "C Simple SavedSearch for same org diff owner" ,
55
+ query = "some other test" ,
56
+ sort = SortOptions .DATE ,
57
+ visibility = Visibility .ORGANIZATION ,
58
+ date_added = timezone .now (),
59
+ )
60
+ savedsearch_owner_me = SavedSearch .objects .create (
61
+ organization = self .organization ,
62
+ owner = user_1 ,
63
+ name = "D My personal search" ,
64
+ query = "some other test" ,
30
65
sort = SortOptions .DATE ,
66
+ visibility = Visibility .OWNER ,
31
67
date_added = timezone .now (),
32
68
)
33
- SavedSearch .objects .create (
69
+ savedsearch_other_owner = SavedSearch .objects .create (
34
70
organization = self .organization ,
35
- owner = self . create_user () ,
36
- name = "foo " ,
37
- query = "some other user's query " ,
71
+ owner = user_2 ,
72
+ name = "E Other user personal search " ,
73
+ query = "whatever " ,
38
74
sort = SortOptions .DATE ,
75
+ visibility = Visibility .OWNER ,
39
76
date_added = timezone .now (),
40
77
)
41
- included = [
42
- SavedSearch .objects .create (
43
- name = "Global Query" ,
44
- query = "is:unresolved" ,
45
- sort = SortOptions .DATE ,
46
- is_global = True ,
47
- date_added = timezone .now (),
48
- ),
49
- SavedSearch .objects .create (
50
- organization = self .organization ,
51
- name = "foo" ,
52
- query = "some test" ,
53
- sort = SortOptions .DATE ,
54
- date_added = timezone .now (),
55
- ),
56
- SavedSearch .objects .create (
57
- organization = self .organization ,
58
- name = "wat" ,
59
- query = "is:unassigned is:unresolved" ,
60
- sort = SortOptions .NEW ,
61
- date_added = timezone .now (),
62
- ),
63
- ]
64
- return included
78
+ savedsearch_my_pinned = SavedSearch .objects .create (
79
+ organization = self .organization ,
80
+ owner = user_1 ,
81
+ name = "F My pinned search" ,
82
+ query = "whatever" ,
83
+ sort = SortOptions .DATE ,
84
+ visibility = Visibility .OWNER_PINNED ,
85
+ date_added = timezone .now (),
86
+ )
87
+ savedsearch_other_pinned = SavedSearch .objects .create (
88
+ organization = self .organization ,
89
+ owner = user_2 ,
90
+ name = "G Other user pinned search" ,
91
+ query = "whatever" ,
92
+ sort = SortOptions .DATE ,
93
+ visibility = Visibility .OWNER_PINNED ,
94
+ date_added = timezone .now (),
95
+ )
96
+
97
+ return {
98
+ "savedsearch_global" : savedsearch_global ,
99
+ "savedsearch_org" : savedsearch_org ,
100
+ "savedsearch_org_diff_owner" : savedsearch_org_diff_owner ,
101
+ "savedsearch_owner_me" : savedsearch_owner_me ,
102
+ "savedsearch_other_owner" : savedsearch_other_owner ,
103
+ "savedsearch_my_pinned" : savedsearch_my_pinned ,
104
+ "savedsearch_other_pinned" : savedsearch_other_pinned ,
105
+ }
65
106
66
107
def check_results (self , expected ):
67
108
self .login_as (user = self .user )
68
- expected .sort (key = lambda search : (not search .is_pinned , search .name .lower ()))
69
109
response = self .get_success_response (self .organization .slug )
70
110
assert response .data == serialize (expected )
71
111
72
112
def test_simple (self ):
73
- included = self .create_base_data ()
74
- self .check_results (included )
75
-
76
- def test_pinned (self ):
77
- included = self .create_base_data ()
78
- pinned_query = SavedSearch .objects .create (
79
- organization = self .organization ,
80
- owner = self .user ,
81
- name = "My Pinned Query" ,
82
- query = "pinned junk" ,
83
- sort = SortOptions .NEW ,
84
- date_added = timezone .now (),
85
- visibility = Visibility .OWNER_PINNED ,
113
+ objs = self .create_base_data ()
114
+ self .check_results (
115
+ [
116
+ objs ["savedsearch_global" ],
117
+ objs ["savedsearch_org" ],
118
+ objs ["savedsearch_org_diff_owner" ],
119
+ objs ["savedsearch_owner_me" ],
120
+ objs ["savedsearch_my_pinned" ],
121
+ ]
86
122
)
87
- included .append (pinned_query )
88
- self .check_results (included )
89
123
90
124
91
125
@region_silo_test
@@ -109,19 +143,30 @@ def test_simple(self):
109
143
search_type = SearchType .ISSUE .value
110
144
name = "test"
111
145
query = "hello"
146
+ visibility = Visibility .ORGANIZATION
147
+
112
148
self .login_as (user = self .manager )
113
149
resp = self .get_success_response (
114
- self .organization .slug , type = search_type , name = name , query = query
150
+ self .organization .slug ,
151
+ type = search_type ,
152
+ name = name ,
153
+ query = query ,
154
+ visibility = visibility ,
115
155
)
116
156
assert resp .data ["name" ] == name
117
157
assert resp .data ["query" ] == query
118
158
assert resp .data ["type" ] == search_type
159
+ assert resp .data ["visibility" ] == visibility
119
160
assert SavedSearch .objects .filter (id = resp .data ["id" ]).exists ()
120
161
121
- def test_perms (self ):
162
+ def test_member_cannot_create_org_search (self ):
122
163
self .login_as (user = self .member )
123
164
resp = self .get_response (
124
- self .organization .slug , type = SearchType .ISSUE .value , name = "hello" , query = "test"
165
+ self .organization .slug ,
166
+ type = SearchType .ISSUE .value ,
167
+ name = "hello" ,
168
+ query = "test" ,
169
+ Visibility = Visibility .ORGANIZATION ,
125
170
)
126
171
assert resp .status_code == 403
127
172
@@ -131,6 +176,7 @@ def test_exists(self):
131
176
name = "Some global search" ,
132
177
query = "is:unresolved" ,
133
178
is_global = True ,
179
+ visibility = Visibility .ORGANIZATION ,
134
180
)
135
181
self .login_as (user = self .manager )
136
182
resp = self .get_response (
@@ -147,20 +193,26 @@ def test_exists(self):
147
193
type = SearchType .ISSUE .value ,
148
194
name = "Some org search" ,
149
195
query = "org search" ,
196
+ visibility = Visibility .ORGANIZATION ,
150
197
)
151
198
resp = self .get_response (
152
199
self .organization .slug ,
153
200
type = SearchType .ISSUE .value ,
154
201
name = "hello" ,
155
202
query = org_search .query ,
203
+ visibility = Visibility .ORGANIZATION ,
156
204
)
157
205
assert resp .status_code == 400
158
206
assert "already exists" in resp .data ["detail" ]
159
207
160
208
def test_empty (self ):
161
209
self .login_as (user = self .manager )
162
210
resp = self .get_response (
163
- self .organization .slug , type = SearchType .ISSUE .value , name = "hello" , query = ""
211
+ self .organization .slug ,
212
+ type = SearchType .ISSUE .value ,
213
+ name = "hello" ,
214
+ query = "" ,
215
+ visibility = Visibility .ORGANIZATION ,
164
216
)
165
217
assert resp .status_code == 400
166
218
assert "This field may not be blank." == resp .data ["query" ][0 ]
0 commit comments