# frozen_string_literal: true

RSpec.describe Admin::EmojisController do
  fab!(:admin) { Fabricate(:admin) }
  fab!(:upload) { Fabricate(:upload) }

  before do
    sign_in(admin)
  end

  describe '#index' do
    it "returns a list of custom emojis" do
      CustomEmoji.create!(name: 'osama-test-emoji', upload: upload)
      Emoji.clear_cache

      get "/admin/customize/emojis.json"
      expect(response.status).to eq(200)

      json = response.parsed_body
      expect(json[0]["name"]).to eq("osama-test-emoji")
      expect(json[0]["url"]).to eq(upload.url)
    end
  end

  describe "#create" do
    describe 'when upload is invalid' do
      it 'should publish the right error' do

        post "/admin/customize/emojis.json", params: {
          name: 'test',
          file: fixture_file_upload("#{Rails.root}/spec/fixtures/images/fake.jpg")
        }

        expect(response.status).to eq(422)
        parsed = response.parsed_body
        expect(parsed["errors"]).to eq([I18n.t('upload.images.size_not_found')])
      end
    end

    describe 'when emoji name already exists' do
      it 'should publish the right error' do
        CustomEmoji.create!(name: 'test', upload: upload)

        post "/admin/customize/emojis.json", params: {
          name: 'test',
          file: fixture_file_upload("#{Rails.root}/spec/fixtures/images/logo.png")
        }

        expect(response.status).to eq(422)
        parsed = response.parsed_body
        expect(parsed["errors"]).to eq([
          "Name #{I18n.t('activerecord.errors.models.custom_emoji.attributes.name.taken')}"
        ])
      end
    end

    it 'should allow an admin to add a custom emoji' do
      Emoji.expects(:clear_cache)

      post "/admin/customize/emojis.json", params: {
        name: 'test',
        file: fixture_file_upload("#{Rails.root}/spec/fixtures/images/logo.png")
      }

      custom_emoji = CustomEmoji.last
      upload = custom_emoji.upload

      expect(upload.original_filename).to eq('logo.png')

      data = response.parsed_body
      expect(response.status).to eq(200)
      expect(data["errors"]).to eq(nil)
      expect(data["name"]).to eq(custom_emoji.name)
      expect(data["url"]).to eq(upload.url)
      expect(custom_emoji.group).to eq(nil)
    end

    it 'should allow an admin to add a custom emoji with a custom group' do
      Emoji.expects(:clear_cache)

      post "/admin/customize/emojis.json", params: {
        name: 'test',
        group: 'Foo',
        file: fixture_file_upload("#{Rails.root}/spec/fixtures/images/logo.png")
      }

      custom_emoji = CustomEmoji.last

      data = response.parsed_body
      expect(response.status).to eq(200)
      expect(custom_emoji.group).to eq("foo")
    end

    it 'should fix up the emoji name' do
      Emoji.expects(:clear_cache).times(3)

      post "/admin/customize/emojis.json", params: {
        name: 'test.png',
        file: fixture_file_upload("#{Rails.root}/spec/fixtures/images/logo.png")
      }

      custom_emoji = CustomEmoji.last
      upload = custom_emoji.upload

      expect(upload.original_filename).to eq('logo.png')
      expect(custom_emoji.name).to eq("test")
      expect(response.status).to eq(200)

      post "/admin/customize/emojis.json", params: {
        name: 'st&#* onk$',
        file: fixture_file_upload("#{Rails.root}/spec/fixtures/images/logo.png")
      }

      custom_emoji = CustomEmoji.last
      expect(custom_emoji.name).to eq("st_onk_")
      expect(response.status).to eq(200)

      post "/admin/customize/emojis.json", params: {
        name: 'PaRTYpaRrot',
        file: fixture_file_upload("#{Rails.root}/spec/fixtures/images/logo.png")
      }

      custom_emoji = CustomEmoji.last
      expect(custom_emoji.name).to eq("partyparrot")
      expect(response.status).to eq(200)
    end
  end

  describe '#destroy' do
    it 'should allow an admin to delete a custom emoji' do
      custom_emoji = CustomEmoji.create!(name: 'test', upload: upload)
      Emoji.clear_cache

      expect do
        delete "/admin/customize/emojis/#{custom_emoji.name}.json",
          params: { name: 'test' }
      end.to change { CustomEmoji.count }.by(-1)
    end
  end
end