diff --git a/app/controllers/servers_controller.rb b/app/controllers/servers_controller.rb index 2d51e09d..2d8357c2 100644 --- a/app/controllers/servers_controller.rb +++ b/app/controllers/servers_controller.rb @@ -4,14 +4,13 @@ class ServersController < ApplicationController before_action :set_server, only: %i[show edit update destroy] before_action :authenticate_employee, only: %i[show index] before_action :authenticate_admin, only: %i[new create edit update destroy] + # GET /servers - # GET /servers.json def index @servers = Server.all end # GET /servers/1 - # GET /servers/1.json def show; end # GET /servers/new @@ -23,103 +22,28 @@ def new def edit; end # POST /servers - # POST /servers.json def create - # parse software fields from the post parameters into the server_params - software = [] - - params.each do |key, value| - key_matcher = /software\d+/ - software << value if key_matcher.match?(key) - end - - # merge server_params [and software information - server_params[:installed_software] = software - - server_params.permit( - :name, - :cpu_cores, - :ram_gb, - :storage_gb, - :ipv4_address, - :ipv6_address, - :mac_address, - :fqdn, - :installed_software, - :vendor, - :model, - :responsible_id, - :description - ) - - # create new Server object - setNewServerObject - - respond_to do |format| - if @server.save - format.html { redirect_to @server, notice: 'Server was successfully created.' } - format.json { render :show, status: :created, location: @server } - else - format.html { render :new } - format.json { render json: @server.errors, status: :unprocessable_entity } - end + @server = Server.new(server_params) + if @server.save + redirect_to @server, notice: 'Server was successfully created.' + else + render :new end end - def setNewServerObject - @server = Server.new( - name: server_params[:name], - cpu_cores: server_params[:cpu_cores], - ram_gb: server_params[:ram_gb], - storage_gb: server_params[:storage_gb], - mac_address: server_params[:mac_address], - fqdn: server_params[:fqdn], - ipv4_address: server_params[:ipv4_address], - ipv6_address: server_params[:ipv6_address], - installed_software: server_params[:installed_software], - vendor: server_params[:vendor], - model: server_params[:model], - description: server_params[:description], - responsible_id: server_params[:responsible] - ) - end - # PATCH/PUT /servers/1 - # PATCH/PUT /servers/1.json def update - respond_to do |format| - if @server.update(server_params.permit( - :name, - :cpu_cores, - :ram_gb, - :storage_gb, - :ipv4_address, - :ipv6_address, - :mac_address, - :fqdn, - :installed_software, - :model, - :vendor, - :description, - :responsible_id - )) - format.html { redirect_to @server, notice: 'Server was successfully updated.' } - format.json { render :show, status: :ok, location: @server } - else - format.html { render :edit } - format.json { render json: @server.errors, status: :unprocessable_entity } - end + if @server.update(server_params) + redirect_to @server, notice: 'Server was successfully updated.' + else + render :edit end end # DELETE /servers/1 - # DELETE /servers/1.json def destroy @server.destroy - respond_to do |format| - format.html { redirect_to servers_path, notice: 'Server was successfully deleted.' } - format.json { head :no_content } - end + redirect_to servers_path, notice: 'Server was successfully deleted.' end private @@ -131,6 +55,11 @@ def set_server # Never trust parameters from the scary internet, only allow the white list through. def server_params - params.fetch(:server, {}) + # Remove empty software form fields + params[:server][:installed_software].reject!(&:blank?) if params[:server][:installed_software] + # `installed_software: []` permits arrays + params.require(:server).permit(:name, :cpu_cores, :ram_gb, :storage_gb, :ipv4_address, + :ipv6_address, :mac_address, :fqdn, {installed_software: []}, + :model, :vendor, :description, :responsible_id) end end diff --git a/app/views/servers/_form.html.erb b/app/views/servers/_form.html.erb index 36d4e296..696926ae 100644 --- a/app/views/servers/_form.html.erb +++ b/app/views/servers/_form.html.erb @@ -21,13 +21,10 @@
- <%= form.label :responsible, "Responsible" %>
- <%= form.select 'responsible', - options_from_collection_for_select(User.all, - :id, - :human_readable_identifier), - {}, - { multiple: false, class: "selecttwo", style: 'width: 50%' } %> + <%= form.label :responsible, "Responsible" %> + <%# form.collection_select(method, collection, value_method, text_method, options = {}, html_options = {}) %> + <%= form.collection_select(:responsible_id, User.all, :id, :human_readable_identifier, + options={prompt: true}, html_options={class: "selecttwo"}) %>
@@ -85,33 +82,24 @@
Software Information
- - +
- + <%= form.label :installed_software, "Installed Software" %> + <% server.installed_software.each do |software| %> + <%= form.text_field :installed_software, multiple: true, value: software, class: 'form-control mb-1' %> + <% end %> + + +
<%= form.submit class: "btn btn-primary" %> diff --git a/spec/controllers/servers_controller_spec.rb b/spec/controllers/servers_controller_spec.rb index 57f8b5e8..fe718ff0 100644 --- a/spec/controllers/servers_controller_spec.rb +++ b/spec/controllers/servers_controller_spec.rb @@ -4,33 +4,12 @@ RSpec.describe ServersController, type: :controller do let(:valid_attributes) do - { - name: 'SpecServer', - cpu_cores: 4, - ram_gb: 1024, - storage_gb: 4096, - mac_address: 'C0:FF:EE:C4:11:42', - fqdn: 'arrrr.speck.de', - ipv4_address: '8.8.8.8', - ipv6_address: '::1', - installed_software: ['SpeckTester'], - responsible: FactoryBot.create(:user) - } + employee = FactoryBot.create(:employee) + FactoryBot.attributes_for(:server, responsible_id: employee.id) end - + let(:invalid_attributes) do - { - name: 'SpecServer', - cpu_cores: '', - ram_gb: 1024, - storage_gb: 4096, - mac_address: 'EE:C4:11:42', - fqdn: 'arrrr.speck.de', - ipv4_address: 'c8.a8.d8.b8', - ipv6_address: 42, - installed_software: ['SpeckTester'], - responsible: 'Hans Würtschen' - } + { cpu_cores: 'twelve-hundred', mac_address: 1234 } end let(:valid_session) { {} } @@ -79,13 +58,21 @@ describe 'POST #create' do context 'with valid params' do it 'creates a new Server' do - expect { post :create, params: { server: valid_attributes }, session: valid_session }.to change(Server, :count).by(1) + expect { + post :create, params: { server: valid_attributes }, session: valid_session + }.to change(Server, :count).by(1) end it 'redirects to the created server' do post :create, params: { server: valid_attributes }, session: valid_session expect(response).to redirect_to(Server.last) end + + it 'creates a new Server without saving empty software fields' do + valid_attributes.update(installed_software: ['software','','']) + post :create, params: { server: valid_attributes }, session: valid_session + expect(Server.last.installed_software).to eq(['software']) + end end context 'with invalid params' do @@ -98,26 +85,12 @@ describe 'PUT #update' do context 'with valid params' do - let(:new_attributes) do - { - name: 'SpeckServer', - cpu_cores: 2, - ram_gb: 1024, - storage_gb: 4096, - mac_address: 'C0:FF:EE:C4:11:42', - fqdn: 'arrrr.speck.de', - ipv4_address: '8.8.8.8', - ipv6_address: '::1', - installed_software: ['SpeckTester'], - responsible: FactoryBot.create(:admin) - } - end - it 'updates the requested server' do - server = Server.create! valid_attributes - put :update, params: { id: server.to_param, server: new_attributes }, session: valid_session - server.reload - expect(server.name).to eq('SpeckServer') + server = FactoryBot.create(:server, name: 'Original') + valid_attributes.update(name: 'Changed') + expect{ + put :update, params: { id: server.to_param, server: valid_attributes }, session: valid_session + }.to change{ server.reload.name }.from(server.name).to(valid_attributes[:name]) end it 'redirects to the server' do @@ -125,6 +98,14 @@ put :update, params: { id: server.to_param, server: valid_attributes }, session: valid_session expect(response).to redirect_to(server) end + + it 'updates the requested server without saving empty software fields' do + server = FactoryBot.create(:server, installed_software: []) + valid_attributes.update(installed_software: ['software','','']) + expect{ + put :update, params: { id: server.to_param, server: valid_attributes }, session: valid_session + }.to change{ server.reload.installed_software }.from(server.installed_software).to(['software']) + end end context 'with invalid params' do diff --git a/spec/views/servers/new.html.erb_spec.rb b/spec/views/servers/new.html.erb_spec.rb index 91cc6d01..1a948402 100644 --- a/spec/views/servers/new.html.erb_spec.rb +++ b/spec/views/servers/new.html.erb_spec.rb @@ -38,7 +38,7 @@ assert_select 'input[name=?]', 'server[ipv6_address]' - assert_select 'select[name=?]', 'server[responsible]' + assert_select 'select[name=?]', 'server[responsible_id]' expect(rendered).to have_button 'Add Software' end