rev-api 2.3.0 → 2.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +22 -22
  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 -131
  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 +276 -276
  18. data/lib/rev-api/version.rb +3 -3
  19. data/rev-api.gemspec +33 -33
  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 +45 -45
  39. data/spec/fixtures/api_cassettes/submit_su_order.yml +45 -45
  40. data/spec/fixtures/api_cassettes/submit_tc_order_with_account_balance.yml +45 -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 +45 -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 +24 -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_spec.rb +58 -58
  55. data/spec/lib/rev/post_inputs_spec.rb +94 -94
  56. data/spec/lib/rev/post_order_spec.rb +163 -163
  57. data/spec/spec_helper.rb +47 -47
  58. data/spec/test_helpers.rb +5 -5
  59. metadata +36 -78
@@ -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,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
@@ -1,163 +1,163 @@
1
- require_relative '../../spec_helper'
2
-
3
- describe 'POST /orders' do
4
- let(:client) { Rev.new('welcome', 'AAAAAu/YjZ3phXU5FsF35yIcgiA=', 'www.revtrunk.com') }
5
-
6
- # some defaults we use often
7
- let(:billing_address) { Rev::BillingAddress.new(
8
- :street => '123 Pine Lane',
9
- :street2 => 'Apt D',
10
- :city => 'MyTown',
11
- :state => 'MN',
12
- :zip => '12345',
13
- :country_alpha2 => 'US'
14
- )}
15
-
16
- let(:balance_payment) { Rev::Payment.new(Rev::Payment::TYPES[:account_balance]) }
17
- let(:transcription_inputs) {
18
- inputs = []
19
- inputs << Rev::Input.new(:external_link => 'http://www.youtube.com/watch?v=UF8uR6Z6KLc', accents: ['AmericanNeutral', 'Australian'])
20
- inputs << Rev::Input.new(:audio_length_seconds => 900, :external_link => 'https://vimeo.com/7976699', speakers: ['Billy', 'Bob'], glossary: ['Sandwich'])
21
- }
22
- let(:caption_inputs) {
23
- inputs = []
24
- inputs << Rev::Input.new(:video_length_seconds => 900, :external_link => 'http://www.youtube.com/watch?v=UF8uR6Z6KLc', speakers: ['Billy', 'Bob'], glossary: ['Sandwich'])
25
- }
26
- let(:transcription_options) { Rev::TranscriptionOptions.new(transcription_inputs,
27
- :verbatim => true, :timestamps => true) }
28
- let(:caption_options) {
29
- Rev::CaptionOptions.new(caption_inputs, :output_file_formats => ['SubRip'])
30
- }
31
- let(:subtitle_options) {
32
- Rev::CaptionOptions.new(caption_inputs, :subtitle_languages => ['es','it'],
33
- :output_file_formats => ['SubRip'])
34
- }
35
-
36
- it 'must place order using account balance' do
37
- VCR.insert_cassette 'submit_tc_order_with_account_balance'
38
-
39
- request = Rev::OrderRequest.new(
40
- :transcription_options => transcription_options
41
- )
42
-
43
- new_order_num = client.submit_order(request)
44
-
45
- new_order_num.must_equal 'TC0406615008'
46
- expected_body = {
47
- 'payment' => {
48
- 'type' => 'AccountBalance'
49
- },
50
- 'non_standard_tat_guarantee' => false,
51
- 'transcription_options' => {
52
- 'inputs' => [
53
- { 'external_link' => 'http://www.youtube.com/watch?v=UF8uR6Z6KLc', 'accents' => ['AmericanNeutral', 'Australian']},
54
- { 'external_link' => 'https://vimeo.com/7976699', 'audio_length_seconds' => 900, 'speakers' => ['Billy', 'Bob'], 'glossary' => ['Sandwich'] }
55
- ],
56
- 'verbatim' => true,
57
- 'timestamps' => true
58
- }
59
- }
60
- assert_order_placement_success(expected_body)
61
- end
62
-
63
- it 'must default to account balance if payment property not set' do
64
- VCR.insert_cassette 'submit_tc_order_without_specifying_payment'
65
-
66
- request = Rev::OrderRequest.new(
67
- :transcription_options => transcription_options
68
- )
69
-
70
- new_order_num = client.submit_order(request)
71
-
72
- new_order_num.must_equal 'TC0406615008'
73
- expected_body = {
74
- 'payment' => {
75
- 'type' => 'AccountBalance'
76
- },
77
- 'non_standard_tat_guarantee' => false,
78
- 'transcription_options' => {
79
- 'inputs' => [
80
- { 'external_link' => 'http://www.youtube.com/watch?v=UF8uR6Z6KLc', 'accents' => ['AmericanNeutral', 'Australian']},
81
- { 'external_link' => 'https://vimeo.com/7976699', 'audio_length_seconds' => 900, 'speakers' => ['Billy', 'Bob'], 'glossary' => ['Sandwich'] }
82
- ],
83
- 'verbatim' => true,
84
- 'timestamps' => true
85
- }
86
- }
87
- assert_order_placement_success(expected_body)
88
- end
89
-
90
- it 'must raise BadRequest error in case of request validation failure' do
91
- VCR.insert_cassette 'submit_tc_order_with_invalid_request'
92
-
93
- # example - missing transcription options
94
- request = Rev::OrderRequest.new
95
-
96
- action = lambda { client.submit_order(request) }
97
- exception = action.must_raise Rev::BadRequestError
98
- exception.message.must_match '10004: You must specify either transcription or caption options in an order'
99
- exception.code.must_equal Rev::OrderRequestErrorCodes::OPTIONS_NOT_SPECIFIED
100
- end
101
-
102
- it 'must submit caption order with options' do
103
- VCR.insert_cassette 'submit_cp_order'
104
-
105
- request = Rev::OrderRequest.new(:caption_options => caption_options)
106
-
107
- new_order_num = client.submit_order(request)
108
-
109
- new_order_num.must_equal 'CP12345'
110
- expected_body = {
111
- 'payment' => {
112
- 'type' => 'AccountBalance'
113
- },
114
- 'non_standard_tat_guarantee' => false,
115
- 'caption_options' => {
116
- 'inputs'=> [
117
- { 'video_length_seconds' => 900, 'external_link' => 'http://www.youtube.com/watch?v=UF8uR6Z6KLc', 'speakers' => ['Billy', 'Bob'], 'glossary' => ['Sandwich'] }
118
- ],
119
- 'output_file_formats' => [Rev::CaptionOptions::OUTPUT_FILE_FORMATS[:subrip]]
120
- }
121
- }
122
- assert_order_placement_success(expected_body)
123
- end
124
-
125
- it 'must submit subtitle order with options' do
126
- VCR.insert_cassette 'submit_su_order'
127
-
128
- request = Rev::OrderRequest.new(:caption_options => subtitle_options)
129
-
130
- new_order_num = client.submit_order(request)
131
-
132
- new_order_num.must_equal 'CP56789'
133
- expected_body = {
134
- 'payment' => {
135
- 'type' => 'AccountBalance'
136
- },
137
- 'non_standard_tat_guarantee' => false,
138
- 'caption_options' => {
139
- 'inputs'=> [
140
- { 'video_length_seconds' => 900, 'external_link' => 'http://www.youtube.com/watch?v=UF8uR6Z6KLc', 'speakers' => ['Billy', 'Bob'], 'glossary' => ['Sandwich'] }
141
- ],
142
- 'subtitle_languages' => ['es','it'],
143
- 'output_file_formats' => [Rev::CaptionOptions::OUTPUT_FILE_FORMATS[:subrip]]
144
- }
145
- }
146
- assert_order_placement_success(expected_body)
147
- end
148
-
149
- after do
150
- VCR.eject_cassette
151
- end
152
-
153
- private
154
-
155
- def assert_order_placement_success(expected_body)
156
- assert_requested(:post, /.*\/orders/, :times => 1) do |req|
157
- req.headers['Content-Type'].must_equal 'application/json'
158
- actual_body = JSON.load req.body
159
- actual_body.must_equal expected_body
160
- end
161
- end
162
-
163
- end
1
+ require_relative '../../spec_helper'
2
+
3
+ describe 'POST /orders' do
4
+ let(:client) { Rev.new('welcome', 'AAAAAu/YjZ3phXU5FsF35yIcgiA=', 'www.revtrunk.com') }
5
+
6
+ # some defaults we use often
7
+ let(:billing_address) { Rev::BillingAddress.new(
8
+ :street => '123 Pine Lane',
9
+ :street2 => 'Apt D',
10
+ :city => 'MyTown',
11
+ :state => 'MN',
12
+ :zip => '12345',
13
+ :country_alpha2 => 'US'
14
+ )}
15
+
16
+ let(:balance_payment) { Rev::Payment.new(Rev::Payment::TYPES[:account_balance]) }
17
+ let(:transcription_inputs) {
18
+ inputs = []
19
+ inputs << Rev::Input.new(:external_link => 'http://www.youtube.com/watch?v=UF8uR6Z6KLc', accents: ['AmericanNeutral', 'Australian'])
20
+ inputs << Rev::Input.new(:audio_length_seconds => 900, :external_link => 'https://vimeo.com/7976699', speakers: ['Billy', 'Bob'], glossary: ['Sandwich'])
21
+ }
22
+ let(:caption_inputs) {
23
+ inputs = []
24
+ inputs << Rev::Input.new(:video_length_seconds => 900, :external_link => 'http://www.youtube.com/watch?v=UF8uR6Z6KLc', speakers: ['Billy', 'Bob'], glossary: ['Sandwich'])
25
+ }
26
+ let(:transcription_options) { Rev::TranscriptionOptions.new(transcription_inputs,
27
+ :verbatim => true, :timestamps => true) }
28
+ let(:caption_options) {
29
+ Rev::CaptionOptions.new(caption_inputs, :output_file_formats => ['SubRip'])
30
+ }
31
+ let(:subtitle_options) {
32
+ Rev::CaptionOptions.new(caption_inputs, :subtitle_languages => ['es','it'],
33
+ :output_file_formats => ['SubRip'])
34
+ }
35
+
36
+ it 'must place order using account balance' do
37
+ VCR.insert_cassette 'submit_tc_order_with_account_balance'
38
+
39
+ request = Rev::OrderRequest.new(
40
+ :transcription_options => transcription_options
41
+ )
42
+
43
+ new_order_num = client.submit_order(request)
44
+
45
+ new_order_num.must_equal 'TC0406615008'
46
+ expected_body = {
47
+ 'payment' => {
48
+ 'type' => 'AccountBalance'
49
+ },
50
+ 'non_standard_tat_guarantee' => false,
51
+ 'transcription_options' => {
52
+ 'inputs' => [
53
+ { 'external_link' => 'http://www.youtube.com/watch?v=UF8uR6Z6KLc', 'accents' => ['AmericanNeutral', 'Australian']},
54
+ { 'external_link' => 'https://vimeo.com/7976699', 'audio_length_seconds' => 900, 'speakers' => ['Billy', 'Bob'], 'glossary' => ['Sandwich'] }
55
+ ],
56
+ 'verbatim' => true,
57
+ 'timestamps' => true
58
+ }
59
+ }
60
+ assert_order_placement_success(expected_body)
61
+ end
62
+
63
+ it 'must default to account balance if payment property not set' do
64
+ VCR.insert_cassette 'submit_tc_order_without_specifying_payment'
65
+
66
+ request = Rev::OrderRequest.new(
67
+ :transcription_options => transcription_options
68
+ )
69
+
70
+ new_order_num = client.submit_order(request)
71
+
72
+ new_order_num.must_equal 'TC0406615008'
73
+ expected_body = {
74
+ 'payment' => {
75
+ 'type' => 'AccountBalance'
76
+ },
77
+ 'non_standard_tat_guarantee' => false,
78
+ 'transcription_options' => {
79
+ 'inputs' => [
80
+ { 'external_link' => 'http://www.youtube.com/watch?v=UF8uR6Z6KLc', 'accents' => ['AmericanNeutral', 'Australian']},
81
+ { 'external_link' => 'https://vimeo.com/7976699', 'audio_length_seconds' => 900, 'speakers' => ['Billy', 'Bob'], 'glossary' => ['Sandwich'] }
82
+ ],
83
+ 'verbatim' => true,
84
+ 'timestamps' => true
85
+ }
86
+ }
87
+ assert_order_placement_success(expected_body)
88
+ end
89
+
90
+ it 'must raise BadRequest error in case of request validation failure' do
91
+ VCR.insert_cassette 'submit_tc_order_with_invalid_request'
92
+
93
+ # example - missing transcription options
94
+ request = Rev::OrderRequest.new
95
+
96
+ action = lambda { client.submit_order(request) }
97
+ exception = action.must_raise Rev::BadRequestError
98
+ exception.message.must_match '10004: You must specify either transcription or caption options in an order'
99
+ exception.code.must_equal Rev::OrderRequestErrorCodes::OPTIONS_NOT_SPECIFIED
100
+ end
101
+
102
+ it 'must submit caption order with options' do
103
+ VCR.insert_cassette 'submit_cp_order'
104
+
105
+ request = Rev::OrderRequest.new(:caption_options => caption_options)
106
+
107
+ new_order_num = client.submit_order(request)
108
+
109
+ new_order_num.must_equal 'CP12345'
110
+ expected_body = {
111
+ 'payment' => {
112
+ 'type' => 'AccountBalance'
113
+ },
114
+ 'non_standard_tat_guarantee' => false,
115
+ 'caption_options' => {
116
+ 'inputs'=> [
117
+ { 'video_length_seconds' => 900, 'external_link' => 'http://www.youtube.com/watch?v=UF8uR6Z6KLc', 'speakers' => ['Billy', 'Bob'], 'glossary' => ['Sandwich'] }
118
+ ],
119
+ 'output_file_formats' => [Rev::CaptionOptions::OUTPUT_FILE_FORMATS[:subrip]]
120
+ }
121
+ }
122
+ assert_order_placement_success(expected_body)
123
+ end
124
+
125
+ it 'must submit subtitle order with options' do
126
+ VCR.insert_cassette 'submit_su_order'
127
+
128
+ request = Rev::OrderRequest.new(:caption_options => subtitle_options)
129
+
130
+ new_order_num = client.submit_order(request)
131
+
132
+ new_order_num.must_equal 'CP56789'
133
+ expected_body = {
134
+ 'payment' => {
135
+ 'type' => 'AccountBalance'
136
+ },
137
+ 'non_standard_tat_guarantee' => false,
138
+ 'caption_options' => {
139
+ 'inputs'=> [
140
+ { 'video_length_seconds' => 900, 'external_link' => 'http://www.youtube.com/watch?v=UF8uR6Z6KLc', 'speakers' => ['Billy', 'Bob'], 'glossary' => ['Sandwich'] }
141
+ ],
142
+ 'subtitle_languages' => ['es','it'],
143
+ 'output_file_formats' => [Rev::CaptionOptions::OUTPUT_FILE_FORMATS[:subrip]]
144
+ }
145
+ }
146
+ assert_order_placement_success(expected_body)
147
+ end
148
+
149
+ after do
150
+ VCR.eject_cassette
151
+ end
152
+
153
+ private
154
+
155
+ def assert_order_placement_success(expected_body)
156
+ assert_requested(:post, /.*\/orders/, :times => 1) do |req|
157
+ req.headers['Content-Type'].must_equal 'application/json'
158
+ actual_body = JSON.load req.body
159
+ actual_body.must_equal expected_body
160
+ end
161
+ end
162
+
163
+ end