|
1 | 1 | import dataclasses |
2 | 2 | import re |
3 | | -from datetime import datetime |
4 | | -from typing import List, Optional |
| 3 | +from datetime import datetime, timedelta, timezone |
| 4 | +from typing import List, Optional, cast |
5 | 5 |
|
6 | 6 | import pytest |
7 | 7 | from pytest_mock import MockerFixture |
@@ -53,13 +53,20 @@ def create_session(self, name: str, dbid: str, pwd: str, memory: str) -> Session |
53 | 53 | created_at=datetime.fromisoformat("2021-01-01T00:00:00+00:00"), |
54 | 54 | host="foo.bar", |
55 | 55 | expiry_date=None, |
| 56 | + ttl=None, |
56 | 57 | ) |
57 | 58 |
|
58 | 59 | self.id_counter += 1 |
59 | 60 | self._sessions[details.id] = details |
60 | 61 |
|
61 | 62 | return details |
62 | 63 |
|
| 64 | + def add_session(self, session: SessionDetails) -> None: |
| 65 | + if session.id in self._sessions: |
| 66 | + raise ValueError(f"Session with id {session.id} already exists.") |
| 67 | + |
| 68 | + self._sessions[session.id] = session |
| 69 | + |
63 | 70 | def create_instance(self, name: str, memory: str, cloud_provider: str, region: str) -> InstanceCreateDetails: |
64 | 71 | id = f"ffff{self.id_counter}" |
65 | 72 | create_details = InstanceCreateDetails( |
@@ -236,6 +243,54 @@ def test_get_or_create_duplicate_session(aura_api: AuraApi) -> None: |
236 | 243 | sessions.get_or_create("one", SessionMemory.m_8GB, DbmsConnectionInfo(db.connection_url, "", "")) |
237 | 244 |
|
238 | 245 |
|
| 246 | +def test_get_or_create_expired_session(aura_api: AuraApi) -> None: |
| 247 | + db = _setup_db_instance(aura_api) |
| 248 | + |
| 249 | + fake_aura_api = cast(FakeAuraApi, aura_api) |
| 250 | + fake_aura_api.add_session( |
| 251 | + SessionDetails( |
| 252 | + id="ffff0-ffff1", |
| 253 | + name="one", |
| 254 | + instance_id=db.id, |
| 255 | + memory=SessionMemory.m_8GB.value, |
| 256 | + status="Expired", |
| 257 | + created_at=datetime.now(), |
| 258 | + host="foo.bar", |
| 259 | + expiry_date=None, |
| 260 | + ttl=None, |
| 261 | + ) |
| 262 | + ) |
| 263 | + |
| 264 | + with pytest.raises( |
| 265 | + RuntimeError, match=re.escape("Session `one` is expired. Please delete it and create a new one.") |
| 266 | + ): |
| 267 | + sessions = DedicatedSessions(aura_api) |
| 268 | + sessions.get_or_create("one", SessionMemory.m_8GB, DbmsConnectionInfo(db.connection_url, "", "")) |
| 269 | + |
| 270 | + |
| 271 | +def test_get_or_create_soon_expired_session(aura_api: AuraApi) -> None: |
| 272 | + db = _setup_db_instance(aura_api) |
| 273 | + |
| 274 | + fake_aura_api = cast(FakeAuraApi, aura_api) |
| 275 | + fake_aura_api.add_session( |
| 276 | + SessionDetails( |
| 277 | + id="ffff0-ffff1", |
| 278 | + name="one", |
| 279 | + instance_id=db.id, |
| 280 | + memory=SessionMemory.m_8GB.value, |
| 281 | + status="Ready", |
| 282 | + created_at=datetime.now(), |
| 283 | + host="foo.bar", |
| 284 | + expiry_date=datetime.now(tz=timezone.utc) - timedelta(hours=23), |
| 285 | + ttl=None, |
| 286 | + ) |
| 287 | + ) |
| 288 | + |
| 289 | + with pytest.raises(Warning, match=re.escape("Session `one` is expiring in less than a day.")): |
| 290 | + sessions = DedicatedSessions(aura_api) |
| 291 | + sessions.get_or_create("one", SessionMemory.m_8GB, DbmsConnectionInfo(db.connection_url, "", "")) |
| 292 | + |
| 293 | + |
239 | 294 | def test_delete_session(aura_api: AuraApi) -> None: |
240 | 295 | db1 = aura_api.create_instance("db1", "1GB", "aura", "leipzig").id |
241 | 296 | db2 = aura_api.create_instance("db2", "1GB", "aura", "dresden").id |
|
0 commit comments