|
- 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
|