예제 #1
0
def test_load_topics(parent_factory, topics_exist):
    """Test that load_topics creates and/or assigns topics to the parent object"""
    topics = (CourseTopicFactory.create_batch(3)
              if topics_exist else CourseTopicFactory.build_batch(3))
    parent = parent_factory.create(no_topics=True)

    assert parent.topics.count() == 0

    load_topics(parent, [{"name": topic.name} for topic in topics])

    assert parent.topics.count() == len(topics)
예제 #2
0
def test_favorites_serializer():
    """
    Test that the favorite serializer generic foreign key works and also rejects unexpected classes
    """
    user = UserFactory.create()
    course = CourseFactory.create()
    bootcamp = BootcampFactory.create()
    user_list = UserListFactory.create(author=user)
    program = ProgramFactory.create()
    course_topic = CourseTopicFactory.create()

    favorite_item = FavoriteItem(user=user, item=course)
    serializer = FavoriteItemSerializer(favorite_item)
    assert serializer.data.get("content_data") == CourseSerializer(course).data

    favorite_item = FavoriteItem(user=user, item=bootcamp)
    serializer = FavoriteItemSerializer(favorite_item)
    assert serializer.data.get("content_data") == BootcampSerializer(
        bootcamp).data

    favorite_item = FavoriteItem(user=user, item=user_list)
    serializer = FavoriteItemSerializer(favorite_item)
    assert serializer.data.get("content_data") == UserListSerializer(
        user_list).data

    favorite_item = FavoriteItem(user=user, item=program)
    serializer = FavoriteItemSerializer(favorite_item)
    assert serializer.data.get("content_data") == ProgramSerializer(
        program).data

    favorite_item = FavoriteItem(user=user, item=course_topic)
    serializer = FavoriteItemSerializer(favorite_item)
    with pytest.raises(Exception):
        assert serializer.data.get("content_data").get("id") == course_topic.id
예제 #3
0
def test_user_list_items_endpoint_update_item(client, user, is_author,
                                              mock_user_list_index):
    """Test userlistitems endpoint for updating UserListItem positions"""
    author = UserFactory.create()
    topics = CourseTopicFactory.create_batch(3)
    userlist = UserListFactory.create(author=author,
                                      privacy_level=PrivacyLevel.public.value,
                                      topics=topics)
    list_item_1 = UserListItemFactory.create(user_list=userlist, position=0)
    list_item_2 = UserListItemFactory.create(user_list=userlist, position=1)
    list_item_3 = UserListItemFactory.create(user_list=userlist, position=2)

    client.force_login(author if is_author else user)

    data = {"position": 0}

    resp = client.patch(
        reverse("userlistitems-detail", args=[userlist.id, list_item_3.id]),
        data=data,
        format="json",
    )
    assert resp.status_code == (200 if is_author else 403)
    if resp.status_code == 200:
        assert resp.json()["position"] == 0
        mock_user_list_index.upsert_user_list.assert_called_once_with(
            userlist.id)
        for idx, item in enumerate([list_item_3, list_item_1, list_item_2]):
            item.refresh_from_db()
            assert item.position == idx
예제 #4
0
def test_topic_endpoint(client):
    """Test topic endpoint"""
    topics = CourseTopicFactory.create_batch(5)

    resp = client.get(reverse("topics-list"))
    assert resp.data.get("count") == 5

    topic = topics[0]
    resp = client.get(reverse("topics-detail", args=[topic.id]))
    assert resp.data == CourseTopicSerializer(topic).data
예제 #5
0
def test_serialize_bootcamp_related_models():
    """
    Verify that a serialized bootcamp contains attributes for related objects
    """
    bootcamp = BootcampFactory.create(
        topics=CourseTopicFactory.create_batch(3))
    serializer = BootcampSerializer(bootcamp)
    assert len(serializer.data["topics"]) == 3
    assert "name" in serializer.data["topics"][0].keys()
    assert len(serializer.data["runs"]) == 3
예제 #6
0
def test_serialize_course_related_models(offered_by):
    """
    Verify that a serialized course contains attributes for related objects
    """
    course = CourseFactory(offered_by=offered_by,
                           topics=CourseTopicFactory.create_batch(3))
    serializer = CourseSerializer(course)
    assert len(serializer.data["topics"]) == 3
    assert "name" in serializer.data["topics"][0].keys()
    assert len(serializer.data["runs"]) == 3
예제 #7
0
def test_serialize_program_related_models():
    """
    Verify that a serialized program contains attributes for related objects
    """
    program = ProgramFactory.create(topics=CourseTopicFactory.create_batch(3))
    ProgramItemCourseFactory.create_batch(4, program=program)
    serializer = ProgramSerializer(program)
    assert len(serializer.data["topics"]) == 3
    assert len(serializer.data["runs"]) == 1
    assert len(serializer.data["items"]) == 4
    assert "content_data" in serializer.data["items"][0].keys()
예제 #8
0
def test_userlist_serializer_validation(list_type, valid):
    """
    Test that the UserListSerializer validates list_type and topics correctly
    """
    topics = CourseTopicFactory.create_batch(2)
    data = {
        "title": "My List",
        "list_type": list_type,
        "topics": [topic.id for topic in topics],
    }
    serializer = UserListSerializer(data=data)
    assert serializer.is_valid() is valid
    data["topics"] = CourseTopicSerializer(instance=topics, many=True).data
    serializer = UserListSerializer(data=data)
    assert serializer.is_valid() is valid
예제 #9
0
def test_serialize_course_related_models():
    """
    Verify that a serialized course contains attributes for related objects
    """
    course = CourseFactory(
        topics=CourseTopicFactory.create_batch(3),
        prices=CoursePriceFactory.create_batch(2),
        instructors=CourseInstructorFactory.create_batch(2),
    )
    serializer = CourseSerializer(course)
    assert len(serializer.data["prices"]) == 2
    for attr in ("mode", "price"):
        assert attr in serializer.data["prices"][0].keys()
    assert len(serializer.data["instructors"]) == 2
    for attr in ("first_name", "last_name"):
        assert attr in serializer.data["instructors"][0].keys()
    assert len(serializer.data["topics"]) == 3
    assert "name" in serializer.data["topics"][0].keys()
예제 #10
0
def test_user_list_endpoint_patch(client, user, mock_user_list_index,
                                  update_topics):
    """Test userlist endpoint for updating a UserList"""
    [original_topic, new_topic] = CourseTopicFactory.create_batch(2)
    userlist = UserListFactory.create(author=user,
                                      title="Title 1",
                                      topics=[original_topic])
    UserListItemFactory.create(user_list=userlist)

    client.force_login(user)

    data = {"title": "Title 2"}
    if update_topics:
        data["topics"] = [new_topic.id]

    resp = client.patch(reverse("userlists-detail", args=[userlist.id]),
                        data=data,
                        format="json")
    assert resp.status_code == 200
    assert UserList.objects.get(id=userlist.id).title == "Title 2"
    assert resp.data["topics"][0]["id"] == (new_topic.id if update_topics else
                                            original_topic.id)
    mock_user_list_index.upsert_user_list.assert_called_once_with(userlist.id)