require File.dirname(__FILE__) + '/spec_helper'

describe 'Upload' do
  def setup_db
    ActiveRecord::Schema.define(version: 1) do
      create_table :photos do |t|
        t.column :image, :string
        t.column :content_type, :string
      end

      create_table :attachments do |t|
        t.column :file, :string
        t.column :content_type, :string
      end
    end
  end

  def drop_db
    ActiveRecord::Base.connection.tables.each do |table|
      ActiveRecord::Base.connection.drop_table(table)
    end
  end

  class PhotoUploader < CarrierWave::Uploader::Base
    include CarrierWave::MiniMagick

    version :small do
      process resize_to_fill: [120, 120]
    end

    def store_dir
      'photos'
    end
  end

  class AttachUploader < CarrierWave::Uploader::Base
    include CarrierWave::MiniMagick

    def store_dir
      'attachs'
    end

    def content_disposition
      "attachment;filename=#{file.original_filename}"
    end
  end

  class Photo < ActiveRecord::Base
    mount_uploader :image, PhotoUploader
  end

  class Attachment < ActiveRecord::Base
    mount_uploader :file, AttachUploader
  end

  before :all do
    setup_db
  end

  after :all do
    drop_db
  end

  describe 'Upload Image' do
    context 'should upload image' do
      before(:all) do
        @file = load_file('foo.jpg')
        @file1 = load_file('foo.gif')
        @photo = Photo.new(image: @file)
        @photo1 = Photo.new(image: @file1)
      end

      it 'should upload file' do
        expect(@photo.save).to eq true
        expect(@photo[:image].present?).to eq true
        # FIXME: image? 需要实现
        # expect(@photo.image?).to eq true
      end

      it 'should get uploaded file' do
        img = open(@photo.image.url)
        expect(img.size).to eq @file.size
        expect(img.content_type).to eq 'image/jpeg'

        expect(@photo1.save).to eq true
        img1 = open(@photo1.image.url)
        expect(img1.size).to eq @file1.size
        expect(img1.content_type).to eq 'image/gif'
      end

      it 'sholud get small version uploaded file' do
        expect(open(@photo.image.small.url)).not_to eq nil
        expect(open(@photo1.image.small.url)).not_to eq nil
      end

      it 'should get Aliyun OSS thumb url with :thumb option' do
        url = @photo.image.url(thumb: '@150w_140h.png')
        expect(url).to include('.img-')
        expect(url).to include('@150w_140h.png')
        url1 = @photo.image.url(thumb: '@!150w_140h.jpg')
        expect(url1).to include('.img-')
        expect(url1).to include('@!150w_140h.jpg')
        img1 = open(url)
        expect(img1.size).not_to eq 0
        expect(img1.content_type).to eq 'image/png'
      end
    end

    context 'should update zip' do
      before(:all) do
        @file = load_file('foo.zip')
        @attachment = Attachment.new(file: @file)
      end

      it 'should upload file' do
        expect(@attachment.save).to eq true
      end

      it 'should get uploaded file' do
        attach = open(@attachment.file.url)
        expect(attach.size).to eq @file.size
        expect(attach.content_type).to eq 'application/zip'
        expect(attach.meta['content-disposition']).to eq 'attachment;filename=foo.zip'
      end

      it 'should delete old file when upload a new file again' do
        old_url = @attachment.file.url
        @attachment.file = load_file('foo.gif')
        @attachment.save
        res = Net::HTTP.get_response(URI.parse(old_url))
        expect(res.code).to eq '404'
      end
    end
  end
end