def test_Podcast_invalid_duration():
    """
    **GIVEN* an invalid metadata dictionary for Podcast that has an invalid 'duration' parameter\n
    **WHEN* a new Podcast is created\n
    **THEN* check that the constructor raises a MetadataValueError with the appropriate error
    """
    # Test for 'duration' field not an int
    with pytest.raises(MetadataValueError) as error:
        Podcast(metadata={
            "name": "sample-podcast",
            "duration": 45.3,
            "host": "host1"
        })

    assert str(
        error.value) == "metadata value is invalid for 'duration' - not an int"

    # Test for 'duration' field not positive
    with pytest.raises(MetadataValueError) as error:
        Podcast(metadata={
            "name": "sample-podcast",
            "duration": -45,
            "host": "host1"
        })

    assert str(error.value
               ) == "metadata value is invalid for 'duration' - not positive"
def test_Podcast_invalid_participants():
    """
    **GIVEN** an invalid metadata dict for Podcast that has an invalid 'participants' parameter\n
    **WHEN** a new Podcast is created\n
    **THEN** check that the constructor raises a MetadataValueError with the appropriate error
    """
    # Test for 'participants' field not a list
    with pytest.raises(MetadataValueError) as error:
        Podcast(
            metadata={
                "name": "sample-podcast",
                "duration": 45,
                "host": "host1",
                "participants": "cast1"
            })

    assert str(error.value
               ) == "metadata value is invalid for 'participants' - not a list"

    # Test for 'participants' field too long
    with pytest.raises(MetadataValueError) as error:
        Podcast(
            metadata={
                "name": "sample-podcast",
                "duration": 45,
                "host": "host1",
                "participants": ["cast1"] * 15
            })

    expected = "metadata value is invalid for 'participants' - too many participants"
    assert str(error.value) == expected

    # Test for 'participants' for a single participant str too long
    with pytest.raises(MetadataValueError) as error:
        Podcast(
            metadata={
                "name": "sample-podcast",
                "duration": 45,
                "host": "host1",
                "participants": ["cast1", "cast2" * 30]
            })

    expected = "metadata value is invalid for 'participants' - participant 2 - str too long"
    assert str(error.value) == expected

    # Test for 'participants' for a single participant not an str
    with pytest.raises(MetadataValueError) as error:
        Podcast(
            metadata={
                "name": "sample-podcast",
                "duration": 45,
                "host": "host1",
                "participants": ["cast1", 40]
            })

    expected = "metadata value is invalid for 'participants' - participant 2 - not an str"
    assert str(error.value) == expected
def test_Podcast_extra_uploadtime():
    """
    **GIVEN** a metadata dictionary for Podcast that has an 'uploadtime' parameter\n
    **WHEN** a new Podcast is created\n
    **THEN** check that the constructor raises a MetadataValueError with the appropriate
    error for invalid values and check attribute type and values for valid values
    """
    # Test for valid 'uploadtime'
    podcast = Podcast(
        metadata={
            "name": "sample-podcast",
            "duration": 45,
            "uploadtime": "2021-01-01",
            "host": "host1"
        })

    assert isinstance(podcast.ID, int)
    assert isinstance(podcast.name, str)
    assert isinstance(podcast.host, str)
    assert isinstance(podcast.participants, list)
    assert isinstance(podcast.duration, int)
    assert isinstance(podcast.metadata, dict)
    assert isinstance(podcast.uploadtime, datetime.datetime)

    assert podcast.ID == abs(hash(f"sample-podcast-45-2021-01-01T00:00:00"))
    assert podcast.name == "sample-podcast"
    assert podcast.host == "host1"
    assert podcast.participants == []
    assert podcast.duration == 45
    assert podcast.uploadtime == datetime.datetime.fromisoformat("2021-01-01")

    # Test for 'uploadtime' not an str
    with pytest.raises(MetadataValueError) as error:
        Podcast(metadata={
            "name": "sample-podcast",
            "duration": 45,
            "uploadtime": 3453
        })

    assert str(error.value
               ) == "metadata value is invalid for 'uploadtime' - not an str"

    # Test for 'uploadtime' not an ISO8601 string
    with pytest.raises(MetadataValueError) as error:
        Podcast(
            metadata={
                "name": "sample-podcast",
                "duration": 45,
                "uploadtime": "3453",
                "host": "host1"
            })

    assert str(error.value
               ) == "metadata value is invalid for 'uploadtime' - not ISO8601"
def test_Podcast_participants():
    """
    **GIVEN** a valid metadata dictionary for Podcast\n
    **WHEN** a new Podcast is created\n
    **THEN** check the type of Podcast attributes and their values.
    """
    # Test for valid metadata with a 'participants' field
    podcast = Podcast(
        metadata={
            "name": "sample-podcast",
            "duration": 45,
            "host": "host1",
            "participants": ["cast1", "cast2"]
        })

    assert isinstance(podcast.ID, int)
    assert isinstance(podcast.name, str)
    assert isinstance(podcast.host, str)
    assert isinstance(podcast.participants, list)
    assert isinstance(podcast.duration, int)
    assert isinstance(podcast.metadata, dict)
    assert isinstance(podcast.uploadtime, datetime.datetime)

    assert podcast.ID == abs(
        hash(f"sample-podcast-45-{podcast.uploadtime.isoformat()}"))
    assert podcast.name == "sample-podcast"
    assert podcast.host == "host1"
    assert podcast.participants == ["cast1", "cast2"]
    assert podcast.duration == 45
def test_Podcast_extra_ID():
    """
    **GIVEN** a metadata dictionary for Podcast that has an 'ID' parameter\n
    **WHEN** a new Podcast is created\n
    **THEN** check that the constructor raises a MetadataValueError with the appropriate
    error for invalid values and check attribute type and values for valid values
    """
    # Test for valid '_id'
    podcast = Podcast(metadata={
        "name": "sample-podcast",
        "duration": 45,
        "_id": 23214241,
        "host": "host1"
    })

    assert isinstance(podcast.ID, int)
    assert isinstance(podcast.name, str)
    assert isinstance(podcast.host, str)
    assert isinstance(podcast.participants, list)
    assert isinstance(podcast.duration, int)
    assert isinstance(podcast.metadata, dict)
    assert isinstance(podcast.uploadtime, datetime.datetime)

    assert podcast.ID == 23214241
    assert podcast.name == "sample-podcast"
    assert podcast.host == "host1"
    assert podcast.participants == []
    assert podcast.duration == 45

    # Test for '_id' not an int
    with pytest.raises(MetadataValueError) as error:
        Podcast(
            metadata={
                "name": "sample-podcast",
                "duration": 45,
                "_id": "3453",
                "host": "host1"
            })

    assert str(
        error.value) == "metadata value is invalid for '_id' - not an int"
def test_Podcast_invalid_name():
    """
    **GIVEN** an invalid metadata dictionary for Podcast that has an invalid 'name' parameter\n
    **WHEN** a new Podcast is created\n
    **THEN** check that the constructor raises a MetadataValueError with the appropriate error
    """
    # Test for 'name' field not an str
    with pytest.raises(MetadataValueError) as error:
        Podcast(metadata={"name": 20, "duration": 45, "host": "host1"})

    assert str(
        error.value) == "metadata value is invalid for 'name' - not an str"

    # Test for 'name' field too long
    with pytest.raises(MetadataValueError) as error:
        Podcast(metadata={
            "name": "sample-podcast" * 20,
            "duration": 45,
            "host": "host1"
        })

    assert str(
        error.value) == "metadata value is invalid for 'name' - str too long"
def test_Podcast_missing_metadata():
    """
    **GIVEN** an invalid metadata dictionary for Podcast that is missing a key\n
    **WHEN** a new Podcast is created\n
    **THEN** check that the constructor raises a MetadataValueError with the appropriate error
    """
    # Test for 'name' field missing
    with pytest.raises(MetadataValueError) as error:
        Podcast(metadata={"duration": 45, "host": "host1"})

    assert str(error.value) == "metadata value is missing for 'name'"

    # Test for 'duration' field missing
    with pytest.raises(MetadataValueError) as error:
        Podcast(metadata={"name": "sample-podcast", "host": "host1"})

    assert str(error.value) == "metadata value is missing for 'duration'"

    # Test for 'host' field missing
    with pytest.raises(MetadataValueError) as error:
        Podcast(metadata={"name": "sample-podcast", "duration": 45})

    assert str(error.value) == "metadata value is missing for 'host'"
示例#8
0
def generateAudio(audiotype: str, audiometadata: dict):
    """ A function that generates an Audio object, one of Song, Podcast and Audiobook
    and returns it. Returns None if the 'audiotype' is invalid. """
    try:
        audiotype = audiotype.lower()

        if audiotype == "song":
            file = Song(audiometadata)
        elif audiotype == "podcast":
            file = Podcast(audiometadata)
        elif audiotype == "audiobook":
            file = Audiobook(audiometadata)
        else:
            return None

        return file

    except MetadataValueError as error:
        raise MetadataValueError(error)

    except MetadataGenerationError as error:
        raise MetadataGenerationError(error)
def test_Podcast_extra_type():
    """
    **GIVEN** a metadata dictionary for Podcast that has an 'type' parameter\n
    **WHEN** a new Podcast is created\n
    **THEN** check that the constructor raises a MetadataValueError with the appropriate
    error for invalid values and check attribute type and values for valid values
    """
    # Test Case 1 - valid 'Podcast' type
    podcast = Podcast(
        metadata={
            "name": "sample-podcast",
            "duration": 45,
            "type": "Podcast",
            "host": "host1"
        })

    assert isinstance(podcast.ID, int)
    assert isinstance(podcast.name, str)
    assert isinstance(podcast.host, str)
    assert isinstance(podcast.participants, list)
    assert isinstance(podcast.duration, int)
    assert isinstance(podcast.metadata, dict)
    assert isinstance(podcast.uploadtime, datetime.datetime)

    assert podcast.ID == abs(
        hash(f"sample-podcast-45-{podcast.uploadtime.isoformat()}"))
    assert podcast.name == "sample-podcast"
    assert podcast.host == "host1"
    assert podcast.participants == []
    assert podcast.duration == 45

    assert isinstance(podcast.metadata['type'], str)
    assert podcast.metadata['type'] == "Podcast"

    # Test Case 2 - invalid 'Album' type - Podcast() will overwrite
    podcast = Podcast(metadata={
        "name": "sample-podcast",
        "duration": 45,
        "type": "Album",
        "host": "host1"
    })

    assert isinstance(podcast.ID, int)
    assert isinstance(podcast.name, str)
    assert isinstance(podcast.duration, int)
    assert isinstance(podcast.metadata, dict)
    assert isinstance(podcast.uploadtime, datetime.datetime)

    assert podcast.ID == abs(
        hash(f"sample-podcast-45-{podcast.uploadtime.isoformat()}"))
    assert podcast.name == "sample-podcast"
    assert podcast.host == "host1"
    assert podcast.participants == []
    assert podcast.duration == 45

    assert isinstance(podcast.metadata['type'], str)
    assert podcast.metadata['type'] == "Podcast"

    # Test Case 3 - invalid value and type 3423 - Podcast() will overwrite
    podcast = Podcast(metadata={
        "name": "sample-podcast",
        "duration": 45,
        "type": 3423,
        "host": "host1"
    })

    assert isinstance(podcast.ID, int)
    assert isinstance(podcast.name, str)
    assert isinstance(podcast.duration, int)
    assert isinstance(podcast.metadata, dict)
    assert isinstance(podcast.uploadtime, datetime.datetime)

    assert podcast.ID == abs(
        hash(f"sample-podcast-45-{podcast.uploadtime.isoformat()}"))
    assert podcast.name == "sample-podcast"
    assert podcast.duration == 45

    assert isinstance(podcast.metadata['type'], str)
    assert podcast.metadata['type'] == "Podcast"