Skip to content

Commit 630720d

Browse files
authored
Merge pull request #2793 from tisnik/lcore-4342-cache-benchmarks-stub
LCORE-4342: cache benchmarks stub
2 parents d4cabfa + d2a946a commit 630720d

8 files changed

Lines changed: 221 additions & 0 deletions

‎tests/benchmarks/cache_data.py‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
"""Data used by cache benchmarks."""
2+
3+
from cache.cache_entry import CacheEntry
4+
from utils import suid
5+
6+
USER_ID = suid.get_suid()
7+
CONVERSATION_ID_1 = suid.get_suid()
8+
CONVERSATION_ID_2 = suid.get_suid()
9+
USER_PROVIDED_USER_ID = "test-user1"
10+
cache_entry_1 = CacheEntry(
11+
query="user message1",
12+
response="AI message1",
13+
provider="foo",
14+
model="bar",
15+
started_at="2025-10-03T09:31:25Z",
16+
completed_at="2025-10-03T09:31:29Z",
17+
)
18+
cache_entry_2 = CacheEntry(
19+
query="user message2",
20+
response="AI message2",
21+
provider="foo",
22+
model="bar",
23+
started_at="2025-10-03T09:31:25Z",
24+
completed_at="2025-10-03T09:31:29Z",
25+
)

‎tests/benchmarks/conftest.py‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import pytest
77

88
from app import database
9+
from cache.noop_cache import NoopCache
910
from configuration import AppConfig, configuration
1011

1112

@@ -125,3 +126,17 @@ def postgres_database_fixture(configuration_filename_postgres: str) -> None:
125126
# initialize database session and create tables
126127
database.initialize_database()
127128
database.create_tables()
129+
130+
131+
@pytest.fixture(name="noop_cache_fixture")
132+
def noop_cache() -> NoopCache:
133+
"""Fixture with constructed and initialized in memory cache object.
134+
135+
Create and initialize an in-memory NoopCache for use as a test fixture.
136+
137+
Returns:
138+
NoopCache: An initialized NoopCache instance ready for tests.
139+
"""
140+
c = NoopCache()
141+
c.initialize_cache()
142+
return c
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
"""Benchmarks for cache method connect."""
2+
3+
from pytest_benchmark.fixture import BenchmarkFixture
4+
5+
from cache.noop_cache import NoopCache
6+
7+
8+
def test_noop_cache(noop_cache_fixture: NoopCache, benchmark: BenchmarkFixture) -> None:
9+
"""Benchmark for the connect method."""
10+
benchmark(noop_cache_fixture.connect)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"""Benchmarks for deleting data from cache."""
2+
3+
from pytest_benchmark.fixture import BenchmarkFixture
4+
5+
from cache.noop_cache import NoopCache
6+
7+
from .cache_data import (
8+
CONVERSATION_ID_1,
9+
USER_ID,
10+
USER_PROVIDED_USER_ID,
11+
cache_entry_1,
12+
)
13+
14+
15+
def test_noop_cache_existing_conversation(
16+
noop_cache_fixture: NoopCache, benchmark: BenchmarkFixture
17+
) -> None:
18+
"""Benchmark for deleting an existing conversation."""
19+
noop_cache_fixture.insert_or_append(USER_ID, CONVERSATION_ID_1, cache_entry_1)
20+
benchmark(noop_cache_fixture.delete, USER_ID, CONVERSATION_ID_1)
21+
22+
23+
def test_noop_cache_nonexistent_conversation(
24+
noop_cache_fixture: NoopCache, benchmark: BenchmarkFixture
25+
) -> None:
26+
"""Benchmark for deleting a conversation that doesn't exist."""
27+
benchmark(noop_cache_fixture.delete, USER_ID, CONVERSATION_ID_1)
28+
29+
30+
def test_noop_cache_skip_user_id_check(
31+
noop_cache_fixture: NoopCache, benchmark: BenchmarkFixture
32+
) -> None:
33+
"""Benchmark for deleting an existing conversation."""
34+
skip_user_id_check = True
35+
noop_cache_fixture.insert_or_append(
36+
USER_PROVIDED_USER_ID, CONVERSATION_ID_1, cache_entry_1, skip_user_id_check
37+
)
38+
39+
benchmark(
40+
noop_cache_fixture.delete,
41+
USER_PROVIDED_USER_ID,
42+
CONVERSATION_ID_1,
43+
skip_user_id_check,
44+
)

‎tests/benchmarks/test_cache_get.py‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
"""Benchmarks for retrieving data from cache."""
2+
3+
from pytest_benchmark.fixture import BenchmarkFixture
4+
5+
from cache.noop_cache import NoopCache
6+
7+
from .cache_data import (
8+
CONVERSATION_ID_1,
9+
CONVERSATION_ID_2,
10+
USER_ID,
11+
cache_entry_1,
12+
cache_entry_2,
13+
)
14+
15+
16+
def test_noop_cache_empty_cache(
17+
noop_cache_fixture: NoopCache, benchmark: BenchmarkFixture
18+
) -> None:
19+
"""Benchmark retrieving existing items."""
20+
# this UUID is different from DEFAULT_USER_UID
21+
benchmark(
22+
noop_cache_fixture.get,
23+
"ffffffff-ffff-ffff-ffff-ffffffffffff",
24+
CONVERSATION_ID_1,
25+
)
26+
27+
28+
def test_noop_cache_existing_user(
29+
noop_cache_fixture: NoopCache, benchmark: BenchmarkFixture
30+
) -> None:
31+
"""Benchmark retrieving existing items."""
32+
# this UUID is different from DEFAULT_USER_UID
33+
noop_cache_fixture.insert_or_append(
34+
USER_ID,
35+
CONVERSATION_ID_1,
36+
cache_entry_1,
37+
)
38+
noop_cache_fixture.insert_or_append(
39+
USER_ID,
40+
CONVERSATION_ID_2,
41+
cache_entry_2,
42+
)
43+
benchmark(
44+
noop_cache_fixture.get,
45+
USER_ID,
46+
CONVERSATION_ID_1,
47+
)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
"""Benchmarks for cache method insert__or_append."""
2+
3+
from pytest_benchmark.fixture import BenchmarkFixture
4+
5+
from cache.noop_cache import NoopCache
6+
7+
from .cache_data import (
8+
CONVERSATION_ID_1,
9+
USER_ID,
10+
cache_entry_1,
11+
)
12+
13+
14+
def test_noop_cache(noop_cache_fixture: NoopCache, benchmark: BenchmarkFixture) -> None:
15+
"""Benchmark for the insert_or_append method."""
16+
benchmark(
17+
noop_cache_fixture.insert_or_append,
18+
USER_ID,
19+
CONVERSATION_ID_1,
20+
cache_entry_1,
21+
)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""Benchmarks for cache method insert__or_append."""
2+
3+
from pytest_benchmark.fixture import BenchmarkFixture
4+
5+
from cache.noop_cache import NoopCache
6+
7+
from .cache_data import (
8+
CONVERSATION_ID_1,
9+
CONVERSATION_ID_2,
10+
USER_ID,
11+
cache_entry_1,
12+
cache_entry_2,
13+
)
14+
15+
16+
def test_noop_cache(noop_cache_fixture: NoopCache, benchmark: BenchmarkFixture) -> None:
17+
"""Benchmark for insert_or_append method for existing item."""
18+
noop_cache_fixture.insert_or_append(
19+
USER_ID,
20+
CONVERSATION_ID_1,
21+
cache_entry_1,
22+
)
23+
benchmark(
24+
noop_cache_fixture.insert_or_append,
25+
USER_ID,
26+
CONVERSATION_ID_2,
27+
cache_entry_2,
28+
)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
"""Benchmarks for cache method insert__or_append."""
2+
3+
from pytest_benchmark.fixture import BenchmarkFixture
4+
5+
from cache.noop_cache import NoopCache
6+
7+
from .cache_data import (
8+
CONVERSATION_ID_1,
9+
USER_PROVIDED_USER_ID,
10+
cache_entry_1,
11+
)
12+
13+
14+
def test_noop_cache(noop_cache_fixture: NoopCache, benchmark: BenchmarkFixture) -> None:
15+
"""Benchmark for the insert_or_append method.
16+
17+
Verify that insert_or_append accepts a non-UUID user identifier when
18+
skip_user_id_check is True.
19+
20+
This test calls insert_or_append with a user-provided (non-UUID) user id, a
21+
conversation id, and a cache entry while passing skip_user_id_check=True;
22+
the operation is expected to complete without raising an exception.
23+
"""
24+
skip_user_id_check = True
25+
benchmark(
26+
noop_cache_fixture.insert_or_append,
27+
USER_PROVIDED_USER_ID,
28+
CONVERSATION_ID_1,
29+
cache_entry_1,
30+
skip_user_id_check,
31+
)

0 commit comments

Comments
 (0)