Skip to content

Commit f45170e

Browse files
committed
fix: allow Unicode characters in item name lookups
- Update namePattern regex to support Unicode characters (ñ, ', etc.) - Add support for parentheses, ampersand, and Unicode apostrophes - Fix 400 Bad Request error for items like kofu's-wallet, jalapeño - Add comprehensive test for items with special characters Fixes #10 items that were previously inaccessible by name: - kofu's-wallet, leader's-crest (Unicode apostrophe U+2019) - jalapeño (Unicode ñ) - steel-bottle-(r/y/b) (parentheses) - plaid-tablecloth-(r/y/b) (parentheses) - b&w-grass-tablecloth (ampersand)
1 parent 5e1c604 commit f45170e

2 files changed

Lines changed: 59 additions & 2 deletions

File tree

pokemon_v2/api.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ class NameOrIdRetrieval:
3939
"""
4040

4141
idPattern = re.compile(r"^-?[0-9]+$")
42-
# Allow alphanumeric, hyphen, plus, and space (Space added for test cases using name for lookup, ex: 'base pkm')
43-
namePattern = re.compile(r"^[0-9A-Za-z\-\+ ]+$")
42+
# Allow alphanumeric, hyphen, plus, space, parentheses, apostrophes, ampersand, and Unicode letters
43+
# Includes U+0027 (') and U+2019 (') for apostrophes
44+
namePattern = re.compile(r"^[\w\-\+\s\(\)&'\u2019]+$", re.UNICODE)
4445

4546
def get_queryset(self):
4647
queryset = super().get_queryset()

pokemon_v2/tests.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2839,6 +2839,62 @@ def test_item_api(self):
28392839
"{}".format(sprites_data["default"]),
28402840
)
28412841

2842+
def test_item_with_special_characters_api(self):
2843+
"""Test that items with special characters in their names can be accessed by name"""
2844+
item_category = self.setup_item_category_data(name="special-char-category")
2845+
2846+
# Test with Unicode apostrophe (like kofu's-wallet)
2847+
item_apostrophe = self.setup_item_data(
2848+
item_category=item_category, name="kofu's-wallet"
2849+
)
2850+
self.setup_item_sprites_data(item_apostrophe)
2851+
response = self.client.get(
2852+
"{}/item/{}/".format(API_V2, "kofu's-wallet"),
2853+
headers={"host": "testserver"}
2854+
)
2855+
self.assertEqual(response.status_code, 200)
2856+
self.assertEqual(response.data["name"], item_apostrophe.name)
2857+
self.assertEqual(response.data["id"], item_apostrophe.pk)
2858+
2859+
# Test with Unicode letter (like jalapeño)
2860+
item_unicode = self.setup_item_data(
2861+
item_category=item_category, name="jalapeño"
2862+
)
2863+
self.setup_item_sprites_data(item_unicode)
2864+
response = self.client.get(
2865+
"{}/item/{}/".format(API_V2, "jalapeño"),
2866+
headers={"host": "testserver"}
2867+
)
2868+
self.assertEqual(response.status_code, 200)
2869+
self.assertEqual(response.data["name"], item_unicode.name)
2870+
self.assertEqual(response.data["id"], item_unicode.pk)
2871+
2872+
# Test with parentheses (like steel-bottle-(r))
2873+
item_parens = self.setup_item_data(
2874+
item_category=item_category, name="steel-bottle-(r)"
2875+
)
2876+
self.setup_item_sprites_data(item_parens)
2877+
response = self.client.get(
2878+
"{}/item/{}/".format(API_V2, "steel-bottle-(r)"),
2879+
headers={"host": "testserver"}
2880+
)
2881+
self.assertEqual(response.status_code, 200)
2882+
self.assertEqual(response.data["name"], item_parens.name)
2883+
self.assertEqual(response.data["id"], item_parens.pk)
2884+
2885+
# Test with ampersand (like b&w-grass-tablecloth)
2886+
item_ampersand = self.setup_item_data(
2887+
item_category=item_category, name="b&w-grass-tablecloth"
2888+
)
2889+
self.setup_item_sprites_data(item_ampersand)
2890+
response = self.client.get(
2891+
"{}/item/{}/".format(API_V2, "b&w-grass-tablecloth"),
2892+
headers={"host": "testserver"}
2893+
)
2894+
self.assertEqual(response.status_code, 200)
2895+
self.assertEqual(response.data["name"], item_ampersand.name)
2896+
self.assertEqual(response.data["id"], item_ampersand.pk)
2897+
28422898
# Berry Tests
28432899
def test_berry_firmness_api(self):
28442900
berry_firmness = self.setup_berry_firmness_data(name="base bry frmns")

0 commit comments

Comments
 (0)