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/factories.rb b/spec/factories.rb index 234f995..a042805 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -7,15 +7,49 @@ end factory :mapping do + end + #data rwo will be like this ["Test organization", "Test", "male_user", "test_user1@email.com", "Herr", "1980-01-10"] factory :mapping_element do - association :mapping + mapping source 0 target 'organization' end + factory :fname_mapping_element, :class => MappingElement do + mapping + source '1,2' + target 'first_name' + conv_type 'join' + end + + factory :email_mapping_element, :class => MappingElement do + mapping + source 3 + target 'email' + end + + factory :gender_mapping_element, :class => MappingElement do + mapping + source 4 + target 'gender' + conv_type 'enum' + conv_opts "{\"male\":\"Herr\",\" female\":\"Frau\"}" + end + + factory :birthday_mapping_element, :class => MappingElement do + mapping + source 5 + target 'birthday' + conv_type 'date' + conv_opts "{\"date\":\"%Y-%M-%d\"}" + end + + + factory :import do association :attachment 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)) diff --git a/spec/models/data_row_spec.rb b/spec/models/data_row_spec.rb index 2772cb3..bea96ea 100644 --- a/spec/models/data_row_spec.rb +++ b/spec/models/data_row_spec.rb @@ -2,4 +2,86 @@ describe DataRow do it { should belong_to(:import) } + + describe "#populate_client" do + before :each do + @mapping = Factory(:mapping) + @attachment = Factory(:attachment, mapping: @mapping) + + @import = Factory.build(:import, attachment: @attachment) + @import.should_receive(:populate_data_rows).and_return(true) #To avoid firing data_row create from after_save + @import.save + @client = stub_sk_client + end + + context 'creating sk client record' do + context 'successfully' do + before :each do + #TODO try moving these to factoris file. defining association with mapping in factory is not working at the moment. + Factory(:mapping_element, mapping: @mapping) + Factory(:gender_mapping_element, mapping: @mapping) + Factory(:birthday_mapping_element, mapping: @mapping) + Factory(:fname_mapping_element, mapping: @mapping ) + Factory(:mapping_element, mapping: @mapping, source: 6, target: 'address.zip') + Factory(:mapping_element, mapping: @mapping, source: 7, target: 'address.address1') + Factory(:mapping_element, mapping: @mapping, source: 8, target: 'address.city') + @csv_row = ["Test org", "T", "Male_user", "test@email.com", "Herr", "1980-01-10", '83620', 'Hubertstr. 205', 'Feldkirchen'] + @client.should_receive(:save).and_return(true) + @client.should_receive(:id).and_return("some_uuid") + @data_row = @import.data_rows.new(data: @csv_row) + @data_row.save! + end + + it "should save Client ID in corresponding data row" do + @data_row.sk_id.should == 'some_uuid' + end + + it "should have organization field value" do + @client.organization.should == 'Test org' + end + + it "should have converted enum field value" do + @client.gender.should == 'male' + end + + it "should have formatted date field value" do + @client.birthday.should == '1980.01.10' + end + + it "should join initial and first_name" do + @client.first_name.should == 'T Male_user' + end + + it "should create an address" do + @client.addresses[0].zip.should == '83620' + @client.addresses[0].address1.should == 'Hubertstr. 205' + @client.addresses[0].city.should == 'Feldkirchen' + end + end #successfully + + context 'fails' do + before :each do + @csv_row = ["", "T", "Male_user", "test@email.com", "Herr", "1980-01-10", '83620', 'Hubertstr. 205', 'Feldkirchen'] + @client.should_receive(:save).and_return(false) + @client.errors[:base] = 'Organisation or lastname must be present.' + @data_row = @import.data_rows.new(data: @csv_row) + @data_row.save! + end + + it "should not save Client ID in corresponding data row" do + @data_row.sk_id.should be_nil + end + + it "should save failed row as source" do + @data_row.source.should == @csv_row.to_csv(col_sep: @attachment.col_sep, quote_char: @attachment.quote_char) + end + + it "should save error log returned from client" do + @data_row.log.should == 'Organisation or lastname must be present.' + end + end #Fails + + end #creating sk client record + + end end diff --git a/spec/models/import_spec.rb b/spec/models/import_spec.rb index 52e95f0..d898486 100644 --- a/spec/models/import_spec.rb +++ b/spec/models/import_spec.rb @@ -46,4 +46,4 @@ @import.should be_success end end -end \ No newline at end of file +end