From 8bec6b0bcb100b30a43fcd9c6649d1bee113b6a7 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 26 May 2014 14:17:46 +0200 Subject: Make existing tests test something, return correct errors. --- app/controllers/projects_controller.rb | 19 ++++++++++++++----- app/uploaders/file_uploader.rb | 2 +- spec/controllers/projects_controller_spec.rb | 17 +++++++++-------- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index c15205fb68f..3144ece977c 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -164,12 +164,21 @@ class ProjectsController < ApplicationController def upload_image uploader = FileUploader.new('uploads', upload_path, accepted_images) - alt = params['markdown_img'].original_filename - uploader.store!(params['markdown_img']) - link = { 'alt' => File.basename(alt, '.*'), - 'url' => File.join(root_url, uploader.url) } + image = params['markdown_img'] + + if image && accepted_images.map{ |format| image.content_type.include? format }.any? + alt = image.original_filename + uploader.store!(image) + link = { 'alt' => File.basename(alt, '.*'), + 'url' => File.join(root_url, uploader.url) } + end + respond_to do |format| - format.json { render json: { link: link } } + if link + format.json { render json: { link: link } } + else + format.json { render json: "Invalid file.", status: :unprocessable_entity } + end end end diff --git a/app/uploaders/file_uploader.rb b/app/uploaders/file_uploader.rb index cbc9271ac14..0fa987c93f6 100644 --- a/app/uploaders/file_uploader.rb +++ b/app/uploaders/file_uploader.rb @@ -25,7 +25,7 @@ class FileUploader < CarrierWave::Uploader::Base end def store!(file) - file.original_filename = self.class.generate_filename(file) + @filename = self.class.generate_filename(file) super end diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb index 07ca8d25026..1d465d4996e 100644 --- a/spec/controllers/projects_controller_spec.rb +++ b/spec/controllers/projects_controller_spec.rb @@ -11,34 +11,35 @@ describe ProjectsController do describe "POST #upload_image" do before do sign_in(user) + project.team << [user, :developer] end context "without params['markdown_img']" do it "returns an error" do - post :upload_image, id: project.to_param - expect(response.status).to eq(404) + post :upload_image, id: project.to_param, format: :json + expect(response.status).to eq(422) end end context "with invalid file" do before do - post :upload_image, id: project.to_param, markdown_img: @img + post :upload_image, id: project.to_param, markdown_img: txt, format: :json end it "returns an error" do - expect(response.status).to eq(404) + expect(response.status).to eq(422) end end context "with valid file" do before do - post :upload_image, id: project.to_param, markdown_img: @img + post :upload_image, id: project.to_param, markdown_img: jpg, format: :json end it "returns a content with original filename and new link." do - link = { alt: 'rails_sample', link: '' }.to_json - expect(response.body).to have_content link + expect(response.body).to match "\"alt\":\"rails_sample\"" + expect(response.body).to match "\"url\":\"http://test.host/uploads/#{project.path_with_namespace}" end end end -end \ No newline at end of file +end -- cgit v1.2.1 From 3b2b3cff04993c7247e953c10aa8c6fb5e8d6ddb Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 26 May 2014 14:53:34 +0200 Subject: Move logic to image_service. --- app/controllers/projects_controller.rb | 14 +++-------- app/services/projects/image_service.rb | 39 +++++++++++++++++++++++++++++ spec/controllers/commits_controller_spec.rb | 2 +- 3 files changed, 43 insertions(+), 12 deletions(-) create mode 100644 app/services/projects/image_service.rb diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 3144ece977c..07ccbd57faf 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -163,19 +163,11 @@ class ProjectsController < ApplicationController end def upload_image - uploader = FileUploader.new('uploads', upload_path, accepted_images) - image = params['markdown_img'] - - if image && accepted_images.map{ |format| image.content_type.include? format }.any? - alt = image.original_filename - uploader.store!(image) - link = { 'alt' => File.basename(alt, '.*'), - 'url' => File.join(root_url, uploader.url) } - end + link_to_image = ::Projects::ImageService.new(repository, params, root_url).execute respond_to do |format| - if link - format.json { render json: { link: link } } + if link_to_image + format.json { render json: { link: link_to_image } } else format.json { render json: "Invalid file.", status: :unprocessable_entity } end diff --git a/app/services/projects/image_service.rb b/app/services/projects/image_service.rb new file mode 100644 index 00000000000..c79ddddd972 --- /dev/null +++ b/app/services/projects/image_service.rb @@ -0,0 +1,39 @@ +module Projects + class ImageService < BaseService + include Rails.application.routes.url_helpers + def initialize(repository, params, root_url) + @repository, @params, @root_url = repository, params.dup, root_url + end + + def execute + uploader = FileUploader.new('uploads', upload_path, accepted_images) + image = @params['markdown_img'] + + if image && correct_mime_type?(image) + alt = image.original_filename + uploader.store!(image) + link = { + 'alt' => File.basename(alt, '.*'), + 'url' => File.join(@root_url, uploader.url) + } + else + link = nil + end + end + + protected + + def upload_path + base_dir = FileUploader.generate_dir + File.join(@repository.path_with_namespace, base_dir) + end + + def accepted_images + %w(png jpg jpeg gif) + end + + def correct_mime_type?(image) + accepted_images.map{ |format| image.content_type.include? format }.any? + end + end +end diff --git a/spec/controllers/commits_controller_spec.rb b/spec/controllers/commits_controller_spec.rb index 308cfa69219..0c19d755eb1 100644 --- a/spec/controllers/commits_controller_spec.rb +++ b/spec/controllers/commits_controller_spec.rb @@ -6,7 +6,7 @@ describe Projects::CommitsController do before do sign_in(user) - project.creator = user + project.team << [user, :master] end describe "GET show" do -- cgit v1.2.1 From f8a6d3405ea3a25f5b0776241831deb037020fc6 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 26 May 2014 15:47:54 +0200 Subject: Add image_service spec. --- spec/controllers/projects_controller_spec.rb | 3 -- spec/services/projects/image_service_spec.rb | 65 ++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 spec/services/projects/image_service_spec.rb diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb index 1d465d4996e..7a772396e8b 100644 --- a/spec/controllers/projects_controller_spec.rb +++ b/spec/controllers/projects_controller_spec.rb @@ -3,10 +3,7 @@ require('spec_helper') describe ProjectsController do let(:project) { create(:project) } let(:user) { create(:user) } - let(:png) { fixture_file_upload(Rails.root + 'spec/fixtures/dk.png', 'image/png') } let(:jpg) { fixture_file_upload(Rails.root + 'spec/fixtures/rails_sample.jpg', 'image/jpg') } - let(:gif) { fixture_file_upload(Rails.root + 'spec/fixtures/banana_sample.gif', 'image/gif') } - let(:txt) { fixture_file_upload(Rails.root + 'spec/fixtures/doc_sample.txt', 'text/plain') } describe "POST #upload_image" do before do diff --git a/spec/services/projects/image_service_spec.rb b/spec/services/projects/image_service_spec.rb new file mode 100644 index 00000000000..0311e312b5d --- /dev/null +++ b/spec/services/projects/image_service_spec.rb @@ -0,0 +1,65 @@ +require 'spec_helper' + +describe Projects::ImageService do + before(:each) { enable_observers } + after(:each) { disable_observers } + + describe 'Image service' do + before do + @user = create :user + @project = create :project, creator_id: @user.id, namespace: @user.namespace + end + + context 'for valid gif file' do + before do + gif = fixture_file_upload(Rails.root + 'spec/fixtures/banana_sample.gif', 'image/gif') + @link_to_image = upload_image(@project.repository, { 'markdown_img' => gif }, "http://test.example/") + end + + it { expect(@link_to_image).to have_key("alt") } + it { expect(@link_to_image).to have_key("url") } + it { expect(@link_to_image).to have_value("banana_sample") } + it { expect(@link_to_image["url"]).to match("http://test.example/uploads/#{@project.path_with_namespace}") } + it { expect(@link_to_image["url"]).to match("banana_sample.gif") } + end + + context 'for valid png file' do + before do + png = fixture_file_upload(Rails.root + 'spec/fixtures/dk.png', 'image/png') + @link_to_image = upload_image(@project.repository, { 'markdown_img' => png }, "http://test.example/") + end + + it { expect(@link_to_image).to have_key("alt") } + it { expect(@link_to_image).to have_key("url") } + it { expect(@link_to_image).to have_value("dk") } + it { expect(@link_to_image["url"]).to match("http://test.example/uploads/#{@project.path_with_namespace}") } + it { expect(@link_to_image["url"]).to match("dk.png") } + end + + context 'for valid jpg file' do + before do + jpg = fixture_file_upload(Rails.root + 'spec/fixtures/rails_sample.jpg', 'image/jpg') + @link_to_image = upload_image(@project.repository, { 'markdown_img' => jpg }, "http://test.example/") + end + + it { expect(@link_to_image).to have_key("alt") } + it { expect(@link_to_image).to have_key("url") } + it { expect(@link_to_image).to have_value("rails_sample") } + it { expect(@link_to_image["url"]).to match("http://test.example/uploads/#{@project.path_with_namespace}") } + it { expect(@link_to_image["url"]).to match("rails_sample.jpg") } + end + + context 'for txt file' do + before do + txt = fixture_file_upload(Rails.root + 'spec/fixtures/doc_sample.txt', 'text/plain') + @link_to_image = upload_image(@project.repository, { 'markdown_img' => txt }, "http://test.example/") + end + + it { expect(@link_to_image).to be_nil } + end + end + + def upload_image(repository, params, root_url) + Projects::ImageService.new(repository, params, root_url).execute + end +end -- cgit v1.2.1 From 43e7b8fa075a2744b2debf11f52d1df731950aa8 Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 26 May 2014 15:55:41 +0200 Subject: Remove empty space --- spec/services/projects/image_service_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/services/projects/image_service_spec.rb b/spec/services/projects/image_service_spec.rb index 0311e312b5d..070c21698cf 100644 --- a/spec/services/projects/image_service_spec.rb +++ b/spec/services/projects/image_service_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe Projects::ImageService do before(:each) { enable_observers } after(:each) { disable_observers } - + describe 'Image service' do before do @user = create :user -- cgit v1.2.1 From 9b2a13497dfc1fc97ac5d84f4074729cda040e2a Mon Sep 17 00:00:00 2001 From: Marin Jankovski Date: Mon, 26 May 2014 15:58:03 +0200 Subject: Need txt file in test. --- spec/controllers/projects_controller_spec.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb index 7a772396e8b..944df5314bd 100644 --- a/spec/controllers/projects_controller_spec.rb +++ b/spec/controllers/projects_controller_spec.rb @@ -4,6 +4,7 @@ describe ProjectsController do let(:project) { create(:project) } let(:user) { create(:user) } let(:jpg) { fixture_file_upload(Rails.root + 'spec/fixtures/rails_sample.jpg', 'image/jpg') } + let(:txt) { fixture_file_upload(Rails.root + 'spec/fixtures/doc_sample.txt', 'text/plain') } describe "POST #upload_image" do before do -- cgit v1.2.1