Skip to content

Commit

Permalink
Merge 61d6e71 into cf51246
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisma committed Mar 27, 2019
2 parents cf51246 + 61d6e71 commit 854af4f
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 166 deletions.
105 changes: 17 additions & 88 deletions app/controllers/servers_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
52 changes: 20 additions & 32 deletions app/views/servers/_form.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,10 @@
</div>

<div class="field form-group">
<%= form.label :responsible, "Responsible" %> <br>
<%= 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"}) %>
</div>

<div class="field">
Expand Down Expand Up @@ -85,33 +82,24 @@
<h5>Software Information</h5>
</div>

<span id="response"></span>
<script>
var countBox = 1;
var boxName = 0;

function addInput()
{
var boxName="software" + countBox;
var input = document.createElement("div");
input.setAttribute("class", "field");

var inputKind = document.createElement("INPUT");
inputKind.setAttribute("type", "text");
inputKind.setAttribute("placeholder", "Software " + countBox);
inputKind.setAttribute("class", "form-control mt-1");
inputKind.setAttribute("name", boxName);
inputKind.setAttribute("id", boxName);

input.appendChild(inputKind);
document.getElementById('response').appendChild(input);

countBox += 1;
}
</script>
<script>
function addInput() {
$('<input/>', {
type: 'text', placeholder: 'Software',
class: 'form-control mb-1',
name: 'server[installed_software][]'
}).appendTo('#anchor');
}
</script>

<div class="field form-group">
<input type="button" onclick="addInput()" value="Add Software" class="btn btn-secondary mt-1"/>
<%= 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 %>

<span id="anchor"></span>
<input type="button" onclick="addInput()" value="Add Software" />
</div>

<%= form.submit class: "btn btn-primary" %>
Expand Down
71 changes: 26 additions & 45 deletions spec/controllers/servers_controller_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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) { {} }
Expand Down Expand Up @@ -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
Expand All @@ -98,33 +85,27 @@

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
server = Server.create! valid_attributes
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
Expand Down
2 changes: 1 addition & 1 deletion spec/views/servers/new.html.erb_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 854af4f

Please sign in to comment.