doi_extractor 1.0.5
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.
- checksums.yaml +7 -0
- data/.gitignore +54 -0
- data/Capfile +34 -0
- data/Gemfile +6 -0
- data/README.md +50 -0
- data/Rakefile +43 -0
- data/bin/doi_extractor +18 -0
- data/config/deploy.rb +34 -0
- data/config/deploy/production.rb +65 -0
- data/doi_extractor.gemspec +29 -0
- data/lib/doi_extractor.rb +25 -0
- data/lib/doi_extractor/cancel_command.rb +24 -0
- data/lib/doi_extractor/command.rb +81 -0
- data/lib/doi_extractor/command_line_parser.rb +154 -0
- data/lib/doi_extractor/create_command.rb +32 -0
- data/lib/doi_extractor/download_command.rb +109 -0
- data/lib/doi_extractor/download_location.rb +86 -0
- data/lib/doi_extractor/errors.rb +34 -0
- data/lib/doi_extractor/ipums_client.rb +159 -0
- data/lib/doi_extractor/ipums_uri_builder.rb +51 -0
- data/lib/doi_extractor/old_ruby_patch.rb +25 -0
- data/lib/doi_extractor/options.rb +132 -0
- data/lib/doi_extractor/secrets.rb +18 -0
- data/lib/doi_extractor/status_command.rb +62 -0
- data/lib/doi_extractor/version.rb +3 -0
- data/spec/fixtures/api_creds.yml +2 -0
- data/spec/reports/SPEC-DoiExtractor-CancelCommand-when-successful.xml +7 -0
- data/spec/reports/SPEC-DoiExtractor-CancelCommand.xml +3 -0
- data/spec/reports/SPEC-DoiExtractor-CommandLineParser-with-a-valid-create-command-with-email.xml +14 -0
- data/spec/reports/SPEC-DoiExtractor-CommandLineParser-with-a-valid-create-command.xml +9 -0
- data/spec/reports/SPEC-DoiExtractor-CommandLineParser-with-a-valid-download-command.xml +9 -0
- data/spec/reports/SPEC-DoiExtractor-CommandLineParser-with-a-valid-status-command.xml +9 -0
- data/spec/reports/SPEC-DoiExtractor-CommandLineParser-with-an-invalid-command.xml +9 -0
- data/spec/reports/SPEC-DoiExtractor-CommandLineParser-with-an-unknown-option.xml +5 -0
- data/spec/reports/SPEC-DoiExtractor-CommandLineParser.xml +3 -0
- data/spec/reports/SPEC-DoiExtractor-CreateCommand-when-an-existing-extract-is-processing.xml +7 -0
- data/spec/reports/SPEC-DoiExtractor-CreateCommand-when-successful.xml +7 -0
- data/spec/reports/SPEC-DoiExtractor-CreateCommand.xml +3 -0
- data/spec/reports/SPEC-DoiExtractor-DownloadCommand-user-cancels-download.xml +7 -0
- data/spec/reports/SPEC-DoiExtractor-DownloadCommand-when-an-extract-is-available-when-force-is-not-set.xml +5 -0
- data/spec/reports/SPEC-DoiExtractor-DownloadCommand-when-an-extract-is-available.xml +13 -0
- data/spec/reports/SPEC-DoiExtractor-DownloadCommand.xml +3 -0
- data/spec/reports/SPEC-DoiExtractor-DownloadLocation.xml +11 -0
- data/spec/reports/SPEC-DoiExtractor-IpumsClient.xml +7 -0
- data/spec/reports/SPEC-DoiExtractor-IpumsUriBuilder-internal-environment.xml +5 -0
- data/spec/reports/SPEC-DoiExtractor-IpumsUriBuilder-live-environment.xml +5 -0
- data/spec/reports/SPEC-DoiExtractor-IpumsUriBuilder-local-environment.xml +5 -0
- data/spec/reports/SPEC-DoiExtractor-IpumsUriBuilder.xml +3 -0
- data/spec/reports/SPEC-DoiExtractor-Options-for-command-with-create-command-with-invalid-doi-version.xml +5 -0
- data/spec/reports/SPEC-DoiExtractor-Options-for-command-with-create-command.xml +7 -0
- data/spec/reports/SPEC-DoiExtractor-Options-for-command-with-download-command.xml +7 -0
- data/spec/reports/SPEC-DoiExtractor-Options-for-command-with-status-command.xml +7 -0
- data/spec/reports/SPEC-DoiExtractor-Options-for-command.xml +3 -0
- data/spec/reports/SPEC-DoiExtractor-Options-when-setting-path-values.xml +9 -0
- data/spec/reports/SPEC-DoiExtractor-Options.xml +5 -0
- data/spec/reports/SPEC-DoiExtractor-Secrets.xml +7 -0
- data/spec/reports/SPEC-DoiExtractor-StatusCommand.xml +5 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/support/test_input.rb +36 -0
- data/spec/unit/cancel_command_spec.rb +28 -0
- data/spec/unit/command_line_parser_spec.rb +68 -0
- data/spec/unit/create_command_spec.rb +44 -0
- data/spec/unit/download_command_spec.rb +139 -0
- data/spec/unit/download_location_spec.rb +71 -0
- data/spec/unit/ipums_client_spec.rb +23 -0
- data/spec/unit/ipums_uri_builder_spec.rb +26 -0
- data/spec/unit/options_spec.rb +86 -0
- data/spec/unit/secrets_spec.rb +14 -0
- data/spec/unit/status_command_spec.rb +46 -0
- metadata +282 -0
@@ -0,0 +1,11 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="DoiExtractor::DownloadLocation" tests="4" time="0.021346" failures="0" errors="0" skipped="0" timestamp="2017-09-12T12:47:53-05:00">
|
3
|
+
<testcase name="DoiExtractor::DownloadLocation calculates extract request paths" time="0.000391">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="DoiExtractor::DownloadLocation can create itself" time="0.000702">
|
6
|
+
</testcase>
|
7
|
+
<testcase name="DoiExtractor::DownloadLocation creates and clears the tmp path" time="0.000797">
|
8
|
+
</testcase>
|
9
|
+
<testcase name="DoiExtractor::DownloadLocation packages up downloaded extract files" time="0.018921">
|
10
|
+
</testcase>
|
11
|
+
</testsuite>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="DoiExtractor::IpumsClient" tests="2" time="0.005526" failures="0" errors="0" skipped="0" timestamp="2017-09-12T12:47:53-05:00">
|
3
|
+
<testcase name="DoiExtractor::IpumsClient handles HTTP 422" time="0.002534">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="DoiExtractor::IpumsClient handles HTTP 500" time="0.002482">
|
6
|
+
</testcase>
|
7
|
+
</testsuite>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="DoiExtractor::IpumsUriBuilder internal environment" tests="1" time="0.000353" failures="0" errors="0" skipped="0" timestamp="2017-09-12T12:47:53-05:00">
|
3
|
+
<testcase name="DoiExtractor::IpumsUriBuilder internal environment builds correct urls" time="0.000117">
|
4
|
+
</testcase>
|
5
|
+
</testsuite>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="DoiExtractor::IpumsUriBuilder live environment" tests="1" time="0.000317" failures="0" errors="0" skipped="0" timestamp="2017-09-12T12:47:53-05:00">
|
3
|
+
<testcase name="DoiExtractor::IpumsUriBuilder live environment builds correct urls" time="0.000186">
|
4
|
+
</testcase>
|
5
|
+
</testsuite>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="DoiExtractor::IpumsUriBuilder local environment" tests="1" time="0.000334" failures="0" errors="0" skipped="0" timestamp="2017-09-12T12:47:53-05:00">
|
3
|
+
<testcase name="DoiExtractor::IpumsUriBuilder local environment builds correct urls" time="0.000127">
|
4
|
+
</testcase>
|
5
|
+
</testsuite>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="DoiExtractor::Options.for_command with create command with invalid doi version" tests="1" time="0.000343" failures="0" errors="0" skipped="0" timestamp="2017-09-12T12:47:53-05:00">
|
3
|
+
<testcase name="DoiExtractor::Options.for_command with create command with invalid doi version is not valid" time="0.000167">
|
4
|
+
</testcase>
|
5
|
+
</testsuite>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="DoiExtractor::Options.for_command with create command" tests="2" time="0.000517" failures="0" errors="0" skipped="0" timestamp="2017-09-12T12:47:53-05:00">
|
3
|
+
<testcase name="DoiExtractor::Options.for_command with create command returns the right class" time="0.000158">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="DoiExtractor::Options.for_command with create command sets the attributes" time="0.000162">
|
6
|
+
</testcase>
|
7
|
+
</testsuite>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="DoiExtractor::Options.for_command with download command" tests="2" time="0.000534" failures="0" errors="0" skipped="0" timestamp="2017-09-12T12:47:53-05:00">
|
3
|
+
<testcase name="DoiExtractor::Options.for_command with download command returns the right class" time="0.00013">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="DoiExtractor::Options.for_command with download command sets the attributes" time="0.000134">
|
6
|
+
</testcase>
|
7
|
+
</testsuite>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="DoiExtractor::Options.for_command with status command" tests="2" time="0.000515" failures="0" errors="0" skipped="0" timestamp="2017-09-12T12:47:53-05:00">
|
3
|
+
<testcase name="DoiExtractor::Options.for_command with status command returns the right class" time="0.000128">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="DoiExtractor::Options.for_command with status command sets the attributes" time="0.000122">
|
6
|
+
</testcase>
|
7
|
+
</testsuite>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="DoiExtractor::Options when setting path values" tests="3" time="0.000766" failures="0" errors="0" skipped="0" timestamp="2017-09-12T12:47:53-05:00">
|
3
|
+
<testcase name="DoiExtractor::Options when setting path values defaults the base path" time="0.000145">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="DoiExtractor::Options when setting path values allows overriding the base path" time="0.000137">
|
6
|
+
</testcase>
|
7
|
+
<testcase name="DoiExtractor::Options when setting path values does not allow an empty base path" time="0.000143">
|
8
|
+
</testcase>
|
9
|
+
</testsuite>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="DoiExtractor::Options" tests="1" time="0.000294" failures="0" errors="0" skipped="0" timestamp="2017-09-12T12:47:53-05:00">
|
3
|
+
<testcase name="DoiExtractor::Options defaults to basic auth creds on internal env" time="0.000171">
|
4
|
+
</testcase>
|
5
|
+
</testsuite>
|
@@ -0,0 +1,7 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="DoiExtractor::Secrets" tests="2" time="0.003972" failures="0" errors="0" skipped="0" timestamp="2017-09-12T12:47:53-05:00">
|
3
|
+
<testcase name="DoiExtractor::Secrets reads the api password" time="0.003576">
|
4
|
+
</testcase>
|
5
|
+
<testcase name="DoiExtractor::Secrets overrides correctly" time="0.000128">
|
6
|
+
</testcase>
|
7
|
+
</testsuite>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<testsuite name="DoiExtractor::StatusCommand" tests="1" time="0.004027" failures="0" errors="0" skipped="0" timestamp="2017-09-12T12:47:53-05:00">
|
3
|
+
<testcase name="DoiExtractor::StatusCommand generates some output" time="0.003642">
|
4
|
+
</testcase>
|
5
|
+
</testsuite>
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'simplecov'
|
4
|
+
require 'simplecov-rcov'
|
5
|
+
|
6
|
+
SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
|
7
|
+
SimpleCov.start do
|
8
|
+
add_filter '/spec/'
|
9
|
+
add_filter '/vendor/bundle'
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'rspec'
|
13
|
+
require 'webmock/rspec'
|
14
|
+
require File.expand_path('../../lib/doi_extractor', __FILE__)
|
15
|
+
|
16
|
+
Dir[File.expand_path('../support/**/*', __FILE__)].each { |f| require f }
|
17
|
+
|
18
|
+
RSpec.configure do |config|
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class TestInput
|
2
|
+
|
3
|
+
AskAnswer = Struct.new(:question, :answer)
|
4
|
+
|
5
|
+
attr_reader :answers
|
6
|
+
attr_reader :history
|
7
|
+
|
8
|
+
def initialize(answers = {})
|
9
|
+
@answers = answers
|
10
|
+
@history = []
|
11
|
+
end
|
12
|
+
|
13
|
+
def add_answer(msg_match, answer)
|
14
|
+
answers[msg_match] = answer
|
15
|
+
end
|
16
|
+
|
17
|
+
def asked?(msg)
|
18
|
+
history.any? { |h| msg === h.question }
|
19
|
+
end
|
20
|
+
|
21
|
+
def call(msg)
|
22
|
+
a = answers.detect do |k, v|
|
23
|
+
k === msg
|
24
|
+
end
|
25
|
+
|
26
|
+
value = a ? a[1] : nil
|
27
|
+
|
28
|
+
if value && value.respond_to?(:call)
|
29
|
+
value = value.call
|
30
|
+
end
|
31
|
+
|
32
|
+
history << AskAnswer.new(msg, value)
|
33
|
+
value
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe DoiExtractor::CancelCommand do
|
4
|
+
|
5
|
+
let(:options) { DoiExtractor::Options.for_command('cancel', project: 'cps', environment: 'local', api_password: 'abc123', force: true, extract_group_id: 1).tap {|o| o.validate } }
|
6
|
+
let(:output) { StringIO.new }
|
7
|
+
let(:command) { DoiExtractor::CancelCommand.new(options, output) }
|
8
|
+
|
9
|
+
let(:get_url) { 'http://localhost:3003/cps-action/api/extracts/v1/extract_request_groups/1' }
|
10
|
+
let(:cancel_url) { 'http://localhost:3003/cps-action/api/extracts/v1/extract_request_groups/1/cancel' }
|
11
|
+
|
12
|
+
context 'when successful' do
|
13
|
+
|
14
|
+
let!(:get_stub) { stub_request(:get, get_url).to_return(body: '{"id": 1, "status": "submitted"}') }
|
15
|
+
let!(:cancel_stub) { stub_request(:post, cancel_url).to_return(body: '{"id": 1, "status": "cancelled"}') }
|
16
|
+
|
17
|
+
it 'makes two API calls' do
|
18
|
+
command.execute
|
19
|
+
expect(get_stub).to have_been_requested.times(1)
|
20
|
+
expect(cancel_stub).to have_been_requested.times(1)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'writes to sdtout' do
|
24
|
+
command.execute
|
25
|
+
expect(output.string).to match /complete/i
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe DoiExtractor::CommandLineParser do
|
4
|
+
|
5
|
+
shared_examples 'command_examples' do |name, extra_flags = []|
|
6
|
+
let(:parser) { DoiExtractor::CommandLineParser.parse([name] + %w(-p cps -e live) + extra_flags) }
|
7
|
+
|
8
|
+
it 'should be valid' do
|
9
|
+
expect(parser.valid?).to eq true
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should contain options" do
|
13
|
+
expect(parser.options).to be_a DoiExtractor::Options
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'should set options attributes' do
|
17
|
+
expect(parser.options.command).to eq name
|
18
|
+
expect(parser.options.project).to eq 'cps'
|
19
|
+
expect(parser.options.environment).to eq 'live'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'with a valid create command' do
|
24
|
+
include_examples 'command_examples', 'create', %w(-v 1.1)
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'with a valid create command with email' do
|
28
|
+
include_examples 'command_examples', 'create', %w(-v 1.2 -E roland@tet.com)
|
29
|
+
|
30
|
+
it 'should set the email option' do
|
31
|
+
puts parser.options.inspect
|
32
|
+
expect(parser.options.email).to eq 'roland@tet.com'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'with a valid status command' do
|
37
|
+
include_examples 'command_examples', 'status', %w(-i 1)
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'with a valid download command' do
|
41
|
+
include_examples 'command_examples', 'download', %w(-i 1)
|
42
|
+
end
|
43
|
+
|
44
|
+
context 'with an invalid command' do
|
45
|
+
let(:parser) { DoiExtractor::CommandLineParser.parse(%w(invalid -p cps)) }
|
46
|
+
|
47
|
+
it 'should not be valid' do
|
48
|
+
expect(parser.valid?).to eq false
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should have a reasonable error message' do
|
52
|
+
expect(parser.to_s).to match(/invalid\s+command/i)
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should not have any options' do
|
56
|
+
expect(parser.options).to be_nil
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context 'with an unknown option' do
|
61
|
+
let(:parser) { DoiExtractor::CommandLineParser.parse(%w(status -p cps -e live -x extra))}
|
62
|
+
|
63
|
+
it 'should not be valid' do
|
64
|
+
expect(parser.valid?).to eq false
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe DoiExtractor::CreateCommand do
|
4
|
+
|
5
|
+
let(:options) { DoiExtractor::Options.for_command('create', project: 'cps', environment: 'local', api_password: 'abc123').tap {|o| o.validate } }
|
6
|
+
let(:output) { StringIO.new }
|
7
|
+
let(:command) { DoiExtractor::CreateCommand.new(options, output) }
|
8
|
+
|
9
|
+
let(:recent_url) { 'http://localhost:3003/cps-action/api/extracts/v1/extract_request_groups/recent?type=doi' }
|
10
|
+
let(:create_url) { 'http://localhost:3003/cps-action/api/extracts/v1/extract_request_groups' }
|
11
|
+
|
12
|
+
context 'when successful' do
|
13
|
+
|
14
|
+
let!(:recent_stub) { stub_request(:get, recent_url).to_return(body: '[]') }
|
15
|
+
let!(:create_stub) { stub_request(:post, create_url).to_return(body: '{"id": 1, "status": "empty", "doi_version": "1.1", "year": "2017", "extract_requests": [{"id": 10}, {"id": 11}]}') }
|
16
|
+
|
17
|
+
it 'makes 2 API calls' do
|
18
|
+
command.execute
|
19
|
+
expect(recent_stub).to have_been_requested.times(1)
|
20
|
+
expect(create_stub).to have_been_requested.times(1)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'writes to sdtout' do
|
24
|
+
command.execute
|
25
|
+
expect(output.string).to match /doi extract with id \d+ submitted./im
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context 'when an existing extract is processing' do
|
30
|
+
let!(:recent_stub) { stub_request(:get, recent_url).to_return(body: '[{"id": 1, "status": "submitted"}]') }
|
31
|
+
let!(:create_stub) { stub_request(:post, create_url) }
|
32
|
+
|
33
|
+
it 'makes 1 API call' do
|
34
|
+
command.execute rescue DoiExtractor::CommandFailError
|
35
|
+
expect(recent_stub).to have_been_requested.times(1)
|
36
|
+
expect(create_stub).not_to have_been_requested
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'raises a CommandFailError' do
|
40
|
+
expect { command.execute }.to raise_error DoiExtractor::CommandFailError
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe DoiExtractor::DownloadCommand do
|
4
|
+
|
5
|
+
let(:base_path) { File.expand_path(File.dirname(__FILE__) + '/../testdata/') }
|
6
|
+
let(:path) { File.join(base_path, '2017_v1.1') }
|
7
|
+
let(:options) { DoiExtractor::Options.for_command('download', project: 'cps', environment: 'local', extract_group_id: 1, api_password: 'abc123', download_base_path: base_path, force: true).tap {|o| o.validate } }
|
8
|
+
let(:output) { StringIO.new }
|
9
|
+
let(:input) { TestInput.new }
|
10
|
+
let(:command) { DoiExtractor::DownloadCommand.new(options, output, input) }
|
11
|
+
|
12
|
+
let(:complete_extract_group_json) {
|
13
|
+
{
|
14
|
+
id: 1,
|
15
|
+
year: '2017',
|
16
|
+
doi_version: '1.1',
|
17
|
+
status: 'complete',
|
18
|
+
all_data_available: true,
|
19
|
+
citation: 'this is a citation',
|
20
|
+
codebook_extract: {id: 40, extract_file_name: 'cps_004.dat.gz', samples: [{id: 100, name: '1990a'}, {id: 200, name: '2000a'}, {id: 300, name: '2010a'}], files: [{filename: 'cps_004.cbk', ext: 'cbk'}, {filename: 'cps_004.xml', ext: 'xml'}]},
|
21
|
+
extract_requests: [
|
22
|
+
{id: 10, extract_file_name: 'cps_001.dat.gz', samples: [{id: 100, name: '1990a'}], files: [{filename: 'cps_001.dat.gz', ext: 'dat.gz'}, {filename: 'cps_001.cbk', ext: 'cbk'}, {filename: 'cps_001.xml', ext: 'xml'}]},
|
23
|
+
{id: 20, extract_file_name: 'cps_002.dat.gz', samples: [{id: 200, name: '2000a'}], files: [{filename: 'cps_002.dat.gz', ext: 'dat.gz'}, {filename: 'cps_002.cbk', ext: 'cbk'}, {filename: 'cps_002.xml', ext: 'xml'}]},
|
24
|
+
{id: 30, extract_file_name: 'cps_003.dat.gz', samples: [{id: 300, name: '2010a'}], files: [{filename: 'cps_003.dat.gz', ext: 'dat.gz'}, {filename: 'cps_003.cbk', ext: 'cbk'}, {filename: 'cps_003.xml', ext: 'xml'}]}
|
25
|
+
]
|
26
|
+
}
|
27
|
+
}
|
28
|
+
|
29
|
+
let(:submitted_extract_group_json) {
|
30
|
+
{
|
31
|
+
id: 2,
|
32
|
+
year: '2017',
|
33
|
+
doi_version: '1.1',
|
34
|
+
status: 'submitted',
|
35
|
+
extract_requess: []
|
36
|
+
}
|
37
|
+
}
|
38
|
+
|
39
|
+
def stub_get_extract_group(id, group_json)
|
40
|
+
url = "http://localhost:3003/cps-action/api/extracts/v1/extract_request_groups/#{id}"
|
41
|
+
if group_json
|
42
|
+
stub_request(:get, url).to_return(body: JSON.dump(group_json))
|
43
|
+
else
|
44
|
+
stub_request(:get, url).to_return(status: 404)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
before do
|
49
|
+
if Dir.exist?(path)
|
50
|
+
FileUtils.rm_rf(path)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'when an extract is available' do
|
55
|
+
let!(:get_stub) { stub_get_extract_group(1, complete_extract_group_json) }
|
56
|
+
|
57
|
+
def stub_file_download(er, f)
|
58
|
+
stub_request(:get, "http://localhost:3003/cps-action/api/extracts/v1/extract_requests/#{er[:id]}/file/#{f[:ext]}").to_return(body: f[:filename])
|
59
|
+
end
|
60
|
+
|
61
|
+
let!(:download_stubs) {
|
62
|
+
[].tap do |stubs|
|
63
|
+
complete_extract_group_json[:extract_requests].each do |er|
|
64
|
+
er[:files].each do |f|
|
65
|
+
stubs << stub_file_download(er, f)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
stubs << stub_file_download(complete_extract_group_json[:codebook_extract], complete_extract_group_json[:codebook_extract][:files].last)
|
69
|
+
end
|
70
|
+
}
|
71
|
+
|
72
|
+
it 'executes all requests' do
|
73
|
+
command.execute
|
74
|
+
expect(get_stub).to have_been_requested.times(1)
|
75
|
+
download_stubs.each do |s|
|
76
|
+
expect(s).to have_been_requested.times(1)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'packages everything' do
|
81
|
+
command.execute
|
82
|
+
complete_extract_group_json[:extract_requests].each do |er|
|
83
|
+
s = er[:samples].first[:name]
|
84
|
+
|
85
|
+
expect(File.exist?(File.join(path, "#{s}.tar.gz"))).to be_truthy
|
86
|
+
end
|
87
|
+
expect(File.exist?(File.join(path, "summary.txt"))).to be_truthy
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'adds the citation to the summary file' do
|
91
|
+
command.execute
|
92
|
+
txt = File.read(File.join(path, "summary.txt"))
|
93
|
+
expect(txt).to match /this is a citation/
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'cleans up the tmp folder' do
|
97
|
+
command.execute
|
98
|
+
expect(File.exist?(File.join(path, 'tmp'))).to be_falsey
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'does not prompt the user when forced it true' do
|
102
|
+
input.add_answer(/.*/, ->{ raise 'no asking' })
|
103
|
+
command.execute
|
104
|
+
end
|
105
|
+
|
106
|
+
context 'when force is not set' do
|
107
|
+
let(:options) { DoiExtractor::Options.for_command('download', project: 'cps', environment: 'local', extract_group_id: 1, api_password: 'abc123', download_base_path: base_path).tap {|o| o.validate } }
|
108
|
+
|
109
|
+
before do
|
110
|
+
input.add_answer(/download/, 'y')
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'asks for user input' do
|
114
|
+
command.execute
|
115
|
+
expect(input.asked?(/download/)).to be_truthy
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
context 'user cancels download' do
|
121
|
+
let(:options) { DoiExtractor::Options.for_command('download', project: 'cps', environment: 'local', extract_group_id: 1, api_password: 'abc123', download_base_path: base_path, force: false).tap {|o| o.validate } }
|
122
|
+
let!(:get_stub) { stub_get_extract_group(1, complete_extract_group_json) }
|
123
|
+
|
124
|
+
before do
|
125
|
+
input.add_answer(/download/, 'n')
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'asks for input' do
|
129
|
+
expect { command.execute }.to raise_error DoiExtractor::CommandFailError, /cancelled/
|
130
|
+
expect(input.asked?(/download/)).to be_truthy
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'does not create the output path' do
|
134
|
+
expect { command.execute }.to raise_error DoiExtractor::CommandFailError, /cancelled/
|
135
|
+
expect(File.exist?(path)).to be_falsey
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|