Coverage for tests/test_wrapper_podcasttranscript.py: 100%

62 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-09 04:47 +0000

1#!/usr/bin/env python3 

2 

3import sys 

4import pytest 

5from unittest.mock import patch 

6from unittest.mock import MagicMock 

7from tests.torch_mock import TorchMock 

8from tests.openaiclient_mock import OpenAIClientMock 

9 

10mock_torch = TorchMock() 

11mock_openai = OpenAIClientMock() 

12 

13sys.path.append("wrapper") 

14sys.path.append("wrapper/podcasttranscript") 

15 

16with patch.dict(sys.modules, { 

17 'fitz': MagicMock(), 

18 'azure': MagicMock(), 

19 'azure.identity': MagicMock(), 

20 'nvidia_smi': MagicMock(), 

21 'tenacity': MagicMock(), 

22 'torch': mock_torch, 

23 'openai': mock_openai, 

24}): 

25 from podcasttranscript.wrapper_podcasttranscript import PodcastTranscriptGenerator 

26 from podcasttranscript.wrapper_podcasttranscript import Dialogue 

27 from podcasttranscript.wrapper_podcasttranscript import Script 

28 from podcasttranscript.wrapper_podcasttranscript import Scene 

29 from podcasttranscript.wrapper_podcasttranscript import Podcast 

30 

31 

32@pytest.mark.asyncio 

33async def test_podcast_transcript() -> None: 

34 model = PodcastTranscriptGenerator() 

35 assert model is not None 

36 assert model.model_name == "podcasttranscript" 

37 

38 model.init() 

39 health = model.get_health() 

40 assert health is not None 

41 assert health is not None 

42 timestamps = model.get_timestamps() 

43 assert timestamps is not None 

44 

45 with pytest.raises(ValueError): 

46 await model.get_rest_args({}) 

47 await model.get_rest_args({ 

48 "pdf_url": "http://example.com/doc.pdf" 

49 }) 

50 

51 await model.warmup() 

52 

53 with pytest.raises(ValueError): 

54 await model.generate() 

55 with pytest.raises(Exception, match="Failed to download PDF"): 

56 await model.generate(pdf_url="http://example.com/doc.pdf") 

57 with pytest.raises(Exception, match="Cannot query LLM for script"): 

58 await model.generate(pdf_url="https://arxiv.org/pdf/2501.16634") 

59 

60 

61def test_dialogue_str() -> None: 

62 """Dialogue.__str__() should format as 'character: transcript'.""" 

63 d = Dialogue(character="Alice", transcript="Hello world.") 

64 assert str(d) == "Alice: Hello world." 

65 

66 d_end = Dialogue(character="Bob", transcript="Goodbye.", end_script=True) 

67 assert str(d_end) == "Bob: Goodbye." 

68 

69 

70def test_script_str() -> None: 

71 """Script.__str__() should list all dialogues prefixed with 'Script:'.""" 

72 script = Script(dialogues=[ 

73 Dialogue(character="Alice", transcript="Hi there."), 

74 Dialogue(character="Bob", transcript="Hey!"), 

75 ]) 

76 result = str(script) 

77 assert result.startswith("Script:") 

78 assert "Alice: Hi there." in result 

79 assert "Bob: Hey!" in result 

80 

81 

82def test_scene_str() -> None: 

83 """Scene.__str__() should list characters and all dialogue lines.""" 

84 scene = Scene( 

85 characters=["Alice", "Bob"], 

86 dialogues=[ 

87 Dialogue(character="Alice", transcript="Welcome."), 

88 Dialogue(character="Bob", transcript="Thanks."), 

89 ], 

90 ) 

91 result = str(scene) 

92 assert "Alice" in result 

93 assert "Bob" in result 

94 assert "Welcome." in result 

95 assert "Thanks." in result 

96 

97 

98def test_podcast_str() -> None: 

99 """Podcast.__str__() should include scene indices and dialogue text.""" 

100 podcast = Podcast(scenes=[ 

101 Scene( 

102 characters=["Alice"], 

103 dialogues=[Dialogue(character="Alice", transcript="Scene zero.")], 

104 ), 

105 Scene( 

106 characters=["Bob"], 

107 dialogues=[Dialogue(character="Bob", transcript="Scene one.")], 

108 ), 

109 ]) 

110 result = str(podcast) 

111 assert "Scene: 0" in result 

112 assert "Scene: 1" in result 

113 assert "Scene zero." in result 

114 assert "Scene one." in result