require 'test_helper'

class PostRegenerationsControllerTest < ActionDispatch::IntegrationTest
  context "The post regenerations controller" do
    setup do
      @mod = create(:moderator_user, name: "yukari", created_at: 1.month.ago)
      @post = create(:post_with_file, filename: "test.jpg")
      perform_enqueued_jobs # add post to iqdb
    end

    context "create action" do
      should "render" do
        post_auth post_regenerations_path, @mod, params: { post_id: @post.id, category: "iqdb" }

        assert_redirected_to @post
        assert_enqueued_jobs(1, only: RegeneratePostJob)
      end

      should "not allow non-mods to regenerate posts" do
        post_auth post_regenerations_path, create(:user), params: { post_id: @post.id, category: "iqdb" }
        assert_response 403
      end

      context "for an IQDB regeneration" do
        should "regenerate IQDB" do
          post_auth post_regenerations_path, @mod, params: { post_id: @post.id, category: "iqdb" }
          perform_enqueued_jobs

          assert_redirected_to @post
        end

        should "log a mod action" do
          post_auth post_regenerations_path, @mod, params: { post_id: @post.id, category: "iqdb" }
          perform_enqueued_jobs

          assert_equal(@mod, ModAction.last.creator)
          assert_equal("post_regenerate_iqdb", ModAction.last.category)
          assert_equal("regenerated IQDB for post ##{@post.id}", ModAction.last.description)
          assert_equal(@post, ModAction.last.subject)
          assert_equal(@mod, ModAction.last.creator)
        end
      end

      context "for an image sample regeneration" do
        should "regenerate missing thumbnails" do
          @preview_file_size = @post.media_asset.variant(:"180x180").open_file.size
          @post.media_asset.variant(:"180x180").delete_file!
          assert_raise(Errno::ENOENT) { @post.file(:"180x180") }

          post_auth post_regenerations_path, @mod, params: { post_id: @post.id }
          perform_enqueued_jobs

          assert_equal(@preview_file_size, @post.file(:"180x180").size)
        end

        should "log a mod action" do
          post_auth post_regenerations_path, @mod, params: { post_id: @post.id }
          perform_enqueued_jobs

          assert_equal(@mod, ModAction.last.creator)
          assert_equal("post_regenerate", ModAction.last.category)
          assert_equal("regenerated image samples for post ##{@post.id}", ModAction.last.description)
          assert_equal(@post, ModAction.last.subject)
          assert_equal(@mod, ModAction.last.creator)
        end

        should "fix the width and height of exif-rotated images" do
          @post = create(:post_with_file, filename: "test-rotation-90cw.jpg")

          post_auth post_regenerations_path, @mod, params: { post_id: @post.id }
          perform_enqueued_jobs
          @post.reload

          assert_equal(96, @post.image_width)
          assert_equal(128, @post.image_height)
          assert_equal(96, @post.media_asset.image_width)
          assert_equal(128, @post.media_asset.image_height)
        end
      end
    end
  end
end
