Skip to content

Commit 87aeac7

Browse files
committed
[DOP-25451] Queue name can match any printable ASCII character
1 parent 0f7f9d3 commit 87aeac7

File tree

4 files changed

+42
-42
lines changed

4 files changed

+42
-42
lines changed

docs/changelog/0.2.2.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Breaking
1212
Improvements
1313
------------
1414

15-
- Now queue name can include spaces.
15+
- Now queue name can include any ASCII printable characters.
1616
- Queue slug is always lowercase. Spaces, hyphens and underscores are replaced with ``-`` symbol.
1717

1818
Bug fixes

syncmaster/schemas/v1/queue.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77

88
from syncmaster.schemas.v1.page import PageSchema
99

10-
ALLOWED_PATTERN = re.compile(r"^[-_ a-zA-Z0-9]+$")
11-
RESTRICTED_PATTERN = re.compile(r"[^\w\d]+")
10+
ALLOWED_PATTERN = re.compile(r"^[ -~]+$")
11+
RESTRICTED_PATTERN = re.compile(r"[^a-zA-Z0-9]+")
1212

1313
QueueName = Annotated[
1414
str,
@@ -26,7 +26,7 @@ class CreateQueueSchema(BaseModel):
2626
@computed_field
2727
@property
2828
def slug(self) -> str:
29-
short_name = RESTRICTED_PATTERN.sub("_", self.name.lower())
29+
short_name = RESTRICTED_PATTERN.sub("_", self.name.lower()).strip("_")
3030
return f"{self.group_id}-{short_name}"
3131

3232

tests/test_unit/test_queues/test_create_queue.py

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ async def test_maintainer_plus_can_create_queue(
2121
"v1/queues",
2222
headers={"Authorization": f"Bearer {user.token}"},
2323
json={
24-
"name": "New awesome_queue-123",
24+
"name": r"New queue!\"#$%&'()*+,-./:;<=>?@\[\\\]^_`{|}~",
2525
"description": "Some interesting description",
2626
"group_id": mock_group.group.id,
2727
},
@@ -30,7 +30,7 @@ async def test_maintainer_plus_can_create_queue(
3030
assert result.status_code == 200, result.json()
3131
assert result.json() == {
3232
"id": result.json()["id"],
33-
"name": "New awesome_queue-123",
33+
"name": r"New queue!\"#$%&'()*+,-./:;<=>?@\[\\\]^_`{|}~",
3434
"description": "Some interesting description",
3535
"group_id": mock_group.group.id,
3636
"slug": f"{mock_group.group.id}-new_awesome_queue_123",
@@ -39,7 +39,7 @@ async def test_maintainer_plus_can_create_queue(
3939
queue = (await session.scalars(select(Queue).filter_by(id=result.json()["id"]))).one()
4040
assert queue.id == result.json()["id"]
4141
assert queue.group_id == mock_group.group.id
42-
assert queue.name == "New awesome_queue-123"
42+
assert queue.name == r"New queue!\"#$%&'()*+,-./:;<=>?@\[\\\]^_`{|}~"
4343
assert queue.description == "Some interesting description"
4444
assert queue.slug == f"{mock_group.group.id}-new_awesome_queue_123"
4545

@@ -57,7 +57,7 @@ async def test_superuser_can_create_queue(
5757
"v1/queues",
5858
headers={"Authorization": f"Bearer {superuser.token}"},
5959
json={
60-
"name": "New awesome_queue-123",
60+
"name": "New queue",
6161
"description": "Some interesting description",
6262
"group_id": mock_group.group.id,
6363
},
@@ -66,7 +66,7 @@ async def test_superuser_can_create_queue(
6666
assert result.status_code == 200, result.json()
6767
assert result.json() == {
6868
"id": result.json()["id"],
69-
"name": "New awesome_queue-123",
69+
"name": "New queue",
7070
"description": "Some interesting description",
7171
"group_id": mock_group.group.id,
7272
"slug": f"{mock_group.group.id}-new_awesome_queue_123",
@@ -75,7 +75,7 @@ async def test_superuser_can_create_queue(
7575

7676
assert queue.id == result.json()["id"]
7777
assert queue.group_id == mock_group.group.id
78-
assert queue.name == "New awesome_queue-123"
78+
assert queue.name == "New queue"
7979
assert queue.description == "Some interesting description"
8080
assert queue.slug == f"{mock_group.group.id}-new_awesome_queue_123"
8181

@@ -95,7 +95,7 @@ async def test_developer_or_below_cannot_create_queue(
9595
"v1/queues",
9696
headers={"Authorization": f"Bearer {user.token}"},
9797
json={
98-
"name": "New awesome_queue-123",
98+
"name": "New queue",
9999
"description": "Some interesting description",
100100
"group_id": mock_group.id,
101101
},
@@ -122,7 +122,7 @@ async def test_other_group_member_cannot_create_queue(
122122
"v1/queues",
123123
headers={"Authorization": f"Bearer {user.token}"},
124124
json={
125-
"name": "New awesome_queue-123",
125+
"name": "New queue",
126126
"description": "Some interesting description",
127127
"group_id": empty_group.group.id,
128128
},
@@ -146,7 +146,7 @@ async def test_groupless_user_cannot_create_queue_error(
146146
"v1/queues",
147147
headers={"Authorization": f"Bearer {simple_user.token}"},
148148
json={
149-
"name": "New awesome_queue-123",
149+
"name": "New queue",
150150
"description": "Some interesting description",
151151
"group_id": empty_group.group.id,
152152
},
@@ -173,7 +173,7 @@ async def test_maintainer_plus_cannot_create_queue_with_unknown_group_error(
173173
"v1/queues",
174174
headers={"Authorization": f"Bearer {user.token}"},
175175
json={
176-
"name": "New awesome_queue-123",
176+
"name": "New queue",
177177
"description": "Some interesting description",
178178
"group_id": -1,
179179
},
@@ -196,7 +196,7 @@ async def test_superuser_cannot_create_queue_with_unknown_group_error(
196196
"v1/queues",
197197
headers={"Authorization": f"Bearer {superuser.token}"},
198198
json={
199-
"name": "New awesome_queue-123",
199+
"name": "New queue",
200200
"description": "Some interesting description",
201201
"group_id": -1,
202202
},
@@ -217,20 +217,20 @@ async def test_superuser_cannot_create_queue_with_unknown_group_error(
217217
(
218218
"очередь",
219219
{
220-
"context": {"pattern": "^[-_ a-zA-Z0-9]+$"},
220+
"context": {"pattern": r"^[ -~]+$"},
221221
"input": "очередь",
222222
"location": ["body", "name"],
223-
"message": "String should match pattern '^[-_ a-zA-Z0-9]+$'",
223+
"message": r"String should match pattern '^[ -~]+$'",
224224
"code": "string_pattern_mismatch",
225225
},
226226
),
227227
(
228228
"♥︎♥︎♥︎",
229229
{
230-
"context": {"pattern": "^[-_ a-zA-Z0-9]+$"},
230+
"context": {"pattern": r"^[ -~]+$"},
231231
"input": "♥︎♥︎♥︎",
232232
"location": ["body", "name"],
233-
"message": "String should match pattern '^[-_ a-zA-Z0-9]+$'",
233+
"message": r"String should match pattern '^[ -~]+$'",
234234
"code": "string_pattern_mismatch",
235235
},
236236
),
@@ -336,7 +336,7 @@ async def test_maintainer_plus_can_create_queues_with_the_same_name_but_diff_gro
336336
"v1/queues",
337337
headers={"Authorization": f"Bearer {mock_group_user.token}"},
338338
json={
339-
"name": "New awesome_queue-123",
339+
"name": "New queue",
340340
"description": "Some interesting description",
341341
"group_id": mock_group.group.id,
342342
},
@@ -345,7 +345,7 @@ async def test_maintainer_plus_can_create_queues_with_the_same_name_but_diff_gro
345345
"v1/queues",
346346
headers={"Authorization": f"Bearer {group_user.token}"},
347347
json={
348-
"name": "New awesome_queue-123",
348+
"name": "New queue",
349349
"description": "Some interesting description",
350350
"group_id": group.group.id,
351351
},
@@ -356,17 +356,17 @@ async def test_maintainer_plus_can_create_queues_with_the_same_name_but_diff_gro
356356
assert queue_1.status_code == 200
357357
assert queue_1_json == {
358358
"id": queue_1_json["id"],
359-
"name": "New awesome_queue-123",
359+
"name": "New queue",
360360
"description": "Some interesting description",
361361
"group_id": mock_group.group.id,
362-
"slug": f"{mock_group.group.id}-new_awesome_queue_123",
362+
"slug": f"{mock_group.group.id}-new_queue",
363363
}
364364
assert queue_2.status_code == 200
365365
assert queue_2_json == {
366366
"id": queue_2_json["id"],
367-
"name": "New awesome_queue-123",
367+
"name": "New queue",
368368
"description": "Some interesting description",
369369
"group_id": group.group.id,
370-
"slug": f"{group.group.id}-new_awesome_queue_123",
370+
"slug": f"{group.group.id}-new_queue",
371371
}
372372
assert queue_1_json["slug"] != queue_2_json["slug"]

tests/test_unit/test_queues/test_update_queue.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,23 @@ async def test_maintainer_plus_can_update_queue(
2121
f"v1/queues/{group_queue.id}",
2222
headers={"Authorization": f"Bearer {user.token}"},
2323
json={
24-
"name": "New awesome_queue-123",
24+
"name": r"New queue!\"#$%&'()*+,-./:;<=>?@\[\\\]^_`{|}~",
2525
"description": "New description",
2626
},
2727
)
2828

2929
assert result.json() == {
3030
"id": group_queue.id,
31-
"name": "New awesome_queue-123",
31+
"name": r"New queue!\"#$%&'()*+,-./:;<=>?@\[\\\]^_`{|}~",
3232
"description": "New description",
3333
"group_id": group_queue.group_id,
34-
"slug": group_queue.slug,
34+
"slug": group_queue.slug, # slug is left intact
3535
}
3636
assert result.status_code == 200, result.json()
3737

3838
queue = await session.get(Queue, group_queue.id)
3939
await session.refresh(queue)
40-
assert queue.name == "New awesome_queue-123"
40+
assert queue.name == r"New queue!\"#$%&'()*+,-./:;<=>?@\[\\\]^_`{|}~"
4141
assert queue.description == "New description"
4242
assert queue.slug == group_queue.slug
4343

@@ -52,23 +52,23 @@ async def test_superuser_can_update_queue(
5252
f"v1/queues/{group_queue.id}",
5353
headers={"Authorization": f"Bearer {superuser.token}"},
5454
json={
55-
"name": "New awesome_queue-123",
55+
"name": "New queue",
5656
"description": "New description",
5757
},
5858
)
5959

6060
assert result.status_code == 200, result.json()
6161
assert result.json() == {
6262
"id": group_queue.id,
63-
"name": "New awesome_queue-123",
63+
"name": "New queue",
6464
"description": "New description",
6565
"group_id": group_queue.group_id,
6666
"slug": group_queue.slug,
6767
}
6868

6969
queue = await session.get(Queue, group_queue.id)
7070
await session.refresh(queue)
71-
assert queue.name == "New awesome_queue-123"
71+
assert queue.name == "New queue"
7272
assert queue.description == "New description"
7373
assert queue.slug == group_queue.slug
7474

@@ -82,7 +82,7 @@ async def test_groupless_user_cannot_update_queue(
8282
f"v1/queues/{group_queue.id}",
8383
headers={"Authorization": f"Bearer {simple_user.token}"},
8484
json={
85-
"name": "New awesome_queue-123",
85+
"name": "New queue",
8686
"description": "New description",
8787
},
8888
)
@@ -103,7 +103,7 @@ async def test_anon_user_cannot_update_queue(
103103
result = await client.put(
104104
f"v1/queues/{group_queue.id}",
105105
json={
106-
"name": "New awesome_queue-123",
106+
"name": "New queue",
107107
"description": "New description",
108108
},
109109
)
@@ -129,7 +129,7 @@ async def test_developer_or_below_cannot_update_queue(
129129
f"v1/queues/{group_queue.id}",
130130
headers={"Authorization": f"Bearer {user.token}"},
131131
json={
132-
"name": "New awesome_queue-123",
132+
"name": "New queue",
133133
"description": "New description",
134134
},
135135
)
@@ -155,7 +155,7 @@ async def test_other_group_member_cannot_update_queue(
155155
f"v1/queues/{group_queue.id}",
156156
headers={"Authorization": f"Bearer {user.token}"},
157157
json={
158-
"name": "New awesome_queue-123",
158+
"name": "New queue",
159159
"description": "New description",
160160
},
161161
)
@@ -180,7 +180,7 @@ async def test_maintainer_plus_cannot_update_unknown_queue_error(
180180
"v1/queues/-1",
181181
headers={"Authorization": f"Bearer {user.token}"},
182182
json={
183-
"name": "New awesome_queue-123",
183+
"name": "New queue",
184184
"description": "New description",
185185
},
186186
)
@@ -203,7 +203,7 @@ async def test_superuser_cannot_update_unknown_queue_error(
203203
"v1/queues/-1",
204204
headers={"Authorization": f"Bearer {superuser.token}"},
205205
json={
206-
"name": "New awesome_queue-123",
206+
"name": "New queue",
207207
"description": "New description",
208208
},
209209
)
@@ -224,20 +224,20 @@ async def test_superuser_cannot_update_unknown_queue_error(
224224
(
225225
"очередь",
226226
{
227-
"context": {"pattern": "^[-_ a-zA-Z0-9]+$"},
227+
"context": {"pattern": r"^[ -~]+$"},
228228
"input": "очередь",
229229
"location": ["body", "name"],
230-
"message": "String should match pattern '^[-_ a-zA-Z0-9]+$'",
230+
"message": r"String should match pattern '^[ -~]+$'",
231231
"code": "string_pattern_mismatch",
232232
},
233233
),
234234
(
235235
"♥︎♥︎♥︎",
236236
{
237-
"context": {"pattern": "^[-_ a-zA-Z0-9]+$"},
237+
"context": {"pattern": r"^[ -~]+$"},
238238
"input": "♥︎♥︎♥︎",
239239
"location": ["body", "name"],
240-
"message": "String should match pattern '^[-_ a-zA-Z0-9]+$'",
240+
"message": r"String should match pattern '^[ -~]+$'",
241241
"code": "string_pattern_mismatch",
242242
},
243243
),

0 commit comments

Comments
 (0)