|
| 1 | +from datetime import datetime, timedelta |
1 | 2 | from unittest.mock import Mock |
2 | 3 |
|
3 | 4 | import click |
4 | 5 | import pytest |
5 | 6 | from jumpstarter_cli_common.opt import parse_comma_separated |
6 | 7 |
|
7 | | -from jumpstarter.client.grpc import Exporter, ExporterList, Lease |
| 8 | +from jumpstarter.client.grpc import Exporter, ExporterList, Lease, LeaseList |
8 | 9 | from jumpstarter.config.client import ClientConfigV1Alpha1 |
9 | 10 |
|
10 | 11 |
|
@@ -239,3 +240,109 @@ def test_exporter_to_exporter_list_flow(self): |
239 | 240 | assert exporter_list.exporters[1].name == "server-001" |
240 | 241 | assert exporter_list.include_online is True |
241 | 242 | assert exporter_list.include_leases is False |
| 243 | + |
| 244 | + |
| 245 | +class TestGetLeasesLogic: |
| 246 | + """Tests for get leases command logic (simulating server-side filtering)""" |
| 247 | + |
| 248 | + def create_test_lease(self, namespace="default", name="lease-1", status="In-Use", |
| 249 | + effective_begin_time=None, effective_end_time=None, |
| 250 | + duration=timedelta(hours=1)): |
| 251 | + """Create a mock lease for testing""" |
| 252 | + lease = Mock(spec=Lease) |
| 253 | + lease.namespace = namespace |
| 254 | + lease.name = name |
| 255 | + lease.client = "test-client" |
| 256 | + lease.exporter = "test-exporter" |
| 257 | + lease.get_status.return_value = status |
| 258 | + lease.effective_begin_time = effective_begin_time |
| 259 | + lease.effective_end_time = effective_end_time |
| 260 | + lease.duration = duration |
| 261 | + lease.effective_duration = timedelta(minutes=30) if effective_begin_time else None |
| 262 | + lease.begin_time = None |
| 263 | + return lease |
| 264 | + |
| 265 | + def test_only_active_excludes_expired_leases(self): |
| 266 | + """Test that server returns only active leases when only_active=True""" |
| 267 | + # When only_active=True, server returns only active lease |
| 268 | + active_lease = self.create_test_lease( |
| 269 | + name="active-lease", |
| 270 | + status="In-Use", |
| 271 | + effective_begin_time=datetime(2023, 1, 1, 10, 0, 0) |
| 272 | + ) |
| 273 | + |
| 274 | + leases_from_server = LeaseList(leases=[active_lease], next_page_token=None) |
| 275 | + |
| 276 | + assert len(leases_from_server.leases) == 1 |
| 277 | + assert leases_from_server.leases[0].name == "active-lease" |
| 278 | + assert leases_from_server.leases[0].get_status() == "In-Use" |
| 279 | + |
| 280 | + def test_show_all_includes_expired_leases(self): |
| 281 | + """Test that server returns all leases including expired when only_active=False""" |
| 282 | + # When only_active=False, server returns both active and expired |
| 283 | + active_lease = self.create_test_lease( |
| 284 | + name="active-lease", |
| 285 | + status="In-Use", |
| 286 | + effective_begin_time=datetime(2023, 1, 1, 10, 0, 0) |
| 287 | + ) |
| 288 | + expired_lease = self.create_test_lease( |
| 289 | + name="expired-lease", |
| 290 | + status="Expired", |
| 291 | + effective_begin_time=datetime(2023, 1, 1, 8, 0, 0), |
| 292 | + effective_end_time=datetime(2023, 1, 1, 9, 0, 0) |
| 293 | + ) |
| 294 | + |
| 295 | + leases_from_server = LeaseList(leases=[active_lease, expired_lease], next_page_token=None) |
| 296 | + |
| 297 | + assert len(leases_from_server.leases) == 2 |
| 298 | + assert leases_from_server.leases[0].name == "active-lease" |
| 299 | + assert leases_from_server.leases[1].name == "expired-lease" |
| 300 | + |
| 301 | + def test_multiple_active_leases_returned(self): |
| 302 | + """Test that server returns all active leases when only_active=True""" |
| 303 | + # Server returns multiple active leases (different statuses but all non-expired) |
| 304 | + lease1 = self.create_test_lease( |
| 305 | + name="lease-1", |
| 306 | + status="In-Use", |
| 307 | + effective_begin_time=datetime(2023, 1, 1, 10, 0, 0) |
| 308 | + ) |
| 309 | + lease2 = self.create_test_lease( |
| 310 | + name="lease-2", |
| 311 | + status="Waiting", |
| 312 | + effective_begin_time=datetime(2023, 1, 1, 11, 0, 0) |
| 313 | + ) |
| 314 | + lease3 = self.create_test_lease( |
| 315 | + name="lease-3", |
| 316 | + status="In-Use", |
| 317 | + effective_begin_time=datetime(2023, 1, 1, 12, 0, 0) |
| 318 | + ) |
| 319 | + |
| 320 | + leases_from_server = LeaseList(leases=[lease1, lease2, lease3], next_page_token=None) |
| 321 | + |
| 322 | + assert len(leases_from_server.leases) == 3 |
| 323 | + assert all(lease.get_status() != "Expired" for lease in leases_from_server.leases) |
| 324 | + |
| 325 | + def test_all_expired_when_show_all(self): |
| 326 | + """Test that server can return only expired leases when only_active=False""" |
| 327 | + # When only_active=False and all leases happen to be expired |
| 328 | + expired1 = self.create_test_lease( |
| 329 | + name="expired-1", |
| 330 | + status="Expired", |
| 331 | + effective_end_time=datetime(2023, 1, 1, 8, 0, 0) |
| 332 | + ) |
| 333 | + expired2 = self.create_test_lease( |
| 334 | + name="expired-2", |
| 335 | + status="Expired", |
| 336 | + effective_end_time=datetime(2023, 1, 1, 9, 0, 0) |
| 337 | + ) |
| 338 | + |
| 339 | + leases_from_server = LeaseList(leases=[expired1, expired2], next_page_token=None) |
| 340 | + |
| 341 | + assert len(leases_from_server.leases) == 2 |
| 342 | + assert all(lease.get_status() == "Expired" for lease in leases_from_server.leases) |
| 343 | + |
| 344 | + def test_empty_lease_list(self): |
| 345 | + """Test that server can return empty lease list""" |
| 346 | + leases_from_server = LeaseList(leases=[], next_page_token=None) |
| 347 | + |
| 348 | + assert len(leases_from_server.leases) == 0 |
0 commit comments