require 'rails_helper'

<% module_namespacing do %>
RSpec.describe <%= controller_class_name %>Controller, <%= type_metatag(:controller) %> do
	sign_in_admin
	cria_configuracao_default
	set_orcamento_na_sessao

	# Isso deve retornar o mínimo de atributos obrigatórios para criar um
	# <%= class_name %> válido.
	<% modelo_no_singular = class_name.underscore.split("/").last -%>
	<% modelo_no_plural = class_name.underscore.pluralize.split("/").last -%>

	let(:atributos_validos) {
		FactoryBot.attributes_for( :<%= class_name.underscore.gsub("/","_") %> )
	}

	let(:atributos_invalidos) {
		skip("Adicione um hash de atributos inválidos para seu modelo")
	}

	<% unless options[:singleton] %>
	describe "GET #index" do
		it "atribui a lista de <%= modelo_no_plural %> à @<%= modelo_no_plural %>" do
			<%= file_name %> = <%= class_name %>.create! atributos_validos
			get :index
			expect(assigns(:<%= modelo_no_plural %>)).to eq([<%= file_name %>])
		end
	end
	<% end %>
	describe "GET #show" do
		it "atribui a <%= modelo_no_singular %> requisitado(a) à @<%= modelo_no_singular %>" do
			<%= file_name %> = <%= class_name %>.create! atributos_validos
			get :show, params: {id: <%= file_name %>.to_param}
			expect(assigns(:<%= modelo_no_singular %>)).to eq(<%= file_name %>)
		end
	end

	describe "GET #new" do
		it "atribui um(a) novo(a) <%= modelo_no_singular %> à @<%= modelo_no_singular %>" do
			get :new
			expect(assigns(:<%= modelo_no_singular %>)).to be_a_new(<%= class_name %>)
		end
	end

	describe "GET #edit" do
		it "atribui o(a) <%= modelo_no_singular %> requisitado à @<%= modelo_no_singular %>" do
			<%= file_name %> = <%= class_name %>.create! atributos_validos
			get :edit, params: {id: <%= file_name %>.to_param}
			expect(assigns(:<%= modelo_no_singular %>)).to eq(<%= file_name %>)
		end
	end

	describe "POST #create" do
		context "com parâmetros válidos" do
			it "cria um(a) novo(a) <%= class_name %>" do
				expect {
					post :create, params: {<%= singular_table_name %>: atributos_validos}
				}.to change(<%= class_name %>, :count).by(1)
			end

			it "atribui o(a) <%= modelo_no_singular %> recém criado(a) à @<%= modelo_no_singular %>" do
				post :create, params: {<%= singular_table_name %>: atributos_validos}
				expect(assigns(:<%= modelo_no_singular %>)).to be_a(<%= class_name %>)
				expect(assigns(:<%= modelo_no_singular %>)).to be_persisted
			end

			it "redireciona para o(a) <%= modelo_no_singular %> criado(a)" do
				post :create, params: {:<%= singular_table_name %> => atributos_validos}
				expect(response).to redirect_to(<%= class_name %>.last)
			end
		end

		context "com parâmetros inválidos" do
			it "atribui um(a) <%= modelo_no_singular %> recém criado(a), mas não salvo(a), à @<%= modelo_no_singular %>" do
				post :create, params: {<%= singular_table_name %>: atributos_invalidos}
				expect(assigns(:<%= modelo_no_singular %>)).to be_a_new(<%= class_name %>)
			end

			it "re-renderiza o template 'new'" do
				post :create, params: {<%= singular_table_name %>: atributos_invalidos}
				expect(response).to render_template("new")
			end
		end
	end

	describe "PUT #update" do
		context "com parâmetros válidos" do
			let(:novos_atributos) {
				skip("Adicione um hash de atributos novos e válidos para seu modelo")
			}

			it "atualiza o(a) <%= modelo_no_singular %> requisitado(a)" do
				<%= file_name %> = <%= class_name %>.create! atributos_validos
				put :update, params: {id: <%= file_name %>.to_param, <%= singular_table_name %>: novos_atributos}
				<%= file_name %>.reload
				skip("Adicione as validações de teste aqui")
			end

			it "atribui o(a) <%= modelo_no_singular %> requisitado(a) à @<%= modelo_no_singular %>" do
				<%= file_name %> = <%= class_name %>.create! atributos_validos
				put :update, params: {id: <%= file_name %>.to_param, <%= singular_table_name %>: atributos_validos}
				expect(assigns(:<%= modelo_no_singular %>)).to eq(<%= file_name %>)
			end

			it "redireciona para o(a) <%= modelo_no_singular %>" do
				<%= file_name %> = <%= class_name %>.create! atributos_validos
				put :update, params: {id: <%= file_name %>.to_param, <%= singular_table_name %>: atributos_validos}
				expect(response).to redirect_to(<%= file_name %>)
			end
		end

		context "com parâmetros inválidos" do
			it "atribui o(a) <%= modelo_no_singular %> à @<%= modelo_no_singular %>" do
				<%= file_name %> = <%= class_name %>.create! atributos_validos
				put :update, params: {id: <%= file_name %>.to_param, <%= singular_table_name %>: atributos_invalidos}
				expect(assigns(:<%= modelo_no_singular %>)).to eq(<%= file_name %>)
			end

			it "re-renderiza o template 'edit'" do
				<%= file_name %> = <%= class_name %>.create! atributos_validos
				put :update, params: {id: <%= file_name %>.to_param, <%= singular_table_name %>: atributos_invalidos}
				expect(response).to render_template("edit")
			end
		end
	end

	describe "DELETE #destroy" do
		it "destrói o(a) <%= modelo_no_singular %> requisitado(a)" do
			<%= file_name %> = <%= class_name %>.create! atributos_validos
			expect {
				delete :destroy, params: {:id => <%= file_name %>.to_param}
			}.to change(<%= class_name %>, :count).by(-1)
		end

		it "redireciona para a lista de <%= modelo_no_plural %>" do
			<%= file_name %> = <%= class_name %>.create! atributos_validos
			delete :destroy, params: {:id => <%= file_name %>.to_param}
			expect(response).to redirect_to(<%= index_helper %>_url)
		end
	end
end
<% end %>
