require 'rails_helper'
require_dependency 'flag_query'

describe FlagQuery do

  let(:codinghorror) { Fabricate(:coding_horror) }

  describe "flagged_posts_report" do
    it "does not return flags on system posts" do
      admin = Fabricate(:admin)
      post = create_post(user: Discourse.system_user)
      PostAction.act(codinghorror, post, PostActionType.types[:spam])
      posts, topics, users = FlagQuery.flagged_posts_report(admin)

      expect(posts).to be_blank
      expect(topics).to be_blank
      expect(users).to be_blank
    end

    it "operates correctly" do
      admin = Fabricate(:admin)
      moderator = Fabricate(:moderator)

      post = create_post
      post2 = create_post

      user2 = Fabricate(:user)
      user3 = Fabricate(:user)

      PostAction.act(codinghorror, post, PostActionType.types[:spam])
      PostAction.act(user2, post, PostActionType.types[:spam])
      mod_message = PostAction.act(user3, post, PostActionType.types[:notify_moderators], message: "this is a :one::zero:")

      PostAction.act(codinghorror, post2, PostActionType.types[:spam])
      PostAction.act(user2, post2, PostActionType.types[:spam])

      posts, topics, users = FlagQuery.flagged_posts_report(admin)

      expect(posts.count).to eq(2)
      first = posts.first

      expect(users.count).to eq(5)
      expect(first[:post_actions].count).to eq(2)

      expect(topics.count).to eq(2)

      second = posts[1]

      expect(second[:post_actions].count).to eq(3)
      expect(second[:post_actions].first[:permalink]).to eq(mod_message.related_post.topic.relative_url)
      expect(second[:post_actions].first[:conversation][:response][:excerpt]).to match("<img src=")

      posts, users = FlagQuery.flagged_posts_report(admin, offset: 1)
      expect(posts.count).to eq(1)

      # Try by topic
      posts = FlagQuery.flagged_posts_report(admin, topic_id: post.topic_id)
      expect(posts).to be_present
      posts = FlagQuery.flagged_posts_report(admin, topic_id: -1)
      expect(posts[0]).to be_blank

      # Try by user
      posts = FlagQuery.flagged_posts_report(admin, user_id: post.user_id)
      expect(posts).to be_present
      posts = FlagQuery.flagged_posts_report(admin, user_id: -1000)
      expect(posts[0]).to be_blank

      # chuck post in category a mod can not see and make sure its missing
      category = Fabricate(:category)
      category.set_permissions(admins: :full)
      category.save
      post2.topic.category_id = category.id
      post2.topic.save

      posts, users = FlagQuery.flagged_posts_report(moderator)

      expect(posts.count).to eq(1)

    end

  end
end
