|
1 | 1 | import logging
|
2 | 2 | import re
|
| 3 | +from copy import deepcopy |
3 | 4 |
|
4 | 5 | import pytest
|
5 | 6 | import redis
|
@@ -532,3 +533,73 @@ def scheduled_app(event, api, cache):
|
532 | 533 |
|
533 | 534 | with pytest.raises(redis.exceptions.ConnectionError):
|
534 | 535 | scheduled_app(event, context)
|
| 536 | + |
| 537 | + |
| 538 | +@pytest.mark.parametrize("merge_events", [True, False]) |
| 539 | +def test_merge_events_parameter(merge_events, context, mocker): |
| 540 | + @scheduled(merge_events=merge_events) |
| 541 | + def scheduled_app(event, api, state): |
| 542 | + # For this test, just return the processed event list for inspection. |
| 543 | + return event |
| 544 | + |
| 545 | + # Create two separate events with different schedule_start values. |
| 546 | + # Note: schedule_start is provided in milliseconds. |
| 547 | + event1 = RawScheduledDataTimeEvent( |
| 548 | + asset_id=1, |
| 549 | + interval=60, # interval value in seconds |
| 550 | + schedule=123, |
| 551 | + schedule_start=1744718400000, # 2025-04-15T12:00:00 in milliseconds |
| 552 | + schedule_end=1744718460000, # 2025-04-15T12:01:00 in milliseconds |
| 553 | + app_connection=1, |
| 554 | + app_stream=2, |
| 555 | + company=1, |
| 556 | + scheduler_type=SchedulerType.data_time, |
| 557 | + ).dict(by_alias=True, exclude_unset=True) |
| 558 | + |
| 559 | + event2 = RawScheduledDataTimeEvent( |
| 560 | + asset_id=1, |
| 561 | + interval=60, |
| 562 | + schedule=124, |
| 563 | + schedule_start=1744718460000, # 2025-04-15T12:01:00 in milliseconds |
| 564 | + schedule_end=1744718520000, # 2025-04-15T12:02:00 in milliseconds |
| 565 | + app_connection=1, |
| 566 | + app_stream=2, |
| 567 | + company=1, |
| 568 | + scheduler_type=SchedulerType.data_time, |
| 569 | + ).dict(by_alias=True, exclude_unset=True) |
| 570 | + original_event1 = deepcopy(event1) |
| 571 | + |
| 572 | + # Combine the events in the input structure |
| 573 | + events = [[event1, event2]] |
| 574 | + |
| 575 | + # Call the scheduled app which should process the events. |
| 576 | + result = scheduled_app(events, context) |
| 577 | + |
| 578 | + if merge_events: |
| 579 | + # When merging is enabled, the app should merge the input events |
| 580 | + # into a single event. |
| 581 | + assert ( |
| 582 | + len(result) == 1 |
| 583 | + ), "Expected a single merged event when merge_events is true." |
| 584 | + merged_event = result[0] |
| 585 | + |
| 586 | + # Calculate the expected start_time and end_time. |
| 587 | + expected_start_time = ( |
| 588 | + original_event1["schedule_start"] - original_event1["interval"] + 1 |
| 589 | + ) |
| 590 | + expected_end_time = event2["schedule_start"] |
| 591 | + |
| 592 | + assert ( |
| 593 | + merged_event.start_time == expected_start_time |
| 594 | + ), f"Expected time {expected_start_time}, got {merged_event.start_time}." |
| 595 | + # The merged event is expected to have an 'end_time' attribute set. |
| 596 | + actual_end_time = getattr(merged_event, "end_time", None) |
| 597 | + assert ( |
| 598 | + actual_end_time == expected_end_time |
| 599 | + ), f"Expected merged end_time {expected_end_time}, got {actual_end_time}." |
| 600 | + else: |
| 601 | + # When merging is disabled, the app should return the events as-is |
| 602 | + # (i.e. two separate events). |
| 603 | + assert ( |
| 604 | + len(result) == 2 |
| 605 | + ), "Expected two separate events when merge_events is false." |
0 commit comments