|
8 | 8 | import pytest
|
9 | 9 | from django.contrib.auth.models import AnonymousUser, Group
|
10 | 10 | from django.contrib.sessions.middleware import SessionMiddleware
|
| 11 | +from django.core.cache import caches |
11 | 12 | from django.test.client import RequestFactory
|
12 | 13 | from django.urls import resolve
|
13 | 14 | from mitol.common.factories import UserFactory
|
14 | 15 | from mitol.common.utils.datetime import now_in_utc
|
15 | 16 | from mitol.olposthog.features import is_enabled
|
16 | 17 |
|
| 18 | +from cms.api import create_featured_items |
17 | 19 | from cms.constants import CMS_EDITORS_GROUP_NAME
|
18 | 20 | from cms.factories import (
|
19 | 21 | CertificatePageFactory,
|
20 | 22 | CoursePageFactory,
|
21 | 23 | FlexiblePricingFormFactory,
|
| 24 | + HomePageFactory, |
22 | 25 | InstructorPageFactory,
|
23 | 26 | ProgramPageFactory,
|
24 | 27 | ResourcePageFactory,
|
|
45 | 48 | from flexiblepricing.constants import FlexiblePriceStatus
|
46 | 49 | from flexiblepricing.factories import FlexiblePriceFactory, FlexiblePriceTierFactory
|
47 | 50 | from flexiblepricing.models import FlexiblePrice
|
| 51 | +from main import features |
48 | 52 |
|
49 | 53 | pytestmark = [pytest.mark.django_db]
|
50 | 54 |
|
@@ -681,3 +685,80 @@ def test_flexible_pricing_request_form_context(flex_form_for_course):
|
681 | 685 | else:
|
682 | 686 | assert context["product"] is None
|
683 | 687 | assert context["product_page"] == course_page.url
|
| 688 | + |
| 689 | + |
| 690 | +def test_homepage__featured_products(settings, mocker): |
| 691 | + settings.FEATURES[features.ENABLE_NEW_DESIGN] = True |
| 692 | + now = now_in_utc() |
| 693 | + future_date = now + timedelta(days=1) |
| 694 | + past_date = now - timedelta(days=1) |
| 695 | + further_future_date = future_date + timedelta(days=1) |
| 696 | + further_past_date = past_date - timedelta(days=1) |
| 697 | + furthest_future_date = further_future_date + timedelta(days=1) |
| 698 | + redis_cache = caches["redis"] |
| 699 | + # Ensure the key is empty since pytest doesn't clear the cache between tests |
| 700 | + featured_courses = redis_cache.get("CMS_homepage_featured_courses") |
| 701 | + if featured_courses is not None: |
| 702 | + redis_cache.delete("CMS_homepage_featured_courses") |
| 703 | + assert redis_cache.get("CMS_homepage_featured_courses") is None |
| 704 | + |
| 705 | + enrollable_future_course = CourseFactory.create(page=None, live=True) |
| 706 | + enrollable_future_course_page = CoursePageFactory.create( |
| 707 | + course=enrollable_future_course, live=True |
| 708 | + ) |
| 709 | + enrollable_future_courserun = CourseRunFactory.create( |
| 710 | + course=enrollable_future_course, |
| 711 | + live=True, |
| 712 | + start_date=future_date, |
| 713 | + enrollment_start=further_past_date, |
| 714 | + enrollment_end=further_future_date, |
| 715 | + end_date=furthest_future_date, |
| 716 | + ) |
| 717 | + create_featured_items() |
| 718 | + assert len(redis_cache.get("CMS_homepage_featured_courses")) == 1 |
| 719 | + hf = HomePageFactory.create() |
| 720 | + assert hf.get_cached_featured_products == [ |
| 721 | + { |
| 722 | + "title": enrollable_future_course_page.title, |
| 723 | + "description": enrollable_future_course_page.description, |
| 724 | + "feature_image": enrollable_future_course_page.feature_image, |
| 725 | + "start_date": enrollable_future_courserun.start_date, |
| 726 | + "url_path": enrollable_future_course_page.get_url(), |
| 727 | + "is_program": enrollable_future_course_page.is_program_page, |
| 728 | + "is_self_paced": False, |
| 729 | + "program_type": None, |
| 730 | + } |
| 731 | + ] |
| 732 | + # Remove the previous course from the potential courses to be featured, this will also test a course as unenrollable |
| 733 | + enrollable_future_course.live = False |
| 734 | + enrollable_future_course.save() |
| 735 | + |
| 736 | + enrollable_future_course_with_no_enrollment_end = CourseFactory.create( |
| 737 | + page=None, live=True |
| 738 | + ) |
| 739 | + enrollable_future_course_with_no_enrollment_end_page = CoursePageFactory.create( |
| 740 | + course=enrollable_future_course_with_no_enrollment_end, live=True |
| 741 | + ) |
| 742 | + enrollable_future_courserun_with_no_enrollment_end = CourseRunFactory.create( |
| 743 | + course=enrollable_future_course_with_no_enrollment_end, |
| 744 | + live=True, |
| 745 | + start_date=future_date, |
| 746 | + enrollment_start=further_past_date, |
| 747 | + enrollment_end=None, |
| 748 | + end_date=furthest_future_date, |
| 749 | + ) |
| 750 | + create_featured_items() |
| 751 | + assert len(redis_cache.get("CMS_homepage_featured_courses")) == 1 |
| 752 | + hf = HomePageFactory.create() |
| 753 | + assert hf.get_cached_featured_products == [ |
| 754 | + { |
| 755 | + "title": enrollable_future_course_with_no_enrollment_end_page.title, |
| 756 | + "description": enrollable_future_course_with_no_enrollment_end_page.description, |
| 757 | + "feature_image": enrollable_future_course_with_no_enrollment_end_page.feature_image, |
| 758 | + "start_date": enrollable_future_courserun_with_no_enrollment_end.start_date, |
| 759 | + "url_path": enrollable_future_course_with_no_enrollment_end_page.get_url(), |
| 760 | + "is_program": enrollable_future_course_with_no_enrollment_end_page.is_program_page, |
| 761 | + "is_self_paced": False, |
| 762 | + "program_type": None, |
| 763 | + } |
| 764 | + ] |
0 commit comments