require 'rails_helper' # This spec was generated by rspec-rails when you ran the scaffold generator. # It demonstrates how one might use RSpec to test the controller code that # was generated by Rails when you ran the scaffold generator. # # It assumes that the implementation code is generated by the rails scaffold # generator. If you are using any extension libraries to generate different # controller code, this generated spec may or may not pass. # # It only uses APIs available in rails and/or rspec-rails. There are a number # of tools you can use to make these specs even more expressive, but we're # sticking to rails and rspec-rails APIs to keep things simple and stable. <% module_namespacing do -%> describe "/<%= name.underscore.pluralize %>", <%= type_metatag(:request) %> do <% if method = Rails.application.config.generators.options[:rails][:cancan] -%> <% method = 'current_user' unless Symbol === method -%> before :each do allow_any_instance_of(<%= controller_class_name %>Controller).to receive(:<%=method%>) .and_return(<%=method%>) end <% end -%> # This should return the minimal set of attributes required to create a valid # <%= class_name %>. As you add validations to <%= class_name %>, be sure to # adjust the attributes here as well. The list could not be empty. <% links = attributes.select{|a| [:belongs_to, :references].include? a.type} -%> <% attribute = (attributes - links).detect{|a| a.name == 'name' || a.name == 'title' || a.name == 'code' || a.name =~ /name/ || a.name =~ /title/} || attributes.first -%> <% attribute_name = attribute.respond_to?(:column_name) ? attribute.column_name : attribute.name -%> <% if Rails.application.config.generators.options[:rails][:fixture_replacement] == :factory_bot -%> <% factory_bot = true -%> let(:<%= file_name %>) {create :<%= file_name %>} <% if links.present? -%> let(:valid_attributes) do attributes_for(:<%=file_name%>) .slice(*%i[<%= attribute_name %>]) .merge( <% links.each do |relation| -%> <%= relation.name %>_id: create(:<%= relation.name %>).id, <% end -%> ) end <% else -%> let(:valid_attributes) {attributes_for(:<%=file_name%>).slice *%i[<%= attribute_name %>]} <% end -%> <% else -%> <% factory_bot = false -%> let(:<%= file_name %>) {<%= class_name %>.create! valid_attributes} let(:valid_attributes) do skip("Add a hash of attributes valid for your model") end <% end -%> let(:invalid_attributes) do # {<%= attribute_name %>: ''} skip("Add a hash of attributes invalid for your model") end <% unless options[:singleton] -%> describe "GET /index" do it "renders a successful response" do <%= class_name %>.create! valid_attributes get <%= index_helper %>_url expect(response).to be_successful end end <% end -%> describe "GET /show" do it "renders a successful response" do <% unless factory_bot -%> <%= file_name %> = <%= class_name %>.create! valid_attributes <% end -%> get <%= show_helper.sub(/@([^)]+)/, 'id: \1.to_param') %> expect(response).to be_successful end end describe "GET /new" do it "renders a successful response" do get <%= new_helper %> expect(response).to be_successful end end describe "GET /edit" do it "render a successful response" do <% unless factory_bot -%> <%= file_name %> = <%= class_name %>.create! valid_attributes <% end -%> get <%= edit_helper.tr('@','id: ') %> expect(response).to be_successful end end describe "POST /create" do context "with valid parameters" do it "creates a new <%= class_name %>" do expect { post <%= index_helper %>_url, params: { <%= ns_file_name %>: valid_attributes } }.to change(<%= class_name %>, :count).by(1) end it "redirects to the created <%= ns_file_name %>" do post <%= index_helper %>_url, params: { <%= ns_file_name %>: valid_attributes } expect(response).to redirect_to(<%= show_helper.gsub("\@#{file_name}", class_name+".last") %>) end end context "with invalid parameters" do it "does not create a new <%= class_name %>" do expect { post <%= index_helper %>_url, params: { <%= ns_file_name %>: invalid_attributes } }.to change(<%= class_name %>, :count).by(0) end it "renders a successful response (i.e. to display the 'new' template)" do post <%= index_helper %>_url, params: { <%= ns_file_name %>: invalid_attributes } expect(response).to be_successful end end end describe "PATCH /update" do context "with valid parameters" do let(:new_attributes) { {<%= attribute_name %>: 'New value'} } it "updates the requested <%= ns_file_name %>" do # expect_any_instance_of(<%= class_name %>) # .to receive(:update).with(new_attributes.inject({}){|_, (k, v)| _[k] = v.to_s; _}) <% unless factory_bot -%> <%= file_name %> = <%= class_name %>.create! valid_attributes <% end -%> patch <%= show_helper.sub(/@([^)]+)/, 'id: \1.to_param') %>, params: { <%= singular_table_name %>: new_attributes } <%= file_name %>.reload # skip("Add assertions for updated state") expect(<%= file_name %>.<%= attribute_name %>).to eq 'New value' end it "redirects to the <%= ns_file_name %>" do <% unless factory_bot -%> <%= file_name %> = <%= class_name %>.create! valid_attributes <% end -%> patch <%= show_helper.sub(/@([^)]+)/, 'id: \1.to_param') %>, params: { <%= singular_table_name %>: new_attributes } <%= file_name %>.reload expect(response).to redirect_to(<%= singular_table_name %>_url(id: <%= file_name %>.to_param)) end end context "with invalid parameters" do it "renders a successful response (i.e. to display the 'edit' template)" do <% unless factory_bot -%> <%= file_name %> = <%= class_name %>.create! valid_attributes <% end -%> patch <%= show_helper.sub(/@([^)]+)/, 'id: \1.to_param') %>, params: { <%= singular_table_name %>: invalid_attributes } expect(response).to be_successful end end end describe "DELETE /destroy" do it "destroys the requested <%= ns_file_name %>" do <% if factory_bot -%> <%= file_name %> <% else -%> <%= file_name %> = <%= class_name %>.create! valid_attributes <% end -%> expect { delete <%= show_helper.sub(/@([^)]+)/, 'id: \1.to_param') %> }.to change(<%= class_name %>, :count).by(-1) end it "redirects to the <%= table_name %> list" do <% if factory_bot -%> <%= file_name %> <% else -%> <%= file_name %> = <%= class_name %>.create! valid_attributes <% end -%> delete <%= show_helper.sub(/@([^)]+)/, 'id: \1.to_param') %> expect(response).to redirect_to(<%= index_helper %>_url) end end end <% end -%>