# frozen_string_literal: true RSpec.describe QuotedPost do it "correctly extracts quotes" do Jobs.run_immediately! topic = Fabricate(:topic) post1 = create_post(topic: topic, post_number: 1, raw: "foo bar") post2 = create_post(topic: topic, post_number: 2, raw: "lorem ipsum") post3 = create_post(topic: topic, post_number: 3, raw: "test post") raw = <<~RAW #{post1.full_url} [quote="#{post2.user.username}, post:#{post2.post_number}, topic:#{post2.topic.id}"] lorem [/quote] this is a test post #{post3.full_url} RAW stub_image_size post4 = create_post(topic: topic, raw: raw, post_number: 4, reply_to_post_number: post3.post_number) expect(QuotedPost.where(post_id: post4.id).pluck(:quoted_post_id)).to contain_exactly( post1.id, post2.id, post3.id, ) expect(post4.reload.reply_quoted).to eq(true) SiteSetting.editing_grace_period = 1.minute.to_i post5 = create_post(topic: topic, post_number: 5, raw: "post 5") raw = raw.sub(post3.full_url, post5.full_url) post4.revise(post4.user, { raw: raw }, revised_at: post4.updated_at + 2.minutes) expect(QuotedPost.where(post_id: post4.id).pluck(:quoted_post_id)).to contain_exactly( post1.id, post2.id, post5.id, ) end it "doesn't count quotes from the same post" do Jobs.run_immediately! topic = Fabricate(:topic) post = create_post(topic: topic, post_number: 1, raw: "foo bar") post.cooked = <<-HTML <aside class="quote" data-post="#{post.post_number}" data-topic="#{post.topic_id}"> <div class="title"> <div class="quote-controls"></div> <img width="20" height="20" src="/user_avatar/meta.discourse.org/techapj/20/3281.png" class="avatar">techAPJ: </div> <blockquote><p>When the user will v</p></blockquote> </aside> HTML post.save! QuotedPost.extract_from(post) expect(QuotedPost.where(post_id: post.id).count).to eq(0) expect(QuotedPost.where(quoted_post_id: post.id).count).to eq(0) end it "correctly handles deltas" do post1 = Fabricate(:post) post2 = Fabricate(:post) post2.cooked = <<-HTML <aside class="quote" data-post="#{post1.post_number}" data-topic="#{post1.topic_id}"> <div class="title"> <div class="quote-controls"></div> <img width="20" height="20" src="/user_avatar/meta.discourse.org/techapj/20/3281.png" class="avatar">techAPJ: </div> <blockquote><p>When the user will v</p></blockquote> </aside> HTML quote = QuotedPost.create!(post_id: post2.id, quoted_post_id: post1.id) original_date = quote.created_at freeze_time 1.hour.from_now QuotedPost.extract_from(post2) expect(QuotedPost.where(post_id: post2.id).count).to eq(1) expect(QuotedPost.find_by(post_id: post2.id, quoted_post_id: post1.id)).not_to eq(nil) quote.reload expect(original_date).to eq_time(quote.created_at) expect(post2.reply_quoted).to eq(false) end end