|
11 | 11 | from sqlalchemy.sql import func |
12 | 12 |
|
13 | 13 | from couchers.config import config |
| 14 | +from couchers.constants import VALID_NAME_MAX_LENGTH |
14 | 15 | from couchers.db import _get_base_engine, apply_migrations, get_parent_node_at_location, session_scope |
15 | 16 | from couchers.jobs.handlers import DatabaseInconsistencyError, check_database_consistency |
16 | 17 | from couchers.models import User |
@@ -66,28 +67,51 @@ def test_is_valid_username() -> None: |
66 | 67 |
|
67 | 68 |
|
68 | 69 | def test_is_valid_name() -> None: |
69 | | - # valid names |
| 70 | + # Basics |
70 | 71 | assert is_valid_name("ab") |
71 | 72 | assert is_valid_name("a b") |
72 | | - assert is_valid_name("O'Connor") |
73 | 73 | assert is_valid_name("Jean-Luc") |
74 | | - assert is_valid_name("老子") |
75 | 74 |
|
76 | | - # invalid: too short |
| 75 | + # OK punctuation |
| 76 | + assert is_valid_name("King K. Rool") |
| 77 | + assert is_valid_name("Doe, John") |
| 78 | + assert is_valid_name("Alice & Bob") |
| 79 | + assert is_valid_name("Alice / Bob") |
| 80 | + assert is_valid_name("Alice | Bob") |
| 81 | + |
| 82 | + # Apostrophes and Quotes |
| 83 | + assert is_valid_name("O'Connor") |
| 84 | + assert is_valid_name("William “Bill” Clinton") |
| 85 | + assert is_valid_name("Sha’Nia Jenkins") |
| 86 | + |
| 87 | + # Other scripts |
| 88 | + assert is_valid_name("孙悟空") |
| 89 | + assert is_valid_name("Combining Diặcritics") |
| 90 | + assert is_valid_name("काव्य") # Hindi combining diacritics |
| 91 | + assert is_valid_name("Meritxell Col·lell") # Catalan middle dot |
| 92 | + assert is_valid_name("レオナルド・ディカプリオ") # Japanese middle dot |
| 93 | + assert is_valid_name("Lanaʻi") # Hawaiian ʻokina glottal stop |
| 94 | + |
| 95 | + # invalid: too short / too long |
77 | 96 | assert not is_valid_name("a") |
| 97 | + assert not is_valid_name("a" * (VALID_NAME_MAX_LENGTH + 1)) |
78 | 98 | # invalid: only whitespace |
79 | 99 | assert not is_valid_name(" ") |
80 | 100 | assert not is_valid_name("") |
81 | 101 | assert not is_valid_name(" ") |
82 | 102 | assert not is_valid_name(" ") |
83 | 103 | # invalid: leading/trailing whitespace |
84 | | - assert not is_valid_name(" ab") |
85 | | - assert not is_valid_name("ab ") |
86 | | - assert not is_valid_name(" ab ") |
87 | | - # invalid: contains characters outside of letters/whitespace/'/- |
88 | | - assert not is_valid_name("1") |
89 | | - # invalid: too long |
90 | | - assert not is_valid_name("a" * 101) |
| 104 | + assert not is_valid_name(" leading whitespace") |
| 105 | + assert not is_valid_name("trailing whitespace ") |
| 106 | + assert not is_valid_name(" surrounding whitespace ") |
| 107 | + # invalid: disallowed characters |
| 108 | + assert not is_valid_name("digits123") |
| 109 | + assert not is_valid_name("email@domain.com") |
| 110 | + assert not is_valid_name("Frosty the ☃️") |
| 111 | + assert not is_valid_name("exclamative!") |
| 112 | + assert not is_valid_name("interrogative?") |
| 113 | + assert not is_valid_name("under_score") |
| 114 | + assert not is_valid_name("(╯‵□′)╯︵┻━┻") |
91 | 115 |
|
92 | 116 |
|
93 | 117 | def test_parse_date() -> None: |
|
0 commit comments