|
|
|
@@ -0,0 +1,86 @@ |
|
|
|
require "rails_helper" |
|
|
|
|
|
|
|
|
|
|
|
RSpec.describe "nico:sync" do |
|
|
|
def stub_python(json_array) |
|
|
|
status = instance_double(Process::Status, success?: true) |
|
|
|
allow(Open3).to receive(:capture3).and_return([json_array.to_json, "", status]) |
|
|
|
end |
|
|
|
|
|
|
|
def create_tag!(name, category:) |
|
|
|
tn = TagName.find_or_create_by!(name: name.to_s.strip) |
|
|
|
Tag.find_or_create_by!(tag_name_id: tn.id) { |t| t.category = category } |
|
|
|
end |
|
|
|
|
|
|
|
def link_nico_to_tag!(nico_tag, tag) |
|
|
|
# NicoTagRelation がある前提(君の model からそう見える) |
|
|
|
NicoTagRelation.create!(nico_tag_id: nico_tag.id, tag_id: tag.id) |
|
|
|
end |
|
|
|
|
|
|
|
it "既存 post を見つけて、nico tag と linked tag を追加し、差分が出たら bot を付ける" do |
|
|
|
# 既存 post(正規表現で拾われるURL) |
|
|
|
post = Post.create!(title: "old", url: "https://www.nicovideo.jp/watch/sm9", uploaded_user: nil) |
|
|
|
|
|
|
|
# 既存の非nicoタグ(kept_non_nico_ids) |
|
|
|
kept_general = create_tag!("spec_kept", category: "general") |
|
|
|
PostTag.create!(post: post, tag: kept_general) |
|
|
|
|
|
|
|
# 追加される linked tag を準備(nico tag に紐付く一般タグ) |
|
|
|
linked = create_tag!("spec_linked", category: "general") |
|
|
|
nico = create_tag!("nico:AAA", category: "nico") |
|
|
|
link_nico_to_tag!(nico, linked) |
|
|
|
|
|
|
|
# bot / tagme は task 内で使うので作っておく(Tag.bot/tagme がある前提) |
|
|
|
Tag.bot |
|
|
|
Tag.tagme |
|
|
|
|
|
|
|
# pythonの出力(AAA が付く) |
|
|
|
stub_python([{ "code" => "sm9", "title" => "t", "tags" => ["AAA"] }]) |
|
|
|
|
|
|
|
# 外部HTTPは今回「既存 post なので呼ばれない」はずだが、念のため塞ぐ |
|
|
|
allow(URI).to receive(:open).and_return(StringIO.new("<html></html>")) |
|
|
|
|
|
|
|
run_rake_task("nico:sync") |
|
|
|
|
|
|
|
post.reload |
|
|
|
active_tag_names = post.tags.joins(:tag_name).pluck("tag_names.name") |
|
|
|
|
|
|
|
expect(active_tag_names).to include("spec_kept") |
|
|
|
expect(active_tag_names).to include("nico:AAA") |
|
|
|
expect(active_tag_names).to include("spec_linked") |
|
|
|
|
|
|
|
# 差分が出るので bot が付く(kept_non_nico_ids != desired_non_nico_ids) |
|
|
|
expect(active_tag_names).to include("bot操作") |
|
|
|
end |
|
|
|
|
|
|
|
it "既存 post にあった古い nico tag は active から外され、履歴として discard される" do |
|
|
|
post = Post.create!(title: "old", url: "https://www.nicovideo.jp/watch/sm9", uploaded_user: nil) |
|
|
|
|
|
|
|
# 旧nicoタグ(今回の同期結果に含まれない) |
|
|
|
old_nico = create_tag!("nico:OLD", category: "nico") |
|
|
|
old_pt = PostTag.create!(post: post, tag: old_nico) |
|
|
|
expect(old_pt.discarded_at).to be_nil |
|
|
|
|
|
|
|
# 今回は NEW のみ欲しい |
|
|
|
new_nico = create_tag!("nico:NEW", category: "nico") |
|
|
|
|
|
|
|
# bot/tagme 念のため |
|
|
|
Tag.bot |
|
|
|
Tag.tagme |
|
|
|
|
|
|
|
stub_python([{ "code" => "sm9", "title" => "t", "tags" => ["NEW"] }]) |
|
|
|
allow(URI).to receive(:open).and_return(StringIO.new("<html></html>")) |
|
|
|
|
|
|
|
run_rake_task("nico:sync") |
|
|
|
|
|
|
|
# OLD は active から外れる(discarded_at が入る) |
|
|
|
old_pts = PostTag.where(post_id: post.id, tag_id: old_nico.id).order(:id).to_a |
|
|
|
expect(old_pts.last.discarded_at).to be_present |
|
|
|
|
|
|
|
# NEW は active にいる |
|
|
|
post.reload |
|
|
|
active_names = post.tags.joins(:tag_name).pluck("tag_names.name") |
|
|
|
expect(active_names).to include("nico:NEW") |
|
|
|
expect(active_names).not_to include("nico:OLD") |
|
|
|
end |
|
|
|
end |