9
9
10
10
import pytest
11
11
from django .forms .models import model_to_dict
12
- from django .utils import timezone
13
12
14
13
from learning_resources .constants import (
15
14
CURRENCY_USD ,
@@ -364,11 +363,11 @@ def test_load_program_bad_platform(mocker):
364
363
@pytest .mark .parametrize ("course_exists" , [True , False ])
365
364
@pytest .mark .parametrize ("is_published" , [True , False ])
366
365
@pytest .mark .parametrize ("is_run_published" , [True , False ])
367
- @pytest .mark .parametrize ("blocklisted" , [True , False ])
366
+ @pytest .mark .parametrize ("blocklisted" , [False , True ])
368
367
@pytest .mark .parametrize ("delivery" , [LearningResourceDelivery .hybrid .name , None ])
369
368
@pytest .mark .parametrize ("has_upcoming_run" , [True , False ])
370
369
@pytest .mark .parametrize ("has_departments" , [True , False ])
371
- def test_load_course ( # noqa: PLR0913,PLR0912,PLR0915
370
+ def test_load_course ( # noqa: PLR0913,PLR0912,PLR0915, C901
372
371
mock_upsert_tasks ,
373
372
course_exists ,
374
373
is_published ,
@@ -391,30 +390,45 @@ def test_load_course( # noqa: PLR0913,PLR0912,PLR0915
391
390
392
391
learning_resource .published = is_published
393
392
394
- start_date = (
395
- timezone .now () + timedelta (10 )
396
- if has_upcoming_run
397
- else timezone .now () - timedelta (1 )
398
- )
399
- old_start_date = timezone .now () - timedelta (365 )
393
+ now = now_in_utc ()
394
+ start_date = now + timedelta (10 ) if has_upcoming_run else now - timedelta (10 )
395
+ end_date = start_date + timedelta (30 )
396
+ old_start_date = now - timedelta (365 )
397
+ old_end_date = old_start_date + timedelta (30 )
400
398
401
399
if course_exists :
402
400
run = LearningResourceRunFactory .create (
403
- learning_resource = learning_resource , published = True , start_date = start_date
401
+ learning_resource = learning_resource ,
402
+ published = True ,
403
+ enrollment_start = start_date - timedelta (30 ),
404
+ start_date = start_date ,
405
+ end_date = end_date ,
406
+ enrollment_end = end_date - timedelta (30 ),
404
407
)
405
408
old_run = LearningResourceRunFactory .create (
406
409
learning_resource = learning_resource ,
407
410
published = True ,
408
411
start_date = old_start_date ,
412
+ end_date = old_end_date ,
413
+ enrollment_start = old_start_date - timedelta (30 ),
414
+ enrollment_end = old_end_date - timedelta (30 ),
409
415
)
410
- learning_resource .runs .set ([run ])
416
+ learning_resource .runs .set ([run , old_run ])
411
417
learning_resource .save ()
412
418
else :
413
- run = LearningResourceRunFactory .build (start_date = start_date )
419
+ run = LearningResourceRunFactory .build (
420
+ start_date = start_date ,
421
+ end_date = end_date ,
422
+ enrollment_start = start_date - timedelta (30 ),
423
+ enrollment_end = end_date - timedelta (30 ),
424
+ )
414
425
old_run = LearningResourceRunFactory .build (
415
426
learning_resource = learning_resource ,
416
427
published = True ,
417
428
start_date = old_start_date ,
429
+ end_date = old_end_date ,
430
+ enrollment_start = old_start_date - timedelta (30 ),
431
+ enrollment_end = old_end_date - timedelta (30 ),
418
432
)
419
433
assert Course .objects .count () == (1 if course_exists else 0 )
420
434
if has_departments :
@@ -451,7 +465,7 @@ def test_load_course( # noqa: PLR0913,PLR0912,PLR0915
451
465
{
452
466
"run_id" : run .run_id ,
453
467
"enrollment_start" : run .enrollment_start ,
454
- "start_date" : start_date ,
468
+ "start_date" : run . start_date ,
455
469
"end_date" : run .end_date ,
456
470
"prices" : [
457
471
{"amount" : Decimal ("0.00" ), "currency" : CURRENCY_USD },
@@ -468,10 +482,11 @@ def test_load_course( # noqa: PLR0913,PLR0912,PLR0915
468
482
result = load_course (props , blocklist , [], config = CourseLoaderConfig (prune = True ))
469
483
assert result .professional is True
470
484
471
- expected_next_start_date = (
472
- start_date if has_upcoming_run and is_run_published else None
473
- )
474
- assert result .next_start_date == expected_next_start_date
485
+ if is_published and is_run_published and not blocklisted :
486
+ if has_upcoming_run :
487
+ assert result .next_start_date == start_date
488
+ else :
489
+ assert result .next_start_date .date () == now .date ()
475
490
assert result .prices == (
476
491
[Decimal ("0.00" ), Decimal ("49.00" )]
477
492
if is_run_published and result .certification
@@ -1769,6 +1784,34 @@ def test_load_run_dependent_values(certification):
1769
1784
assert getattr (result , key ) == getattr (course , key ) == getattr (run , key )
1770
1785
1771
1786
1787
+ def test_load_run_dependent_values_resets_next_start_date ():
1788
+ """Test that next_start_date is reset to None when best_run becomes None"""
1789
+ # Create a published course with an existing next_start_date
1790
+ previous_date = now_in_utc () + timedelta (days = 5 )
1791
+ course = LearningResourceFactory .create (
1792
+ is_course = True ,
1793
+ published = True ,
1794
+ next_start_date = previous_date , # Course previously had a start date
1795
+ )
1796
+
1797
+ # Ensure course has no runs, so best_run will return None
1798
+ course .runs .all ().update (published = False )
1799
+ assert course .best_run is None
1800
+
1801
+ # Verify the course initially has a next_start_date
1802
+ assert course .next_start_date == previous_date
1803
+
1804
+ # Call load_run_dependent_values
1805
+ result = load_run_dependent_values (course )
1806
+
1807
+ # Refresh course from database
1808
+ course .refresh_from_db ()
1809
+
1810
+ # Verify that next_start_date was reset to None
1811
+ assert result .next_start_date is None
1812
+ assert course .next_start_date is None
1813
+
1814
+
1772
1815
@pytest .mark .parametrize (
1773
1816
("is_scholar_course" , "tag_counts" , "expected_score" ),
1774
1817
[
0 commit comments