require 'spec_helper'

module Spree
  describe Spree::Api::ImagesController, :type => :controller do
    render_views

    let!(:product) { create(:product) }
    let!(:attributes) { [:id, :position, :attachment_content_type,
                         :attachment_file_name, :type, :attachment_updated_at, :attachment_width,
                         :attachment_height, :alt] }

    before do
      stub_authentication!
    end

    context "as an admin" do
      sign_in_as_admin!

      it "can upload a new image for a variant" do
        expect do
          api_post :create,
                   :image => { :attachment => upload_image('thinking-cat.jpg'),
                               :viewable_type => 'Spree::Variant',
                               :viewable_id => product.master.to_param  },
                   :product_id => product.id
          expect(response.status).to eq(201)
          expect(json_response).to have_attributes(attributes)
        end.to change(Image, :count).by(1)
      end

      context "working with an existing image" do
        let!(:product_image) { product.master.images.create!(:attachment => image('thinking-cat.jpg')) }

        it "can get a single product image" do
          api_get :show, :id => product_image.id, :product_id => product.id
          expect(response.status).to eq(200)
          expect(json_response).to have_attributes(attributes)
        end

        it "can get a single variant image" do
          api_get :show, :id => product_image.id, :variant_id => product.master.id
          expect(response.status).to eq(200)
          expect(json_response).to have_attributes(attributes)
        end

        it "can get a list of product images" do
          api_get :index, :product_id => product.id
          expect(response.status).to eq(200)
          expect(json_response).to have_key("images")
          expect(json_response["images"].first).to have_attributes(attributes)
        end

        it "can get a list of variant images" do
          api_get :index, :variant_id => product.master.id
          expect(response.status).to eq(200)
          expect(json_response).to have_key("images")
          expect(json_response["images"].first).to have_attributes(attributes)
        end

        it "can update image data" do
          expect(product_image.position).to eq(1)
          api_post :update, :image => { :position => 2 }, :id => product_image.id, :product_id => product.id
          expect(response.status).to eq(200)
          expect(json_response).to have_attributes(attributes)
          expect(product_image.reload.position).to eq(2)
        end

        it "can delete an image" do
          api_delete :destroy, :id => product_image.id, :product_id => product.id
          expect(response.status).to eq(204)
          expect { product_image.reload }.to raise_error(ActiveRecord::RecordNotFound)
        end
      end
    end

    context "as a non-admin" do
      it "cannot create an image" do
        api_post :create, :product_id => product.id
        assert_unauthorized!
      end

      it "cannot update an image" do
        api_put :update, :id => 1, :product_id => product.id
        assert_not_found!
      end

      it "cannot delete an image" do
        api_delete :destroy, :id => 1, :product_id => product.id
        assert_not_found!
      end
    end
  end
end