hbmartin commited on
Commit
4258da6
·
1 Parent(s): dfbebc5

add tests for cli

Browse files
Files changed (2) hide show
  1. pytube/cli.py +4 -3
  2. tests/test_cli.py +75 -6
pytube/cli.py CHANGED
@@ -159,7 +159,7 @@ def on_progress(
159
  display_progress_bar(bytes_received, filesize)
160
 
161
 
162
- def download(youtube: YouTube, itag: str) -> None:
163
  """Start downloading a YouTube video.
164
 
165
  :param YouTube youtube:
@@ -170,13 +170,14 @@ def download(youtube: YouTube, itag: str) -> None:
170
  """
171
  # TODO(nficano): allow download target to be specified
172
  # TODO(nficano): allow dash itags to be selected
173
- youtube.register_on_progress_callback(on_progress)
174
- stream = youtube.streams.get_by_itag(int(itag))
175
  if stream is None:
176
  print("Could not find a stream with itag: {itag}".format(itag=itag))
177
  print("Try one of these:")
178
  display_streams(youtube)
179
  sys.exit()
 
 
180
  print("\n{fn} | {fs} bytes".format(fn=stream.default_filename, fs=stream.filesize,))
181
  try:
182
  stream.download()
 
159
  display_progress_bar(bytes_received, filesize)
160
 
161
 
162
+ def download(youtube: YouTube, itag: int) -> None:
163
  """Start downloading a YouTube video.
164
 
165
  :param YouTube youtube:
 
170
  """
171
  # TODO(nficano): allow download target to be specified
172
  # TODO(nficano): allow dash itags to be selected
173
+ stream = youtube.streams.get_by_itag(itag)
 
174
  if stream is None:
175
  print("Could not find a stream with itag: {itag}".format(itag=itag))
176
  print("Try one of these:")
177
  display_streams(youtube)
178
  sys.exit()
179
+
180
+ youtube.register_on_progress_callback(on_progress)
181
  print("\n{fn} | {fs} bytes".format(fn=stream.default_filename, fs=stream.filesize,))
182
  try:
183
  stream.download()
tests/test_cli.py CHANGED
@@ -1,12 +1,81 @@
1
  # -*- coding: utf-8 -*-
2
  from unittest import mock
 
3
 
4
- from pytube import cli
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
 
7
  @mock.patch("pytube.cli.YouTube")
8
- def test_download(youtube):
9
- instance = youtube.return_value
10
- instance.prefetch_descramble.return_value = None
11
- instance.streams = mock.Mock()
12
- cli.download(instance, 123)
 
 
 
 
 
 
1
  # -*- coding: utf-8 -*-
2
  from unittest import mock
3
+ from unittest.mock import MagicMock, patch
4
 
5
+ import pytest
6
+
7
+ from pytube import cli, StreamQuery, Caption, CaptionQuery
8
+
9
+
10
+ @mock.patch("pytube.cli.YouTube")
11
+ def test_download_when_itag_not_found(youtube):
12
+ youtube.streams = mock.Mock()
13
+ youtube.streams.all.return_value = []
14
+ youtube.streams.get_by_itag.return_value = None
15
+ with pytest.raises(SystemExit):
16
+ cli.download(youtube, 123)
17
+ youtube.streams.get_by_itag.assert_called_with(123)
18
+
19
+
20
+ @mock.patch("pytube.cli.YouTube")
21
+ @mock.patch("pytube.Stream")
22
+ def test_download_when_itag_is_found(youtube, stream):
23
+ stream.itag = 123
24
+ youtube.streams = StreamQuery([stream])
25
+ with patch.object(
26
+ youtube.streams, "get_by_itag", wraps=youtube.streams.get_by_itag
27
+ ) as wrapped_itag:
28
+ cli.download(youtube, 123)
29
+ wrapped_itag.assert_called_with(123)
30
+ youtube.register_on_progress_callback.assert_called_with(cli.on_progress)
31
+ stream.download.assert_called()
32
+
33
+
34
+ @mock.patch("pytube.cli.YouTube")
35
+ @mock.patch("pytube.Stream")
36
+ def test_display_stream(youtube, stream):
37
+ stream.itag = 123
38
+ stream.__repr__ = MagicMock(return_value="")
39
+ youtube.streams = StreamQuery([stream])
40
+ with patch.object(youtube.streams, "all", wraps=youtube.streams.all) as wrapped_all:
41
+ cli.display_streams(youtube)
42
+ wrapped_all.assert_called()
43
+ stream.__repr__.assert_called()
44
+
45
+
46
+ @mock.patch("pytube.cli.YouTube")
47
+ def test_download_caption_with_none(youtube):
48
+ caption = Caption(
49
+ {"url": "url1", "name": {"simpleText": "name1"}, "languageCode": "en"}
50
+ )
51
+ youtube.captions = CaptionQuery([caption])
52
+ with patch.object(
53
+ youtube.captions, "all", wraps=youtube.captions.all
54
+ ) as wrapped_all:
55
+ cli.download_caption(youtube, None)
56
+ wrapped_all.assert_called()
57
+
58
+
59
+ @mock.patch("pytube.cli.YouTube")
60
+ def test_download_caption_with_language_found(youtube):
61
+ youtube.title = "video title"
62
+ caption = Caption(
63
+ {"url": "url1", "name": {"simpleText": "name1"}, "languageCode": "en"}
64
+ )
65
+ caption.download = MagicMock(return_value="file_path")
66
+ youtube.captions = CaptionQuery([caption])
67
+ cli.download_caption(youtube, "en")
68
+ caption.download.assert_called_with(title="video title")
69
 
70
 
71
  @mock.patch("pytube.cli.YouTube")
72
+ def test_download_caption_with_language_not_found(youtube):
73
+ caption = Caption(
74
+ {"url": "url1", "name": {"simpleText": "name1"}, "languageCode": "en"}
75
+ )
76
+ youtube.captions = CaptionQuery([caption])
77
+ with patch.object(
78
+ youtube.captions, "all", wraps=youtube.captions.all
79
+ ) as wrapped_all:
80
+ cli.download_caption(youtube, "blah")
81
+ wrapped_all.assert_called()