Spaces:
Sleeping
Sleeping
| """Unit tests for forget() folder-based deletion (REQ-029–REQ-033).""" | |
| import sys | |
| import os | |
| import pytest | |
| import datetime | |
| sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'src')) | |
| from db import StateKV | |
| from functions import folder_observe, forget, KV | |
| def make_kv(tmp_path): | |
| db_path = os.path.join(str(tmp_path), 'test.db') | |
| return StateKV(db_path=db_path) | |
| def add_obs(kv, folder='/home/user/proj', agent='kiro', n=1): | |
| ids = [] | |
| for i in range(n): | |
| result = folder_observe(kv, { | |
| 'folderPath': folder, | |
| 'agentId': agent, | |
| 'text': f'observation {i}', | |
| 'timestamp': datetime.datetime.utcnow().isoformat() + 'Z', | |
| }) | |
| ids.append(result['observationId']) | |
| return ids | |
| class TestForgetFullPair: | |
| def test_full_deletion_clears_obs(self, tmp_path): | |
| kv = make_kv(tmp_path) | |
| add_obs(kv, n=3) | |
| fp = 'home/user/proj' | |
| result = forget(kv, {'folderPath': '/home/user/proj', 'agentId': 'kiro'}) | |
| assert result['deleted'] >= 3 | |
| obs = kv.list(KV.folder_obs(fp, 'kiro')) | |
| assert len(obs) == 0 | |
| def test_full_deletion_removes_index_entry(self, tmp_path): | |
| kv = make_kv(tmp_path) | |
| add_obs(kv) | |
| fp = 'home/user/proj' | |
| forget(kv, {'folderPath': '/home/user/proj', 'agentId': 'kiro'}) | |
| entry = kv.get(KV.folders, f'{fp}:kiro') | |
| assert entry is None | |
| def test_full_deletion_removes_meta(self, tmp_path): | |
| kv = make_kv(tmp_path) | |
| add_obs(kv) | |
| fp = 'home/user/proj' | |
| forget(kv, {'folderPath': '/home/user/proj', 'agentId': 'kiro'}) | |
| meta = kv.get(KV.folder_meta(fp, 'kiro'), 'meta') | |
| assert meta is None | |
| def test_deleted_count_matches(self, tmp_path): | |
| kv = make_kv(tmp_path) | |
| add_obs(kv, n=5) | |
| result = forget(kv, {'folderPath': '/home/user/proj', 'agentId': 'kiro'}) | |
| assert result['deleted'] == 5 | |
| class TestForgetPartial: | |
| def test_partial_deletion(self, tmp_path): | |
| kv = make_kv(tmp_path) | |
| ids = add_obs(kv, n=4) | |
| fp = 'home/user/proj' | |
| to_delete = ids[:2] | |
| result = forget(kv, { | |
| 'folderPath': '/home/user/proj', | |
| 'agentId': 'kiro', | |
| 'observationIds': to_delete, | |
| }) | |
| assert result['deleted'] == 2 | |
| remaining = kv.list(KV.folder_obs(fp, 'kiro')) | |
| remaining_ids = {o['id'] for o in remaining} | |
| for oid in to_delete: | |
| assert oid not in remaining_ids | |
| def test_partial_decrements_obs_count(self, tmp_path): | |
| kv = make_kv(tmp_path) | |
| ids = add_obs(kv, n=4) | |
| fp = 'home/user/proj' | |
| forget(kv, { | |
| 'folderPath': '/home/user/proj', | |
| 'agentId': 'kiro', | |
| 'observationIds': ids[:2], | |
| }) | |
| meta = kv.get(KV.folder_meta(fp, 'kiro'), 'meta') | |
| assert meta['obsCount'] == 2 | |
| class TestForgetMemory: | |
| def test_delete_global_memory(self, tmp_path): | |
| kv = make_kv(tmp_path) | |
| from functions import remember | |
| result = remember(kv, {'content': 'Important insight', 'type': 'fact'}) | |
| mem_id = result['memory']['id'] | |
| forget_result = forget(kv, {'memoryId': mem_id}) | |
| assert forget_result['deleted'] >= 1 | |
| stored = kv.get(KV.memories, mem_id) | |
| assert stored is None | |