Skip to content

Commit 1feb4de

Browse files
committed
RDBC-680 RavenDB_15080Test::getCountersForDocumentShouldReturnNamesInTheirOriginalCasing
1 parent eb01cc4 commit 1feb4de

File tree

2 files changed

+41
-10
lines changed

2 files changed

+41
-10
lines changed

ravendb/tests/jvm_migrated_tests/issues_tests/test_ravenDB_15080.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,3 +215,21 @@ def test_counter_session_cache_should_be_case_insensitive_to_counter_name(self):
215215
self.assertEqual(3, session.advanced.number_of_requests)
216216
self.assertIsNotNone(counter)
217217
self.assertEqual(999, counter)
218+
219+
def test_get_counters_for_document_should_return_names_in_their_original_casing(self):
220+
with self.store.open_session() as session:
221+
session.store(User(), "users/1")
222+
counters_for = session.counters_for("users/1")
223+
counters_for.increment("AviV")
224+
counters_for.increment("Karmel")
225+
counters_for.increment("PAWEL")
226+
227+
session.save_changes()
228+
229+
with self.store.open_session() as session:
230+
# get_all should return counter names in their original casing
231+
all_counters = session.counters_for("users/1").get_all()
232+
self.assertEqual(3, len(all_counters))
233+
234+
keys = all_counters.keys()
235+
self.assertSequenceContainsElements(keys, "AviV", "Karmel", "PAWEL")

ravendb/tools/utils.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -157,38 +157,48 @@ def from_json(cls, json_dict: Dict) -> Size:
157157
return cls(json_dict["SizeInBytes"], json_dict["HumaneSize"])
158158

159159

160+
# todo: https://issues.hibernatingrhinos.com/issue/RDBC-686
160161
class CaseInsensitiveDict(dict, Generic[_TKey, _TVal]):
161162
@classmethod
162-
def _k(cls, key):
163+
def _lower_if_str(cls, key):
163164
return key.lower() if isinstance(key, str) else key
164165

165166
def __init__(self, *args, **kwargs):
166167
super(CaseInsensitiveDict, self).__init__(*args, **kwargs)
168+
self._original_values: Dict[_TKey, _TKey] = {}
167169
self._convert_keys()
168170

169-
def __getitem__(self, key) -> Tuple[_TKey, _TVal]:
170-
return super(CaseInsensitiveDict, self).__getitem__(self.__class__._k(key))
171+
def _convert_key_back(self, lowered_key: _TKey) -> _TKey:
172+
return self._original_values[lowered_key]
173+
174+
def _convert_item_back(self, item: Tuple[_TKey, _TVal]) -> Tuple[_TKey, _TVal]:
175+
return self._convert_key_back(item[0]), item[1]
176+
177+
def __getitem__(self, key) -> _TVal:
178+
return super(CaseInsensitiveDict, self).__getitem__(self.__class__._lower_if_str(key))
171179

172180
def __setitem__(self, key, value):
173-
super(CaseInsensitiveDict, self).__setitem__(self.__class__._k(key), value)
181+
adjusted_key = self.__class__._lower_if_str(key)
182+
self._original_values[adjusted_key] = key
183+
super(CaseInsensitiveDict, self).__setitem__(adjusted_key, value)
174184

175185
def __delitem__(self, key):
176-
return super(CaseInsensitiveDict, self).__delitem__(self.__class__._k(key))
186+
return super(CaseInsensitiveDict, self).__delitem__(self.__class__._lower_if_str(key))
177187

178188
def __contains__(self, key):
179-
return super(CaseInsensitiveDict, self).__contains__(self.__class__._k(key))
189+
return super(CaseInsensitiveDict, self).__contains__(self.__class__._lower_if_str(key))
180190

181-
def pop(self, key, *args, **kwargs) -> Tuple[_TKey, _TVal]:
182-
return super(CaseInsensitiveDict, self).pop(self.__class__._k(key), *args, **kwargs)
191+
def pop(self, key, *args, **kwargs) -> _TVal:
192+
return super(CaseInsensitiveDict, self).pop(self.__class__._lower_if_str(key), *args, **kwargs)
183193

184194
def remove(self, key, *args, **kwargs) -> Optional[_TVal]:
185195
return self.pop(key, *args, **kwargs) if key in self else None
186196

187197
def get(self, key, *args, **kwargs) -> _TVal:
188-
return super(CaseInsensitiveDict, self).get(self.__class__._k(key), *args, **kwargs)
198+
return super(CaseInsensitiveDict, self).get(self.__class__._lower_if_str(key), *args, **kwargs)
189199

190200
def setdefault(self, key, *args, **kwargs):
191-
return super(CaseInsensitiveDict, self).setdefault(self.__class__._k(key), *args, **kwargs)
201+
return super(CaseInsensitiveDict, self).setdefault(self.__class__._lower_if_str(key), *args, **kwargs)
192202

193203
def update(self, e=None, **f):
194204
super(CaseInsensitiveDict, self).update(self.__class__(e))
@@ -199,6 +209,9 @@ def _convert_keys(self):
199209
v = super(CaseInsensitiveDict, self).pop(k)
200210
self.__setitem__(k, v)
201211

212+
def keys(self) -> List[_TKey]:
213+
return list(self._original_values.values())
214+
202215

203216
class CaseInsensitiveSet(set):
204217
@classmethod

0 commit comments

Comments
 (0)