|
|
|
@@ -0,0 +1,100 @@ |
|
|
|
require 'rails_helper' |
|
|
|
require 'rake' |
|
|
|
require 'open3' |
|
|
|
|
|
|
|
RSpec.describe 'nico:export' do |
|
|
|
let(:task) { Rake::Task['nico:export'] } |
|
|
|
let(:success_status) { instance_double(Process::Status, success?: true) } |
|
|
|
let(:failure_status) { instance_double(Process::Status, success?: false) } |
|
|
|
|
|
|
|
def create_post(url) |
|
|
|
Post.create!(url:) |
|
|
|
end |
|
|
|
|
|
|
|
before(:all) do |
|
|
|
Rails.application.load_tasks unless Rake::Task.task_defined?('nico:export') |
|
|
|
end |
|
|
|
|
|
|
|
before do |
|
|
|
task.reenable |
|
|
|
|
|
|
|
allow(ENV).to receive(:fetch).with('MYSQL_USER').and_return('mysql-user') |
|
|
|
allow(ENV).to receive(:fetch).with('MYSQL_PASS').and_return('mysql-pass') |
|
|
|
allow(ENV).to receive(:fetch).with('NIZIKA_NICO_PATH').and_return('/srv/nizika-nico') |
|
|
|
end |
|
|
|
|
|
|
|
describe 'export' do |
|
|
|
it 'exports nicovideo ids to shared nico DB' do |
|
|
|
create_post('https://www.nicovideo.jp/watch/sm12345?ref=foo') |
|
|
|
create_post('https://www.nicovideo.jp/watch/so67890#comments') |
|
|
|
create_post('https://www.nicovideo.jp/watch/nm24680') |
|
|
|
create_post('https://example.com/watch/sm99999') |
|
|
|
|
|
|
|
expect(Open3).to receive(:capture3) do |env, *args, **kwargs| |
|
|
|
expect(env).to eq( |
|
|
|
{ |
|
|
|
'MYSQL_USER' => 'mysql-user', |
|
|
|
'MYSQL_PASS' => 'mysql-pass', |
|
|
|
}, |
|
|
|
) |
|
|
|
|
|
|
|
expect(args.take(3)).to eq( |
|
|
|
[ |
|
|
|
'python3', |
|
|
|
'-m', |
|
|
|
'tracked_videos.put_bulk_upsert', |
|
|
|
], |
|
|
|
) |
|
|
|
|
|
|
|
expect(args.drop(3)).to contain_exactly( |
|
|
|
'sm12345', |
|
|
|
'so67890', |
|
|
|
'nm24680', |
|
|
|
) |
|
|
|
|
|
|
|
expect(kwargs).to eq(chdir: '/srv/nizika-nico') |
|
|
|
|
|
|
|
['', '', success_status] |
|
|
|
end |
|
|
|
|
|
|
|
task.invoke |
|
|
|
end |
|
|
|
|
|
|
|
it 'deduplicates video ids' do |
|
|
|
create_post('https://www.nicovideo.jp/watch/sm12345') |
|
|
|
create_post('https://www.nicovideo.jp/watch/sm12345?from=1') |
|
|
|
|
|
|
|
expect(Open3).to receive(:capture3) do |_env, *args, **_kwargs| |
|
|
|
expect(args.drop(3)).to eq(['sm12345']) |
|
|
|
|
|
|
|
['', '', success_status] |
|
|
|
end |
|
|
|
|
|
|
|
task.invoke |
|
|
|
end |
|
|
|
|
|
|
|
it 'does not call python when there are no nicovideo posts' do |
|
|
|
create_post('https://example.com/watch/sm12345') |
|
|
|
|
|
|
|
expect(Open3).not_to receive(:capture3) |
|
|
|
|
|
|
|
task.invoke |
|
|
|
end |
|
|
|
|
|
|
|
it 'raises stderr when python command fails' do |
|
|
|
create_post('https://www.nicovideo.jp/watch/sm12345') |
|
|
|
|
|
|
|
allow(Open3).to receive(:capture3).and_return( |
|
|
|
[ |
|
|
|
'', |
|
|
|
'bulk upsert failed', |
|
|
|
failure_status, |
|
|
|
], |
|
|
|
) |
|
|
|
|
|
|
|
expect { |
|
|
|
task.invoke |
|
|
|
}.to raise_error(RuntimeError, 'bulk upsert failed') |
|
|
|
end |
|
|
|
end |
|
|
|
end |