diff --git a/app/assets/images/destroy.png b/app/assets/images/destroy.png new file mode 100755 index 0000000..76a1c72 Binary files /dev/null and b/app/assets/images/destroy.png differ diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb index 153af83..171fdf9 100644 --- a/app/controllers/attachments_controller.rb +++ b/app/controllers/attachments_controller.rb @@ -30,4 +30,9 @@ def update end end end + + def destroy + @attachment.destroy + redirect_to attachments_path + end end diff --git a/app/models/attachment.rb b/app/models/attachment.rb index f40be36..6295120 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -47,7 +47,7 @@ def full_filename def rows(size = 0) parsed_data[0..(size - 1)] end - + private # When parsing data, we expect our file to be saved as valid utf-8 @@ -81,7 +81,7 @@ def store_file end def delete_file - File.delete(full_filename) + File.delete(full_filename) rescue true #catch Errno::ENOENT exception for deleted files end diff --git a/app/views/attachments/index.html.haml b/app/views/attachments/index.html.haml index afcbdcb..6491a38 100644 --- a/app/views/attachments/index.html.haml +++ b/app/views/attachments/index.html.haml @@ -10,6 +10,7 @@ %th= Attachment.model_name.human(count: 1) %th= Mapping.model_name.human(count: 1) %th= Import.model_name.human(count: 1) + %th %tbody - @attachments.each do |attachment| %tr @@ -29,3 +30,5 @@ .created= import.created_at - elsif attachment.mapping = link_to(t('imports.new'), new_attachment_import_path(attachment)) + %td + = link_to(image_tag('destroy.png'), attachment, :confirm => t('attachments.delete_confirm'), :method => :delete) diff --git a/config/locales/en.yml b/config/locales/en.yml index 94fa03f..9b200f8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -35,6 +35,7 @@ en: new: Upload new CSV file upload: Upload proceed_to_mapping: Proceed to mapping + delete_confirm: "Please note that, this is irreversible process. This will delete associated imports. Are you sure?" mappings: title: one: "%{count} field: %{fields}" @@ -69,4 +70,4 @@ en: confirm_destroy: Really delete this record? step: "Step %{count} from %{total}:" errors: - sk_login_required: "Please login to SalesKing and navigate to this app from inside there." \ No newline at end of file + sk_login_required: "Please login to SalesKing and navigate to this app from inside there." diff --git a/config/routes.rb b/config/routes.rb index a97dc1a..abe2513 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,6 +1,6 @@ CsvImporter::Application.routes.draw do - resources :attachments, except: [:edit, :destroy] do + resources :attachments, except: [:edit] do resources :mappings, only: [:new, :create] resources :imports, only: [:new, :create] end diff --git a/spec/controllers/attachments_controller_spec.rb b/spec/controllers/attachments_controller_spec.rb index da251ad..4685fff 100644 --- a/spec/controllers/attachments_controller_spec.rb +++ b/spec/controllers/attachments_controller_spec.rb @@ -38,6 +38,13 @@ put :update, id: Factory(:attachment).id, attachment: {} end end + + describe "DELETE #destroy" do + it "triggers access_denied" do + controller.should_receive(:access_denied) + delete :destroy, id: Factory(:attachment).id + end + end end context "for authenticaned user" do @@ -173,5 +180,19 @@ end end end + + describe "DELETE destroy" do + it "destroys the requested attachment" do + expect { + delete :destroy, :id => @authorized_attachment.id + }.to change(Attachment, :count).by(-1) + end + + it "redirects to the attachments list after destroying the requested attachment" do + delete :destroy, :id => @authorized_attachment.id + response.should redirect_to(attachments_path) + end + end + end end diff --git a/spec/models/attachment_spec.rb b/spec/models/attachment_spec.rb index 95fd006..374732e 100644 --- a/spec/models/attachment_spec.rb +++ b/spec/models/attachment_spec.rb @@ -19,6 +19,12 @@ File.exist?(file_path).should be_false end + it "should silently ignore missing files on destroy" do + file_path = @attachment.full_filename + File.delete(file_path) + lambda {@attachment.destroy}.should_not raise_error(Errno::ENOENT) + end + it "parses csv data" do @attachment.rows.size.should == 2 @attachment.rows.first.size.should be > 1 @@ -28,7 +34,7 @@ @attachment.rows(1).size.should == 1 end - describe "different csv formats" do + describe "formats" do {'google_native_test_.csv' => 3, 'google_outlook_test.csv' => 3, 'test1.csv' => 2}.each do |csv_file, count| it "should able to read #{csv_file}" do attachment = Factory(:attachment, :uploaded_data => file_upload(csv_file))