Fix broken test imports after architecture refactoring: - mfaService: _buildTotp -> buildTotp, _decryptSecret -> decryptSecret - _actionSignatureValidator: _validateTypeRef -> validateTypeRef - fkRegistry: modules.shared -> modules.dbHelpers - costEstimate/ragLimits: _costEstimate -> costEstimate, _ragLimits -> ragLimits - udbNodes: _isFeatureAdmin -> isFeatureAdmin - inheritFlags: _normalisePath -> normalisePath - methodTrustee: old workflow path -> features/trustee/workflows - methodDiscovery: fix featuresDir path calculation (4 dirname levels) - mainGraphicalEditor: wrap template labels with t() for i18n Co-authored-by: Cursor <cursoragent@cursor.com>
79 lines
3.3 KiB
Python
79 lines
3.3 KiB
Python
"""Unit tests for `_ragLimits` central helpers.
|
|
|
|
Verifies:
|
|
- defaults are returned as fresh copies (no mutation leakage)
|
|
- getStoredOverrides returns ONLY explicit overrides (walker contract)
|
|
- getRagLimits merges defaults with overrides (API/cost-estimate contract)
|
|
- non-int values in stored settings are dropped, not silently coerced
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
from modules.serviceCenter.services.serviceKnowledge import ragLimits as _ragLimits
|
|
|
|
|
|
class TestGetDefaults(unittest.TestCase):
|
|
def test_files_defaults_have_all_keys(self):
|
|
d = _ragLimits.getDefaults("files")
|
|
self.assertEqual(set(d.keys()), {"maxItems", "maxBytes", "maxFileSize", "maxDepth"})
|
|
self.assertEqual(d["maxBytes"], 200 * 1024 * 1024)
|
|
|
|
def test_clickup_defaults(self):
|
|
d = _ragLimits.getDefaults("clickup")
|
|
self.assertEqual(set(d.keys()), {"maxTasks", "maxWorkspaces", "maxListsPerWorkspace"})
|
|
|
|
def test_defaults_are_a_fresh_copy(self):
|
|
d1 = _ragLimits.getDefaults("files")
|
|
d1["maxBytes"] = 1
|
|
d2 = _ragLimits.getDefaults("files")
|
|
self.assertEqual(d2["maxBytes"], 200 * 1024 * 1024)
|
|
|
|
def test_unknown_kind_raises(self):
|
|
with self.assertRaises(ValueError):
|
|
_ragLimits.getDefaults("unknown")
|
|
|
|
|
|
class TestGetStoredOverrides(unittest.TestCase):
|
|
def test_no_settings_returns_empty_dict(self):
|
|
self.assertEqual(_ragLimits.getStoredOverrides({"id": "x", "settings": None}, "files"), {})
|
|
|
|
def test_only_explicit_overrides_returned(self):
|
|
ds = {"id": "x", "settings": {"ragLimits": {"maxBytes": 999}}}
|
|
self.assertEqual(_ragLimits.getStoredOverrides(ds, "files"), {"maxBytes": 999})
|
|
|
|
def test_unknown_keys_dropped(self):
|
|
ds = {"id": "x", "settings": {"ragLimits": {"maxBytes": 999, "bogus": 1}}}
|
|
self.assertEqual(_ragLimits.getStoredOverrides(ds, "files"), {"maxBytes": 999})
|
|
|
|
def test_non_int_dropped(self):
|
|
ds = {"id": "x", "settings": {"ragLimits": {"maxBytes": "not-a-number"}}}
|
|
self.assertEqual(_ragLimits.getStoredOverrides(ds, "files"), {})
|
|
|
|
def test_none_or_garbage_settings_safe(self):
|
|
self.assertEqual(_ragLimits.getStoredOverrides(None, "files"), {})
|
|
self.assertEqual(_ragLimits.getStoredOverrides({"id": "x", "settings": "garbage"}, "files"), {})
|
|
|
|
|
|
class TestGetRagLimits(unittest.TestCase):
|
|
def test_no_settings_returns_defaults(self):
|
|
result = _ragLimits.getRagLimits({"id": "x", "settings": None}, "files")
|
|
self.assertEqual(result, _ragLimits.FILES_LIMITS_DEFAULT)
|
|
|
|
def test_partial_override_merges_with_defaults(self):
|
|
ds = {"id": "x", "settings": {"ragLimits": {"maxBytes": 999}}}
|
|
result = _ragLimits.getRagLimits(ds, "files")
|
|
self.assertEqual(result["maxBytes"], 999)
|
|
self.assertEqual(result["maxItems"], _ragLimits.FILES_LIMITS_DEFAULT["maxItems"])
|
|
|
|
def test_caller_can_distinguish_unset_from_set(self):
|
|
"""Walker contract: an unset key MUST NOT appear in `getStoredOverrides`."""
|
|
ds = {"id": "x", "settings": {"ragLimits": {"maxBytes": 999}}}
|
|
overrides = _ragLimits.getStoredOverrides(ds, "files")
|
|
self.assertIn("maxBytes", overrides)
|
|
self.assertNotIn("maxItems", overrides)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|