rev-api 2.2.1 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +22 -21
  3. data/.ruby-gemset +1 -1
  4. data/.ruby-version +1 -1
  5. data/.travis.yml +8 -8
  6. data/Gemfile +3 -3
  7. data/LICENSE +191 -191
  8. data/README.md +131 -132
  9. data/Rakefile +13 -13
  10. data/examples/cli.rb +270 -270
  11. data/lib/rev-api.rb +26 -26
  12. data/lib/rev-api/api.rb +326 -326
  13. data/lib/rev-api/api_serializable.rb +30 -30
  14. data/lib/rev-api/exceptions.rb +97 -97
  15. data/lib/rev-api/http_client.rb +97 -97
  16. data/lib/rev-api/models/order.rb +129 -130
  17. data/lib/rev-api/models/order_request.rb +292 -194
  18. data/lib/rev-api/version.rb +3 -3
  19. data/rev-api.gemspec +33 -34
  20. data/spec/fixtures/api_cassettes/cancel_order.yml +38 -38
  21. data/spec/fixtures/api_cassettes/cancel_order_not_allowed.yml +40 -40
  22. data/spec/fixtures/api_cassettes/get_attachment_content.yml +399 -399
  23. data/spec/fixtures/api_cassettes/get_attachment_content_as_pdf.yml +399 -399
  24. data/spec/fixtures/api_cassettes/get_attachment_content_as_text.yml +65 -65
  25. data/spec/fixtures/api_cassettes/get_attachment_content_as_youtube_transcript.yml +66 -66
  26. data/spec/fixtures/api_cassettes/get_attachment_content_unacceptable_representation.yml +42 -42
  27. data/spec/fixtures/api_cassettes/get_attachment_content_with_invalid_id.yml +42 -42
  28. data/spec/fixtures/api_cassettes/get_attachment_metadata.yml +42 -42
  29. data/spec/fixtures/api_cassettes/get_attachment_with_invalid_id.yml +40 -40
  30. data/spec/fixtures/api_cassettes/get_orders.yml +122 -122
  31. data/spec/fixtures/api_cassettes/get_orders_with_clientRef.yml +41 -41
  32. data/spec/fixtures/api_cassettes/get_tc_order.yml +44 -44
  33. data/spec/fixtures/api_cassettes/get_third_page_of_orders.yml +52 -52
  34. data/spec/fixtures/api_cassettes/link_input.yml +44 -44
  35. data/spec/fixtures/api_cassettes/link_input_with_all_attributes.yml +44 -44
  36. data/spec/fixtures/api_cassettes/link_input_with_spaces_in_filename.yml +45 -45
  37. data/spec/fixtures/api_cassettes/not_found_order.yml +42 -42
  38. data/spec/fixtures/api_cassettes/submit_cp_order.yml +44 -45
  39. data/spec/fixtures/api_cassettes/submit_su_order.yml +44 -45
  40. data/spec/fixtures/api_cassettes/submit_tc_order_with_account_balance.yml +44 -45
  41. data/spec/fixtures/api_cassettes/submit_tc_order_with_invalid_request.yml +45 -45
  42. data/spec/fixtures/api_cassettes/submit_tc_order_without_specifying_payment.yml +44 -45
  43. data/spec/fixtures/api_cassettes/unauthorized.yml +42 -42
  44. data/spec/fixtures/api_cassettes/upload_input.yml +90 -90
  45. data/spec/fixtures/api_cassettes/upload_input_with_invalid_content_type.yml +91 -91
  46. data/spec/lib/rev/api_spec.rb +30 -24
  47. data/spec/lib/rev/cancel_order_spec.rb +24 -24
  48. data/spec/lib/rev/exceptions_spec.rb +8 -8
  49. data/spec/lib/rev/get_attachment_content_spec.rb +79 -79
  50. data/spec/lib/rev/get_attachment_metadata_spec.rb +33 -33
  51. data/spec/lib/rev/get_order_spec.rb +52 -52
  52. data/spec/lib/rev/get_orders_spec.rb +62 -62
  53. data/spec/lib/rev/http_client_spec.rb +32 -32
  54. data/spec/lib/rev/models/order_request_spec.rb +122 -11
  55. data/spec/lib/rev/models/order_spec.rb +58 -58
  56. data/spec/lib/rev/post_inputs_spec.rb +94 -94
  57. data/spec/lib/rev/post_order_spec.rb +163 -163
  58. data/spec/spec_helper.rb +47 -49
  59. data/spec/test_helpers.rb +5 -0
  60. metadata +54 -69
  61. data/.coveralls.yml +0 -2
@@ -1,32 +1,32 @@
1
- require_relative '../../spec_helper'
2
-
3
- describe Rev::HttpClient do
4
- it 'must support predefined production host' do
5
- client = Rev::HttpClient.new('foo', 'bar', Rev::Api::PRODUCTION_HOST)
6
- Rev::HttpClient.base_uri.must_equal 'https://www.rev.com/api/v1'
7
- end
8
-
9
- it 'must support predefined sandbox host' do
10
- client = Rev::HttpClient.new('foo', 'bar', Rev::Api::SANDBOX_HOST)
11
- Rev::HttpClient.base_uri.must_equal 'https://api-sandbox.rev.com/api/v1'
12
- end
13
-
14
- it 'must support custom host for development purposes' do
15
- client = Rev::HttpClient.new('foo', 'bar', 'localhost')
16
- Rev::HttpClient.base_uri.must_equal 'https://localhost/api/v1'
17
- end
18
-
19
- it 'must include authorization and User-Agent headers for any request' do
20
- host = 'www.example.com'
21
- stub_request(:any, /www\.example\.com\/.*/)
22
-
23
- client = Rev::HttpClient.new('foo', 'bar', host)
24
- response = client.get('/orders')
25
-
26
- assert_requested :get, "https://#{host}/api/v1/orders", :headers => {
27
- 'Authorization' => "Rev foo:bar",
28
- 'User-Agent' => Rev::HttpClient::USER_AGENT
29
- }
30
- end
31
- end
32
-
1
+ require_relative '../../spec_helper'
2
+
3
+ describe Rev::HttpClient do
4
+ it 'must support predefined production host' do
5
+ client = Rev::HttpClient.new('foo', 'bar', Rev::Api::PRODUCTION_HOST)
6
+ Rev::HttpClient.base_uri.must_equal 'https://www.rev.com/api/v1'
7
+ end
8
+
9
+ it 'must support predefined sandbox host' do
10
+ client = Rev::HttpClient.new('foo', 'bar', Rev::Api::SANDBOX_HOST)
11
+ Rev::HttpClient.base_uri.must_equal 'https://api-sandbox.rev.com/api/v1'
12
+ end
13
+
14
+ it 'must support custom host for development purposes' do
15
+ client = Rev::HttpClient.new('foo', 'bar', 'localhost')
16
+ Rev::HttpClient.base_uri.must_equal 'https://localhost/api/v1'
17
+ end
18
+
19
+ it 'must include authorization and User-Agent headers for any request' do
20
+ host = 'www.example.com'
21
+ stub_request(:any, /www\.example\.com\/.*/)
22
+
23
+ client = Rev::HttpClient.new('foo', 'bar', host)
24
+ response = client.get('/orders')
25
+
26
+ assert_requested :get, "https://#{host}/api/v1/orders", :headers => {
27
+ 'Authorization' => "Rev foo:bar",
28
+ 'User-Agent' => Rev::HttpClient::USER_AGENT
29
+ }
30
+ end
31
+ end
32
+
@@ -1,5 +1,11 @@
1
1
  require_relative '../../../spec_helper'
2
2
 
3
+ GLOSSARY_ENTRIES_LIMIT_TEST = 1000
4
+ GLOSSARY_ENTRY_LENGTH_LIMIT_TEST = 255
5
+ SPEAKER_ENTRIES_LIMIT_TEST = 100
6
+ SPEAKER_ENTRY_LENGTH_LIMIT_TEST = 15
7
+ SUPPORTED_ACCENTS_COUNT = 8
8
+
3
9
  describe 'OrderRequest' do
4
10
 
5
11
  it 'defaults to standard TAT guarantee' do
@@ -41,19 +47,92 @@ describe 'OrderRequest' do
41
47
 
42
48
  describe 'TranscriptionOptions' do
43
49
  it 'is InputOptions' do
44
- options = Rev::TranscriptionOptions.new([{}], {})
50
+ inputs = create_input()
51
+ options = Rev::TranscriptionOptions.new(inputs, {})
45
52
  options.must_be_kind_of Rev::InputOptions
46
53
  end
54
+
55
+ it 'has correct info attributes' do
56
+ inputs = create_input()
57
+ options = Rev::TranscriptionOptions.new(inputs, {})
58
+ options.must_respond_to :output_file_formats
59
+ options.must_respond_to :verbatim
60
+ options.must_respond_to :timestamps
61
+ end
62
+
63
+ it 'has output file formats hash' do
64
+ Rev::TranscriptionOptions::OUTPUT_FILE_FORMATS[:ms_word].must_equal 'MS Word'
65
+ Rev::TranscriptionOptions::OUTPUT_FILE_FORMATS[:json].must_equal 'JSON'
66
+ Rev::TranscriptionOptions::OUTPUT_FILE_FORMATS[:text].must_equal 'Text'
67
+ Rev::TranscriptionOptions::OUTPUT_FILE_FORMATS[:pdf].must_equal 'Pdf'
68
+ end
69
+
70
+ it 'rejects invalid output file format' do
71
+ inputs = create_input()
72
+ proc { Rev::TranscriptionOptions.new(inputs, { :output_file_formats => ['invalid'] }) }.must_raise ArgumentError
73
+ end
74
+
75
+ it 'accepts all valid output file formats' do
76
+ inputs = create_input()
77
+ order = Rev::TranscriptionOptions.new(inputs, { :output_file_formats => [
78
+ Rev::TranscriptionOptions::OUTPUT_FILE_FORMATS[:ms_word],
79
+ Rev::TranscriptionOptions::OUTPUT_FILE_FORMATS[:json],
80
+ Rev::TranscriptionOptions::OUTPUT_FILE_FORMATS[:text],
81
+ Rev::TranscriptionOptions::OUTPUT_FILE_FORMATS[:pdf]
82
+ ] })
83
+ order.output_file_formats.length.must_equal 4
84
+ order.output_file_formats[0].must_equal Rev::TranscriptionOptions::OUTPUT_FILE_FORMATS[:ms_word]
85
+ order.output_file_formats[1].must_equal Rev::TranscriptionOptions::OUTPUT_FILE_FORMATS[:json]
86
+ order.output_file_formats[2].must_equal Rev::TranscriptionOptions::OUTPUT_FILE_FORMATS[:text]
87
+ order.output_file_formats[3].must_equal Rev::TranscriptionOptions::OUTPUT_FILE_FORMATS[:pdf]
88
+ end
89
+
90
+ it 'rejects glossary of invalid size' do
91
+ oversize_glossary = ['testing']*(GLOSSARY_ENTRIES_LIMIT_TEST + 1)
92
+ inputs = create_input(glossary: oversize_glossary)
93
+ proc { Rev::TranscriptionOptions.new(inputs) }.must_raise ArgumentError
94
+ end
95
+
96
+ it 'rejects glossary if any terms are too long' do
97
+ oversize_glossary_term = "A" * (GLOSSARY_ENTRY_LENGTH_LIMIT_TEST + 1)
98
+ inputs = create_input(glossary: [oversize_glossary_term])
99
+ proc { Rev::TranscriptionOptions.new(inputs) }.must_raise ArgumentError
100
+ end
101
+
102
+ it 'rejects speaker list of invalid size' do
103
+ oversize_speakers = ['testing']*(SPEAKER_ENTRIES_LIMIT_TEST + 1)
104
+ inputs = create_input(speakers: oversize_speakers)
105
+ proc { Rev::TranscriptionOptions.new(inputs) }.must_raise ArgumentError
106
+ end
107
+
108
+ it 'rejects speaker names if name is too long' do
109
+ oversize_speaker_name = "A" * (SPEAKER_ENTRY_LENGTH_LIMIT_TEST + 1)
110
+ inputs = create_input(speakers: [oversize_speaker_name])
111
+ proc { Rev::TranscriptionOptions.new(inputs) }.must_raise ArgumentError
112
+ end
113
+
114
+ it 'rejects invalid accents' do
115
+ inputs = create_input(accents: ['invalid'])
116
+ proc { Rev::TranscriptionOptions.new(inputs) }.must_raise ArgumentError
117
+ end
118
+
119
+ it 'rejects accents when theres more listed than supported' do
120
+ accents = [Rev::Input::SUPPORTED_ACCENTS[:american_neutral]]*(SUPPORTED_ACCENTS_COUNT + 1)
121
+ inputs = create_input(accents: accents)
122
+ proc { Rev::TranscriptionOptions.new(inputs) }.must_raise ArgumentError
123
+ end
47
124
  end
48
125
 
49
126
  describe 'CaptionOptions' do
50
127
  it 'is InputOptions' do
51
- options = Rev::CaptionOptions.new([{}], {})
128
+ inputs = create_input()
129
+ options = Rev::CaptionOptions.new(inputs, {})
52
130
  options.must_be_kind_of Rev::InputOptions
53
131
  end
54
132
 
55
133
  it 'has output file formats attribute' do
56
- options = Rev::CaptionOptions.new([{}], {})
134
+ inputs = create_input()
135
+ options = Rev::CaptionOptions.new(inputs, {})
57
136
  options.must_respond_to :output_file_formats
58
137
  end
59
138
 
@@ -70,20 +149,52 @@ describe 'OrderRequest' do
70
149
  end
71
150
 
72
151
  it 'rejects unknowns file formats' do
73
- proc { Rev::CaptionOptions.new([{}], { :output_file_formats => ['invalid'] }) }.must_raise ArgumentError
152
+ inputs = create_input()
153
+ proc { Rev::CaptionOptions.new(inputs, { :output_file_formats => ['invalid'] }) }.must_raise ArgumentError
74
154
  end
75
155
 
76
156
  it 'accepts valid file formats' do
77
- order = Rev::CaptionOptions.new([{}], { :output_file_formats => [Rev::CaptionOptions::OUTPUT_FILE_FORMATS[:scc]] })
157
+ inputs = create_input()
158
+ order = Rev::CaptionOptions.new(inputs, { :output_file_formats => [Rev::CaptionOptions::OUTPUT_FILE_FORMATS[:scc]] })
78
159
  order.output_file_formats.length.must_equal 1
79
- order.output_file_formats[0].must_equal Rev::CaptionOptions::OUTPUT_FILE_FORMATS[:scc];
160
+ order.output_file_formats[0].must_equal Rev::CaptionOptions::OUTPUT_FILE_FORMATS[:scc]
161
+ end
162
+
163
+ it 'rejects glossary of invalid size' do
164
+ oversize_glossary = []
165
+ for x in 0..GLOSSARY_ENTRIES_LIMIT_TEST do
166
+ oversize_glossary << 'testing'
167
+ end
168
+ inputs = create_input(glossary: oversize_glossary)
169
+ proc { Rev::CaptionOptions.new(inputs) }.must_raise ArgumentError
170
+ end
171
+
172
+ it 'rejects glossary if any terms are too long' do
173
+ oversize_glossary_term = "A" * (GLOSSARY_ENTRY_LENGTH_LIMIT_TEST + 1)
174
+ inputs = create_input(glossary: [oversize_glossary_term])
175
+ proc { Rev::CaptionOptions.new(inputs) }.must_raise ArgumentError
176
+ end
177
+
178
+ it 'rejects speaker names of invalid size' do
179
+ oversize_speakers = []
180
+ for x in 0..SPEAKER_ENTRIES_LIMIT_TEST do
181
+ oversize_speakers << 'testing'
182
+ end
183
+ inputs = create_input(speakers: oversize_speakers)
184
+ proc { Rev::CaptionOptions.new(inputs) }.must_raise ArgumentError
185
+ end
186
+
187
+ it 'rejects speaker names if name is too long' do
188
+ oversize_speaker_name = "A" * (SPEAKER_ENTRY_LENGTH_LIMIT_TEST + 1)
189
+ inputs = create_input(speakers: [oversize_speaker_name])
190
+ proc { Rev::CaptionOptions.new(inputs) }.must_raise ArgumentError
80
191
  end
81
192
  end # CaptionOptions
82
193
 
83
194
  describe 'Notification' do
84
- it 'Defaults level' do
85
- notification = Rev::Notification.new('http://example.com/')
86
- notification.level.must_equal Rev::Notification::LEVELS[:final_only]
87
- end
88
- end # Notification
195
+ it 'Defaults level' do
196
+ notification = Rev::Notification.new('http://example.com/')
197
+ notification.level.must_equal Rev::Notification::LEVELS[:final_only]
198
+ end
199
+ end # Notification
89
200
  end
@@ -1,58 +1,58 @@
1
- require_relative '../../../spec_helper'
2
-
3
- describe 'Order' do
4
- let(:cp_order) {
5
- Rev::Order.new (
6
- { 'attachments' => { },
7
- 'comments' => {},
8
- 'caption' => { 'total_length_seconds' => 300 }
9
- }
10
- )
11
- }
12
-
13
- it 'has caption info' do
14
- assert_respond_to cp_order, 'caption'
15
- end
16
-
17
- it 'parses caption info' do
18
- assert_kind_of Rev::CaptionInfo, cp_order.caption
19
- end
20
-
21
- it 'has captions attachments' do
22
- assert_respond_to cp_order, 'captions'
23
- end
24
-
25
- describe 'Attachments' do
26
- describe 'REPRESENTATIONS' do
27
- it 'has srt' do
28
- Rev::Attachment::REPRESENTATIONS[:srt].must_equal 'application/x-subrip'
29
- end
30
-
31
- it 'has scc' do
32
- Rev::Attachment::REPRESENTATIONS[:scc].must_equal 'text/x-scc'
33
- end
34
-
35
- it 'has ttml' do
36
- Rev::Attachment::REPRESENTATIONS[:ttml].must_equal 'application/ttml+xml'
37
- end
38
-
39
- it 'has qt' do
40
- Rev::Attachment::REPRESENTATIONS[:qt].must_equal 'application/x-quicktime-timedtext'
41
- end
42
- end
43
-
44
- describe 'KINDS' do
45
- it 'has caption' do
46
- Rev::Attachment::KINDS[:caption].must_equal 'caption'
47
- end
48
- end
49
- end # Attachments
50
-
51
- describe 'CaptionInfo' do
52
- it 'has total_length_seconds' do
53
- info = Rev::CaptionInfo.new({})
54
- assert_respond_to info, 'total_length_seconds'
55
- end
56
- end # CaptionInfo
57
- end
58
-
1
+ require_relative '../../../spec_helper'
2
+
3
+ describe 'Order' do
4
+ let(:cp_order) {
5
+ Rev::Order.new (
6
+ { 'attachments' => { },
7
+ 'comments' => {},
8
+ 'caption' => { 'total_length_seconds' => 300 }
9
+ }
10
+ )
11
+ }
12
+
13
+ it 'has caption info' do
14
+ assert_respond_to cp_order, 'caption'
15
+ end
16
+
17
+ it 'parses caption info' do
18
+ assert_kind_of Rev::CaptionInfo, cp_order.caption
19
+ end
20
+
21
+ it 'has captions attachments' do
22
+ assert_respond_to cp_order, 'captions'
23
+ end
24
+
25
+ describe 'Attachments' do
26
+ describe 'REPRESENTATIONS' do
27
+ it 'has srt' do
28
+ Rev::Attachment::REPRESENTATIONS[:srt].must_equal 'application/x-subrip'
29
+ end
30
+
31
+ it 'has scc' do
32
+ Rev::Attachment::REPRESENTATIONS[:scc].must_equal 'text/x-scc'
33
+ end
34
+
35
+ it 'has ttml' do
36
+ Rev::Attachment::REPRESENTATIONS[:ttml].must_equal 'application/ttml+xml'
37
+ end
38
+
39
+ it 'has qt' do
40
+ Rev::Attachment::REPRESENTATIONS[:qt].must_equal 'application/x-quicktime-timedtext'
41
+ end
42
+ end
43
+
44
+ describe 'KINDS' do
45
+ it 'has caption' do
46
+ Rev::Attachment::KINDS[:caption].must_equal 'caption'
47
+ end
48
+ end
49
+ end # Attachments
50
+
51
+ describe 'CaptionInfo' do
52
+ it 'has total_length_seconds' do
53
+ info = Rev::CaptionInfo.new({})
54
+ assert_respond_to info, 'total_length_seconds'
55
+ end
56
+ end # CaptionInfo
57
+ end
58
+
@@ -1,94 +1,94 @@
1
- require_relative '../../spec_helper'
2
-
3
- describe 'POST /inputs' do
4
- let(:client) { Rev.new('welcome', 'AAAAAu/YjZ3phXU5FsF35yIcgiA=', 'www.revtrunk.com') }
5
-
6
- it 'must link external file with explicit content-type and file' do
7
- VCR.insert_cassette 'link_input_with_all_attributes'
8
-
9
- link = 'https://www.rev.com/content/img/rev/rev_logo_colored_top.png'
10
- filename = 'sourcedocument.png'
11
- content_type = 'image/png'
12
- new_input_location = client.create_input_from_link(link, filename, content_type)
13
-
14
- new_input_location.must_match 'urn:rev:inputmedia:'
15
- expected_body = {
16
- 'url' => link,
17
- 'filename' => filename,
18
- 'content_type' => content_type
19
- }
20
- assert_requested(:post, /.*\/inputs/, :times => 1) do |req|
21
- req.headers['Content-Type'].must_equal 'application/json'
22
- actual_body = JSON.load req.body
23
- actual_body.must_equal expected_body
24
- end
25
- end
26
-
27
- it 'must quote the filename' do
28
- VCR.insert_cassette 'link_input_with_spaces_in_filename'
29
-
30
- link = 'https://s3-us-west-2.amazonaws.com/public-rev/transcript/Rev Transcript File.docx'
31
- filename = 'Rev Transcript File.docx'
32
- content_type = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
33
- new_input_location = client.create_input_from_link(link, filename, content_type)
34
-
35
- new_input_location.must_match 'urn:rev:inputmedia:'
36
- expected_body = {
37
- 'url' => link,
38
- 'filename' => filename,
39
- 'content_type' => content_type
40
- }
41
- assert_requested(:post, /.*\/inputs/, :times => 1) do |req|
42
- actual_body = JSON.load req.body
43
- actual_body.must_equal expected_body
44
- end
45
- end
46
-
47
- it 'must link external file without content-type and filename' do
48
- VCR.insert_cassette 'link_input'
49
-
50
- link = 'https://www.rev.com/content/img/rev/rev_logo_colored_top.png'
51
- new_input_location = client.create_input_from_link(link)
52
-
53
- new_input_location.must_match 'urn:rev:inputmedia:'
54
- expected_body = { 'url' => link }
55
- assert_requested(:post, /.*\/inputs/, :times => 1) do |req|
56
- req.headers['Content-Type'].must_equal 'application/json'
57
- actual_body = JSON.load req.body
58
- actual_body.must_equal expected_body
59
- end
60
- end
61
-
62
- it 'must upload source file directly' do
63
- VCR.insert_cassette 'upload_input'
64
-
65
- filename = './spec/fixtures/sourcedocument.png'
66
- content_type = 'image/png'
67
-
68
- new_input_location = client.upload_input(filename, content_type)
69
-
70
- new_input_location.must_match 'urn:rev:inputmedia:'
71
- expected_body = File.read(filename)
72
- assert_requested(:post, /.*\/inputs/, :times => 1) do |req|
73
- req.headers['Content-Type'].must_equal content_type
74
- req.headers['Content-Disposition'].must_equal 'attachment; filename="sourcedocument.png"'
75
- req.body.must_equal expected_body
76
- end
77
- end
78
-
79
- it 'must raise BadRequestError on failure' do
80
- VCR.insert_cassette 'upload_input_with_invalid_content_type'
81
-
82
- filename = './spec/fixtures/sourcedocument.png'
83
- content_type = 'trololo'
84
-
85
- action = lambda { client.upload_input(filename, content_type) }
86
- exception = action.must_raise Rev::BadRequestError
87
- exception.message.must_match '10001: The content-type explicitly specified in the request is not supported for input media'
88
- exception.code.must_equal Rev::InputRequestErrorCodes::UNSUPPORTED_CONTENT_TYPE
89
- end
90
-
91
- after do
92
- VCR.eject_cassette
93
- end
94
- end
1
+ require_relative '../../spec_helper'
2
+
3
+ describe 'POST /inputs' do
4
+ let(:client) { Rev.new('welcome', 'AAAAAu/YjZ3phXU5FsF35yIcgiA=', 'www.revtrunk.com') }
5
+
6
+ it 'must link external file with explicit content-type and file' do
7
+ VCR.insert_cassette 'link_input_with_all_attributes'
8
+
9
+ link = 'https://www.rev.com/content/img/rev/rev_logo_colored_top.png'
10
+ filename = 'sourcedocument.png'
11
+ content_type = 'image/png'
12
+ new_input_location = client.create_input_from_link(link, filename, content_type)
13
+
14
+ new_input_location.must_match 'urn:rev:inputmedia:'
15
+ expected_body = {
16
+ 'url' => link,
17
+ 'filename' => filename,
18
+ 'content_type' => content_type
19
+ }
20
+ assert_requested(:post, /.*\/inputs/, :times => 1) do |req|
21
+ req.headers['Content-Type'].must_equal 'application/json'
22
+ actual_body = JSON.load req.body
23
+ actual_body.must_equal expected_body
24
+ end
25
+ end
26
+
27
+ it 'must quote the filename' do
28
+ VCR.insert_cassette 'link_input_with_spaces_in_filename'
29
+
30
+ link = 'https://s3-us-west-2.amazonaws.com/public-rev/transcript/Rev Transcript File.docx'
31
+ filename = 'Rev Transcript File.docx'
32
+ content_type = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
33
+ new_input_location = client.create_input_from_link(link, filename, content_type)
34
+
35
+ new_input_location.must_match 'urn:rev:inputmedia:'
36
+ expected_body = {
37
+ 'url' => link,
38
+ 'filename' => filename,
39
+ 'content_type' => content_type
40
+ }
41
+ assert_requested(:post, /.*\/inputs/, :times => 1) do |req|
42
+ actual_body = JSON.load req.body
43
+ actual_body.must_equal expected_body
44
+ end
45
+ end
46
+
47
+ it 'must link external file without content-type and filename' do
48
+ VCR.insert_cassette 'link_input'
49
+
50
+ link = 'https://www.rev.com/content/img/rev/rev_logo_colored_top.png'
51
+ new_input_location = client.create_input_from_link(link)
52
+
53
+ new_input_location.must_match 'urn:rev:inputmedia:'
54
+ expected_body = { 'url' => link }
55
+ assert_requested(:post, /.*\/inputs/, :times => 1) do |req|
56
+ req.headers['Content-Type'].must_equal 'application/json'
57
+ actual_body = JSON.load req.body
58
+ actual_body.must_equal expected_body
59
+ end
60
+ end
61
+
62
+ it 'must upload source file directly' do
63
+ VCR.insert_cassette 'upload_input'
64
+
65
+ filename = './spec/fixtures/sourcedocument.png'
66
+ content_type = 'image/png'
67
+
68
+ new_input_location = client.upload_input(filename, content_type)
69
+
70
+ new_input_location.must_match 'urn:rev:inputmedia:'
71
+ expected_body = File.read(filename)
72
+ assert_requested(:post, /.*\/inputs/, :times => 1) do |req|
73
+ req.headers['Content-Type'].must_equal content_type
74
+ req.headers['Content-Disposition'].must_equal 'attachment; filename="sourcedocument.png"'
75
+ req.body.must_equal expected_body
76
+ end
77
+ end
78
+
79
+ it 'must raise BadRequestError on failure' do
80
+ VCR.insert_cassette 'upload_input_with_invalid_content_type'
81
+
82
+ filename = './spec/fixtures/sourcedocument.png'
83
+ content_type = 'trololo'
84
+
85
+ action = lambda { client.upload_input(filename, content_type) }
86
+ exception = action.must_raise Rev::BadRequestError
87
+ exception.message.must_match '10001: The content-type explicitly specified in the request is not supported for input media'
88
+ exception.code.must_equal Rev::InputRequestErrorCodes::UNSUPPORTED_CONTENT_TYPE
89
+ end
90
+
91
+ after do
92
+ VCR.eject_cassette
93
+ end
94
+ end