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 subject(:get_index) {get <%= index_helper %>_url} it "renders a successful response" do <%= class_name %>.create! valid_attributes get_index expect(response).to be_successful end end <% end -%> describe "GET /show" do subject(:get_show) {get <%= show_helper.sub(/@([^)]+)/, 'id: \1.to_param') %>} it "renders a successful response" do <% unless factory_bot -%> <%= file_name %> = <%= class_name %>.create! valid_attributes <% end -%> get_show expect(response).to be_successful end end describe "GET /new" do subject(:get_new) {get <%= new_helper %>} it "renders a successful response" do get_new expect(response).to be_successful end end describe "GET /edit" do subject(:get_edit) {get <%= edit_helper.sub(/@([^)]*)/, 'id: \1.to_param') %>} it "render a successful response" do <% unless factory_bot -%> <%= file_name %> = <%= class_name %>.create! valid_attributes <% end -%> get_edit expect(response).to be_successful end end describe "POST /create" do subject(:post_create) do post <%= index_helper %>_url, params: { <%= ns_file_name %>: attributes } end context "with valid parameters" do let(:attributes) {valid_attributes} it "creates a new <%= class_name %>" do expect{post_create}.to change(<%= class_name %>, :count).by(1) end it "redirects to the created <%= ns_file_name %>" do post_create expect(response).to redirect_to(<%= show_helper.gsub("\@#{file_name}", 'id: ' + class_name + ".last.to_param") %>) end end context "with invalid parameters" do let(:attributes) {invalid_attributes} it "does not create a new <%= class_name %>" do expect {post_create}.not_to change(<%= class_name %>, :count) end it "renders a successful response (i.e. to display the 'new' template)" do post_create expect(response).to be_successful end end end describe "PATCH /update" do subject(:patch_update) do patch <%= show_helper.sub(/@([^)]+)/, 'id: \1.to_param') %>, params: { <%= singular_table_name %>: attributes } end context "with valid parameters" do let(:attributes) { {<%= attribute_name %>: 'New value'} } it "updates the requested <%= ns_file_name %>" do # expect_any_instance_of(<%= class_name %>) # .to receive(:update).with(attributes.inject({}){|_, (k, v)| _[k] = v.to_s; _}) <% unless factory_bot -%> <%= file_name %> = <%= class_name %>.create! valid_attributes <% end -%> patch_update <%= 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_update <%= file_name %>.reload expect(response).to redirect_to(<%= singular_table_name %>_url(id: <%= file_name %>.to_param)) end end context "with invalid parameters" do let(:attributes) {invalid_attributes} 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_update expect(response).to be_successful end end end describe "DELETE /destroy" do subject(:delete_destroy) {delete <%= show_helper.sub(/@([^)]+)/, 'id: \1.to_param') %>} it "destroys the requested <%= ns_file_name %>" do <% if factory_bot -%> <%= file_name %> <% else -%> <%= file_name %> = <%= class_name %>.create! valid_attributes <% end -%> expect {delete_destroy}.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_destroy expect(response).to redirect_to(<%= index_helper %>_url) end end end <% end -%>